From 11204eeb43fd02ed48e1099e07f07ee419a7e671 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 09:50:36 +0900 Subject: [PATCH 01/28] refactor --- packages/frontend/.storybook/fakes.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/frontend/.storybook/fakes.ts b/packages/frontend/.storybook/fakes.ts index 9cd8ac474c..ed29c63471 100644 --- a/packages/frontend/.storybook/fakes.ts +++ b/packages/frontend/.storybook/fakes.ts @@ -207,6 +207,7 @@ export function federationInstance(): entities.FederationInstance { isSuspended: false, suspensionState: 'none', isBlocked: false, + isMediaSilenced: false, softwareName: 'misskey', softwareVersion: '2024.5.0', openRegistrations: false, @@ -311,6 +312,8 @@ export function userDetailed(id = 'someuserid', username = 'miskist', host: enti alsoKnownAs: null, notify: 'none', memo: null, + canChat: true, + chatScope: 'everyone', }; } @@ -378,6 +381,7 @@ export function role(params: { asBadge: params.asBadge ?? true, canEditMembersByModerator: params.canEditMembersByModerator ?? false, usersCount: params.usersCount ?? 10, + preserveAssignmentOnMoveAccount: false, condFormula: { id: '', type: 'or', From 18e42cc83d929f3029d893fdae24916ed60fde56 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 09:53:38 +0900 Subject: [PATCH 02/28] refactoe --- packages/frontend/src/pages/drop-and-fusion.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index bc957ff38a..c1a8b992b7 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -48,8 +48,8 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.tsx.lastNDays({ n: 7 }) }} {{ i18n.ts.ranking }} ({{ gameMode.toUpperCase() }})
- - + + {{ r.score.toLocaleString() }} {{ getScoreUnit(gameMode) }}
@@ -87,6 +87,7 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/components/grid/MkDataCell.vue b/packages/frontend/src/components/grid/MkDataCell.vue index 0f326b14ca..6f1dae8398 100644 --- a/packages/frontend/src/components/grid/MkDataCell.vue +++ b/packages/frontend/src/components/grid/MkDataCell.vue @@ -48,6 +48,7 @@ SPDX-License-Identifier: AGPL-3.0-only
import('./index.timeline.vue')); const props = withDefaults(defineProps<{ user: Misskey.entities.UserDetailed; /** Test only; MkNotesTimeline currently causes problems in vitest */ - disableNotes: boolean; + disableNotes?: boolean; }>(), { disableNotes: false, }); From bdec4bf87a546efd07b7c0076d9205f690ce021f Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 10:16:33 +0900 Subject: [PATCH 04/28] refactor --- packages/frontend/src/pages/user/activity.following.vue | 1 - packages/frontend/src/pages/user/activity.notes.vue | 1 - packages/frontend/src/pages/user/activity.pv.vue | 1 - packages/frontend/src/plugin.ts | 4 ++-- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/frontend/src/pages/user/activity.following.vue b/packages/frontend/src/pages/user/activity.following.vue index 882b45080e..d1cfa5356b 100644 --- a/packages/frontend/src/pages/user/activity.following.vue +++ b/packages/frontend/src/pages/user/activity.following.vue @@ -117,7 +117,6 @@ async function renderChart() { offset: true, stacked: true, time: { - stepSize: 1, unit: 'day', displayFormats: { day: 'M/d', diff --git a/packages/frontend/src/pages/user/activity.notes.vue b/packages/frontend/src/pages/user/activity.notes.vue index 39c9fd7950..1cf7a00716 100644 --- a/packages/frontend/src/pages/user/activity.notes.vue +++ b/packages/frontend/src/pages/user/activity.notes.vue @@ -116,7 +116,6 @@ async function renderChart() { offset: true, stacked: true, time: { - stepSize: 1, unit: 'day', displayFormats: { day: 'M/d', diff --git a/packages/frontend/src/pages/user/activity.pv.vue b/packages/frontend/src/pages/user/activity.pv.vue index 9e1b92058b..2539a6777b 100644 --- a/packages/frontend/src/pages/user/activity.pv.vue +++ b/packages/frontend/src/pages/user/activity.pv.vue @@ -117,7 +117,6 @@ async function renderChart() { offset: true, stacked: true, time: { - stepSize: 1, unit: 'day', displayFormats: { day: 'M/d', diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts index 346e275575..657197d1b3 100644 --- a/packages/frontend/src/plugin.ts +++ b/packages/frontend/src/plugin.ts @@ -205,13 +205,13 @@ type HandlerDef = { handler: (note: Misskey.entities.Note) => void; }; note_view_interruptor: { - handler: (note: Misskey.entities.Note) => unknown; + handler: (note: Misskey.entities.Note) => Misskey.entities.Note; }; note_post_interruptor: { handler: (note: FIXME) => unknown; }; page_view_interruptor: { - handler: (page: Misskey.entities.Page) => unknown; + handler: (page: Misskey.entities.Page) => Misskey.entities.Page; }; }; From 08ecf7ca79812cb904d2861ec82a67260a6819bf Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 10:19:14 +0900 Subject: [PATCH 05/28] refactor --- packages/frontend/src/pages/admin/security.vue | 2 +- packages/frontend/src/pages/channel-editor.vue | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/frontend/src/pages/admin/security.vue b/packages/frontend/src/pages/admin/security.vue index 27e35c7e69..fa93124daa 100644 --- a/packages/frontend/src/pages/admin/security.vue +++ b/packages/frontend/src/pages/admin/security.vue @@ -194,7 +194,7 @@ const sensitiveMediaDetectionForm = useForm({ state.sensitiveMediaDetectionSensitivity === 2 ? 'medium' : state.sensitiveMediaDetectionSensitivity === 3 ? 'high' : state.sensitiveMediaDetectionSensitivity === 4 ? 'veryHigh' : - 0, + null as never, setSensitiveFlagAutomatically: state.setSensitiveFlagAutomatically, enableSensitiveMediaDetectionForVideos: state.enableSensitiveMediaDetectionForVideos, }); diff --git a/packages/frontend/src/pages/channel-editor.vue b/packages/frontend/src/pages/channel-editor.vue index ce26a26109..251f5d557d 100644 --- a/packages/frontend/src/pages/channel-editor.vue +++ b/packages/frontend/src/pages/channel-editor.vue @@ -138,9 +138,10 @@ async function addPinnedNote() { const { canceled, result: value } = await os.inputText({ title: i18n.ts.noteIdOrUrl, }); - if (canceled) return; + if (canceled || value == null) return; + const fromUrl = value.includes('/') ? value.split('/').pop() : null; const note = await os.apiWithDialog('notes/show', { - noteId: value.includes('/') ? value.split('/').pop() : value, + noteId: fromUrl ?? value, }); pinnedNotes.value = [{ id: note.id, From d27c740ab02b635da6ec7bb2d76835525009489e Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 12:31:27 +0900 Subject: [PATCH 06/28] refactor --- .../src/pages/admin/overview.active-users.vue | 7 +++++-- .../src/pages/admin/overview.ap-requests.vue | 15 ++++++++++----- .../src/pages/user/activity.following.vue | 4 +++- .../frontend/src/pages/user/activity.notes.vue | 4 +++- packages/frontend/src/pages/user/activity.pv.vue | 6 +++--- packages/frontend/src/utility/chart-legend.ts | 4 +++- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/frontend/src/pages/admin/overview.active-users.vue b/packages/frontend/src/pages/admin/overview.active-users.vue index f74356599b..6c85f11cb1 100644 --- a/packages/frontend/src/pages/admin/overview.active-users.vue +++ b/packages/frontend/src/pages/admin/overview.active-users.vue @@ -37,6 +37,8 @@ async function renderChart() { chartInstance.destroy(); } + if (chartEl.value == null) return; + const getDate = (ago: number) => { const y = now.getFullYear(); const m = now.getMonth(); @@ -105,7 +107,6 @@ async function renderChart() { type: 'time', offset: true, time: { - stepSize: 1, unit: 'day', displayFormats: { day: 'M/d', @@ -149,7 +150,9 @@ async function renderChart() { }, external: externalTooltipHandler, }, - gradient, + ...({ // TSを黙らすため + gradient, + }), }, }, plugins: [chartVLine(vLineColor)], diff --git a/packages/frontend/src/pages/admin/overview.ap-requests.vue b/packages/frontend/src/pages/admin/overview.ap-requests.vue index 96ea4749dc..75f544c5a9 100644 --- a/packages/frontend/src/pages/admin/overview.ap-requests.vue +++ b/packages/frontend/src/pages/admin/overview.ap-requests.vue @@ -42,6 +42,9 @@ const { handler: externalTooltipHandler } = useChartTooltip(); const { handler: externalTooltipHandler2 } = useChartTooltip(); onMounted(async () => { + if (chartEl.value == null) return; + if (chartEl2.value == null) return; + const now = isChromatic() ? new Date('2024-08-31T10:00:00Z') : new Date(); const getDate = (ago: number) => { @@ -122,7 +125,6 @@ onMounted(async () => { stacked: true, offset: false, time: { - stepSize: 1, unit: 'day', }, grid: { @@ -144,7 +146,7 @@ onMounted(async () => { ticks: { display: true, //mirror: true, - callback: (value, index, values) => value < 0 ? -value : value, + callback: (value, index, values) => (value as number) < 0 ? -value : value, }, }, }, @@ -173,7 +175,9 @@ onMounted(async () => { label: context => `${context.dataset.label}: ${Math.abs(context.parsed.y)}`, }, }, - gradient, + ...({ // TSを黙らすため + gradient, + }), }, }, plugins: [chartVLine(vLineColor)], @@ -213,7 +217,6 @@ onMounted(async () => { type: 'time', offset: false, time: { - stepSize: 1, unit: 'day', displayFormats: { day: 'M/d', @@ -260,7 +263,9 @@ onMounted(async () => { }, external: externalTooltipHandler2, }, - gradient, + ...({ // TSを黙らすため + gradient, + }), }, }, plugins: [chartVLine(vLineColor)], diff --git a/packages/frontend/src/pages/user/activity.following.vue b/packages/frontend/src/pages/user/activity.following.vue index d1cfa5356b..4310c7ad85 100644 --- a/packages/frontend/src/pages/user/activity.following.vue +++ b/packages/frontend/src/pages/user/activity.following.vue @@ -161,7 +161,9 @@ async function renderChart() { }, external: externalTooltipHandler, }, - gradient, + ...({ // TSを黙らすため + gradient, + }), }, }, plugins: [chartVLine(vLineColor), chartLegend(legendEl.value)], diff --git a/packages/frontend/src/pages/user/activity.notes.vue b/packages/frontend/src/pages/user/activity.notes.vue index 1cf7a00716..6d9c1bedd9 100644 --- a/packages/frontend/src/pages/user/activity.notes.vue +++ b/packages/frontend/src/pages/user/activity.notes.vue @@ -160,7 +160,9 @@ async function renderChart() { }, external: externalTooltipHandler, }, - gradient, + ...({ // TSを黙らすため + gradient, + }), }, }, plugins: [chartVLine(vLineColor), chartLegend(legendEl.value)], diff --git a/packages/frontend/src/pages/user/activity.pv.vue b/packages/frontend/src/pages/user/activity.pv.vue index 2539a6777b..76df53becd 100644 --- a/packages/frontend/src/pages/user/activity.pv.vue +++ b/packages/frontend/src/pages/user/activity.pv.vue @@ -154,8 +154,6 @@ async function renderChart() { display: true, text: 'Unique/Natural PV', padding: { - left: 0, - right: 0, top: 0, bottom: 12, }, @@ -171,7 +169,9 @@ async function renderChart() { }, external: externalTooltipHandler, }, - gradient, + ...({ // TSを黙らすため + gradient, + }), }, }, plugins: [chartVLine(vLineColor), chartLegend(legendEl.value)], diff --git a/packages/frontend/src/utility/chart-legend.ts b/packages/frontend/src/utility/chart-legend.ts index fcbddf5669..490d6c4497 100644 --- a/packages/frontend/src/utility/chart-legend.ts +++ b/packages/frontend/src/utility/chart-legend.ts @@ -6,9 +6,11 @@ import type { Plugin } from 'chart.js'; import MkChartLegend from '@/components/MkChartLegend.vue'; -export const chartLegend = (legend: InstanceType) => ({ +export const chartLegend = (legend: InstanceType | null | undefined) => ({ id: 'htmlLegend', afterUpdate(chart, args, options) { + if (legend == null) return; + // Reuse the built-in legendItems generator const items = chart.options.plugins!.legend!.labels!.generateLabels!(chart); From 782c9f9852a7bc0e44d5aba7f92d0ac9c02153d6 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 12:33:44 +0900 Subject: [PATCH 07/28] refactor --- packages/frontend/src/components/MkInput.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/components/MkInput.vue b/packages/frontend/src/components/MkInput.vue index 955bf72a6b..7f052dff94 100644 --- a/packages/frontend/src/components/MkInput.vue +++ b/packages/frontend/src/components/MkInput.vue @@ -44,10 +44,10 @@ SPDX-License-Identifier: AGPL-3.0-only From 3c998e1f482c933aa22e597c79978bfe618845eb Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 12:59:53 +0900 Subject: [PATCH 08/28] refactor --- .../frontend/src/components/MkChartTooltip.vue | 4 ++-- .../src/components/page/page.image.vue | 2 +- .../frontend/src/components/page/page.note.vue | 2 +- .../src/components/page/page.section.vue | 2 +- .../frontend/src/components/page/page.text.vue | 2 +- packages/frontend/src/instance.ts | 6 ++++++ packages/frontend/src/pages/admin/branding.vue | 15 ++++++++++----- .../src/pages/admin/email-settings.vue | 2 +- .../pages/admin/federation-job-queue.chart.vue | 16 ++++++++-------- .../frontend/src/pages/emoji-edit-dialog.vue | 2 +- .../src/pages/settings/2fa.qrdialog.vue | 4 ++-- .../frontend/src/pages/settings/statusbar.vue | 3 ++- packages/frontend/src/preferences/def.ts | 18 ++++++++++-------- 13 files changed, 46 insertions(+), 32 deletions(-) diff --git a/packages/frontend/src/components/MkChartTooltip.vue b/packages/frontend/src/components/MkChartTooltip.vue index 51081ede23..b9d2c8219a 100644 --- a/packages/frontend/src/components/MkChartTooltip.vue +++ b/packages/frontend/src/components/MkChartTooltip.vue @@ -25,12 +25,12 @@ defineProps<{ showing: boolean; x: number; y: number; - title?: string; + title?: string | null; series?: { backgroundColor: string; borderColor: string; text: string; - }[]; + }[] | null; }>(); const emit = defineEmits<{ diff --git a/packages/frontend/src/components/page/page.image.vue b/packages/frontend/src/components/page/page.image.vue index 69443ce7dd..7e8d8f7bfb 100644 --- a/packages/frontend/src/components/page/page.image.vue +++ b/packages/frontend/src/components/page/page.image.vue @@ -15,7 +15,7 @@ import * as Misskey from 'misskey-js'; import MkMediaList from '@/components/MkMediaList.vue'; const props = defineProps<{ - block: Misskey.entities.PageBlock, + block: Extract, page: Misskey.entities.Page, }>(); diff --git a/packages/frontend/src/components/page/page.note.vue b/packages/frontend/src/components/page/page.note.vue index df26874c17..bae05b9765 100644 --- a/packages/frontend/src/components/page/page.note.vue +++ b/packages/frontend/src/components/page/page.note.vue @@ -18,7 +18,7 @@ import MkNoteDetailed from '@/components/MkNoteDetailed.vue'; import { misskeyApi } from '@/utility/misskey-api.js'; const props = defineProps<{ - block: Misskey.entities.PageBlock, + block: Extract, page: Misskey.entities.Page, }>(); diff --git a/packages/frontend/src/components/page/page.section.vue b/packages/frontend/src/components/page/page.section.vue index e3d26d924f..05c12b3b83 100644 --- a/packages/frontend/src/components/page/page.section.vue +++ b/packages/frontend/src/components/page/page.section.vue @@ -29,7 +29,7 @@ import * as Misskey from 'misskey-js'; const XBlock = defineAsyncComponent(() => import('./page.block.vue')); defineProps<{ - block: Misskey.entities.PageBlock, + block: Extract, h: number, page: Misskey.entities.Page, }>(); diff --git a/packages/frontend/src/components/page/page.text.vue b/packages/frontend/src/components/page/page.text.vue index a00eb0b5ca..792f6529d8 100644 --- a/packages/frontend/src/components/page/page.text.vue +++ b/packages/frontend/src/components/page/page.text.vue @@ -22,7 +22,7 @@ import { isEnabledUrlPreview } from '@/utility/url-preview.js'; const MkUrlPreview = defineAsyncComponent(() => import('@/components/MkUrlPreview.vue')); const props = defineProps<{ - block: Misskey.entities.PageBlock, + block: Extract, page: Misskey.entities.Page, }>(); diff --git a/packages/frontend/src/instance.ts b/packages/frontend/src/instance.ts index a5397f0c0d..c9d83a4dbe 100644 --- a/packages/frontend/src/instance.ts +++ b/packages/frontend/src/instance.ts @@ -51,3 +51,9 @@ export async function fetchInstance(force = false): Promise(meta.clientOptions.entrancePageStyle ?? 'classic'); +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +const showTimelineForVisitor = ref(meta.clientOptions.showTimelineForVisitor ?? true); +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +const showActivitiesForVisitor = ref(meta.clientOptions.showActivitiesForVisitor ?? true); + const iconUrl = ref(meta.iconUrl); const app192IconUrl = ref(meta.app192IconUrl); const app512IconUrl = ref(meta.app512IconUrl); @@ -186,11 +191,11 @@ const manifestJsonOverride = ref(meta.manifestJsonOverride === '' ? '{}' : JSON. function save() { os.apiWithDialog('admin/update-meta', { - clientOptions: { + clientOptions: ({ entrancePageStyle: entrancePageStyle.value, showTimelineForVisitor: showTimelineForVisitor.value, showActivitiesForVisitor: showActivitiesForVisitor.value, - }, + } as ClientOptions) as any, iconUrl: iconUrl.value, app192IconUrl: app192IconUrl.value, app512IconUrl: app512IconUrl.value, diff --git a/packages/frontend/src/pages/admin/email-settings.vue b/packages/frontend/src/pages/admin/email-settings.vue index 8eb403f94c..340391a12f 100644 --- a/packages/frontend/src/pages/admin/email-settings.vue +++ b/packages/frontend/src/pages/admin/email-settings.vue @@ -107,7 +107,7 @@ const smtpPass = ref(meta.smtpPass); async function testEmail() { const { canceled, result: destination } = await os.inputText({ - title: i18n.ts.destination, + title: 'To', type: 'email', default: instance.maintainerEmail ?? '', placeholder: 'test@example.com', diff --git a/packages/frontend/src/pages/admin/federation-job-queue.chart.vue b/packages/frontend/src/pages/admin/federation-job-queue.chart.vue index b17eceadde..d449801985 100644 --- a/packages/frontend/src/pages/admin/federation-job-queue.chart.vue +++ b/packages/frontend/src/pages/admin/federation-job-queue.chart.vue @@ -81,10 +81,10 @@ function onStats(stats: Misskey.entities.QueueStats) { delayed.value = stats[props.domain].delayed; waiting.value = stats[props.domain].waiting; - chartProcess.value.pushData(stats[props.domain].activeSincePrevTick); - chartActive.value.pushData(stats[props.domain].active); - chartDelayed.value.pushData(stats[props.domain].delayed); - chartWaiting.value.pushData(stats[props.domain].waiting); + if (chartProcess.value != null) chartProcess.value.pushData(stats[props.domain].activeSincePrevTick); + if (chartActive.value != null) chartActive.value.pushData(stats[props.domain].active); + if (chartDelayed.value != null) chartDelayed.value.pushData(stats[props.domain].delayed); + if (chartWaiting.value != null) chartWaiting.value.pushData(stats[props.domain].waiting); } function onStatsLog(statsLog: Misskey.entities.QueueStatsLog) { @@ -100,10 +100,10 @@ function onStatsLog(statsLog: Misskey.entities.QueueStatsLog) { dataWaiting.push(stats[props.domain].waiting); } - chartProcess.value.setData(dataProcess); - chartActive.value.setData(dataActive); - chartDelayed.value.setData(dataDelayed); - chartWaiting.value.setData(dataWaiting); + if (chartProcess.value != null) chartProcess.value.setData(dataProcess); + if (chartActive.value != null) chartActive.value.setData(dataActive); + if (chartDelayed.value != null) chartDelayed.value.setData(dataDelayed); + if (chartWaiting.value != null) chartWaiting.value.setData(dataWaiting); } onMounted(() => { diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue index 201ce003f0..033e3376a5 100644 --- a/packages/frontend/src/pages/emoji-edit-dialog.vue +++ b/packages/frontend/src/pages/emoji-edit-dialog.vue @@ -36,7 +36,7 @@ SPDX-License-Identifier: AGPL-3.0-only - + diff --git a/packages/frontend/src/pages/settings/2fa.qrdialog.vue b/packages/frontend/src/pages/settings/2fa.qrdialog.vue index 5bb125e67c..780040f699 100644 --- a/packages/frontend/src/pages/settings/2fa.qrdialog.vue +++ b/packages/frontend/src/pages/settings/2fa.qrdialog.vue @@ -135,7 +135,7 @@ const emit = defineEmits<{ const dialog = useTemplateRef('dialog'); const page = ref(0); -const token = ref(null); +const token = ref(null); const backupCodes = ref(); function cancel() { @@ -145,7 +145,7 @@ function cancel() { async function tokenDone() { if (token.value == null) return; const res = await os.apiWithDialog('i/2fa/done', { - token: typeof token.value === 'string' ? token.value : token.value.toString(), + token: token.value.toString(), // 実装ミスなどでnumberが入る可能性を払拭できないため念のためtoString }); backupCodes.value = res.backupCodes; diff --git a/packages/frontend/src/pages/settings/statusbar.vue b/packages/frontend/src/pages/settings/statusbar.vue index 2db9f7e6f9..1d0fadabd7 100644 --- a/packages/frontend/src/pages/settings/statusbar.vue +++ b/packages/frontend/src/pages/settings/statusbar.vue @@ -17,8 +17,8 @@ SPDX-License-Identifier: AGPL-3.0-only + + diff --git a/packages/frontend/src/pages/admin-file.vue b/packages/frontend/src/pages/admin-file.vue index 052829ffe2..63d3640f9c 100644 --- a/packages/frontend/src/pages/admin-file.vue +++ b/packages/frontend/src/pages/admin-file.vue @@ -4,197 +4,43 @@ SPDX-License-Identifier: AGPL-3.0-only --> - - From 959e72b2b34968d9b3188776cf2843a2f69bf8b2 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 14:02:14 +0900 Subject: [PATCH 10/28] refactor --- packages/backend/src/core/RoleService.ts | 1 + packages/backend/src/models/Notification.ts | 1 + packages/frontend-shared/js/const.ts | 62 ------------------- .../components/MkNotificationSelectWindow.vue | 2 +- .../src/components/MkServerSetupWizard.vue | 1 - .../MkStreamingNotificationsTimeline.vue | 2 +- .../frontend/src/pages/admin/roles.editor.vue | 5 +- packages/frontend/src/pages/admin/roles.vue | 6 +- packages/frontend/src/pages/notifications.vue | 2 +- .../src/pages/settings/notifications.vue | 2 +- .../src/widgets/WidgetNotifications.vue | 2 +- packages/misskey-js/src/consts.ts | 62 ++++++++++++++++++- packages/misskey-js/src/index.ts | 1 + 13 files changed, 75 insertions(+), 74 deletions(-) diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index 3df7ee69ee..7dc07ef4dd 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -31,6 +31,7 @@ import { FanoutTimelineService } from '@/core/FanoutTimelineService.js'; import { NotificationService } from '@/core/NotificationService.js'; import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common'; +// misskey-js の rolePolicies と同期すべし export type RolePolicies = { gtlAvailable: boolean; ltlAvailable: boolean; diff --git a/packages/backend/src/models/Notification.ts b/packages/backend/src/models/Notification.ts index 5764a307b0..0b4eeb3455 100644 --- a/packages/backend/src/models/Notification.ts +++ b/packages/backend/src/models/Notification.ts @@ -10,6 +10,7 @@ import { MiAccessToken } from './AccessToken.js'; import { MiRole } from './Role.js'; import { MiDriveFile } from './DriveFile.js'; +// misskey-js の notificationTypes と同期すべし export type MiNotification = { type: 'note'; id: string; diff --git a/packages/frontend-shared/js/const.ts b/packages/frontend-shared/js/const.ts index b2d83fff8b..c8c437afe9 100644 --- a/packages/frontend-shared/js/const.ts +++ b/packages/frontend-shared/js/const.ts @@ -54,68 +54,6 @@ https://github.com/sindresorhus/file-type/blob/main/core.js https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers */ -export const notificationTypes = [ - 'note', - 'follow', - 'mention', - 'reply', - 'renote', - 'quote', - 'reaction', - 'pollEnded', - 'receiveFollowRequest', - 'followRequestAccepted', - 'roleAssigned', - 'chatRoomInvitationReceived', - 'achievementEarned', - 'exportCompleted', - 'login', - 'createToken', - 'test', - 'app', -] as const; -export const obsoleteNotificationTypes = ['pollVote', 'groupInvited'] as const; - -export const ROLE_POLICIES = [ - 'gtlAvailable', - 'ltlAvailable', - 'canPublicNote', - 'mentionLimit', - 'canInvite', - 'inviteLimit', - 'inviteLimitCycle', - 'inviteExpirationTime', - 'canManageCustomEmojis', - 'canManageAvatarDecorations', - 'canSearchNotes', - 'canSearchUsers', - 'canUseTranslator', - 'canHideAds', - 'driveCapacityMb', - 'maxFileSizeMb', - 'alwaysMarkNsfw', - 'canUpdateBioMedia', - 'pinLimit', - 'antennaLimit', - 'wordMuteLimit', - 'webhookLimit', - 'clipLimit', - 'noteEachClipsLimit', - 'userListLimit', - 'userEachUserListsLimit', - 'rateLimitFactor', - 'avatarDecorationLimit', - 'canImportAntennas', - 'canImportBlocking', - 'canImportFollowing', - 'canImportMuting', - 'canImportUserLists', - 'chatAvailability', - 'uploadableFileTypes', - 'noteDraftLimit', - 'watermarkAvailable', -] as const; - export const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'scale', 'position', 'fg', 'bg', 'border', 'font', 'blur', 'rainbow', 'sparkle', 'rotate', 'ruby', 'unixtime']; export const MFM_PARAMS: Record = { tada: ['speed=', 'delay='], diff --git a/packages/frontend/src/components/MkNotificationSelectWindow.vue b/packages/frontend/src/components/MkNotificationSelectWindow.vue index bb01a008bd..7205e516d2 100644 --- a/packages/frontend/src/components/MkNotificationSelectWindow.vue +++ b/packages/frontend/src/components/MkNotificationSelectWindow.vue @@ -31,7 +31,7 @@ SPDX-License-Identifier: AGPL-3.0-only + + diff --git a/packages/frontend/src/pages/gallery/edit.vue b/packages/frontend/src/pages/gallery/edit.vue index 09bc6375ac..12d1a37390 100644 --- a/packages/frontend/src/pages/gallery/edit.vue +++ b/packages/frontend/src/pages/gallery/edit.vue @@ -4,161 +4,35 @@ SPDX-License-Identifier: AGPL-3.0-only --> - - From 2ccf4f94cb85f7732bc884792cdbc631c468a873 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:51:58 +0900 Subject: [PATCH 15/28] refactor --- .../src/pages/page-editor/els/page-editor.el.section.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue b/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue index 11f83b6ec6..cf5712a8e5 100644 --- a/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue +++ b/packages/frontend/src/pages/page-editor/els/page-editor.el.section.vue @@ -24,8 +24,8 @@ SPDX-License-Identifier: AGPL-3.0-only import { defineAsyncComponent, inject, onMounted, watch, ref } from 'vue'; import * as Misskey from 'misskey-js'; -import { genId } from '@/utility/id.js'; import XContainer from '../page-editor.container.vue'; +import { genId } from '@/utility/id.js'; import * as os from '@/os.js'; import { i18n } from '@/i18n.js'; import { deepClone } from '@/utility/clone.js'; @@ -35,11 +35,11 @@ import { getPageBlockList } from '@/pages/page-editor/common.js'; const XBlocks = defineAsyncComponent(() => import('../page-editor.blocks.vue')); const props = defineProps<{ - modelValue: Misskey.entities.PageBlock & { type: 'section'; }, + modelValue: Extract, }>(); const emit = defineEmits<{ - (ev: 'update:modelValue', value: Misskey.entities.PageBlock & { type: 'section' }): void; + (ev: 'update:modelValue', value: Extract): void; (ev: 'remove'): void; }>(); @@ -59,7 +59,7 @@ async function rename() { title: i18n.ts._pages.enterSectionTitle, default: props.modelValue.title, }); - if (canceled) return; + if (canceled || title == null) return; emit('update:modelValue', { ...props.modelValue, title, From ffc481a99450cd8ff3222c8679816f00fbfee548 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Tue, 2 Sep 2025 10:11:50 +0900 Subject: [PATCH 16/28] =?UTF-8?q?fix:=20=E3=80=8C=E8=87=AA=E5=8B=95?= =?UTF-8?q?=E3=81=A7=E3=82=82=E3=81=A3=E3=81=A8=E8=A6=8B=E3=82=8B=E3=80=8D?= =?UTF-8?q?=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=81=8C=E3=81=A7=E3=81=8D=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=95=8F=E9=A1=8C=20(#16500)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/pages/settings/preferences.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/frontend/src/pages/settings/preferences.vue b/packages/frontend/src/pages/settings/preferences.vue index fdf2373bfc..ba35dd7f43 100644 --- a/packages/frontend/src/pages/settings/preferences.vue +++ b/packages/frontend/src/pages/settings/preferences.vue @@ -110,7 +110,6 @@ SPDX-License-Identifier: AGPL-3.0-only -
From 842670e10084b98a09acd195be566d43e8cab485 Mon Sep 17 00:00:00 2001 From: yukineko <27853966+hideki0403@users.noreply.github.com> Date: Tue, 2 Sep 2025 10:29:25 +0900 Subject: [PATCH 17/28] =?UTF-8?q?fix(frontend):=20RSS=E3=83=86=E3=82=A3?= =?UTF-8?q?=E3=83=83=E3=82=AB=E3=83=BC=E3=82=A6=E3=82=A3=E3=82=B8=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=83=88=E3=81=8C=E6=AD=A3=E3=81=97=E3=81=8F=E5=8B=95?= =?UTF-8?q?=E4=BD=9C=E3=81=97=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#16498)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: RSSティッカーウィジェットが正しく機能しない問題を修正 * chore: update CHANGELOG.md --- CHANGELOG.md | 2 +- packages/frontend/src/widgets/WidgetRssTicker.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc9526ec88..f15a8c2bea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ - ### Client -- +- Fix: RSSティッカーウィジェットが正しく動作しない問題を修正 ### Server - diff --git a/packages/frontend/src/widgets/WidgetRssTicker.vue b/packages/frontend/src/widgets/WidgetRssTicker.vue index 9d4feb784c..95f82f7d7b 100644 --- a/packages/frontend/src/widgets/WidgetRssTicker.vue +++ b/packages/frontend/src/widgets/WidgetRssTicker.vue @@ -31,7 +31,7 @@ import { ref, watch, computed } from 'vue'; import * as Misskey from 'misskey-js'; import { useWidgetPropsManager } from './widget.js'; import type { WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js'; -import MarqueeText from '@/components/MkMarqueeText.vue'; +import MkMarqueeText from '@/components/MkMarqueeText.vue'; import type { FormWithDefault, GetFormResultType } from '@/utility/form.js'; import MkContainer from '@/components/MkContainer.vue'; import { shuffle } from '@/utility/shuffle.js'; From 047773341d88065eda604a8f59f87e6f34258695 Mon Sep 17 00:00:00 2001 From: takaion <3522531+takaion@users.noreply.github.com> Date: Tue, 2 Sep 2025 16:40:57 +0900 Subject: [PATCH 18/28] =?UTF-8?q?fix(frontend):=20=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E7=94=BB=E5=83=8F=E3=81=8C=E6=A8=AA=E3=81=AB=E5=BC=95?= =?UTF-8?q?=E3=81=8D=E4=BC=B8=E3=81=B0=E3=81=95=E3=82=8C=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=86=E5=95=8F=E9=A1=8C=E3=81=AB=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=20(#16502)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(frontend): エラー画像が横に引き伸ばされてしまう問題に対応 Fix misskey-dev#15982 * Update CHANGELOG.md --- CHANGELOG.md | 1 + packages/frontend/src/components/global/MkResult.vue | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f15a8c2bea..89e52f5cc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Client - Fix: RSSティッカーウィジェットが正しく動作しない問題を修正 +- Fix: エラー画像が横に引き伸ばされてしまう問題に対応 ### Server - diff --git a/packages/frontend/src/components/global/MkResult.vue b/packages/frontend/src/components/global/MkResult.vue index fc8206f814..2071859e57 100644 --- a/packages/frontend/src/components/global/MkResult.vue +++ b/packages/frontend/src/components/global/MkResult.vue @@ -41,8 +41,7 @@ const props = defineProps<{ .img { vertical-align: bottom; height: 128px; - aspect-ratio: 1; - margin-bottom: 16px; + margin: auto auto 16px; border-radius: 16px; } From a92fd8856a77e8a80e8e9294a091e08f12f86c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A5=BA=E5=AD=90w=20=28Yumechi=29?= <35571479+eternal-flame-AD@users.noreply.github.com> Date: Thu, 4 Sep 2025 23:55:37 -0500 Subject: [PATCH 19/28] feat(backend): Send Clear-Site-Data header on /flush (#16517) * feat(backend): Send Clear-Site-Data header on /flush Signed-off-by: eternal-flame-AD * simplify check on flush.pug Signed-off-by: eternal-flame-AD --------- Signed-off-by: eternal-flame-AD --- CHANGELOG.md | 1 + .../src/server/web/ClientServerService.ts | 19 +++++- .../backend/src/server/web/views/flush.pug | 64 ++++++++++--------- 3 files changed, 53 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89e52f5cc8..fb2212ebd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ### Client - Fix: RSSティッカーウィジェットが正しく動作しない問題を修正 - Fix: エラー画像が横に引き伸ばされてしまう問題に対応 +- Enhance: /flushページでサイトキャッシュをクリアできるようになりました ### Server - diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index b515a0c0c8..3cd83efa1a 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -201,6 +201,8 @@ export class ClientServerService { @bindThis public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) { + const configUrl = new URL(this.config.url); + fastify.register(fastifyView, { root: _dirname + '/views', engine: { @@ -239,7 +241,6 @@ export class ClientServerService { done(); }); } else { - const configUrl = new URL(this.config.url); const urlOriginWithoutPort = configUrl.origin.replace(/:\d+$/, ''); const port = (process.env.VITE_PORT ?? '5173'); @@ -887,6 +888,22 @@ export class ClientServerService { [, ...target.split('/').filter(x => x), ...source.split('/').filter(x => x).splice(depth)].join('/'); fastify.get('/flush', async (request, reply) => { + let sendHeader = true; + + if (request.headers['origin']) { + const originURL = new URL(request.headers['origin']); + if (originURL.protocol !== 'https:') { // Clear-Site-Data only supports https + sendHeader = false; + } + if (originURL.host !== configUrl.host) { + sendHeader = false; + } + } + + if (sendHeader) { + reply.header('Clear-Site-Data', '"*"'); + } + reply.header('Set-Cookie', 'http-flush-failed=1; Path=/flush; Max-Age=60'); return await reply.view('flush'); }); diff --git a/packages/backend/src/server/web/views/flush.pug b/packages/backend/src/server/web/views/flush.pug index a73a45212f..7884495d08 100644 --- a/packages/backend/src/server/web/views/flush.pug +++ b/packages/backend/src/server/web/views/flush.pug @@ -6,41 +6,45 @@ html const msg = document.getElementById('msg'); const successText = `\nSuccess Flush! Back to Misskey\n成功しました。Misskeyを開き直してください。`; - message('Start flushing.'); + if (!document.cookie) { + message('Your site data is fully cleared by your browser.'); + message(successText); + } else { + message('Your browser does not support Clear-Site-Data header. Start opportunistic flushing.'); + (async function() { + try { + localStorage.clear(); + message('localStorage cleared.'); - (async function() { - try { - localStorage.clear(); - message('localStorage cleared.'); + const idbPromises = ['MisskeyClient', 'keyval-store'].map((name, i, arr) => new Promise((res, rej) => { + const delidb = indexedDB.deleteDatabase(name); + delidb.onsuccess = () => res(message(`indexedDB "${name}" cleared. (${i + 1}/${arr.length})`)); + delidb.onerror = e => rej(e) + })); - const idbPromises = ['MisskeyClient', 'keyval-store'].map((name, i, arr) => new Promise((res, rej) => { - const delidb = indexedDB.deleteDatabase(name); - delidb.onsuccess = () => res(message(`indexedDB "${name}" cleared. (${i + 1}/${arr.length})`)); - delidb.onerror = e => rej(e) - })); + await Promise.all(idbPromises); - await Promise.all(idbPromises); + if (navigator.serviceWorker.controller) { + navigator.serviceWorker.controller.postMessage('clear'); + await navigator.serviceWorker.getRegistrations() + .then(registrations => { + return Promise.all(registrations.map(registration => registration.unregister())); + }) + .catch(e => { throw new Error(e) }); + } - if (navigator.serviceWorker.controller) { - navigator.serviceWorker.controller.postMessage('clear'); - await navigator.serviceWorker.getRegistrations() - .then(registrations => { - return Promise.all(registrations.map(registration => registration.unregister())); - }) - .catch(e => { throw new Error(e) }); + message(successText); + } catch (e) { + message(`\n${e}\n\nFlush Failed. Please retry.\n失敗しました。もう一度試してみてください。`); + message(`\nIf you retry more than 3 times, try manually clearing the browser cache or contact to instance admin.\n3回以上試しても失敗する場合、ブラウザのキャッシュを手動で消去し、それでもだめならインスタンス管理者に連絡してみてください。\n`) + + console.error(e); + setTimeout(() => { + location = '/'; + }, 10000) } - - message(successText); - } catch (e) { - message(`\n${e}\n\nFlush Failed. Please retry.\n失敗しました。もう一度試してみてください。`); - message(`\nIf you retry more than 3 times, clear the browser cache or contact to instance admin.\n3回以上試しても失敗する場合、ブラウザのキャッシュを消去し、それでもだめならインスタンス管理者に連絡してみてください。\n`) - - console.error(e); - setTimeout(() => { - location = '/'; - }, 10000) - } - })(); + })(); + } function message(text) { msg.insertAdjacentHTML('beforeend', `

[${(new Date()).toString()}] ${text.replace(/\n/g,'
')}

`) From 9b565728e792e4eba53b9755b92e3ab92a76fa9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=8B=E3=81=82?= <10798675+nakkaa@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:26:39 +0900 Subject: [PATCH 20/28] fix #16494 (#16509) --- packages/frontend/src/pages/welcome.entrance.simple.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/pages/welcome.entrance.simple.vue b/packages/frontend/src/pages/welcome.entrance.simple.vue index c2a2420e50..edbd312249 100644 --- a/packages/frontend/src/pages/welcome.entrance.simple.vue +++ b/packages/frontend/src/pages/welcome.entrance.simple.vue @@ -34,7 +34,7 @@ import { instance as meta } from '@/instance.js'; position: fixed; top: 0; right: 0; - width: 80vw; // 100%からshapeの幅を引いている + width: 100vw; height: 100vh; } From de1b2223ffd0b3f97e1073f61d0f0699f437294c Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Fri, 5 Sep 2025 19:44:11 +0900 Subject: [PATCH 21/28] =?UTF-8?q?enhance(frontend):=20AiScriptApp=E3=82=A6?= =?UTF-8?q?=E3=82=A3=E3=82=B8=E3=82=A7=E3=83=83=E3=83=88=E3=81=A7=E6=A7=8B?= =?UTF-8?q?=E6=96=87=E3=82=A8=E3=83=A9=E3=83=BC=E3=82=92=E6=A4=9C=E7=9F=A5?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=82=82=E3=83=80=E3=82=A4=E3=82=A2=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E3=81=A7=E3=81=AF=E3=81=AA=E3=81=8F=E3=82=A6=E3=82=A3?= =?UTF-8?q?=E3=82=B8=E3=82=A7=E3=83=83=E3=83=88=E5=86=85=E3=81=AB=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=82=92=E8=A1=A8=E7=A4=BA=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- .../frontend/src/widgets/WidgetAiscriptApp.vue | 15 ++++++++------- packages/frontend/src/widgets/WidgetButton.vue | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb2212ebd2..0d877e449c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,10 @@ - ### Client +- Enhance: AiScriptAppウィジェットで構文エラーを検知してもダイアログではなくウィジェット内にエラーを表示するように +- Enhance: /flushページでサイトキャッシュをクリアできるようになりました - Fix: RSSティッカーウィジェットが正しく動作しない問題を修正 - Fix: エラー画像が横に引き伸ばされてしまう問題に対応 -- Enhance: /flushページでサイトキャッシュをクリアできるようになりました ### Server - diff --git a/packages/frontend/src/widgets/WidgetAiscriptApp.vue b/packages/frontend/src/widgets/WidgetAiscriptApp.vue index fdd4eaae06..18acd966fd 100644 --- a/packages/frontend/src/widgets/WidgetAiscriptApp.vue +++ b/packages/frontend/src/widgets/WidgetAiscriptApp.vue @@ -7,25 +7,26 @@ SPDX-License-Identifier: AGPL-3.0-only
- +
Syntax error :(
+