From ea954bdf4c0d034e60d2f0317df1ca75e55beae8 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 09:01:02 -0700 Subject: [PATCH 01/30] fix: :bug: natural PWA orientation fixes chrome mobile rotating screen even when device rotation is off --- packages/backend/src/server/web/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/web/manifest.json b/packages/backend/src/server/web/manifest.json index 291cfdccb0..cf5df281e0 100644 --- a/packages/backend/src/server/web/manifest.json +++ b/packages/backend/src/server/web/manifest.json @@ -7,7 +7,7 @@ "display": "standalone", "background_color": "#1f1d2e", "theme_color": "#31748f", - "orientation": "any", + "orientation": "natural", "icons": [ { "src": "/static-assets/icons/192.png", From d38f6b6649f504e619bf4efed7b9c717141bdd8a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 09:01:11 -0700 Subject: [PATCH 02/30] dev9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1de9039381..265904bf25 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firefish", - "version": "1.0.5-dev8", + "version": "1.0.5-dev9", "codename": "aqua", "repository": { "type": "git", From 45c5fa73ff5f0aa785c751dd4fdc097bf7e9270d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 09:57:38 -0700 Subject: [PATCH 03/30] fix: :lipstick: Announcement padding/margins --- packages/client/src/components/MkAnnouncement.vue | 10 ++++++---- packages/client/src/pages/announcements.vue | 12 ++++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/client/src/components/MkAnnouncement.vue b/packages/client/src/components/MkAnnouncement.vue index bd1091b7f2..700cb5e747 100644 --- a/packages/client/src/components/MkAnnouncement.vue +++ b/packages/client/src/components/MkAnnouncement.vue @@ -8,9 +8,11 @@
- {{ i18n.ts.updatedAt }}: - -
+ + {{ i18n.ts.updatedAt }}: + + +
{ } .gotIt { - margin: 8px 0 0 0; + margin: 1rem 0 1rem 2rem; } diff --git a/packages/client/src/pages/announcements.vue b/packages/client/src/pages/announcements.vue index 1830613644..bf4f099fc3 100644 --- a/packages/client/src/pages/announcements.vue +++ b/packages/client/src/pages/announcements.vue @@ -16,8 +16,12 @@ class="announcement _panel" >
- 🆕 -

{{ announcement.title }}

+

+ + 🆕  + + {{ announcement.title }} +

{{ i18n.ts.updatedAt }}: @@ -85,7 +89,7 @@ definePageMetadata({ } > ._title { - padding: 14px 32px !important; + padding: 0.5rem 2rem !important; } > ._seperator { @@ -93,7 +97,7 @@ definePageMetadata({ } > ._content { - padding: 2rem; + padding: 0 2rem !important; > img { display: block; From 684d4344ba21fb546e5ad4ecdc13055e925c0628 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Sat, 2 Sep 2023 17:00:02 +0000 Subject: [PATCH 04/30] perf: :zap: seperate web and queue workers Co-authored-by: Johann150 --- .config/example.yml | 10 ++++---- packages/backend/src/boot/index.ts | 7 ++++- packages/backend/src/boot/master.ts | 38 ++++++++++++++++++++-------- packages/backend/src/boot/worker.ts | 14 +++++++--- packages/backend/src/config/load.ts | 17 +++++++++++++ packages/backend/src/config/types.ts | 7 ++--- 6 files changed, 71 insertions(+), 22 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index c4c6340076..49922d65ae 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -143,11 +143,11 @@ reservedUsernames: [ # Whether disable HSTS #disableHsts: true -# Number of worker processes -#clusterLimit: 1 - -# Worker only mode -#onlyQueueProcessor: 1 +# Number of worker processes by type. +# The sum must not exceed the number of available cores. +#clusterLimits: +# web: 1 +# queue: 1 # Job concurrency per worker # deliverJobConcurrency: 128 diff --git a/packages/backend/src/boot/index.ts b/packages/backend/src/boot/index.ts index c78d888383..c09f3d2b37 100644 --- a/packages/backend/src/boot/index.ts +++ b/packages/backend/src/boot/index.ts @@ -19,7 +19,12 @@ const ev = new Xev(); * Init process */ export default async function () { - process.title = `Firefish (${cluster.isPrimary ? "master" : "worker"})`; + const mode = + process.env.mode && ["web", "queue"].includes(process.env.mode) + ? `(${process.env.mode})` + : ""; + const type = cluster.isPrimary ? "(master)" : "(worker)" + process.title = `Firefish ${mode} ${type}`; if (cluster.isPrimary || envOption.disableClustering) { await masterMain(); diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts index 1a40d0f3da..bdb528d2f0 100644 --- a/packages/backend/src/boot/master.ts +++ b/packages/backend/src/boot/master.ts @@ -111,7 +111,7 @@ export async function masterMain() { bootLogger.succ("Firefish initialized"); if (!envOption.disableClustering) { - await spawnWorkers(config.clusterLimit); + await spawnWorkers(config.clusterLimits); } bootLogger.succ( @@ -120,7 +120,11 @@ export async function masterMain() { true, ); - if (!envOption.noDaemons && !config.onlyQueueProcessor) { + if ( + !envOption.noDaemons && + config.clusterLimits?.web && + config.clusterLimits?.web >= 1 + ) { import("../daemons/server-stats.js").then((x) => x.default()); import("../daemons/queue-stats.js").then((x) => x.default()); import("../daemons/janitor.js").then((x) => x.default()); @@ -136,7 +140,7 @@ function showEnvironment(): void { if (env !== "production") { logger.warn("The environment is not in production mode."); - logger.warn("DO NOT USE FOR PRODUCTION PURPOSE!", null, true); + logger.warn("DO NOT USE THIS IN PRODUCTION!", null, true); } } @@ -194,19 +198,33 @@ async function connectDb(): Promise { } } -async function spawnWorkers(limit = 1) { - const workers = Math.min(limit, os.cpus().length); - bootLogger.info(`Starting ${workers} worker${workers === 1 ? "" : "s"}...`); - await Promise.all([...Array(workers)].map(spawnWorker)); +async function spawnWorkers( + clusterLimits: Required, +): Promise { + const modes = ["web", "queue"]; + const cpus = os.cpus().length; + for (const mode of modes.filter((mode) => clusterLimits[mode] > cpus)) { + bootLogger.warn( + `configuration warning: cluster limit for ${mode} exceeds number of cores (${cpus})`, + ); + } + + const total = modes.reduce((acc, mode) => acc + clusterLimits[mode], 0); + const workers = new Array(total); + workers.fill("web", 0, clusterLimits?.web); + workers.fill("queue", clusterLimits?.web); + + bootLogger.info(`Starting ${clusterLimits?.web} web workers and ${clusterLimits?.queue} queue workers (total ${total})...`); + await Promise.all(workers.map((mode) => spawnWorker(mode))); bootLogger.succ("All workers started"); } -function spawnWorker(): Promise { +function spawnWorker(mode: "web" | "queue"): Promise { return new Promise((res) => { - const worker = cluster.fork(); + const worker = cluster.fork({ mode }); worker.on("message", (message) => { if (message === "listenFailed") { - bootLogger.error("The server Listen failed due to the previous error."); + bootLogger.error("The server listen failed due to the previous error."); process.exit(1); } if (message !== "ready") return; diff --git a/packages/backend/src/boot/worker.ts b/packages/backend/src/boot/worker.ts index 052c7397f3..236621b010 100644 --- a/packages/backend/src/boot/worker.ts +++ b/packages/backend/src/boot/worker.ts @@ -1,6 +1,7 @@ import cluster from "node:cluster"; import { initDb } from "../db/postgre.js"; import config from "@/config/index.js"; +import os from "node:os"; /** * Init worker process @@ -8,13 +9,20 @@ import config from "@/config/index.js"; export async function workerMain() { await initDb(); - if (!config.onlyQueueProcessor) { + if (!process.env.mode || process.env.mode === "web") { // start server await import("../server/index.js").then((x) => x.default()); } - // start job queue - import("../queue/index.js").then((x) => x.default()); + if (!process.env.mode || process.env.mode === "queue") { + // start job queue + import("../queue/index.js").then((x) => x.default()); + + if (process.env.mode === "queue") { + // if this is an exclusive queue worker, renice to have higher priority + os.setPriority(os.constants.priority.PRIORITY_BELOW_NORMAL); + } + } if (cluster.isWorker) { // Send a 'ready' message to parent process diff --git a/packages/backend/src/config/load.ts b/packages/backend/src/config/load.ts index d8dea793e9..2ff3309264 100644 --- a/packages/backend/src/config/load.ts +++ b/packages/backend/src/config/load.ts @@ -59,6 +59,23 @@ export default function load() { if (config.cacheServer && !config.cacheServer.prefix) config.cacheServer.prefix = mixin.hostname; + if (!config.clusterLimits) { + config.clusterLimits = { + web: 1, + queue: 1, + }; + } else { + config.clusterLimits = { + web: 1, + queue: 1, + ...config.clusterLimits, + }; + + if (config.clusterLimits.web! < 1 || config.clusterLimits.queue! < 1) { + throw new Error("Invalid cluster limits"); + } + } + return Object.assign(config, mixin); } diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 52854db5a5..13d87fc19c 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -69,9 +69,10 @@ export type Source = { accesslog?: string; - clusterLimit?: number; - - onlyQueueProcessor?: boolean; + clusterLimits?: { + web?: number; + queue?: number; + }; cuid?: { length?: number; From 8765e705a370b3430717dc36ee7df1660d9eb2b8 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 10:04:21 -0700 Subject: [PATCH 05/30] feat: :bookmark: 1.0.4-beta2 --- CHANGELOG.md | 617 ++++++++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 585 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fe0aef118..a2a3252f5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [1.0.4-beta] - 2023-08-02 +## [1.0.4-beta2] - 2023-09-02 ### Bug Fixes @@ -16,8 +16,6 @@ - Fix: :bug: make admin users page properly direct user cards to about page -- Fix? - - Fix: :globe_with_meridians: copying origin: "remote" -> "origin" - Fix: :lipstick: don't round corners on status images/server icon @@ -106,23 +104,72 @@ Closes #10581 - Fix: :busts_in_silhouette: naskya is fullstack -- Fix Japanese locale +- Fix: :green_heart: Docker env for CI -### Documentation +- Fix: :green_heart: docker service alias -- Docs: :memo: repo move +- Fix: :lipstick: properly style announcement content, add seperator -- Docs: :memo: fix link +- Fix: generate stream id with timestamp -- Docs: :memo: 1.0.3 changelog +- Fix: add original id to the stream -- Docs: :memo: Add explicit FoundKey commits to CHANGELOG +- Fix: :bug: double-slash in proxy url -- Docs: :memo: AUR package +- Fix: :bug: null host meilisearch -- Docs: :memo: remove links to FIREFISH.md +- Fix: :globe_with_meridians: i18n key for "confirm" -Closes #10601 +- Fix: :bug: offline html responsive viewport + +- Fix: building re2 in Dockerfile + +- Fix: :children_crossing: make importing emoji packs clearer + +- Fix: updatePerson's Followings.update call not working if no sharedInbox +- Fix: :bug: double comma + +- Fix: :adhesive_bandage: add small and center to MFM tags list + +- Fix: veiry url + +- Fix: exclude localhost + +- Fix: exclude ula and lla + +- Fix: remove brackets + +- Fix: 🚑 thumbnail serving + +- Fix: change character limits to allow for long instance domains + +- Fix: :pencil2: "can not" -> "cannot" + +- Fix: :lock: cannot change note visibility + +- Fix: :bug: cannot quote own note + +- Fix: :bug: fix DNS lookup issue + +https://github.com/szmarczak/cacheable-lookup/pull/62 + +- Fix: :bug: caching wrong DNS entry when federating with an instance that cannot properly handle inbound IPv6 requests + +- Fix: remove native-utils from migration's dependencies + +- Fix: :recycle: Manifest (icons, name, orientation) + +Closes #10694 + +- Fix: :bug: unlock undefined + +- Fix: :bug: more strange unlock calls + +- Fix: :bug: natural PWA orientation + +fixes chrome mobile rotating screen even when device rotation is off + +- Fix: :lipstick: Announcement padding/margins ### Features @@ -149,6 +196,12 @@ ref: https://frfsh.plus.st/notes/9hqswpwiwjaihcgo Co-authored-by: syuilo Co-authored-by: Acid Chicken (硫酸鶏) +- Add migration to fix corrupted stream ids + +- Feat: Fetch total posts of users on create/update + +- Feat: post translation in Traditional Chinese + ### Miscellaneous Tasks @@ -758,11 +811,491 @@ Translate-URL: https://hosted.weblate.org/projects/firefish/locales/de/ - Chore: Merge branch 'origin/develop' into Weblate. - Chore: update ja-JP.yml +- Chore: :bookmark: v1.0.4-beta + +- Chore: Translated using Weblate (French) + +Currently translated at 99.7% (1839 of 1844 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1844 of 1844 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ja/ + +- Chore: Translated using Weblate (Turkish) + +Currently translated at 99.9% (1843 of 1844 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/tr/ + +- Chore: Translated using Weblate (Ukrainian) + +Currently translated at 100.0% (1844 of 1844 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/uk/ + +- Chore: Translated using Weblate (Bulgarian (bul_BG)) + +Currently translated at 20.9% (386 of 1844 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/bul_BG/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (French) + +Currently translated at 99.6% (1839 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1846 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ca/ + +- Chore: Translated using Weblate (French) + +Currently translated at 99.6% (1839 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Translated using Weblate (French) + +Currently translated at 99.6% (1839 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Indonesian) + +Currently translated at 100.0% (1846 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/id/ + +- Chore: Translated using Weblate (Portuguese (Brazil)) + +Currently translated at 12.0% (222 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/pt_BR/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (German) + +Currently translated at 100.0% (1846 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 100.0% (1846 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/de/ + +- Chore: Translated using Weblate (French) + +Currently translated at 99.7% (1841 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Translated using Weblate (Norwegian Bokmål) + +Currently translated at 32.4% (599 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/nb_NO/ + +- Chore: Translated using Weblate (Ukrainian) + +Currently translated at 100.0% (1846 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/uk/ + +- Chore: Translated using Weblate (Vietnamese) + +Currently translated at 93.1% (1720 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/vi/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: up pnpm to 8.6.11 + +- Chore: :arrow_up: up deps + +- Chore: :art: format + +- Chore: Translated using Weblate (Norwegian Bokmål) + +Currently translated at 36.1% (668 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/nb_NO/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: remove unused items + +- Chore: :art: format + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 100.0% (1846 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/es/ + +- Chore: Translated using Weblate (French) + +Currently translated at 100.0% (1846 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Translated using Weblate (French) + +Currently translated at 100.0% (1846 of 1846 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ca/ + +- Chore: Translated using Weblate (French) + +Currently translated at 99.5% (1842 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Translated using Weblate (Indonesian) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/id/ + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ja/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ru/ + +- Chore: Translated using Weblate (Bulgarian (bul_BG)) + +Currently translated at 23.4% (433 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/bul_BG/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: codeberg → gitlab + +- Chore: Translated using Weblate (German) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/de/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ja/ + +- Chore: Translated using Weblate (German) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/de/ + +- Chore: Translated using Weblate (Ukrainian) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/uk/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ja/ + +- Chore: Translated using Weblate (Japanese (Kansai)) + +Currently translated at 69.1% (1280 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ja_KS/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/de/ + +- Chore: Translated using Weblate (French) + +Currently translated at 99.6% (1844 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Translated using Weblate (Indonesian) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/id/ + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ja/ + +- Chore: Translated using Weblate (Japanese (Kansai)) + +Currently translated at 69.9% (1294 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ja_KS/ + +- Chore: Translated using Weblate (Norwegian Bokmål) + +Currently translated at 54.0% (1000 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/nb_NO/ + +- Chore: Translated using Weblate (Bulgarian (bul_BG)) + +Currently translated at 23.5% (435 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/bul_BG/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Italian) + +Currently translated at 88.4% (1637 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/it/ + +- Chore: Translated using Weblate (Chinese (Simplified)) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/zh_Hans/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: :art: format + +- Chore: Translated using Weblate (Italian) + +Currently translated at 98.5% (1824 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/it/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ru/ + +- Chore: Translated using Weblate (Korean) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ko/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Update stop words +- Chore: :art: format + +- Chore: Translated using Weblate (Indonesian) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/id/ + +- Chore: Translated using Weblate (Italian) + +Currently translated at 98.9% (1830 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/it/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (French) + +Currently translated at 99.6% (1843 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ + +- Chore: Translated using Weblate (Italian) + +Currently translated at 98.9% (1831 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/it/ + +- Chore: Translated using Weblate (Korean) + +Currently translated at 100.0% (1850 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ko/ + +- Chore: Translated using Weblate (Thai) + +Currently translated at 56.5% (1047 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/th/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: :technologist: More recommended VSCode extensions + +Iconify to preview Phosphor icons, Conventional Commits for commit style + +- Chore: :technologist: More recommended VSCode extensions + +Docker, GitLab Workflow, JSON5, Prettier, YAML, and Pretty TS Errors + +- Chore: Translated using Weblate (Thai) + +Currently translated at 58.6% (1085 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/th/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore, refactor: remove unused, fix some type errors (client/src/pages) + +- Chore: :rotating_light: lint + +- Chore: :wrench: linting config + +- Chore: 🚨 lint megalodon + +- Chore: :arrow_up: up deps (properly) + +- Chore: :hammer: build greet js -> sh + +- Chore: :art: script format + +- Chore: Translated using Weblate (Italian) + +Currently translated at 99.5% (1841 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/it/ + +- Chore: Translated using Weblate (Portuguese (Portugal)) + +Currently translated at 33.4% (619 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/pt_PT/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Portuguese (Portugal)) + +Currently translated at 33.4% (619 of 1850 strings) + +Translation: Firefish/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/pt_PT/ + +- Chore: Merge branch 'origin/develop' into Weblate. + ### Performance - Perf: :zap: featured posts query limit +- Perf: :zap: delete transformedOptions key -> assign undefined with key literal + +- Perf: :zap: seperate web and queue workers + ### Refactor @@ -778,6 +1311,26 @@ ref: https://git.joinfirefish.org/firefish/firefish/-/issues/10527#note_230 - Refactor: :busts_in_silhouette: Add original Misskey contributors +- Refactor: :recycle: better offline page + +- Refactor: :children_crossing: only index public posts + +- Refactor: :coffin: remove old woodpecker scripts + +- Refactor: :recycle: No Vue Reactivity + +Performed with https://github.com/edison1105/drop-reactivity-transform , Reactivity Transform was an experimental feature and has now been deprecated. + +- Refactor: remove regex + +- Refactor: :recycle: types in AP kernel + +This file seriously needs to be refactored properly... + +- Refactor: :egg: new ansi art + +- Refactor: :egg: ansi art for master.ts + ### Styling @@ -797,6 +1350,20 @@ ref: https://git.joinfirefish.org/firefish/firefish/-/issues/10527#note_230 ### Miscellaneous Tasks +- Chore: Translated using Weblate (Russian) + +Currently translated at 99.4% (1826 of 1836 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ru/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 99.4% (1826 of 1836 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ru/ + - Chore: Translated using Weblate (Japanese) Currently translated at 100.0% (1836 of 1836 strings) @@ -891,7 +1458,7 @@ Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ko/ ### Refactor -- Refactor: :recycle: create-drive-file endpoint +- Refactor: :recycle: create drive file endpoint Adjusts ratelimit to 250 files every 10 minutes, fixes error text, fixes reused variable name. @@ -901,22 +1468,6 @@ Adjusts ratelimit to 250 files every 10 minutes, fixes error text, fixes reused for real this time -### Miscellaneous Tasks - -- Chore: Translated using Weblate (Russian) - -Currently translated at 99.4% (1826 of 1836 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ru/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 99.4% (1826 of 1836 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ru/ - ## [1.0.0] - 2023-07-19 @@ -8900,7 +9451,7 @@ Resolve #7540 * truncate user information if it is too long Some AP software allows for user names or summaries to be very long. -Misskey cannot handle this and the profile page cannot be opened and +Misskey can not handle this and the profile page can not be opened and no activities from such users can be seen. Instead, the user name and summary are cut off after the maximum length @@ -9902,7 +10453,7 @@ This duplicated processing can be avoided by querying the database directly. Misskey will only use ActivityPub follow requests for users that are local and are requesting to follow a remote user. This check is to ensure that -this endpoint cannot be used by other services or instances. +this endpoint can not be used by other services or instances. * fix: missing import @@ -14921,7 +15472,7 @@ Defaults for `local` and `withFiles` are based on the behaviour of the endpoint. * fix: define required fields -- `notes/create`: the default for `text` has been removed because ajv cannot handle +- `notes/create`: the default for `text` has been removed because ajv can not handle `default` inside of `anyOf`, see https://ajv.js.org/guide/modifying-data.html#assigning-defaults and the default value cannot be `null` if text is `nullable: false` in the `anyOf` @@ -15551,7 +16102,7 @@ unnecessarily loaded. * remove duplicate null check The variable is checked for null in the lines above and the function -returns if so. Therefore, it cannot be null at this point. +returns if so. Therefore, it can not be null at this point. * simplify `getJsonSchema` diff --git a/package.json b/package.json index 265904bf25..fb94230dd0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firefish", - "version": "1.0.5-dev9", + "version": "1.0.4-beta2", "codename": "aqua", "repository": { "type": "git", From df34d47d425c7750db7de3e09618c2ffb4a836a7 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 10:14:14 -0700 Subject: [PATCH 06/30] fix: :ambulance: incorrect end tag --- packages/client/src/components/MkAnnouncement.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkAnnouncement.vue b/packages/client/src/components/MkAnnouncement.vue index 700cb5e747..4f26cd8bac 100644 --- a/packages/client/src/components/MkAnnouncement.vue +++ b/packages/client/src/components/MkAnnouncement.vue @@ -12,7 +12,7 @@ {{ i18n.ts.updatedAt }}: - +
Date: Sat, 2 Sep 2023 10:14:35 -0700 Subject: [PATCH 07/30] dev10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb94230dd0..97c83b1f47 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firefish", - "version": "1.0.4-beta2", + "version": "1.0.5-dev10", "codename": "aqua", "repository": { "type": "git", From f72c9b818c2a0989f8a190839aa72019082702b4 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 11:00:47 -0700 Subject: [PATCH 08/30] fix: :bulb: biome still uses `rome-ignore` --- packages/backend/src/global.d.ts | 2 +- packages/backend/src/services/chart/core.ts | 2 +- packages/backend/src/services/note/create.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/global.d.ts b/packages/backend/src/global.d.ts index 6c5a22e4b4..503e26eb60 100644 --- a/packages/backend/src/global.d.ts +++ b/packages/backend/src/global.d.ts @@ -1,2 +1,2 @@ -// biome-ignore lint/suspicious/noExplicitAny: i have no idea +// rome-ignore lint/suspicious/noExplicitAny: i have no idea type FIXME = any; diff --git a/packages/backend/src/services/chart/core.ts b/packages/backend/src/services/chart/core.ts index e1aaaad4b3..2fce4de91c 100644 --- a/packages/backend/src/services/chart/core.ts +++ b/packages/backend/src/services/chart/core.ts @@ -472,7 +472,7 @@ export default abstract class Chart { protected commit(diff: Commit, group: string | null = null): void { for (const [k, v] of Object.entries(diff)) { if (v == null || v === 0 || (Array.isArray(v) && v.length === 0)) - // biome-ignore lint/performance/noDelete: needs to be deleted not just set to undefined + // rome-ignore lint/performance/noDelete: needs to be deleted not just set to undefined delete diff[k]; } this.buffer.push({ diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index b39a857836..689bd66162 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -169,7 +169,7 @@ export default async ( data: Option, silent = false, ) => - // biome-ignore lint/suspicious/noAsyncPromiseExecutor: FIXME + // rome-ignore lint/suspicious/noAsyncPromiseExecutor: FIXME new Promise(async (res, rej) => { const dontFederateInitially = data.visibility === "hidden"; From 86cad1056c358cd9744f729dd6d18f2962ab2881 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 11:19:04 -0700 Subject: [PATCH 09/30] docs: :lock: robots.txt asset Closes #10640, #10608 --- README.md | 1 + custom/assets/robots.txt | 14 ++++++++++++++ packages/backend/src/server/web/views/clip.pug | 2 ++ 3 files changed, 17 insertions(+) create mode 100644 custom/assets/robots.txt diff --git a/README.md b/README.md index 42af4aa9e6..aad5b4d8b3 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,7 @@ Please don't use ElasticSearch unless you already have an ElasticSearch setup an - To add custom error images, place them in the `./custom/assets/badges` directory, replacing the files already there. - To add custom sounds, place only mp3 files in the `./custom/assets/sounds` directory. - To update custom assets without rebuilding, just run `pnpm run gulp`. +- To block ChatGPT, CommonCrawl, or other crawlers from indexing your instance, uncomment the respective rules in `./custom/robots.txt`. ## 🧑‍🔬 Configuring a new server diff --git a/custom/assets/robots.txt b/custom/assets/robots.txt new file mode 100644 index 0000000000..cedb5b6cf2 --- /dev/null +++ b/custom/assets/robots.txt @@ -0,0 +1,14 @@ +User-agent: * +Allow: / + +# Uncomment the following to block CommonCrawl +# +# User-agent: CCBot +# User-agent: CCBot/2.0 +# User-agent: CCBot/3.1 +# Disallow: / + +# Uncomment the following to block ChatGPT +# +# User-agent: GPTBot +# Disallow: / diff --git a/packages/backend/src/server/web/views/clip.pug b/packages/backend/src/server/web/views/clip.pug index 79d6293808..b3285dbe2e 100644 --- a/packages/backend/src/server/web/views/clip.pug +++ b/packages/backend/src/server/web/views/clip.pug @@ -24,9 +24,11 @@ block meta unless privateMode if profile.noCrawle meta(name='robots' content='noindex') + if profile.preventAiLearning meta(name='robots' content='noai') meta(name='robots' content='noimageai') + meta(name='GPTBot' content='noindex') meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) From 79f9f6377bbf97c259b3973a5b126004cb27a633 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 11:21:27 -0700 Subject: [PATCH 10/30] docs: :memo: merge request co-authored-by --- .gitlab/merge_request_templates/default.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab/merge_request_templates/default.md b/.gitlab/merge_request_templates/default.md index 34aa22bba2..ece10a8505 100644 --- a/.gitlab/merge_request_templates/default.md +++ b/.gitlab/merge_request_templates/default.md @@ -7,3 +7,6 @@ By submitting this issue, you agree to follow our [Contribution Guidelines](http - [ ] I agree to follow this project's Contribution Guidelines - [ ] I have made sure to test this pull request - [ ] I have made sure to run `pnpm run format` before submitting this pull request + + + From d1a4bbf597dcb70088c9526d1053fc030e66ce4c Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 11:55:53 -0700 Subject: [PATCH 11/30] maskable icon --- packages/backend/assets/icons/maskable.png | Bin 0 -> 16586 bytes packages/backend/src/server/web/manifest.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/backend/assets/icons/maskable.png diff --git a/packages/backend/assets/icons/maskable.png b/packages/backend/assets/icons/maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..b5760d386ea64bced3abd4733229e8b218218319 GIT binary patch literal 16586 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 Date: Sat, 2 Sep 2023 12:15:15 -0700 Subject: [PATCH 12/30] fix: :bug: smaller maskable icon --- packages/backend/assets/icons/maskable.png | Bin 16586 -> 16949 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/backend/assets/icons/maskable.png b/packages/backend/assets/icons/maskable.png index b5760d386ea64bced3abd4733229e8b218218319..9cade1a8ca6dd17a523229fd554d2b2180bd3e8c 100644 GIT binary patch literal 16949 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 L+4RKJ^6fwvW;ig0>dfKQF(?$`dtfd&_ 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 Date: Sat, 2 Sep 2023 19:22:13 +0000 Subject: [PATCH 13/30] fix: release redis locks --- packages/backend/src/misc/app-lock.ts | 15 ++++++++++++--- .../remote/activitypub/kernel/announce/note.ts | 4 +++- .../src/remote/activitypub/kernel/create/note.ts | 4 +++- .../src/remote/activitypub/kernel/delete/note.ts | 4 +++- .../backend/src/remote/activitypub/models/note.ts | 4 +++- packages/backend/src/services/chart/core.ts | 3 ++- .../src/services/fetch-instance-metadata.ts | 6 ++++-- 7 files changed, 30 insertions(+), 10 deletions(-) diff --git a/packages/backend/src/misc/app-lock.ts b/packages/backend/src/misc/app-lock.ts index 0891d021f4..198310c884 100644 --- a/packages/backend/src/misc/app-lock.ts +++ b/packages/backend/src/misc/app-lock.ts @@ -12,29 +12,38 @@ const retryDelay = 100; * @param timeout Lock timeout (ms), The timeout releases previous lock. * @returns Unlock function */ -export async function getApLock(uri: string, timeout = 30 * 1000) { +export async function getApLock( + uri: string, + timeout = 30 * 1000, +): Promise { const lock = new Mutex(redisClient, `ap-object:${uri}`, { lockTimeout: timeout, retryInterval: retryDelay, }); await lock.acquire(); + return lock; } export async function getFetchInstanceMetadataLock( host: string, timeout = 30 * 1000, -) { +): Promise { const lock = new Mutex(redisClient, `instance:${host}`, { lockTimeout: timeout, retryInterval: retryDelay, }); await lock.acquire(); + return lock; } -export async function getChartInsertLock(lockKey: string, timeout = 30 * 1000) { +export async function getChartInsertLock( + lockKey: string, + timeout = 30 * 1000, +): Promise { const lock = new Mutex(redisClient, `chart-insert:${lockKey}`, { lockTimeout: timeout, retryInterval: retryDelay, }); await lock.acquire(); + return lock; } diff --git a/packages/backend/src/remote/activitypub/kernel/announce/note.ts b/packages/backend/src/remote/activitypub/kernel/announce/note.ts index acf8c84360..50b59932cf 100644 --- a/packages/backend/src/remote/activitypub/kernel/announce/note.ts +++ b/packages/backend/src/remote/activitypub/kernel/announce/note.ts @@ -32,6 +32,8 @@ export default async function ( // Interrupt if you block the announcement destination if (await shouldBlockInstance(extractDbHost(uri))) return; + const lock = await getApLock(uri); + try { // Check if something with the same URI is already registered const exist = await fetchNote(uri); @@ -78,6 +80,6 @@ export default async function ( uri, }); } finally { - await getApLock(uri); + await lock.release(); } } diff --git a/packages/backend/src/remote/activitypub/kernel/create/note.ts b/packages/backend/src/remote/activitypub/kernel/create/note.ts index fe4cc0906f..92b0ffb1e0 100644 --- a/packages/backend/src/remote/activitypub/kernel/create/note.ts +++ b/packages/backend/src/remote/activitypub/kernel/create/note.ts @@ -31,6 +31,8 @@ export default async function ( } } + const lock = await getApLock(uri); + try { const exist = await fetchNote(note); if (exist) return "skip: note exists"; @@ -44,6 +46,6 @@ export default async function ( throw e; } } finally { - await getApLock(uri); + await lock.release(); } } diff --git a/packages/backend/src/remote/activitypub/kernel/delete/note.ts b/packages/backend/src/remote/activitypub/kernel/delete/note.ts index b37f7d25f9..4656480c2f 100644 --- a/packages/backend/src/remote/activitypub/kernel/delete/note.ts +++ b/packages/backend/src/remote/activitypub/kernel/delete/note.ts @@ -13,6 +13,8 @@ export default async function ( ): Promise { logger.info(`Deleting the Note: ${uri}`); + const lock = await getApLock(uri); + try { const dbResolver = new DbResolver(); const note = await dbResolver.getNoteFromApId(uri); @@ -37,6 +39,6 @@ export default async function ( await deleteNode(actor, note); return "ok: note deleted"; } finally { - await getApLock(uri); + await lock.release(); } } diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 8e305d7195..12b2c19972 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -415,6 +415,8 @@ export async function resolveNote( `host ${extractDbHost(uri)} is blocked`, ); + const lock = await getApLock(uri); + try { //#region Returns if already registered with this server const exist = await fetchNote(uri); @@ -437,7 +439,7 @@ export async function resolveNote( // Since the attached Note Object may be disguised, always specify the uri and fetch it from the server. return await createNote(uri, resolver, true); } finally { - await getApLock(uri); + await lock.release(); } } diff --git a/packages/backend/src/services/chart/core.ts b/packages/backend/src/services/chart/core.ts index 2fce4de91c..d7a524d488 100644 --- a/packages/backend/src/services/chart/core.ts +++ b/packages/backend/src/services/chart/core.ts @@ -430,6 +430,7 @@ export default abstract class Chart { ? `${this.name}:${date}:${span}:${group}` : `${this.name}:${date}:${span}`; + const lock = await getChartInsertLock(lockKey); try { // ロック内でもう1回チェックする const currentLog = (await repository.findOneBy({ @@ -465,7 +466,7 @@ export default abstract class Chart { return log; } finally { - await getChartInsertLock(lockKey); + await lock.release(); } } diff --git a/packages/backend/src/services/fetch-instance-metadata.ts b/packages/backend/src/services/fetch-instance-metadata.ts index 9a5a9bb080..23a6a703ec 100644 --- a/packages/backend/src/services/fetch-instance-metadata.ts +++ b/packages/backend/src/services/fetch-instance-metadata.ts @@ -15,6 +15,8 @@ export async function fetchInstanceMetadata( instance: Instance, force = false, ): Promise { + const lock = await getFetchInstanceMetadataLock(instance.host); + if (!force) { const _instance = await Instances.findOneBy({ host: instance.host }); const now = Date.now(); @@ -22,7 +24,7 @@ export async function fetchInstanceMetadata( _instance?.infoUpdatedAt && now - _instance.infoUpdatedAt.getTime() < 1000 * 60 * 60 * 24 ) { - await getFetchInstanceMetadataLock(instance.host); + await lock.release(); return; } } @@ -78,7 +80,7 @@ export async function fetchInstanceMetadata( } catch (e) { logger.error(`Failed to update metadata of ${instance.host}: ${e}`); } finally { - await getFetchInstanceMetadataLock(instance.host); + await lock.release(); } } From 45c4a2bb24fc6b1f32c9d341d9b6cb63802730b1 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 12:22:53 -0700 Subject: [PATCH 14/30] dev11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 97c83b1f47..dc25a81ccd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firefish", - "version": "1.0.5-dev10", + "version": "1.0.5-dev11", "codename": "aqua", "repository": { "type": "git", From 7e0c9ddc11df8c1cc85d8a1ae8ed32416287e878 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 12:23:58 -0700 Subject: [PATCH 15/30] artifacting --- packages/backend/assets/icons/maskable.png | Bin 16949 -> 15650 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/backend/assets/icons/maskable.png b/packages/backend/assets/icons/maskable.png index 9cade1a8ca6dd17a523229fd554d2b2180bd3e8c..a224833ed6a54538a842328b5b4827427d3f61ee 100644 GIT binary patch literal 15650 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 literal 16949 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 L+4RKJ Date: Sat, 2 Sep 2023 20:13:28 +0000 Subject: [PATCH 16/30] chore: Translated using Weblate (French) Currently translated at 100.0% (1850 of 1850 strings) Translation: Firefish/locales Translate-URL: https://hosted.weblate.org/projects/firefish/locales/fr/ --- locales/fr-FR.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 098c97a409..60978d0788 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -309,11 +309,11 @@ emptyDrive: "Le Drive est vide" emptyFolder: "Le dossier est vide" unableToDelete: "Suppression impossible" inputNewFileName: "Entrez un nouveau nom de fichier" -inputNewDescription: "Veuillez entrer une nouvelle description" +inputNewDescription: "Veuillez entrer une nouvelle description au fichier" inputNewFolderName: "Entrez un nouveau nom de dossier" circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer." -hasChildFilesOrFolders: "Impossible de supprimer ce dossier car il n'est pas vide." +hasChildFilesOrFolders: "Impossible de supprimer ce dossier, car il n'est pas vide." copyUrl: "Copier l’URL" rename: "Renommer" avatar: "Avatar" @@ -605,7 +605,7 @@ disablePlayer: "Fermer le lecteur vidéo" expandTweet: "Étendre le tweet" themeEditor: "Éditeur de thèmes" description: "Description" -describeFile: "Ajouter une description d'image" +describeFile: "Ajouter une description" enterFileDescription: "Saisissez une description" author: "Auteur·rice" leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer @@ -2085,7 +2085,7 @@ silenceThisInstance: Masquer ce serveur silencedInstances: Serveurs masqués silenced: Masqué deleted: Effacé -editNote: Modifier publication +editNote: Modifier la publication edited: 'Modifié à {date} {time}' flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des utilisatieur·rice·s aux publications des autres. @@ -2209,4 +2209,4 @@ addRe: Ajouter "re:" au début d’un avertissement de contenu (CW) en réponse confirm: Confirmer importZip: Importer ZIP exportZip: Exporter ZIP -emojiPackCreator: Créateur de pack d’emoji +emojiPackCreator: Créateur de pack d’émoji From 26b4c6404adc4c299055714b714acce84d469b39 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 2 Sep 2023 14:05:03 -0700 Subject: [PATCH 17/30] chore: :arrow_up: up photoswipe --- packages/client/package.json | 2 +- pnpm-lock.yaml | 596 ++++++++++++++++++++++++----------- 2 files changed, 405 insertions(+), 193 deletions(-) diff --git a/packages/client/package.json b/packages/client/package.json index d7cfe4e6c4..d371254bf8 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -63,7 +63,7 @@ "katex": "0.16.8", "matter-js": "0.19.0", "mfm-js": "0.23.3", - "photoswipe": "5.3.8", + "photoswipe": "5.3.9", "prettier": "3.0.3", "prettier-plugin-vue": "1.1.6", "prismjs": "1.29.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e12197457..4813e6de64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -622,10 +622,10 @@ importers: version: 14.1.2 '@eslint-sets/eslint-config-vue3': specifier: ^5.8.0 - version: 5.8.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2) + version: 5.8.0(@babel/core@7.22.11)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2) '@eslint-sets/eslint-config-vue3-ts': specifier: ^3.3.0 - version: 3.3.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2) + version: 3.3.0(@babel/core@7.22.11)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2) '@phosphor-icons/web': specifier: ^2.0.3 version: 2.0.3 @@ -736,10 +736,10 @@ importers: version: 0.0.1 eslint-config-prettier: specifier: 9.0.0 - version: 9.0.0(eslint@8.46.0) + version: 9.0.0(eslint@8.48.0) eslint-plugin-file-progress: specifier: ^1.3.0 - version: 1.3.0(eslint@8.46.0) + version: 1.3.0(eslint@8.48.0) eventemitter3: specifier: 5.0.1 version: 5.0.1 @@ -777,8 +777,8 @@ importers: specifier: 0.23.3 version: 0.23.3 photoswipe: - specifier: 5.3.8 - version: 5.3.8 + specifier: 5.3.9 + version: 5.3.9 prettier: specifier: 3.0.3 version: 3.0.3 @@ -862,7 +862,7 @@ importers: version: 3.3.4 vue-draggable-plus: specifier: ^0.2.6 - version: 0.2.6(@types/sortablejs@1.15.1) + version: 0.2.6(@types/sortablejs@1.15.2) vue-isyourpasswordsafe: specifier: ^2.0.0 version: 2.0.0 @@ -921,7 +921,7 @@ importers: version: 9.0.8 ts-jest: specifier: ^27.1.2 - version: 27.1.2(@babel/core@7.22.10)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3) + version: 27.1.2(@babel/core@7.22.11)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3) ts-node: specifier: 10.4.0 version: 10.4.0(@swc/core@1.3.68)(@types/node@20.3.1)(typescript@5.1.3) @@ -1045,7 +1045,7 @@ importers: version: 2.8.3 ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.22.10)(jest@29.4.0)(typescript@4.9.4) + version: 29.0.5(@babel/core@7.22.11)(jest@29.4.0)(typescript@4.9.4) typedoc: specifier: ^0.23.24 version: 0.23.24(typescript@4.9.4) @@ -1098,6 +1098,14 @@ packages: '@babel/highlight': 7.22.10 chalk: 2.4.2 + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.13 + chalk: 2.4.2 + dev: true + /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} @@ -1124,16 +1132,39 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.22.10(@babel/core@7.22.10)(eslint@8.46.0): + /@babel/core@7.22.11: + resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helpers': 7.22.11 + '@babel/parser': 7.22.14 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/eslint-parser@7.22.10(@babel/core@7.22.11)(eslint@8.48.0): resolution: {integrity: sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.22.11 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.46.0 + eslint: 8.48.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: true @@ -1193,6 +1224,20 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} @@ -1231,6 +1276,17 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers@7.22.11: + resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.22.10: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} @@ -1239,6 +1295,15 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.22.13: + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.22.10: resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} @@ -1246,6 +1311,14 @@ packages: dependencies: '@babel/types': 7.22.10 + /@babel/parser@7.22.14: + resolution: {integrity: sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.11 + dev: true + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.10): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -1438,6 +1511,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.22.11: + resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.14 + '@babel/types': 7.22.11 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.22.10: resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} @@ -1446,6 +1537,15 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + /@babel/types@7.22.11: + resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -2014,34 +2114,49 @@ packages: eslint-visitor-keys: 3.4.2 dev: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.48.0 + eslint-visitor-keys: 3.4.2 + dev: true + /@eslint-community/regexpp@4.6.2: resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint-sets/eslint-config-basic@3.3.0(@babel/core@7.22.10)(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(prettier@3.0.3): + /@eslint-community/regexpp@4.8.0: + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint-sets/eslint-config-basic@3.3.0(@babel/core@7.22.11)(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(prettier@3.0.3): resolution: {integrity: sha512-x5YH0CvZJxn19/5ehu188XaoLQpxOGlFiIuPHCN6FyONgrmriakT/cmIIBOJg2Vi/y1bn2xbhsgVNb00J3HyTg==} peerDependencies: eslint: '>=8.0.0' prettier: '>=2.0.0' dependencies: - '@babel/eslint-parser': 7.22.10(@babel/core@7.22.10)(eslint@8.46.0) - eslint: 8.46.0 - eslint-config-prettier: 8.9.0(eslint@8.46.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.46.0) + '@babel/eslint-parser': 7.22.10(@babel/core@7.22.11)(eslint@8.48.0) + eslint: 8.48.0 + eslint-config-prettier: 8.9.0(eslint@8.48.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.48.0) eslint-plugin-html: 7.1.0 - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0) - eslint-plugin-jsonc: 2.9.0(eslint@8.46.0) - eslint-plugin-markdown: 3.0.1(eslint@8.46.0) - eslint-plugin-n: 15.7.0(eslint@8.46.0) - eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@3.0.3) - eslint-plugin-promise: 5.2.0(eslint@8.46.0) + eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0) + eslint-plugin-jsonc: 2.9.0(eslint@8.48.0) + eslint-plugin-markdown: 3.0.1(eslint@8.48.0) + eslint-plugin-n: 15.7.0(eslint@8.48.0) + eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.48.0)(prettier@3.0.3) + eslint-plugin-promise: 5.2.0(eslint@8.48.0) eslint-plugin-tsdoc: 0.2.17 - eslint-plugin-unicorn: 45.0.2(eslint@8.46.0) - eslint-plugin-yml: 1.8.0(eslint@8.46.0) + eslint-plugin-unicorn: 45.0.2(eslint@8.48.0) + eslint-plugin-yml: 1.8.0(eslint@8.48.0) jsonc-eslint-parser: 2.3.0 prettier: 3.0.3 - vue-eslint-parser: 9.3.1(eslint@8.46.0) + vue-eslint-parser: 9.3.1(eslint@8.48.0) yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - '@babel/core' @@ -2051,7 +2166,7 @@ packages: - supports-color dev: true - /@eslint-sets/eslint-config-basic@5.8.0(@babel/core@7.22.10)(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2): + /@eslint-sets/eslint-config-basic@5.8.0(@babel/core@7.22.11)(@typescript-eslint/parser@6.3.0)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2): resolution: {integrity: sha512-dWUDQY10cHPz9M6r2HvFvByOecH0dFjnihzrdRLVx8rWWMG4keeuEhURi5eSYsHCvHJz6Q3KzukiDrp7wHZoAw==} peerDependencies: eslint: '>=7.4.0' @@ -2061,24 +2176,24 @@ packages: typescript: optional: true dependencies: - '@babel/eslint-parser': 7.22.10(@babel/core@7.22.10)(eslint@8.46.0) - eslint: 8.46.0 - eslint-config-prettier: 9.0.0(eslint@8.46.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.46.0) + '@babel/eslint-parser': 7.22.10(@babel/core@7.22.11)(eslint@8.48.0) + eslint: 8.48.0 + eslint-config-prettier: 9.0.0(eslint@8.48.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.48.0) eslint-plugin-html: 7.1.0 - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0) - eslint-plugin-jsonc: 2.9.0(eslint@8.46.0) - eslint-plugin-markdown: 3.0.1(eslint@8.46.0) - eslint-plugin-n: 16.0.1(eslint@8.46.0) - eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.46.0)(prettier@3.0.3) - eslint-plugin-promise: 6.1.1(eslint@8.46.0) + eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.48.0) + eslint-plugin-jsonc: 2.9.0(eslint@8.48.0) + eslint-plugin-markdown: 3.0.1(eslint@8.48.0) + eslint-plugin-n: 16.0.1(eslint@8.48.0) + eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.48.0)(prettier@3.0.3) + eslint-plugin-promise: 6.1.1(eslint@8.48.0) eslint-plugin-tsdoc: 0.2.17 - eslint-plugin-unicorn: 40.1.0(eslint@8.46.0) - eslint-plugin-yml: 1.8.0(eslint@8.46.0) + eslint-plugin-unicorn: 40.1.0(eslint@8.48.0) + eslint-plugin-yml: 1.8.0(eslint@8.48.0) jsonc-eslint-parser: 2.3.0 prettier: 3.0.3 typescript: 5.2.2 - vue-eslint-parser: 9.3.1(eslint@8.46.0) + vue-eslint-parser: 9.3.1(eslint@8.48.0) yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - '@babel/core' @@ -2089,19 +2204,19 @@ packages: - supports-color dev: true - /@eslint-sets/eslint-config-ts@3.3.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2): + /@eslint-sets/eslint-config-ts@3.3.0(@babel/core@7.22.11)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2): resolution: {integrity: sha512-4Vj3KxYx16hmW6AyEv1mil0gVN8H3rdJt8TRWufbAj0ZN+EjwOPf3TqE7ASCYto/NpA8xWQY3NGm/og9Or/dDQ==} peerDependencies: eslint: '>=8.0.0' prettier: '>=2.0.0' typescript: '>=4.0.0' dependencies: - '@eslint-sets/eslint-config-basic': 3.3.0(@babel/core@7.22.10)(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(prettier@3.0.3) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2) - eslint: 8.46.0 - eslint-config-prettier: 8.9.0(eslint@8.46.0) - eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@3.0.3) + '@eslint-sets/eslint-config-basic': 3.3.0(@babel/core@7.22.11)(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(prettier@3.0.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 + eslint-config-prettier: 8.9.0(eslint@8.48.0) + eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.48.0)(prettier@3.0.3) eslint-plugin-tsdoc: 0.2.17 prettier: 3.0.3 typescript: 5.2.2 @@ -2112,7 +2227,7 @@ packages: - supports-color dev: true - /@eslint-sets/eslint-config-ts@5.8.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2): + /@eslint-sets/eslint-config-ts@5.8.0(@babel/core@7.22.11)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2): resolution: {integrity: sha512-0tLzYHizhI0B1oh8IFmSOyDye2jIF34SnrO/YZRXVKTuv7d4QKDD9xkC+SOBB0pk+SHPJ6AU/N2xZar+CsHl3g==} peerDependencies: eslint: '>=7.4.0' @@ -2122,12 +2237,12 @@ packages: typescript: optional: true dependencies: - '@eslint-sets/eslint-config-basic': 5.8.0(@babel/core@7.22.10)(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2) - eslint: 8.46.0 - eslint-config-prettier: 9.0.0(eslint@8.46.0) - eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.46.0)(prettier@3.0.3) + '@eslint-sets/eslint-config-basic': 5.8.0(@babel/core@7.22.11)(@typescript-eslint/parser@6.3.0)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.3.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 + eslint-config-prettier: 9.0.0(eslint@8.48.0) + eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.48.0)(prettier@3.0.3) eslint-plugin-tsdoc: 0.2.17 prettier: 3.0.3 typescript: 5.2.2 @@ -2139,26 +2254,26 @@ packages: - supports-color dev: true - /@eslint-sets/eslint-config-vue3-ts@3.3.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2): + /@eslint-sets/eslint-config-vue3-ts@3.3.0(@babel/core@7.22.11)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2): resolution: {integrity: sha512-KX3VFuS5U4FYKfZ6PABQjl54BMpNapNjYYe103Nm2Zy8y9zphDCBAARbhU97XNSvzkurve7HhJcsi9gXrWlGFA==} peerDependencies: eslint: '>=8.0.0' prettier: '>=2.0.0' typescript: '>=4.0.0' dependencies: - '@eslint-sets/eslint-config-ts': 3.3.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2) - eslint: 8.46.0 - eslint-config-prettier: 8.9.0(eslint@8.46.0) - eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@3.0.3) + '@eslint-sets/eslint-config-ts': 3.3.0(@babel/core@7.22.11)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 + eslint-config-prettier: 8.9.0(eslint@8.48.0) + eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.48.0)(prettier@3.0.3) eslint-plugin-tsdoc: 0.2.17 eslint-plugin-vitest-globals: 1.4.0 - eslint-plugin-vue: 9.16.1(eslint@8.46.0) - eslint-plugin-vue-scoped-css: 2.5.0(eslint@8.46.0)(vue-eslint-parser@9.3.1) + eslint-plugin-vue: 9.16.1(eslint@8.48.0) + eslint-plugin-vue-scoped-css: 2.5.0(eslint@8.48.0)(vue-eslint-parser@9.3.1) prettier: 3.0.3 typescript: 5.2.2 - vue-eslint-parser: 9.3.1(eslint@8.46.0) + vue-eslint-parser: 9.3.1(eslint@8.48.0) transitivePeerDependencies: - '@babel/core' - eslint-import-resolver-typescript @@ -2166,7 +2281,7 @@ packages: - supports-color dev: true - /@eslint-sets/eslint-config-vue3@5.8.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2): + /@eslint-sets/eslint-config-vue3@5.8.0(@babel/core@7.22.11)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2): resolution: {integrity: sha512-o9ijQjjAy3kfIMmfDIsjxmjob0oitdzga4JxpX+jvwmUqvjv2eKU300Up3IGhfcQFsPcYIJhBn9+Vfe+MPH9tw==} peerDependencies: eslint: '>=7.4.0' @@ -2176,22 +2291,22 @@ packages: typescript: optional: true dependencies: - '@eslint-sets/eslint-config-basic': 5.8.0(@babel/core@7.22.10)(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2) - '@eslint-sets/eslint-config-ts': 5.8.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2) - eslint: 8.46.0 - eslint-config-prettier: 9.0.0(eslint@8.46.0) - eslint-plugin-jsdoc: 46.4.6(eslint@8.46.0) - eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.46.0)(prettier@3.0.3) + '@eslint-sets/eslint-config-basic': 5.8.0(@babel/core@7.22.11)(@typescript-eslint/parser@6.3.0)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2) + '@eslint-sets/eslint-config-ts': 5.8.0(@babel/core@7.22.11)(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.3.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 + eslint-config-prettier: 9.0.0(eslint@8.48.0) + eslint-plugin-jsdoc: 46.4.6(eslint@8.48.0) + eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.48.0)(prettier@3.0.3) eslint-plugin-tsdoc: 0.2.17 eslint-plugin-vitest-globals: 1.4.0 - eslint-plugin-vue: 9.16.1(eslint@8.46.0) - eslint-plugin-vue-scoped-css: 2.5.0(eslint@8.46.0)(vue-eslint-parser@9.3.1) + eslint-plugin-vue: 9.16.1(eslint@8.48.0) + eslint-plugin-vue-scoped-css: 2.5.0(eslint@8.48.0)(vue-eslint-parser@9.3.1) local-pkg: 0.4.3 prettier: 3.0.3 typescript: 5.2.2 - vue-eslint-parser: 9.3.1(eslint@8.46.0) + vue-eslint-parser: 9.3.1(eslint@8.48.0) transitivePeerDependencies: - '@babel/core' - '@types/eslint' @@ -2217,6 +2332,23 @@ packages: - supports-color dev: true + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/js@8.44.0: resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2227,6 +2359,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@8.48.0: + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} dev: true @@ -2248,6 +2385,17 @@ packages: - supports-color dev: true + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -4482,8 +4630,8 @@ packages: resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==} dev: true - /@types/sortablejs@1.15.1: - resolution: {integrity: sha512-g/JwBNToh6oCTAwNS8UGVmjO7NLDKsejVhvE4x1eWiPTC3uCuNsa/TD4ssvX3du+MLiM+SHPNDuijp8y76JzLQ==} + /@types/sortablejs@1.15.2: + resolution: {integrity: sha512-mOIv/EnPMzAZAVbuh9uGjOZ1BBdimP9Y6IPGntsvQJtko5yapSDKB7GwB3AOlF5N3bkpk4sBwQRpS3aEkiUbaA==} dev: true /@types/stack-utils@2.0.1: @@ -4629,7 +4777,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4641,12 +4789,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -4657,7 +4805,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4669,13 +4817,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.3.0(eslint@8.48.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/type-utils': 6.3.0(eslint@8.46.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.3.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.3.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.3.0(eslint@8.48.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.3.0 debug: 4.3.4(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -4707,7 +4855,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.46.0)(typescript@5.2.2): + /@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4721,13 +4869,13 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.3.0(eslint@8.46.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.3.0(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4742,7 +4890,7 @@ packages: '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.3.0 debug: 4.3.4(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -4792,7 +4940,7 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@5.62.0(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4803,16 +4951,16 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 tsutils: 3.21.0(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@6.3.0(eslint@8.46.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.3.0(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4823,9 +4971,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.3.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.3.0(eslint@8.48.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 ts-api-utils: 1.0.1(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -4930,19 +5078,19 @@ packages: - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@5.2.2): + /@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.46.0 + eslint: 8.48.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -4950,19 +5098,19 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.3.0(eslint@8.46.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.3.0(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 6.3.0 '@typescript-eslint/types': 6.3.0 '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.2.2) - eslint: 8.46.0 + eslint: 8.48.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -6774,7 +6922,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@1.1.4: @@ -7459,6 +7607,12 @@ packages: /core-js@3.32.0: resolution: {integrity: sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==} requiresBuild: true + dev: false + + /core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + requiresBuild: true + dev: true /core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -8550,22 +8704,22 @@ packages: eslint: 8.44.0 dev: true - /eslint-config-prettier@8.9.0(eslint@8.46.0): + /eslint-config-prettier@8.9.0(eslint@8.48.0): resolution: {integrity: sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.46.0 + eslint: 8.48.0 dev: true - /eslint-config-prettier@9.0.0(eslint@8.46.0): + /eslint-config-prettier@9.0.0(eslint@8.48.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.46.0 + eslint: 8.48.0 dev: true /eslint-config-standard@16.0.3(eslint-plugin-import@2.27.5)(eslint-plugin-node@11.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.44.0): @@ -8635,7 +8789,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.46.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -8656,15 +8810,15 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint@8.46.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -8685,23 +8839,23 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.3.0(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es-x@7.2.0(eslint@8.46.0): + /eslint-plugin-es-x@7.2.0(eslint@8.48.0): resolution: {integrity: sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@eslint-community/regexpp': 4.6.2 - eslint: 8.46.0 + eslint: 8.48.0 dev: true /eslint-plugin-es@3.0.1(eslint@8.44.0): @@ -8715,35 +8869,35 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-es@4.1.0(eslint@8.46.0): + /eslint-plugin-es@4.1.0(eslint@8.48.0): resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.46.0 + eslint: 8.48.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.46.0): + /eslint-plugin-eslint-comments@3.2.0(eslint@8.48.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 8.46.0 + eslint: 8.48.0 ignore: 5.2.4 dev: true - /eslint-plugin-file-progress@1.3.0(eslint@8.46.0): + /eslint-plugin-file-progress@1.3.0(eslint@8.48.0): resolution: {integrity: sha512-LncpnGHU26KPvCrvDC2Sl9PfjdrsG8qltgiK6BR7KybWtfqrdlsu1ax3+hyPMn5OkKBTF3Wki3oqK1MSMeOtQw==} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: chalk: 4.1.2 - eslint: 8.46.0 + eslint: 8.48.0 ora: 5.4.1 dev: true @@ -8786,7 +8940,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0): + /eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0): resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} engines: {node: '>=4'} peerDependencies: @@ -8796,16 +8950,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 - eslint: 8.46.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.46.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -8822,7 +8976,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0): + /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.48.0): resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} engines: {node: '>=4'} peerDependencies: @@ -8832,16 +8986,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.3.0(eslint@8.48.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 - eslint: 8.46.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint@8.46.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -8858,7 +9012,7 @@ packages: - supports-color dev: true - /eslint-plugin-jsdoc@46.4.6(eslint@8.46.0): + /eslint-plugin-jsdoc@46.4.6(eslint@8.48.0): resolution: {integrity: sha512-z4SWYnJfOqftZI+b3RM9AtWL1vF/sLWE/LlO9yOKDof9yN2+n3zOdOJTGX/pRE/xnPsooOLG2Rq6e4d+XW3lNw==} engines: {node: '>=16'} peerDependencies: @@ -8869,7 +9023,7 @@ packages: comment-parser: 1.4.0 debug: 4.3.4(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint: 8.46.0 + eslint: 8.48.0 esquery: 1.5.0 is-builtin-module: 3.2.1 semver: 7.5.4 @@ -8878,40 +9032,40 @@ packages: - supports-color dev: true - /eslint-plugin-jsonc@2.9.0(eslint@8.46.0): + /eslint-plugin-jsonc@2.9.0(eslint@8.48.0): resolution: {integrity: sha512-RK+LeONVukbLwT2+t7/OY54NJRccTXh/QbnXzPuTLpFMVZhPuq1C9E07+qWenGx7rrQl0kAalAWl7EmB+RjpGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) - eslint: 8.46.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + eslint: 8.48.0 jsonc-eslint-parser: 2.3.0 natural-compare: 1.4.0 dev: true - /eslint-plugin-markdown@3.0.1(eslint@8.46.0): + /eslint-plugin-markdown@3.0.1(eslint@8.48.0): resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.46.0 + eslint: 8.48.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-n@15.7.0(eslint@8.46.0): + /eslint-plugin-n@15.7.0(eslint@8.48.0): resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} engines: {node: '>=12.22.0'} peerDependencies: eslint: '>=7.0.0' dependencies: builtins: 5.0.1 - eslint: 8.46.0 - eslint-plugin-es: 4.1.0(eslint@8.46.0) - eslint-utils: 3.0.0(eslint@8.46.0) + eslint: 8.48.0 + eslint-plugin-es: 4.1.0(eslint@8.48.0) + eslint-utils: 3.0.0(eslint@8.48.0) ignore: 5.2.4 is-core-module: 2.13.0 minimatch: 3.1.2 @@ -8919,16 +9073,16 @@ packages: semver: 7.5.4 dev: true - /eslint-plugin-n@16.0.1(eslint@8.46.0): + /eslint-plugin-n@16.0.1(eslint@8.48.0): resolution: {integrity: sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==} engines: {node: '>=16.0.0'} peerDependencies: eslint: '>=7.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) builtins: 5.0.1 - eslint: 8.46.0 - eslint-plugin-es-x: 7.2.0(eslint@8.46.0) + eslint: 8.48.0 + eslint-plugin-es-x: 7.2.0(eslint@8.48.0) ignore: 5.2.4 is-core-module: 2.13.0 minimatch: 3.1.2 @@ -8968,7 +9122,7 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@3.0.3): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.9.0)(eslint@8.48.0)(prettier@3.0.3): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -8979,13 +9133,13 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.46.0 - eslint-config-prettier: 8.9.0(eslint@8.46.0) + eslint: 8.48.0 + eslint-config-prettier: 8.9.0(eslint@8.48.0) prettier: 3.0.3 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.46.0)(prettier@3.0.3): + /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.48.0)(prettier@3.0.3): resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8999,20 +9153,20 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.46.0 - eslint-config-prettier: 9.0.0(eslint@8.46.0) + eslint: 8.48.0 + eslint-config-prettier: 9.0.0(eslint@8.48.0) prettier: 3.0.3 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true - /eslint-plugin-promise@5.2.0(eslint@8.46.0): + /eslint-plugin-promise@5.2.0(eslint@8.48.0): resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: ^7.0.0 dependencies: - eslint: 8.46.0 + eslint: 8.48.0 dev: true /eslint-plugin-promise@6.1.1(eslint@8.44.0): @@ -9024,13 +9178,13 @@ packages: eslint: 8.44.0 dev: true - /eslint-plugin-promise@6.1.1(eslint@8.46.0): + /eslint-plugin-promise@6.1.1(eslint@8.48.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.46.0 + eslint: 8.48.0 dev: true /eslint-plugin-standard@5.0.0(eslint@8.44.0): @@ -9049,7 +9203,7 @@ packages: '@microsoft/tsdoc-config': 0.16.2 dev: true - /eslint-plugin-unicorn@40.1.0(eslint@8.46.0): + /eslint-plugin-unicorn@40.1.0(eslint@8.48.0): resolution: {integrity: sha512-y5doK2DF9Sr5AqKEHbHxjFllJ167nKDRU01HDcWyv4Tnmaoe9iNxMrBnaybZvWZUaE3OC5Unu0lNIevYamloig==} engines: {node: '>=12'} peerDependencies: @@ -9058,8 +9212,8 @@ packages: '@babel/helper-validator-identifier': 7.22.5 ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.46.0 - eslint-utils: 3.0.0(eslint@8.46.0) + eslint: 8.48.0 + eslint-utils: 3.0.0(eslint@8.48.0) esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -9072,17 +9226,17 @@ packages: strip-indent: 3.0.0 dev: true - /eslint-plugin-unicorn@45.0.2(eslint@8.46.0): + /eslint-plugin-unicorn@45.0.2(eslint@8.48.0): resolution: {integrity: sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==} engines: {node: '>=14.18'} peerDependencies: eslint: '>=8.28.0' dependencies: '@babel/helper-validator-identifier': 7.22.5 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.46.0 + eslint: 8.48.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -9101,52 +9255,52 @@ packages: resolution: {integrity: sha512-WE+YlK9X9s4vf5EaYRU0Scw7WItDZStm+PapFSYlg2ABNtaQ4zIG7wEqpoUB3SlfM+SgkhgmzR0TeJOO5k3/Nw==} dev: true - /eslint-plugin-vue-scoped-css@2.5.0(eslint@8.46.0)(vue-eslint-parser@9.3.1): + /eslint-plugin-vue-scoped-css@2.5.0(eslint@8.48.0)(vue-eslint-parser@9.3.1): resolution: {integrity: sha512-vR+raYNE1aQ69lS1lZGiKoz8rXFI3MWf2fxrfns/XCQ0XT5sIguhDtQS+9JmUQJClenLDEe2CQx7P+eeSdF4cA==} engines: {node: ^12.22 || ^14.17 || >=16} peerDependencies: eslint: '>=5.0.0' vue-eslint-parser: '>=7.1.0' dependencies: - eslint: 8.46.0 - eslint-utils: 3.0.0(eslint@8.46.0) + eslint: 8.48.0 + eslint-utils: 3.0.0(eslint@8.48.0) lodash: 4.17.21 postcss: 8.4.27 postcss-safe-parser: 6.0.0(postcss@8.4.27) postcss-scss: 4.0.6(postcss@8.4.27) postcss-selector-parser: 6.0.13 postcss-styl: 0.12.3 - vue-eslint-parser: 9.3.1(eslint@8.46.0) + vue-eslint-parser: 9.3.1(eslint@8.48.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-vue@9.16.1(eslint@8.46.0): + /eslint-plugin-vue@9.16.1(eslint@8.48.0): resolution: {integrity: sha512-2FtnTqazA6aYONfDuOZTk0QzwhAwi7Z4+uJ7+GHeGxcKapjqWlDsRWDenvyG/utyOfAS5bVRmAG3cEWiYEz2bA==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) - eslint: 8.46.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + eslint: 8.48.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.13 semver: 7.5.4 - vue-eslint-parser: 9.3.1(eslint@8.46.0) + vue-eslint-parser: 9.3.1(eslint@8.48.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-yml@1.8.0(eslint@8.46.0): + /eslint-plugin-yml@1.8.0(eslint@8.48.0): resolution: {integrity: sha512-fgBiJvXD0P2IN7SARDJ2J7mx8t0bLdG6Zcig4ufOqW5hOvSiFxeUyc2g5I1uIm8AExbo26NNYCcTGZT0MXTsyg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 @@ -9191,13 +9345,13 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-utils@3.0.0(eslint@8.46.0): + /eslint-utils@3.0.0(eslint@8.48.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.46.0 + eslint: 8.48.0 eslint-visitor-keys: 2.1.0 dev: true @@ -9216,6 +9370,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /eslint@8.44.0: resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9310,6 +9469,52 @@ packages: - supports-color dev: true + /eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10119,8 +10324,8 @@ packages: requiresBuild: true optional: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -10430,6 +10635,13 @@ packages: type-fest: 0.20.2 dev: true + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -12169,7 +12381,7 @@ packages: micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /jest-haste-map@29.6.2: @@ -12188,7 +12400,7 @@ packages: micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /jest-jasmine2@27.5.1: @@ -15223,8 +15435,8 @@ packages: split2: 4.2.0 dev: false - /photoswipe@5.3.8: - resolution: {integrity: sha512-4vTzOQt8GP4Chsm0s+8j2xDtVHAEN252PxrU12A1zXauNn0zD5HRHgjALKO2GKTyBnTnOrJUOxbV8LTrFIMrYw==} + /photoswipe@5.3.9: + resolution: {integrity: sha512-z9ACLW9472gAawrIXXiliuz9xNZ3xEl7cIPHqY/lAeFQT9X+N9sgCwa86WK9wnK8cuk/F3QEO45n+QSiZnKd2A==} engines: {node: '>= 0.12.0'} dev: true @@ -16563,7 +16775,7 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /rrweb-cssom@0.6.0: @@ -17972,7 +18184,7 @@ packages: typescript: 5.2.2 dev: true - /ts-jest@27.1.2(@babel/core@7.22.10)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3): + /ts-jest@27.1.2(@babel/core@7.22.11)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3): resolution: {integrity: sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -17993,7 +18205,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.22.11 '@types/jest': 27.4.0 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -18007,7 +18219,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-jest@29.0.5(@babel/core@7.22.10)(jest@29.4.0)(typescript@4.9.4): + /ts-jest@29.0.5(@babel/core@7.22.11)(jest@29.4.0)(typescript@4.9.4): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -18028,7 +18240,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.22.11 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.4.0(@types/node@18.11.18) @@ -18822,7 +19034,7 @@ packages: rollup: 3.28.1 sass: 1.66.1 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /void-elements@3.1.0: @@ -18837,7 +19049,7 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: true - /vue-draggable-plus@0.2.6(@types/sortablejs@1.15.1): + /vue-draggable-plus@0.2.6(@types/sortablejs@1.15.2): resolution: {integrity: sha512-d+0omKIBIfLiJFggc6H4ePRaifbX+33+OiCMsxn8rG59yWXlJGrobexxgXetnSo/1NLTd0TkYZKNc4CA6iwJZw==} peerDependencies: '@types/sortablejs': ^1.15.0 @@ -18846,17 +19058,17 @@ packages: '@vue/composition-api': optional: true dependencies: - '@types/sortablejs': 1.15.1 + '@types/sortablejs': 1.15.2 dev: true - /vue-eslint-parser@9.3.1(eslint@8.46.0): + /vue-eslint-parser@9.3.1(eslint@8.48.0): resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4(supports-color@8.1.1) - eslint: 8.46.0 + eslint: 8.48.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.2 espree: 9.6.1 @@ -19613,7 +19825,7 @@ packages: name: plyr version: 3.7.0 dependencies: - core-js: 3.32.0 + core-js: 3.32.1 custom-event-polyfill: 1.0.7 loadjs: 4.2.0 rangetouch: 2.0.1 From f1451c659d1b097ceb303cb54d8706b4aecce9a6 Mon Sep 17 00:00:00 2001 From: naskya Date: Sun, 3 Sep 2023 11:18:48 +0900 Subject: [PATCH 18/30] fix: require credentials in the notes/translate endpoint --- docs/api-change.md | 7 +++++++ .../backend/src/server/api/endpoints/notes/translate.ts | 3 +-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 docs/api-change.md diff --git a/docs/api-change.md b/docs/api-change.md new file mode 100644 index 0000000000..4986481bdb --- /dev/null +++ b/docs/api-change.md @@ -0,0 +1,7 @@ +# Changes to the Firefish API + +## v1.0.5 (unreleased) + +### dev11 + +- `notes/translate` now requires credentials. diff --git a/packages/backend/src/server/api/endpoints/notes/translate.ts b/packages/backend/src/server/api/endpoints/notes/translate.ts index 414e761c1c..1e90fb617e 100644 --- a/packages/backend/src/server/api/endpoints/notes/translate.ts +++ b/packages/backend/src/server/api/endpoints/notes/translate.ts @@ -4,7 +4,6 @@ import config from "@/config/index.js"; import { Converter } from "opencc-js"; import { getAgentByUrl } from "@/misc/fetch.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; -import { Notes } from "@/models/index.js"; import { ApiError } from "../../error.js"; import { getNote } from "../../common/getters.js"; import define from "../../define.js"; @@ -12,7 +11,7 @@ import define from "../../define.js"; export const meta = { tags: ["notes"], - requireCredential: false, + requireCredential: true, requireCredentialPrivateMode: true, res: { From 72b3f56b63a3519fa6d67a2c59bf3d1fe79dd440 Mon Sep 17 00:00:00 2001 From: Kyva Iborra Date: Sun, 3 Sep 2023 11:10:00 +0000 Subject: [PATCH 19/30] chore: Translated using Weblate (Spanish) Currently translated at 99.4% (1839 of 1850 strings) Translation: Firefish/locales Translate-URL: https://hosted.weblate.org/projects/firefish/locales/es/ --- locales/es-ES.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 717c6b6a7f..045f2d616c 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -874,7 +874,7 @@ pubSub: "Cuentas Pub/Sub" lastCommunication: "Última comunicación" resolved: "Resuelto" unresolved: "Sin resolver" -breakFollow: "Dejar de seguir" +breakFollow: "Quitar seguidor" itsOn: "¡Está encendido!" itsOff: "¡Está apagado!" emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro From bdc89e55689438755cbd78fa5ff51db218572444 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Fri, 25 Aug 2023 16:27:31 +0200 Subject: [PATCH 20/30] Fix search button not visible in narrow viewport guest mode --- packages/client/src/ui/visitor/b.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/client/src/ui/visitor/b.vue b/packages/client/src/ui/visitor/b.vue index 472dbe829a..5f600a9ff6 100644 --- a/packages/client/src/ui/visitor/b.vue +++ b/packages/client/src/ui/visitor/b.vue @@ -57,6 +57,10 @@ >{{ i18n.ts.gallery }} +

+ + From 12ff93baea6e4ea5900ef697eb1034b546658562 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Sun, 3 Sep 2023 21:18:38 +0000 Subject: [PATCH 24/30] refactor: :recycle: Migrate auth.vue to composition API --- packages/client/src/pages/auth.vue | 181 +++++++++++++---------------- 1 file changed, 82 insertions(+), 99 deletions(-) diff --git a/packages/client/src/pages/auth.vue b/packages/client/src/pages/auth.vue index c1996553c0..c77b4feed4 100644 --- a/packages/client/src/pages/auth.vue +++ b/packages/client/src/pages/auth.vue @@ -45,114 +45,97 @@
- From 4b121cb5493b71f97251b90226795d3ee15111b5 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sun, 3 Sep 2023 14:29:18 -0700 Subject: [PATCH 25/30] if translation exists --- packages/client/src/components/MkNote.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index bfd2b6e68d..16586ab4bc 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -111,7 +111,7 @@ >
-
+
{{ i18n.t("translatedFrom", { From 687cf91608ac2a888471e9ea71274151c06f77b5 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sun, 3 Sep 2023 14:30:14 -0700 Subject: [PATCH 26/30] fix mfm import --- packages/client/src/components/MkNoteSub.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue index e27e838470..acf57576cc 100644 --- a/packages/client/src/components/MkNoteSub.vue +++ b/packages/client/src/components/MkNoteSub.vue @@ -188,7 +188,7 @@ import { computed, inject, ref } from "vue"; import type { Ref } from "vue"; import type * as misskey from "firefish-js"; -import type * as mfm from "mfm-js"; +import * as mfm from "mfm-js"; import { detect as detectLanguage_ } from "tinyld"; import XNoteHeader from "@/components/MkNoteHeader.vue"; import MkSubNoteContent from "@/components/MkSubNoteContent.vue"; From 6d1965ce94c295707e440325b3067c4705785658 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Mon, 4 Sep 2023 02:34:04 +0000 Subject: [PATCH 27/30] feat: :sparkles: `indexable` User property --- locales/en-US.yml | 5 +- .../backend/native-utils/migration/src/lib.rs | 2 + .../src/m20230904_013244_is_indexable.rs | 74 +++++++++++++++++++ .../native-utils/src/model/entity/user.rs | 2 + .../src/model/entity/user_profile.rs | 2 + .../src/models/entities/user-profile.ts | 6 ++ packages/backend/src/models/entities/user.ts | 7 ++ .../backend/src/models/repositories/user.ts | 1 + packages/backend/src/models/schema/user.ts | 5 ++ .../src/remote/activitypub/models/person.ts | 14 ++-- .../src/remote/activitypub/renderer/index.ts | 1 + .../src/remote/activitypub/renderer/person.ts | 1 + .../backend/src/remote/activitypub/type.ts | 3 +- .../server/api/endpoints/admin/show-user.ts | 1 + .../src/server/api/endpoints/i/update.ts | 5 ++ .../src/server/api/endpoints/notes/edit.ts | 2 +- packages/backend/src/services/note/create.ts | 5 +- packages/backend/test/e2e/users.ts | 3 + .../client/src/pages/settings/privacy.vue | 10 +++ 19 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 packages/backend/native-utils/migration/src/m20230904_013244_is_indexable.rs diff --git a/locales/en-US.yml b/locales/en-US.yml index 804b9281b4..8b1aae4815 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -762,8 +762,7 @@ no: "No" driveFilesCount: "Number of Drive files" driveUsage: "Drive space usage" noCrawle: "Reject crawler indexing" -noCrawleDescription: "Ask search engines to not index your profile page, posts, Pages, - etc." +noCrawleDescription: "Ask external search engines to not index your content." lockedAccountInfo: "Unless you set your post visiblity to \"Followers only\", your posts will be visible to anyone, even if you require followers to be manually approved." alwaysMarkSensitive: "Mark as NSFW by default" @@ -1139,6 +1138,8 @@ confirm: "Confirm" importZip: "Import ZIP" exportZip: "Export ZIP" emojiPackCreator: "Emoji pack creator" +indexable: "Indexable" +indexableDescription: "Allow built-in search to show your public posts" languageForTranslation: "Post translation language" detectPostLanguage: "Automatically detect the language and show a translate button for posts in foreign languages" diff --git a/packages/backend/native-utils/migration/src/lib.rs b/packages/backend/native-utils/migration/src/lib.rs index 57ca203f6d..f8be136f46 100644 --- a/packages/backend/native-utils/migration/src/lib.rs +++ b/packages/backend/native-utils/migration/src/lib.rs @@ -6,6 +6,7 @@ mod m20230531_180824_drop_reversi; mod m20230627_185451_index_note_url; mod m20230709_000510_move_antenna_to_cache; mod m20230806_170616_fix_antenna_stream_ids; +mod m20230904_013244_is_indexable; pub struct Migrator; @@ -17,6 +18,7 @@ impl MigratorTrait for Migrator { Box::new(m20230627_185451_index_note_url::Migration), Box::new(m20230709_000510_move_antenna_to_cache::Migration), Box::new(m20230806_170616_fix_antenna_stream_ids::Migration), + Box::new(m20230904_013244_is_indexable::Migration), ] } } diff --git a/packages/backend/native-utils/migration/src/m20230904_013244_is_indexable.rs b/packages/backend/native-utils/migration/src/m20230904_013244_is_indexable.rs new file mode 100644 index 0000000000..84898fd95a --- /dev/null +++ b/packages/backend/native-utils/migration/src/m20230904_013244_is_indexable.rs @@ -0,0 +1,74 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(User::Table) + .add_column( + ColumnDef::new(User::IsIndexable) + .boolean() + .not_null() + .default(true), + ) + .to_owned(), + ) + .await?; + manager + .alter_table( + Table::alter() + .table(UserProfile::Table) + .add_column( + ColumnDef::new(UserProfile::IsIndexable) + .boolean() + .not_null() + .default(true), + ) + .to_owned(), + ) + .await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(User::Table) + .drop_column(User::IsIndexable) + .to_owned(), + ) + .await?; + manager + .alter_table( + Table::alter() + .table(UserProfile::Table) + .drop_column(UserProfile::IsIndexable) + .to_owned(), + ) + .await?; + + Ok(()) + } +} + +/// Learn more at https://docs.rs/sea-query#iden +#[derive(Iden)] +enum User { + Table, + #[iden = "isIndexable"] + IsIndexable, +} + +#[derive(Iden)] +enum UserProfile { + Table, + #[iden = "isIndexable"] + IsIndexable, +} diff --git a/packages/backend/native-utils/src/model/entity/user.rs b/packages/backend/native-utils/src/model/entity/user.rs index e76ae08c7f..7988bec3ad 100644 --- a/packages/backend/native-utils/src/model/entity/user.rs +++ b/packages/backend/native-utils/src/model/entity/user.rs @@ -71,6 +71,8 @@ pub struct Model { pub also_known_as: Option, #[sea_orm(column_name = "speakAsCat")] pub speak_as_cat: bool, + #[sea_orm(column_name = "isIndexable")] + pub is_indexable: bool, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] diff --git a/packages/backend/native-utils/src/model/entity/user_profile.rs b/packages/backend/native-utils/src/model/entity/user_profile.rs index 4c2f903d4b..5fd09dea30 100644 --- a/packages/backend/native-utils/src/model/entity/user_profile.rs +++ b/packages/backend/native-utils/src/model/entity/user_profile.rs @@ -75,6 +75,8 @@ pub struct Model { pub moderation_note: String, #[sea_orm(column_name = "preventAiLearning")] pub prevent_ai_learning: bool, + #[sea_orm(column_name = "isIndexable")] + pub is_indexable: bool, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] diff --git a/packages/backend/src/models/entities/user-profile.ts b/packages/backend/src/models/entities/user-profile.ts index 686fab3439..0b8863867c 100644 --- a/packages/backend/src/models/entities/user-profile.ts +++ b/packages/backend/src/models/entities/user-profile.ts @@ -167,6 +167,12 @@ export class UserProfile { }) public noCrawle: boolean; + @Column("boolean", { + default: true, + comment: "Whether User is indexable.", + }) + public isIndexable: boolean; + @Column("boolean", { default: true, }) diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index 6bbd939b5c..2d5e5dca3e 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -265,6 +265,13 @@ export class User { }) public driveCapacityOverrideMb: number | null; + @Index() + @Column("boolean", { + default: true, + comment: "Whether the User is indexable.", + }) + public isIndexable: boolean; + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index e7c4b6f008..86bef413b5 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -454,6 +454,7 @@ export const UserRepository = db.getRepository(User).extend({ isModerator: user.isModerator || falsy, isBot: user.isBot || falsy, isLocked: user.isLocked, + isIndexable: user.isIndexable, isCat: user.isCat || falsy, speakAsCat: user.speakAsCat || falsy, instance: user.host diff --git a/packages/backend/src/models/schema/user.ts b/packages/backend/src/models/schema/user.ts index 4c840d0bac..d625308f00 100644 --- a/packages/backend/src/models/schema/user.ts +++ b/packages/backend/src/models/schema/user.ts @@ -66,6 +66,11 @@ export const packedUserLiteSchema = { nullable: false, optional: true, }, + isIndexable: { + type: "boolean", + nullable: false, + optional: true, + }, speakAsCat: { type: "boolean", nullable: false, diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index dab2b9a6ee..564de3661c 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -205,10 +205,10 @@ export async function createPerson( if (typeof person.followers === "string") { try { - let data = await fetch(person.followers, { + const data = await fetch(person.followers, { headers: { Accept: "application/json" }, }); - let json_data = JSON.parse(await data.text()); + const json_data = JSON.parse(await data.text()); followersCount = json_data.totalItems; } catch { @@ -220,10 +220,10 @@ export async function createPerson( if (typeof person.following === "string") { try { - let data = await fetch(person.following, { + const data = await fetch(person.following, { headers: { Accept: "application/json" }, }); - let json_data = JSON.parse(await data.text()); + const json_data = JSON.parse(await data.text()); followingCount = json_data.totalItems; } catch (e) { @@ -235,10 +235,10 @@ export async function createPerson( if (typeof person.outbox === "string") { try { - let data = await fetch(person.outbox, { + const data = await fetch(person.outbox, { headers: { Accept: "application/json" }, }); - let json_data = JSON.parse(await data.text()); + const json_data = JSON.parse(await data.text()); notesCount = json_data.totalItems; } catch (e) { @@ -302,6 +302,7 @@ export async function createPerson( tags, isBot, isCat: (person as any).isCat === true, + isIndexable: person.indexable, }), )) as IRemoteUser; @@ -547,6 +548,7 @@ export async function updatePerson( tags, isBot: getApType(object) !== "Person", isCat: (person as any).isCat === true, + isIndexable: person.indexable, isLocked: !!person.manuallyApprovesFollowers, movedToUri: person.movedTo || null, alsoKnownAs: person.alsoKnownAs || null, diff --git a/packages/backend/src/remote/activitypub/renderer/index.ts b/packages/backend/src/remote/activitypub/renderer/index.ts index 7b98cf2d77..bb5dcdfc19 100644 --- a/packages/backend/src/remote/activitypub/renderer/index.ts +++ b/packages/backend/src/remote/activitypub/renderer/index.ts @@ -30,6 +30,7 @@ export const renderActivity = (x: any): IActivity | null => { Emoji: "toot:Emoji", featured: "toot:featured", discoverable: "toot:discoverable", + indexable: "toot:indexable", // schema schema: "http://schema.org#", PropertyValue: "schema:PropertyValue", diff --git a/packages/backend/src/remote/activitypub/renderer/person.ts b/packages/backend/src/remote/activitypub/renderer/person.ts index 1122a3a279..d91c0a9114 100644 --- a/packages/backend/src/remote/activitypub/renderer/person.ts +++ b/packages/backend/src/remote/activitypub/renderer/person.ts @@ -81,6 +81,7 @@ export async function renderPerson(user: ILocalUser) { discoverable: !!user.isExplorable, publicKey: renderKey(user, keypair, "#main-key"), isCat: user.isCat, + indexable: user.isIndexable, attachment: attachment.length ? attachment : undefined, } as any; diff --git a/packages/backend/src/remote/activitypub/type.ts b/packages/backend/src/remote/activitypub/type.ts index b0bdb0a8b4..ecaf6d6872 100644 --- a/packages/backend/src/remote/activitypub/type.ts +++ b/packages/backend/src/remote/activitypub/type.ts @@ -190,8 +190,9 @@ export interface IActor extends IObject { movedTo?: string; alsoKnownAs?: string[]; discoverable?: boolean; + indexable?: boolean; inbox: string; - sharedInbox?: string; // backward compatibility.. ig + sharedInbox?: string; // Backwards compatibility publicKey?: { id: string; publicKeyPem: string; diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index 7a2bf23651..3c3a0913d0 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -60,6 +60,7 @@ export default define(meta, paramDef, async (ps, me) => { emailVerified: profile.emailVerified, autoAcceptFollowed: profile.autoAcceptFollowed, noCrawle: profile.noCrawle, + isIndexable: profile.isIndexable, preventAiLearning: profile.preventAiLearning, alwaysMarkNsfw: profile.alwaysMarkNsfw, autoSensitive: profile.autoSensitive, diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 6d3bde2b8d..0037839b5c 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -120,6 +120,7 @@ export const paramDef = { isBot: { type: "boolean" }, isCat: { type: "boolean" }, speakAsCat: { type: "boolean" }, + isIndexable: { type: "boolean" }, injectFeaturedNote: { type: "boolean" }, receiveAnnouncementEmail: { type: "boolean" }, alwaysMarkNsfw: { type: "boolean" }, @@ -206,6 +207,10 @@ export default define(meta, paramDef, async (ps, _user, token) => { if (typeof ps.preventAiLearning === "boolean") profileUpdates.preventAiLearning = ps.preventAiLearning; if (typeof ps.isCat === "boolean") updates.isCat = ps.isCat; + if (typeof ps.isIndexable === "boolean") { + updates.isIndexable = ps.isIndexable; + profileUpdates.isIndexable = ps.isIndexable; + } if (typeof ps.speakAsCat === "boolean") updates.speakAsCat = ps.speakAsCat; if (typeof ps.injectFeaturedNote === "boolean") profileUpdates.injectFeaturedNote = ps.injectFeaturedNote; diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index a80a08a4cb..8daf44b48f 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -608,7 +608,7 @@ export default define(meta, paramDef, async (ps, user) => { throw new ApiError(meta.errors.noSuchNote); } - if (publishing) { + if (publishing && user.isIndexable) { index(note, true); // Publish update event for the updated note details diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 689bd66162..18b524ecb2 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -165,6 +165,7 @@ export default async ( createdAt: User["createdAt"]; isBot: User["isBot"]; inbox?: User["inbox"]; + isIndexable?: User["isIndexable"]; }, data: Option, silent = false, @@ -652,7 +653,9 @@ export default async ( } // Register to search database - await index(note, false); + if (user.isIndexable) { + await index(note, false); + } }); async function renderNoteOrRenoteActivity(data: Option, note: Note) { diff --git a/packages/backend/test/e2e/users.ts b/packages/backend/test/e2e/users.ts index 721ffc2f59..1090dc1cb5 100644 --- a/packages/backend/test/e2e/users.ts +++ b/packages/backend/test/e2e/users.ts @@ -151,6 +151,7 @@ describe("ユーザー", () => { carefulBot: user.carefulBot, autoAcceptFollowed: user.autoAcceptFollowed, noCrawle: user.noCrawle, + isIndexable: user.isIndexable, preventAiLearning: user.preventAiLearning, isExplorable: user.isExplorable, isDeleted: user.isDeleted, @@ -529,6 +530,8 @@ describe("ユーザー", () => { { parameters: (): object => ({ autoAcceptFollowed: false }) }, { parameters: (): object => ({ noCrawle: true }) }, { parameters: (): object => ({ noCrawle: false }) }, + { parameters: (): object => ({ isIndexable: true }) }, + { parameters: (): object => ({ isIndexable: false }) }, { parameters: (): object => ({ preventAiLearning: false }) }, { parameters: (): object => ({ preventAiLearning: true }) }, { parameters: (): object => ({ isBot: true }) }, diff --git a/packages/client/src/pages/settings/privacy.vue b/packages/client/src/pages/settings/privacy.vue index 2957a117fc..acadf4d5da 100644 --- a/packages/client/src/pages/settings/privacy.vue +++ b/packages/client/src/pages/settings/privacy.vue @@ -52,6 +52,14 @@ i18n.ts.hideOnlineStatusDescription }} + + {{ i18n.ts.indexable }} + + Date: Mon, 4 Sep 2023 14:14:22 +0900 Subject: [PATCH 28/30] chore: update docs/MR template --- .gitlab/merge_request_templates/default.md | 5 ++- CONTRIBUTING.md | 38 +++++++++++----------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.gitlab/merge_request_templates/default.md b/.gitlab/merge_request_templates/default.md index ece10a8505..401688dc61 100644 --- a/.gitlab/merge_request_templates/default.md +++ b/.gitlab/merge_request_templates/default.md @@ -3,10 +3,13 @@ **What does this PR do?** _(Please give us a brief description of what this PR does.)_ **Contribution Guidelines** -By submitting this issue, you agree to follow our [Contribution Guidelines](https://git.joinfirefish.org/firefish/firefish/-/blob/develop/CONTRIBUTING.md) +By submitting this merge request, you agree to follow our [Contribution Guidelines](https://git.joinfirefish.org/firefish/firefish/-/blob/develop/CONTRIBUTING.md) - [ ] I agree to follow this project's Contribution Guidelines - [ ] I have made sure to test this pull request - [ ] I have made sure to run `pnpm run format` before submitting this pull request +If this merge request makes changes to the Firefish API, please update `docs/api-change.md` +- [ ] I updated the documentation + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 77b10c5e9f..b9529ea737 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,31 +23,32 @@ Before creating an issue, please check the following: > Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged. ## Before implementation -When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented. +When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the MR will not be merged even if it is implemented. -At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them. -PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review. +At this point, you also need to clarify the goals of the MR you will create, and make sure that the other members of the team are aware of them. +MRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review. Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work. ## Well-known branches - The **`main`** branch is tracking the latest release and used for production purposes. - The **`develop`** branch is where we work for the next release. - - When you create a PR, basically target it to this branch. **But create a different branch** + - When you create a MR, basically target it to this branch. **But create a different branch** - The **`l10n_develop`** branch is reserved for localization management. - **`feature/*`** branches are reserved for the development of a specific feature -## Creating a PR -Thank you for your PR! Before creating a PR, please check the following: -- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below. - - `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc. You are also welcome to use gitmoji. This is important as we use these to A) easier read the git history and B) generate our changelog. Without propper prefixing it is possible that your PR is rejected. - - Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR. -- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text. Good examples include `Closing: #21` or `Resolves: #21` +## Creating a merge request (MR) +Thank you for your MR! Before creating a MR, please check the following: +- If possible, prefix the title with a keyword that identifies the type of this MR, as shown below. + - `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc. You are also welcome to use gitmoji. This is important as we use these to A) easier read the git history and B) generate our changelog. Without propper prefixing it is possible that your MR is rejected. + - Also, make sure that the granularity of this MR is appropriate. Please do not include more than one type of change or interest in a single MR. +- If there is an Issue which will be resolved by this MR, please include a reference to the Issue in the text. Good examples include `Closing: #21` or `Resolves: #21` - Check if there are any documents that need to be created or updated due to this change. + - For example, you need to update `docs/api-change.md` if the MR includes API changes. - If you have added a feature or fixed a bug, please add a test case if possible. - Please make sure that formatting, tests and Lint are passed in advance. - You can run it with `pnpm run format`, `pnpm run test` and `pnpm run lint`. [See more info](#testing) -- If this PR includes UI changes, please attach a screenshot in the text. +- If this MR includes UI changes, please attach a screenshot in the text. Thanks for your cooperation 🤗 @@ -56,12 +57,12 @@ Be willing to comment on the good points and not just the things you want fixed ### Review perspective - Scope - - Are the goals of the PR clear? - - Is the granularity of the PR appropriate? + - Are the goals of the MR clear? + - Is the granularity of the MR appropriate? - Security - - Does merging this PR create a vulnerability? + - Does merging this MR create a vulnerability? - Performance - - Will merging this PR cause unexpected performance degradation? + - Will merging this MR cause unexpected performance degradation? - Is there a more efficient way? - Testing - Does the test ensure the expected behavior? @@ -69,12 +70,14 @@ Be willing to comment on the good points and not just the things you want fixed - Does it check for anomalies? ## Deploy (SOON) -The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment. +The `/deploy` command by issue comment can be used to deploy the contents of a MR to the preview environment. ``` /deploy sha= ``` An actual domain will be assigned so you can test the federation. +# THE FOLLOWING IS OUTDATED: + ## Merge ## Release @@ -95,9 +98,6 @@ During development, it is useful to use the `yarn dev` command. This command monitors the server-side and client-side source files and automatically builds them if they are modified. In addition, it will also automatically start the Misskey server process. - -# THE FOLLOWING IS OUTDATED: - ## Testing - Test codes are located in [`/test`](/test). From 587840ec370d055c88a87bdd4125638d0507cde6 Mon Sep 17 00:00:00 2001 From: naskya Date: Mon, 4 Sep 2023 18:18:43 +0900 Subject: [PATCH 29/30] fix: don't show translate button if signed out --- packages/client/src/components/MkNote.vue | 6 +++++- packages/client/src/components/MkNoteSub.vue | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 16586ab4bc..c39811e92a 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -220,7 +220,11 @@