From 5b4115e21a6822a434a9bfbbd53f22b3ca961239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sat, 13 Sep 2025 08:33:14 +0900 Subject: [PATCH] =?UTF-8?q?refactor(frontend):=20=E3=83=95=E3=83=AD?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=82=A8=E3=83=B3=E3=83=89=E3=81=AE=E5=9E=8B?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E8=A7=A3=E6=B6=88=EF=BC=88=E9=80=94?= =?UTF-8?q?=E4=B8=AD=E3=81=BE=E3=81=A7=EF=BC=89=20(#16539)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(frontend): FormLinkをボタンとして使用した際にエラーが出る問題を修正 * refactor(frontend): フロントエンドの型エラー解消 * remove unused ts-expect-error * migrate * remove unrelated changes * fix lint * more type fixes --- .../api/endpoints/admin/accounts/create.ts | 21 ++++-- .../server/api/endpoints/users/lists/show.ts | 27 +++++--- .../backend/test-federation/test/utils.ts | 1 - .../frontend/src/components/MkAvatars.vue | 2 +- .../frontend/src/components/MkPostForm.vue | 6 +- .../MkPushNotificationAllowButton.vue | 9 ++- .../frontend/src/components/MkRolePreview.vue | 6 +- .../frontend/src/components/MkUserPopup.vue | 5 +- .../frontend/src/components/form/link.vue | 55 +++++++++------- .../src/components/global/PageWithHeader.vue | 8 +-- packages/frontend/src/events.ts | 2 +- packages/frontend/src/lib/pizzax.ts | 2 +- packages/frontend/src/os.ts | 4 +- packages/frontend/src/pages/about.emojis.vue | 40 +++--------- .../frontend/src/pages/about.federation.vue | 2 +- packages/frontend/src/pages/admin-user.vue | 5 +- .../admin/custom-emojis-manager.register.vue | 4 +- .../federation-job-queue.chart.chart.vue | 8 ++- .../frontend/src/pages/admin/job-queue.vue | 2 + .../src/pages/admin/overview.active-users.vue | 2 +- .../src/pages/admin/overview.federation.vue | 8 +-- .../src/pages/admin/overview.heatmap.vue | 3 +- .../frontend/src/pages/admin/overview.pie.vue | 13 ++-- .../src/pages/admin/overview.queue.chart.vue | 12 ++-- .../src/pages/admin/overview.queue.vue | 18 +++--- .../src/pages/admin/overview.stats.vue | 15 +++-- .../frontend/src/pages/admin/overview.vue | 2 +- .../frontend/src/pages/admin/roles.editor.vue | 1 - .../frontend/src/pages/admin/roles.role.vue | 2 +- packages/frontend/src/pages/admin/roles.vue | 7 +- packages/frontend/src/pages/gallery/post.vue | 19 ++++-- packages/frontend/src/pages/list.vue | 13 ++-- .../page-editor/els/page-editor.el.note.vue | 1 + .../els/page-editor.el.section.vue | 2 +- .../page-editor/els/page-editor.el.text.vue | 2 + .../src/pages/page-editor/page-editor.vue | 9 ++- .../frontend/src/pages/reversi/game.board.vue | 2 +- .../src/pages/reversi/game.setting.vue | 2 +- packages/frontend/src/pages/reversi/game.vue | 2 +- packages/frontend/src/pages/settings/2fa.vue | 2 + .../frontend/src/pages/settings/privacy.vue | 64 +++++++++++++------ .../src/pages/settings/sounds.sound.vue | 14 ++-- .../frontend/src/pages/settings/sounds.vue | 2 +- packages/frontend/src/pages/share.vue | 3 +- packages/frontend/src/pages/user/lists.vue | 2 +- packages/frontend/src/plugin.ts | 44 +++++++------ packages/frontend/src/pref-migrate.ts | 21 ++++-- packages/frontend/src/preferences/def.ts | 10 ++- packages/frontend/src/store.ts | 4 +- .../frontend/src/utility/code-highlighter.ts | 2 +- packages/frontend/src/utility/form.ts | 4 +- .../frontend/src/utility/get-user-menu.ts | 1 - packages/frontend/test/url-preview.test.ts | 2 +- packages/misskey-js/etc/misskey-js.api.md | 16 ++++- packages/misskey-js/src/autogen/types.ts | 9 ++- packages/misskey-js/src/streaming.types.ts | 8 +++ 56 files changed, 316 insertions(+), 236 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts index 06047b58a6..6606202118 100644 --- a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts +++ b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts @@ -34,13 +34,22 @@ export const meta = { res: { type: 'object', optional: false, nullable: false, - ref: 'MeDetailed', - properties: { - token: { - type: 'string', - optional: false, nullable: false, + allOf: [ + { + type: 'object', + ref: 'MeDetailed', }, - }, + { + type: 'object', + optional: false, nullable: false, + properties: { + token: { + type: 'string', + optional: false, nullable: false, + }, + }, + } + ], }, } as const; diff --git a/packages/backend/src/server/api/endpoints/users/lists/show.ts b/packages/backend/src/server/api/endpoints/users/lists/show.ts index ed5952d4c5..c6d477a92f 100644 --- a/packages/backend/src/server/api/endpoints/users/lists/show.ts +++ b/packages/backend/src/server/api/endpoints/users/lists/show.ts @@ -22,17 +22,26 @@ export const meta = { res: { type: 'object', optional: false, nullable: false, - ref: 'UserList', - properties: { - likedCount: { - type: 'number', - optional: true, nullable: false, + allOf: [ + { + type: 'object', + ref: 'UserList', }, - isLiked: { - type: 'boolean', - optional: true, nullable: false, + { + type: 'object', + optional: false, nullable: false, + properties: { + likedCount: { + type: 'number', + optional: true, nullable: false, + }, + isLiked: { + type: 'boolean', + optional: true, nullable: false, + }, + }, }, - }, + ], }, errors: { diff --git a/packages/backend/test-federation/test/utils.ts b/packages/backend/test-federation/test/utils.ts index 7e24bb7904..056a16ba15 100644 --- a/packages/backend/test-federation/test/utils.ts +++ b/packages/backend/test-federation/test/utils.ts @@ -68,7 +68,6 @@ async function createAdmin(host: Host): Promise { ADMIN_CACHE.set(host, { id: res.id, - // @ts-expect-error FIXME: openapi-typescript generates incorrect response type for this endpoint, so ignore this i: res.token, }); return res as Misskey.entities.SignupResponse; diff --git a/packages/frontend/src/components/MkAvatars.vue b/packages/frontend/src/components/MkAvatars.vue index 1c44ed60d8..4bd6c62a5f 100644 --- a/packages/frontend/src/components/MkAvatars.vue +++ b/packages/frontend/src/components/MkAvatars.vue @@ -29,6 +29,6 @@ const users = ref([]); onMounted(async () => { users.value = await misskeyApi('users/show', { userIds: props.userIds, - }) as unknown as Misskey.entities.UserLite[]; + }); }); diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index 56683b8f8c..a3ff89fc4d 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -823,17 +823,15 @@ async function saveServerDraft(clearLocal = false) { return await os.apiWithDialog(serverDraftId.value == null ? 'notes/drafts/create' : 'notes/drafts/update', { ...(serverDraftId.value == null ? {} : { draftId: serverDraftId.value }), text: text.value, - useCw: useCw.value, - cw: cw.value, + cw: useCw.value ? cw.value || null : null, visibility: visibility.value, localOnly: localOnly.value, hashtag: hashtags.value, ...(files.value.length > 0 ? { fileIds: files.value.map(f => f.id) } : {}), poll: poll.value, ...(visibleUsers.value.length > 0 ? { visibleUserIds: visibleUsers.value.map(x => x.id) } : {}), - renoteId: renoteTargetNote.value ? renoteTargetNote.value.id : undefined, + renoteId: renoteTargetNote.value ? renoteTargetNote.value.id : quoteId.value ? quoteId.value : undefined, replyId: replyTargetNote.value ? replyTargetNote.value.id : undefined, - quoteId: quoteId.value, channelId: targetChannel.value ? targetChannel.value.id : undefined, reactionAcceptance: reactionAcceptance.value, }).then(() => { diff --git a/packages/frontend/src/components/MkPushNotificationAllowButton.vue b/packages/frontend/src/components/MkPushNotificationAllowButton.vue index 9c37eb5e72..697346020c 100644 --- a/packages/frontend/src/components/MkPushNotificationAllowButton.vue +++ b/packages/frontend/src/components/MkPushNotificationAllowButton.vue @@ -90,7 +90,7 @@ function subscribe() { publickey: encode(subscription.getKey('p256dh')), }); }, async err => { // When subscribe failed - // 通知が許可されていなかったとき + // 通知が許可されていなかったとき if (err?.name === 'NotAllowedError') { console.info('User denied the notification permission request.'); return; @@ -114,14 +114,13 @@ async function unsubscribe() { if ($i && accounts.length >= 2) { apiWithDialog('sw/unregister', { - i: $i.token, endpoint, - }); + }, $i.token); } else { pushSubscription.value.unsubscribe(); apiWithDialog('sw/unregister', { endpoint, - }); + }, null); pushSubscription.value = null; } } @@ -134,7 +133,7 @@ function encode(buffer: ArrayBuffer | null) { * Convert the URL safe base64 string to a Uint8Array * @param base64String base64 string */ -function urlBase64ToUint8Array(base64String: string): Uint8Array { +function urlBase64ToUint8Array(base64String: string): BufferSource { const padding = '='.repeat((4 - base64String.length % 4) % 4); const base64 = (base64String + padding) .replace(/-/g, '+') diff --git a/packages/frontend/src/components/MkRolePreview.vue b/packages/frontend/src/components/MkRolePreview.vue index 15149b3f0c..8e5cbde8c3 100644 --- a/packages/frontend/src/components/MkRolePreview.vue +++ b/packages/frontend/src/components/MkRolePreview.vue @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only {{ role.name }} -