From c2370a1be631355e709c47d3b5e9469906116b84 Mon Sep 17 00:00:00 2001 From: Shun Sakai Date: Thu, 27 Jul 2023 14:31:52 +0900 Subject: chore: 著作権とライセンスについての情報を各ファイルに追加する (#11348) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: Add the SPDX information to each file Add copyright and licensing information as defined in version 3.0 of the REUSE Specification. * tweak format --------- Co-authored-by: syuilo --- packages/frontend/src/scripts/2fa.ts | 5 + packages/frontend/src/scripts/achievements.ts | 5 + packages/frontend/src/scripts/aiscript/api.ts | 5 + packages/frontend/src/scripts/aiscript/ui.ts | 5 + packages/frontend/src/scripts/api.ts | 5 + packages/frontend/src/scripts/array.ts | 5 + packages/frontend/src/scripts/autocomplete.ts | 5 + packages/frontend/src/scripts/cache.ts | 7 +- packages/frontend/src/scripts/chart-legend.ts | 5 + packages/frontend/src/scripts/chart-vline.ts | 5 + packages/frontend/src/scripts/check-word-mute.ts | 5 + packages/frontend/src/scripts/clicker-game.ts | 5 + packages/frontend/src/scripts/clone.ts | 5 + packages/frontend/src/scripts/collapsed.ts | 5 + packages/frontend/src/scripts/collect-page-vars.ts | 5 + packages/frontend/src/scripts/color.ts | 5 + packages/frontend/src/scripts/confetti.ts | 5 + packages/frontend/src/scripts/contains.ts | 5 + packages/frontend/src/scripts/copy-to-clipboard.ts | 5 + packages/frontend/src/scripts/device-kind.ts | 5 + packages/frontend/src/scripts/emoji-base.ts | 5 + packages/frontend/src/scripts/emojilist.ts | 5 + .../src/scripts/extract-avg-color-from-blurhash.ts | 13 ++- packages/frontend/src/scripts/extract-mentions.ts | 5 + .../frontend/src/scripts/extract-url-from-mfm.ts | 5 + packages/frontend/src/scripts/focus.ts | 5 + packages/frontend/src/scripts/form.ts | 5 + .../frontend/src/scripts/format-time-string.ts | 5 + packages/frontend/src/scripts/gen-search-query.ts | 5 + .../frontend/src/scripts/get-account-from-id.ts | 5 + .../frontend/src/scripts/get-drive-file-menu.ts | 7 +- packages/frontend/src/scripts/get-note-menu.ts | 5 + packages/frontend/src/scripts/get-note-summary.ts | 5 + packages/frontend/src/scripts/get-user-menu.ts | 5 + packages/frontend/src/scripts/get-user-name.ts | 5 + packages/frontend/src/scripts/hotkey.ts | 5 + packages/frontend/src/scripts/i18n.ts | 5 + packages/frontend/src/scripts/idb-proxy.ts | 5 + packages/frontend/src/scripts/idle-render.ts | 5 + packages/frontend/src/scripts/init-chart.ts | 5 + packages/frontend/src/scripts/initialize-sw.ts | 7 +- packages/frontend/src/scripts/intl-const.ts | 17 ++- .../frontend/src/scripts/is-device-darkmode.ts | 5 + packages/frontend/src/scripts/isFfVisibleForMe.ts | 5 + packages/frontend/src/scripts/keycode.ts | 5 + packages/frontend/src/scripts/langmap.ts | 5 + packages/frontend/src/scripts/login-id.ts | 5 + packages/frontend/src/scripts/lookup-user.ts | 5 + packages/frontend/src/scripts/lookup.ts | 5 + packages/frontend/src/scripts/media-proxy.ts | 7 +- packages/frontend/src/scripts/mfm-tags.ts | 5 + packages/frontend/src/scripts/page-metadata.ts | 5 + packages/frontend/src/scripts/physics.ts | 5 + packages/frontend/src/scripts/please-login.ts | 5 + packages/frontend/src/scripts/popout.ts | 7 +- packages/frontend/src/scripts/popup-position.ts | 4 + packages/frontend/src/scripts/reaction-picker.ts | 5 + packages/frontend/src/scripts/safe-uri-decode.ts | 5 + packages/frontend/src/scripts/scroll.ts | 5 + packages/frontend/src/scripts/select-file.ts | 5 + packages/frontend/src/scripts/show-moved-dialog.ts | 5 + .../frontend/src/scripts/show-suspended-dialog.ts | 5 + packages/frontend/src/scripts/shuffle.ts | 5 + packages/frontend/src/scripts/sound.ts | 23 ++-- packages/frontend/src/scripts/sticky-sidebar.ts | 5 + packages/frontend/src/scripts/test-utils.ts | 5 + packages/frontend/src/scripts/theme-editor.ts | 7 +- packages/frontend/src/scripts/theme.ts | 5 + packages/frontend/src/scripts/time.ts | 5 + packages/frontend/src/scripts/timezones.ts | 5 + packages/frontend/src/scripts/touch.ts | 5 + packages/frontend/src/scripts/unison-reload.ts | 5 + packages/frontend/src/scripts/upload.ts | 5 + .../frontend/src/scripts/upload/compress-config.ts | 5 + .../frontend/src/scripts/upload/isWebpSupported.ts | 5 + packages/frontend/src/scripts/url.ts | 5 + packages/frontend/src/scripts/use-chart-tooltip.ts | 5 + .../src/scripts/use-document-visibility.ts | 5 + packages/frontend/src/scripts/use-interval.ts | 5 + packages/frontend/src/scripts/use-leave-guard.ts | 5 + packages/frontend/src/scripts/use-note-capture.ts | 5 + packages/frontend/src/scripts/use-tooltip.ts | 5 + .../frontend/src/scripts/worker-multi-dispatch.ts | 127 +++++++++++---------- 83 files changed, 500 insertions(+), 86 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/src/scripts/2fa.ts b/packages/frontend/src/scripts/2fa.ts index 62a38ff02a..2d0498522a 100644 --- a/packages/frontend/src/scripts/2fa.ts +++ b/packages/frontend/src/scripts/2fa.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export function byteify(string: string, encoding: 'ascii' | 'base64' | 'hex') { switch (encoding) { case 'ascii': diff --git a/packages/frontend/src/scripts/achievements.ts b/packages/frontend/src/scripts/achievements.ts index fbca005769..8b3a518830 100644 --- a/packages/frontend/src/scripts/achievements.ts +++ b/packages/frontend/src/scripts/achievements.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as os from '@/os'; import { $i } from '@/account'; diff --git a/packages/frontend/src/scripts/aiscript/api.ts b/packages/frontend/src/scripts/aiscript/api.ts index c8b90b4fd7..f69c631198 100644 --- a/packages/frontend/src/scripts/aiscript/api.ts +++ b/packages/frontend/src/scripts/aiscript/api.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { utils, values } from '@syuilo/aiscript'; import * as os from '@/os'; import { $i } from '@/account'; diff --git a/packages/frontend/src/scripts/aiscript/ui.ts b/packages/frontend/src/scripts/aiscript/ui.ts index c26ae5a4df..3d059b04de 100644 --- a/packages/frontend/src/scripts/aiscript/ui.ts +++ b/packages/frontend/src/scripts/aiscript/ui.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { utils, values } from '@syuilo/aiscript'; import { v4 as uuid } from 'uuid'; import { ref, Ref } from 'vue'; diff --git a/packages/frontend/src/scripts/api.ts b/packages/frontend/src/scripts/api.ts index 97081d170f..aac953b644 100644 --- a/packages/frontend/src/scripts/api.ts +++ b/packages/frontend/src/scripts/api.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { Endpoints } from 'misskey-js/built/api.types'; import { ref } from 'vue'; import { apiUrl } from '@/config'; diff --git a/packages/frontend/src/scripts/array.ts b/packages/frontend/src/scripts/array.ts index c9a146e707..eeadcb8794 100644 --- a/packages/frontend/src/scripts/array.ts +++ b/packages/frontend/src/scripts/array.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { EndoRelation, Predicate } from './relation'; /** diff --git a/packages/frontend/src/scripts/autocomplete.ts b/packages/frontend/src/scripts/autocomplete.ts index 564573ae8a..a1184fb9d4 100644 --- a/packages/frontend/src/scripts/autocomplete.ts +++ b/packages/frontend/src/scripts/autocomplete.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { nextTick, Ref, ref, defineAsyncComponent } from 'vue'; import getCaretCoordinates from 'textarea-caret'; import { toASCII } from 'punycode/'; diff --git a/packages/frontend/src/scripts/cache.ts b/packages/frontend/src/scripts/cache.ts index a61d858353..0dda203ef0 100644 --- a/packages/frontend/src/scripts/cache.ts +++ b/packages/frontend/src/scripts/cache.ts @@ -1,4 +1,9 @@ -import { ref } from "vue"; +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { ref } from 'vue'; export class Cache { private cachedAt: number | null = null; diff --git a/packages/frontend/src/scripts/chart-legend.ts b/packages/frontend/src/scripts/chart-legend.ts index 6a5370cc87..e91908e0cb 100644 --- a/packages/frontend/src/scripts/chart-legend.ts +++ b/packages/frontend/src/scripts/chart-legend.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { Plugin } from 'chart.js'; import MkChartLegend from '@/components/MkChartLegend.vue'; diff --git a/packages/frontend/src/scripts/chart-vline.ts b/packages/frontend/src/scripts/chart-vline.ts index f321443834..336ec6cfbb 100644 --- a/packages/frontend/src/scripts/chart-vline.ts +++ b/packages/frontend/src/scripts/chart-vline.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { Plugin } from 'chart.js'; export const chartVLine = (vLineColor: string) => ({ diff --git a/packages/frontend/src/scripts/check-word-mute.ts b/packages/frontend/src/scripts/check-word-mute.ts index 35d40a6e08..5ac19c8d5b 100644 --- a/packages/frontend/src/scripts/check-word-mute.ts +++ b/packages/frontend/src/scripts/check-word-mute.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export function checkWordMute(note: Record, me: Record | null | undefined, mutedWords: Array): boolean { // 自分自身 if (me && (note.userId === me.id)) return false; diff --git a/packages/frontend/src/scripts/clicker-game.ts b/packages/frontend/src/scripts/clicker-game.ts index d3b0f9d1e2..7d8804b4af 100644 --- a/packages/frontend/src/scripts/clicker-game.ts +++ b/packages/frontend/src/scripts/clicker-game.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { ref, computed } from 'vue'; import * as os from '@/os'; diff --git a/packages/frontend/src/scripts/clone.ts b/packages/frontend/src/scripts/clone.ts index cf8fa64ba3..96b53684f3 100644 --- a/packages/frontend/src/scripts/clone.ts +++ b/packages/frontend/src/scripts/clone.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + // structredCloneが遅いため // SEE: http://var.blog.jp/archives/86038606.html // あと、Vue RefをIndexedDBに保存しようとしてstructredCloneを使ったらエラーになった diff --git a/packages/frontend/src/scripts/collapsed.ts b/packages/frontend/src/scripts/collapsed.ts index 1bf56f233b..f21bf3cacf 100644 --- a/packages/frontend/src/scripts/collapsed.ts +++ b/packages/frontend/src/scripts/collapsed.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as mfm from 'mfm-js'; import * as misskey from 'misskey-js'; import { extractUrlFromMfm } from './extract-url-from-mfm'; diff --git a/packages/frontend/src/scripts/collect-page-vars.ts b/packages/frontend/src/scripts/collect-page-vars.ts index 76b68beaf6..79356e60eb 100644 --- a/packages/frontend/src/scripts/collect-page-vars.ts +++ b/packages/frontend/src/scripts/collect-page-vars.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + interface StringPageVar { name: string, type: 'string', diff --git a/packages/frontend/src/scripts/color.ts b/packages/frontend/src/scripts/color.ts index 10a99a5a05..25ef41d9b7 100644 --- a/packages/frontend/src/scripts/color.ts +++ b/packages/frontend/src/scripts/color.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export const alpha = (hex: string, a: number): string => { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)!; const r = parseInt(result[1], 16); diff --git a/packages/frontend/src/scripts/confetti.ts b/packages/frontend/src/scripts/confetti.ts index 9e03acbf8d..efc369ff56 100644 --- a/packages/frontend/src/scripts/confetti.ts +++ b/packages/frontend/src/scripts/confetti.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import _confetti from 'canvas-confetti'; import * as os from '@/os'; diff --git a/packages/frontend/src/scripts/contains.ts b/packages/frontend/src/scripts/contains.ts index 256e09d293..b50ce4128c 100644 --- a/packages/frontend/src/scripts/contains.ts +++ b/packages/frontend/src/scripts/contains.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export default (parent, child, checkSame = true) => { if (checkSame && parent === child) return true; let node = child.parentNode; diff --git a/packages/frontend/src/scripts/copy-to-clipboard.ts b/packages/frontend/src/scripts/copy-to-clipboard.ts index ab13cab970..3884d4a20a 100644 --- a/packages/frontend/src/scripts/copy-to-clipboard.ts +++ b/packages/frontend/src/scripts/copy-to-clipboard.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + /** * Clipboardに値をコピー(TODO: 文字列以外も対応) */ diff --git a/packages/frontend/src/scripts/device-kind.ts b/packages/frontend/src/scripts/device-kind.ts index b575db9606..4a47ebf8f2 100644 --- a/packages/frontend/src/scripts/device-kind.ts +++ b/packages/frontend/src/scripts/device-kind.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { defaultStore } from '@/store'; await defaultStore.ready; diff --git a/packages/frontend/src/scripts/emoji-base.ts b/packages/frontend/src/scripts/emoji-base.ts index e91f2fa22d..46a13462a1 100644 --- a/packages/frontend/src/scripts/emoji-base.ts +++ b/packages/frontend/src/scripts/emoji-base.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + const twemojiSvgBase = '/twemoji'; const fluentEmojiPngBase = '/fluent-emoji'; diff --git a/packages/frontend/src/scripts/emojilist.ts b/packages/frontend/src/scripts/emojilist.ts index 79661b7ce9..4159da84c8 100644 --- a/packages/frontend/src/scripts/emojilist.ts +++ b/packages/frontend/src/scripts/emojilist.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export const unicodeEmojiCategories = ['face', 'people', 'animals_and_nature', 'food_and_drink', 'activity', 'travel_and_places', 'objects', 'symbols', 'flags'] as const; export type UnicodeEmojiDef = { diff --git a/packages/frontend/src/scripts/extract-avg-color-from-blurhash.ts b/packages/frontend/src/scripts/extract-avg-color-from-blurhash.ts index af517f2672..57b296ab2a 100644 --- a/packages/frontend/src/scripts/extract-avg-color-from-blurhash.ts +++ b/packages/frontend/src/scripts/extract-avg-color-from-blurhash.ts @@ -1,9 +1,14 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export function extractAvgColorFromBlurhash(hash: string) { return typeof hash === 'string' ? '#' + [...hash.slice(2, 6)] - .map(x => '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~'.indexOf(x)) - .reduce((a, c) => a * 83 + c, 0) - .toString(16) - .padStart(6, '0') + .map(x => '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~'.indexOf(x)) + .reduce((a, c) => a * 83 + c, 0) + .toString(16) + .padStart(6, '0') : undefined; } diff --git a/packages/frontend/src/scripts/extract-mentions.ts b/packages/frontend/src/scripts/extract-mentions.ts index cc19b161a8..74ce45d324 100644 --- a/packages/frontend/src/scripts/extract-mentions.ts +++ b/packages/frontend/src/scripts/extract-mentions.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + // test is located in test/extract-mentions import * as mfm from 'mfm-js'; diff --git a/packages/frontend/src/scripts/extract-url-from-mfm.ts b/packages/frontend/src/scripts/extract-url-from-mfm.ts index 34e3eb6c19..e72de784f8 100644 --- a/packages/frontend/src/scripts/extract-url-from-mfm.ts +++ b/packages/frontend/src/scripts/extract-url-from-mfm.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as mfm from 'mfm-js'; import { unique } from '@/scripts/array'; diff --git a/packages/frontend/src/scripts/focus.ts b/packages/frontend/src/scripts/focus.ts index d6802fa322..6a31ebd431 100644 --- a/packages/frontend/src/scripts/focus.ts +++ b/packages/frontend/src/scripts/focus.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export function focusPrev(el: Element | null, self = false, scroll = true) { if (el == null) return; if (!self) el = el.previousElementSibling; diff --git a/packages/frontend/src/scripts/form.ts b/packages/frontend/src/scripts/form.ts index 635803a2bc..222fd9b0b7 100644 --- a/packages/frontend/src/scripts/form.ts +++ b/packages/frontend/src/scripts/form.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + type EnumItem = string | {label: string; value: string;}; export type FormItem = { label?: string; diff --git a/packages/frontend/src/scripts/format-time-string.ts b/packages/frontend/src/scripts/format-time-string.ts index c20db5e827..918996dd10 100644 --- a/packages/frontend/src/scripts/format-time-string.ts +++ b/packages/frontend/src/scripts/format-time-string.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + const defaultLocaleStringFormats: {[index: string]: string} = { 'weekday': 'narrow', 'era': 'narrow', diff --git a/packages/frontend/src/scripts/gen-search-query.ts b/packages/frontend/src/scripts/gen-search-query.ts index 956e0f35d0..97462f3f09 100644 --- a/packages/frontend/src/scripts/gen-search-query.ts +++ b/packages/frontend/src/scripts/gen-search-query.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as Acct from 'misskey-js/built/acct'; import { host as localHost } from '@/config'; diff --git a/packages/frontend/src/scripts/get-account-from-id.ts b/packages/frontend/src/scripts/get-account-from-id.ts index 1da897f176..60bd778f3e 100644 --- a/packages/frontend/src/scripts/get-account-from-id.ts +++ b/packages/frontend/src/scripts/get-account-from-id.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { get } from '@/scripts/idb-proxy'; export async function getAccountFromId(id: string) { diff --git a/packages/frontend/src/scripts/get-drive-file-menu.ts b/packages/frontend/src/scripts/get-drive-file-menu.ts index 9b488087e2..e3a95b5d8e 100644 --- a/packages/frontend/src/scripts/get-drive-file-menu.ts +++ b/packages/frontend/src/scripts/get-drive-file-menu.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as Misskey from 'misskey-js'; import { defineAsyncComponent } from 'vue'; import { i18n } from '@/i18n'; @@ -88,7 +93,7 @@ export function getDriveFileMenu(file: Misskey.entities.DriveFile, folder?: Miss icon: 'ti ti-crop', action: () => os.cropImage(file, { aspectRatio: NaN, - uploadFolder: folder ? folder.id : folder + uploadFolder: folder ? folder.id : folder, }), }] : [], null, { text: i18n.ts.createNoteFromTheFile, diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts index 960f26ca67..b63c797503 100644 --- a/packages/frontend/src/scripts/get-note-menu.ts +++ b/packages/frontend/src/scripts/get-note-menu.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { defineAsyncComponent, Ref } from 'vue'; import * as misskey from 'misskey-js'; import { claimAchievement } from './achievements'; diff --git a/packages/frontend/src/scripts/get-note-summary.ts b/packages/frontend/src/scripts/get-note-summary.ts index d57e1c3029..67d6485760 100644 --- a/packages/frontend/src/scripts/get-note-summary.ts +++ b/packages/frontend/src/scripts/get-note-summary.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as misskey from 'misskey-js'; import { i18n } from '@/i18n'; diff --git a/packages/frontend/src/scripts/get-user-menu.ts b/packages/frontend/src/scripts/get-user-menu.ts index 1c93d58b44..7f2111be4c 100644 --- a/packages/frontend/src/scripts/get-user-menu.ts +++ b/packages/frontend/src/scripts/get-user-menu.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { toUnicode } from 'punycode'; import { defineAsyncComponent } from 'vue'; import * as misskey from 'misskey-js'; diff --git a/packages/frontend/src/scripts/get-user-name.ts b/packages/frontend/src/scripts/get-user-name.ts index 4daf203e06..3ae80d7fc3 100644 --- a/packages/frontend/src/scripts/get-user-name.ts +++ b/packages/frontend/src/scripts/get-user-name.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export default function(user: { name?: string | null, username: string }): string { return user.name === '' ? user.username : user.name ?? user.username; } diff --git a/packages/frontend/src/scripts/hotkey.ts b/packages/frontend/src/scripts/hotkey.ts index b7238016c6..09ffb405e7 100644 --- a/packages/frontend/src/scripts/hotkey.ts +++ b/packages/frontend/src/scripts/hotkey.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import keyCode from './keycode'; type Callback = (ev: KeyboardEvent) => void; diff --git a/packages/frontend/src/scripts/i18n.ts b/packages/frontend/src/scripts/i18n.ts index 54184386da..8e5f17f38a 100644 --- a/packages/frontend/src/scripts/i18n.ts +++ b/packages/frontend/src/scripts/i18n.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export class I18n> { public ts: T; diff --git a/packages/frontend/src/scripts/idb-proxy.ts b/packages/frontend/src/scripts/idb-proxy.ts index 7dbca01dea..a20cfcb1d0 100644 --- a/packages/frontend/src/scripts/idb-proxy.ts +++ b/packages/frontend/src/scripts/idb-proxy.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + // FirefoxのプライベートモードなどではindexedDBが使用不可能なので、 // indexedDBが使えない環境ではlocalStorageを使う import { diff --git a/packages/frontend/src/scripts/idle-render.ts b/packages/frontend/src/scripts/idle-render.ts index a1470b82e9..ac1be50c73 100644 --- a/packages/frontend/src/scripts/idle-render.ts +++ b/packages/frontend/src/scripts/idle-render.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + const requestIdleCallback: typeof globalThis.requestIdleCallback = globalThis.requestIdleCallback ?? ((callback) => { const start = performance.now(); const timeoutId = setTimeout(() => { diff --git a/packages/frontend/src/scripts/init-chart.ts b/packages/frontend/src/scripts/init-chart.ts index fc18869009..c9d3a7ca37 100644 --- a/packages/frontend/src/scripts/init-chart.ts +++ b/packages/frontend/src/scripts/init-chart.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { Chart, ArcElement, diff --git a/packages/frontend/src/scripts/initialize-sw.ts b/packages/frontend/src/scripts/initialize-sw.ts index de52f30523..538554fa64 100644 --- a/packages/frontend/src/scripts/initialize-sw.ts +++ b/packages/frontend/src/scripts/initialize-sw.ts @@ -1,9 +1,14 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { lang } from '@/config'; export async function initializeSw() { if (!('serviceWorker' in navigator)) return; - navigator.serviceWorker.register(`/sw.js`, { scope: '/', type: 'classic' }); + navigator.serviceWorker.register('/sw.js', { scope: '/', type: 'classic' }); navigator.serviceWorker.ready.then(registration => { registration.active?.postMessage({ msg: 'initialize', diff --git a/packages/frontend/src/scripts/intl-const.ts b/packages/frontend/src/scripts/intl-const.ts index 081ff6248c..31aa9b99b8 100644 --- a/packages/frontend/src/scripts/intl-const.ts +++ b/packages/frontend/src/scripts/intl-const.ts @@ -1,12 +1,17 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { lang } from '@/config'; export const versatileLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP'); export const dateTimeFormat = new Intl.DateTimeFormat(versatileLang, { - year: 'numeric', - month: 'numeric', - day: 'numeric', - hour: 'numeric', - minute: 'numeric', - second: 'numeric', + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', }); export const numberFormat = new Intl.NumberFormat(versatileLang); diff --git a/packages/frontend/src/scripts/is-device-darkmode.ts b/packages/frontend/src/scripts/is-device-darkmode.ts index 854f38e517..badc295726 100644 --- a/packages/frontend/src/scripts/is-device-darkmode.ts +++ b/packages/frontend/src/scripts/is-device-darkmode.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export function isDeviceDarkmode() { return window.matchMedia('(prefers-color-scheme: dark)').matches; } diff --git a/packages/frontend/src/scripts/isFfVisibleForMe.ts b/packages/frontend/src/scripts/isFfVisibleForMe.ts index 0ddd3f377d..eb21abb24c 100644 --- a/packages/frontend/src/scripts/isFfVisibleForMe.ts +++ b/packages/frontend/src/scripts/isFfVisibleForMe.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as misskey from 'misskey-js'; import { $i } from '@/account'; diff --git a/packages/frontend/src/scripts/keycode.ts b/packages/frontend/src/scripts/keycode.ts index 35813edbd5..57bc4d19ba 100644 --- a/packages/frontend/src/scripts/keycode.ts +++ b/packages/frontend/src/scripts/keycode.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export default (input: string): string[] => { if (Object.keys(aliases).some(a => a.toLowerCase() === input.toLowerCase())) { const codes = aliases[input]; diff --git a/packages/frontend/src/scripts/langmap.ts b/packages/frontend/src/scripts/langmap.ts index 25f5b366c8..3912d58d82 100644 --- a/packages/frontend/src/scripts/langmap.ts +++ b/packages/frontend/src/scripts/langmap.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + // TODO: sharedに置いてバックエンドのと統合したい export const langmap = { 'ach': { diff --git a/packages/frontend/src/scripts/login-id.ts b/packages/frontend/src/scripts/login-id.ts index 0f9c6be4a9..fe0e17e66e 100644 --- a/packages/frontend/src/scripts/login-id.ts +++ b/packages/frontend/src/scripts/login-id.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export function getUrlWithLoginId(url: string, loginId: string) { const u = new URL(url, origin); u.searchParams.append('loginId', loginId); diff --git a/packages/frontend/src/scripts/lookup-user.ts b/packages/frontend/src/scripts/lookup-user.ts index 3ab9d55300..83d7914fb1 100644 --- a/packages/frontend/src/scripts/lookup-user.ts +++ b/packages/frontend/src/scripts/lookup-user.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as Acct from 'misskey-js/built/acct'; import { i18n } from '@/i18n'; import * as os from '@/os'; diff --git a/packages/frontend/src/scripts/lookup.ts b/packages/frontend/src/scripts/lookup.ts index 3f357a3c92..f3192aac11 100644 --- a/packages/frontend/src/scripts/lookup.ts +++ b/packages/frontend/src/scripts/lookup.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as os from '@/os'; import { i18n } from '@/i18n'; import { mainRouter } from '@/router'; diff --git a/packages/frontend/src/scripts/media-proxy.ts b/packages/frontend/src/scripts/media-proxy.ts index 3a3dbffb47..81fef3fdb6 100644 --- a/packages/frontend/src/scripts/media-proxy.ts +++ b/packages/frontend/src/scripts/media-proxy.ts @@ -1,8 +1,13 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { query } from '@/scripts/url'; import { url } from '@/config'; import { instance } from '@/instance'; -export function getProxiedImageUrl(imageUrl: string, type?: 'preview' | 'emoji' | 'avatar', mustOrigin: boolean = false, noFallback: boolean = false): string { +export function getProxiedImageUrl(imageUrl: string, type?: 'preview' | 'emoji' | 'avatar', mustOrigin = false, noFallback = false): string { const localProxy = `${url}/proxy`; if (imageUrl.startsWith(instance.mediaProxy + '/') || imageUrl.startsWith('/proxy/') || imageUrl.startsWith(localProxy + '/')) { diff --git a/packages/frontend/src/scripts/mfm-tags.ts b/packages/frontend/src/scripts/mfm-tags.ts index a84198282d..dc78e42238 100644 --- a/packages/frontend/src/scripts/mfm-tags.ts +++ b/packages/frontend/src/scripts/mfm-tags.ts @@ -1 +1,6 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'scale', 'position', 'fg', 'bg', 'font', 'blur', 'rainbow', 'sparkle', 'rotate']; diff --git a/packages/frontend/src/scripts/page-metadata.ts b/packages/frontend/src/scripts/page-metadata.ts index 8810e26960..0b483c3042 100644 --- a/packages/frontend/src/scripts/page-metadata.ts +++ b/packages/frontend/src/scripts/page-metadata.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as misskey from 'misskey-js'; import { ComputedRef, inject, isRef, onActivated, onMounted, provide, ref, Ref } from 'vue'; diff --git a/packages/frontend/src/scripts/physics.ts b/packages/frontend/src/scripts/physics.ts index efda80f074..cf9fad70eb 100644 --- a/packages/frontend/src/scripts/physics.ts +++ b/packages/frontend/src/scripts/physics.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as Matter from 'matter-js'; export function physics(container: HTMLElement) { diff --git a/packages/frontend/src/scripts/please-login.ts b/packages/frontend/src/scripts/please-login.ts index c101a127f3..f0eebf2242 100644 --- a/packages/frontend/src/scripts/please-login.ts +++ b/packages/frontend/src/scripts/please-login.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { defineAsyncComponent } from 'vue'; import { $i } from '@/account'; import { i18n } from '@/i18n'; diff --git a/packages/frontend/src/scripts/popout.ts b/packages/frontend/src/scripts/popout.ts index 580031d0a3..c0974ff589 100644 --- a/packages/frontend/src/scripts/popout.ts +++ b/packages/frontend/src/scripts/popout.ts @@ -1,5 +1,10 @@ -import * as config from '@/config'; +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { appendQuery } from './url'; +import * as config from '@/config'; export function popout(path: string, w?: HTMLElement) { let url = path.startsWith('http://') || path.startsWith('https://') ? path : config.url + path; diff --git a/packages/frontend/src/scripts/popup-position.ts b/packages/frontend/src/scripts/popup-position.ts index cb45002202..0a799c5665 100644 --- a/packages/frontend/src/scripts/popup-position.ts +++ b/packages/frontend/src/scripts/popup-position.ts @@ -1,3 +1,7 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ export function calcPopupPosition(el: HTMLElement, props: { anchorElement: HTMLElement | null; diff --git a/packages/frontend/src/scripts/reaction-picker.ts b/packages/frontend/src/scripts/reaction-picker.ts index fe32e719da..919c566e3f 100644 --- a/packages/frontend/src/scripts/reaction-picker.ts +++ b/packages/frontend/src/scripts/reaction-picker.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { defineAsyncComponent, Ref, ref } from 'vue'; import { popup } from '@/os'; diff --git a/packages/frontend/src/scripts/safe-uri-decode.ts b/packages/frontend/src/scripts/safe-uri-decode.ts index 301b56d7fd..625d8c34a7 100644 --- a/packages/frontend/src/scripts/safe-uri-decode.ts +++ b/packages/frontend/src/scripts/safe-uri-decode.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export function safeURIDecode(str: string): string { try { return decodeURIComponent(str); diff --git a/packages/frontend/src/scripts/scroll.ts b/packages/frontend/src/scripts/scroll.ts index a002f02b5a..b2b2c41dcf 100644 --- a/packages/frontend/src/scripts/scroll.ts +++ b/packages/frontend/src/scripts/scroll.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + type ScrollBehavior = 'auto' | 'smooth' | 'instant'; export function getScrollContainer(el: HTMLElement | null): HTMLElement | null { diff --git a/packages/frontend/src/scripts/select-file.ts b/packages/frontend/src/scripts/select-file.ts index 891da6eb78..b3fd52a9de 100644 --- a/packages/frontend/src/scripts/select-file.ts +++ b/packages/frontend/src/scripts/select-file.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { ref } from 'vue'; import { DriveFile } from 'misskey-js/built/entities'; import * as os from '@/os'; diff --git a/packages/frontend/src/scripts/show-moved-dialog.ts b/packages/frontend/src/scripts/show-moved-dialog.ts index acb26c36e2..9e3e4ee7ff 100644 --- a/packages/frontend/src/scripts/show-moved-dialog.ts +++ b/packages/frontend/src/scripts/show-moved-dialog.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as os from '@/os'; import { $i } from '@/account'; import { i18n } from '@/i18n'; diff --git a/packages/frontend/src/scripts/show-suspended-dialog.ts b/packages/frontend/src/scripts/show-suspended-dialog.ts index e11569ecd4..9f0d69af79 100644 --- a/packages/frontend/src/scripts/show-suspended-dialog.ts +++ b/packages/frontend/src/scripts/show-suspended-dialog.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import * as os from '@/os'; import { i18n } from '@/i18n'; diff --git a/packages/frontend/src/scripts/shuffle.ts b/packages/frontend/src/scripts/shuffle.ts index 05e6cdfbcf..d9d5bb1037 100644 --- a/packages/frontend/src/scripts/shuffle.ts +++ b/packages/frontend/src/scripts/shuffle.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + /** * 配列をシャッフル (破壊的) */ diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts index 68136cdcfe..7e64cafcf9 100644 --- a/packages/frontend/src/scripts/sound.ts +++ b/packages/frontend/src/scripts/sound.ts @@ -1,42 +1,47 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { markRaw } from 'vue'; import { Storage } from '@/pizzax'; export const soundConfigStore = markRaw(new Storage('sound', { mediaVolume: { where: 'device', - default: 0.5 + default: 0.5, }, sound_masterVolume: { where: 'device', - default: 0.3 + default: 0.3, }, sound_note: { where: 'account', - default: { type: 'syuilo/n-aec', volume: 1 } + default: { type: 'syuilo/n-aec', volume: 1 }, }, sound_noteMy: { where: 'account', - default: { type: 'syuilo/n-cea-4va', volume: 1 } + default: { type: 'syuilo/n-cea-4va', volume: 1 }, }, sound_notification: { where: 'account', - default: { type: 'syuilo/n-ea', volume: 1 } + default: { type: 'syuilo/n-ea', volume: 1 }, }, sound_chat: { where: 'account', - default: { type: 'syuilo/pope1', volume: 1 } + default: { type: 'syuilo/pope1', volume: 1 }, }, sound_chatBg: { where: 'account', - default: { type: 'syuilo/waon', volume: 1 } + default: { type: 'syuilo/waon', volume: 1 }, }, sound_antenna: { where: 'account', - default: { type: 'syuilo/triple', volume: 1 } + default: { type: 'syuilo/triple', volume: 1 }, }, sound_channel: { where: 'account', - default: { type: 'syuilo/square-pico', volume: 1 } + default: { type: 'syuilo/square-pico', volume: 1 }, }, })); diff --git a/packages/frontend/src/scripts/sticky-sidebar.ts b/packages/frontend/src/scripts/sticky-sidebar.ts index e6e125c6e8..f233c3648e 100644 --- a/packages/frontend/src/scripts/sticky-sidebar.ts +++ b/packages/frontend/src/scripts/sticky-sidebar.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export class StickySidebar { private lastScrollTop = 0; private container: HTMLElement; diff --git a/packages/frontend/src/scripts/test-utils.ts b/packages/frontend/src/scripts/test-utils.ts index 3e018f2d7e..8ffea08649 100644 --- a/packages/frontend/src/scripts/test-utils.ts +++ b/packages/frontend/src/scripts/test-utils.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + /// export async function tick(): Promise { diff --git a/packages/frontend/src/scripts/theme-editor.ts b/packages/frontend/src/scripts/theme-editor.ts index 001d87381c..69fd41255c 100644 --- a/packages/frontend/src/scripts/theme-editor.ts +++ b/packages/frontend/src/scripts/theme-editor.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { v4 as uuid } from 'uuid'; import { themeProps, Theme } from './theme'; @@ -76,6 +81,6 @@ export const convertToViewModel = (theme: Theme): ThemeViewModel => { .filter(k => k.startsWith('$')) .map(k => [k, fromThemeString(theme.props[k])] as [ string, ThemeValue ]); - vm.push(...consts); + vm.push(...consts); return vm; }; diff --git a/packages/frontend/src/scripts/theme.ts b/packages/frontend/src/scripts/theme.ts index bc61256cac..b8faa469b6 100644 --- a/packages/frontend/src/scripts/theme.ts +++ b/packages/frontend/src/scripts/theme.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { ref } from 'vue'; import tinycolor from 'tinycolor2'; import { globalEvents } from '@/events'; diff --git a/packages/frontend/src/scripts/time.ts b/packages/frontend/src/scripts/time.ts index b21978b186..4479db1081 100644 --- a/packages/frontend/src/scripts/time.ts +++ b/packages/frontend/src/scripts/time.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + const dateTimeIntervals = { 'day': 86400000, 'hour': 3600000, diff --git a/packages/frontend/src/scripts/timezones.ts b/packages/frontend/src/scripts/timezones.ts index 8ce07323f6..55f9be393f 100644 --- a/packages/frontend/src/scripts/timezones.ts +++ b/packages/frontend/src/scripts/timezones.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + export const timezones = [{ name: 'UTC', abbrev: 'UTC', diff --git a/packages/frontend/src/scripts/touch.ts b/packages/frontend/src/scripts/touch.ts index 4afd0e5dd4..0695913298 100644 --- a/packages/frontend/src/scripts/touch.ts +++ b/packages/frontend/src/scripts/touch.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { deviceKind } from '@/scripts/device-kind'; const isTouchSupported = 'maxTouchPoints' in navigator && navigator.maxTouchPoints > 0; diff --git a/packages/frontend/src/scripts/unison-reload.ts b/packages/frontend/src/scripts/unison-reload.ts index 59af584c1b..65fc090888 100644 --- a/packages/frontend/src/scripts/unison-reload.ts +++ b/packages/frontend/src/scripts/unison-reload.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + // SafariがBroadcastChannel未実装なのでライブラリを使う import { BroadcastChannel } from 'broadcast-channel'; diff --git a/packages/frontend/src/scripts/upload.ts b/packages/frontend/src/scripts/upload.ts index 2dd11c9fa2..f5ec4b60b4 100644 --- a/packages/frontend/src/scripts/upload.ts +++ b/packages/frontend/src/scripts/upload.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { reactive, ref } from 'vue'; import * as Misskey from 'misskey-js'; import { readAndCompressImage } from 'browser-image-resizer'; diff --git a/packages/frontend/src/scripts/upload/compress-config.ts b/packages/frontend/src/scripts/upload/compress-config.ts index 55d469c5e4..8fe64c8b76 100644 --- a/packages/frontend/src/scripts/upload/compress-config.ts +++ b/packages/frontend/src/scripts/upload/compress-config.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import isAnimated from 'is-file-animated'; import { isWebpSupported } from './isWebpSupported'; import type { BrowserImageResizerConfig } from 'browser-image-resizer'; diff --git a/packages/frontend/src/scripts/upload/isWebpSupported.ts b/packages/frontend/src/scripts/upload/isWebpSupported.ts index cde8b9d785..185c3e6b40 100644 --- a/packages/frontend/src/scripts/upload/isWebpSupported.ts +++ b/packages/frontend/src/scripts/upload/isWebpSupported.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + let isWebpSupportedCache: boolean | undefined; export function isWebpSupported() { if (isWebpSupportedCache === undefined) { diff --git a/packages/frontend/src/scripts/url.ts b/packages/frontend/src/scripts/url.ts index 07737d6228..625f4ce057 100644 --- a/packages/frontend/src/scripts/url.ts +++ b/packages/frontend/src/scripts/url.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + /* objを検査して * 1. 配列に何も入っていない時はクエリを付けない * 2. プロパティがundefinedの時はクエリを付けない diff --git a/packages/frontend/src/scripts/use-chart-tooltip.ts b/packages/frontend/src/scripts/use-chart-tooltip.ts index 6f40fd4a30..507fa4deca 100644 --- a/packages/frontend/src/scripts/use-chart-tooltip.ts +++ b/packages/frontend/src/scripts/use-chart-tooltip.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { onUnmounted, onDeactivated, ref } from 'vue'; import * as os from '@/os'; import MkChartTooltip from '@/components/MkChartTooltip.vue'; diff --git a/packages/frontend/src/scripts/use-document-visibility.ts b/packages/frontend/src/scripts/use-document-visibility.ts index 47e91dd937..a9e2512eb3 100644 --- a/packages/frontend/src/scripts/use-document-visibility.ts +++ b/packages/frontend/src/scripts/use-document-visibility.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { onMounted, onUnmounted, ref, Ref } from 'vue'; export function useDocumentVisibility(): Ref { diff --git a/packages/frontend/src/scripts/use-interval.ts b/packages/frontend/src/scripts/use-interval.ts index 601dea6724..b8c5431fb6 100644 --- a/packages/frontend/src/scripts/use-interval.ts +++ b/packages/frontend/src/scripts/use-interval.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { onMounted, onUnmounted } from 'vue'; export function useInterval(fn: () => void, interval: number, options: { diff --git a/packages/frontend/src/scripts/use-leave-guard.ts b/packages/frontend/src/scripts/use-leave-guard.ts index 146b012471..c9750c3923 100644 --- a/packages/frontend/src/scripts/use-leave-guard.ts +++ b/packages/frontend/src/scripts/use-leave-guard.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { Ref } from 'vue'; export function useLeaveGuard(enabled: Ref) { diff --git a/packages/frontend/src/scripts/use-note-capture.ts b/packages/frontend/src/scripts/use-note-capture.ts index d057386b13..c96cf7165b 100644 --- a/packages/frontend/src/scripts/use-note-capture.ts +++ b/packages/frontend/src/scripts/use-note-capture.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { onUnmounted, Ref } from 'vue'; import * as misskey from 'misskey-js'; import { useStream } from '@/stream'; diff --git a/packages/frontend/src/scripts/use-tooltip.ts b/packages/frontend/src/scripts/use-tooltip.ts index 1f6e0fb6ce..0a82997728 100644 --- a/packages/frontend/src/scripts/use-tooltip.ts +++ b/packages/frontend/src/scripts/use-tooltip.ts @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + import { Ref, ref, watch, onUnmounted } from 'vue'; export function useTooltip( diff --git a/packages/frontend/src/scripts/worker-multi-dispatch.ts b/packages/frontend/src/scripts/worker-multi-dispatch.ts index 1847a8ccff..1d184e99a1 100644 --- a/packages/frontend/src/scripts/worker-multi-dispatch.ts +++ b/packages/frontend/src/scripts/worker-multi-dispatch.ts @@ -1,75 +1,80 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + function defaultUseWorkerNumber(prev: number, totalWorkers: number) { - return prev + 1; + return prev + 1; } export class WorkerMultiDispatch { - private symbol = Symbol('WorkerMultiDispatch'); - private workers: Worker[] = []; - private terminated = false; - private prevWorkerNumber = 0; - private getUseWorkerNumber = defaultUseWorkerNumber; - private finalizationRegistry: FinalizationRegistry; + private symbol = Symbol('WorkerMultiDispatch'); + private workers: Worker[] = []; + private terminated = false; + private prevWorkerNumber = 0; + private getUseWorkerNumber = defaultUseWorkerNumber; + private finalizationRegistry: FinalizationRegistry; - constructor(workerConstructor: () => Worker, concurrency: number, getUseWorkerNumber = defaultUseWorkerNumber) { - this.getUseWorkerNumber = getUseWorkerNumber; - for (let i = 0; i < concurrency; i++) { - this.workers.push(workerConstructor()); - } + constructor(workerConstructor: () => Worker, concurrency: number, getUseWorkerNumber = defaultUseWorkerNumber) { + this.getUseWorkerNumber = getUseWorkerNumber; + for (let i = 0; i < concurrency; i++) { + this.workers.push(workerConstructor()); + } - this.finalizationRegistry = new FinalizationRegistry(() => { - this.terminate(); - }); - this.finalizationRegistry.register(this, this.symbol); + this.finalizationRegistry = new FinalizationRegistry(() => { + this.terminate(); + }); + this.finalizationRegistry.register(this, this.symbol); - if (_DEV_) console.log('WorkerMultiDispatch: Created', this); - } + if (_DEV_) console.log('WorkerMultiDispatch: Created', this); + } - public postMessage(message: POST, options?: Transferable[] | StructuredSerializeOptions, useWorkerNumber: typeof defaultUseWorkerNumber = this.getUseWorkerNumber) { - let workerNumber = useWorkerNumber(this.prevWorkerNumber, this.workers.length); - workerNumber = Math.abs(Math.round(workerNumber)) % this.workers.length; - if (_DEV_) console.log('WorkerMultiDispatch: Posting message to worker', workerNumber, useWorkerNumber); - this.prevWorkerNumber = workerNumber; + public postMessage(message: POST, options?: Transferable[] | StructuredSerializeOptions, useWorkerNumber: typeof defaultUseWorkerNumber = this.getUseWorkerNumber) { + let workerNumber = useWorkerNumber(this.prevWorkerNumber, this.workers.length); + workerNumber = Math.abs(Math.round(workerNumber)) % this.workers.length; + if (_DEV_) console.log('WorkerMultiDispatch: Posting message to worker', workerNumber, useWorkerNumber); + this.prevWorkerNumber = workerNumber; - // 不毛だがunionをoverloadに突っ込めない - // https://stackoverflow.com/questions/66507585/overload-signatures-union-types-and-no-overload-matches-this-call-error - // https://github.com/microsoft/TypeScript/issues/14107 - if (Array.isArray(options)) { - this.workers[workerNumber].postMessage(message, options); - } else { - this.workers[workerNumber].postMessage(message, options); - } - return workerNumber; - } + // 不毛だがunionをoverloadに突っ込めない + // https://stackoverflow.com/questions/66507585/overload-signatures-union-types-and-no-overload-matches-this-call-error + // https://github.com/microsoft/TypeScript/issues/14107 + if (Array.isArray(options)) { + this.workers[workerNumber].postMessage(message, options); + } else { + this.workers[workerNumber].postMessage(message, options); + } + return workerNumber; + } - public addListener(callback: (this: Worker, ev: MessageEvent) => any, options?: boolean | AddEventListenerOptions) { - this.workers.forEach(worker => { - worker.addEventListener('message', callback, options); - }); - } + public addListener(callback: (this: Worker, ev: MessageEvent) => any, options?: boolean | AddEventListenerOptions) { + this.workers.forEach(worker => { + worker.addEventListener('message', callback, options); + }); + } - public removeListener(callback: (this: Worker, ev: MessageEvent) => any, options?: boolean | AddEventListenerOptions) { - this.workers.forEach(worker => { - worker.removeEventListener('message', callback, options); - }); - } + public removeListener(callback: (this: Worker, ev: MessageEvent) => any, options?: boolean | AddEventListenerOptions) { + this.workers.forEach(worker => { + worker.removeEventListener('message', callback, options); + }); + } - public terminate() { - this.terminated = true; - if (_DEV_) console.log('WorkerMultiDispatch: Terminating', this); - this.workers.forEach(worker => { - worker.terminate(); - }); - this.workers = []; - this.finalizationRegistry.unregister(this); - } + public terminate() { + this.terminated = true; + if (_DEV_) console.log('WorkerMultiDispatch: Terminating', this); + this.workers.forEach(worker => { + worker.terminate(); + }); + this.workers = []; + this.finalizationRegistry.unregister(this); + } - public isTerminated() { - return this.terminated; - } - public getWorkers() { - return this.workers; - } - public getSymbol() { - return this.symbol; - } + public isTerminated() { + return this.terminated; + } + public getWorkers() { + return this.workers; + } + public getSymbol() { + return this.symbol; + } } -- cgit v1.2.3-freya From 8a72a05958f415aa035ae3523e28c0b75f2a8d26 Mon Sep 17 00:00:00 2001 From: tamaina Date: Tue, 1 Aug 2023 15:32:03 +0900 Subject: enhance(frontend): ユーザーメニューでスイッチでユーザーリストに追加・削除できるように (#11439) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * メニューのトグルをいい感じにする * user list toggle! * add changelog * fix * stop --- CHANGELOG.md | 2 + packages/frontend/src/components/MkMenu.vue | 57 +++++++++++--- packages/frontend/src/components/MkNote.vue | 8 +- .../frontend/src/components/MkNoteDetailed.vue | 8 +- .../frontend/src/components/MkSwitch.button.vue | 88 ++++++++++++++++++++++ packages/frontend/src/components/MkSwitch.vue | 50 +----------- packages/frontend/src/components/MkUserPopup.vue | 3 +- packages/frontend/src/pages/user/home.vue | 3 +- packages/frontend/src/scripts/get-note-menu.ts | 29 +++++-- packages/frontend/src/scripts/get-user-menu.ts | 49 +++++++++--- packages/frontend/src/types/menu.ts | 2 +- 11 files changed, 214 insertions(+), 85 deletions(-) create mode 100644 packages/frontend/src/components/MkSwitch.button.vue (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index 52c8bcd42f..10ddc33d9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ - OAuth 2.0のサポート ### Client +- メニューのスイッチの動作を改善 +- Enhance: ユーザーメニューでスイッチでユーザーリストに追加・削除できるように - Enhance: 自分が押したリアクションのデザインを改善 - Fix: サーバー情報画面(`/instance-info/{domain}`)でブロックができないのを修正 - Fix: 未読のお知らせの「わかった」をクリック・タップしてもその場で「わかった」が消えない問題を修正 diff --git a/packages/frontend/src/components/MkMenu.vue b/packages/frontend/src/components/MkMenu.vue index f3c7c235a8..3d4e45b1f4 100644 --- a/packages/frontend/src/components/MkMenu.vue +++ b/packages/frontend/src/components/MkMenu.vue @@ -35,9 +35,10 @@ SPDX-License-Identifier: AGPL-3.0-only - - {{ item.text }} - + diff --git a/packages/frontend/src/pages/admin/users.vue b/packages/frontend/src/pages/admin/users.vue index f62ab47033..084d5c0ed0 100644 --- a/packages/frontend/src/pages/admin/users.vue +++ b/packages/frontend/src/pages/admin/users.vue @@ -45,7 +45,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- +
@@ -116,7 +116,7 @@ async function addUser() { } function show(user) { - os.pageWindow(`/user-info/${user.id}`); + os.pageWindow(`/admin/user/${user.id}`); } const headerActions = $computed(() => [{ diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue index 24355c0556..143589bd8c 100644 --- a/packages/frontend/src/pages/instance-info.vue +++ b/packages/frontend/src/pages/instance-info.vue @@ -102,7 +102,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- + diff --git a/packages/frontend/src/pages/settings/mute-block.vue b/packages/frontend/src/pages/settings/mute-block.vue index dcfd8b1e2e..c35fc0e0e3 100644 --- a/packages/frontend/src/pages/settings/mute-block.vue +++ b/packages/frontend/src/pages/settings/mute-block.vue @@ -24,7 +24,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- + @@ -52,7 +52,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- + @@ -82,7 +82,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- + diff --git a/packages/frontend/src/pages/user-info.vue b/packages/frontend/src/pages/user-info.vue deleted file mode 100644 index 35cd116fad..0000000000 --- a/packages/frontend/src/pages/user-info.vue +++ /dev/null @@ -1,625 +0,0 @@ - - - - - - - - - diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index 0876e533d0..2e4494814a 100644 --- a/packages/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -42,10 +42,6 @@ export const routes = [{ }, { path: '/clips/:clipId', component: page(() => import('./pages/clip.vue')), -}, { - path: '/user-info/:userId', - component: page(() => import('./pages/user-info.vue')), - hash: 'initialTab', }, { path: '/instance-info/:host', component: page(() => import('./pages/instance-info.vue')), @@ -334,6 +330,9 @@ export const routes = [{ }, { path: '/registry', component: page(() => import('./pages/registry.vue')), +}, { + path: '/admin/user/:userId', + component: iAmModerator ? page(() => import('./pages/admin-user.vue')) : page(() => import('./pages/not-found.vue')), }, { path: '/admin/file/:fileId', component: iAmModerator ? page(() => import('./pages/admin-file.vue')) : page(() => import('./pages/not-found.vue')), diff --git a/packages/frontend/src/scripts/get-user-menu.ts b/packages/frontend/src/scripts/get-user-menu.ts index 69a6f75c12..b9c726e134 100644 --- a/packages/frontend/src/scripts/get-user-menu.ts +++ b/packages/frontend/src/scripts/get-user-menu.ts @@ -133,13 +133,13 @@ export function getUserMenu(user: misskey.entities.UserDetailed, router: Router action: () => { copyToClipboard(`@${user.username}@${user.host ?? host}`); }, - }, { - icon: 'ti ti-info-circle', - text: i18n.ts.info, + }, ...(iAmModerator ? [{ + icon: 'ti ti-user-exclamation', + text: i18n.ts.moderation, action: () => { - router.push(`/user-info/${user.id}`); + router.push(`/admin/user/${user.id}`); }, - }, { + }] : []), { icon: 'ti ti-rss', text: i18n.ts.copyRSS, action: () => { diff --git a/packages/frontend/src/scripts/lookup-user.ts b/packages/frontend/src/scripts/lookup-user.ts index 83d7914fb1..75899adbaa 100644 --- a/packages/frontend/src/scripts/lookup-user.ts +++ b/packages/frontend/src/scripts/lookup-user.ts @@ -14,7 +14,7 @@ export async function lookupUser() { if (canceled) return; const show = (user) => { - os.pageWindow(`/user-info/${user.id}`); + os.pageWindow(`/admin/user/${user.id}`); }; const usernamePromise = os.api('users/show', Acct.parse(result)); -- cgit v1.2.3-freya From ab58b651f79e182c20a238f9c07f0c0006a58599 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sun, 13 Aug 2023 14:22:57 +0200 Subject: fix(frontend/scroll): no callback for disconnected elements (#11714) * fix(frontend/scroll): no callback for disconnected elements * Update CHANGELOG.md --- CHANGELOG.md | 5 +-- packages/frontend/src/scripts/scroll.ts | 4 +-- packages/frontend/test/scroll.test.ts | 64 +++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 packages/frontend/test/scroll.test.ts (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index ba9fb8cbcd..12796b00f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,12 +30,13 @@ - Fix: サーバー情報画面(`/instance-info/{domain}`)でブロックができないのを修正 - Fix: 未読のお知らせの「わかった」をクリック・タップしてもその場で「わかった」が消えない問題を修正 - Fix: iOSで画面を回転させるとテキストサイズが変わる問題を修正 +- Fix: タイムラインを下にスクロールしてノート画面に移動して再び戻ったら以前のスクロール位置を失う問題を修正 ### Server - cacheRemoteFilesの初期値はfalseになりました -- 一部のfeatured noteを照会できない問題を修正 - ファイルアップロード時等にファイル名の拡張子を修正する関数(correctFilename)の挙動を改善 -- fix: muteがapiからのuser list timeline取得で機能しない問題を修正 +- Fix: 一部のfeatured noteを照会できない問題を修正 +- Fix: muteがapiからのuser list timeline取得で機能しない問題を修正 ## 13.14.2 diff --git a/packages/frontend/src/scripts/scroll.ts b/packages/frontend/src/scripts/scroll.ts index b2b2c41dcf..7338de62b6 100644 --- a/packages/frontend/src/scripts/scroll.ts +++ b/packages/frontend/src/scripts/scroll.ts @@ -30,7 +30,7 @@ export function getScrollPosition(el: HTMLElement | null): number { export function onScrollTop(el: HTMLElement, cb: () => unknown, tolerance = 1, once = false) { // とりあえず評価してみる - if (isTopVisible(el)) { + if (el.isConnected && isTopVisible(el)) { cb(); if (once) return null; } @@ -54,7 +54,7 @@ export function onScrollBottom(el: HTMLElement, cb: () => unknown, tolerance = 1 const container = getScrollContainer(el); // とりあえず評価してみる - if (isBottomVisible(el, tolerance, container)) { + if (el.isConnected && isBottomVisible(el, tolerance, container)) { cb(); if (once) return null; } diff --git a/packages/frontend/test/scroll.test.ts b/packages/frontend/test/scroll.test.ts new file mode 100644 index 0000000000..3fa740b11c --- /dev/null +++ b/packages/frontend/test/scroll.test.ts @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { describe, test, assert, afterEach } from 'vitest'; +import { Window } from 'happy-dom'; +import { onScrollBottom, onScrollTop } from '@/scripts/scroll'; + +describe('Scroll', () => { + describe('onScrollTop', () => { + test('Initial onScrollTop callback for connected elements', () => { + const { document } = new Window(); + const div = document.createElement('div'); + assert.strictEqual(div.scrollTop, 0); + + document.body.append(div); + + let called = false; + onScrollTop(div as any as HTMLElement, () => called = true); + + assert.ok(called); + }); + + test('No onScrollTop callback for disconnected elements', () => { + const { document } = new Window(); + const div = document.createElement('div'); + assert.strictEqual(div.scrollTop, 0); + + let called = false; + onScrollTop(div as any as HTMLElement, () => called = true); + + assert.ok(!called); + }); + }); + + describe('onScrollBottom', () => { + test('Initial onScrollBottom callback for connected elements', () => { + const { document } = new Window(); + const div = document.createElement('div'); + assert.strictEqual(div.scrollTop, 0); + (div as any).scrollHeight = 100; // happy-dom has no scrollHeight + + document.body.append(div); + + let called = false; + onScrollBottom(div as any as HTMLElement, () => called = true); + + assert.ok(called); + }); + + test('No onScrollBottom callback for disconnected elements', () => { + const { document } = new Window(); + const div = document.createElement('div'); + assert.strictEqual(div.scrollTop, 0); + (div as any).scrollHeight = 100; // happy-dom has no scrollHeight + + let called = false; + onScrollBottom(div as any as HTMLElement, () => called = true); + + assert.ok(!called); + }); + }); +}); -- cgit v1.2.3-freya From bf6158ca719b3ac23fdbe44a6579d289e979a387 Mon Sep 17 00:00:00 2001 From: Hexirp Date: Sun, 20 Aug 2023 17:54:11 +0900 Subject: fix(frontend): "メッセージを送信" の初期テキストを修正する (#11721) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(frontend): "メッセージを送信" の初期テキストを あるサーバー A にいるとする。他のサーバー B のユーザー X へ 「メッセージを送信」しようとしたとする。その時に出てくる投稿 フォームには X へのメンションが最初から入っている。 しかし、そのメンションには B の情報が入っておらず、 A の 同名ユーザー X へのメンションとなってしまっている。 See https://github.com/misskey-dev/misskey/issues/11716 * Update CHANGELOG.md --- CHANGELOG.md | 1 + packages/frontend/src/scripts/get-user-menu.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index 2782dcf450..a7539e2624 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ - Fix: word mute for sub note is not applied - Fix: タイムラインを下にスクロールしてノート画面に移動して再び戻ったら以前のスクロール位置を失う問題を修正 - Fix: Misskeyプラグインをインストールする際のAiScriptバージョンのチェックが0.14.0以降に対応していない問題を修正 +- Fix: 他のサーバーのユーザーへ「メッセージを送信」した時の初期テキストのメンションが間違っている問題を修正 ### Server - Fix: ノート検索 `notes/search` にてhostを指定した際に検索結果に反映されるように diff --git a/packages/frontend/src/scripts/get-user-menu.ts b/packages/frontend/src/scripts/get-user-menu.ts index b9c726e134..314358e58a 100644 --- a/packages/frontend/src/scripts/get-user-menu.ts +++ b/packages/frontend/src/scripts/get-user-menu.ts @@ -156,7 +156,8 @@ export function getUserMenu(user: misskey.entities.UserDetailed, router: Router icon: 'ti ti-mail', text: i18n.ts.sendMessage, action: () => { - os.post({ specified: user, initialText: `@${user.username} ` }); + const canonical = user.host === null ? `@${user.username}` : `@${user.username}@${user.host}`; + os.post({ specified: user, initialText: `${canonical} ` }); }, }, null, { icon: 'ti ti-pencil', -- cgit v1.2.3-freya From 8038049068c3841844e93623baf54960627aafbe Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 21 Aug 2023 11:53:06 +0900 Subject: enhance(frontend/aiscript): 現在の設定言語を取得できるように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolvve #11750 --- CHANGELOG.md | 1 + packages/frontend/src/scripts/aiscript/api.ts | 2 ++ 2 files changed, 3 insertions(+) (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index a7539e2624..ed6c7c7778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ - Enhance: ユーザーメニューでスイッチでユーザーリストに追加・削除できるように - Enhance: 自分が押したリアクションのデザインを改善 - Enhance: ノート検索にローカルのみ検索可能なオプションの追加 +- Enhance: AiScriptで`LOCALE`として現在の設定言語を取得できるように - Fix: サーバー情報画面(`/instance-info/{domain}`)でブロックができないのを修正 - Fix: 未読のお知らせの「わかった」をクリック・タップしてもその場で「わかった」が消えない問題を修正 - Fix: iOSで画面を回転させるとテキストサイズが変わる問題を修正 diff --git a/packages/frontend/src/scripts/aiscript/api.ts b/packages/frontend/src/scripts/aiscript/api.ts index f69c631198..8dd3b665a5 100644 --- a/packages/frontend/src/scripts/aiscript/api.ts +++ b/packages/frontend/src/scripts/aiscript/api.ts @@ -8,6 +8,7 @@ import * as os from '@/os'; import { $i } from '@/account'; import { miLocalStorage } from '@/local-storage'; import { customEmojis } from '@/custom-emojis'; +import { lang } from '@/config'; export function createAiScriptEnv(opts) { let apiRequests = 0; @@ -16,6 +17,7 @@ export function createAiScriptEnv(opts) { USER_NAME: $i ? values.STR($i.name) : values.NULL, USER_USERNAME: $i ? values.STR($i.username) : values.NULL, CUSTOM_EMOJIS: utils.jsToVal(customEmojis.value), + LOCALE: values.STR(lang), 'Mk:dialog': values.FN_NATIVE(async ([title, text, type]) => { await os.alert({ type: type ? type.value : 'info', -- cgit v1.2.3-freya From 724ed47e5f8cd76e1947f869f7f60f28e659979d Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 1 Sep 2023 13:21:47 +0900 Subject: enhance(frontend): AiScriptからMisskeyサーバーAPIを呼び出す際の制限を撤廃 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve #7123 --- CHANGELOG.md | 1 + packages/frontend/src/scripts/aiscript/api.ts | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e210543c3..1a379d53ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ - 絵文字ピッカーの検索の表示件数を100件に増加 - 投稿フォームのプレビューの表示状態を記憶するように - ノート詳細ページ読み込み時のパフォーマンスを改善 +- AiScriptからMisskeyサーバーAPIを呼び出す際の制限を撤廃 - Enhance: ユーザーメニューでスイッチでユーザーリストに追加・削除できるように - Enhance: 自分が押したリアクションのデザインを改善 - Enhance: ノート検索にローカルのみ検索可能なオプションの追加 diff --git a/packages/frontend/src/scripts/aiscript/api.ts b/packages/frontend/src/scripts/aiscript/api.ts index 8dd3b665a5..c3acb6d145 100644 --- a/packages/frontend/src/scripts/aiscript/api.ts +++ b/packages/frontend/src/scripts/aiscript/api.ts @@ -11,7 +11,6 @@ import { customEmojis } from '@/custom-emojis'; import { lang } from '@/config'; export function createAiScriptEnv(opts) { - let apiRequests = 0; return { USER_ID: $i ? values.STR($i.id) : values.NULL, USER_NAME: $i ? values.STR($i.name) : values.NULL, @@ -40,8 +39,6 @@ export function createAiScriptEnv(opts) { // バグがあればundefinedもあり得るため念のため if (typeof token.value !== 'string') throw new Error('invalid token'); } - apiRequests++; - if (apiRequests > 16) return values.NULL; const res = await os.api(ep.value, utils.valToJs(param), token ? token.value : (opts.token ?? null)); return utils.jsToVal(res); }), -- cgit v1.2.3-freya From 1f7a81aae71f85a47393491a7795b953e2427041 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 4 Sep 2023 13:33:38 +0900 Subject: update deps (#11764) * update deps * node16 * wip * wip * wip * Update test-utils.ts * wip * Update tsconfig.json * wip * Update package.json * wip * Update following.vue * Update followers.vue * Update index.vue * Update share.vue * Update MkUserPopup.vue * Update MkPostForm.vue * wip * Update MkTokenGenerateWindow.vue * Update MkPagination.vue * refactor * update deps * update deps * Update sw.ts * wip * wip * wip * Update FetchInstanceMetadataService.ts * Update FetchInstanceMetadataService.ts * update node * update deps * :art: --- .devcontainer/devcontainer.json | 2 +- .github/workflows/reviewer_lottery.yml | 13 - .github/workflows/storybook.yml | 112 - .node-version | 2 +- Dockerfile | 2 +- package.json | 14 +- packages/backend/package.json | 86 +- packages/backend/src/core/MetaService.ts | 2 +- .../src/core/chart/ChartManagementService.ts | 2 +- packages/backend/src/daemons/JanitorService.ts | 2 +- packages/backend/src/daemons/QueueStatsService.ts | 2 +- packages/backend/src/daemons/ServerStatsService.ts | 2 +- packages/backend/src/misc/cache.ts | 2 +- packages/backend/src/server/api/ApiCallService.ts | 2 +- .../src/server/api/stream/channels/user-list.ts | 2 +- packages/backend/src/server/api/stream/index.ts | 2 +- .../backend/src/server/web/ClientServerService.ts | 40 +- packages/backend/src/server/web/views/base.pug | 8 +- packages/backend/test/tsconfig.json | 4 +- packages/backend/test/unit/AnnouncementService.ts | 6 +- .../test/unit/FetchInstanceMetadataService.ts | 12 +- packages/backend/test/unit/RoleService.ts | 8 +- packages/backend/tsconfig.json | 7 +- packages/frontend/.storybook/preview-head.html | 2 +- packages/frontend/.storybook/tsconfig.json | 1 + packages/frontend/package.json | 100 +- packages/frontend/src/account.ts | 12 +- packages/frontend/src/cache.ts | 8 +- .../frontend/src/components/MkAccountMoved.vue | 4 +- .../frontend/src/components/MkAchievements.vue | 4 +- .../src/components/MkAnnouncementDialog.vue | 4 +- packages/frontend/src/components/MkAvatars.vue | 6 +- .../frontend/src/components/MkCropperDialog.vue | 8 +- packages/frontend/src/components/MkCwButton.vue | 4 +- .../frontend/src/components/MkFileListForAdmin.vue | 4 +- .../frontend/src/components/MkFlashPreview.vue | 2 +- .../src/components/MkGalleryPostPreview.vue | 4 +- .../frontend/src/components/MkInstanceCardMini.vue | 4 +- packages/frontend/src/components/MkInviteCode.vue | 4 +- packages/frontend/src/components/MkMediaBanner.vue | 4 +- packages/frontend/src/components/MkMediaImage.vue | 4 +- packages/frontend/src/components/MkMediaList.vue | 6 +- packages/frontend/src/components/MkMediaVideo.vue | 4 +- packages/frontend/src/components/MkNote.vue | 8 +- .../frontend/src/components/MkNoteDetailed.vue | 10 +- packages/frontend/src/components/MkNoteHeader.vue | 4 +- packages/frontend/src/components/MkNoteSimple.vue | 4 +- packages/frontend/src/components/MkNoteSub.vue | 6 +- .../frontend/src/components/MkNotification.vue | 4 +- packages/frontend/src/components/MkPagePreview.vue | 4 +- packages/frontend/src/components/MkPagination.vue | 6 +- packages/frontend/src/components/MkPoll.vue | 4 +- packages/frontend/src/components/MkPostForm.vue | 33 +- .../frontend/src/components/MkPostFormAttaches.vue | 12 +- .../frontend/src/components/MkPostFormDialog.vue | 18 +- .../src/components/MkReactedUsersDialog.vue | 6 +- .../src/components/MkReactionsViewer.reaction.vue | 4 +- .../frontend/src/components/MkReactionsViewer.vue | 4 +- .../src/components/MkRenotedUsersDialog.vue | 6 +- .../frontend/src/components/MkSubNoteContent.vue | 4 +- .../src/components/MkTokenGenerateWindow.vue | 4 +- .../components/MkUserAnnouncementEditDialog.vue | 4 +- .../frontend/src/components/MkUserCardMini.vue | 4 +- packages/frontend/src/components/MkUserInfo.vue | 4 +- .../src/components/MkUserOnlineIndicator.vue | 4 +- packages/frontend/src/components/MkUserPopup.vue | 7 +- .../frontend/src/components/MkUserSelectDialog.vue | 10 +- .../src/components/MkUserSetupDialog.User.vue | 4 +- .../frontend/src/components/MkVisibilityPicker.vue | 8 +- .../frontend/src/components/MkVisitorDashboard.vue | 4 +- packages/frontend/src/components/global/MkAcct.vue | 4 +- .../frontend/src/components/global/MkAvatar.vue | 4 +- .../frontend/src/components/global/MkUserName.vue | 4 +- packages/frontend/src/filters/user.ts | 8 +- packages/frontend/src/os.ts | 3 +- packages/frontend/src/pages/_error_.vue | 4 +- packages/frontend/src/pages/admin-user.vue | 4 +- packages/frontend/src/pages/auth.form.vue | 5 +- packages/frontend/src/pages/auth.vue | 4 +- packages/frontend/src/pages/clip.vue | 4 +- packages/frontend/src/pages/emoji-edit-dialog.vue | 4 +- packages/frontend/src/pages/follow.vue | 4 +- packages/frontend/src/pages/instance-info.vue | 6 +- packages/frontend/src/pages/invite.vue | 4 +- packages/frontend/src/pages/my-antennas/editor.vue | 4 +- packages/frontend/src/pages/my-lists/list.vue | 6 +- packages/frontend/src/pages/note.vue | 4 +- .../frontend/src/pages/settings/2fa.qrdialog.vue | 2 +- packages/frontend/src/pages/settings/2fa.vue | 1 + packages/frontend/src/pages/settings/migration.vue | 7 +- packages/frontend/src/pages/share.vue | 8 +- packages/frontend/src/pages/user/achievements.vue | 4 +- .../frontend/src/pages/user/activity.following.vue | 4 +- .../frontend/src/pages/user/activity.heatmap.vue | 4 +- .../frontend/src/pages/user/activity.notes.vue | 4 +- packages/frontend/src/pages/user/activity.pv.vue | 4 +- packages/frontend/src/pages/user/activity.vue | 4 +- packages/frontend/src/pages/user/clips.vue | 4 +- packages/frontend/src/pages/user/flashs.vue | 4 +- packages/frontend/src/pages/user/follow-list.vue | 4 +- packages/frontend/src/pages/user/followers.vue | 7 +- packages/frontend/src/pages/user/following.vue | 7 +- packages/frontend/src/pages/user/gallery.vue | 4 +- packages/frontend/src/pages/user/home.vue | 4 +- .../frontend/src/pages/user/index.activity.vue | 4 +- packages/frontend/src/pages/user/index.photos.vue | 10 +- .../frontend/src/pages/user/index.timeline.vue | 4 +- packages/frontend/src/pages/user/index.vue | 7 +- packages/frontend/src/pages/user/lists.vue | 4 +- packages/frontend/src/pages/user/pages.vue | 4 +- packages/frontend/src/pages/user/reactions.vue | 4 +- packages/frontend/src/pages/welcome.entrance.a.vue | 4 +- packages/frontend/src/pages/welcome.timeline.vue | 4 +- packages/frontend/src/scripts/collapsed.ts | 4 +- packages/frontend/src/scripts/gen-search-query.ts | 4 +- packages/frontend/src/scripts/get-note-menu.ts | 14 +- packages/frontend/src/scripts/get-note-summary.ts | 4 +- packages/frontend/src/scripts/get-user-menu.ts | 4 +- packages/frontend/src/scripts/isFfVisibleForMe.ts | 4 +- packages/frontend/src/scripts/lookup-user.ts | 4 +- packages/frontend/src/scripts/page-metadata.ts | 6 +- packages/frontend/src/scripts/select-file.ts | 14 +- packages/frontend/src/scripts/test-utils.ts | 2 - packages/frontend/src/scripts/use-note-capture.ts | 4 +- packages/frontend/src/store.ts | 10 +- packages/frontend/src/ui/_common_/common.vue | 4 +- packages/frontend/src/ui/_common_/notification.vue | 4 +- .../src/ui/_common_/statusbar-federation.vue | 4 +- .../src/ui/_common_/statusbar-user-list.vue | 4 +- packages/frontend/src/ui/deck/channel-column.vue | 4 +- packages/frontend/test/home.test.ts | 4 +- packages/frontend/test/note.test.ts | 4 +- packages/frontend/test/tsconfig.json | 4 +- packages/frontend/tsconfig.json | 11 +- packages/misskey-js/etc/misskey-js.api.md | 15 + packages/misskey-js/package.json | 24 +- packages/misskey-js/src/index.ts | 3 +- packages/misskey-js/tsconfig.json | 6 +- packages/sw/package.json | 10 +- packages/sw/src/sw.ts | 6 +- packages/sw/tsconfig.json | 8 +- pnpm-lock.yaml | 7737 +++++++++----------- 142 files changed, 4157 insertions(+), 4679 deletions(-) delete mode 100644 .github/workflows/reviewer_lottery.yml delete mode 100644 .github/workflows/storybook.yml (limited to 'packages/frontend/src/scripts') diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0eee9d503c..861b0008a0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -6,7 +6,7 @@ "features": { "ghcr.io/devcontainers-contrib/features/pnpm:2": {}, "ghcr.io/devcontainers/features/node:1": { - "version": "20.5.0" + "version": "20.5.1" } }, "forwardPorts": [3000], diff --git a/.github/workflows/reviewer_lottery.yml b/.github/workflows/reviewer_lottery.yml deleted file mode 100644 index f281e6c3a1..0000000000 --- a/.github/workflows/reviewer_lottery.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: "Reviewer lottery" -on: - pull_request_target: - types: [opened, ready_for_review, reopened] - -jobs: - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3.6.0 - - uses: uesteibar/reviewer-lottery@v3 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml deleted file mode 100644 index 8ab6d204bf..0000000000 --- a/.github/workflows/storybook.yml +++ /dev/null @@ -1,112 +0,0 @@ -name: Storybook - -on: - push: - branches: - - master - - develop - pull_request_target: - -jobs: - build: - runs-on: ubuntu-latest - - env: - NODE_OPTIONS: "--max_old_space_size=7168" - - steps: - - uses: actions/checkout@v3.6.0 - if: github.event_name != 'pull_request_target' - with: - fetch-depth: 0 - submodules: true - - uses: actions/checkout@v3.6.0 - if: github.event_name == 'pull_request_target' - with: - fetch-depth: 0 - submodules: true - ref: "refs/pull/${{ github.event.number }}/merge" - - name: Checkout actual HEAD - if: github.event_name == 'pull_request_target' - id: rev - run: | - echo "base=$(git rev-list --parents -n1 HEAD | cut -d" " -f2)" >> $GITHUB_OUTPUT - git checkout $(git rev-list --parents -n1 HEAD | cut -d" " -f3) - - name: Install pnpm - uses: pnpm/action-setup@v2 - with: - version: 8 - run_install: false - - name: Use Node.js 20.x - uses: actions/setup-node@v3.8.1 - with: - node-version-file: '.node-version' - cache: 'pnpm' - - run: corepack enable - - run: pnpm i --frozen-lockfile - - name: Check pnpm-lock.yaml - run: git diff --exit-code pnpm-lock.yaml - - name: Build misskey-js - run: pnpm --filter misskey-js build - - name: Build storybook - run: pnpm --filter frontend build-storybook - - name: Publish to Chromatic - if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/master' - run: pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static - env: - CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} - - name: Publish to Chromatic - if: github.event_name != 'pull_request_target' && github.ref != 'refs/heads/master' - id: chromatic_push - run: | - DIFF="${{ github.event.before }} HEAD" - if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then - DIFF="HEAD" - fi - CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff-tree --no-commit-id --name-only -r $(echo "$DIFF") | xargs))" - if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then - echo "skip=true" >> $GITHUB_OUTPUT - fi - if pnpm --filter frontend chromatic -d storybook-static $(echo "$CHROMATIC_PARAMETER"); then - echo "success=true" >> $GITHUB_OUTPUT - else - echo "success=false" >> $GITHUB_OUTPUT - fi - env: - CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} - - name: Publish to Chromatic - if: github.event_name == 'pull_request_target' - id: chromatic_pull_request - run: | - DIFF="${{ steps.rev.outputs.base }} HEAD" - if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then - DIFF="HEAD" - fi - CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff-tree --no-commit-id --name-only -r $(echo "$DIFF") | xargs))" - if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then - echo "skip=true" >> $GITHUB_OUTPUT - fi - BRANCH="${{ github.event.pull_request.head.user.login }}:${{ github.event.pull_request.head.ref }}" - if [ "$BRANCH" = "misskey-dev:${{ github.event.pull_request.head.ref }}" ]; then - BRANCH="${{ github.event.pull_request.head.ref }}" - fi - pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static --branch-name $BRANCH $(echo "$CHROMATIC_PARAMETER") - env: - CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} - - name: Notify that Chromatic detects changes - uses: actions/github-script@v6.4.0 - if: github.event_name != 'pull_request_target' && steps.chromatic_push.outputs.success == 'false' - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - github.rest.repos.createCommitComment({ - owner: context.repo.owner, - repo: context.repo.repo, - commit_sha: context.sha, - body: 'Chromatic detects changes. Please [review the changes on Chromatic](https://www.chromatic.com/builds?appId=6428f7d7b962f0b79f97d6e4).' - }) - - name: Upload Artifacts - uses: actions/upload-artifact@v3 - with: - name: storybook - path: packages/frontend/storybook-static diff --git a/.node-version b/.node-version index 6a148f2818..7cc2069986 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -20.5.0 +20.5.1 diff --git a/Dockerfile b/Dockerfile index ce9d740ab6..678b991e81 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # syntax = docker/dockerfile:1.4 -ARG NODE_VERSION=20.5.0-bullseye +ARG NODE_VERSION=20.5.1-bullseye # build assets & compile TypeScript diff --git a/package.json b/package.json index 1c6d089e93..ff9a3ce738 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "git", "url": "https://github.com/misskey-dev/misskey.git" }, - "packageManager": "pnpm@8.6.10", + "packageManager": "pnpm@8.7.1", "workspaces": [ "packages/frontend", "packages/backend", @@ -44,23 +44,23 @@ "lodash": "4.17.21" }, "dependencies": { - "execa": "7.2.0", + "execa": "8.0.1", "gulp": "4.0.2", "gulp-cssnano": "2.1.3", "gulp-rename": "2.0.0", "gulp-replace": "1.1.4", "gulp-terser": "2.1.0", "js-yaml": "4.1.0", - "typescript": "5.1.6" + "typescript": "5.2.2" }, "devDependencies": { "@types/gulp": "4.0.13", "@types/gulp-rename": "2.0.2", - "@typescript-eslint/eslint-plugin": "6.2.0", - "@typescript-eslint/parser": "6.2.0", + "@typescript-eslint/eslint-plugin": "6.5.0", + "@typescript-eslint/parser": "6.5.0", "cross-env": "7.0.3", - "cypress": "12.17.2", - "eslint": "8.46.0", + "cypress": "13.1.0", + "eslint": "8.48.0", "start-server-and-test": "2.0.0" }, "optionalDependencies": { diff --git a/packages/backend/package.json b/packages/backend/package.json index 8c5b67ced6..e3611bec20 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -56,36 +56,36 @@ "utf-8-validate": "^6.0.3" }, "dependencies": { - "@aws-sdk/client-s3": "3.367.0", - "@aws-sdk/lib-storage": "3.367.0", - "@aws-sdk/node-http-handler": "3.360.0", - "@bull-board/api": "5.7.1", - "@bull-board/fastify": "5.7.1", - "@bull-board/ui": "5.7.1", + "@aws-sdk/client-s3": "3.400.0", + "@aws-sdk/lib-storage": "3.400.0", + "@aws-sdk/node-http-handler": "3.374.0", + "@bull-board/api": "5.8.0", + "@bull-board/fastify": "5.8.0", + "@bull-board/ui": "5.8.0", "@discordapp/twemoji": "14.1.2", "@fastify/accepts": "4.2.0", - "@fastify/cookie": "8.3.0", + "@fastify/cookie": "9.0.4", "@fastify/cors": "8.3.0", "@fastify/express": "2.3.0", "@fastify/http-proxy": "9.2.1", "@fastify/multipart": "7.7.3", - "@fastify/static": "6.10.2", + "@fastify/static": "6.11.0", "@fastify/view": "8.0.0", - "@nestjs/common": "10.1.2", - "@nestjs/core": "10.1.2", - "@nestjs/testing": "10.1.2", + "@nestjs/common": "10.2.4", + "@nestjs/core": "10.2.4", + "@nestjs/testing": "10.2.4", "@peertube/http-signature": "1.7.0", - "@sinonjs/fake-timers": "10.3.0", + "@sinonjs/fake-timers": "11.1.0", "@swc/cli": "0.1.62", - "@swc/core": "1.3.72", + "@swc/core": "1.3.82", "accepts": "1.3.8", "ajv": "8.12.0", - "archiver": "5.3.1", - "async-mutex": "^0.4.0", + "archiver": "6.0.0", + "async-mutex": "0.4.0", "bcryptjs": "2.4.3", "blurhash": "2.0.5", "body-parser": "1.20.2", - "bullmq": "4.6.3", + "bullmq": "4.8.0", "cacheable-lookup": "7.0.0", "cbor": "9.0.1", "chalk": "5.3.0", @@ -96,7 +96,7 @@ "content-disposition": "0.5.4", "date-fns": "2.30.0", "deep-email-validator": "0.1.21", - "fastify": "4.21.0", + "fastify": "4.22.2", "feed": "4.2.2", "file-type": "18.5.0", "fluent-ffmpeg": "2.1.2", @@ -112,9 +112,9 @@ "js-yaml": "4.1.0", "jsdom": "22.1.0", "json5": "2.2.3", - "jsonld": "8.2.0", + "jsonld": "8.2.1", "jsrsasign": "10.8.6", - "meilisearch": "0.33.0", + "meilisearch": "0.34.1", "mfm-js": "0.23.3", "microformats-parser": "1.4.1", "mime-types": "2.1.35", @@ -130,7 +130,7 @@ "os-utils": "0.0.14", "otpauth": "9.1.4", "parse5": "7.1.2", - "pg": "8.11.1", + "pg": "8.11.3", "pkce-challenge": "4.0.1", "probe-image-size": "7.2.3", "promise-limit": "2.7.0", @@ -140,84 +140,84 @@ "qrcode": "1.5.3", "random-seed": "0.3.0", "ratelimiter": "3.4.1", - "re2": "1.20.1", + "re2": "1.20.3", "redis-lock": "0.1.4", "reflect-metadata": "0.1.13", "rename": "1.0.4", "rss-parser": "3.13.0", "rxjs": "7.8.1", "sanitize-html": "2.11.0", - "sharp": "0.32.4", + "sharp": "0.32.5", "sharp-read-bmp": "github:misskey-dev/sharp-read-bmp", "slacc": "0.0.10", "strict-event-emitter-types": "2.0.0", "stringz": "2.1.0", "summaly": "github:misskey-dev/summaly", - "systeminformation": "5.18.9", + "systeminformation": "5.21.4", "tinycolor2": "1.6.0", "tmp": "0.2.1", "tsc-alias": "1.8.7", "tsconfig-paths": "4.2.0", "twemoji-parser": "14.0.0", "typeorm": "0.3.17", - "typescript": "5.1.6", + "typescript": "5.2.2", "ulid": "2.3.0", "vary": "1.1.2", - "web-push": "3.6.4", + "web-push": "3.6.5", "ws": "8.13.0", "xev": "3.0.2" }, "devDependencies": { - "@jest/globals": "29.6.2", - "@swc/jest": "0.2.27", + "@jest/globals": "29.6.4", + "@swc/jest": "0.2.29", "@types/accepts": "1.3.5", "@types/archiver": "5.3.2", - "@types/bcryptjs": "2.4.2", + "@types/bcryptjs": "2.4.3", "@types/body-parser": "1.19.2", "@types/cbor": "6.0.0", "@types/color-convert": "2.0.0", "@types/content-disposition": "0.5.5", "@types/fluent-ffmpeg": "2.1.21", "@types/http-link-header": "1.0.3", - "@types/jest": "29.5.3", + "@types/jest": "29.5.4", "@types/js-yaml": "4.0.5", - "@types/jsdom": "21.1.1", + "@types/jsdom": "21.1.2", "@types/jsonld": "1.5.9", "@types/jsrsasign": "10.5.8", "@types/mime-types": "2.1.1", "@types/ms": "0.7.31", - "@types/node": "20.4.5", + "@types/node": "20.5.9", "@types/node-fetch": "3.0.3", "@types/nodemailer": "6.4.9", - "@types/oauth": "0.9.1", - "@types/oauth2orize": "1.11.0", + "@types/oauth": "0.9.2", + "@types/oauth2orize": "1.11.1", "@types/oauth2orize-pkce": "0.1.0", "@types/pg": "8.10.2", "@types/pug": "2.0.6", "@types/punycode": "2.1.0", - "@types/qrcode": "1.5.1", + "@types/qrcode": "1.5.2", "@types/random-seed": "0.3.3", "@types/ratelimiter": "3.4.4", "@types/rename": "1.0.4", "@types/sanitize-html": "2.9.0", - "@types/semver": "7.5.0", + "@types/semver": "7.5.1", "@types/sharp": "0.32.0", "@types/simple-oauth2": "5.0.4", "@types/sinonjs__fake-timers": "8.1.2", "@types/tinycolor2": "1.4.3", "@types/tmp": "0.2.3", "@types/vary": "1.1.0", - "@types/web-push": "3.3.2", + "@types/web-push": "3.6.0", "@types/ws": "8.5.5", - "@typescript-eslint/eslint-plugin": "6.2.0", - "@typescript-eslint/parser": "6.2.0", + "@typescript-eslint/eslint-plugin": "6.5.0", + "@typescript-eslint/parser": "6.5.0", "aws-sdk-client-mock": "3.0.0", "cross-env": "7.0.3", - "eslint": "8.46.0", - "eslint-plugin-import": "2.28.0", - "execa": "7.2.0", - "jest": "29.6.2", - "jest-mock": "29.6.2", + "eslint": "8.48.0", + "eslint-plugin-import": "2.28.1", + "execa": "8.0.1", + "jest": "29.6.4", + "jest-mock": "29.6.3", "simple-oauth2": "5.0.0" } } diff --git a/packages/backend/src/core/MetaService.ts b/packages/backend/src/core/MetaService.ts index f9619861bb..42ce4de432 100644 --- a/packages/backend/src/core/MetaService.ts +++ b/packages/backend/src/core/MetaService.ts @@ -16,7 +16,7 @@ import type { OnApplicationShutdown } from '@nestjs/common'; @Injectable() export class MetaService implements OnApplicationShutdown { private cache: MiMeta | undefined; - private intervalId: NodeJS.Timer; + private intervalId: NodeJS.Timeout; constructor( @Inject(DI.redisForSub) diff --git a/packages/backend/src/core/chart/ChartManagementService.ts b/packages/backend/src/core/chart/ChartManagementService.ts index 6b626d3980..f751a68cb4 100644 --- a/packages/backend/src/core/chart/ChartManagementService.ts +++ b/packages/backend/src/core/chart/ChartManagementService.ts @@ -23,7 +23,7 @@ import type { OnApplicationShutdown } from '@nestjs/common'; @Injectable() export class ChartManagementService implements OnApplicationShutdown { private charts; - private saveIntervalId: NodeJS.Timer; + private saveIntervalId: NodeJS.Timeout; constructor( private federationChart: FederationChart, diff --git a/packages/backend/src/daemons/JanitorService.ts b/packages/backend/src/daemons/JanitorService.ts index 6f5e5a7f3b..63c44e874f 100644 --- a/packages/backend/src/daemons/JanitorService.ts +++ b/packages/backend/src/daemons/JanitorService.ts @@ -14,7 +14,7 @@ const interval = 30 * 60 * 1000; @Injectable() export class JanitorService implements OnApplicationShutdown { - private intervalId: NodeJS.Timer; + private intervalId: NodeJS.Timeout; constructor( @Inject(DI.attestationChallengesRepository) diff --git a/packages/backend/src/daemons/QueueStatsService.ts b/packages/backend/src/daemons/QueueStatsService.ts index dc9482f022..5edc0f45ab 100644 --- a/packages/backend/src/daemons/QueueStatsService.ts +++ b/packages/backend/src/daemons/QueueStatsService.ts @@ -19,7 +19,7 @@ const interval = 10000; @Injectable() export class QueueStatsService implements OnApplicationShutdown { - private intervalId: NodeJS.Timer; + private intervalId: NodeJS.Timeout; constructor( @Inject(DI.config) diff --git a/packages/backend/src/daemons/ServerStatsService.ts b/packages/backend/src/daemons/ServerStatsService.ts index 95026099e8..d294628740 100644 --- a/packages/backend/src/daemons/ServerStatsService.ts +++ b/packages/backend/src/daemons/ServerStatsService.ts @@ -20,7 +20,7 @@ const round = (num: number) => Math.round(num * 10) / 10; @Injectable() export class ServerStatsService implements OnApplicationShutdown { - private intervalId: NodeJS.Timer | null = null; + private intervalId: NodeJS.Timeout | null = null; constructor( private metaService: MetaService, diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts index 046d4d6c2f..c235871931 100644 --- a/packages/backend/src/misc/cache.ts +++ b/packages/backend/src/misc/cache.ts @@ -193,7 +193,7 @@ function nothingToDo(value: T): V { export class MemoryKVCache { public cache: Map; private lifetime: number; - private gcIntervalHandle: NodeJS.Timer; + private gcIntervalHandle: NodeJS.Timeout; private toMapConverter: (value: T) => V; private fromMapConverter: (cached: V) => T | undefined; diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts index 5d5a8f3706..b90c8a5199 100644 --- a/packages/backend/src/server/api/ApiCallService.ts +++ b/packages/backend/src/server/api/ApiCallService.ts @@ -35,7 +35,7 @@ const accessDenied = { export class ApiCallService implements OnApplicationShutdown { private logger: Logger; private userIpHistories: Map>; - private userIpHistoriesClearIntervalId: NodeJS.Timer; + private userIpHistoriesClearIntervalId: NodeJS.Timeout; constructor( @Inject(DI.userIpsRepository) diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts index 557b934722..f7001e41cd 100644 --- a/packages/backend/src/server/api/stream/channels/user-list.ts +++ b/packages/backend/src/server/api/stream/channels/user-list.ts @@ -19,7 +19,7 @@ class UserListChannel extends Channel { public static requireCredential = false; private listId: string; public listUsers: MiUser['id'][] = []; - private listUsersClock: NodeJS.Timer; + private listUsersClock: NodeJS.Timeout; constructor( private userListsRepository: UserListsRepository, diff --git a/packages/backend/src/server/api/stream/index.ts b/packages/backend/src/server/api/stream/index.ts index 181aa5e2a3..232ec5700d 100644 --- a/packages/backend/src/server/api/stream/index.ts +++ b/packages/backend/src/server/api/stream/index.ts @@ -35,7 +35,7 @@ export default class Connection { public userIdsWhoMeMuting: Set = new Set(); public userIdsWhoBlockingMe: Set = new Set(); public userIdsWhoMeMutingRenotes: Set = new Set(); - private fetchIntervalId: NodeJS.Timer | null = null; + private fetchIntervalId: NodeJS.Timeout | null = null; constructor( private channelsService: ChannelsService, diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index 56aa343632..75f305be5a 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -37,7 +37,6 @@ import { deepClone } from '@/misc/clone.js'; import { bindThis } from '@/decorators.js'; import { FlashEntityService } from '@/core/entities/FlashEntityService.js'; import { RoleService } from '@/core/RoleService.js'; -import manifest from './manifest.json' assert { type: 'json' }; import { FeedService } from './FeedService.js'; import { UrlPreviewService } from './UrlPreviewService.js'; import { ClientLoggerService } from './ClientLoggerService.js'; @@ -52,6 +51,45 @@ const assets = `${_dirname}/../../../../../built/_frontend_dist_/`; const swAssets = `${_dirname}/../../../../../built/_sw_dist_/`; const viteOut = `${_dirname}/../../../../../built/_vite_/`; +const manifest = { + 'short_name': 'Misskey', + 'name': 'Misskey', + 'start_url': '/', + 'display': 'standalone', + 'background_color': '#313a42', + 'theme_color': '#86b300', + 'icons': [ + { + 'src': '/static-assets/icons/192.png', + 'sizes': '192x192', + 'type': 'image/png', + 'purpose': 'maskable', + }, + { + 'src': '/static-assets/icons/512.png', + 'sizes': '512x512', + 'type': 'image/png', + 'purpose': 'maskable', + }, + { + 'src': '/static-assets/splash.png', + 'sizes': '300x300', + 'type': 'image/png', + 'purpose': 'any', + }, + ], + 'share_target': { + 'action': '/share/', + 'method': 'GET', + 'enctype': 'application/x-www-form-urlencoded', + 'params': { + 'title': 'title', + 'text': 'text', + 'url': 'url', + }, + }, +}; + @Injectable() export class ClientServerService { private logger: Logger; diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug index 2b61c6bc2f..c2053517d6 100644 --- a/packages/backend/src/server/web/views/base.pug +++ b/packages/backend/src/server/web/views/base.pug @@ -7,15 +7,15 @@ doctype html // - - _____ _ _ - | |_|___ ___| |_ ___ _ _ + _____ _ _ + | |_|___ ___| |_ ___ _ _ | | | | |_ -|_ -| '_| -_| | | |_|_|_|_|___|___|_,_|___|_ | |___| Thank you for using Misskey! If you are reading this message... how about joining the development? https://github.com/misskey-dev/misskey - + html @@ -35,7 +35,7 @@ html link(rel='prefetch' href=infoImageUrl) link(rel='prefetch' href=notFoundImageUrl) //- https://github.com/misskey-dev/misskey/issues/9842 - link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.min.css?v2.25.0') + link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.min.css?v2.32.0') link(rel='modulepreload' href=`/vite/${clientEntry.file}`) if !config.clientManifestExists diff --git a/packages/backend/test/tsconfig.json b/packages/backend/test/tsconfig.json index 21afe1aaf3..4597ff8780 100644 --- a/packages/backend/test/tsconfig.json +++ b/packages/backend/test/tsconfig.json @@ -10,8 +10,8 @@ "declaration": false, "sourceMap": true, "target": "ES2022", - "module": "es2020", - "moduleResolution": "node16", + "module": "nodenext", + "moduleResolution": "nodenext", "allowSyntheticDefaultImports": true, "removeComments": false, "noLib": false, diff --git a/packages/backend/test/unit/AnnouncementService.ts b/packages/backend/test/unit/AnnouncementService.ts index c97e081ba5..f09ae3e2f4 100644 --- a/packages/backend/test/unit/AnnouncementService.ts +++ b/packages/backend/test/unit/AnnouncementService.ts @@ -10,7 +10,7 @@ import { ModuleMocker } from 'jest-mock'; import { Test } from '@nestjs/testing'; import { GlobalModule } from '@/GlobalModule.js'; import { AnnouncementService } from '@/core/AnnouncementService.js'; -import type { Announcement, AnnouncementsRepository, AnnouncementReadsRepository, UsersRepository, User } from '@/models/index.js'; +import type { MiAnnouncement, AnnouncementsRepository, AnnouncementReadsRepository, UsersRepository, MiUser } from '@/models/index.js'; import { DI } from '@/di-symbols.js'; import { genAid } from '@/misc/id/aid.js'; import { CacheService } from '@/core/CacheService.js'; @@ -30,7 +30,7 @@ describe('AnnouncementService', () => { let announcementReadsRepository: AnnouncementReadsRepository; let globalEventService: jest.Mocked; - function createUser(data: Partial = {}) { + function createUser(data: Partial = {}) { const un = secureRndstr(16); return usersRepository.insert({ id: genAid(new Date()), @@ -42,7 +42,7 @@ describe('AnnouncementService', () => { .then(x => usersRepository.findOneByOrFail(x.identifiers[0])); } - function createAnnouncement(data: Partial = {}) { + function createAnnouncement(data: Partial = {}) { return announcementsRepository.insert({ id: genAid(new Date()), createdAt: new Date(), diff --git a/packages/backend/test/unit/FetchInstanceMetadataService.ts b/packages/backend/test/unit/FetchInstanceMetadataService.ts index 22ce023216..34200899d4 100644 --- a/packages/backend/test/unit/FetchInstanceMetadataService.ts +++ b/packages/backend/test/unit/FetchInstanceMetadataService.ts @@ -6,7 +6,6 @@ process.env.NODE_ENV = 'test'; import { jest } from '@jest/globals'; -import { ModuleMocker } from 'jest-mock'; import { Test } from '@nestjs/testing'; import { Redis } from 'ioredis'; import { GlobalModule } from '@/GlobalModule.js'; @@ -18,7 +17,6 @@ import { UtilityService } from '@/core/UtilityService.js'; import { IdService } from '@/core/IdService.js'; import { DI } from '@/di-symbols.js'; import type { TestingModule } from '@nestjs/testing'; -import type { MockFunctionMetadata } from 'jest-mock'; function mockRedis() { const hash = {}; @@ -35,9 +33,9 @@ describe('FetchInstanceMetadataService', () => { let fetchInstanceMetadataService: jest.Mocked; let federatedInstanceService: jest.Mocked; let httpRequestService: jest.Mocked; - let redisClient: jest.Mocked; + let redisClient: jest.Mocked; - beforeAll(async () => { + beforeEach(async () => { app = await Test .createTestingModule({ imports: [ @@ -64,11 +62,11 @@ describe('FetchInstanceMetadataService', () => { fetchInstanceMetadataService = app.get(FetchInstanceMetadataService); federatedInstanceService = app.get(FederatedInstanceService) as jest.Mocked; - redisClient = app.get(DI.redis) as jest.Mocked; + redisClient = app.get(DI.redis) as jest.Mocked; httpRequestService = app.get(HttpRequestService) as jest.Mocked; }); - afterAll(async () => { + afterEach(async () => { await app.close(); }); @@ -85,6 +83,7 @@ describe('FetchInstanceMetadataService', () => { expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(1); expect(httpRequestService.getJson).toHaveBeenCalled(); }); + test('Lock and don\'t update', async () => { redisClient.set = mockRedis(); const now = Date.now(); @@ -98,6 +97,7 @@ describe('FetchInstanceMetadataService', () => { expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(1); expect(httpRequestService.getJson).toHaveBeenCalledTimes(0); }); + test('Do nothing when lock not acquired', async () => { redisClient.set = mockRedis(); federatedInstanceService.fetch.mockReturnValue({ infoUpdatedAt: { getTime: () => now - 10 * 1000 * 60 * 60 * 24 } }); diff --git a/packages/backend/test/unit/RoleService.ts b/packages/backend/test/unit/RoleService.ts index fc6e23382b..32a686c83a 100644 --- a/packages/backend/test/unit/RoleService.ts +++ b/packages/backend/test/unit/RoleService.ts @@ -11,7 +11,7 @@ import { Test } from '@nestjs/testing'; import * as lolex from '@sinonjs/fake-timers'; import { GlobalModule } from '@/GlobalModule.js'; import { RoleService } from '@/core/RoleService.js'; -import type { Role, RolesRepository, RoleAssignmentsRepository, UsersRepository, User } from '@/models/index.js'; +import type { MiRole, RolesRepository, RoleAssignmentsRepository, UsersRepository, MiUser } from '@/models/index.js'; import { DI } from '@/di-symbols.js'; import { MetaService } from '@/core/MetaService.js'; import { genAid } from '@/misc/id/aid.js'; @@ -34,7 +34,7 @@ describe('RoleService', () => { let metaService: jest.Mocked; let clock: lolex.InstalledClock; - function createUser(data: Partial = {}) { + function createUser(data: Partial = {}) { const un = secureRndstr(16); return usersRepository.insert({ id: genAid(new Date()), @@ -46,7 +46,7 @@ describe('RoleService', () => { .then(x => usersRepository.findOneByOrFail(x.identifiers[0])); } - function createRole(data: Partial = {}) { + function createRole(data: Partial = {}) { return rolesRepository.insert({ id: genAid(new Date()), createdAt: new Date(), @@ -204,7 +204,7 @@ describe('RoleService', () => { createdAt: new Date(Date.now() - (1000 * 60 * 60 * 24 * 365)), followersCount: 10, }); - const role = await createRole({ + await createRole({ name: 'a', policies: { canManageCustomEmojis: { diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 93944a68d5..2b15a5cc7a 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -10,8 +10,8 @@ "declaration": false, "sourceMap": false, "target": "ES2022", - "module": "ESNext", - "moduleResolution": "node16", + "module": "nodenext", + "moduleResolution": "nodenext", "allowSyntheticDefaultImports": true, "removeComments": false, "noLib": false, @@ -33,8 +33,9 @@ "node" ], "typeRoots": [ + "./src/@types", "./node_modules/@types", - "./src/@types" + "./node_modules" ], "lib": [ "esnext" diff --git a/packages/frontend/.storybook/preview-head.html b/packages/frontend/.storybook/preview-head.html index f6a9a4875d..ed38e49647 100644 --- a/packages/frontend/.storybook/preview-head.html +++ b/packages/frontend/.storybook/preview-head.html @@ -1,6 +1,6 @@ - + diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index f29995d849..9ee9ac9ba0 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -629,6 +629,8 @@ function onDrop(ev): void { } function saveDraft() { + if (props.instant) return; + const draftData = JSON.parse(miLocalStorage.getItem('drafts') ?? '{}'); draftData[draftKey] = { diff --git a/packages/frontend/src/scripts/aiscript/ui.ts b/packages/frontend/src/scripts/aiscript/ui.ts index 3d059b04de..7e17563ec8 100644 --- a/packages/frontend/src/scripts/aiscript/ui.ts +++ b/packages/frontend/src/scripts/aiscript/ui.ts @@ -124,7 +124,14 @@ export type AsUiPostFormButton = AsUiComponentBase & { }; }; -export type AsUiComponent = AsUiRoot | AsUiContainer | AsUiText | AsUiMfm | AsUiButton | AsUiButtons | AsUiSwitch | AsUiTextarea | AsUiTextInput | AsUiNumberInput | AsUiSelect | AsUiFolder | AsUiPostFormButton; +export type AsUiPostForm = AsUiComponentBase & { + type: 'postForm'; + form?: { + text: string; + }; +}; + +export type AsUiComponent = AsUiRoot | AsUiContainer | AsUiText | AsUiMfm | AsUiButton | AsUiButtons | AsUiSwitch | AsUiTextarea | AsUiTextInput | AsUiNumberInput | AsUiSelect | AsUiFolder | AsUiPostFormButton | AsUiPostForm; export function patch(id: string, def: values.Value, call: (fn: values.VFn, args: values.Value[]) => Promise) { // TODO @@ -462,6 +469,27 @@ function getPostFormButtonOptions(def: values.Value | undefined, call: (fn: valu }; } +function getPostFormOptions(def: values.Value | undefined, call: (fn: values.VFn, args: values.Value[]) => Promise): Omit { + utils.assertObject(def); + + const form = def.value.get('form'); + if (form) utils.assertObject(form); + + const getForm = () => { + const text = form!.value.get('text'); + utils.assertString(text); + return { + text: text.value, + }; + }; + + return { + form: form ? getForm() : { + text: '', + }, + }; +} + export function registerAsUiLib(components: Ref[], done: (root: Ref) => void) { const instances = {}; @@ -569,5 +597,9 @@ export function registerAsUiLib(components: Ref[], done: (root: R 'Ui:C:postFormButton': values.FN_NATIVE(([def, id], opts) => { return createComponentInstance('postFormButton', def, id, getPostFormButtonOptions, opts.call); }), + + 'Ui:C:postForm': values.FN_NATIVE(([def, id], opts) => { + return createComponentInstance('postForm', def, id, getPostFormOptions, opts.call); + }), }; } -- cgit v1.2.3-freya From cd6428715e6780d51e8f6edf93fe7e32bd8f937b Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:31:50 +0900 Subject: feat: テスト通知を送信できるようにする (#11810) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * (add) Notification test * Update Changelog * (add) backend, frontend impl * globalEventの名前を明確にする * Run API Extractor --- CHANGELOG.md | 1 + locales/index.d.ts | 4 +++ locales/ja-JP.yml | 4 +++ .../backend/src/models/entities/Notification.ts | 1 + packages/backend/src/server/api/EndpointsModule.ts | 3 ++ packages/backend/src/server/api/endpoints.ts | 2 ++ .../endpoints/notifications/test-notification.ts | 33 +++++++++++++++++++++ packages/backend/src/types.ts | 2 +- .../frontend/src/components/MkNotification.vue | 4 +++ packages/frontend/src/pages/settings/general.vue | 3 ++ .../frontend/src/pages/settings/notifications.vue | 6 ++++ packages/frontend/src/scripts/test-notification.ts | 34 ++++++++++++++++++++++ packages/frontend/src/ui/_common_/common.vue | 8 +++-- packages/misskey-js/etc/misskey-js.api.md | 8 ++++- packages/misskey-js/src/api.types.ts | 1 + packages/misskey-js/src/entities.ts | 2 ++ 16 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 packages/backend/src/server/api/endpoints/notifications/test-notification.ts create mode 100644 packages/frontend/src/scripts/test-notification.ts (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index cf78b54f94..03c93f70df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ - 投稿フォームのプレビューの表示状態を記憶するように - AiScriptからMisskeyサーバーAPIを呼び出す際の制限を撤廃 - Playで直接投稿フォームを埋め込めるように(`Ui:C:postForm`) +- 通知をテストできるように - Enhance: ユーザーメニューでスイッチでユーザーリストに追加・削除できるように - Enhance: 自分が押したリアクションのデザインを改善 - Enhance: ノート検索にローカルのみ検索可能なオプションの追加 diff --git a/locales/index.d.ts b/locales/index.d.ts index 771d5cf872..36897285c4 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -2132,6 +2132,10 @@ export interface Locale { "unreadAntennaNote": string; "emptyPushNotificationMessage": string; "achievementEarned": string; + "testNotification": string; + "checkNotificationBehavior": string; + "sendTestNotification": string; + "notificationWillBeDisplayedLikeThis": string; "_types": { "all": string; "follow": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 2b2cad8d73..f9427e13ec 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2047,6 +2047,10 @@ _notification: unreadAntennaNote: "アンテナ {name}" emptyPushNotificationMessage: "プッシュ通知の更新をしました" achievementEarned: "実績を獲得" + testNotification: "通知テスト" + checkNotificationBehavior: "通知の表示を確かめる" + sendTestNotification: "テスト通知を送信する" + notificationWillBeDisplayedLikeThis: "通知はこのように表示されます" _types: all: "すべて" diff --git a/packages/backend/src/models/entities/Notification.ts b/packages/backend/src/models/entities/Notification.ts index 94c7084cf0..fb7f67dfd8 100644 --- a/packages/backend/src/models/entities/Notification.ts +++ b/packages/backend/src/models/entities/Notification.ts @@ -33,6 +33,7 @@ export type MiNotification = { * followRequestAccepted - 自分の送ったフォローリクエストが承認された * achievementEarned - 実績を獲得 * app - アプリ通知 + * test - テスト通知(サーバー側) */ type: typeof notificationTypes[number]; diff --git a/packages/backend/src/server/api/EndpointsModule.ts b/packages/backend/src/server/api/EndpointsModule.ts index 799ba4498d..7b9fa6c3b0 100644 --- a/packages/backend/src/server/api/EndpointsModule.ts +++ b/packages/backend/src/server/api/EndpointsModule.ts @@ -283,6 +283,7 @@ import * as ep___notes_unrenote from './endpoints/notes/unrenote.js'; import * as ep___notes_userListTimeline from './endpoints/notes/user-list-timeline.js'; import * as ep___notifications_create from './endpoints/notifications/create.js'; import * as ep___notifications_markAllAsRead from './endpoints/notifications/mark-all-as-read.js'; +import * as ep___notifications_testNotification from './endpoints/notifications/test-notification.js'; import * as ep___pagePush from './endpoints/page-push.js'; import * as ep___pages_create from './endpoints/pages/create.js'; import * as ep___pages_delete from './endpoints/pages/delete.js'; @@ -629,6 +630,7 @@ const $notes_unrenote: Provider = { provide: 'ep:notes/unrenote', useClass: ep__ const $notes_userListTimeline: Provider = { provide: 'ep:notes/user-list-timeline', useClass: ep___notes_userListTimeline.default }; const $notifications_create: Provider = { provide: 'ep:notifications/create', useClass: ep___notifications_create.default }; const $notifications_markAllAsRead: Provider = { provide: 'ep:notifications/mark-all-as-read', useClass: ep___notifications_markAllAsRead.default }; +const $notifications_testNotification: Provider = { provide: 'ep:notifications/test-notification', useClass: ep___notifications_testNotification.default }; const $pagePush: Provider = { provide: 'ep:page-push', useClass: ep___pagePush.default }; const $pages_create: Provider = { provide: 'ep:pages/create', useClass: ep___pages_create.default }; const $pages_delete: Provider = { provide: 'ep:pages/delete', useClass: ep___pages_delete.default }; @@ -979,6 +981,7 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention $notes_userListTimeline, $notifications_create, $notifications_markAllAsRead, + $notifications_testNotification, $pagePush, $pages_create, $pages_delete, diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts index 3924b43d16..a9cb7c341a 100644 --- a/packages/backend/src/server/api/endpoints.ts +++ b/packages/backend/src/server/api/endpoints.ts @@ -283,6 +283,7 @@ import * as ep___notes_unrenote from './endpoints/notes/unrenote.js'; import * as ep___notes_userListTimeline from './endpoints/notes/user-list-timeline.js'; import * as ep___notifications_create from './endpoints/notifications/create.js'; import * as ep___notifications_markAllAsRead from './endpoints/notifications/mark-all-as-read.js'; +import * as ep___notifications_testNotification from './endpoints/notifications/test-notification.js'; import * as ep___pagePush from './endpoints/page-push.js'; import * as ep___pages_create from './endpoints/pages/create.js'; import * as ep___pages_delete from './endpoints/pages/delete.js'; @@ -627,6 +628,7 @@ const eps = [ ['notes/user-list-timeline', ep___notes_userListTimeline], ['notifications/create', ep___notifications_create], ['notifications/mark-all-as-read', ep___notifications_markAllAsRead], + ['notifications/test-notification', ep___notifications_testNotification], ['page-push', ep___pagePush], ['pages/create', ep___pages_create], ['pages/delete', ep___pages_delete], diff --git a/packages/backend/src/server/api/endpoints/notifications/test-notification.ts b/packages/backend/src/server/api/endpoints/notifications/test-notification.ts new file mode 100644 index 0000000000..04a68a8054 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/notifications/test-notification.ts @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { Injectable } from '@nestjs/common'; +import { Endpoint } from '@/server/api/endpoint-base.js'; +import { NotificationService } from '@/core/NotificationService.js'; + +export const meta = { + tags: ['notifications'], + + requireCredential: true, + + kind: 'write:notifications', +} as const; + +export const paramDef = { + type: 'object', + properties: {}, + required: [], +} as const; + +@Injectable() +export default class extends Endpoint { // eslint-disable-line import/no-default-export + constructor( + private notificationService: NotificationService, + ) { + super(meta, paramDef, async (ps, user) => { + this.notificationService.createNotification(user.id, 'test', {}); + }); + } +} diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index a3a8e77cd0..024ba01e3b 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -export const notificationTypes = ['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'achievementEarned', 'app'] as const; +export const notificationTypes = ['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'achievementEarned', 'app', 'test'] as const; export const obsoleteNotificationTypes = ['pollVote', 'groupInvited'] as const; export const noteVisibilities = ['public', 'home', 'followers', 'specified'] as const; diff --git a/packages/frontend/src/components/MkNotification.vue b/packages/frontend/src/components/MkNotification.vue index d46e8de553..ea2b6c1d4b 100644 --- a/packages/frontend/src/components/MkNotification.vue +++ b/packages/frontend/src/components/MkNotification.vue @@ -8,6 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
+
{{ i18n.ts._notification.pollEnded }} {{ i18n.ts._notification.achievementEarned }} + {{ i18n.ts._notification.testNotification }} {{ notification.header }} @@ -91,6 +93,7 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.reject }}
+ {{ i18n.ts._notification.notificationWillBeDisplayedLikeThis }} @@ -113,6 +116,7 @@ import { i18n } from '@/i18n'; import * as os from '@/os'; import { useTooltip } from '@/scripts/use-tooltip'; import { $i } from '@/account'; +import { infoImageUrl } from '@/instance'; const props = withDefaults(defineProps<{ notification: Misskey.entities.Notification; diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue index 85a3a2e2e3..31d5dd93ec 100644 --- a/packages/frontend/src/pages/settings/general.vue +++ b/packages/frontend/src/pages/settings/general.vue @@ -95,6 +95,8 @@ SPDX-License-Identifier: AGPL-3.0-only + + {{ i18n.ts._notification.checkNotificationBehavior }}
@@ -190,6 +192,7 @@ import { unisonReload } from '@/scripts/unison-reload'; import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; import { miLocalStorage } from '@/local-storage'; +import { testNotification } from '@/scripts/test-notification'; const lang = ref(miLocalStorage.getItem('lang')); const fontSize = ref(miLocalStorage.getItem('fontSize')); diff --git a/packages/frontend/src/pages/settings/notifications.vue b/packages/frontend/src/pages/settings/notifications.vue index b9e4c58f79..b20add724c 100644 --- a/packages/frontend/src/pages/settings/notifications.vue +++ b/packages/frontend/src/pages/settings/notifications.vue @@ -12,6 +12,11 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.markAsReadAllUnreadNotes }}
+ +
+ {{ i18n.ts._notification.sendTestNotification }} +
+
@@ -41,6 +46,7 @@ import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; import MkPushNotificationAllowButton from '@/components/MkPushNotificationAllowButton.vue'; import { notificationTypes } from '@/const'; +import { testNotification } from '@/scripts/test-notification'; let allowButton = $shallowRef>(); let pushRegistrationInServer = $computed(() => allowButton?.pushRegistrationInServer); diff --git a/packages/frontend/src/scripts/test-notification.ts b/packages/frontend/src/scripts/test-notification.ts new file mode 100644 index 0000000000..0e8289e19e --- /dev/null +++ b/packages/frontend/src/scripts/test-notification.ts @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import * as Misskey from 'misskey-js'; +import * as os from '@/os'; +import { globalEvents } from '@/events'; + +/** + * テスト通知を送信 + * + * - `client` … 通知ポップアップのみを表示 + * - `server` … サーバー側から通知を送信 + * + * @param type 通知タイプを指定 + */ +export function testNotification(type: 'client' | 'server'): void { + const notification: Misskey.entities.Notification = { + id: Math.random().toString(), + createdAt: new Date().toUTCString(), + isRead: false, + type: 'test', + }; + + switch (type) { + case 'server': + os.api('notifications/test-notification'); + break; + case 'client': + globalEvents.emit('clientNotification', notification); + break; + } +} diff --git a/packages/frontend/src/ui/_common_/common.vue b/packages/frontend/src/ui/_common_/common.vue index 61fcb0b171..65c5dbb384 100644 --- a/packages/frontend/src/ui/_common_/common.vue +++ b/packages/frontend/src/ui/_common_/common.vue @@ -56,6 +56,7 @@ import { $i } from '@/account'; import { useStream } from '@/stream'; import { i18n } from '@/i18n'; import { defaultStore } from '@/store'; +import { globalEvents } from '@/events'; const XStreamIndicator = defineAsyncComponent(() => import('./stream-indicator.vue')); const XUpload = defineAsyncComponent(() => import('./upload.vue')); @@ -64,11 +65,13 @@ const dev = _DEV_; let notifications = $ref([]); -function onNotification(notification) { +function onNotification(notification: Misskey.entities.Notification, isClient: boolean = false) { if ($i.mutingNotificationTypes.includes(notification.type)) return; if (document.visibilityState === 'visible') { - useStream().send('readNotification'); + if (!isClient) { + useStream().send('readNotification'); + } notifications.unshift(notification); window.setTimeout(() => { @@ -86,6 +89,7 @@ function onNotification(notification) { if ($i) { const connection = useStream().useChannel('main', null, 'UI'); connection.on('notification', onNotification); + globalEvents.on('clientNotification', notification => onNotification(notification, true)); //#region Listen message from SW if ('serviceWorker' in navigator) { diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md index e3f8a65cf8..ab2cc15d52 100644 --- a/packages/misskey-js/etc/misskey-js.api.md +++ b/packages/misskey-js/etc/misskey-js.api.md @@ -1915,6 +1915,10 @@ export type Endpoints = { }; res: null; }; + 'notifications/test-notification': { + req: NoParams; + res: null; + }; 'notifications/mark-all-as-read': { req: NoParams; res: null; @@ -2627,6 +2631,8 @@ type Notification_2 = { header?: string | null; body: string; icon?: string | null; +} | { + type: 'test'; }); // @public (undocumented) @@ -2842,7 +2848,7 @@ type UserSorting = '+follower' | '-follower' | '+createdAt' | '-createdAt' | '+u // // src/api.types.ts:16:32 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts // src/api.types.ts:18:25 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts -// src/api.types.ts:630:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts +// src/api.types.ts:631:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts // src/streaming.types.ts:33:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/misskey-js/src/api.types.ts b/packages/misskey-js/src/api.types.ts index 70ef570166..46d790fe31 100644 --- a/packages/misskey-js/src/api.types.ts +++ b/packages/misskey-js/src/api.types.ts @@ -534,6 +534,7 @@ export type Endpoints = { // notifications 'notifications/create': { req: { body: string; header?: string | null; icon?: string | null; }; res: null; }; + 'notifications/test-notification': { req: NoParams; res: null; }; 'notifications/mark-all-as-read': { req: NoParams; res: null; }; // page-push diff --git a/packages/misskey-js/src/entities.ts b/packages/misskey-js/src/entities.ts index 64742fa5b6..3782d81c2e 100644 --- a/packages/misskey-js/src/entities.ts +++ b/packages/misskey-js/src/entities.ts @@ -257,6 +257,8 @@ export type Notification = { header?: string | null; body: string; icon?: string | null; +} | { + type: 'test'; }); export type MessagingMessage = { -- cgit v1.2.3-freya From 25e030a7074f8e00cfbdaf85e491b9b22886991d Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 11 Sep 2023 14:55:18 +0900 Subject: enhance(frontend): improve some caches --- packages/frontend/src/cache.ts | 9 +++-- packages/frontend/src/local-storage.ts | 2 - packages/frontend/src/pages/my-antennas/index.vue | 7 ++-- packages/frontend/src/pages/my-lists/index.vue | 2 +- packages/frontend/src/pages/timeline.vue | 17 ++------- packages/frontend/src/scripts/cache.ts | 46 ++++------------------- packages/frontend/src/scripts/get-note-menu.ts | 2 +- packages/frontend/src/scripts/get-user-menu.ts | 6 +-- 8 files changed, 23 insertions(+), 68 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/src/cache.ts b/packages/frontend/src/cache.ts index 3523d4406b..1f3d28ba57 100644 --- a/packages/frontend/src/cache.ts +++ b/packages/frontend/src/cache.ts @@ -5,8 +5,9 @@ import * as Misskey from 'misskey-js'; import { Cache } from '@/scripts/cache'; +import { api } from '@/os'; -export const clipsCache = new Cache(Infinity); -export const rolesCache = new Cache(Infinity); -export const userListsCache = new Cache(Infinity); -export const antennasCache = new Cache(Infinity); +export const clipsCache = new Cache(1000 * 60 * 30, () => api('clips/list')); +export const rolesCache = new Cache(1000 * 60 * 30, () => api('admin/roles/list')); +export const userListsCache = new Cache(1000 * 60 * 30, () => api('users/lists/list')); +export const antennasCache = new Cache(1000 * 60 * 30, () => api('antennas/list')); diff --git a/packages/frontend/src/local-storage.ts b/packages/frontend/src/local-storage.ts index f4c11d6130..0d73885b68 100644 --- a/packages/frontend/src/local-storage.ts +++ b/packages/frontend/src/local-storage.ts @@ -30,8 +30,6 @@ type Keys = 'message_drafts' | 'scratchpad' | 'debug' | - 'userListsCache' | - 'antennasCache' | `miux:${string}` | `ui:folder:${string}` | `themes:${string}` | diff --git a/packages/frontend/src/pages/my-antennas/index.vue b/packages/frontend/src/pages/my-antennas/index.vue index bd7af2213d..18ba289641 100644 --- a/packages/frontend/src/pages/my-antennas/index.vue +++ b/packages/frontend/src/pages/my-antennas/index.vue @@ -28,18 +28,17 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/pages/my-lists/index.vue b/packages/frontend/src/pages/my-lists/index.vue index edfff8b05e..a779e4a944 100644 --- a/packages/frontend/src/pages/my-lists/index.vue +++ b/packages/frontend/src/pages/my-lists/index.vue @@ -42,7 +42,7 @@ import { $i } from '@/account'; const items = $computed(() => userListsCache.value.value ?? []); function fetch() { - userListsCache.fetch(() => os.api('users/lists/list')); + userListsCache.fetch(); } fetch(); diff --git a/packages/frontend/src/pages/timeline.vue b/packages/frontend/src/pages/timeline.vue index 3ec4a6788c..f0ef2d10a1 100644 --- a/packages/frontend/src/pages/timeline.vue +++ b/packages/frontend/src/pages/timeline.vue @@ -39,6 +39,7 @@ import { instance } from '@/instance'; import { $i } from '@/account'; import { definePageMetadata } from '@/scripts/page-metadata'; import { miLocalStorage } from '@/local-storage'; +import { antennasCache, userListsCache } from '@/cache'; provide('shouldOmitHeaderTitle', true); @@ -68,24 +69,17 @@ function top(): void { } async function chooseList(ev: MouseEvent): Promise { - const cachedLists = miLocalStorage.getItemAsJson('userListsCache'); - const lists = cachedLists ?? await os.api('users/lists/list'); + const lists = await userListsCache.fetch(); const items = lists.map(list => ({ type: 'link' as const, text: list.name, to: `/timeline/list/${list.id}`, })); os.popupMenu(items, ev.currentTarget ?? ev.target); - if (cachedLists == null) { - miLocalStorage.setItemAsJson('userListsCache', lists); - } else { - miLocalStorage.setItemAsJson('userListsCache', await os.api('users/lists/list')); - } } async function chooseAntenna(ev: MouseEvent): Promise { - const cachedAntennas = miLocalStorage.getItemAsJson('antennasCache'); - const antennas = cachedAntennas ?? await os.api('antennas/list'); + const antennas = await antennasCache.fetch(); const items = antennas.map(antenna => ({ type: 'link' as const, text: antenna.name, @@ -93,11 +87,6 @@ async function chooseAntenna(ev: MouseEvent): Promise { to: `/timeline/antenna/${antenna.id}`, })); os.popupMenu(items, ev.currentTarget ?? ev.target); - if (cachedAntennas == null) { - miLocalStorage.setItemAsJson('antennasCache', antennas); - } else { - miLocalStorage.setItemAsJson('antennasCache', await os.api('antennas/list')); - } } async function chooseChannel(ev: MouseEvent): Promise { diff --git a/packages/frontend/src/scripts/cache.ts b/packages/frontend/src/scripts/cache.ts index 0dda203ef0..12347cf4b1 100644 --- a/packages/frontend/src/scripts/cache.ts +++ b/packages/frontend/src/scripts/cache.ts @@ -9,9 +9,11 @@ export class Cache { private cachedAt: number | null = null; public value = ref(); private lifetime: number; + private fetcher: () => Promise; - constructor(lifetime: Cache['lifetime']) { + constructor(lifetime: Cache['lifetime'], fetcher: () => Promise) { this.lifetime = lifetime; + this.fetcher = fetcher; } public set(value: T): void { @@ -35,51 +37,17 @@ export class Cache { /** * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します - * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします */ - public async fetch(fetcher: () => Promise, validator?: (cachedValue: T) => boolean): Promise { + public async fetch(): Promise { const cachedValue = this.get(); if (cachedValue !== undefined) { - if (validator) { - if (validator(cachedValue)) { - // Cache HIT - return cachedValue; - } - } else { - // Cache HIT - return cachedValue; - } + // Cache HIT + return cachedValue; } // Cache MISS - const value = await fetcher(); + const value = await this.fetcher(); this.set(value); return value; } - - /** - * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します - * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします - */ - public async fetchMaybe(fetcher: () => Promise, validator?: (cachedValue: T) => boolean): Promise { - const cachedValue = this.get(); - if (cachedValue !== undefined) { - if (validator) { - if (validator(cachedValue)) { - // Cache HIT - return cachedValue; - } - } else { - // Cache HIT - return cachedValue; - } - } - - // Cache MISS - const value = await fetcher(); - if (value !== undefined) { - this.set(value); - } - return value; - } } diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts index c8b1cb8dfc..5bda993fff 100644 --- a/packages/frontend/src/scripts/get-note-menu.ts +++ b/packages/frontend/src/scripts/get-note-menu.ts @@ -32,7 +32,7 @@ export async function getNoteClipMenu(props: { const appearNote = isRenote ? props.note.renote as Misskey.entities.Note : props.note; - const clips = await clipsCache.fetch(() => os.api('clips/list')); + const clips = await clipsCache.fetch(); return [...clips.map(clip => ({ text: clip.name, action: () => { diff --git a/packages/frontend/src/scripts/get-user-menu.ts b/packages/frontend/src/scripts/get-user-menu.ts index 3b125edfc7..2ab21e6c23 100644 --- a/packages/frontend/src/scripts/get-user-menu.ts +++ b/packages/frontend/src/scripts/get-user-menu.ts @@ -170,7 +170,7 @@ export function getUserMenu(user: Misskey.entities.UserDetailed, router: Router icon: 'ti ti-list', text: i18n.ts.addToList, children: async () => { - const lists = await userListsCache.fetch(() => os.api('users/lists/list')); + const lists = await userListsCache.fetch(); return lists.map(list => { const isListed = ref(list.userIds.includes(user.id)); cleanups.push(watch(isListed, () => { @@ -203,7 +203,7 @@ export function getUserMenu(user: Misskey.entities.UserDetailed, router: Router icon: 'ti ti-antenna', text: i18n.ts.addToAntenna, children: async () => { - const antennas = await antennasCache.fetch(() => os.api('antennas/list')); + const antennas = await antennasCache.fetch(); const canonical = user.host === null ? `@${user.username}` : `@${user.username}@${toUnicode(user.host)}`; return antennas.filter((a) => a.src === 'users').map(antenna => ({ text: antenna.name, @@ -234,7 +234,7 @@ export function getUserMenu(user: Misskey.entities.UserDetailed, router: Router icon: 'ti ti-badges', text: i18n.ts.roles, children: async () => { - const roles = await rolesCache.fetch(() => os.api('admin/roles/list')); + const roles = await rolesCache.fetch(); return roles.filter(r => r.target === 'manual').map(r => ({ text: r.name, -- cgit v1.2.3-freya From 3456680e1d827bada1009aad7a7247ae17f01184 Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:48:19 +0900 Subject: 新しい実績を追加 (#11817) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * (add) new achievement * (update) changelog * Update test-notification.ts * tweak --------- Co-authored-by: syuilo --- CHANGELOG.md | 3 +- locales/index.d.ts | 4 +++ locales/ja-JP.yml | 3 ++ packages/backend/src/core/AchievementService.ts | 1 + packages/frontend/src/pages/settings/general.vue | 32 ++++++++++++++++++-- .../frontend/src/pages/settings/notifications.vue | 7 +++-- packages/frontend/src/scripts/achievements.ts | 6 ++++ packages/frontend/src/scripts/test-notification.ts | 34 ---------------------- 8 files changed, 51 insertions(+), 39 deletions(-) delete mode 100644 packages/frontend/src/scripts/test-notification.ts (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index 03c93f70df..1cc6b3f0d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ - センシティブチャンネルのノートはユーザープロフィールに表示されません - 二要素認証のバックアップコードが生成されるようになりました ref. https://github.com/MisskeyIO/misskey/pull/121 - 二要素認証でパスキーをサポートするようになりました +- 通知をテストできるようになりました ### Client - プロフィールにその人が作ったPlayの一覧出せるように @@ -33,7 +34,6 @@ - 投稿フォームのプレビューの表示状態を記憶するように - AiScriptからMisskeyサーバーAPIを呼び出す際の制限を撤廃 - Playで直接投稿フォームを埋め込めるように(`Ui:C:postForm`) -- 通知をテストできるように - Enhance: ユーザーメニューでスイッチでユーザーリストに追加・削除できるように - Enhance: 自分が押したリアクションのデザインを改善 - Enhance: ノート検索にローカルのみ検索可能なオプションの追加 @@ -46,6 +46,7 @@ - リアクションの表示サイズをより大きくできるように - ノート詳細ページ読み込み時のパフォーマンスを改善 - タイムラインでリスト/アンテナ選択時のパフォーマンスを改善 +- 新しい実績を追加 - Fix: サーバー情報画面(`/instance-info/{domain}`)でブロックができないのを修正 - Fix: 未読のお知らせの「わかった」をクリック・タップしてもその場で「わかった」が消えない問題を修正 - Fix: iOSで画面を回転させるとテキストサイズが変わる問題を修正 diff --git a/locales/index.d.ts b/locales/index.d.ts index 36897285c4..746c51c991 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1467,6 +1467,10 @@ export interface Locale { "description": string; "flavor": string; }; + "_smashTestNotificationButton": { + "title": string; + "description": string; + }; }; }; "_role": { diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index f9427e13ec..3cde23ca91 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1391,6 +1391,9 @@ _achievements: title: "Brain Diver" description: "Brain Diverへのリンクを投稿した" flavor: "Misskey-Misskey La-Tu-Ma" + _smashTestNotificationButton: + title: "テスト過剰" + description: "通知のテストをごく短時間のうちに連続して行った" _role: new: "ロールの作成" diff --git a/packages/backend/src/core/AchievementService.ts b/packages/backend/src/core/AchievementService.ts index aa810015ed..a35acd3680 100644 --- a/packages/backend/src/core/AchievementService.ts +++ b/packages/backend/src/core/AchievementService.ts @@ -85,6 +85,7 @@ export const ACHIEVEMENT_TYPES = [ 'setNameToSyuilo', 'cookieClicked', 'brainDiver', + 'smashTestNotificationButton', ] as const; @Injectable() diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue index 31d5dd93ec..b486e6d80f 100644 --- a/packages/frontend/src/pages/settings/general.vue +++ b/packages/frontend/src/pages/settings/general.vue @@ -96,7 +96,7 @@ SPDX-License-Identifier: AGPL-3.0-only - {{ i18n.ts._notification.checkNotificationBehavior }} + {{ i18n.ts._notification.checkNotificationBehavior }}
@@ -176,6 +176,7 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index f7578dd390..086667127b 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -11,7 +11,12 @@ SPDX-License-Identifier: AGPL-3.0-only v-hotkey="keymap" :class="$style.root" > - +
+
+ {{ i18n.ts.loadConversation }} +
+ +
@@ -125,7 +130,43 @@ SPDX-License-Identifier: AGPL-3.0-only - +
+ + + +
+
+
+
+ {{ i18n.ts.loadReplies }} +
+ +
+
+ + + +
+
+
+ +
+ + + +
+
@@ -169,6 +210,10 @@ import { claimAchievement } from '@/scripts/achievements'; import { MenuItem } from '@/types/menu'; import MkRippleEffect from '@/components/MkRippleEffect.vue'; import { showMovedDialog } from '@/scripts/show-moved-dialog'; +import MkUserCardMini from '@/components/MkUserCardMini.vue'; +import MkPagination, { Paging } from '@/components/MkPagination.vue'; +import MkReactionIcon from '@/components/MkReactionIcon.vue'; +import MkButton from '@/components/MkButton.vue'; const props = defineProps<{ note: Misskey.entities.Note; @@ -224,6 +269,26 @@ const keymap = { 's': () => showContent.value !== showContent.value, }; +let tab = $ref('replies'); +let reactionTabType = $ref(null); + +const renotesPagination = $computed(() => ({ + endpoint: 'notes/renotes', + limit: 10, + params: { + noteId: appearNote.id, + }, +})); + +const reactionsPagination = $computed(() => ({ + endpoint: 'notes/reactions', + limit: 10, + params: { + noteId: appearNote.id, + type: reactionTabType, + }, +})); + useNoteCapture({ rootEl: el, note: $$(appearNote), @@ -426,14 +491,20 @@ function blur() { el.value.blur(); } -os.api('notes/children', { - noteId: appearNote.id, - limit: 30, -}).then(res => { - replies.value = res; -}); +const repliesLoaded = ref(false); +function loadReplies() { + repliesLoaded.value = true; + os.api('notes/children', { + noteId: appearNote.id, + limit: 30, + }).then(res => { + replies.value = res; + }); +} -if (appearNote.replyId) { +const conversationLoaded = ref(false); +function loadConversation() { + conversationLoaded.value = true; os.api('notes/conversation', { noteId: appearNote.replyId, }).then(res => { @@ -640,10 +711,52 @@ if (appearNote.replyId) { } } -.reply { +.reply:not(:first-child) { border-top: solid 0.5px var(--divider); } +.tabs { + border-top: solid 0.5px var(--divider); + border-bottom: solid 0.5px var(--divider); + display: flex; +} + +.tab { + flex: 1; + padding: 12px 8px; + border-top: solid 2px transparent; + border-bottom: solid 2px transparent; +} + +.tabActive { + border-bottom: solid 2px var(--accent); +} + +.tab_renotes { + padding: 16px; +} + +.tab_reactions { + padding: 16px; +} + +.reactionTabs { + display: flex; + gap: 8px; + flex-wrap: wrap; + margin-bottom: 8px; +} + +.reactionTab { + padding: 4px 6px; + border: solid 1px var(--divider); + border-radius: 6px; +} + +.reactionTabActive { + border-color: var(--accent); +} + @container (max-width: 500px) { .root { font-size: 0.9em; diff --git a/packages/frontend/src/components/MkReactedUsersDialog.vue b/packages/frontend/src/components/MkReactedUsersDialog.vue deleted file mode 100644 index b5f3a634a3..0000000000 --- a/packages/frontend/src/components/MkReactedUsersDialog.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - diff --git a/packages/frontend/src/components/MkRenotedUsersDialog.vue b/packages/frontend/src/components/MkRenotedUsersDialog.vue deleted file mode 100644 index 5e6784bb9c..0000000000 --- a/packages/frontend/src/components/MkRenotedUsersDialog.vue +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts index 5bda993fff..d9fae946d3 100644 --- a/packages/frontend/src/scripts/get-note-menu.ts +++ b/packages/frontend/src/scripts/get-note-menu.ts @@ -238,18 +238,6 @@ export function getNoteMenu(props: { os.pageWindow(`/notes/${appearNote.id}`); } - function showReactions(): void { - os.popup(defineAsyncComponent(() => import('@/components/MkReactedUsersDialog.vue')), { - noteId: appearNote.id, - }, {}, 'closed'); - } - - function showRenotes(): void { - os.popup(defineAsyncComponent(() => import('@/components/MkRenotedUsersDialog.vue')), { - noteId: appearNote.id, - }, {}, 'closed'); - } - async function translate(): Promise { if (props.translation.value != null) return; props.translating.value = true; @@ -279,14 +267,6 @@ export function getNoteMenu(props: { icon: 'ti ti-info-circle', text: i18n.ts.details, action: openDetail, - }, { - icon: 'ti ti-repeat', - text: i18n.ts.renotesList, - action: showRenotes, - }, { - icon: 'ti ti-icons', - text: i18n.ts.reactionsList, - action: showReactions, }, { icon: 'ti ti-copy', text: i18n.ts.copyContent, -- cgit v1.2.3-freya From 44985ae8588a96968c1e6856083216b3d75b4c18 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Mon, 18 Sep 2023 14:23:33 +0900 Subject: feat: Mk:apiが失敗時エラー型の値を返すように (#2) (#11843) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Mk:apiが失敗時エラー型の値を返すように (#2) * Update CHANGELOG.md --- CHANGELOG.md | 1 + packages/frontend/src/scripts/aiscript/api.ts | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index bbcbdf58da..56c2552145 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ - Playの操作を行うAPI TokenをAPIコンソールから発行できるように - リアクションの表示サイズをより大きくできるように - AiScriptを0.16.0に更新 +- Mk:apiが失敗した時にエラー型の値(AiScript 0.16.0で追加)を返すように - タイムラインでリスト/アンテナ選択時のパフォーマンスを改善 - 「Moderation note」、「Add moderation note」をローカライズできるように - 新しい実績を追加 diff --git a/packages/frontend/src/scripts/aiscript/api.ts b/packages/frontend/src/scripts/aiscript/api.ts index c3acb6d145..dcb4a9105c 100644 --- a/packages/frontend/src/scripts/aiscript/api.ts +++ b/packages/frontend/src/scripts/aiscript/api.ts @@ -39,8 +39,11 @@ export function createAiScriptEnv(opts) { // バグがあればundefinedもあり得るため念のため if (typeof token.value !== 'string') throw new Error('invalid token'); } - const res = await os.api(ep.value, utils.valToJs(param), token ? token.value : (opts.token ?? null)); - return utils.jsToVal(res); + return os.api(ep.value, utils.valToJs(param), token ? token.value : (opts.token ?? null)).then(res => { + return utils.jsToVal(res); + }, err => { + return values.ERROR('request_failed', utils.jsToVal(err)); + }); }), 'Mk:save': values.FN_NATIVE(([key, value]) => { utils.assertString(key); -- cgit v1.2.3-freya From b0f6c44f36f3173f5d232d1adb02fc09dfdcc003 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 19 Sep 2023 16:37:43 +0900 Subject: refactor(frontend): use ESM --- packages/frontend/@types/theme.d.ts | 2 +- packages/frontend/package.json | 1 + packages/frontend/src/_boot_.ts | 4 +-- packages/frontend/src/account.ts | 16 ++++----- packages/frontend/src/boot/common.ts | 40 +++++++++++----------- packages/frontend/src/boot/main-boot.ts | 30 ++++++++-------- packages/frontend/src/boot/sub-boot.ts | 2 +- packages/frontend/src/cache.ts | 4 +-- packages/frontend/src/components/MkAbuseReport.vue | 6 ++-- .../src/components/MkAbuseReportWindow.vue | 4 +-- .../frontend/src/components/MkAccountMoved.vue | 6 ++-- .../src/components/MkAchievements.stories.impl.ts | 2 +- .../frontend/src/components/MkAchievements.vue | 6 ++-- .../src/components/MkAnnouncementDialog.vue | 6 ++-- packages/frontend/src/components/MkAsUi.vue | 4 +-- .../src/components/MkAutocomplete.stories.impl.ts | 2 +- .../frontend/src/components/MkAutocomplete.vue | 20 +++++------ packages/frontend/src/components/MkAvatars.vue | 2 +- packages/frontend/src/components/MkCaptcha.vue | 4 +-- .../src/components/MkChannelFollowButton.vue | 4 +-- packages/frontend/src/components/MkChannelList.vue | 4 +-- .../frontend/src/components/MkChannelPreview.vue | 2 +- packages/frontend/src/components/MkChart.vue | 16 ++++----- packages/frontend/src/components/MkClickerGame.vue | 10 +++--- packages/frontend/src/components/MkClipPreview.vue | 2 +- packages/frontend/src/components/MkColorInput.vue | 2 +- packages/frontend/src/components/MkContainer.vue | 4 +-- packages/frontend/src/components/MkContextMenu.vue | 6 ++-- .../frontend/src/components/MkCropperDialog.vue | 12 +++---- packages/frontend/src/components/MkCwButton.vue | 4 +-- .../src/components/MkDateSeparatedList.vue | 6 ++-- packages/frontend/src/components/MkDialog.vue | 2 +- packages/frontend/src/components/MkDonation.vue | 10 +++--- packages/frontend/src/components/MkDrive.file.vue | 10 +++--- .../frontend/src/components/MkDrive.folder.vue | 10 +++--- .../frontend/src/components/MkDrive.navFolder.vue | 4 +-- packages/frontend/src/components/MkDrive.vue | 12 +++---- .../src/components/MkDriveSelectDialog.vue | 4 +-- packages/frontend/src/components/MkDriveWindow.vue | 2 +- .../src/components/MkEmojiPicker.section.vue | 2 +- packages/frontend/src/components/MkEmojiPicker.vue | 16 ++++----- .../src/components/MkEmojiPickerDialog.vue | 2 +- .../frontend/src/components/MkFeaturedPhotos.vue | 2 +- .../src/components/MkFileCaptionEditWindow.vue | 2 +- .../frontend/src/components/MkFileListForAdmin.vue | 6 ++-- .../frontend/src/components/MkFlashPreview.vue | 2 +- .../frontend/src/components/MkFoldableSection.vue | 4 +-- packages/frontend/src/components/MkFolder.vue | 2 +- .../frontend/src/components/MkFollowButton.vue | 10 +++--- .../frontend/src/components/MkForgotPassword.vue | 6 ++-- packages/frontend/src/components/MkFormDialog.vue | 2 +- .../src/components/MkGalleryPostPreview.vue | 2 +- packages/frontend/src/components/MkGoogle.vue | 2 +- packages/frontend/src/components/MkHeatmap.vue | 10 +++--- .../frontend/src/components/MkImgWithBlurhash.vue | 6 ++-- packages/frontend/src/components/MkInput.vue | 4 +-- .../frontend/src/components/MkInstanceCardMini.vue | 4 +-- .../frontend/src/components/MkInstanceStats.vue | 8 ++--- .../frontend/src/components/MkInstanceTicker.vue | 6 ++-- packages/frontend/src/components/MkInviteCode.vue | 6 ++-- packages/frontend/src/components/MkKeyValue.vue | 6 ++-- packages/frontend/src/components/MkLaunchPad.vue | 4 +-- packages/frontend/src/components/MkLink.vue | 6 ++-- packages/frontend/src/components/MkMediaBanner.vue | 4 +-- packages/frontend/src/components/MkMediaImage.vue | 12 +++---- packages/frontend/src/components/MkMediaList.vue | 6 ++-- packages/frontend/src/components/MkMediaVideo.vue | 6 ++-- packages/frontend/src/components/MkMention.vue | 6 ++-- packages/frontend/src/components/MkMenu.vue | 8 ++--- packages/frontend/src/components/MkMiniChart.vue | 2 +- packages/frontend/src/components/MkModal.vue | 8 ++--- packages/frontend/src/components/MkNote.vue | 36 +++++++++---------- .../frontend/src/components/MkNoteDetailed.vue | 32 ++++++++--------- packages/frontend/src/components/MkNoteHeader.vue | 6 ++-- packages/frontend/src/components/MkNotePreview.vue | 2 +- packages/frontend/src/components/MkNoteSimple.vue | 2 +- packages/frontend/src/components/MkNoteSub.vue | 8 ++--- packages/frontend/src/components/MkNotes.vue | 4 +-- .../frontend/src/components/MkNotification.vue | 16 ++++----- .../src/components/MkNotificationSettingWindow.vue | 2 +- .../frontend/src/components/MkNotifications.vue | 8 ++--- packages/frontend/src/components/MkNumber.vue | 2 +- packages/frontend/src/components/MkNumberDiff.vue | 2 +- .../frontend/src/components/MkObjectView.value.vue | 2 +- packages/frontend/src/components/MkOmit.vue | 2 +- packages/frontend/src/components/MkPagePreview.vue | 2 +- packages/frontend/src/components/MkPageWindow.vue | 20 +++++------ packages/frontend/src/components/MkPagination.vue | 12 +++---- .../frontend/src/components/MkPlusOneEffect.vue | 2 +- packages/frontend/src/components/MkPoll.vue | 10 +++--- packages/frontend/src/components/MkPollEditor.vue | 6 ++-- packages/frontend/src/components/MkPostForm.vue | 30 ++++++++-------- .../frontend/src/components/MkPostFormAttaches.vue | 4 +-- .../components/MkPushNotificationAllowButton.vue | 8 ++--- packages/frontend/src/components/MkRange.vue | 2 +- .../frontend/src/components/MkReactionEffect.vue | 2 +- .../src/components/MkReactionsViewer.details.vue | 2 +- .../src/components/MkReactionsViewer.reaction.vue | 12 +++---- .../frontend/src/components/MkReactionsViewer.vue | 2 +- .../frontend/src/components/MkRemoteCaution.vue | 2 +- .../frontend/src/components/MkRetentionHeatmap.vue | 10 +++--- .../src/components/MkRetentionLineChart.vue | 12 +++---- .../frontend/src/components/MkRippleEffect.vue | 2 +- packages/frontend/src/components/MkRolePreview.vue | 2 +- packages/frontend/src/components/MkSelect.vue | 6 ++-- packages/frontend/src/components/MkSignin.vue | 10 +++--- .../frontend/src/components/MkSigninDialog.vue | 2 +- .../src/components/MkSignupDialog.form.vue | 10 +++--- .../MkSignupDialog.rules.stories.impl.ts | 4 +-- .../src/components/MkSignupDialog.rules.vue | 6 ++-- .../frontend/src/components/MkSignupDialog.vue | 4 +-- .../frontend/src/components/MkSubNoteContent.vue | 6 ++-- .../frontend/src/components/MkSwitch.button.vue | 2 +- packages/frontend/src/components/MkTextarea.vue | 2 +- packages/frontend/src/components/MkTimeline.vue | 8 ++--- packages/frontend/src/components/MkToast.vue | 4 +-- .../src/components/MkTokenGenerateWindow.vue | 2 +- packages/frontend/src/components/MkTooltip.vue | 6 ++-- packages/frontend/src/components/MkUpdated.vue | 6 ++-- packages/frontend/src/components/MkUrlPreview.vue | 12 +++---- .../frontend/src/components/MkUrlPreviewPopup.vue | 4 +-- .../components/MkUserAnnouncementEditDialog.vue | 4 +-- .../frontend/src/components/MkUserCardMini.vue | 4 +-- packages/frontend/src/components/MkUserInfo.vue | 10 +++--- packages/frontend/src/components/MkUserList.vue | 4 +-- .../src/components/MkUserOnlineIndicator.vue | 2 +- packages/frontend/src/components/MkUserPopup.vue | 16 ++++----- .../frontend/src/components/MkUserSelectDialog.vue | 10 +++--- .../src/components/MkUserSetupDialog.Follow.vue | 8 ++--- .../src/components/MkUserSetupDialog.Privacy.vue | 8 ++--- .../src/components/MkUserSetupDialog.Profile.vue | 10 +++--- .../src/components/MkUserSetupDialog.User.vue | 6 ++-- .../frontend/src/components/MkUserSetupDialog.vue | 10 +++--- .../frontend/src/components/MkVisibilityPicker.vue | 2 +- .../MkVisitorDashboard.ActiveUsersChart.vue | 10 +++--- .../frontend/src/components/MkVisitorDashboard.vue | 10 +++--- packages/frontend/src/components/MkWidgets.vue | 4 +-- packages/frontend/src/components/MkWindow.vue | 8 ++--- .../frontend/src/components/MkYouTubePlayer.vue | 4 +-- packages/frontend/src/components/form/suspense.vue | 4 +-- .../src/components/global/MkA.stories.impl.ts | 2 +- packages/frontend/src/components/global/MkA.vue | 12 +++---- packages/frontend/src/components/global/MkAcct.vue | 4 +-- .../src/components/global/MkAd.stories.impl.ts | 2 +- packages/frontend/src/components/global/MkAd.vue | 12 +++---- .../frontend/src/components/global/MkAvatar.vue | 8 ++--- .../src/components/global/MkCustomEmoji.vue | 6 ++-- .../frontend/src/components/global/MkEmoji.vue | 6 ++-- .../frontend/src/components/global/MkError.vue | 6 ++-- .../components/global/MkMisskeyFlavoredMarkdown.ts | 4 +-- .../src/components/global/MkPageHeader.tabs.vue | 2 +- .../src/components/global/MkPageHeader.vue | 6 ++-- .../frontend/src/components/global/MkSpacer.vue | 2 +- .../src/components/global/MkTime.stories.impl.ts | 4 +-- packages/frontend/src/components/global/MkTime.vue | 4 +-- packages/frontend/src/components/global/MkUrl.vue | 8 ++--- .../frontend/src/components/global/RouterView.vue | 2 +- .../frontend/src/components/page/page.note.vue | 2 +- .../frontend/src/components/page/page.text.vue | 4 +-- packages/frontend/src/config.ts | 2 +- packages/frontend/src/custom-emojis.ts | 6 ++-- packages/frontend/src/directives/click-anime.ts | 2 +- packages/frontend/src/directives/follow-append.ts | 2 +- packages/frontend/src/directives/ripple.ts | 2 +- packages/frontend/src/directives/tooltip.ts | 4 +-- packages/frontend/src/directives/user-preview.ts | 2 +- packages/frontend/src/filters/date.ts | 2 +- packages/frontend/src/filters/number.ts | 2 +- packages/frontend/src/filters/user.ts | 2 +- packages/frontend/src/i18n.ts | 6 ++-- packages/frontend/src/instance.ts | 6 ++-- packages/frontend/src/navbar.ts | 16 ++++----- packages/frontend/src/nirax.ts | 2 +- packages/frontend/src/os.ts | 10 +++--- packages/frontend/src/pages/_error_.vue | 16 ++++----- packages/frontend/src/pages/about-misskey.vue | 16 ++++----- packages/frontend/src/pages/about.emojis.vue | 6 ++-- packages/frontend/src/pages/about.federation.vue | 2 +- packages/frontend/src/pages/about.vue | 14 ++++---- packages/frontend/src/pages/achievements.vue | 8 ++--- packages/frontend/src/pages/admin-file.vue | 10 +++--- packages/frontend/src/pages/admin-user.vue | 12 +++---- .../src/pages/admin/RolesEditorFormula.vue | 4 +-- packages/frontend/src/pages/admin/_header_.vue | 6 ++-- packages/frontend/src/pages/admin/abuses.vue | 4 +-- packages/frontend/src/pages/admin/ads.vue | 6 ++-- .../frontend/src/pages/admin/announcements.vue | 6 ++-- .../frontend/src/pages/admin/bot-protection.vue | 6 ++-- packages/frontend/src/pages/admin/branding.vue | 10 +++--- packages/frontend/src/pages/admin/database.vue | 10 +++--- .../frontend/src/pages/admin/email-settings.vue | 8 ++--- packages/frontend/src/pages/admin/federation.vue | 4 +-- packages/frontend/src/pages/admin/files.vue | 6 ++-- packages/frontend/src/pages/admin/index.vue | 12 +++---- .../frontend/src/pages/admin/instance-block.vue | 8 ++--- packages/frontend/src/pages/admin/invites.vue | 6 ++-- packages/frontend/src/pages/admin/moderation.vue | 8 ++--- .../frontend/src/pages/admin/object-storage.vue | 8 ++--- .../frontend/src/pages/admin/other-settings.vue | 8 ++--- .../src/pages/admin/overview.active-users.vue | 10 +++--- .../src/pages/admin/overview.ap-requests.vue | 12 +++---- .../src/pages/admin/overview.federation.vue | 8 ++--- .../src/pages/admin/overview.instances.vue | 6 ++-- .../src/pages/admin/overview.moderators.vue | 4 +-- packages/frontend/src/pages/admin/overview.pie.vue | 4 +-- .../src/pages/admin/overview.queue.chart.vue | 10 +++--- .../frontend/src/pages/admin/overview.queue.vue | 4 +-- .../frontend/src/pages/admin/overview.stats.vue | 8 ++--- .../frontend/src/pages/admin/overview.users.vue | 6 ++-- packages/frontend/src/pages/admin/overview.vue | 8 ++--- .../frontend/src/pages/admin/proxy-account.vue | 8 ++--- .../frontend/src/pages/admin/queue.chart.chart.vue | 10 +++--- packages/frontend/src/pages/admin/queue.chart.vue | 8 ++--- packages/frontend/src/pages/admin/queue.vue | 8 ++--- packages/frontend/src/pages/admin/relays.vue | 6 ++-- packages/frontend/src/pages/admin/roles.edit.vue | 8 ++--- packages/frontend/src/pages/admin/roles.editor.vue | 6 ++-- packages/frontend/src/pages/admin/roles.role.vue | 10 +++--- packages/frontend/src/pages/admin/roles.vue | 10 +++--- packages/frontend/src/pages/admin/security.vue | 8 ++--- packages/frontend/src/pages/admin/server-rules.vue | 8 ++--- packages/frontend/src/pages/admin/settings.vue | 8 ++--- packages/frontend/src/pages/admin/users.vue | 10 +++--- packages/frontend/src/pages/ads.vue | 8 ++--- packages/frontend/src/pages/announcements.vue | 8 ++--- packages/frontend/src/pages/antenna-timeline.vue | 10 +++--- packages/frontend/src/pages/api-console.vue | 4 +-- packages/frontend/src/pages/auth.form.vue | 4 +-- packages/frontend/src/pages/auth.vue | 8 ++--- packages/frontend/src/pages/channel-editor.vue | 10 +++--- packages/frontend/src/pages/channel.vue | 16 ++++----- packages/frontend/src/pages/channels.vue | 6 ++-- packages/frontend/src/pages/clicker.vue | 2 +- packages/frontend/src/pages/clip.vue | 10 +++--- .../frontend/src/pages/custom-emojis-manager.vue | 8 ++--- packages/frontend/src/pages/drive.vue | 4 +-- packages/frontend/src/pages/emoji-edit-dialog.vue | 8 ++--- packages/frontend/src/pages/emojis.emoji.vue | 6 ++-- packages/frontend/src/pages/explore.featured.vue | 2 +- packages/frontend/src/pages/explore.roles.vue | 2 +- packages/frontend/src/pages/explore.users.vue | 4 +-- packages/frontend/src/pages/explore.vue | 4 +-- packages/frontend/src/pages/favorites.vue | 6 ++-- packages/frontend/src/pages/flash/flash-edit.vue | 8 ++--- packages/frontend/src/pages/flash/flash-index.vue | 6 ++-- packages/frontend/src/pages/flash/flash.vue | 16 ++++----- packages/frontend/src/pages/follow-requests.vue | 10 +++--- packages/frontend/src/pages/follow.vue | 6 ++-- packages/frontend/src/pages/gallery/edit.vue | 10 +++--- packages/frontend/src/pages/gallery/index.vue | 6 ++-- packages/frontend/src/pages/gallery/post.vue | 14 ++++---- packages/frontend/src/pages/instance-info.vue | 14 ++++---- packages/frontend/src/pages/invite.vue | 10 +++--- packages/frontend/src/pages/list.vue | 10 +++--- packages/frontend/src/pages/miauth.vue | 8 ++--- packages/frontend/src/pages/my-antennas/create.vue | 6 ++-- packages/frontend/src/pages/my-antennas/edit.vue | 8 ++--- packages/frontend/src/pages/my-antennas/editor.vue | 4 +-- packages/frontend/src/pages/my-antennas/index.vue | 6 ++-- packages/frontend/src/pages/my-clips/index.vue | 6 ++-- packages/frontend/src/pages/my-lists/index.vue | 10 +++--- packages/frontend/src/pages/my-lists/list.vue | 14 ++++---- packages/frontend/src/pages/not-found.vue | 8 ++--- packages/frontend/src/pages/note.vue | 10 +++--- packages/frontend/src/pages/notifications.vue | 6 ++-- packages/frontend/src/pages/oauth.vue | 6 ++-- .../pages/page-editor/els/page-editor.el.image.vue | 4 +-- .../pages/page-editor/els/page-editor.el.note.vue | 4 +-- .../page-editor/els/page-editor.el.section.vue | 6 ++-- .../pages/page-editor/els/page-editor.el.text.vue | 2 +- .../pages/page-editor/page-editor.container.vue | 2 +- .../frontend/src/pages/page-editor/page-editor.vue | 14 ++++---- packages/frontend/src/pages/page.vue | 14 ++++---- packages/frontend/src/pages/pages.vue | 6 ++-- packages/frontend/src/pages/registry.keys.vue | 6 ++-- packages/frontend/src/pages/registry.value.vue | 6 ++-- packages/frontend/src/pages/registry.vue | 6 ++-- packages/frontend/src/pages/reset-password.vue | 8 ++--- packages/frontend/src/pages/role.vue | 10 +++--- packages/frontend/src/pages/scratchpad.vue | 16 ++++----- packages/frontend/src/pages/search.note.vue | 10 +++--- packages/frontend/src/pages/search.user.vue | 10 +++--- packages/frontend/src/pages/search.vue | 10 +++--- .../frontend/src/pages/settings/2fa.qrdialog.vue | 6 ++-- packages/frontend/src/pages/settings/2fa.vue | 6 ++-- packages/frontend/src/pages/settings/accounts.vue | 8 ++--- packages/frontend/src/pages/settings/api.vue | 6 ++-- packages/frontend/src/pages/settings/apps.vue | 8 ++--- .../frontend/src/pages/settings/custom-css.vue | 10 +++--- packages/frontend/src/pages/settings/deck.vue | 6 ++-- .../frontend/src/pages/settings/drive-cleaner.vue | 12 +++---- packages/frontend/src/pages/settings/drive.vue | 12 +++---- packages/frontend/src/pages/settings/email.vue | 10 +++--- packages/frontend/src/pages/settings/general.vue | 16 ++++----- .../frontend/src/pages/settings/import-export.vue | 10 +++--- packages/frontend/src/pages/settings/index.vue | 18 +++++----- .../frontend/src/pages/settings/instance-mute.vue | 8 ++--- packages/frontend/src/pages/settings/migration.vue | 10 +++--- .../frontend/src/pages/settings/mute-block.vue | 10 +++--- packages/frontend/src/pages/settings/navbar.vue | 12 +++---- .../frontend/src/pages/settings/notifications.vue | 8 ++--- packages/frontend/src/pages/settings/other.vue | 12 +++---- .../frontend/src/pages/settings/plugin.install.vue | 10 +++--- packages/frontend/src/pages/settings/plugin.vue | 10 +++--- .../src/pages/settings/preferences-backups.vue | 18 +++++----- packages/frontend/src/pages/settings/privacy.vue | 10 +++--- packages/frontend/src/pages/settings/profile.vue | 16 ++++----- packages/frontend/src/pages/settings/reaction.vue | 10 +++--- packages/frontend/src/pages/settings/roles.vue | 10 +++--- packages/frontend/src/pages/settings/security.vue | 6 ++-- .../frontend/src/pages/settings/sounds.sound.vue | 4 +-- packages/frontend/src/pages/settings/sounds.vue | 6 ++-- .../src/pages/settings/statusbar.statusbar.vue | 6 ++-- packages/frontend/src/pages/settings/statusbar.vue | 8 ++--- .../frontend/src/pages/settings/theme.install.vue | 8 ++--- .../frontend/src/pages/settings/theme.manage.vue | 10 +++--- packages/frontend/src/pages/settings/theme.vue | 18 +++++----- .../frontend/src/pages/settings/webhook.edit.vue | 8 ++--- .../frontend/src/pages/settings/webhook.new.vue | 6 ++-- packages/frontend/src/pages/settings/webhook.vue | 4 +-- packages/frontend/src/pages/settings/word-mute.vue | 12 +++---- packages/frontend/src/pages/share.vue | 8 ++--- packages/frontend/src/pages/signup-complete.vue | 6 ++-- packages/frontend/src/pages/tag.vue | 10 +++--- packages/frontend/src/pages/theme-editor.vue | 16 ++++----- packages/frontend/src/pages/timeline.tutorial.vue | 8 ++--- packages/frontend/src/pages/timeline.vue | 16 ++++----- packages/frontend/src/pages/user-list-timeline.vue | 10 +++--- packages/frontend/src/pages/user-tag.vue | 4 +-- packages/frontend/src/pages/user/achievements.vue | 4 +-- .../frontend/src/pages/user/activity.following.vue | 12 +++---- .../frontend/src/pages/user/activity.heatmap.vue | 10 +++--- .../frontend/src/pages/user/activity.notes.vue | 12 +++---- packages/frontend/src/pages/user/activity.pv.vue | 12 +++---- packages/frontend/src/pages/user/followers.vue | 6 ++-- packages/frontend/src/pages/user/following.vue | 6 ++-- packages/frontend/src/pages/user/home.vue | 24 ++++++------- .../frontend/src/pages/user/index.activity.vue | 4 +-- packages/frontend/src/pages/user/index.photos.vue | 10 +++--- .../frontend/src/pages/user/index.timeline.vue | 2 +- packages/frontend/src/pages/user/index.vue | 10 +++--- packages/frontend/src/pages/welcome.entrance.a.vue | 10 +++--- packages/frontend/src/pages/welcome.setup.vue | 8 ++--- packages/frontend/src/pages/welcome.timeline.vue | 6 ++-- packages/frontend/src/pages/welcome.vue | 6 ++-- packages/frontend/src/pizzax.ts | 12 +++---- packages/frontend/src/plugin.ts | 6 ++-- packages/frontend/src/router.ts | 2 +- packages/frontend/src/scripts/achievements.ts | 4 +-- packages/frontend/src/scripts/aiscript/api.ts | 10 +++--- packages/frontend/src/scripts/api.ts | 4 +-- packages/frontend/src/scripts/array.ts | 2 +- packages/frontend/src/scripts/autocomplete.ts | 2 +- packages/frontend/src/scripts/clicker-game.ts | 2 +- packages/frontend/src/scripts/collapsed.ts | 2 +- packages/frontend/src/scripts/confetti.ts | 2 +- packages/frontend/src/scripts/device-kind.ts | 2 +- .../frontend/src/scripts/extract-url-from-mfm.ts | 2 +- packages/frontend/src/scripts/gen-search-query.ts | 2 +- .../frontend/src/scripts/get-account-from-id.ts | 2 +- .../frontend/src/scripts/get-drive-file-menu.ts | 10 +++--- packages/frontend/src/scripts/get-note-menu.ts | 18 +++++----- packages/frontend/src/scripts/get-note-summary.ts | 2 +- packages/frontend/src/scripts/get-user-menu.ts | 18 +++++----- packages/frontend/src/scripts/hotkey.ts | 2 +- packages/frontend/src/scripts/init-chart.ts | 2 +- packages/frontend/src/scripts/initialize-sw.ts | 2 +- packages/frontend/src/scripts/intl-const.ts | 2 +- packages/frontend/src/scripts/isFfVisibleForMe.ts | 2 +- packages/frontend/src/scripts/lookup-user.ts | 4 +-- packages/frontend/src/scripts/lookup.ts | 8 ++--- packages/frontend/src/scripts/media-proxy.ts | 6 ++-- packages/frontend/src/scripts/please-login.ts | 6 ++-- packages/frontend/src/scripts/popout.ts | 4 +-- packages/frontend/src/scripts/reaction-picker.ts | 2 +- packages/frontend/src/scripts/select-file.ts | 10 +++--- packages/frontend/src/scripts/show-moved-dialog.ts | 6 ++-- .../frontend/src/scripts/show-suspended-dialog.ts | 4 +-- packages/frontend/src/scripts/sound.ts | 2 +- packages/frontend/src/scripts/theme-editor.ts | 2 +- packages/frontend/src/scripts/theme.ts | 2 +- packages/frontend/src/scripts/touch.ts | 2 +- packages/frontend/src/scripts/upload.ts | 12 +++---- packages/frontend/src/scripts/use-chart-tooltip.ts | 2 +- packages/frontend/src/scripts/use-note-capture.ts | 4 +-- packages/frontend/src/store.ts | 2 +- packages/frontend/src/stream.ts | 4 +-- packages/frontend/src/theme-store.ts | 8 ++--- .../frontend/src/ui/_common_/announcements.vue | 2 +- packages/frontend/src/ui/_common_/common.ts | 10 +++--- packages/frontend/src/ui/_common_/common.vue | 14 ++++---- .../frontend/src/ui/_common_/navbar-for-mobile.vue | 10 +++--- packages/frontend/src/ui/_common_/navbar.vue | 10 +++--- .../src/ui/_common_/statusbar-federation.vue | 6 ++-- .../frontend/src/ui/_common_/statusbar-rss.vue | 4 +-- .../src/ui/_common_/statusbar-user-list.vue | 8 ++--- packages/frontend/src/ui/_common_/statusbars.vue | 2 +- .../frontend/src/ui/_common_/stream-indicator.vue | 8 ++--- packages/frontend/src/ui/_common_/sw-inject.ts | 10 +++--- packages/frontend/src/ui/_common_/upload.vue | 6 ++-- packages/frontend/src/ui/classic.header.vue | 10 +++--- packages/frontend/src/ui/classic.sidebar.vue | 20 +++++------ packages/frontend/src/ui/classic.vue | 16 ++++----- packages/frontend/src/ui/deck.vue | 20 +++++------ packages/frontend/src/ui/deck/antenna-column.vue | 6 ++-- packages/frontend/src/ui/deck/channel-column.vue | 6 ++-- packages/frontend/src/ui/deck/column.vue | 6 ++-- packages/frontend/src/ui/deck/deck-store.ts | 6 ++-- packages/frontend/src/ui/deck/direct-column.vue | 2 +- packages/frontend/src/ui/deck/list-column.vue | 4 +-- packages/frontend/src/ui/deck/main-column.vue | 12 +++---- packages/frontend/src/ui/deck/mentions-column.vue | 2 +- .../frontend/src/ui/deck/notifications-column.vue | 6 ++-- .../frontend/src/ui/deck/role-timeline-column.vue | 6 ++-- packages/frontend/src/ui/deck/tl-column.vue | 10 +++--- packages/frontend/src/ui/deck/widgets-column.vue | 4 +-- packages/frontend/src/ui/minimum.vue | 6 ++-- packages/frontend/src/ui/universal.vue | 24 ++++++------- packages/frontend/src/ui/universal.widgets.vue | 4 +-- packages/frontend/src/ui/visitor.vue | 14 ++++---- packages/frontend/src/ui/zen.vue | 8 ++--- packages/frontend/src/widgets/WidgetActivity.vue | 8 ++--- packages/frontend/src/widgets/WidgetAichan.vue | 2 +- packages/frontend/src/widgets/WidgetAiscript.vue | 10 +++--- .../frontend/src/widgets/WidgetAiscriptApp.vue | 10 +++--- packages/frontend/src/widgets/WidgetButton.vue | 8 ++--- packages/frontend/src/widgets/WidgetCalendar.vue | 6 ++-- packages/frontend/src/widgets/WidgetClicker.vue | 2 +- packages/frontend/src/widgets/WidgetClock.vue | 6 ++-- .../frontend/src/widgets/WidgetDigitalClock.vue | 4 +-- packages/frontend/src/widgets/WidgetFederation.vue | 12 +++---- .../frontend/src/widgets/WidgetInstanceCloud.vue | 8 ++--- .../frontend/src/widgets/WidgetInstanceInfo.vue | 6 ++-- packages/frontend/src/widgets/WidgetJobQueue.vue | 10 +++--- packages/frontend/src/widgets/WidgetMemo.vue | 6 ++-- .../frontend/src/widgets/WidgetNotifications.vue | 6 ++-- .../frontend/src/widgets/WidgetOnlineUsers.vue | 10 +++--- packages/frontend/src/widgets/WidgetPhotos.vue | 12 +++---- packages/frontend/src/widgets/WidgetPostForm.vue | 2 +- packages/frontend/src/widgets/WidgetProfile.vue | 6 ++-- packages/frontend/src/widgets/WidgetRss.vue | 10 +++--- packages/frontend/src/widgets/WidgetRssTicker.vue | 8 ++--- packages/frontend/src/widgets/WidgetSlideshow.vue | 8 ++--- packages/frontend/src/widgets/WidgetTimeline.vue | 10 +++--- packages/frontend/src/widgets/WidgetTrends.vue | 10 +++--- packages/frontend/src/widgets/WidgetUnixClock.vue | 2 +- packages/frontend/src/widgets/WidgetUserList.vue | 8 ++--- .../frontend/src/widgets/server-metric/disk.vue | 2 +- .../frontend/src/widgets/server-metric/index.vue | 8 ++--- .../frontend/src/widgets/server-metric/mem.vue | 2 +- .../frontend/src/widgets/server-metric/net.vue | 2 +- packages/frontend/src/widgets/widget.ts | 6 ++-- packages/frontend/test/init.ts | 2 +- packages/frontend/test/scroll.test.ts | 2 +- packages/frontend/tsconfig.json | 2 +- packages/sw/src/scripts/create-notification.ts | 10 +++--- packages/sw/src/scripts/lang.ts | 2 +- packages/sw/src/scripts/operations.ts | 4 +-- packages/sw/src/sw.ts | 6 ++-- 459 files changed, 1643 insertions(+), 1642 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/@types/theme.d.ts b/packages/frontend/@types/theme.d.ts index f4ba42b89d..376bbb0e9c 100644 --- a/packages/frontend/@types/theme.d.ts +++ b/packages/frontend/@types/theme.d.ts @@ -4,7 +4,7 @@ */ declare module '@/themes/*.json5' { - import { Theme } from '@/scripts/theme'; + import { Theme } from '@/scripts/theme.js'; const theme: Theme; diff --git a/packages/frontend/package.json b/packages/frontend/package.json index d38611c2fc..a89bd84ff0 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -1,6 +1,7 @@ { "name": "frontend", "private": true, + "type": "module", "scripts": { "watch": "vite", "build": "vite build", diff --git a/packages/frontend/src/_boot_.ts b/packages/frontend/src/_boot_.ts index a397e57ad3..efb78fe447 100644 --- a/packages/frontend/src/_boot_.ts +++ b/packages/frontend/src/_boot_.ts @@ -7,8 +7,8 @@ import 'vite/modulepreload-polyfill'; import '@/style.scss'; -import { mainBoot } from './boot/main-boot'; -import { subBoot } from './boot/sub-boot'; +import { mainBoot } from '@/boot/main-boot.js'; +import { subBoot } from '@/boot/sub-boot.js'; const subBootPaths = ['/share', '/auth', '/miauth', '/signup-complete']; diff --git a/packages/frontend/src/account.ts b/packages/frontend/src/account.ts index 43bda37b6c..0e4e4b50ff 100644 --- a/packages/frontend/src/account.ts +++ b/packages/frontend/src/account.ts @@ -5,14 +5,14 @@ import { defineAsyncComponent, reactive, ref } from 'vue'; import * as Misskey from 'misskey-js'; -import { showSuspendedDialog } from './scripts/show-suspended-dialog'; -import { i18n } from './i18n'; -import { miLocalStorage } from './local-storage'; -import { MenuButton } from './types/menu'; -import { del, get, set } from '@/scripts/idb-proxy'; -import { apiUrl } from '@/config'; -import { waiting, api, popup, popupMenu, success, alert } from '@/os'; -import { unisonReload, reloadChannel } from '@/scripts/unison-reload'; +import { showSuspendedDialog } from '@/scripts/show-suspended-dialog.js'; +import { i18n } from '@/i18n.js'; +import { miLocalStorage } from '@/local-storage.js'; +import { MenuButton } from '@/types/menu.js'; +import { del, get, set } from '@/scripts/idb-proxy.js'; +import { apiUrl } from '@/config.js'; +import { waiting, api, popup, popupMenu, success, alert } from '@/os.js'; +import { unisonReload, reloadChannel } from '@/scripts/unison-reload.js'; // TODO: 他のタブと永続化されたstateを同期 diff --git a/packages/frontend/src/boot/common.ts b/packages/frontend/src/boot/common.ts index 8f5de88ccd..2175bd1a7f 100644 --- a/packages/frontend/src/boot/common.ts +++ b/packages/frontend/src/boot/common.ts @@ -5,26 +5,26 @@ import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent, App } from 'vue'; import { compareVersions } from 'compare-versions'; -import widgets from '@/widgets'; -import directives from '@/directives'; -import components from '@/components'; -import { version, ui, lang, updateLocale } from '@/config'; -import { applyTheme } from '@/scripts/theme'; -import { isDeviceDarkmode } from '@/scripts/is-device-darkmode'; -import { i18n, updateI18n } from '@/i18n'; -import { confirm, alert, post, popup, toast } from '@/os'; -import { $i, refreshAccount, login, updateAccount, signout } from '@/account'; -import { defaultStore, ColdDeviceStorage } from '@/store'; -import { fetchInstance, instance } from '@/instance'; -import { deviceKind } from '@/scripts/device-kind'; -import { reloadChannel } from '@/scripts/unison-reload'; -import { reactionPicker } from '@/scripts/reaction-picker'; -import { getUrlWithoutLoginId } from '@/scripts/login-id'; -import { getAccountFromId } from '@/scripts/get-account-from-id'; -import { deckStore } from '@/ui/deck/deck-store'; -import { miLocalStorage } from '@/local-storage'; -import { fetchCustomEmojis } from '@/custom-emojis'; -import { mainRouter } from '@/router'; +import widgets from '@/widgets/index.js'; +import directives from '@/directives/index.js'; +import components from '@/components/index.js'; +import { version, ui, lang, updateLocale } from '@/config.js'; +import { applyTheme } from '@/scripts/theme.js'; +import { isDeviceDarkmode } from '@/scripts/is-device-darkmode.js'; +import { i18n, updateI18n } from '@/i18n.js'; +import { confirm, alert, post, popup, toast } from '@/os.js'; +import { $i, refreshAccount, login, updateAccount, signout } from '@/account.js'; +import { defaultStore, ColdDeviceStorage } from '@/store.js'; +import { fetchInstance, instance } from '@/instance.js'; +import { deviceKind } from '@/scripts/device-kind.js'; +import { reloadChannel } from '@/scripts/unison-reload.js'; +import { reactionPicker } from '@/scripts/reaction-picker.js'; +import { getUrlWithoutLoginId } from '@/scripts/login-id.js'; +import { getAccountFromId } from '@/scripts/get-account-from-id.js'; +import { deckStore } from '@/ui/deck/deck-store.js'; +import { miLocalStorage } from '@/local-storage.js'; +import { fetchCustomEmojis } from '@/custom-emojis.js'; +import { mainRouter } from '@/router.js'; export async function common(createVue: () => App) { console.info(`Misskey v${version}`); diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts index 9ab1f6e14c..f2af951d63 100644 --- a/packages/frontend/src/boot/main-boot.ts +++ b/packages/frontend/src/boot/main-boot.ts @@ -4,21 +4,21 @@ */ import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent } from 'vue'; -import { common } from './common'; -import { version, ui, lang, updateLocale } from '@/config'; -import { i18n, updateI18n } from '@/i18n'; -import { confirm, alert, post, popup, toast } from '@/os'; -import { useStream } from '@/stream'; -import * as sound from '@/scripts/sound'; -import { $i, refreshAccount, login, updateAccount, signout } from '@/account'; -import { defaultStore, ColdDeviceStorage } from '@/store'; -import { makeHotkey } from '@/scripts/hotkey'; -import { reactionPicker } from '@/scripts/reaction-picker'; -import { miLocalStorage } from '@/local-storage'; -import { claimAchievement, claimedAchievements } from '@/scripts/achievements'; -import { mainRouter } from '@/router'; -import { initializeSw } from '@/scripts/initialize-sw'; -import { deckStore } from '@/ui/deck/deck-store'; +import { common } from './common.js'; +import { version, ui, lang, updateLocale } from '@/config.js'; +import { i18n, updateI18n } from '@/i18n.js'; +import { confirm, alert, post, popup, toast } from '@/os.js'; +import { useStream } from '@/stream.js'; +import * as sound from '@/scripts/sound.js'; +import { $i, refreshAccount, login, updateAccount, signout } from '@/account.js'; +import { defaultStore, ColdDeviceStorage } from '@/store.js'; +import { makeHotkey } from '@/scripts/hotkey.js'; +import { reactionPicker } from '@/scripts/reaction-picker.js'; +import { miLocalStorage } from '@/local-storage.js'; +import { claimAchievement, claimedAchievements } from '@/scripts/achievements.js'; +import { mainRouter } from '@/router.js'; +import { initializeSw } from '@/scripts/initialize-sw.js'; +import { deckStore } from '@/ui/deck/deck-store.js'; export async function mainBoot() { const { isClientUpdated } = await common(() => createApp( diff --git a/packages/frontend/src/boot/sub-boot.ts b/packages/frontend/src/boot/sub-boot.ts index 2cc19f2df3..9b4670e130 100644 --- a/packages/frontend/src/boot/sub-boot.ts +++ b/packages/frontend/src/boot/sub-boot.ts @@ -4,7 +4,7 @@ */ import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent } from 'vue'; -import { common } from './common'; +import { common } from './common.js'; export async function subBoot() { const { isClientUpdated } = await common(() => createApp( diff --git a/packages/frontend/src/cache.ts b/packages/frontend/src/cache.ts index 1f3d28ba57..25d2b3c15f 100644 --- a/packages/frontend/src/cache.ts +++ b/packages/frontend/src/cache.ts @@ -4,8 +4,8 @@ */ import * as Misskey from 'misskey-js'; -import { Cache } from '@/scripts/cache'; -import { api } from '@/os'; +import { Cache } from '@/scripts/cache.js'; +import { api } from '@/os.js'; export const clipsCache = new Cache(1000 * 60 * 30, () => api('clips/list')); export const rolesCache = new Cache(1000 * 60 * 30, () => api('admin/roles/list')); diff --git a/packages/frontend/src/components/MkAbuseReport.vue b/packages/frontend/src/components/MkAbuseReport.vue index cb97875bcd..66114b8734 100644 --- a/packages/frontend/src/components/MkAbuseReport.vue +++ b/packages/frontend/src/components/MkAbuseReport.vue @@ -44,9 +44,9 @@ SPDX-License-Identifier: AGPL-3.0-only import MkButton from '@/components/MkButton.vue'; import MkSwitch from '@/components/MkSwitch.vue'; import MkKeyValue from '@/components/MkKeyValue.vue'; -import * as os from '@/os'; -import { i18n } from '@/i18n'; -import { dateString } from '@/filters/date'; +import * as os from '@/os.js'; +import { i18n } from '@/i18n.js'; +import { dateString } from '@/filters/date.js'; const props = defineProps<{ report: any; diff --git a/packages/frontend/src/components/MkAbuseReportWindow.vue b/packages/frontend/src/components/MkAbuseReportWindow.vue index 6e0dee6973..7814681ea2 100644 --- a/packages/frontend/src/components/MkAbuseReportWindow.vue +++ b/packages/frontend/src/components/MkAbuseReportWindow.vue @@ -35,8 +35,8 @@ import * as Misskey from 'misskey-js'; import MkWindow from '@/components/MkWindow.vue'; import MkTextarea from '@/components/MkTextarea.vue'; import MkButton from '@/components/MkButton.vue'; -import * as os from '@/os'; -import { i18n } from '@/i18n'; +import * as os from '@/os.js'; +import { i18n } from '@/i18n.js'; const props = defineProps<{ user: Misskey.entities.User; diff --git a/packages/frontend/src/components/MkAccountMoved.vue b/packages/frontend/src/components/MkAccountMoved.vue index e68efb1a3b..155d9fe3a9 100644 --- a/packages/frontend/src/components/MkAccountMoved.vue +++ b/packages/frontend/src/components/MkAccountMoved.vue @@ -15,9 +15,9 @@ SPDX-License-Identifier: AGPL-3.0-only import { ref } from 'vue'; import * as Misskey from 'misskey-js'; import MkMention from './MkMention.vue'; -import { i18n } from '@/i18n'; -import { host as localHost } from '@/config'; -import { api } from '@/os'; +import { i18n } from '@/i18n.js'; +import { host as localHost } from '@/config.js'; +import { api } from '@/os.js'; const user = ref(); diff --git a/packages/frontend/src/components/MkAchievements.stories.impl.ts b/packages/frontend/src/components/MkAchievements.stories.impl.ts index fd971e5ac6..a67e1def13 100644 --- a/packages/frontend/src/components/MkAchievements.stories.impl.ts +++ b/packages/frontend/src/components/MkAchievements.stories.impl.ts @@ -9,7 +9,7 @@ import { rest } from 'msw'; import { userDetailed } from '../../.storybook/fakes'; import { commonHandlers } from '../../.storybook/mocks'; import MkAchievements from './MkAchievements.vue'; -import { ACHIEVEMENT_TYPES } from '@/scripts/achievements'; +import { ACHIEVEMENT_TYPES } from '@/scripts/achievements.js'; export const Empty = { render(args) { return { diff --git a/packages/frontend/src/components/MkAchievements.vue b/packages/frontend/src/components/MkAchievements.vue index f9d62773f5..bea0ed26d8 100644 --- a/packages/frontend/src/components/MkAchievements.vue +++ b/packages/frontend/src/components/MkAchievements.vue @@ -54,9 +54,9 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/components/MkMiniChart.vue b/packages/frontend/src/components/MkMiniChart.vue index eee1e10399..8d2a147306 100644 --- a/packages/frontend/src/components/MkMiniChart.vue +++ b/packages/frontend/src/components/MkMiniChart.vue @@ -34,7 +34,7 @@ SPDX-License-Identifier: AGPL-3.0-only import { watch } from 'vue'; import { v4 as uuid } from 'uuid'; import tinycolor from 'tinycolor2'; -import { useInterval } from '@/scripts/use-interval'; +import { useInterval } from '@/scripts/use-interval.js'; const props = defineProps<{ src: number[]; diff --git a/packages/frontend/src/components/MkModal.vue b/packages/frontend/src/components/MkModal.vue index 4ba078d4eb..ec5039c504 100644 --- a/packages/frontend/src/components/MkModal.vue +++ b/packages/frontend/src/components/MkModal.vue @@ -43,10 +43,10 @@ SPDX-License-Identifier: AGPL-3.0-only