summaryrefslogtreecommitdiff
path: root/packages/frontend
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2025-11-10 15:33:54 +0900
committerGitHub <noreply@github.com>2025-11-10 15:33:54 +0900
commitfd2fe34270ebd406d12a55f33b74028dec31cfd2 (patch)
tree7be7560fb39d45fd712fdeb394bfb204e8ce692b /packages/frontend
parentfix(backend): improve isFederationAllowedHost (diff)
downloadmisskey-fd2fe34270ebd406d12a55f33b74028dec31cfd2.tar.gz
misskey-fd2fe34270ebd406d12a55f33b74028dec31cfd2.tar.bz2
misskey-fd2fe34270ebd406d12a55f33b74028dec31cfd2.zip
refactor8frontend9: anyを除去 (#16778)
Diffstat (limited to 'packages/frontend')
-rw-r--r--packages/frontend/src/components/MkChannelList.vue9
-rw-r--r--packages/frontend/src/components/MkUserList.vue8
-rw-r--r--packages/frontend/src/composables/use-form.ts11
-rw-r--r--packages/frontend/src/di.ts3
-rw-r--r--packages/frontend/src/directives/adaptive-border.ts2
-rw-r--r--packages/frontend/src/directives/user-preview.ts6
-rw-r--r--packages/frontend/src/lib/pizzax.ts2
-rw-r--r--packages/frontend/src/pages/admin-user.vue2
-rw-r--r--packages/frontend/src/pages/admin/relays.vue2
-rw-r--r--packages/frontend/src/pages/install-extensions.vue6
-rw-r--r--packages/frontend/src/stream.ts2
-rw-r--r--packages/frontend/src/utility/drive.ts2
-rw-r--r--packages/frontend/src/utility/image-effector/ImageEffector.ts2
-rw-r--r--packages/frontend/src/utility/paginator.ts11
-rw-r--r--packages/frontend/src/utility/stream-mock.ts81
-rw-r--r--packages/frontend/src/utility/watermark/WatermarkRenderer.ts3
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}`);
}
}