diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ef42291d17..73fbe1537c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -78,6 +78,7 @@ jobs: matrix: workspace: - backend + - sw - cherrypick-js steps: - uses: actions/checkout@v4.1.1 @@ -92,7 +93,7 @@ jobs: - run: corepack enable - run: pnpm i --frozen-lockfile - run: pnpm --filter cherrypick-js run build - if: ${{ matrix.workspace == 'backend' }} + if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'sw' }} - run: pnpm --filter misskey-reversi run build if: ${{ matrix.workspace == 'backend' }} - run: pnpm --filter ${{ matrix.workspace }} run typecheck diff --git a/packages/sw/src/scripts/create-notification.ts b/packages/sw/src/scripts/create-notification.ts index 6eb3d2e519..3e6fb1b604 100644 --- a/packages/sw/src/scripts/create-notification.ts +++ b/packages/sw/src/scripts/create-notification.ts @@ -59,7 +59,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif const userDetail = await cli.request('users/show', { userId: data.body.userId }, account.token); return [i18n.ts._notification.youWereFollowed, { body: `${getUserName(data.body.user)} (@${data.body.user.username}${data.body.user.host != null ? '@' + data.body.user.host : ''})`, - icon: data.body.user.avatarUrl, + icon: data.body.user.avatarUrl ?? undefined, badge: iconUrl('user-plus'), data, actions: userDetail.isFollowing ? [] : [ @@ -74,7 +74,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif case 'mention': return [i18n.tsx._notification.youGotMention({ name: getUserName(data.body.user) }), { body: data.body.note.text ?? '', - icon: data.body.user.avatarUrl, + icon: data.body.user.avatarUrl ?? undefined, badge: iconUrl('at'), data, actions: [ @@ -88,7 +88,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif case 'reply': return [i18n.tsx._notification.youGotReply({ name: getUserName(data.body.user) }), { body: data.body.note.text ?? '', - icon: data.body.user.avatarUrl, + icon: data.body.user.avatarUrl ?? undefined, badge: iconUrl('arrow-back-up'), data, actions: [ @@ -102,7 +102,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif case 'renote': return [i18n.tsx._notification.youRenoted({ name: getUserName(data.body.user) }), { body: data.body.note.text ?? '', - icon: data.body.user.avatarUrl, + icon: data.body.user.avatarUrl ?? undefined, badge: iconUrl('repeat'), data, actions: [ @@ -116,7 +116,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif case 'quote': return [i18n.tsx._notification.youGotQuote({ name: getUserName(data.body.user) }), { body: data.body.note.text ?? '', - icon: data.body.user.avatarUrl, + icon: data.body.user.avatarUrl ?? undefined, badge: iconUrl('quote'), data, actions: [ @@ -136,7 +136,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif case 'note': return [i18n.ts._notification.newNote + ': ' + getUserName(data.body.user), { body: data.body.note.text ?? '', - icon: data.body.user.avatarUrl, + icon: data.body.user.avatarUrl ?? undefined, data, }]; @@ -163,9 +163,9 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif const tag = `reaction:${data.body.note.id}`; return [i18n.tsx._notification.youGotReact({ name: getUserName(data.body.user) }), { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition,no-constant-binary-expression - body: (reaction1.startsWith(':') ? `:${ reaction }:` : `${ reaction }`) + '\n' + data.body.note.text ?? '', - icon: data.body.user.avatarUrl, + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + body: (reaction1.startsWith(':') ? `:${ reaction }:` : `${ reaction }` + '\n' + data.body.note.text) ?? '', + icon: data.body.user.avatarUrl ?? undefined, tag, badge, data, @@ -181,7 +181,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif case 'receiveFollowRequest': return [i18n.ts._notification.youReceivedFollowRequest, { body: getUserName(data.body.user), - icon: data.body.user.avatarUrl, + icon: data.body.user.avatarUrl ?? undefined, badge: iconUrl('user-plus'), data, actions: [ @@ -199,7 +199,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif case 'followRequestAccepted': return [i18n.ts._notification.yourFollowRequestAccepted, { body: getUserName(data.body.user), - icon: data.body.user.avatarUrl, + icon: data.body.user.avatarUrl ?? undefined, badge: iconUrl('circle-check'), data, }]; @@ -255,9 +255,9 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif } case 'unreadMessagingMessage': if (data.body.groupId === null) { - return [getUserName(data.body.user), { + return [getUserName(data.body.user ?? { name: null, username: '' }), { body: data.body.text ?? '', - icon: data.body.user.avatarUrl, + icon: data.body.user?.avatarUrl ?? undefined, badge: iconUrl('messages'), tag: `messaging:user:${data.body.userId}`, data, @@ -265,8 +265,8 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif }]; } return [data.body.group?.name ?? '', { - body: `${getUserName(data.body.user)}: ${data.body.text ?? ''}`, - icon: data.body.user.avatarUrl, + body: `${getUserName(data.body.user ?? { name: null, username: '' })}: ${data.body.text ?? ''}`, + icon: data.body.user?.avatarUrl ?? undefined, badge: iconUrl('messages'), tag: `messaging:group:${data.body.groupId}`, data, @@ -275,7 +275,7 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif case 'unreadAntennaNote': return [i18n.tsx._notification.unreadAntennaNote({ name: data.body.antenna.name }), { body: `${getUserName(data.body.note.user)}: ${data.body.note.text ?? ''}`, - icon: data.body.note.user.avatarUrl, + icon: data.body.note.user.avatarUrl ?? undefined, badge: iconUrl('antenna'), tag: `antenna:${data.body.antenna.id}`, data, diff --git a/packages/sw/src/scripts/get-account-from-id.ts b/packages/sw/src/scripts/get-account-from-id.ts index 19bfe052ee..2fa132138a 100644 --- a/packages/sw/src/scripts/get-account-from-id.ts +++ b/packages/sw/src/scripts/get-account-from-id.ts @@ -4,9 +4,10 @@ */ import { get } from 'idb-keyval'; +import * as Misskey from 'cherrypick-js'; -export async function getAccountFromId(id: string): Promise<{ token: string; id: string } | void> { - const accounts = await get<{ token: string; id: string }[]>('accounts'); +export async function getAccountFromId(id: string): Promise | undefined> { + const accounts = await get[]>('accounts'); if (!accounts) { console.log('Accounts are not recorded'); return; diff --git a/packages/sw/src/scripts/operations.ts b/packages/sw/src/scripts/operations.ts index 22135105b6..231583fa5f 100644 --- a/packages/sw/src/scripts/operations.ts +++ b/packages/sw/src/scripts/operations.ts @@ -14,15 +14,22 @@ import { getUrlWithLoginId } from '@/scripts/login-id.js'; export const cli = new Misskey.api.APIClient({ origin, fetch: (...args): Promise => fetch(...args) }); -export async function api(endpoint: E, userId?: string, options?: O): Promise>> { - let account: { token: string; id: string } | void = undefined; +export async function api< + E extends keyof Misskey.Endpoints, + P extends Misskey.Endpoints[E]['req'] +>(endpoint: E, userId?: string, params?: P): Promise | undefined> { + let account: Pick | undefined; if (userId) { account = await getAccountFromId(userId); if (!account) return; } - return cli.request(endpoint, options, account?.token); + return (cli.request as ( + endpoint: E, + params: P, + credential?: string | null, + ) => Promise>)(endpoint, params, account?.token); } // mark-all-as-read送出を1秒間隔に制限する @@ -33,7 +40,7 @@ export function sendMarkAllAsRead(userId: string): Promise { setTimeout(() => { readBlockingStatus.set(userId, false); - api('notifications/mark-all-as-read', userId).then(resolve, resolve); + (api('notifications/mark-all-as-read', userId) as Promise).then(resolve, resolve); }, 1000); }); } diff --git a/packages/sw/src/sw.ts b/packages/sw/src/sw.ts index 41f7b3e4fd..8a7b147e43 100644 --- a/packages/sw/src/sw.ts +++ b/packages/sw/src/sw.ts @@ -189,8 +189,8 @@ globalThis.addEventListener('notificationclick', (ev: ServiceWorkerGlobalScopeEv case 'markAllAsRead': await globalThis.registration.getNotifications() .then(notifications => notifications.forEach(n => n.tag !== 'read_notification' && n.close())); - await get('accounts').then(accounts => { - return Promise.all(accounts.map(async account => { + await get[]>('accounts').then(accounts => { + return Promise.all((accounts ?? []).map(async account => { await swos.sendMarkAllAsRead(account.id); })); }); diff --git a/packages/sw/tsconfig.json b/packages/sw/tsconfig.json index 50d4aae19d..f3f3543013 100644 --- a/packages/sw/tsconfig.json +++ b/packages/sw/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "allowJs": true, "noEmitOnError": false, + "noImplicitAny": false, "noImplicitReturns": true, "noUnusedParameters": false, "noUnusedLocals": true,