diff options
Diffstat (limited to 'packages/frontend/src')
| -rw-r--r-- | packages/frontend/src/components/MkChannelList.vue | 9 | ||||
| -rw-r--r-- | packages/frontend/src/components/MkUserList.vue | 8 | ||||
| -rw-r--r-- | packages/frontend/src/composables/use-form.ts | 11 | ||||
| -rw-r--r-- | packages/frontend/src/di.ts | 3 | ||||
| -rw-r--r-- | packages/frontend/src/directives/adaptive-border.ts | 2 | ||||
| -rw-r--r-- | packages/frontend/src/directives/user-preview.ts | 6 | ||||
| -rw-r--r-- | packages/frontend/src/lib/pizzax.ts | 2 | ||||
| -rw-r--r-- | packages/frontend/src/pages/admin-user.vue | 2 | ||||
| -rw-r--r-- | packages/frontend/src/pages/admin/relays.vue | 2 | ||||
| -rw-r--r-- | packages/frontend/src/pages/install-extensions.vue | 6 | ||||
| -rw-r--r-- | packages/frontend/src/stream.ts | 2 | ||||
| -rw-r--r-- | packages/frontend/src/utility/drive.ts | 2 | ||||
| -rw-r--r-- | packages/frontend/src/utility/image-effector/ImageEffector.ts | 2 | ||||
| -rw-r--r-- | packages/frontend/src/utility/paginator.ts | 11 | ||||
| -rw-r--r-- | packages/frontend/src/utility/stream-mock.ts | 81 | ||||
| -rw-r--r-- | packages/frontend/src/utility/watermark/WatermarkRenderer.ts | 3 |
16 files changed, 42 insertions, 110 deletions
diff --git a/packages/frontend/src/components/MkChannelList.vue b/packages/frontend/src/components/MkChannelList.vue index 394dcb6bd1..23bb32c6b9 100644 --- a/packages/frontend/src/components/MkChannelList.vue +++ b/packages/frontend/src/components/MkChannelList.vue @@ -13,17 +13,16 @@ SPDX-License-Identifier: AGPL-3.0-only </MkPagination> </template> -<script lang="ts" setup> +<script lang="ts" setup generic="P extends IPaginator"> import * as Misskey from 'misskey-js'; -import type { IPaginator } from '@/utility/paginator.js'; +import type { IPaginator, ExtractorFunction } from '@/utility/paginator.js'; import MkChannelPreview from '@/components/MkChannelPreview.vue'; import MkPagination from '@/components/MkPagination.vue'; -import { i18n } from '@/i18n.js'; const props = withDefaults(defineProps<{ - paginator: IPaginator; + paginator: P; noGap?: boolean; - extractor?: (item: any) => Misskey.entities.Channel; + extractor?: ExtractorFunction<P, Misskey.entities.Channel>; }>(), { extractor: (item) => item, }); diff --git a/packages/frontend/src/components/MkUserList.vue b/packages/frontend/src/components/MkUserList.vue index e3469d0fd7..f47d9b56dc 100644 --- a/packages/frontend/src/components/MkUserList.vue +++ b/packages/frontend/src/components/MkUserList.vue @@ -15,17 +15,17 @@ SPDX-License-Identifier: AGPL-3.0-only </MkPagination> </template> -<script lang="ts" setup> +<script lang="ts" setup generic="P extends IPaginator"> import * as Misskey from 'misskey-js'; -import type { IPaginator } from '@/utility/paginator.js'; +import type { IPaginator, ExtractorFunction } from '@/utility/paginator.js'; import MkUserInfo from '@/components/MkUserInfo.vue'; import MkPagination from '@/components/MkPagination.vue'; import { i18n } from '@/i18n.js'; const props = withDefaults(defineProps<{ - paginator: IPaginator; + paginator: P; noGap?: boolean; - extractor?: (item: any) => Misskey.entities.UserDetailed; + extractor?: ExtractorFunction<P, Misskey.entities.UserDetailed>; }>(), { extractor: (item) => item, }); diff --git a/packages/frontend/src/composables/use-form.ts b/packages/frontend/src/composables/use-form.ts index 1c93557413..38e9b40e20 100644 --- a/packages/frontend/src/composables/use-form.ts +++ b/packages/frontend/src/composables/use-form.ts @@ -19,10 +19,13 @@ export function useForm<T extends Record<string, any>>(initialState: T, save: (n const currentState = reactive<T>(copy(initialState)); const previousState = reactive<T>(copy(initialState)); - const modifiedStates = reactive<Record<keyof T, boolean>>({} as any); - for (const key in currentState) { - modifiedStates[key] = false; - } + const modifiedStates = reactive<Record<keyof T, boolean>>((() => { + const obj: Record<keyof T, boolean> = {} as Record<keyof T, boolean>; + for (const key in initialState) { + obj[key] = false; + } + return obj; + })()); const modified = computed(() => Object.values(modifiedStates).some(v => v)); const modifiedCount = computed(() => Object.values(modifiedStates).filter(v => v).length); diff --git a/packages/frontend/src/di.ts b/packages/frontend/src/di.ts index e2590da60b..f09782ea38 100644 --- a/packages/frontend/src/di.ts +++ b/packages/frontend/src/di.ts @@ -4,13 +4,14 @@ */ import type { InjectionKey, Ref } from 'vue'; +import type { PageMetadata } from '@/page.js'; import type { Router } from '@/router.js'; export const DI = { routerCurrentDepth: Symbol() as InjectionKey<number>, router: Symbol() as InjectionKey<Router>, mock: Symbol() as InjectionKey<boolean>, - pageMetadata: Symbol() as InjectionKey<Ref<Record<string, any> | null>>, + pageMetadata: Symbol() as InjectionKey<Ref<PageMetadata | null>>, viewId: Symbol() as InjectionKey<string>, currentStickyTop: Symbol() as InjectionKey<Ref<number>>, currentStickyBottom: Symbol() as InjectionKey<Ref<number>>, diff --git a/packages/frontend/src/directives/adaptive-border.ts b/packages/frontend/src/directives/adaptive-border.ts index 749861fd94..2bfd22f6b9 100644 --- a/packages/frontend/src/directives/adaptive-border.ts +++ b/packages/frontend/src/directives/adaptive-border.ts @@ -7,7 +7,7 @@ import type { Directive } from 'vue'; import { getBgColor } from '@/utility/get-bg-color.js'; import { globalEvents } from '@/events.js'; -const handlerMap = new WeakMap<any, any>(); +const handlerMap = new WeakMap<HTMLElement, () => void>(); export const adaptiveBorderDirective = { mounted(src) { diff --git a/packages/frontend/src/directives/user-preview.ts b/packages/frontend/src/directives/user-preview.ts index f81f5dbef8..d68999d8ef 100644 --- a/packages/frontend/src/directives/user-preview.ts +++ b/packages/frontend/src/directives/user-preview.ts @@ -119,9 +119,9 @@ export const userPreviewDirective = { // TODO: 新たにプロパティを作るのをやめMapを使う // ただメモリ的には↓の方が省メモリかもしれないので検討中 - const self = (el as any)._userPreviewDirective_ = {} as any; - - self.preview = new UserPreview(el, binding.value); + el._userPreviewDirective_ = { + preview: new UserPreview(el, binding.value), + }; }, unmounted(el, binding) { diff --git a/packages/frontend/src/lib/pizzax.ts b/packages/frontend/src/lib/pizzax.ts index 8faac6155c..80543d10e4 100644 --- a/packages/frontend/src/lib/pizzax.ts +++ b/packages/frontend/src/lib/pizzax.ts @@ -59,7 +59,7 @@ export class Pizzax<T extends StateDef> { private pizzaxChannel: BroadcastChannel<PizzaxChannelMessage<T>>; // 簡易的にキューイングして占有ロックとする - private currentIdbJob: Promise<any> = Promise.resolve(); + private currentIdbJob: Promise<unknown> = Promise.resolve(); private addIdbSetJob<T>(job: () => Promise<T>) { const promise = this.currentIdbJob.then(job, err => { console.error('Pizzax failed to save data to idb!', err); diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue index 6d3cc9c1b7..22e377c75d 100644 --- a/packages/frontend/src/pages/admin-user.vue +++ b/packages/frontend/src/pages/admin-user.vue @@ -257,7 +257,7 @@ const { const user = ref(result.user); const info = ref(result.info); const ips = ref(result.ips); -const ap = ref<any>(null); +const ap = ref<Misskey.entities.ApGetResponse | null>(null); const moderator = ref(info.value.isModerator); const silenced = ref(info.value.isSilenced); const suspended = ref(info.value.isSuspended); diff --git a/packages/frontend/src/pages/admin/relays.vue b/packages/frontend/src/pages/admin/relays.vue index 9eba68022a..3526e036d3 100644 --- a/packages/frontend/src/pages/admin/relays.vue +++ b/packages/frontend/src/pages/admin/relays.vue @@ -44,7 +44,7 @@ async function addRelay() { if (canceled || inbox == null) return; misskeyApi('admin/relays/add', { inbox, - }).then((relay: any) => { + }).then(() => { refresh(); }).catch((err: any) => { os.alert({ diff --git a/packages/frontend/src/pages/install-extensions.vue b/packages/frontend/src/pages/install-extensions.vue index cad3b2a00a..2405f82bc4 100644 --- a/packages/frontend/src/pages/install-extensions.vue +++ b/packages/frontend/src/pages/install-extensions.vue @@ -161,7 +161,11 @@ async function _fetch_() { }, raw: res.data, }; - } catch (err: any) { + } catch (err) { + if (!(err instanceof Error)) { + throw err; + } + switch (err.message.toLowerCase()) { case 'this theme is already installed': errorKV.value = { diff --git a/packages/frontend/src/stream.ts b/packages/frontend/src/stream.ts index 25544d9d88..adbde3fee2 100644 --- a/packages/frontend/src/stream.ts +++ b/packages/frontend/src/stream.ts @@ -7,8 +7,6 @@ import * as Misskey from 'misskey-js'; import { markRaw } from 'vue'; import { $i } from '@/i.js'; import { wsOrigin } from '@@/js/config.js'; -// TODO: No WebsocketモードでStreamMockが使えそう -//import { StreamMock } from '@/utility/stream-mock.js'; // heart beat interval in ms const HEART_BEAT_INTERVAL = 1000 * 60; diff --git a/packages/frontend/src/utility/drive.ts b/packages/frontend/src/utility/drive.ts index fb2825e7f7..64079d125a 100644 --- a/packages/frontend/src/utility/drive.ts +++ b/packages/frontend/src/utility/drive.ts @@ -124,7 +124,7 @@ export function uploadFile(file: File | Blob, options: { const driveFile = JSON.parse(ev.target.response); globalEvents.emit('driveFileCreated', driveFile); resolve(driveFile); - }) as (ev: ProgressEvent<EventTarget>) => any; + }) as (ev: ProgressEvent<EventTarget>) => void; if (options.onProgress) { xhr.upload.onprogress = ev => { diff --git a/packages/frontend/src/utility/image-effector/ImageEffector.ts b/packages/frontend/src/utility/image-effector/ImageEffector.ts index 9d5b961416..10d9d2e6bc 100644 --- a/packages/frontend/src/utility/image-effector/ImageEffector.ts +++ b/packages/frontend/src/utility/image-effector/ImageEffector.ts @@ -13,7 +13,7 @@ interface CommonParamDef { type: string; label?: string; caption?: string; - default: any; + default: unknown; } interface NumberParamDef extends CommonParamDef { diff --git a/packages/frontend/src/utility/paginator.ts b/packages/frontend/src/utility/paginator.ts index 7db55db7d6..59ae1e431a 100644 --- a/packages/frontend/src/utility/paginator.ts +++ b/packages/frontend/src/utility/paginator.ts @@ -5,7 +5,7 @@ import { ref, shallowRef, triggerRef } from 'vue'; import * as Misskey from 'misskey-js'; -import type { ComputedRef, Ref, ShallowRef } from 'vue'; +import type { ComputedRef, Ref, ShallowRef, UnwrapRef } from 'vue'; import { misskeyApi } from '@/utility/misskey-api.js'; const MAX_ITEMS = 30; @@ -19,7 +19,12 @@ export type MisskeyEntity = { _shouldInsertAd_?: boolean; }; -type FilterByEpRes<E extends Record<string, any>> = { +type AbsEndpointType = { + req: unknown; + res: unknown; +}; + +type FilterByEpRes<E extends Record<string, AbsEndpointType>> = { [K in keyof E]: E[K]['res'] extends Array<{ id: string }> ? K : never }[keyof E]; export type PaginatorCompatibleEndpointPaths = FilterByEpRes<Misskey.Endpoints>; @@ -27,6 +32,8 @@ export type PaginatorCompatibleEndpoints = { [K in PaginatorCompatibleEndpointPaths]: Misskey.Endpoints[K]; }; +export type ExtractorFunction<P extends IPaginator, T> = (item: UnwrapRef<P['items']>[number]) => T; + export interface IPaginator<T = unknown, _T = T & MisskeyEntity> { /** * 外部から直接操作しないでください diff --git a/packages/frontend/src/utility/stream-mock.ts b/packages/frontend/src/utility/stream-mock.ts deleted file mode 100644 index 9b1b368de4..0000000000 --- a/packages/frontend/src/utility/stream-mock.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - * SPDX-FileCopyrightText: syuilo and misskey-project - * SPDX-License-Identifier: AGPL-3.0-only - */ - -import { EventEmitter } from 'eventemitter3'; -import * as Misskey from 'misskey-js'; -import type { Channels, StreamEvents, IStream, IChannelConnection } from 'misskey-js'; - -type AnyOf<T extends Record<any, any>> = T[keyof T]; -type OmitFirst<T extends any[]> = T extends [any, ...infer R] ? R : never; - -/** - * Websocket無効化時に使うStreamのモック(なにもしない) - */ -export class StreamMock extends EventEmitter<StreamEvents> implements IStream { - public readonly state = 'initializing'; - - constructor(...args: ConstructorParameters<typeof Misskey.Stream>) { - super(); - // do nothing - } - - public useChannel<C extends keyof Channels>(channel: C, params?: Channels[C]['params'], name?: string): ChannelConnectionMock<Channels[C]> { - return new ChannelConnectionMock(this, channel, name); - } - - public removeSharedConnection(connection: any): void { - // do nothing - } - - public removeSharedConnectionPool(pool: any): void { - // do nothing - } - - public disconnectToChannel(): void { - // do nothing - } - - public send(typeOrPayload: string): void; - public send(typeOrPayload: string, payload: any): void; - public send(typeOrPayload: Record<string, any> | any[]): void; - public send(typeOrPayload: string | Record<string, any> | any[], payload?: any): void { - // do nothing - } - - public ping(): void { - // do nothing - } - - public heartbeat(): void { - // do nothing - } - - public close(): void { - // do nothing - } -} - -class ChannelConnectionMock<Channel extends AnyOf<Channels> = any> extends EventEmitter<Channel['events']> implements IChannelConnection<Channel> { - public id = ''; - public name?: string; // for debug - public inCount = 0; // for debug - public outCount = 0; // for debug - public channel: string; - - constructor(stream: IStream, ...args: OmitFirst<ConstructorParameters<typeof Misskey.ChannelConnection<Channel>>>) { - super(); - - this.channel = args[0]; - this.name = args[1]; - } - - public send<T extends keyof Channel['receives']>(type: T, body: Channel['receives'][T]): void { - // do nothing - } - - public dispose(): void { - // do nothing - } -} diff --git a/packages/frontend/src/utility/watermark/WatermarkRenderer.ts b/packages/frontend/src/utility/watermark/WatermarkRenderer.ts index 766d45148a..32341a9e10 100644 --- a/packages/frontend/src/utility/watermark/WatermarkRenderer.ts +++ b/packages/frontend/src/utility/watermark/WatermarkRenderer.ts @@ -222,7 +222,8 @@ export class WatermarkRenderer { }, }); } else { - throw new Error(`Unrecognized layer type: ${(layer as any).type}`); + // @ts-expect-error Should be unreachable + throw new Error(`Unrecognized layer type: ${layer.type}`); } } |