diff --git a/CHANGELOG.md b/CHANGELOG.md index 383af2bf02..3011627cef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +## 2025.12.1 + +### Client +- Fix: 特定の条件下でMisskeyが起動せず空白のページが表示されることがある問題を軽減 +- Fix: 初回読み込み時などに、言語設定で不整合が発生することがある問題を修正 +- Fix: 削除されたノートのリノートが正しく動作されない問題を修正 +- Fix: チャンネルオーナーが削除済みの時にチャンネルのヘッダーメニューが表示されない不具合を修正 +- Fix: ドライブで登録日以外でソートする場合は月でグループ化して表示しないように +- Fix: `null` を返す note_view_intrruptor プラグインが動作しない問題を修正 + +### Server +- Fix: ジョブキューでSentryが有効にならない問題を修正 + + ## 2025.12.0 ### Note diff --git a/compose.local-db.yml b/compose.local-db.yml index 4703b16fc5..2b69cabf5a 100644 --- a/compose.local-db.yml +++ b/compose.local-db.yml @@ -21,7 +21,7 @@ services: env_file: - .config/docker.env volumes: - - ./db:/var/lib/postgresql/data + - ./db:/var/lib/postgresql healthcheck: test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB" interval: 5s diff --git a/compose_example.yml b/compose_example.yml index 70de5bba7b..efc7d6624d 100644 --- a/compose_example.yml +++ b/compose_example.yml @@ -43,7 +43,7 @@ services: env_file: - .config/docker.env volumes: - - ./db:/var/lib/postgresql/data + - ./db:/var/lib/postgresql healthcheck: test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB" interval: 5s diff --git a/locales/de-DE.yml b/locales/de-DE.yml index ba7ca27e66..33e19f1cc1 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -83,6 +83,7 @@ files: "Dateien" download: "Herunterladen" driveFileDeleteConfirm: "Möchtest du die Datei „{name}“ wirklich löschen? Einige Inhalte, die diese Datei verwenden, werden auch verschwinden." unfollowConfirm: "Möchtest du {name} wirklich nicht mehr folgen?" +rejectFollowRequestConfirm: "Möchtest du die Follow-Anfrage von {name} ablehnen?" exportRequested: "Du hast einen Export angefragt. Dies kann etwas Zeit in Anspruch nehmen. Sobald der Export abgeschlossen ist, wird er deiner Drive hinzugefügt." importRequested: "Du hast einen Import angefragt. Dies kann etwas Zeit in Anspruch nehmen." lists: "Listen" @@ -1018,6 +1019,7 @@ pushNotificationAlreadySubscribed: "Push-Benachrichtigungen sind bereits aktivie pushNotificationNotSupported: "Entweder dein Browser oder deine Instanz unterstützt Push-Benachrichtigungen nicht" sendPushNotificationReadMessage: "Push-Benachrichtigungen löschen, sobald sie gelesen wurden" sendPushNotificationReadMessageCaption: "Dies kann gegebenenfalls den Batterieverbrauch deines Gerätes erhöhen." +pleaseAllowPushNotification: "Bitte erlauben Sie Benachrichtigungen in Ihrem Browser." windowMaximize: "Maximieren" windowMinimize: "Minimieren" windowRestore: "Wiederherstellen" @@ -1054,6 +1056,7 @@ permissionDeniedError: "Aktion verweigert" permissionDeniedErrorDescription: "Dieses Benutzerkonto besitzt nicht die Berechtigung, um diese Aktion auszuführen." preset: "Vorlage" selectFromPresets: "Aus Vorlagen wählen" +custom: "Benutzerdefiniert" achievements: "Errungenschaften" gotInvalidResponseError: "Ungültige Antwort des Servers" gotInvalidResponseErrorDescription: "Eventuell ist der Server momentan nicht erreichbar oder untergeht Wartungsarbeiten. Bitte versuche es später noch einmal." @@ -1243,6 +1246,7 @@ releaseToRefresh: "Zum Aktualisieren loslassen" refreshing: "Wird aktualisiert..." pullDownToRefresh: "Zum Aktualisieren ziehen" useGroupedNotifications: "Benachrichtigungen gruppieren" +emailVerificationFailedError: "Es gab ein Problem bei der Überprüfung Ihrer E-Mail-Adresse. Der Link ist möglicherweise abgelaufen." cwNotationRequired: "Ist \"Inhaltswarnung verwenden\" aktiviert, muss eine Beschreibung gegeben werden." doReaction: "Reagieren" code: "Code" @@ -1370,7 +1374,12 @@ defaultImageCompressionLevel: "Standard-Bildkomprimierungsstufe" defaultImageCompressionLevel_description: "Ein niedrigerer Wert erhält die Bildqualität, erhöht aber die Dateigröße.
Höhere Werte reduzieren die Dateigröße, verringern aber die Bildqualität." inMinutes: "Minute(n)" inDays: "Tag(en)" +safeModeEnabled: "Der abgesicherte Modus ist aktiviert." +schedule: "Planen" +scheduled: "Geplant" widgets: "Widgets" +deviceInfo: "Geräteinformation" +youAreAdmin: "Sie sind ein Administrator" presets: "Vorlage" _imageEditing: _vars: diff --git a/locales/en-US.yml b/locales/en-US.yml index fc979ef2b0..22e9d6eeb9 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -83,6 +83,8 @@ files: "Files" download: "Download" driveFileDeleteConfirm: "Are you sure you want to delete \"{name}\"? All notes with this file attached will also be deleted." unfollowConfirm: "Are you sure you want to unfollow {name}?" +cancelFollowRequestConfirm: "Are you sure that you want to cancel your follow request to {name}?" +rejectFollowRequestConfirm: "Are you sure that you want to reject the follow request from {name}?" exportRequested: "You've requested an export. This may take a while. It will be added to your Drive once completed." importRequested: "You've requested an import. This may take a while." lists: "Lists" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 259dcadd2c..dddfa4d57b 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -1252,7 +1252,7 @@ detachAll: "Quitar todo" angle: "Ángulo" flip: "Echar de un capirotazo" showAvatarDecorations: "Mostrar decoraciones de avatar" -releaseToRefresh: "Soltar para recargar" +releaseToRefresh: "Suelta para recargar" refreshing: "Recargando..." pullDownToRefresh: "Tira hacia abajo para recargar" useGroupedNotifications: "Mostrar notificaciones agrupadas" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index c5eb96fbb3..caae928605 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -53,7 +53,7 @@ copyRemoteLink: "复制远程链接" copyLinkRenote: "复制转帖链接" delete: "删除" deleteAndEdit: "删除并编辑" -deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。" +deleteAndEditConfirm: "要删除此帖并再次编辑吗?此帖下所有的回应、转发和回复也将被删除。" addToList: "添加至列表" addToAntenna: "添加到天线" sendMessage: "发送消息" @@ -136,7 +136,7 @@ emojiPicker: "表情符号选择器" pinnedEmojisForReactionSettingDescription: "可以设置发表回应时置顶显示的表情符号" pinnedEmojisSettingDescription: "可以设置输入表情符号时置顶显示的表情符号" emojiPickerDisplay: "选择器显示设置" -overwriteFromPinnedEmojisForReaction: "从「置顶(回应)」设置覆盖" +overwriteFromPinnedEmojisForReaction: "使用「置顶(回应)」设置覆盖" overwriteFromPinnedEmojis: "从全局设置覆盖" reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。" rememberNoteVisibility: "保存上次设置的可见性" @@ -153,8 +153,8 @@ block: "拉黑" unblock: "取消拉黑" suspend: "冻结" unsuspend: "解除冻结" -blockConfirm: "确定要拉黑吗?" -unblockConfirm: "确定要取消拉黑吗?" +blockConfirm: "确定要屏蔽吗?" +unblockConfirm: "确定要取消屏蔽吗?" suspendConfirm: "要冻结吗?" unsuspendConfirm: "要解除冻结吗?" selectList: "选择列表" @@ -174,7 +174,7 @@ emojiUrl: "emoji 地址" addEmoji: "添加表情符号" settingGuide: "推荐配置" cacheRemoteFiles: "缓存远程文件" -cacheRemoteFilesDescription: "启用此设定时,将在此服务器上缓存远程文件。虽然可以加快图片显示的速度,但是相对的会消耗大量的服务器存储空间。用户角色内的网盘容量决定了这个远程用户能在服务器上保留多少缓存。当超出了这个限制时,旧的文件将从缓存中被删除,成为链接。当禁用此设定时,则是从一开始就将远程文件保留为链接。此时推荐将 default.yml 的 proxyRemoteFiles 设置为 true 以优化缩略图生成及保护用户隐私。" +cacheRemoteFilesDescription: "启用此设定时,将在此服务器上缓存远程文件。虽然可以加快图片显示的速度,但是相对的会消耗大量的服务器存储空间。用户角色内的网盘容量决定了这个远程用户能在服务器上保留多少缓存。当超出了这个限制时,旧的文件将从缓存中被删除,成为链接。当禁用此设定时,则是从一开始就将远程文件保留为链接。此时推荐将 的 proxyRemoteFiles 设置为 true 以优化缩略图生成及保护用户隐私。" youCanCleanRemoteFilesCache: "可以使用文件管理的🗑️按钮来删除所有的缓存。" cacheRemoteSensitiveFiles: "缓存远程敏感媒体文件" cacheRemoteSensitiveFilesDescription: "如果禁用这项设定,远程服务器的敏感媒体将不会被缓存,而是直接链接。" @@ -184,7 +184,7 @@ flagAsCat: "喵!!!!!!!!!!!!" flagAsCatDescription: "喵喵喵??" flagShowTimelineReplies: "在时间线上显示帖子的回复" flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的帖子外,还会显示其他用户对帖子的回复。" -autoAcceptFollowed: "自动允许来自我关注的用户对我的关注请求" +autoAcceptFollowed: "自动允许回关请求" addAccount: "添加账户" reloadAccountsList: "更新账户列表" loginFailed: "登录失败" @@ -247,8 +247,8 @@ mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器, federationAllowedHosts: "允许联合的服务器" federationAllowedHostsDescription: "设定允许联合的服务器,以换行分隔。" muteAndBlock: "屏蔽/拉黑" -mutedUsers: "已屏蔽用户" -blockedUsers: "已拉黑的用户" +mutedUsers: "已静音的用户" +blockedUsers: "已屏蔽的用户" noUsers: "无用户" editProfile: "编辑资料" noteDeleteConfirm: "确定要删除该帖子吗?" @@ -1344,7 +1344,7 @@ skip: "跳过" restore: "恢复" syncBetweenDevices: "设备间同步" preferenceSyncConflictTitle: "服务器上已存在设定值" -preferenceSyncConflictText: "服务器上已有此设置的设定值。要覆盖哪个设定值?" +preferenceSyncConflictText: "即将保存设定值到服务器,但检测到服务器上已有此设置的设定值。要使用哪个设定值?" preferenceSyncConflictChoiceMerge: "合并" preferenceSyncConflictChoiceServer: "服务器上的设定值" preferenceSyncConflictChoiceDevice: "设备上的设定值" @@ -3270,7 +3270,7 @@ _watermarkEditor: driveFileTypeWarn: "不支持此文件" driveFileTypeWarnDescription: "请选择图像文件" title: "编辑水印" - cover: "覆盖全体" + cover: "覆盖所有" repeat: "平铺" preserveBoundingRect: "调整为旋转时不超出范围" opacity: "不透明度" diff --git a/package.json b/package.json index 40542046eb..65892bacd1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "2025.12.0", + "version": "2025.12.1", "codename": "nasubi", "repository": { "type": "git", @@ -60,8 +60,6 @@ "cssnano": "7.1.2", "esbuild": "0.27.0", "execa": "9.6.0", - "fast-glob": "3.3.3", - "glob": "13.0.0", "ignore-walk": "8.0.0", "js-yaml": "4.1.1", "postcss": "8.5.6", diff --git a/packages/backend/package.json b/packages/backend/package.json index 40aa2f82a2..f49acff701 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -75,7 +75,6 @@ "@aws-sdk/lib-storage": "3.940.0", "@discordapp/twemoji": "16.0.1", "@fastify/accepts": "5.0.3", - "@fastify/cookie": "11.0.2", "@fastify/cors": "11.1.0", "@fastify/express": "4.0.2", "@fastify/http-proxy": "11.3.0", @@ -107,7 +106,6 @@ "body-parser": "2.2.1", "bullmq": "5.65.0", "cacheable-lookup": "7.0.0", - "cbor": "10.0.11", "chalk": "5.6.2", "chalk-template": "1.1.2", "chokidar": "4.0.3", @@ -131,7 +129,6 @@ "is-svg": "6.1.0", "json5": "2.2.3", "jsonld": "9.0.0", - "jsrsasign": "11.1.0", "juice": "11.0.3", "meilisearch": "0.54.0", "mfm-js": "0.25.0", @@ -145,7 +142,6 @@ "node-html-parser": "7.0.1", "nodemailer": "7.0.11", "nsfwjs": "4.2.0", - "oauth": "0.10.2", "oauth2orize": "1.12.0", "oauth2orize-pkce": "0.1.2", "os-utils": "0.0.14", @@ -174,7 +170,6 @@ "tinycolor2": "1.6.0", "tmp": "0.2.5", "tsc-alias": "1.8.16", - "tsconfig-paths": "4.2.0", "typeorm": "0.3.27", "typescript": "5.9.3", "ulid": "3.0.1", @@ -199,12 +194,10 @@ "@types/http-link-header": "1.0.7", "@types/jest": "29.5.14", "@types/jsonld": "1.5.15", - "@types/jsrsasign": "10.5.15", "@types/mime-types": "3.0.1", "@types/ms": "2.1.0", "@types/node": "24.10.1", "@types/nodemailer": "7.0.4", - "@types/oauth": "0.9.6", "@types/oauth2orize": "1.11.5", "@types/oauth2orize-pkce": "0.1.2", "@types/pg": "8.15.6", @@ -225,13 +218,13 @@ "@typescript-eslint/eslint-plugin": "8.48.0", "@typescript-eslint/parser": "8.48.0", "aws-sdk-client-mock": "4.1.0", + "cbor": "10.0.11", "cross-env": "10.1.0", "eslint-plugin-import": "2.32.0", "execa": "9.6.0", "fkill": "10.0.1", "jest": "29.7.0", "jest-mock": "29.7.0", - "jest-util": "29.7.0", "js-yaml": "4.1.1", "nodemon": "3.1.11", "pid-port": "2.0.0", diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index 306fdb41f6..2b3b3fc0ad 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -157,7 +157,7 @@ export class QueueProcessorService implements OnApplicationShutdown { } let Sentry: typeof import('@sentry/node') | undefined; - if (Sentry != null) { + if (this.config.sentryForBackend) { import('@sentry/node').then((mod) => { Sentry = mod; }); diff --git a/packages/backend/test-federation/compose.a.yml b/packages/backend/test-federation/compose.a.yml index 4fd4eb3851..ec9a2cf2af 100644 --- a/packages/backend/test-federation/compose.a.yml +++ b/packages/backend/test-federation/compose.a.yml @@ -50,7 +50,7 @@ services: volumes: - type: bind source: ./volumes/db.a - target: /var/lib/postgresql/data + target: /var/lib/postgresql bind: create_host_path: true diff --git a/packages/backend/test-federation/compose.b.yml b/packages/backend/test-federation/compose.b.yml index 753da22822..9221934406 100644 --- a/packages/backend/test-federation/compose.b.yml +++ b/packages/backend/test-federation/compose.b.yml @@ -50,7 +50,7 @@ services: volumes: - type: bind source: ./volumes/db.b - target: /var/lib/postgresql/data + target: /var/lib/postgresql bind: create_host_path: true diff --git a/packages/frontend-embed/package.json b/packages/frontend-embed/package.json index 6122f2cab6..e82cdc1f27 100644 --- a/packages/frontend-embed/package.json +++ b/packages/frontend-embed/package.json @@ -17,8 +17,6 @@ "@rollup/pluginutils": "5.3.0", "@twemoji/parser": "16.0.0", "@vitejs/plugin-vue": "6.0.2", - "@vue/compiler-sfc": "3.5.25", - "astring": "1.9.0", "buraha": "0.0.1", "estree-walker": "3.0.3", "frontend-shared": "workspace:*", @@ -31,9 +29,6 @@ "sass": "1.94.2", "shiki": "3.17.0", "tinycolor2": "1.6.0", - "tsc-alias": "1.8.16", - "tsconfig-paths": "4.2.0", - "typescript": "5.9.3", "uuid": "13.0.0", "vite": "7.2.4", "vue": "3.5.25" @@ -56,7 +51,6 @@ "cross-env": "10.1.0", "eslint-plugin-import": "2.32.0", "eslint-plugin-vue": "10.6.2", - "fast-glob": "3.3.3", "happy-dom": "20.0.11", "intersection-observer": "0.12.2", "micromatch": "4.0.8", @@ -65,6 +59,7 @@ "prettier": "3.7.1", "start-server-and-test": "2.1.3", "tsx": "4.20.6", + "typescript": "5.9.3", "vite-plugin-turbosnap": "1.0.3", "vue-component-type-helpers": "3.1.5", "vue-eslint-parser": "10.2.0", diff --git a/packages/frontend-embed/public/loader/boot.js b/packages/frontend-embed/public/loader/boot.js index ba6366b3db..9b3d27873b 100644 --- a/packages/frontend-embed/public/loader/boot.js +++ b/packages/frontend-embed/public/loader/boot.js @@ -70,6 +70,8 @@ importAppScript(); }); } + + localStorage.setItem('lang', lang); //#endregion async function addStyle(styleText) { diff --git a/packages/frontend-shared/build.js b/packages/frontend-shared/build.js index 9941114757..07e98ad182 100644 --- a/packages/frontend-shared/build.js +++ b/packages/frontend-shared/build.js @@ -3,14 +3,13 @@ import { fileURLToPath } from 'node:url'; import { dirname } from 'node:path'; import * as esbuild from 'esbuild'; import { build } from 'esbuild'; -import { globSync } from 'glob'; import { execa } from 'execa'; const _filename = fileURLToPath(import.meta.url); const _dirname = dirname(_filename); const _package = JSON.parse(fs.readFileSync(_dirname + '/package.json', 'utf-8')); -const entryPoints = globSync('./js/**/**.{ts,tsx}'); +const entryPoints = fs.globSync('./js/**/**.{ts,tsx}'); /** @type {import('esbuild').BuildOptions} */ const options = { diff --git a/packages/frontend/.storybook/generate.tsx b/packages/frontend/.storybook/generate.tsx index 89d4214141..6005049dde 100644 --- a/packages/frontend/.storybook/generate.tsx +++ b/packages/frontend/.storybook/generate.tsx @@ -3,12 +3,11 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { existsSync, readFileSync } from 'node:fs'; +import { existsSync, readFileSync, globSync } from 'node:fs'; import { writeFile } from 'node:fs/promises'; import { basename, dirname } from 'node:path/posix'; import { GENERATOR, type State, generate } from 'astring'; import type * as estree from 'estree'; -import glob from 'fast-glob'; import { format } from 'prettier'; interface SatisfiesExpression extends estree.BaseExpression { @@ -439,38 +438,37 @@ function toStories(component: string): Promise { // glob('src/{components,pages,ui,widgets}/**/*.vue') (async () => { - const globs = await Promise.all([ - glob('src/components/global/Mk*.vue'), - glob('src/components/global/RouterView.vue'), - glob('src/components/MkAbuseReportWindow.vue'), - glob('src/components/MkAccountMoved.vue'), - glob('src/components/MkAchievements.vue'), - glob('src/components/MkAnalogClock.vue'), - glob('src/components/MkAnimBg.vue'), - glob('src/components/MkAnnouncementDialog.vue'), - glob('src/components/MkAntennaEditor.vue'), - glob('src/components/MkAntennaEditorDialog.vue'), - glob('src/components/MkAsUi.vue'), - glob('src/components/MkAutocomplete.vue'), - glob('src/components/MkAvatars.vue'), - glob('src/components/Mk[B-E]*.vue'), - glob('src/components/MkFlashPreview.vue'), - glob('src/components/MkGalleryPostPreview.vue'), - glob('src/components/MkSignupServerRules.vue'), - glob('src/components/MkUserSetupDialog.vue'), - glob('src/components/MkUserSetupDialog.*.vue'), - glob('src/components/MkImgPreviewDialog.vue'), - glob('src/components/MkInstanceCardMini.vue'), - glob('src/components/MkInviteCode.vue'), - glob('src/components/MkTagItem.vue'), - glob('src/components/MkRoleSelectDialog.vue'), - glob('src/components/grid/MkGrid.vue'), - glob('src/pages/admin/custom-emojis-manager2.vue'), - glob('src/pages/admin/overview.ap-requests.vue'), - glob('src/pages/user/home.vue'), - glob('src/pages/search.vue'), - ]); - const components = globs.flat(); + const components = [ + globSync('src/components/global/Mk*.vue'), + globSync('src/components/global/RouterView.vue'), + globSync('src/components/MkAbuseReportWindow.vue'), + globSync('src/components/MkAccountMoved.vue'), + globSync('src/components/MkAchievements.vue'), + globSync('src/components/MkAnalogClock.vue'), + globSync('src/components/MkAnimBg.vue'), + globSync('src/components/MkAnnouncementDialog.vue'), + globSync('src/components/MkAntennaEditor.vue'), + globSync('src/components/MkAntennaEditorDialog.vue'), + globSync('src/components/MkAsUi.vue'), + globSync('src/components/MkAutocomplete.vue'), + globSync('src/components/MkAvatars.vue'), + globSync('src/components/Mk[B-E]*.vue'), + globSync('src/components/MkFlashPreview.vue'), + globSync('src/components/MkGalleryPostPreview.vue'), + globSync('src/components/MkSignupServerRules.vue'), + globSync('src/components/MkUserSetupDialog.vue'), + globSync('src/components/MkUserSetupDialog.*.vue'), + globSync('src/components/MkImgPreviewDialog.vue'), + globSync('src/components/MkInstanceCardMini.vue'), + globSync('src/components/MkInviteCode.vue'), + globSync('src/components/MkTagItem.vue'), + globSync('src/components/MkRoleSelectDialog.vue'), + globSync('src/components/grid/MkGrid.vue'), + globSync('src/pages/admin/custom-emojis-manager2.vue'), + globSync('src/pages/admin/overview.ap-requests.vue'), + globSync('src/pages/user/home.vue'), + globSync('src/pages/search.vue'), + ].flat(); await Promise.all(components.map(async (component) => { const stories = component.replace(/\.vue$/, '.stories.ts'); await writeFile(stories, await toStories(component)); diff --git a/packages/frontend/lib/vite-plugin-create-search-index.ts b/packages/frontend/lib/vite-plugin-create-search-index.ts index f17b43b0e3..cfbba0823c 100644 --- a/packages/frontend/lib/vite-plugin-create-search-index.ts +++ b/packages/frontend/lib/vite-plugin-create-search-index.ts @@ -16,7 +16,6 @@ import { type PluginOption } from 'vite'; import fs from 'node:fs'; -import { glob } from 'glob'; import JSON5 from 'json5'; import MagicString, { SourceMap } from 'magic-string'; import path from 'node:path' @@ -724,7 +723,7 @@ export function pluginCreateSearchIndexVirtualModule(options: Options, asigner: async load(id) { if (id == '\0' + allSearchIndexFile) { - const files = await Promise.all(options.targetFilePaths.map(async (filePathPattern) => await glob(filePathPattern))).then(paths => paths.flat()); + const files = options.targetFilePaths.map((filePathPattern) => fs.globSync(filePathPattern)).flat(); let generatedFile = ''; let arrayElements = ''; for (let file of files) { diff --git a/packages/frontend/package.json b/packages/frontend/package.json index c9d49201c4..68dc5bd656 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -30,10 +30,8 @@ "@syuilo/aiscript-0-19-0": "npm:@syuilo/aiscript@^0.19.0", "@twemoji/parser": "16.0.0", "@vitejs/plugin-vue": "6.0.2", - "@vue/compiler-sfc": "3.5.25", "aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.15", "analytics": "0.8.19", - "astring": "1.9.0", "broadcast-channel": "7.2.0", "buraha": "0.0.1", "canvas-confetti": "1.9.4", @@ -46,7 +44,6 @@ "compare-versions": "6.1.1", "cropperjs": "2.1.0", "date-fns": "4.1.0", - "estree-walker": "3.0.3", "eventemitter3": "5.0.1", "execa": "9.6.0", "exifreader": "4.32.0", @@ -57,7 +54,6 @@ "ios-haptics": "0.1.4", "is-file-animated": "1.0.2", "json5": "2.2.3", - "magic-string": "0.30.21", "matter-js": "0.20.0", "mediabunny": "1.25.3", "mfm-js": "0.25.0", @@ -72,14 +68,10 @@ "sanitize-html": "2.17.0", "sass": "1.94.2", "shiki": "3.17.0", - "strict-event-emitter-types": "2.0.0", "textarea-caret": "3.1.0", "three": "0.181.2", "throttle-debounce": "5.0.2", "tinycolor2": "1.6.0", - "tsc-alias": "1.8.16", - "tsconfig-paths": "4.2.0", - "typescript": "5.9.3", "v-code-diff": "1.13.1", "vite": "7.2.4", "vue": "3.5.25", @@ -117,20 +109,20 @@ "@types/seedrandom": "3.0.8", "@types/throttle-debounce": "5.0.2", "@types/tinycolor2": "1.4.6", - "@types/ws": "8.18.1", "@typescript-eslint/eslint-plugin": "8.48.0", "@typescript-eslint/parser": "8.48.0", "@vitest/coverage-v8": "4.0.14", "@vue/compiler-core": "3.5.25", - "@vue/runtime-core": "3.5.25", "acorn": "8.15.0", + "astring": "1.9.0", "cross-env": "10.1.0", "cypress": "15.7.0", "eslint-plugin-import": "2.32.0", "eslint-plugin-vue": "10.6.2", - "fast-glob": "3.3.3", + "estree-walker": "3.0.3", "happy-dom": "20.0.11", "intersection-observer": "0.12.2", + "magic-string": "0.30.21", "micromatch": "4.0.8", "minimatch": "10.1.1", "msw": "2.12.3", @@ -144,6 +136,7 @@ "storybook": "10.1.0", "storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme", "tsx": "4.20.6", + "typescript": "5.9.3", "vite-plugin-glsl": "1.5.4", "vite-plugin-turbosnap": "1.0.3", "vitest": "4.0.14", diff --git a/packages/frontend/public/loader/boot.js b/packages/frontend/public/loader/boot.js index ab4b158287..8aafb282aa 100644 --- a/packages/frontend/public/loader/boot.js +++ b/packages/frontend/public/loader/boot.js @@ -42,6 +42,8 @@ console.error('invalid lang value detected!!!', typeof lang, lang); lang = 'en-US'; } + + localStorage.setItem('lang', lang); //#endregion //#region Script diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue index b84532b40b..d8c949d8eb 100644 --- a/packages/frontend/src/components/MkDrive.vue +++ b/packages/frontend/src/components/MkDrive.vue @@ -83,34 +83,58 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.loadMore }} - - + + + + - - - - {{ i18n.ts.loadMore }}
@@ -217,6 +241,7 @@ const foldersPaginator = markRaw(new Paginator('drive/folders', { })); const filesTimeline = makeDateGroupedTimelineComputedRef(filesPaginator.items, 'month'); +const shouldBeGroupedByDate = computed(() => ['+createdAt', '-createdAt'].includes(sortModeSelect.value)); watch(folder, () => emit('cd', folder.value)); watch(sortModeSelect, () => { diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 1b0f25a1a2..a7299d2961 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only