From acdcd7c623fccf6a3e02caebafac1c53cd180c20 Mon Sep 17 00:00:00 2001 From: Caipira Date: Wed, 24 May 2023 09:43:38 +0900 Subject: [PATCH 001/133] enhance(frontend): improve signup complete ui (#10876) * enhance(frontend): improve signup complete ui * relocation * tweak * Update _boot_.ts --------- Co-authored-by: syuilo --- packages/frontend/src/_boot_.ts | 4 +- .../frontend/src/pages/signup-complete.vue | 90 ++++++++++++++----- 2 files changed, 71 insertions(+), 23 deletions(-) diff --git a/packages/frontend/src/_boot_.ts b/packages/frontend/src/_boot_.ts index a8efafca6..921c16176 100644 --- a/packages/frontend/src/_boot_.ts +++ b/packages/frontend/src/_boot_.ts @@ -5,7 +5,9 @@ import '@/style.scss'; import { mainBoot } from './boot/main-boot'; import { subBoot } from './boot/sub-boot'; -if (['/share', '/auth', '/miauth'].includes(location.pathname)) { +const subBootPaths = ['/share', '/auth', '/miauth', '/signup-complete']; + +if (subBootPaths.some(i => location.pathname === i || location.pathname.startsWith(i + '/'))) { subBoot(); } else { mainBoot(); diff --git a/packages/frontend/src/pages/signup-complete.vue b/packages/frontend/src/pages/signup-complete.vue index 079cbb3d3..2700601c4 100644 --- a/packages/frontend/src/pages/signup-complete.vue +++ b/packages/frontend/src/pages/signup-complete.vue @@ -1,37 +1,83 @@ + + From ed902658a97802942d0d823dfaa9ff46fa4c7598 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 24 May 2023 09:59:30 +0900 Subject: [PATCH 002/133] refactor --- packages/backend/src/GlobalModule.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/GlobalModule.ts b/packages/backend/src/GlobalModule.ts index 5fb4e8ef3..564787392 100644 --- a/packages/backend/src/GlobalModule.ts +++ b/packages/backend/src/GlobalModule.ts @@ -4,7 +4,7 @@ import * as Redis from 'ioredis'; import { DataSource } from 'typeorm'; import { MeiliSearch } from 'meilisearch'; import { DI } from './di-symbols.js'; -import { loadConfig } from './config.js'; +import { Config, loadConfig } from './config.js'; import { createPostgresDataSource } from './postgres.js'; import { RepositoryModule } from './models/RepositoryModule.js'; import type { Provider, OnApplicationShutdown } from '@nestjs/common'; @@ -25,7 +25,7 @@ const $db: Provider = { const $meilisearch: Provider = { provide: DI.meilisearch, - useFactory: (config) => { + useFactory: (config: Config) => { if (config.meilisearch) { return new MeiliSearch({ host: `${config.meilisearch.ssl ? 'https' : 'http' }://${config.meilisearch.host}:${config.meilisearch.port}`, @@ -40,7 +40,7 @@ const $meilisearch: Provider = { const $redis: Provider = { provide: DI.redis, - useFactory: (config) => { + useFactory: (config: Config) => { return new Redis.Redis({ port: config.redis.port, host: config.redis.host, @@ -55,7 +55,7 @@ const $redis: Provider = { const $redisForPub: Provider = { provide: DI.redisForPub, - useFactory: (config) => { + useFactory: (config: Config) => { const redis = new Redis.Redis({ port: config.redisForPubsub.port, host: config.redisForPubsub.host, @@ -71,7 +71,7 @@ const $redisForPub: Provider = { const $redisForSub: Provider = { provide: DI.redisForSub, - useFactory: (config) => { + useFactory: (config: Config) => { const redis = new Redis.Redis({ port: config.redisForPubsub.port, host: config.redisForPubsub.host, From 1de774fa3d39beef4fee1b3b1287745194e577f1 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 24 May 2023 10:16:42 +0900 Subject: [PATCH 003/133] update deps --- package.json | 2 +- packages/backend/package.json | 14 +- packages/frontend/package.json | 50 +- pnpm-lock.yaml | 1303 +++++++++++++++++--------------- 4 files changed, 716 insertions(+), 653 deletions(-) diff --git a/package.json b/package.json index 7b5d729b7..772362319 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/parser": "5.59.5", "cross-env": "7.0.3", - "cypress": "12.12.0", + "cypress": "12.13.0", "eslint": "8.40.0", "start-server-and-test": "2.0.0" }, diff --git a/packages/backend/package.json b/packages/backend/package.json index 1fca0cdef..4aa79222f 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -63,9 +63,9 @@ "@fastify/multipart": "7.6.0", "@fastify/static": "6.10.1", "@fastify/view": "7.4.1", - "@nestjs/common": "9.4.1", - "@nestjs/core": "9.4.1", - "@nestjs/testing": "9.4.1", + "@nestjs/common": "9.4.2", + "@nestjs/core": "9.4.2", + "@nestjs/testing": "9.4.2", "@peertube/http-signature": "1.7.0", "@sinonjs/fake-timers": "10.0.2", "@swc/cli": "0.1.62", @@ -103,7 +103,7 @@ "jsdom": "21.1.1", "json5": "2.2.3", "jsonld": "8.1.1", - "meilisearch": "0.32.3", + "meilisearch": "0.32.4", "jsrsasign": "10.8.6", "mfm-js": "0.23.3", "mime-types": "2.1.35", @@ -179,11 +179,11 @@ "@types/jsonld": "1.5.8", "@types/jsrsasign": "10.5.8", "@types/mime-types": "2.1.1", - "@types/node": "20.2.1", + "@types/node": "20.2.3", "@types/node-fetch": "3.0.3", "@types/nodemailer": "6.4.8", "@types/oauth": "0.9.1", - "@types/pg": "8.6.6", + "@types/pg": "8.10.1", "@types/pug": "2.0.6", "@types/punycode": "2.1.0", "@types/qrcode": "1.5.0", @@ -197,7 +197,7 @@ "@types/sinonjs__fake-timers": "8.1.2", "@types/tinycolor2": "1.4.3", "@types/tmp": "0.2.3", - "@types/unzipper": "0.10.5", + "@types/unzipper": "0.10.6", "@types/uuid": "9.0.1", "@types/vary": "1.1.0", "@types/web-push": "3.3.2", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index a32cfbd8a..9a471c9c0 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -22,7 +22,7 @@ "@syuilo/aiscript": "0.13.3", "@tabler/icons-webfont": "2.17.0", "@vitejs/plugin-vue": "4.2.3", - "@vue-macros/reactivity-transform": "0.3.7", + "@vue-macros/reactivity-transform": "0.3.8", "@vue/compiler-sfc": "3.3.4", "autosize": "6.0.1", "broadcast-channel": "4.20.2", @@ -53,7 +53,7 @@ "punycode": "2.3.0", "querystring": "0.2.1", "rndstr": "1.0.0", - "rollup": "3.22.0", + "rollup": "3.23.0", "s-age": "1.1.2", "sanitize-html": "2.10.0", "sass": "1.62.1", @@ -77,37 +77,37 @@ "vuedraggable": "next" }, "devDependencies": { - "@storybook/addon-actions": "7.0.12", - "@storybook/addon-essentials": "7.0.12", - "@storybook/addon-interactions": "7.0.12", - "@storybook/addon-links": "7.0.12", - "@storybook/addon-storysource": "7.0.12", - "@storybook/addons": "7.0.12", - "@storybook/blocks": "7.0.12", - "@storybook/core-events": "7.0.12", + "@storybook/addon-actions": "7.0.15", + "@storybook/addon-essentials": "7.0.15", + "@storybook/addon-interactions": "7.0.15", + "@storybook/addon-links": "7.0.15", + "@storybook/addon-storysource": "7.0.15", + "@storybook/addons": "7.0.15", + "@storybook/blocks": "7.0.15", + "@storybook/core-events": "7.0.15", "@storybook/jest": "0.1.0", - "@storybook/manager-api": "7.0.12", - "@storybook/preview-api": "7.0.12", - "@storybook/react": "7.0.12", - "@storybook/react-vite": "7.0.12", + "@storybook/manager-api": "7.0.15", + "@storybook/preview-api": "7.0.15", + "@storybook/react": "7.0.15", + "@storybook/react-vite": "7.0.15", "@storybook/testing-library": "0.1.0", - "@storybook/theming": "7.0.12", - "@storybook/types": "7.0.12", - "@storybook/vue3": "7.0.12", - "@storybook/vue3-vite": "7.0.12", + "@storybook/theming": "7.0.15", + "@storybook/types": "7.0.15", + "@storybook/vue3": "7.0.15", + "@storybook/vue3-vite": "7.0.15", "@testing-library/jest-dom": "5.16.5", "@testing-library/vue": "7.0.0", "@types/escape-regexp": "0.0.1", "@types/estree": "1.0.1", "@types/gulp": "4.0.10", "@types/gulp-rename": "2.0.2", - "@types/matter-js": "0.18.3", + "@types/matter-js": "0.18.4", "@types/micromatch": "4.0.2", - "@types/node": "20.2.1", + "@types/node": "20.2.3", "@types/punycode": "2.1.0", "@types/sanitize-html": "2.9.0", "@types/seedrandom": "3.0.5", - "@types/testing-library__jest-dom": "^5.14.5", + "@types/testing-library__jest-dom": "^5.14.6", "@types/throttle-debounce": "5.0.0", "@types/tinycolor2": "1.4.3", "@types/uuid": "9.0.1", @@ -117,13 +117,13 @@ "@typescript-eslint/parser": "5.59.5", "@vitest/coverage-c8": "0.31.1", "@vue/runtime-core": "3.3.4", - "astring": "1.8.4", + "astring": "1.8.5", "chokidar-cli": "3.0.0", "cross-env": "7.0.3", - "cypress": "12.12.0", + "cypress": "12.13.0", "eslint": "8.40.0", "eslint-plugin-import": "2.27.5", - "eslint-plugin-vue": "9.13.0", + "eslint-plugin-vue": "9.14.0", "fast-glob": "3.2.12", "happy-dom": "9.19.2", "micromatch": "3.1.10", @@ -133,7 +133,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "start-server-and-test": "2.0.0", - "storybook": "7.0.12", + "storybook": "7.0.15", "storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme", "summaly": "github:misskey-dev/summaly", "vite-plugin-turbosnap": "1.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9214dadb0..2ab17897f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,8 +53,8 @@ importers: specifier: 7.0.3 version: 7.0.3 cypress: - specifier: 12.12.0 - version: 12.12.0 + specifier: 12.13.0 + version: 12.13.0 eslint: specifier: 8.40.0 version: 8.40.0 @@ -107,14 +107,14 @@ importers: specifier: 7.4.1 version: 7.4.1 '@nestjs/common': - specifier: 9.4.1 - version: 9.4.1(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: 9.4.2 + version: 9.4.2(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': - specifier: 9.4.1 - version: 9.4.1(@nestjs/common@9.4.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: 9.4.2 + version: 9.4.2(@nestjs/common@9.4.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/testing': - specifier: 9.4.1 - version: 9.4.1(@nestjs/common@9.4.1)(@nestjs/core@9.4.1) + specifier: 9.4.2 + version: 9.4.2(@nestjs/common@9.4.2)(@nestjs/core@9.4.2) '@peertube/http-signature': specifier: 1.7.0 version: 1.7.0 @@ -230,8 +230,8 @@ importers: specifier: 10.8.6 version: 10.8.6 meilisearch: - specifier: 0.32.3 - version: 0.32.3 + specifier: 0.32.4 + version: 0.32.4 mfm-js: specifier: 0.23.3 version: 0.23.3 @@ -526,8 +526,8 @@ importers: specifier: 2.1.1 version: 2.1.1 '@types/node': - specifier: 20.2.1 - version: 20.2.1 + specifier: 20.2.3 + version: 20.2.3 '@types/node-fetch': specifier: 3.0.3 version: 3.0.3 @@ -538,8 +538,8 @@ importers: specifier: 0.9.1 version: 0.9.1 '@types/pg': - specifier: 8.6.6 - version: 8.6.6 + specifier: 8.10.1 + version: 8.10.1 '@types/pug': specifier: 2.0.6 version: 2.0.6 @@ -580,8 +580,8 @@ importers: specifier: 0.2.3 version: 0.2.3 '@types/unzipper': - specifier: 0.10.5 - version: 0.10.5 + specifier: 0.10.6 + version: 0.10.6 '@types/uuid': specifier: 9.0.1 version: 9.0.1 @@ -620,7 +620,7 @@ importers: version: 6.1.0 jest: specifier: 29.5.0 - version: 29.5.0(@types/node@20.2.1) + version: 29.5.0(@types/node@20.2.3) jest-mock: specifier: 29.5.0 version: 29.5.0 @@ -632,16 +632,16 @@ importers: version: 14.1.2 '@rollup/plugin-alias': specifier: 5.0.0 - version: 5.0.0(rollup@3.22.0) + version: 5.0.0(rollup@3.23.0) '@rollup/plugin-json': specifier: 6.0.0 - version: 6.0.0(rollup@3.22.0) + version: 6.0.0(rollup@3.23.0) '@rollup/plugin-replace': specifier: 5.0.2 - version: 5.0.2(rollup@3.22.0) + version: 5.0.2(rollup@3.23.0) '@rollup/pluginutils': specifier: 5.0.2 - version: 5.0.2(rollup@3.22.0) + version: 5.0.2(rollup@3.23.0) '@syuilo/aiscript': specifier: 0.13.3 version: 0.13.3 @@ -652,8 +652,8 @@ importers: specifier: 4.2.3 version: 4.2.3(vite@4.3.8)(vue@3.3.4) '@vue-macros/reactivity-transform': - specifier: 0.3.7 - version: 0.3.7(rollup@3.22.0)(vue@3.3.4) + specifier: 0.3.8 + version: 0.3.8(rollup@3.23.0)(vue@3.3.4) '@vue/compiler-sfc': specifier: 3.3.4 version: 3.3.4 @@ -745,8 +745,8 @@ importers: specifier: 1.0.0 version: 1.0.0 rollup: - specifier: 3.22.0 - version: 3.22.0 + specifier: 3.23.0 + version: 3.23.0 s-age: specifier: 1.1.2 version: 1.1.2 @@ -797,7 +797,7 @@ importers: version: 1.8.0 vite: specifier: 4.3.8 - version: 4.3.8(@types/node@20.2.1)(sass@1.62.1) + version: 4.3.8(@types/node@20.2.3)(sass@1.62.1) vue: specifier: 3.3.4 version: 3.3.4 @@ -812,59 +812,59 @@ importers: version: 4.1.0(vue@3.3.4) devDependencies: '@storybook/addon-actions': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-essentials': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-interactions': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-links': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-storysource': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/addons': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/blocks': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': - specifier: 7.0.12 - version: 7.0.12 + specifier: 7.0.15 + version: 7.0.15 '@storybook/jest': specifier: 0.1.0 version: 0.1.0 '@storybook/manager-api': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/preview-api': - specifier: 7.0.12 - version: 7.0.12 + specifier: 7.0.15 + version: 7.0.15 '@storybook/react': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) '@storybook/react-vite': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.8) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.8) '@storybook/testing-library': specifier: 0.1.0 version: 0.1.0 '@storybook/theming': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0) '@storybook/types': - specifier: 7.0.12 - version: 7.0.12 + specifier: 7.0.15 + version: 7.0.15 '@storybook/vue3': - specifier: 7.0.12 - version: 7.0.12(vue@3.3.4) + specifier: 7.0.15 + version: 7.0.15(vue@3.3.4) '@storybook/vue3-vite': - specifier: 7.0.12 - version: 7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.8)(vue@3.3.4) + specifier: 7.0.15 + version: 7.0.15(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.8)(vue@3.3.4) '@testing-library/jest-dom': specifier: 5.16.5 version: 5.16.5 @@ -884,14 +884,14 @@ importers: specifier: 2.0.2 version: 2.0.2 '@types/matter-js': - specifier: 0.18.3 - version: 0.18.3 + specifier: 0.18.4 + version: 0.18.4 '@types/micromatch': specifier: 4.0.2 version: 4.0.2 '@types/node': - specifier: 20.2.1 - version: 20.2.1 + specifier: 20.2.3 + version: 20.2.3 '@types/punycode': specifier: 2.1.0 version: 2.1.0 @@ -902,8 +902,8 @@ importers: specifier: 3.0.5 version: 3.0.5 '@types/testing-library__jest-dom': - specifier: ^5.14.5 - version: 5.14.5 + specifier: ^5.14.6 + version: 5.14.6 '@types/throttle-debounce': specifier: 5.0.0 version: 5.0.0 @@ -932,8 +932,8 @@ importers: specifier: 3.3.4 version: 3.3.4 astring: - specifier: 1.8.4 - version: 1.8.4 + specifier: 1.8.5 + version: 1.8.5 chokidar-cli: specifier: 3.0.0 version: 3.0.0 @@ -941,8 +941,8 @@ importers: specifier: 7.0.3 version: 7.0.3 cypress: - specifier: 12.12.0 - version: 12.12.0 + specifier: 12.13.0 + version: 12.13.0 eslint: specifier: 8.40.0 version: 8.40.0 @@ -950,8 +950,8 @@ importers: specifier: 2.27.5 version: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint@8.40.0) eslint-plugin-vue: - specifier: 9.13.0 - version: 9.13.0(eslint@8.40.0) + specifier: 9.14.0 + version: 9.14.0(eslint@8.40.0) fast-glob: specifier: 3.2.12 version: 3.2.12 @@ -980,11 +980,11 @@ importers: specifier: 2.0.0 version: 2.0.0 storybook: - specifier: 7.0.12 - version: 7.0.12 + specifier: 7.0.15 + version: 7.0.15 storybook-addon-misskey-theme: specifier: github:misskey-dev/storybook-addon-misskey-theme - version: github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.0.12)(@storybook/components@7.0.12)(@storybook/core-events@7.0.12)(@storybook/manager-api@7.0.12)(@storybook/preview-api@7.0.12)(@storybook/theming@7.0.12)(@storybook/types@7.0.12)(react-dom@18.2.0)(react@18.2.0) + version: github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.0.15)(@storybook/components@7.0.15)(@storybook/core-events@7.0.15)(@storybook/manager-api@7.0.15)(@storybook/preview-api@7.0.15)(@storybook/theming@7.0.15)(@storybook/types@7.0.15)(react-dom@18.2.0)(react@18.2.0) summaly: specifier: github:misskey-dev/summaly version: github.com/misskey-dev/summaly/77dd5654bb82280b38c1f50e51a771c33f3df503 @@ -1188,13 +1188,13 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/chunked-blob-reader@3.310.0: resolution: {integrity: sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg==} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/client-s3@3.321.1: @@ -1295,7 +1295,7 @@ packages: '@aws-sdk/util-user-agent-browser': 3.310.0 '@aws-sdk/util-user-agent-node': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 transitivePeerDependencies: - aws-crt dev: false @@ -1335,7 +1335,7 @@ packages: '@aws-sdk/util-user-agent-browser': 3.310.0 '@aws-sdk/util-user-agent-node': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 transitivePeerDependencies: - aws-crt dev: false @@ -1379,7 +1379,7 @@ packages: '@aws-sdk/util-user-agent-node': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 fast-xml-parser: 4.1.2 - tslib: 2.5.0 + tslib: 2.5.2 transitivePeerDependencies: - aws-crt dev: false @@ -1391,7 +1391,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-config-provider': 3.310.0 '@aws-sdk/util-middleware': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/credential-provider-env@3.310.0: @@ -1400,7 +1400,7 @@ packages: dependencies: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/credential-provider-imds@3.310.0: @@ -1411,7 +1411,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/types': 3.310.0 '@aws-sdk/url-parser': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/credential-provider-ini@3.321.1: @@ -1426,7 +1426,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 transitivePeerDependencies: - aws-crt dev: false @@ -1444,7 +1444,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 transitivePeerDependencies: - aws-crt dev: false @@ -1456,7 +1456,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/credential-provider-sso@3.321.1: @@ -1468,7 +1468,7 @@ packages: '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/token-providers': 3.321.1 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 transitivePeerDependencies: - aws-crt dev: false @@ -1479,7 +1479,7 @@ packages: dependencies: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/eventstream-codec@3.310.0: @@ -1488,7 +1488,7 @@ packages: '@aws-crypto/crc32': 3.0.0 '@aws-sdk/types': 3.310.0 '@aws-sdk/util-hex-encoding': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/eventstream-serde-browser@3.310.0: @@ -1497,7 +1497,7 @@ packages: dependencies: '@aws-sdk/eventstream-serde-universal': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/eventstream-serde-config-resolver@3.310.0: @@ -1505,7 +1505,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/eventstream-serde-node@3.310.0: @@ -1514,7 +1514,7 @@ packages: dependencies: '@aws-sdk/eventstream-serde-universal': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/eventstream-serde-universal@3.310.0: @@ -1523,7 +1523,7 @@ packages: dependencies: '@aws-sdk/eventstream-codec': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/fetch-http-handler@3.310.0: @@ -1533,7 +1533,7 @@ packages: '@aws-sdk/querystring-builder': 3.310.0 '@aws-sdk/types': 3.310.0 '@aws-sdk/util-base64': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/hash-blob-browser@3.310.0: @@ -1541,7 +1541,7 @@ packages: dependencies: '@aws-sdk/chunked-blob-reader': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/hash-node@3.310.0: @@ -1551,7 +1551,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-buffer-from': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/hash-stream-node@3.310.0: @@ -1560,21 +1560,21 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/invalid-dependency@3.310.0: resolution: {integrity: sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/is-array-buffer@3.310.0: resolution: {integrity: sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/lib-storage@3.321.1(@aws-sdk/abort-controller@3.310.0)(@aws-sdk/client-s3@3.321.1): @@ -1599,7 +1599,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-bucket-endpoint@3.310.0: @@ -1610,7 +1610,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-arn-parser': 3.310.0 '@aws-sdk/util-config-provider': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-content-length@3.310.0: @@ -1619,7 +1619,7 @@ packages: dependencies: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-endpoint@3.310.0: @@ -1630,7 +1630,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/url-parser': 3.310.0 '@aws-sdk/util-middleware': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-expect-continue@3.310.0: @@ -1639,7 +1639,7 @@ packages: dependencies: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-flexible-checksums@3.310.0: @@ -1652,7 +1652,7 @@ packages: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-host-header@3.310.0: @@ -1661,7 +1661,7 @@ packages: dependencies: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-location-constraint@3.310.0: @@ -1669,7 +1669,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-logger@3.310.0: @@ -1677,7 +1677,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-recursion-detection@3.310.0: @@ -1686,7 +1686,7 @@ packages: dependencies: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-retry@3.310.0: @@ -1698,7 +1698,7 @@ packages: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-middleware': 3.310.0 '@aws-sdk/util-retry': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 uuid: 8.3.2 dev: false @@ -1709,7 +1709,7 @@ packages: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 '@aws-sdk/util-arn-parser': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-sdk-sts@3.310.0: @@ -1718,7 +1718,7 @@ packages: dependencies: '@aws-sdk/middleware-signing': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-serde@3.310.0: @@ -1726,7 +1726,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-signing@3.310.0: @@ -1738,7 +1738,7 @@ packages: '@aws-sdk/signature-v4': 3.310.0 '@aws-sdk/types': 3.310.0 '@aws-sdk/util-middleware': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-ssec@3.310.0: @@ -1746,14 +1746,14 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-stack@3.310.0: resolution: {integrity: sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/middleware-user-agent@3.319.0: @@ -1763,7 +1763,7 @@ packages: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/types': 3.310.0 '@aws-sdk/util-endpoints': 3.319.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/node-config-provider@3.310.0: @@ -1773,7 +1773,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/node-http-handler@3.321.1: @@ -1792,7 +1792,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/protocol-http@3.310.0: @@ -1800,7 +1800,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/querystring-builder@3.310.0: @@ -1809,7 +1809,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 '@aws-sdk/util-uri-escape': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/querystring-parser@3.310.0: @@ -1817,7 +1817,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/service-error-classification@3.310.0: @@ -1830,7 +1830,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/signature-v4-multi-region@3.310.0: @@ -1845,7 +1845,7 @@ packages: '@aws-sdk/protocol-http': 3.310.0 '@aws-sdk/signature-v4': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/signature-v4@3.310.0: @@ -1858,7 +1858,7 @@ packages: '@aws-sdk/util-middleware': 3.310.0 '@aws-sdk/util-uri-escape': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/smithy-client@3.316.0: @@ -1867,7 +1867,7 @@ packages: dependencies: '@aws-sdk/middleware-stack': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/token-providers@3.321.1: @@ -1878,7 +1878,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/shared-ini-file-loader': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 transitivePeerDependencies: - aws-crt dev: false @@ -1887,7 +1887,7 @@ packages: resolution: {integrity: sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/url-parser@3.310.0: @@ -1895,14 +1895,14 @@ packages: dependencies: '@aws-sdk/querystring-parser': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-arn-parser@3.310.0: resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-base64@3.310.0: @@ -1910,20 +1910,20 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/util-buffer-from': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-body-length-browser@3.310.0: resolution: {integrity: sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-body-length-node@3.310.0: resolution: {integrity: sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-buffer-from@3.310.0: @@ -1931,14 +1931,14 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/is-array-buffer': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-config-provider@3.310.0: resolution: {integrity: sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-defaults-mode-browser@3.316.0: @@ -1948,7 +1948,7 @@ packages: '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/types': 3.310.0 bowser: 2.11.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-defaults-mode-node@3.316.0: @@ -1960,7 +1960,7 @@ packages: '@aws-sdk/node-config-provider': 3.310.0 '@aws-sdk/property-provider': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-endpoints@3.319.0: @@ -1968,28 +1968,28 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-hex-encoding@3.310.0: resolution: {integrity: sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-locate-window@3.208.0: resolution: {integrity: sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-middleware@3.310.0: resolution: {integrity: sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-retry@3.310.0: @@ -1997,7 +1997,7 @@ packages: engines: {node: '>= 14.0.0'} dependencies: '@aws-sdk/service-error-classification': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-stream-browser@3.310.0: @@ -2008,7 +2008,7 @@ packages: '@aws-sdk/util-base64': 3.310.0 '@aws-sdk/util-hex-encoding': 3.310.0 '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-stream-node@3.321.1: @@ -2018,14 +2018,14 @@ packages: '@aws-sdk/node-http-handler': 3.321.1 '@aws-sdk/types': 3.310.0 '@aws-sdk/util-buffer-from': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-uri-escape@3.310.0: resolution: {integrity: sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-user-agent-browser@3.310.0: @@ -2033,7 +2033,7 @@ packages: dependencies: '@aws-sdk/types': 3.310.0 bowser: 2.11.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-user-agent-node@3.310.0: @@ -2047,13 +2047,13 @@ packages: dependencies: '@aws-sdk/node-config-provider': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-utf8-browser@3.259.0: resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-utf8@3.310.0: @@ -2061,7 +2061,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/util-buffer-from': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/util-waiter@3.310.0: @@ -2070,14 +2070,14 @@ packages: dependencies: '@aws-sdk/abort-controller': 3.310.0 '@aws-sdk/types': 3.310.0 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@aws-sdk/xml-builder@3.310.0: resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@babel/code-frame@7.18.6: @@ -2102,7 +2102,7 @@ packages: '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.3) '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/template': 7.20.7 '@babel/traverse': 7.21.3 '@babel/types': 7.21.5 @@ -2371,6 +2371,13 @@ packages: dependencies: '@babel/types': 7.21.5 + /@babel/parser@7.21.9: + resolution: {integrity: sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.5 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -3345,7 +3352,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 dev: true @@ -3359,7 +3366,7 @@ packages: '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 @@ -3971,7 +3978,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 chalk: 4.1.2 jest-message-util: 29.5.0 jest-util: 29.5.0 @@ -3992,14 +3999,14 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.7.1 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@20.2.1) + jest-config: 29.5.0(@types/node@20.2.3) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -4033,7 +4040,7 @@ packages: dependencies: '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 jest-mock: 29.5.0 dev: true @@ -4060,7 +4067,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 20.2.1 + '@types/node': 20.2.3 jest-message-util: 29.5.0 jest-mock: 29.5.0 jest-util: 29.5.0 @@ -4093,7 +4100,7 @@ packages: '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 20.2.1 + '@types/node': 20.2.3 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4187,7 +4194,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -4199,7 +4206,7 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@types/yargs': 17.0.19 chalk: 4.1.2 dev: true @@ -4218,7 +4225,7 @@ packages: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.0.4) typescript: 5.0.4 - vite: 4.3.8(@types/node@20.2.1)(sass@1.62.1) + vite: 4.3.8(@types/node@20.2.3)(sass@1.62.1) dev: true /@jridgewell/gen-mapping@0.3.2: @@ -4431,8 +4438,8 @@ packages: tar-fs: 2.1.1 dev: true - /@nestjs/common@9.4.1(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-VA5XXLAvXG3vY4GqvvuevL7Ooi5RRsov+ydMlgc1rPswgxkSVWaPTqNibsP4C6y5XJtKfc4Ol+zoe2w/LeYJTQ==} + /@nestjs/common@9.4.2(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-sea+qZnbD5x3YWZDVQT/wbVJ2NiABaM1tyZTLuW9hpkcM2KFA96xKtK3VaCxyz49zoXIgSOefsyK7HuUMCe27Q==} peerDependencies: cache-manager: <=5 class-transformer: '*' @@ -4450,12 +4457,12 @@ packages: iterare: 1.2.1 reflect-metadata: 0.1.13 rxjs: 7.8.1 - tslib: 2.5.0 + tslib: 2.5.2 uid: 2.0.2 dev: false - /@nestjs/core@9.4.1(@nestjs/common@9.4.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-KbG0L5UVaI9kjZv3QkSyCf8Cz5lj11hy60n+NPoO0GZmJbhWkfsjletwKpwlpMeGbi7jLGTsU+HPDgprANSNEA==} + /@nestjs/core@9.4.2(@nestjs/common@9.4.2)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-S5K9GTpjBqEJtu5VxRsVaaGEBZ1bkY+Ht4+2hqZSKsI+rzcEB5hcvR+5KiMsMY1VGYvlZ99lxYz72p4h8B0mKw==} requiresBuild: true peerDependencies: '@nestjs/common': ^9.0.0 @@ -4472,21 +4479,21 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 9.4.1(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 9.4.2(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 - tslib: 2.5.0 + tslib: 2.5.2 uid: 2.0.2 transitivePeerDependencies: - encoding dev: false - /@nestjs/testing@9.4.1(@nestjs/common@9.4.1)(@nestjs/core@9.4.1): - resolution: {integrity: sha512-DErwymDxsY80dH2v3eZDVOhjDv6oY6YsaI3GnUEU+gUrYa8qxxKPHfOofAsFF7SExfeJo5c8RQRfazW3bQupJA==} + /@nestjs/testing@9.4.2(@nestjs/common@9.4.2)(@nestjs/core@9.4.2): + resolution: {integrity: sha512-4WZPJz85zLVZkhmWYq+Unr43MixISelg/TyuX1YFZYOeukIN+O6fRtAAPIKLqRQsiY0rE/h8FAEbYGWhNrRfSA==} peerDependencies: '@nestjs/common': ^9.0.0 '@nestjs/core': ^9.0.0 @@ -4498,9 +4505,9 @@ packages: '@nestjs/platform-express': optional: true dependencies: - '@nestjs/common': 9.4.1(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 9.4.1(@nestjs/common@9.4.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - tslib: 2.5.0 + '@nestjs/common': 9.4.2(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 9.4.2(@nestjs/common@9.4.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + tslib: 2.5.2 dev: false /@nodelib/fs.scandir@2.1.5: @@ -4629,7 +4636,7 @@ packages: '@redis/client': 1.4.2 dev: true - /@rollup/plugin-alias@5.0.0(rollup@3.22.0): + /@rollup/plugin-alias@5.0.0(rollup@3.23.0): resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4638,11 +4645,11 @@ packages: rollup: optional: true dependencies: - rollup: 3.22.0 + rollup: 3.23.0 slash: 4.0.0 dev: false - /@rollup/plugin-json@6.0.0(rollup@3.22.0): + /@rollup/plugin-json@6.0.0(rollup@3.23.0): resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4651,11 +4658,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.22.0) - rollup: 3.22.0 + '@rollup/pluginutils': 5.0.2(rollup@3.23.0) + rollup: 3.23.0 dev: false - /@rollup/plugin-replace@5.0.2(rollup@3.22.0): + /@rollup/plugin-replace@5.0.2(rollup@3.23.0): resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4664,9 +4671,9 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.22.0) + '@rollup/pluginutils': 5.0.2(rollup@3.23.0) magic-string: 0.27.0 - rollup: 3.22.0 + rollup: 3.23.0 dev: false /@rollup/pluginutils@4.2.1: @@ -4677,7 +4684,7 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils@5.0.2(rollup@3.22.0): + /@rollup/pluginutils@5.0.2(rollup@3.23.0): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4689,7 +4696,7 @@ packages: '@types/estree': 1.0.1 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.22.0 + rollup: 3.23.0 dev: false /@rushstack/node-core-library@3.58.0(@types/node@18.16.3): @@ -4813,7 +4820,7 @@ packages: object-hash: 3.0.0 packageurl-js: 1.0.1 semver: 7.5.1 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@snyk/graphlib@2.1.9-patch.3: @@ -4840,8 +4847,8 @@ packages: resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} dev: false - /@storybook/addon-actions@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-f07Mc3qwcG9heGsuUUTIJbWF2nw/Ite3mvyIZY2VbgwhMUMVHj4knY4fh/LojwcUmmmc7CNZu3sJN/wIqpaHCQ==} + /@storybook/addon-actions@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1urDxJpG5BTmZCbda+93iuCNwzj7AiPt/VlmpDpd9Mc/WTOKBg0cXo8oBLibOZgCTLEx+4sq5eVgdMVybBa87g==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4851,14 +4858,14 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 dequal: 2.0.3 lodash: 4.17.21 polished: 4.2.2 @@ -4871,8 +4878,8 @@ packages: uuid: 9.0.0 dev: true - /@storybook/addon-backgrounds@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sAZSxsbj3CcabowALKTafpdnqXMBZB8C42s4Uxv11FCP50GqrP8jp2TqsIiDZxUbeXwI094W/gHnw41MSphG8Q==} + /@storybook/addon-backgrounds@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cUb5i3dn4MhXFtCuA8p/ax6dtFaJ52+q6Dex8L40DtWC/fPrC2igAXN4o7WhRHztY6utZSLy4invEjqAFCEYRw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4882,22 +4889,22 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 dev: true - /@storybook/addon-controls@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-/+yBhswN1N7ttR1NGN94HE/25VELm4YuBtrkh+LJeKP/eQ5CZpLjexASN2GZcfmdnkwIYZAEH0X/AImLaCJAWA==} + /@storybook/addon-controls@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sLLYVgprrsC6k0/2ErKJSa6Jtlxo+lHSO41K6nB0WQmQ8Moroe2kBaNTP6C9+zhGuI427Eueuzs3cKHwn/eIKw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4907,15 +4914,15 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.0.12 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.0.12 - '@storybook/preview-api': 7.0.12 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/blocks': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 7.0.15 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 7.0.15 + '@storybook/preview-api': 7.0.15 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4924,8 +4931,8 @@ packages: - supports-color dev: true - /@storybook/addon-docs@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-zgg4sq34Zz8TN74+kSogxRHsIZ5gsIazJpa0osZp91nJQvsKUEfldjBtQWbBWzjVCrWmzOhW5/RLCnmCNm9y/w==} + /@storybook/addon-docs@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FBXHFwm6wH3SYsv73SmVQMs+FxP8eSoWlDFBEZ1lulCK7f0NKflhzTTimyh9m+aRCsbvC2Vm+7/9CJ5OZU+GEQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4934,19 +4941,19 @@ packages: '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.3) '@jest/transform': 29.5.0 '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/csf-plugin': 7.0.12 - '@storybook/csf-tools': 7.0.12 + '@storybook/blocks': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/csf-plugin': 7.0.15 + '@storybook/csf-tools': 7.0.15 '@storybook/global': 5.0.0 '@storybook/mdx2-csf': 1.0.0 - '@storybook/node-logger': 7.0.12 - '@storybook/postinstall': 7.0.12 - '@storybook/preview-api': 7.0.12 - '@storybook/react-dom-shim': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/node-logger': 7.0.15 + '@storybook/postinstall': 7.0.15 + '@storybook/preview-api': 7.0.15 + '@storybook/react-dom-shim': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 fs-extra: 11.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4957,25 +4964,25 @@ packages: - supports-color dev: true - /@storybook/addon-essentials@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Js2cxvauAf8fkA5D0QrqPPe/FvpY1DbJp61VNGh82Xu0zZrczCGYP3jkWG79vl0zllJNs7hnkV8W6xY1JWgLoA==} + /@storybook/addon-essentials@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YfacNHFOkXu3Ela/Bo7VIJ4cA7/KUFrSzQ463R9GxKsUpBOoXEowbZnur/Aa6ipX7arckdzpc7vXkPFGiRlsdw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/addon-actions': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-backgrounds': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-controls': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-docs': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-highlight': 7.0.12 - '@storybook/addon-measure': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-outline': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-toolbars': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-viewport': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.0.12 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.0.12 - '@storybook/preview-api': 7.0.12 + '@storybook/addon-actions': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-backgrounds': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-controls': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-docs': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-highlight': 7.0.15 + '@storybook/addon-measure': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-outline': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-toolbars': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-viewport': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 7.0.15 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 7.0.15 + '@storybook/preview-api': 7.0.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 @@ -4983,16 +4990,16 @@ packages: - supports-color dev: true - /@storybook/addon-highlight@7.0.12: - resolution: {integrity: sha512-ccIsBVjUlZ7cM1adSSFTqqWXiELPdDqfZLz4dWfDbiLyG3InC953ugtvoUWCIZpC2OOnjVLpF7Rbshq2O/QoMw==} + /@storybook/addon-highlight@7.0.15: + resolution: {integrity: sha512-lqf2rZkCpbxse0DXWjlRbCUTjCbUDNTh0aqt1L2NJkZKN2UrHjKbCXOHdtbMJewTLCuatKmjpHNbYp3sAzVq7w==} dependencies: - '@storybook/core-events': 7.0.12 + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.12 + '@storybook/preview-api': 7.0.15 dev: true - /@storybook/addon-interactions@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Rb1mv1RQrTd3sA/WwNTdv00rW+7APfvZEeZks6+8+kS1C4EFMDmLnVBZlPllFdo1BOnTCyer4GZZ5ncVkWNLyQ==} + /@storybook/addon-interactions@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yhPhGMGdYwjYOaSLIp8iol9owpo5Dwk4UcH7WS7z4GwYgQwZ1GYBty1NcVpmxvFA429WQp0grqhJ+Q2xaJYstw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5002,16 +5009,16 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.0.12 - '@storybook/core-events': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 7.0.15 + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/instrumenter': 7.0.12 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/instrumenter': 7.0.15 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 jest-mock: 27.5.1 polished: 4.2.2 react: 18.2.0 @@ -5021,8 +5028,8 @@ packages: - supports-color dev: true - /@storybook/addon-links@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-6kGClsIpX9dRKc5bUAPNcp/4wlgPIxMrieUV+6k1dTsRQqbaEfxih/Fq259D5+yVBDNi3YAnvRjMiIibl8fa5A==} + /@storybook/addon-links@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rr2L46GeqX/4tvINzFTwe2TCq1gTFsOqMXPIgpsoiIA7A6Kj8AMGya3tWr7GPCK23MZxkuquyj+jTbO4kZjCwQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5032,22 +5039,22 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/core-events': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/core-events': 7.0.15 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/router': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/router': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 dev: true - /@storybook/addon-measure@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Uq9cj9QmN7WKBQ6wqeneFmTqo1UQKXIc4CpGBEtJtfsYNLsERrVzOs/tRUf66Zl3lWgfFZxs1B5Ij6RDsYEjRw==} + /@storybook/addon-measure@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jnLh/Kyb6DWL5wdtqcR8Quuf25GzU6bmAJfMbQ/WUbf60M2fXK4d6h6YiFY9HSiAzc/UaH66tiAvqwe+ztgf4A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5057,19 +5064,19 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/types': 7.0.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/addon-outline@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-eZPkm3mECdqx1EDJ0S6DAzZ9WZLPIsZH7fRy6vdJJuAgvnOSzkt7AEpA0hlgiNyXcFpE1Cav6/g12FUf4Zo82g==} + /@storybook/addon-outline@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fc4P5f9bk0m8g5MDyj5V4MFsyNlMWEk1wPD6oBoi7VluTBZxfeLRaNrj9Ek6uDcuilTz2KBAf9aOMgluhEKEYw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5079,20 +5086,20 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/types': 7.0.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 dev: true - /@storybook/addon-storysource@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-drWG7mY76eL8BwkD5KFMSxnErqF6iOZCk3bpUFGqT5uzx6oVkjmOimZHTEuHtHEi6TtK8QN5KTUi6vXzsGSGpA==} + /@storybook/addon-storysource@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-62UHB6m/CA5+YfrdmHVzoI7yULaKXfrTK5ymNm8qV/zOx5QNYkldmtEfKZSDbeMlW740Awgd4QBD3neS2TNFXQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5102,13 +5109,13 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/router': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/source-loader': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/router': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/source-loader': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) estraverse: 5.3.0 prop-types: 15.8.1 react: 18.2.0 @@ -5116,8 +5123,8 @@ packages: react-syntax-highlighter: 15.5.0(react@18.2.0) dev: true - /@storybook/addon-toolbars@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7xRxk+999NVdEwzn2z1O9Tg5iuUSEXQ5jo+hiyK934VvuyqUsZnflKbSvwVEHb2W+DroaaXu8bdHWxGSH+6moQ==} + /@storybook/addon-toolbars@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DOyOHlChprAn/QLENBeu13MiGjNXHPJt+uOt+GlBY6b4oZbDUHC9l4uC+C/iDzuGBZ1hZ9VQlS2xM8GUcyy78w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5127,17 +5134,17 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/addon-viewport@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pMgqtDQF8e9AErnRKbbSK9m1lcKn1dFSOkk0PgSBwIIjmha6q+GeT45EHQrQGtkLdtWT0iTktC8ivzIiGKmHkg==} + /@storybook/addon-viewport@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VIOEVKlgHlbzVz00aehSgFa8rSZZDBleadyGKm+XPtuZmY5ovyCYtp1CBtslTxmzJ/U1e2I++SCqeuT4bxNarw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5147,49 +5154,49 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) memoizerific: 1.11.3 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/addons@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yVADbWCFdb12cSpspeb+/6lfTNarPtZZLql49Bhu6E7PxECw/Q3kfHu0LXBLcSnU7f4QqQvQjp88ultt01ABBQ==} + /@storybook/addons@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7C9NlhFy9iJopulYhzUaxsNepOFG3tIMrzxfxkLVizlparffDybWfHtUa27wfMAnOu7G71jE7+PreJDz0Lyblg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/types': 7.0.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/blocks@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-MbJKjuTJ7xVbkUVwkEwb6vTYGrkRk4+Xtx1UGo+512o91ubqFs8hXwCHP+x/49RCIIQs5zl93Ig8fTtm+MejWw==} + /@storybook/blocks@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ygWH4UukbfEOdTnYs0uWVNQflR2ZEmX4izyLdDrbk3XCi8O5SdgAa4vb7/KW7sErIgkLWr/vo1INo/XXrX/Ceg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 7.0.12 - '@storybook/client-logger': 7.0.12 - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.12 + '@storybook/channels': 7.0.15 + '@storybook/client-logger': 7.0.15 + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.15 '@storybook/csf': 0.1.0 - '@storybook/docs-tools': 7.0.12 + '@storybook/docs-tools': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 '@types/lodash': 4.14.191 color-convert: 2.0.1 dequal: 2.0.3 @@ -5207,13 +5214,13 @@ packages: - supports-color dev: true - /@storybook/builder-manager@7.0.12: - resolution: {integrity: sha512-bkZPSDH38/dUSsO087oQ8+goyaEDP/xD0/O61QcQ8EbaVeT6s6Qt7mMhqsLrtmEZHvPMQwKeIXhOJlRNNXB+SA==} + /@storybook/builder-manager@7.0.15: + resolution: {integrity: sha512-NeEhrE6NTL8aOcxyH4TWazAI+6JyrhN+GUk+0ZPwzaraGfgAefMxATACHhDteU8DeSMQW3pymUOvU1uwjLrjWA==} dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.0.12 - '@storybook/manager': 7.0.12 - '@storybook/node-logger': 7.0.12 + '@storybook/core-common': 7.0.15 + '@storybook/manager': 7.0.15 + '@storybook/node-logger': 7.0.15 '@types/ejs': 3.1.2 '@types/find-cache-dir': 3.2.1 '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.17.18) @@ -5230,8 +5237,8 @@ packages: - supports-color dev: true - /@storybook/builder-vite@7.0.12(typescript@5.0.4)(vite@4.3.8): - resolution: {integrity: sha512-6FJNXis+dYs/KrhfRQgz8HcRw/Oq4FaEghCwsjngQDy4PcpQuxkDbvGJKlBaSr92vUL36FWSPq8u5+VGCHjh5Q==} + /@storybook/builder-vite@7.0.15(typescript@5.0.4)(vite@4.3.8): + resolution: {integrity: sha512-JLdStf1ykV54+FBfcO5GoPYJkhY413EhUNAFlZ04FqcVQjpRcRvWXZ/swiIFubAZo/2eHV8eGbRrlB/aNduq0w==} peerDependencies: '@preact/preset-vite': '*' typescript: '>= 4.3.x' @@ -5245,16 +5252,17 @@ packages: vite-plugin-glimmerx: optional: true dependencies: - '@storybook/channel-postmessage': 7.0.12 - '@storybook/channel-websocket': 7.0.12 - '@storybook/client-logger': 7.0.12 - '@storybook/core-common': 7.0.12 - '@storybook/csf-plugin': 7.0.12 + '@storybook/channel-postmessage': 7.0.15 + '@storybook/channel-websocket': 7.0.15 + '@storybook/client-logger': 7.0.15 + '@storybook/core-common': 7.0.15 + '@storybook/csf-plugin': 7.0.15 + '@storybook/global': 5.0.0 '@storybook/mdx2-csf': 1.0.0 - '@storybook/node-logger': 7.0.12 - '@storybook/preview': 7.0.12 - '@storybook/preview-api': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/node-logger': 7.0.15 + '@storybook/preview': 7.0.15 + '@storybook/preview-api': 7.0.15 + '@storybook/types': 7.0.15 browser-assert: 1.2.1 es-module-lexer: 0.9.3 express: 4.18.2 @@ -5264,19 +5272,19 @@ packages: magic-string: 0.27.0 remark-external-links: 8.0.0 remark-slug: 6.1.0 - rollup: 3.22.0 + rollup: 3.23.0 typescript: 5.0.4 - vite: 4.3.8(@types/node@20.2.1)(sass@1.62.1) + vite: 4.3.8(@types/node@20.2.3)(sass@1.62.1) transitivePeerDependencies: - supports-color dev: true - /@storybook/channel-postmessage@7.0.12: - resolution: {integrity: sha512-Tc7kQZ5yxlZ44Nmmzec92JaDJ6UZ3Ze4cBfiHik4XcnM1PtN8hr8VFoC6a2AIm1ybfIRenfT5w9TH5yriiPIhw==} + /@storybook/channel-postmessage@7.0.15: + resolution: {integrity: sha512-5ZHIQI+Upb12C1lxeXHKVDBEtjjwtWN7XbTz+B1OQ09SRW4LEr8OMD/E9UHsQ2cuKrtBLPs8gkfYO+Ibvx5CkQ==} dependencies: - '@storybook/channels': 7.0.12 - '@storybook/client-logger': 7.0.12 - '@storybook/core-events': 7.0.12 + '@storybook/channels': 7.0.15 + '@storybook/client-logger': 7.0.15 + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 qs: 6.11.1 telejson: 7.0.4 @@ -5304,17 +5312,17 @@ packages: telejson: 7.0.4 dev: true - /@storybook/channel-websocket@7.0.12: - resolution: {integrity: sha512-UV6b9gX2mQLtXlKaFKCHcy+6MaK2od6BYqSJfainnBjDsMIXyhcf7fJaj0XQkJrbNnRBwGhw+6s8JxL98xp7Ew==} + /@storybook/channel-websocket@7.0.15: + resolution: {integrity: sha512-v+PWiSW0yLdDT+X8UXeacmWV9nmXu/AcWvodFEOj4/WUQnN2V5JJszbFm3lmFDrl1sGHEKZt8r3Q31yq3Jm5Lg==} dependencies: - '@storybook/channels': 7.0.12 - '@storybook/client-logger': 7.0.12 + '@storybook/channels': 7.0.15 + '@storybook/client-logger': 7.0.15 '@storybook/global': 5.0.0 telejson: 7.0.4 dev: true - /@storybook/channels@7.0.12: - resolution: {integrity: sha512-KDdDmDs8kxAJU+vndTqTNazjLO+XoIPiTRlfP7mk7cgHiQXSjMYy3JSCQ7W0of0Q+9VSl/ve9CNbnGbcQF7rNQ==} + /@storybook/channels@7.0.15: + resolution: {integrity: sha512-oCXop4qiikZPOWTeuBYyURszXUW81V4SkOJ1c76rU69DQzzMyTZArlGZCSk2OlwePjsLcKGj9bw+6410MaDtCA==} dev: true /@storybook/channels@7.0.2: @@ -5325,20 +5333,20 @@ packages: resolution: {integrity: sha512-+34cVmrXZ3lb1s5tDK+OWd5HLtEPSUMas0VKFJ0k9LBpFlVl9aiCZBJRvSYmWL7beauUfa+HSmJgjlD6228ChQ==} dev: true - /@storybook/cli@7.0.12: - resolution: {integrity: sha512-OABCRIujxsszIJ0CCpKg8Uj4C1UlAwBpBQhv2aMX3lA/pur6Od524syv2ypWu6J2FyvK/ooeyMbjoP7330cIuA==} + /@storybook/cli@7.0.15: + resolution: {integrity: sha512-BxnSAdxsgCFVsey7ASONVJQ7coOZARQou13w7Xleq6y+a7Wi6JQRXNEeNA6JHjMiceuq69BMkvBYr+sJ9Bzwhg==} hasBin: true dependencies: '@babel/core': 7.21.3 '@babel/preset-env': 7.21.4(@babel/core@7.21.3) '@ndelangen/get-tarball': 3.0.7 - '@storybook/codemod': 7.0.12 - '@storybook/core-common': 7.0.12 - '@storybook/core-server': 7.0.12 - '@storybook/csf-tools': 7.0.12 - '@storybook/node-logger': 7.0.12 - '@storybook/telemetry': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/codemod': 7.0.15 + '@storybook/core-common': 7.0.15 + '@storybook/core-server': 7.0.15 + '@storybook/csf-tools': 7.0.15 + '@storybook/node-logger': 7.0.15 + '@storybook/telemetry': 7.0.15 + '@storybook/types': 7.0.15 '@types/semver': 7.5.0 boxen: 5.1.2 chalk: 4.1.2 @@ -5356,6 +5364,7 @@ packages: globby: 11.1.0 jscodeshift: 0.14.0(@babel/preset-env@7.21.4) leven: 3.1.0 + ora: 5.4.1 prettier: 2.8.8 prompts: 2.4.2 puppeteer-core: 2.1.1 @@ -5374,8 +5383,8 @@ packages: - utf-8-validate dev: true - /@storybook/client-logger@7.0.12: - resolution: {integrity: sha512-MQMtIgGEgdixvxnBvZ2m8hhc0DGJWeCpHtxg7oqBLBEBmCYFueTqDZHl4Z6SoCrK0a2YS5X/BIXOcEtP1ulMKw==} + /@storybook/client-logger@7.0.15: + resolution: {integrity: sha512-ezy6i7e0PvNB+s+gAmE2vEHgdlFQZIzpFkNMZjM/lsJYX5+Q7Jgz/+i/fWEtFILUBPiRQGqcDsH7PAn2AfGRcw==} dependencies: '@storybook/global': 5.0.0 dev: true @@ -5392,16 +5401,16 @@ packages: '@storybook/global': 5.0.0 dev: true - /@storybook/codemod@7.0.12: - resolution: {integrity: sha512-eGbGZSglvbnY1omzRyEC4XP0FbpuCFKgjXmdHn9faGQUU5EJHwcGYYrRW8JZL3nEVIvNDuRAKzM3p0BVo1xeSQ==} + /@storybook/codemod@7.0.15: + resolution: {integrity: sha512-mUoOuqjiPVeMU+Z1J+3QycTwc8IPZlvY24mqdHy6Q2y7vKgozu1G/D/OkJBV+zlleguBpBxQkDLRB3CHA+LVkQ==} dependencies: '@babel/core': 7.21.3 '@babel/preset-env': 7.21.4(@babel/core@7.21.3) '@babel/types': 7.21.5 '@storybook/csf': 0.1.0 - '@storybook/csf-tools': 7.0.12 - '@storybook/node-logger': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/csf-tools': 7.0.15 + '@storybook/node-logger': 7.0.15 + '@storybook/types': 7.0.15 cross-spawn: 7.0.3 globby: 11.1.0 jscodeshift: 0.14.0(@babel/preset-env@7.21.4) @@ -5412,17 +5421,17 @@ packages: - supports-color dev: true - /@storybook/components@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-6TxByzYS4+LxwZRioGpP6Zh9If5ctjQs5OnR2UmQvP6HDjmMWYTntoHKIbDwAL9C6MrnQYpPOGCPkqrtODQ4/w==} + /@storybook/components@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aek4/F5h3DShxS17tUYzI2FBwDT8+IRkg3OnkvybJC2U0MizPjwNa8qUk0kt4lEzt1y1TwnXH7TFCjWYY5zS6A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/client-logger': 7.0.12 + '@storybook/client-logger': 7.0.15 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5430,18 +5439,18 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/core-client@7.0.12: - resolution: {integrity: sha512-m0r+Vl3LfU8cJl8UqIwzh0sEN9I//nMaT8UIIm481AINhQTNihQcnYi9jRw7USjfz2fv5CYkg8cEr4KhI8QlRA==} + /@storybook/core-client@7.0.15: + resolution: {integrity: sha512-h4/X597DnWp3Ocpli1B27fpKLXEU1qD4PYCnJW4Pl9DyJXBbzCo2VFZ7LyG3Wrod7ZjrmGOYjOiSisS3f8pcPA==} dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/preview-api': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/preview-api': 7.0.15 dev: true - /@storybook/core-common@7.0.12: - resolution: {integrity: sha512-PFVjYXHUxDQO1oqfqwQe7S3XoLNO0aZYEr9Zl0LiexlxxnU1v+TQjEfNd/H3T0xxpXlsgzhtEcagdzJeAKyh2g==} + /@storybook/core-common@7.0.15: + resolution: {integrity: sha512-uAgpAqGedA7oRXstkZJfJYzuQuK4IrbdfJmA+fVlQ8wdpOtV/BL9YVy80W+YJQCkgUYW7KDagpQ8OMqIpiWt2w==} dependencies: - '@storybook/node-logger': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/node-logger': 7.0.15 + '@storybook/types': 7.0.15 '@types/node': 16.18.16 '@types/pretty-hrtime': 1.0.1 chalk: 4.1.2 @@ -5463,8 +5472,8 @@ packages: - supports-color dev: true - /@storybook/core-events@7.0.12: - resolution: {integrity: sha512-VTmb/zjbz3o1bg+bATzLigVXMVDC/S1FP8CqIrz4mkiys52139FGzMandL2Y2AecPZPGss7ZRdfma28HKVYTRg==} + /@storybook/core-events@7.0.15: + resolution: {integrity: sha512-ffpOLFpDs1T/HVUpGNDyo7c81lfH3Vvga0Hl6uhxm6zi9PkayV3DCgtmZ/W7daC7DiJC+upG/ziMG+5Oj33PDQ==} dev: true /@storybook/core-events@7.0.2: @@ -5475,23 +5484,23 @@ packages: resolution: {integrity: sha512-kGrtjlYtjd4iTVk+Phb4CymZaVkB+MGscKAgcO8gfgJ/Q/gq8HQLVZSIzeoCDcDSHOGlBzbg2WVtdHIHhCKlOQ==} dev: true - /@storybook/core-server@7.0.12: - resolution: {integrity: sha512-X35Kmg7y35Ph4J+gCDJrnVgBwlz4/DzOQofUS6rAbi4KvrPWDJXeM2OzOgx6B0abKl4CeMmjuc0tjbg4vbUFuA==} + /@storybook/core-server@7.0.15: + resolution: {integrity: sha512-342wGx7uk4j2R8Zk03GLkiwONXUMV2Frpw2HG2HmGviWArN4B3UmU0YHj00GjFM51kyYtjhaJVyTMA20x+6/Yw==} dependencies: '@aw-web-design/x-default-browser': 1.4.88 '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.0.12 - '@storybook/core-common': 7.0.12 - '@storybook/core-events': 7.0.12 + '@storybook/builder-manager': 7.0.15 + '@storybook/core-common': 7.0.15 + '@storybook/core-events': 7.0.15 '@storybook/csf': 0.1.0 - '@storybook/csf-tools': 7.0.12 + '@storybook/csf-tools': 7.0.15 '@storybook/docs-mdx': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager': 7.0.12 - '@storybook/node-logger': 7.0.12 - '@storybook/preview-api': 7.0.12 - '@storybook/telemetry': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/manager': 7.0.15 + '@storybook/node-logger': 7.0.15 + '@storybook/preview-api': 7.0.15 + '@storybook/telemetry': 7.0.15 + '@storybook/types': 7.0.15 '@types/detect-port': 1.3.2 '@types/node': 16.18.16 '@types/node-fetch': 2.6.2 @@ -5508,7 +5517,7 @@ packages: globby: 11.1.0 ip: 2.0.0 lodash: 4.17.21 - node-fetch: 2.6.7 + node-fetch: 2.6.11 open: 8.4.2 pretty-hrtime: 1.0.3 prompts: 2.4.2 @@ -5527,24 +5536,24 @@ packages: - utf-8-validate dev: true - /@storybook/csf-plugin@7.0.12: - resolution: {integrity: sha512-iiH0ynLQV5BYFc0o7RlSJS2S3GT/ffyfbV4rnCnPKdqyo4REEVvmhOuLhwzurtsXsjh+xF6VUYUDN+8/5mbkYw==} + /@storybook/csf-plugin@7.0.15: + resolution: {integrity: sha512-qJwZ6FhTt5HhsXY1rgwqwB1aMbuUSJYEVDM2Y5w0vOB+RHRT6JZpZgVlFz2C8qagX/F27seq6GF0VtfgOAJpaA==} dependencies: - '@storybook/csf-tools': 7.0.12 + '@storybook/csf-tools': 7.0.15 unplugin: 0.10.2 transitivePeerDependencies: - supports-color dev: true - /@storybook/csf-tools@7.0.12: - resolution: {integrity: sha512-EcDzKeENzs4awyjx0VxlONDLibiEtIPDP1XdOCcZGtv3nXXBFtS2WDsYhJHkwyvE37jWTyw2e4xKQmBi0Hjvbw==} + /@storybook/csf-tools@7.0.15: + resolution: {integrity: sha512-PTA8NJTWsAtHsmJcU18PJZA66vyiZtKJJwNL7bTkKuG5HJLer8En6OarJERomhnnr8k0I6dycfWmWgcfeTNoxg==} dependencies: '@babel/generator': 7.21.3 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/traverse': 7.21.3 '@babel/types': 7.21.5 '@storybook/csf': 0.1.0 - '@storybook/types': 7.0.12 + '@storybook/types': 7.0.15 fs-extra: 11.1.0 recast: 0.23.1 ts-dedent: 2.2.0 @@ -5562,13 +5571,13 @@ packages: resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} dev: true - /@storybook/docs-tools@7.0.12: - resolution: {integrity: sha512-+HykeQLgjyDyF9G7HqY0FHXlX7X5YpQcmNjftJzBrc/GO1EeO0M78d54avcOPyyTfuWOh7oZtSJ0MzjA1qrqaQ==} + /@storybook/docs-tools@7.0.15: + resolution: {integrity: sha512-d2GP3UGSz3TS6c/wcB+ngXRNwXlZzyy3vQRAFdirLeTjTN07koyr3aagd5mdJwlMbO2vEIVjNetY4TFX1zfuSQ==} dependencies: '@babel/core': 7.21.3 - '@storybook/core-common': 7.0.12 - '@storybook/preview-api': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/core-common': 7.0.15 + '@storybook/preview-api': 7.0.15 + '@storybook/types': 7.0.15 '@types/doctrine': 0.0.3 doctrine: 3.0.0 lodash: 4.17.21 @@ -5586,14 +5595,14 @@ packages: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} dev: true - /@storybook/instrumenter@7.0.12: - resolution: {integrity: sha512-jx4rb4AMT1YIOpE0HCdfyLvpYU+94wPkC9vt7sZGWAp7nnYG+KO/lx3XCJaR9qQPIxVYejJtWkeGn4RID79SoQ==} + /@storybook/instrumenter@7.0.15: + resolution: {integrity: sha512-vg+glFfRwk9LRBdFYoRQa6JQrTpdIZV35C24dm+tytnIoGqe5jexI+Lmkb+417JQsfdYKZ11IaL0Zj43CbC6vw==} dependencies: - '@storybook/channels': 7.0.12 - '@storybook/client-logger': 7.0.12 - '@storybook/core-events': 7.0.12 + '@storybook/channels': 7.0.15 + '@storybook/client-logger': 7.0.15 + '@storybook/core-events': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.12 + '@storybook/preview-api': 7.0.15 dev: true /@storybook/instrumenter@7.0.2: @@ -5625,20 +5634,20 @@ packages: jest-mock: 27.5.1 dev: true - /@storybook/manager-api@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3QXARtxpc6Xxqf5pviUw2UuhK53+IsINSljeWhAqdQ1Gzbywl67TpibTd7xVN6NKxhUH5Bzo9bIZTAzMZGqaKw==} + /@storybook/manager-api@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S5OZz8QB8pABLFV4hDJrZE5DLk/EJhn/i48xiycuAtBCVcU4jw4xOyrF4f2ZbtsaWQ5GLAAanOb8yTJcqKnItA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 7.0.12 - '@storybook/client-logger': 7.0.12 - '@storybook/core-events': 7.0.12 + '@storybook/channels': 7.0.15 + '@storybook/client-logger': 7.0.15 + '@storybook/core-events': 7.0.15 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/router': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/router': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 @@ -5650,16 +5659,16 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/manager@7.0.12: - resolution: {integrity: sha512-19BsDcwJOYXn6zEarxvNGDdYLUqZyhX92x6GPHSC4cf8BoxHuhmtnz5vOTZHusCxkKIu/C9W0H6wH2Ma47kDCg==} + /@storybook/manager@7.0.15: + resolution: {integrity: sha512-ixx+E2Vb34VIY9JqKoWA+Qv3soJhSWW0ETdMaPn+QmcSoicqM4I861hmxm37ROhwRpAMi2U0sS0m4L+6VeB0lQ==} dev: true /@storybook/mdx2-csf@1.0.0: resolution: {integrity: sha512-dBAnEL4HfxxJmv7LdEYUoZlQbWj9APZNIbOaq0tgF8XkxiIbzqvgB0jhL/9UOrysSDbQWBiCRTu2wOVxedGfmw==} dev: true - /@storybook/node-logger@7.0.12: - resolution: {integrity: sha512-VL+NXzc9NuOP6/9alg4Sofz9kh8tmlo3p+UtCIYCHH088yCsB3XsNhkG9lF1C5EZVWcuHxc2u6MMF3ezOjvKfQ==} + /@storybook/node-logger@7.0.15: + resolution: {integrity: sha512-h7kAbugjW4OqVIs5fd3Lme8+WBaEZYAULaNJ1zdvVpvWepG6iBaF/j8RlZdJzrPDdwQvZ2g9gVk5HySXpeXOjA==} dependencies: '@types/npmlog': 4.1.4 chalk: 4.1.2 @@ -5667,20 +5676,20 @@ packages: pretty-hrtime: 1.0.3 dev: true - /@storybook/postinstall@7.0.12: - resolution: {integrity: sha512-RKNvBLgABBTQwvGyF2jX4vP7OMLB3KvEEOQDoeOKjqyWfekDn5smI+eT714mtmKIH0YMcwmvzLgEdZkjmM/XhA==} + /@storybook/postinstall@7.0.15: + resolution: {integrity: sha512-oVw7E7iBDEN3toMJPH2bxkS/rLShSHNmK8cU8bO6kdxBVCmUdhqMME7TOzqy7bAZ+ODlFCqwdstp85pO6xarig==} dev: true - /@storybook/preview-api@7.0.12: - resolution: {integrity: sha512-YI/AfHszIOYt967fsRlc7j6I0zZB+RSsBwD/nMA8y9vszdpQ0MgRhxHgQxFf6cgqbuQcdCsnTIpT0iQ4GHjDXg==} + /@storybook/preview-api@7.0.15: + resolution: {integrity: sha512-ZjqMFsOYVklO1h4BfyNGpn4FM6lHgQ9RZ+LmUnd1qh/GdxpRHIGLKtsvd4nxaSJLHNE53WO+1yUeJPiglEeE4g==} dependencies: - '@storybook/channel-postmessage': 7.0.12 - '@storybook/channels': 7.0.12 - '@storybook/client-logger': 7.0.12 - '@storybook/core-events': 7.0.12 + '@storybook/channel-postmessage': 7.0.15 + '@storybook/channels': 7.0.15 + '@storybook/client-logger': 7.0.15 + '@storybook/core-events': 7.0.15 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/types': 7.0.12 + '@storybook/types': 7.0.15 '@types/qs': 6.9.7 dequal: 2.0.3 lodash: 4.17.21 @@ -5731,12 +5740,12 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/preview@7.0.12: - resolution: {integrity: sha512-za8El/nnkyAo/uqyqAg7PMuP6DSdPoEnDRyIk4LzY7sAGly6i4Uge377cdo1nUBQLS5S4kKIc4xf8TUegb3G1Q==} + /@storybook/preview@7.0.15: + resolution: {integrity: sha512-rTHgSCpKOnypMVQZdJ78Hlcnkm54UK6KTbQrM3LW41W5sbmTV3OpN6x0Ke7FY6tvrpWATJs26YrTTatDV8tbUA==} dev: true - /@storybook/react-dom-shim@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4z9J54TD7uphxPqSuLEzeKTV4oF8Fmv8qFfnT0XZJ2mpYTC2NTbkYoYZQ8N0eYzvNOk6xgfpDqBdmIANf4NaYw==} + /@storybook/react-dom-shim@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Yi/1ZtzttAay3TMFyiF5oV317fUwdAT+Z595sBCMHEzhZWUA9zKxvR0KAQ2cBlCc6u7+tJvIMaGkcS/IZWVqPw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5745,8 +5754,8 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-vite@7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.8): - resolution: {integrity: sha512-SIszevqIKOW+5TwzNposDI+3giSZNVZ7HSu7u2JEpu0Iw/CWyYI06rUgH2ft8Xluhb8vEorZKiZjsdiQDVo64w==} + /@storybook/react-vite@7.0.15(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.8): + resolution: {integrity: sha512-bPNvjHccYgXCskrW6CIpqcuZWsASdlOuFgJs1q/sxEHy5gGw+kMEm0XKmha4cTLlUAFd4EwhmKkC6BEgtSYVWw==} engines: {node: '>=16'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5755,15 +5764,15 @@ packages: dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.0.4)(vite@4.3.8) '@rollup/pluginutils': 4.2.1 - '@storybook/builder-vite': 7.0.12(typescript@5.0.4)(vite@4.3.8) - '@storybook/react': 7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) + '@storybook/builder-vite': 7.0.15(typescript@5.0.4)(vite@4.3.8) + '@storybook/react': 7.0.15(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) '@vitejs/plugin-react': 3.1.0(vite@4.3.8) ast-types: 0.14.2 magic-string: 0.27.0 react: 18.2.0 react-docgen: 6.0.0-alpha.3 react-dom: 18.2.0(react@18.2.0) - vite: 4.3.8(@types/node@20.2.1)(sass@1.62.1) + vite: 4.3.8(@types/node@20.2.3)(sass@1.62.1) transitivePeerDependencies: - '@preact/preset-vite' - supports-color @@ -5771,8 +5780,8 @@ packages: - vite-plugin-glimmerx dev: true - /@storybook/react@7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4): - resolution: {integrity: sha512-dKHKc02LSgn3St7U/xj/Rr2DFLbS4dWQka+pS/AOvPPvMAR2gGHVhkmoFuFMf176hUTuE5MCoWBoNJIRMz7ZiQ==} + /@storybook/react@7.0.15(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4): + resolution: {integrity: sha512-YuqUyfbPr4mFsRAIUTmVgx5mCNK00fg/Mztwyg3PRN4SuRWhx5MJy6kMX2GV3DcKqyeC5U2aWKHlzjzrGwXymw==} engines: {node: '>=16.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5782,13 +5791,13 @@ packages: typescript: optional: true dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/core-client': 7.0.12 - '@storybook/docs-tools': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/core-client': 7.0.15 + '@storybook/docs-tools': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.12 - '@storybook/react-dom-shim': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/preview-api': 7.0.15 + '@storybook/react-dom-shim': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 '@types/node': 16.18.16 @@ -5810,27 +5819,27 @@ packages: - supports-color dev: true - /@storybook/router@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-dOtBiCBGeDem86BCWR7AlTVQjoBk0yw/XZLXS9qcpUfpe+UDjd0Rh21ZdEEMHG1Wfu4d2AhhG5l/JSJ1IE83jQ==} + /@storybook/router@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iwW2bzoULMIHjzK7ok0l+4O5AafyZ1APMUcYv8S+lC1bOl7odAcV2dbUQ21M1D/L+no7LrcnfJBGOD8NKE4nTQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/client-logger': 7.0.12 + '@storybook/client-logger': 7.0.15 memoizerific: 1.11.3 qs: 6.11.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/source-loader@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-dIT4uHiEFgIX/W1aYpKazeu+8GN2OljQsB84oO6Ea887f3emmVJRBGwvoChSAZH+ps2zGput88Lby+W5Paesow==} + /@storybook/source-loader@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-bk+TbRx9WoUE6to39TjL5BYxZmaq4expM1OlgBabES+mJmdYIvNoDWNYufSv5Gdj25Rg6nG9vYGaf1iviTna9A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@storybook/csf': 0.1.0 - '@storybook/types': 7.0.12 + '@storybook/types': 7.0.15 estraverse: 5.3.0 lodash: 4.17.21 prettier: 2.8.8 @@ -5838,11 +5847,11 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/telemetry@7.0.12: - resolution: {integrity: sha512-oxqe15bn5W+1pLpLjXTfj3H+YPZq3jExjdJwTCUHtFrrsNs0k6dyqAUk8qTOUqOTclANHb6vlNBFJDvZ6qbfEQ==} + /@storybook/telemetry@7.0.15: + resolution: {integrity: sha512-Tuf6Oy1Lxr+bGT9rILT1oKlQtHrO9oCzk/6/wSSZnV08yzwqe5Tmc8OUd9ytc2BbQb67yObsT9Lb9YC+9+X3+g==} dependencies: - '@storybook/client-logger': 7.0.12 - '@storybook/core-common': 7.0.12 + '@storybook/client-logger': 7.0.15 + '@storybook/core-common': 7.0.15 chalk: 4.1.2 detect-package-manager: 2.0.1 fetch-retry: 5.0.4 @@ -5865,24 +5874,24 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/theming@7.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-frBkvH7LF8j23ODaywLK4m4LLscw49oKblkZ+30QZkBAzRf2o3a/QSZW2V1zfBo7ygcXiUJ5bIjh7Y17mMJqbQ==} + /@storybook/theming@7.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-oxy1jTt1lYLWCRXhSnjvxIzJHW+tQS4kqD/F8mr3/C0WbMXbSv/rKlS2fkIYbOecjqs0C/8ypa1KzEMcBTfIRQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) - '@storybook/client-logger': 7.0.12 + '@storybook/client-logger': 7.0.15 '@storybook/global': 5.0.0 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/types@7.0.12: - resolution: {integrity: sha512-nlvU4MyO2grwPCRQ8alA3AnY1bQxGJ6A4QgJu+1MhtjVenifFlxOQX4H1OiA+YXfjlV096oO5LrxvetJPFAKKQ==} + /@storybook/types@7.0.15: + resolution: {integrity: sha512-WjrTpRxCZDL7noDv7ziRdOsuYMppbKRsWlH53HY5GFXJZPYaFWs6lKZOo7+T8OxYXegD4Y5AcD8tGQrX8GtycQ==} dependencies: - '@storybook/channels': 7.0.12 + '@storybook/channels': 7.0.15 '@types/babel__core': 7.20.0 '@types/express': 4.17.17 file-system-cache: 2.0.2 @@ -5906,22 +5915,22 @@ packages: file-system-cache: 2.0.2 dev: true - /@storybook/vue3-vite@7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.8)(vue@3.3.4): - resolution: {integrity: sha512-SdAGfBRfm4cR9VNLRcBCLo3rTzeUTvZfyh5ll0cgInCo9gTxwfs1Y4zEmmVqDDOWQ7qlpJanITNGFGiSsdvRmg==} + /@storybook/vue3-vite@7.0.15(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.8)(vue@3.3.4): + resolution: {integrity: sha512-a5kjtOxVUTZ++QPYT294110OZA1xec8HB9XbF4Mq9xmMK4HAJ2Tv4yx1UtMA6bCanOOCpa1VyA0CQVje6RdgMQ==} engines: {node: ^14.18 || >=16} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 vite: ^3.0.0 || ^4.0.0 dependencies: - '@storybook/builder-vite': 7.0.12(typescript@5.0.4)(vite@4.3.8) - '@storybook/core-server': 7.0.12 - '@storybook/vue3': 7.0.12(vue@3.3.4) + '@storybook/builder-vite': 7.0.15(typescript@5.0.4)(vite@4.3.8) + '@storybook/core-server': 7.0.15 + '@storybook/vue3': 7.0.15(vue@3.3.4) '@vitejs/plugin-vue': 4.2.3(vite@4.3.8)(vue@3.3.4) magic-string: 0.27.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - vite: 4.3.8(@types/node@20.2.1)(sass@1.62.1) + vite: 4.3.8(@types/node@20.2.3)(sass@1.62.1) vue-docgen-api: 4.64.1(vue@3.3.4) transitivePeerDependencies: - '@preact/preset-vite' @@ -5934,17 +5943,17 @@ packages: - vue dev: true - /@storybook/vue3@7.0.12(vue@3.3.4): - resolution: {integrity: sha512-zxRhuuNcM9hT1/s968iHL+diqFqRmpwvEoI7rF1yje09saMck+PFStlE8b/ohQeDtm0GdwVqjbzfHZIdPbivYg==} + /@storybook/vue3@7.0.15(vue@3.3.4): + resolution: {integrity: sha512-h38XFH2fpfZcflg2xifaiwiSfgZd7Ry+/HbwRRKPpvPsBsfXt79KC8H2vHLdMU2KNWpERMKw2eG1PTzYUGUr5w==} engines: {node: '>=16.0.0'} peerDependencies: vue: ^3.0.0 dependencies: - '@storybook/core-client': 7.0.12 - '@storybook/docs-tools': 7.0.12 + '@storybook/core-client': 7.0.15 + '@storybook/docs-tools': 7.0.15 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.12 - '@storybook/types': 7.0.12 + '@storybook/preview-api': 7.0.15 + '@storybook/types': 7.0.15 ts-dedent: 2.2.0 type-fest: 2.19.0 vue: 3.3.4 @@ -6303,7 +6312,7 @@ packages: dependencies: '@tensorflow/tfjs-core': 4.4.0 '@types/node-fetch': 2.6.2 - node-fetch: 2.6.7 + node-fetch: 2.6.11 seedrandom: 3.0.5 string_decoder: 1.3.0 transitivePeerDependencies: @@ -6392,7 +6401,7 @@ packages: dependencies: '@adobe/css-tools': 4.2.0 '@babel/runtime': 7.20.7 - '@types/testing-library__jest-dom': 5.14.5 + '@types/testing-library__jest-dom': 5.14.6 aria-query: 5.1.3 chalk: 3.0.0 css.escape: 1.5.1 @@ -6441,7 +6450,7 @@ packages: /@types/accepts@1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/archiver@5.3.2: @@ -6477,7 +6486,7 @@ packages: /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 dev: true @@ -6495,7 +6504,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/braces@3.0.1: @@ -6515,7 +6524,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@types/responselike': 1.0.0 dev: false @@ -6548,7 +6557,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/content-disposition@0.5.5: @@ -6613,7 +6622,7 @@ packages: /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -6634,34 +6643,34 @@ packages: /@types/fluent-ffmpeg@2.1.21: resolution: {integrity: sha512-+n3dy/Tegt6n+YwGZUiGq6i8Jrnt8+MoyPiW1L6J5EWUl7GSt18a/VyReecfCsvTTNBXNMIKOMHDstiQM8nJLA==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/glob-stream@6.1.1: resolution: {integrity: sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==} dependencies: '@types/glob': 8.1.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/gulp-rename@2.0.1: @@ -6674,7 +6683,7 @@ packages: /@types/gulp-rename@2.0.2: resolution: {integrity: sha512-CQsXqTVtAXqrPd4IbrrlJEEzRkUR3RXsyZbrVoOVqjlchDDmnyRDatAUisjpQjjCg/wjJrSiNg8T1uAbJ/7Qqg==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@types/vinyl': 2.0.7 dev: true @@ -6729,7 +6738,7 @@ packages: /@types/jsdom@21.1.1: resolution: {integrity: sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -6753,7 +6762,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: false /@types/lodash@4.14.191: @@ -6764,8 +6773,8 @@ packages: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/matter-js@0.18.3: - resolution: {integrity: sha512-7DYI52ebEl6AD9+RV2jO/XHdlFlpozYbkURtYKKJ2tO34q49Y15cfl+JSJpoMglQCAL/PxBSHKVv3wkvfZZD7g==} + /@types/matter-js@0.18.4: + resolution: {integrity: sha512-7YgBqVLbLTCTMKmWfvPkohb5sTErBrLui3jRypFLCAxfTYc/HH+gaz10FT8Qw5XipWf7/Ns7Aksmo8nsIIL3lw==} dev: true /@types/mdx@2.0.3: @@ -6801,7 +6810,7 @@ packages: /@types/node-fetch@2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 form-data: 3.0.1 /@types/node-fetch@3.0.3: @@ -6829,13 +6838,13 @@ packages: resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==} dev: true - /@types/node@20.2.1: - resolution: {integrity: sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg==} + /@types/node@20.2.3: + resolution: {integrity: sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==} /@types/nodemailer@6.4.8: resolution: {integrity: sha512-oVsJSCkqViCn8/pEu2hfjwVO+Gb3e+eTWjg3PcjeFKRItfKpKwHphQqbYmPQrlMk+op7pNNWPbsJIEthpFN/OQ==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/normalize-package-data@2.4.1: @@ -6849,7 +6858,7 @@ packages: /@types/oauth@0.9.1: resolution: {integrity: sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/offscreencanvas@2019.3.0: @@ -6860,12 +6869,12 @@ packages: resolution: {integrity: sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==} dev: false - /@types/pg@8.6.6: - resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} + /@types/pg@8.10.1: + resolution: {integrity: sha512-AmEHA/XxMxemQom5iDwP62FYNkv+gDDnetRG7v2N2dPtju7UKI7FknUimcZo7SodKTHtckYPzaTqUEvUKbVJEA==} dependencies: - '@types/node': 20.2.1 - pg-protocol: 1.5.0 - pg-types: 2.2.0 + '@types/node': 20.2.3 + pg-protocol: 1.6.0 + pg-types: 4.0.1 dev: true /@types/prettier@2.7.2: @@ -6891,7 +6900,7 @@ packages: /@types/qrcode@1.5.0: resolution: {integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/qs@6.9.7: @@ -6921,7 +6930,7 @@ packages: /@types/readdir-glob@1.1.1: resolution: {integrity: sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/redis@4.0.11: @@ -6937,7 +6946,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: false /@types/sanitize-html@2.9.0: @@ -6965,7 +6974,7 @@ packages: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/serviceworker@0.0.67: @@ -6975,7 +6984,7 @@ packages: /@types/set-cookie-parser@2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/sharp@0.32.0: @@ -7007,8 +7016,8 @@ packages: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/testing-library__jest-dom@5.14.5: - resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==} + /@types/testing-library__jest-dom@5.14.6: + resolution: {integrity: sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA==} dependencies: '@types/jest': 29.5.1 dev: true @@ -7040,7 +7049,7 @@ packages: /@types/undertaker@1.2.8: resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@types/undertaker-registry': 1.0.1 async-done: 1.3.2 dev: true @@ -7049,10 +7058,10 @@ packages: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: true - /@types/unzipper@0.10.5: - resolution: {integrity: sha512-NrLJb29AdnBARpg9S/4ktfPEisbJ0AvaaAr3j7Q1tg8AgcEUsq2HqbNzvgLRoWyRtjzeLEv7vuL39u1mrNIyNA==} + /@types/unzipper@0.10.6: + resolution: {integrity: sha512-zcBj329AHgKLQyz209N/S9R0GZqXSkUQO4tJSYE3x02qg4JuDFpgKMj50r82Erk1natCWQDIvSccDddt7jPzjA==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/uuid@9.0.1: @@ -7062,14 +7071,14 @@ packages: /@types/vary@1.1.0: resolution: {integrity: sha512-LQWqrIa0dvEOOH37lGksMEXbypRLUFqu6Gx0pmX7zIUisD2I/qaVgEX/vJ/PSVSW0Hk6yz1BNkFpqg6dZm3Wug==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/vinyl-fs@2.4.12: resolution: {integrity: sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==} dependencies: '@types/glob-stream': 6.1.1 - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@types/vinyl': 2.0.7 dev: true @@ -7077,12 +7086,12 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 20.2.1 + '@types/node': 20.2.3 /@types/web-push@3.3.2: resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/webgl-ext@0.0.30: @@ -7096,13 +7105,13 @@ packages: /@types/websocket@1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /@types/yargs-parser@21.0.0: @@ -7125,7 +7134,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true optional: true @@ -7270,7 +7279,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.21.3) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.3.8(@types/node@20.2.1)(sass@1.62.1) + vite: 4.3.8(@types/node@20.2.3)(sass@1.62.1) transitivePeerDependencies: - supports-color dev: true @@ -7282,7 +7291,7 @@ packages: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.3.8(@types/node@20.2.1)(sass@1.62.1) + vite: 4.3.8(@types/node@20.2.3)(sass@1.62.1) vue: 3.3.4 /@vitest/coverage-c8@0.31.1(vitest@0.31.1): @@ -7382,9 +7391,9 @@ packages: typescript: 5.0.4 dev: true - /@vue-macros/common@1.3.1(rollup@3.22.0)(vue@3.3.4): - resolution: {integrity: sha512-Lc5aP/8HNJD1XrnvpeNuWcCf82bZdR3auN/chA1b/1rKZgSnmQkH9f33tKO9qLwXSy+u4hpCi8Rw+oUuF1KCeg==} - engines: {node: '>=14.19.0'} + /@vue-macros/common@1.3.2(rollup@3.23.0)(vue@3.3.4): + resolution: {integrity: sha512-D/hNU0+0HPGFpGf1TO2eKpBKVFTIsHMjzu7/IXe9+hz0TY+WJOGtnlpJyMWFWnM56mXvBOMiQ74zW8MTFlbMMQ==} + engines: {node: '>=16.14.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 peerDependenciesMeta: @@ -7392,7 +7401,7 @@ packages: optional: true dependencies: '@babel/types': 7.21.5 - '@rollup/pluginutils': 5.0.2(rollup@3.22.0) + '@rollup/pluginutils': 5.0.2(rollup@3.23.0) '@vue/compiler-sfc': 3.3.4 local-pkg: 0.4.3 magic-string-ast: 0.1.2 @@ -7401,16 +7410,16 @@ packages: - rollup dev: false - /@vue-macros/reactivity-transform@0.3.7(rollup@3.22.0)(vue@3.3.4): - resolution: {integrity: sha512-o+u5qstvUjNoaZjr4lUtNf5MuLgQHikvurnk6b2DFd9nB52j+BqOhI22uyn6K6TTAU0i0/PxT5YgwDlwVdvEUw==} - engines: {node: '>=14.19.0'} + /@vue-macros/reactivity-transform@0.3.8(rollup@3.23.0)(vue@3.3.4): + resolution: {integrity: sha512-a9GBGy7ZCJdbOvynGl+gBGy0EQlhbUkJxnpEPdxQDWKTEiqW3xQGPCaqonVvHFH1DxQrbfKyxsPy+72Ssr6tKA==} + engines: {node: '>=16.14.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 dependencies: - '@babel/parser': 7.21.8 - '@vue-macros/common': 1.3.1(rollup@3.22.0)(vue@3.3.4) - '@vue/compiler-core': 3.3.1 - '@vue/shared': 3.3.2 + '@babel/parser': 7.21.9 + '@vue-macros/common': 1.3.2(rollup@3.23.0)(vue@3.3.4) + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 magic-string: 0.30.0 unplugin: 1.3.1 vue: 3.3.4 @@ -7418,19 +7427,10 @@ packages: - rollup dev: false - /@vue/compiler-core@3.3.1: - resolution: {integrity: sha512-5le1qYSBgLWg2jdLrbydlhnPJkkzMw46UrRUvTnOKlfg6pThtm9ohhqBhNPHbr0RcM1MCbK5WZe/3Ghz0SZjpQ==} - dependencies: - '@babel/parser': 7.21.8 - '@vue/shared': 3.3.1 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: false - /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -7444,7 +7444,7 @@ packages: /@vue/compiler-sfc@2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 postcss: 8.4.23 source-map: 0.6.1 dev: false @@ -7505,14 +7505,6 @@ packages: '@vue/shared': 3.3.4 vue: 3.3.4 - /@vue/shared@3.3.1: - resolution: {integrity: sha512-ybDBtQ+479HL/bkeIOIAwgpeAEACzztkvulJLbK3JMFuTOv4qDivmV3AIsR8RHYJ+RD9tQxcHWBsX4GqEcYrfw==} - dev: false - - /@vue/shared@3.3.2: - resolution: {integrity: sha512-0rFu3h8JbclbnvvKrs7Fe5FNGV9/5X2rPD7KmOzhLSUAiQH5//Hq437Gv0fR5Mev3u/nbtvmLl8XgwCU20/ZfQ==} - dev: false - /@vue/shared@3.3.4: resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} @@ -7581,7 +7573,7 @@ packages: esbuild: '>=0.10.0' dependencies: esbuild: 0.17.18 - tslib: 2.5.0 + tslib: 2.5.2 dev: true /@yarnpkg/fslib@2.10.2: @@ -8134,21 +8126,21 @@ packages: resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} engines: {node: '>=4'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: true /ast-types@0.15.2: resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} engines: {node: '>=4'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: true /ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: true /astral-regex@2.0.0: @@ -8156,8 +8148,8 @@ packages: engines: {node: '>=8'} dev: true - /astring@1.8.4: - resolution: {integrity: sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==} + /astring@1.8.5: + resolution: {integrity: sha512-TuBbdn7jWVzf8dmFGTaRpW8qgANtWLi1qJLnkfGO5uVf6jf9f/F4B1H35tnOI+qVYZo3p3i8WZlbZOuPAE0wEA==} hasBin: true dev: true @@ -9540,7 +9532,7 @@ packages: /constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 /content-disposition@0.5.4: @@ -9641,6 +9633,15 @@ packages: node-fetch: 2.6.7 transitivePeerDependencies: - encoding + dev: true + + /cross-fetch@3.1.6: + resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} + dependencies: + node-fetch: 2.6.11 + transitivePeerDependencies: + - encoding + dev: false /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} @@ -9754,8 +9755,8 @@ packages: uniq: 1.0.1 dev: false - /cypress@12.12.0: - resolution: {integrity: sha512-UU5wFQ7SMVCR/hyKok/KmzG6fpZgBHHfrXcHzDmPHWrT+UUetxFzQgt7cxCszlwfozckzwkd22dxMwl/vNkWRw==} + /cypress@12.13.0: + resolution: {integrity: sha512-QJlSmdPk+53Zhy69woJMySZQJoWfEWun3X5OOenGsXjRPVfByVTHorxNehbzhZrEzH9RDUDqVcck0ahtlS+N/Q==} engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} hasBin: true requiresBuild: true @@ -9797,7 +9798,7 @@ packages: pretty-bytes: 5.6.0 proxy-from-env: 1.0.0 request-progress: 3.0.0 - semver: 7.5.0 + semver: 7.5.1 supports-color: 8.1.1 tmp: 0.2.1 untildify: 4.0.0 @@ -10656,8 +10657,8 @@ packages: - supports-color dev: true - /eslint-plugin-vue@9.13.0(eslint@8.40.0): - resolution: {integrity: sha512-aBz9A8WB4wmpnVv0pYUt86cmH9EkcwWzgEwecBxMoRNhQjTL5i4sqadnwShv/hOdr8Hbl8XANGV7dtX9UQIAyA==} + /eslint-plugin-vue@9.14.0(eslint@8.40.0): + resolution: {integrity: sha512-4O7EuiqPGVQA1wYCzLvCzsBTv9JIPHLHhrf0k55DLzbwtmJbSw2TKS0G/l7pOwi9RWMSkjIT7ftChU5gZpgnJw==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 @@ -10817,7 +10818,7 @@ packages: /event-loop-spinner@2.2.0: resolution: {integrity: sha512-KB44sV4Mv7uLIkJHJ5qhiZe5um6th2g57nHQL/uqnPHKP2IswoTRWUteEXTJQL4gW++1zqWUni+H2hGkP51c9w==} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /event-stream@3.3.4: @@ -13141,7 +13142,7 @@ packages: /isomorphic-unfetch@3.1.0: resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} dependencies: - node-fetch: 2.6.7 + node-fetch: 2.6.11 unfetch: 4.2.0 transitivePeerDependencies: - encoding @@ -13160,7 +13161,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.21.3 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -13235,7 +13236,7 @@ packages: '@jest/expect': 29.5.0 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -13283,7 +13284,7 @@ packages: - ts-node dev: true - /jest-cli@29.5.0(@types/node@20.2.1): + /jest-cli@29.5.0(@types/node@20.2.3): resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -13300,7 +13301,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@20.2.1) + jest-config: 29.5.0(@types/node@20.2.3) jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 @@ -13350,7 +13351,7 @@ packages: - supports-color dev: true - /jest-config@29.5.0(@types/node@20.2.1): + /jest-config@29.5.0(@types/node@20.2.3): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -13365,7 +13366,7 @@ packages: '@babel/core': 7.21.3 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 babel-jest: 29.5.0(@babel/core@7.21.3) chalk: 4.1.2 ci-info: 3.7.1 @@ -13434,7 +13435,7 @@ packages: '@jest/environment': 29.5.0 '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 jest-mock: 29.5.0 jest-util: 29.5.0 dev: true @@ -13464,7 +13465,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.6 - '@types/node': 20.2.1 + '@types/node': 20.2.3 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13515,7 +13516,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.2.1 + '@types/node': 20.2.3 dev: true /jest-mock@29.5.0: @@ -13523,7 +13524,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 jest-util: 29.5.0 dev: true @@ -13578,7 +13579,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -13609,7 +13610,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -13664,7 +13665,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 chalk: 4.1.2 ci-info: 3.7.1 graceful-fs: 4.2.11 @@ -13689,7 +13690,7 @@ packages: dependencies: '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.2.1 + '@types/node': 20.2.3 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -13708,7 +13709,7 @@ packages: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -13734,7 +13735,7 @@ packages: - ts-node dev: true - /jest@29.5.0(@types/node@20.2.1): + /jest@29.5.0(@types/node@20.2.3): resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -13747,7 +13748,7 @@ packages: '@jest/core': 29.5.0 '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@20.2.1) + jest-cli: 29.5.0(@types/node@20.2.3) transitivePeerDependencies: - '@types/node' - supports-color @@ -13850,7 +13851,7 @@ packages: '@babel/preset-env': ^7.1.6 dependencies: '@babel/core': 7.21.3 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.3) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.3) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.3) @@ -14634,10 +14635,10 @@ packages: engines: {node: '>= 0.6'} dev: true - /meilisearch@0.32.3: - resolution: {integrity: sha512-EOgfBuRE5SiIPIpEDYe2HO0D7a4z5bexIgaAdJFma/dH5hx1kwO+u/qb2g3qKyjG+iA3l8MlmTj/Xd72uahaAw==} + /meilisearch@0.32.4: + resolution: {integrity: sha512-QvPtQ6F2TaqAT9fw072/MDjSCMpQifdtUBFeIk3M5jSnFpeSiv1iwfJWNfP6ByaCgR/s++K1Cqtf9vjcZe7prg==} dependencies: - cross-fetch: 3.1.5 + cross-fetch: 3.1.6 transitivePeerDependencies: - encoding dev: false @@ -15188,6 +15189,17 @@ packages: resolution: {integrity: sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==} dev: true + /node-fetch@2.6.11: + resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -15509,6 +15521,10 @@ packages: resolution: {integrity: sha512-Oh+8fK09mgGmAshFdH6hSVco6KZmd1tTwNFWj35OvzdmJTMZtAkbn05zar2iG3v6sDs1JLEtOiBGNb6BHwkb2w==} dev: false + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + /omggif@1.0.10: resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} dev: false @@ -15975,6 +15991,11 @@ packages: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} + /pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + dev: true + /pg-pool@3.6.0(pg@8.11.0): resolution: {integrity: sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==} peerDependencies: @@ -15983,13 +16004,8 @@ packages: pg: 8.11.0 dev: false - /pg-protocol@1.5.0: - resolution: {integrity: sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==} - dev: true - /pg-protocol@1.6.0: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} - dev: false /pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -16000,6 +16016,20 @@ packages: postgres-bytea: 1.0.0 postgres-date: 1.0.7 postgres-interval: 1.2.0 + dev: false + + /pg-types@4.0.1: + resolution: {integrity: sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==} + engines: {node: '>=10'} + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.0.1 + postgres-interval: 3.0.0 + postgres-range: 1.1.3 + dev: true /pg@8.11.0: resolution: {integrity: sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==} @@ -16415,20 +16445,50 @@ packages: /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} + dev: false + + /postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + dev: true /postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} + dev: false + + /postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + dependencies: + obuf: 1.1.2 + dev: true /postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} + dev: false + + /postgres-date@2.0.1: + resolution: {integrity: sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==} + engines: {node: '>=12'} + dev: true /postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} dependencies: xtend: 4.0.2 + dev: false + + /postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + dev: true + + /postgres-range@1.1.3: + resolution: {integrity: sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==} + dev: true /prebuild-install@7.1.1: resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} @@ -17146,7 +17206,7 @@ packages: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.5.0 + tslib: 2.5.2 dev: true /recast@0.22.0: @@ -17157,7 +17217,7 @@ packages: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.5.0 + tslib: 2.5.2 dev: true /recast@0.23.1: @@ -17168,7 +17228,7 @@ packages: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.5.0 + tslib: 2.5.2 dev: true /rechoir@0.6.2: @@ -17557,8 +17617,8 @@ packages: seedrandom: 2.4.2 dev: false - /rollup@3.22.0: - resolution: {integrity: sha512-imsigcWor5Y/dC0rz2q0bBt9PabcL3TORry2hAa6O6BuMvY71bqHyfReAz5qyAqiQATD1m70qdntqBfBQjVWpQ==} + /rollup@3.23.0: + resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -18379,11 +18439,11 @@ packages: resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} dev: true - /storybook@7.0.12: - resolution: {integrity: sha512-HKi7NQQTZhBGEU3KUFxTNGtIZcG8+hokiO5TwcIr7s7smAVKdvj9vY5YGsVkiWF39o+5UtafW1B/i9D8lBFsYg==} + /storybook@7.0.15: + resolution: {integrity: sha512-GYGRH20H2G0oUhoh40p0o0AGPXN/cKntpt/BX7NKB1Dr4OqbawBw/65yGhuFuYA+HFjBUonWixicOgPkrsyuKg==} hasBin: true dependencies: - '@storybook/cli': 7.0.12 + '@storybook/cli': 7.0.15 transitivePeerDependencies: - bufferutil - encoding @@ -19109,6 +19169,9 @@ packages: /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + /tslib@2.5.2: + resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + /tsutils@3.21.0(typescript@5.0.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -19729,7 +19792,7 @@ packages: replace-ext: 1.0.1 dev: false - /vite-node@0.31.1(@types/node@20.2.1)(sass@1.62.1): + /vite-node@0.31.1(@types/node@20.2.3)(sass@1.62.1): resolution: {integrity: sha512-BajE/IsNQ6JyizPzu9zRgHrBwczkAs0erQf/JRpgTIESpKvNj9/Gd0vxX905klLkb0I0SJVCKbdrl5c6FnqYKA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -19739,7 +19802,7 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.3.8(@types/node@20.2.1)(sass@1.62.1) + vite: 4.3.8(@types/node@20.2.3)(sass@1.62.1) transitivePeerDependencies: - '@types/node' - less @@ -19754,7 +19817,7 @@ packages: resolution: {integrity: sha512-irjKcKXRn7v5bPAg4mAbsS6DgibpP1VUFL9tlgxU6lloK6V9yw9qCZkS+s2PtbkZpWNzr3TN3zVJAc6J7gJZmA==} dev: true - /vite@4.3.8(@types/node@20.2.1)(sass@1.62.1): + /vite@4.3.8(@types/node@20.2.3)(sass@1.62.1): resolution: {integrity: sha512-uYB8PwN7hbMrf4j1xzGDk/lqjsZvCDbt/JC5dyfxc19Pg8kRm14LinK/uq+HSLNswZEoKmweGdtpbnxRtrAXiQ==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -19779,10 +19842,10 @@ packages: terser: optional: true dependencies: - '@types/node': 20.2.1 + '@types/node': 20.2.3 esbuild: 0.17.18 postcss: 8.4.23 - rollup: 3.22.0 + rollup: 3.23.0 sass: 1.62.1 optionalDependencies: fsevents: 2.3.2 @@ -19832,7 +19895,7 @@ packages: dependencies: '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 - '@types/node': 20.2.1 + '@types/node': 20.2.3 '@vitest/expect': 0.31.1 '@vitest/runner': 0.31.1 '@vitest/snapshot': 0.31.1 @@ -19853,8 +19916,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.5.0 - vite: 4.3.8(@types/node@20.2.1)(sass@1.62.1) - vite-node: 0.31.1(@types/node@20.2.1)(sass@1.62.1) + vite: 4.3.8(@types/node@20.2.3)(sass@1.62.1) + vite-node: 0.31.1(@types/node@20.2.3)(sass@1.62.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -19872,7 +19935,7 @@ packages: /vue-docgen-api@4.64.1(vue@3.3.4): resolution: {integrity: sha512-jbOf7ByE3Zvtuk+429Jorl+eIeh2aB2Fx1GUo3xJd1aByJWE8KDlSEa6b11PB1ze8f0sRUBraRDinICCk0KY7g==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 '@vue/compiler-dom': 3.3.4 '@vue/compiler-sfc': 3.3.4 @@ -20185,7 +20248,7 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 @@ -20499,7 +20562,7 @@ packages: sharp: 0.31.3 dev: false - github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.0.12)(@storybook/components@7.0.12)(@storybook/core-events@7.0.12)(@storybook/manager-api@7.0.12)(@storybook/preview-api@7.0.12)(@storybook/theming@7.0.12)(@storybook/types@7.0.12)(react-dom@18.2.0)(react@18.2.0): + github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.0.15)(@storybook/components@7.0.15)(@storybook/core-events@7.0.15)(@storybook/manager-api@7.0.15)(@storybook/preview-api@7.0.15)(@storybook/theming@7.0.15)(@storybook/types@7.0.15)(react-dom@18.2.0)(react@18.2.0): resolution: {tarball: https://codeload.github.com/misskey-dev/storybook-addon-misskey-theme/tar.gz/cf583db098365b2ccc81a82f63ca9c93bc32b640} id: github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640 name: storybook-addon-misskey-theme @@ -20520,13 +20583,13 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/components': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.12 - '@storybook/manager-api': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.12 - '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.12 + '@storybook/blocks': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.15 + '@storybook/manager-api': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.15 + '@storybook/theming': 7.0.15(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true From d2eec3a9e457d4c8bab595c14b4f8e8b79099a26 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 24 May 2023 14:34:46 +0900 Subject: [PATCH 004/133] refactor --- .../src/components/MkPostFormAttaches.vue | 103 ++++++++---------- .../src/widgets/WidgetInstanceCloud.vue | 4 - .../src/widgets/WidgetOnlineUsers.vue | 26 ++--- 3 files changed, 59 insertions(+), 74 deletions(-) diff --git a/packages/frontend/src/components/MkPostFormAttaches.vue b/packages/frontend/src/components/MkPostFormAttaches.vue index 5227afee0..ee4d439cc 100644 --- a/packages/frontend/src/components/MkPostFormAttaches.vue +++ b/packages/frontend/src/components/MkPostFormAttaches.vue @@ -1,16 +1,16 @@ @@ -108,60 +108,53 @@ function showFileMenu(file, ev: MouseEvent) { } - diff --git a/packages/frontend/src/widgets/WidgetInstanceCloud.vue b/packages/frontend/src/widgets/WidgetInstanceCloud.vue index 79bd4b55f..f8b811e6b 100644 --- a/packages/frontend/src/widgets/WidgetInstanceCloud.vue +++ b/packages/frontend/src/widgets/WidgetInstanceCloud.vue @@ -72,7 +72,3 @@ defineExpose({ id: props.widget ? props.widget.id : null, }); - - diff --git a/packages/frontend/src/widgets/WidgetOnlineUsers.vue b/packages/frontend/src/widgets/WidgetOnlineUsers.vue index f95103b0b..c920c3ca5 100644 --- a/packages/frontend/src/widgets/WidgetOnlineUsers.vue +++ b/packages/frontend/src/widgets/WidgetOnlineUsers.vue @@ -1,8 +1,10 @@ @@ -55,22 +57,16 @@ defineExpose({ }); - From 38a1d6693a3295dc59cf82c57ccab96112affa2b Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 24 May 2023 14:43:53 +0900 Subject: [PATCH 005/133] :art: --- packages/backend/src/server/web/boot.js | 70 ++++++++++++------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/packages/backend/src/server/web/boot.js b/packages/backend/src/server/web/boot.js index fd7f54da5..825f02e83 100644 --- a/packages/backend/src/server/web/boot.js +++ b/packages/backend/src/server/web/boot.js @@ -160,37 +160,41 @@ -

An error has occurred!

- -

Don't worry, it's (probably) not your fault.

-

If the problem persists after refreshing, please contact your instance's administrator.
You may also try the following options:

-

Update your os and browser.

-

Disable an adblocker.

- - - -
- - - -
- - - +

The following actions may solve the problem. / 以下を行うと解決する可能性があります。

+

Clear the browser cache / ブラウザのキャッシュをクリアする

+

Update your os and browser / ブラウザおよびOSを最新バージョンに更新する

+

Disable an adblocker / アドブロッカーを無効にする

+
+ Other options / その他のオプション + + + +
+ + + +
+ + + +

`; errorsElement = document.getElementById('errors'); } const detailsElement = document.createElement('details'); + detailsElement.id = 'errorInfo'; detailsElement.innerHTML = `
@@ -247,7 +251,7 @@ .button-label-big { color: #222; font-weight: bold; - font-size: 20px; + font-size: 1.2em; padding: 12px; } @@ -267,11 +271,6 @@ font-size: 16px; } - .dont-worry, - #msg { - font-size: 18px; - } - .icon-warning { color: #dec340; height: 4rem; @@ -279,14 +278,15 @@ } h1 { - font-size: 32px; + font-size: 1.5em; + margin: 1em; } code { font-family: Fira, FiraCode, monospace; } - details { + #errorInfo { background: #333; margin-bottom: 2rem; padding: 0.5rem 1rem; @@ -296,16 +296,16 @@ margin: auto; } - summary { + #errorInfo summary { cursor: pointer; } - summary > * { + #errorInfo summary > * { display: inline; } @media screen and (max-width: 500px) { - details { + #errorInfo { width: 50%; } `) From 62fe3bfb5470129a3c82ee17ce3200dddb9623f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= Date: Wed, 24 May 2023 17:12:38 +0900 Subject: [PATCH 006/133] refactor(#7598): add i18n dynamic typings (#10882) * refactor: add i18n dynamic typings * chore: tweak --- locales/generateDTS.js | 72 + locales/index.d.ts | 2145 +++++++++++++++++++++++++++++- packages/frontend/src/i18n.ts | 3 +- packages/frontend/vite.config.ts | 5 + 4 files changed, 2222 insertions(+), 3 deletions(-) create mode 100644 locales/generateDTS.js diff --git a/locales/generateDTS.js b/locales/generateDTS.js new file mode 100644 index 000000000..5949aee7c --- /dev/null +++ b/locales/generateDTS.js @@ -0,0 +1,72 @@ +const fs = require('fs'); +const yaml = require('js-yaml'); +const ts = require('typescript'); + +function createMembers(record) { + return Object.entries(record) + .map(([k, v]) => ts.factory.createPropertySignature( + undefined, + ts.factory.createStringLiteral(k), + undefined, + typeof v === 'string' + ? ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) + : ts.factory.createTypeLiteralNode(createMembers(v)), + )); +} + +module.exports = function generateDTS() { + const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8')); + const members = createMembers(locale); + const elements = [ + ts.factory.createInterfaceDeclaration( + [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], + ts.factory.createIdentifier('Locale'), + undefined, + undefined, + members, + ), + ts.factory.createVariableStatement( + [ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)], + ts.factory.createVariableDeclarationList( + [ts.factory.createVariableDeclaration( + ts.factory.createIdentifier('locales'), + undefined, + ts.factory.createTypeLiteralNode([ts.factory.createIndexSignature( + undefined, + [ts.factory.createParameterDeclaration( + undefined, + undefined, + ts.factory.createIdentifier('lang'), + undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + undefined, + )], + ts.factory.createTypeReferenceNode( + ts.factory.createIdentifier('Locale'), + undefined, + ), + )]), + undefined, + )], + ts.NodeFlags.Const | ts.NodeFlags.Ambient | ts.NodeFlags.ContextFlags, + ), + ), + ts.factory.createExportAssignment( + undefined, + true, + ts.factory.createIdentifier('locales'), + ), + ]; + const printed = ts.createPrinter({ + newLine: ts.NewLineKind.LineFeed, + }).printList( + ts.ListFormat.MultiLine, + ts.factory.createNodeArray(elements), + ts.createSourceFile('index.d.ts', '', ts.ScriptTarget.ESNext, true, ts.ScriptKind.TS), + ); + + fs.writeFileSync(`${__dirname}/index.d.ts`, `/* eslint-disable */ +// This file is generated by locales/generateDTS.js +// Do not edit this file directly. +${printed}`, 'utf-8'); +} diff --git a/locales/index.d.ts b/locales/index.d.ts index fe3edb445..6e3edefab 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1,3 +1,2144 @@ -declare const locales: { [lang: string]: any }; - +/* eslint-disable */ +// This file is generated by locales/generateDTS.js +// Do not edit this file directly. +export interface Locale { + "_lang_": string; + "headlineMisskey": string; + "introMisskey": string; + "poweredByMisskeyDescription": string; + "monthAndDay": string; + "search": string; + "notifications": string; + "username": string; + "password": string; + "forgotPassword": string; + "fetchingAsApObject": string; + "ok": string; + "gotIt": string; + "cancel": string; + "noThankYou": string; + "enterUsername": string; + "renotedBy": string; + "noNotes": string; + "noNotifications": string; + "instance": string; + "settings": string; + "notificationSettings": string; + "basicSettings": string; + "otherSettings": string; + "openInWindow": string; + "profile": string; + "timeline": string; + "noAccountDescription": string; + "login": string; + "loggingIn": string; + "logout": string; + "signup": string; + "uploading": string; + "save": string; + "users": string; + "addUser": string; + "favorite": string; + "favorites": string; + "unfavorite": string; + "favorited": string; + "alreadyFavorited": string; + "cantFavorite": string; + "pin": string; + "unpin": string; + "copyContent": string; + "copyLink": string; + "delete": string; + "deleteAndEdit": string; + "deleteAndEditConfirm": string; + "addToList": string; + "sendMessage": string; + "copyRSS": string; + "copyUsername": string; + "copyUserId": string; + "copyNoteId": string; + "searchUser": string; + "reply": string; + "loadMore": string; + "showMore": string; + "showLess": string; + "youGotNewFollower": string; + "receiveFollowRequest": string; + "followRequestAccepted": string; + "mention": string; + "mentions": string; + "directNotes": string; + "importAndExport": string; + "import": string; + "export": string; + "files": string; + "download": string; + "driveFileDeleteConfirm": string; + "unfollowConfirm": string; + "exportRequested": string; + "importRequested": string; + "lists": string; + "noLists": string; + "note": string; + "notes": string; + "following": string; + "followers": string; + "followsYou": string; + "createList": string; + "manageLists": string; + "error": string; + "somethingHappened": string; + "retry": string; + "pageLoadError": string; + "pageLoadErrorDescription": string; + "serverIsDead": string; + "youShouldUpgradeClient": string; + "enterListName": string; + "privacy": string; + "makeFollowManuallyApprove": string; + "defaultNoteVisibility": string; + "follow": string; + "followRequest": string; + "followRequests": string; + "unfollow": string; + "followRequestPending": string; + "enterEmoji": string; + "renote": string; + "unrenote": string; + "renoted": string; + "cantRenote": string; + "cantReRenote": string; + "quote": string; + "inChannelRenote": string; + "inChannelQuote": string; + "pinnedNote": string; + "pinned": string; + "you": string; + "clickToShow": string; + "sensitive": string; + "add": string; + "reaction": string; + "reactions": string; + "reactionSetting": string; + "reactionSettingDescription2": string; + "rememberNoteVisibility": string; + "attachCancel": string; + "markAsSensitive": string; + "unmarkAsSensitive": string; + "enterFileName": string; + "mute": string; + "unmute": string; + "renoteMute": string; + "renoteUnmute": string; + "block": string; + "unblock": string; + "suspend": string; + "unsuspend": string; + "blockConfirm": string; + "unblockConfirm": string; + "suspendConfirm": string; + "unsuspendConfirm": string; + "selectList": string; + "selectChannel": string; + "selectAntenna": string; + "selectWidget": string; + "editWidgets": string; + "editWidgetsExit": string; + "customEmojis": string; + "emoji": string; + "emojis": string; + "emojiName": string; + "emojiUrl": string; + "addEmoji": string; + "settingGuide": string; + "cacheRemoteFiles": string; + "cacheRemoteFilesDescription": string; + "flagAsBot": string; + "flagAsBotDescription": string; + "flagAsCat": string; + "flagAsCatDescription": string; + "flagShowTimelineReplies": string; + "flagShowTimelineRepliesDescription": string; + "autoAcceptFollowed": string; + "addAccount": string; + "reloadAccountsList": string; + "loginFailed": string; + "showOnRemote": string; + "general": string; + "wallpaper": string; + "setWallpaper": string; + "removeWallpaper": string; + "searchWith": string; + "youHaveNoLists": string; + "followConfirm": string; + "proxyAccount": string; + "proxyAccountDescription": string; + "host": string; + "selectUser": string; + "recipient": string; + "annotation": string; + "federation": string; + "instances": string; + "registeredAt": string; + "latestRequestReceivedAt": string; + "latestStatus": string; + "storageUsage": string; + "charts": string; + "perHour": string; + "perDay": string; + "stopActivityDelivery": string; + "blockThisInstance": string; + "operations": string; + "software": string; + "version": string; + "metadata": string; + "withNFiles": string; + "monitor": string; + "jobQueue": string; + "cpuAndMemory": string; + "network": string; + "disk": string; + "instanceInfo": string; + "statistics": string; + "clearQueue": string; + "clearQueueConfirmTitle": string; + "clearQueueConfirmText": string; + "clearCachedFiles": string; + "clearCachedFilesConfirm": string; + "blockedInstances": string; + "blockedInstancesDescription": string; + "muteAndBlock": string; + "mutedUsers": string; + "blockedUsers": string; + "noUsers": string; + "editProfile": string; + "noteDeleteConfirm": string; + "pinLimitExceeded": string; + "intro": string; + "done": string; + "processing": string; + "preview": string; + "default": string; + "defaultValueIs": string; + "noCustomEmojis": string; + "noJobs": string; + "federating": string; + "blocked": string; + "suspended": string; + "all": string; + "subscribing": string; + "publishing": string; + "notResponding": string; + "instanceFollowing": string; + "instanceFollowers": string; + "instanceUsers": string; + "changePassword": string; + "security": string; + "retypedNotMatch": string; + "currentPassword": string; + "newPassword": string; + "newPasswordRetype": string; + "attachFile": string; + "more": string; + "featured": string; + "usernameOrUserId": string; + "noSuchUser": string; + "lookup": string; + "announcements": string; + "imageUrl": string; + "remove": string; + "removed": string; + "removeAreYouSure": string; + "deleteAreYouSure": string; + "resetAreYouSure": string; + "saved": string; + "messaging": string; + "upload": string; + "keepOriginalUploading": string; + "keepOriginalUploadingDescription": string; + "fromDrive": string; + "fromUrl": string; + "uploadFromUrl": string; + "uploadFromUrlDescription": string; + "uploadFromUrlRequested": string; + "uploadFromUrlMayTakeTime": string; + "explore": string; + "messageRead": string; + "noMoreHistory": string; + "startMessaging": string; + "nUsersRead": string; + "agreeTo": string; + "agree": string; + "agreeBelow": string; + "basicNotesBeforeCreateAccount": string; + "termsOfService": string; + "start": string; + "home": string; + "remoteUserCaution": string; + "activity": string; + "images": string; + "image": string; + "birthday": string; + "yearsOld": string; + "registeredDate": string; + "location": string; + "theme": string; + "themeForLightMode": string; + "themeForDarkMode": string; + "light": string; + "dark": string; + "lightThemes": string; + "darkThemes": string; + "syncDeviceDarkMode": string; + "drive": string; + "fileName": string; + "selectFile": string; + "selectFiles": string; + "selectFolder": string; + "selectFolders": string; + "renameFile": string; + "folderName": string; + "createFolder": string; + "renameFolder": string; + "deleteFolder": string; + "addFile": string; + "emptyDrive": string; + "emptyFolder": string; + "unableToDelete": string; + "inputNewFileName": string; + "inputNewDescription": string; + "inputNewFolderName": string; + "circularReferenceFolder": string; + "hasChildFilesOrFolders": string; + "copyUrl": string; + "rename": string; + "avatar": string; + "banner": string; + "nsfw": string; + "whenServerDisconnected": string; + "disconnectedFromServer": string; + "reload": string; + "doNothing": string; + "reloadConfirm": string; + "watch": string; + "unwatch": string; + "accept": string; + "reject": string; + "normal": string; + "instanceName": string; + "instanceDescription": string; + "maintainerName": string; + "maintainerEmail": string; + "tosUrl": string; + "thisYear": string; + "thisMonth": string; + "today": string; + "dayX": string; + "monthX": string; + "yearX": string; + "pages": string; + "integration": string; + "connectService": string; + "disconnectService": string; + "enableLocalTimeline": string; + "enableGlobalTimeline": string; + "disablingTimelinesInfo": string; + "registration": string; + "enableRegistration": string; + "invite": string; + "driveCapacityPerLocalAccount": string; + "driveCapacityPerRemoteAccount": string; + "inMb": string; + "iconUrl": string; + "bannerUrl": string; + "backgroundImageUrl": string; + "basicInfo": string; + "pinnedUsers": string; + "pinnedUsersDescription": string; + "pinnedPages": string; + "pinnedPagesDescription": string; + "pinnedClipId": string; + "pinnedNotes": string; + "hcaptcha": string; + "enableHcaptcha": string; + "hcaptchaSiteKey": string; + "hcaptchaSecretKey": string; + "recaptcha": string; + "enableRecaptcha": string; + "recaptchaSiteKey": string; + "recaptchaSecretKey": string; + "turnstile": string; + "enableTurnstile": string; + "turnstileSiteKey": string; + "turnstileSecretKey": string; + "avoidMultiCaptchaConfirm": string; + "antennas": string; + "manageAntennas": string; + "name": string; + "antennaSource": string; + "antennaKeywords": string; + "antennaExcludeKeywords": string; + "antennaKeywordsDescription": string; + "notifyAntenna": string; + "withFileAntenna": string; + "enableServiceworker": string; + "antennaUsersDescription": string; + "caseSensitive": string; + "withReplies": string; + "connectedTo": string; + "notesAndReplies": string; + "withFiles": string; + "silence": string; + "silenceConfirm": string; + "unsilence": string; + "unsilenceConfirm": string; + "popularUsers": string; + "recentlyUpdatedUsers": string; + "recentlyRegisteredUsers": string; + "recentlyDiscoveredUsers": string; + "exploreUsersCount": string; + "exploreFediverse": string; + "popularTags": string; + "userList": string; + "about": string; + "aboutMisskey": string; + "administrator": string; + "token": string; + "2fa": string; + "totp": string; + "totpDescription": string; + "moderator": string; + "moderation": string; + "nUsersMentioned": string; + "securityKeyAndPasskey": string; + "securityKey": string; + "lastUsed": string; + "lastUsedAt": string; + "unregister": string; + "passwordLessLogin": string; + "passwordLessLoginDescription": string; + "resetPassword": string; + "newPasswordIs": string; + "reduceUiAnimation": string; + "share": string; + "notFound": string; + "notFoundDescription": string; + "uploadFolder": string; + "cacheClear": string; + "markAsReadAllNotifications": string; + "markAsReadAllUnreadNotes": string; + "markAsReadAllTalkMessages": string; + "help": string; + "inputMessageHere": string; + "close": string; + "invites": string; + "members": string; + "transfer": string; + "title": string; + "text": string; + "enable": string; + "next": string; + "retype": string; + "noteOf": string; + "quoteAttached": string; + "quoteQuestion": string; + "noMessagesYet": string; + "newMessageExists": string; + "onlyOneFileCanBeAttached": string; + "signinRequired": string; + "invitations": string; + "invitationCode": string; + "checking": string; + "available": string; + "unavailable": string; + "usernameInvalidFormat": string; + "tooShort": string; + "tooLong": string; + "weakPassword": string; + "normalPassword": string; + "strongPassword": string; + "passwordMatched": string; + "passwordNotMatched": string; + "signinWith": string; + "signinFailed": string; + "or": string; + "language": string; + "uiLanguage": string; + "aboutX": string; + "emojiStyle": string; + "native": string; + "disableDrawer": string; + "showNoteActionsOnlyHover": string; + "noHistory": string; + "signinHistory": string; + "enableAdvancedMfm": string; + "enableAnimatedMfm": string; + "doing": string; + "category": string; + "tags": string; + "docSource": string; + "createAccount": string; + "existingAccount": string; + "regenerate": string; + "fontSize": string; + "mediaListWithOneImageAppearance": string; + "limitTo": string; + "noFollowRequests": string; + "openImageInNewTab": string; + "dashboard": string; + "local": string; + "remote": string; + "total": string; + "weekOverWeekChanges": string; + "dayOverDayChanges": string; + "appearance": string; + "clientSettings": string; + "accountSettings": string; + "promotion": string; + "promote": string; + "numberOfDays": string; + "hideThisNote": string; + "showFeaturedNotesInTimeline": string; + "objectStorage": string; + "useObjectStorage": string; + "objectStorageBaseUrl": string; + "objectStorageBaseUrlDesc": string; + "objectStorageBucket": string; + "objectStorageBucketDesc": string; + "objectStoragePrefix": string; + "objectStoragePrefixDesc": string; + "objectStorageEndpoint": string; + "objectStorageEndpointDesc": string; + "objectStorageRegion": string; + "objectStorageRegionDesc": string; + "objectStorageUseSSL": string; + "objectStorageUseSSLDesc": string; + "objectStorageUseProxy": string; + "objectStorageUseProxyDesc": string; + "objectStorageSetPublicRead": string; + "s3ForcePathStyleDesc": string; + "serverLogs": string; + "deleteAll": string; + "showFixedPostForm": string; + "showFixedPostFormInChannel": string; + "newNoteRecived": string; + "sounds": string; + "sound": string; + "listen": string; + "none": string; + "showInPage": string; + "popout": string; + "volume": string; + "masterVolume": string; + "details": string; + "chooseEmoji": string; + "unableToProcess": string; + "recentUsed": string; + "install": string; + "uninstall": string; + "installedApps": string; + "nothing": string; + "installedDate": string; + "lastUsedDate": string; + "state": string; + "sort": string; + "ascendingOrder": string; + "descendingOrder": string; + "scratchpad": string; + "scratchpadDescription": string; + "output": string; + "script": string; + "disablePagesScript": string; + "updateRemoteUser": string; + "deleteAllFiles": string; + "deleteAllFilesConfirm": string; + "removeAllFollowing": string; + "removeAllFollowingDescription": string; + "userSuspended": string; + "userSilenced": string; + "yourAccountSuspendedTitle": string; + "yourAccountSuspendedDescription": string; + "tokenRevoked": string; + "tokenRevokedDescription": string; + "accountDeleted": string; + "accountDeletedDescription": string; + "menu": string; + "divider": string; + "addItem": string; + "rearrange": string; + "relays": string; + "addRelay": string; + "inboxUrl": string; + "addedRelays": string; + "serviceworkerInfo": string; + "deletedNote": string; + "invisibleNote": string; + "enableInfiniteScroll": string; + "visibility": string; + "poll": string; + "useCw": string; + "enablePlayer": string; + "disablePlayer": string; + "expandTweet": string; + "themeEditor": string; + "description": string; + "describeFile": string; + "enterFileDescription": string; + "author": string; + "leaveConfirm": string; + "manage": string; + "plugins": string; + "preferencesBackups": string; + "deck": string; + "undeck": string; + "useBlurEffectForModal": string; + "useFullReactionPicker": string; + "width": string; + "height": string; + "large": string; + "medium": string; + "small": string; + "generateAccessToken": string; + "permission": string; + "enableAll": string; + "disableAll": string; + "tokenRequested": string; + "pluginTokenRequestedDescription": string; + "notificationType": string; + "edit": string; + "emailServer": string; + "enableEmail": string; + "emailConfigInfo": string; + "email": string; + "emailAddress": string; + "smtpConfig": string; + "smtpHost": string; + "smtpPort": string; + "smtpUser": string; + "smtpPass": string; + "emptyToDisableSmtpAuth": string; + "smtpSecure": string; + "smtpSecureInfo": string; + "testEmail": string; + "wordMute": string; + "regexpError": string; + "regexpErrorDescription": string; + "instanceMute": string; + "userSaysSomething": string; + "makeActive": string; + "display": string; + "copy": string; + "metrics": string; + "overview": string; + "logs": string; + "delayed": string; + "database": string; + "channel": string; + "create": string; + "notificationSetting": string; + "notificationSettingDesc": string; + "useGlobalSetting": string; + "useGlobalSettingDesc": string; + "other": string; + "regenerateLoginToken": string; + "regenerateLoginTokenDescription": string; + "setMultipleBySeparatingWithSpace": string; + "fileIdOrUrl": string; + "behavior": string; + "sample": string; + "abuseReports": string; + "reportAbuse": string; + "reportAbuseOf": string; + "fillAbuseReportDescription": string; + "abuseReported": string; + "reporter": string; + "reporteeOrigin": string; + "reporterOrigin": string; + "forwardReport": string; + "forwardReportIsAnonymous": string; + "send": string; + "abuseMarkAsResolved": string; + "openInNewTab": string; + "openInSideView": string; + "defaultNavigationBehaviour": string; + "editTheseSettingsMayBreakAccount": string; + "instanceTicker": string; + "waitingFor": string; + "random": string; + "system": string; + "switchUi": string; + "desktop": string; + "clip": string; + "createNew": string; + "optional": string; + "createNewClip": string; + "unclip": string; + "confirmToUnclipAlreadyClippedNote": string; + "public": string; + "i18nInfo": string; + "manageAccessTokens": string; + "accountInfo": string; + "notesCount": string; + "repliesCount": string; + "renotesCount": string; + "repliedCount": string; + "renotedCount": string; + "followingCount": string; + "followersCount": string; + "sentReactionsCount": string; + "receivedReactionsCount": string; + "pollVotesCount": string; + "pollVotedCount": string; + "yes": string; + "no": string; + "driveFilesCount": string; + "driveUsage": string; + "noCrawle": string; + "noCrawleDescription": string; + "lockedAccountInfo": string; + "alwaysMarkSensitive": string; + "loadRawImages": string; + "disableShowingAnimatedImages": string; + "verificationEmailSent": string; + "notSet": string; + "emailVerified": string; + "noteFavoritesCount": string; + "pageLikesCount": string; + "pageLikedCount": string; + "contact": string; + "useSystemFont": string; + "clips": string; + "experimentalFeatures": string; + "experimental": string; + "thisIsExperimentalFeature": string; + "developer": string; + "makeExplorable": string; + "makeExplorableDescription": string; + "showGapBetweenNotesInTimeline": string; + "duplicate": string; + "left": string; + "center": string; + "wide": string; + "narrow": string; + "reloadToApplySetting": string; + "needReloadToApply": string; + "showTitlebar": string; + "clearCache": string; + "onlineUsersCount": string; + "nUsers": string; + "nNotes": string; + "sendErrorReports": string; + "sendErrorReportsDescription": string; + "myTheme": string; + "backgroundColor": string; + "accentColor": string; + "textColor": string; + "saveAs": string; + "advanced": string; + "advancedSettings": string; + "value": string; + "createdAt": string; + "updatedAt": string; + "saveConfirm": string; + "deleteConfirm": string; + "invalidValue": string; + "registry": string; + "closeAccount": string; + "currentVersion": string; + "latestVersion": string; + "youAreRunningUpToDateClient": string; + "newVersionOfClientAvailable": string; + "usageAmount": string; + "capacity": string; + "inUse": string; + "editCode": string; + "apply": string; + "receiveAnnouncementFromInstance": string; + "emailNotification": string; + "publish": string; + "inChannelSearch": string; + "useReactionPickerForContextMenu": string; + "typingUsers": string; + "jumpToSpecifiedDate": string; + "showingPastTimeline": string; + "clear": string; + "markAllAsRead": string; + "goBack": string; + "unlikeConfirm": string; + "fullView": string; + "quitFullView": string; + "addDescription": string; + "userPagePinTip": string; + "notSpecifiedMentionWarning": string; + "info": string; + "userInfo": string; + "unknown": string; + "onlineStatus": string; + "hideOnlineStatus": string; + "hideOnlineStatusDescription": string; + "online": string; + "active": string; + "offline": string; + "notRecommended": string; + "botProtection": string; + "instanceBlocking": string; + "selectAccount": string; + "switchAccount": string; + "enabled": string; + "disabled": string; + "quickAction": string; + "user": string; + "administration": string; + "accounts": string; + "switch": string; + "noMaintainerInformationWarning": string; + "noBotProtectionWarning": string; + "configure": string; + "postToGallery": string; + "gallery": string; + "recentPosts": string; + "popularPosts": string; + "shareWithNote": string; + "ads": string; + "expiration": string; + "startingperiod": string; + "memo": string; + "priority": string; + "high": string; + "middle": string; + "low": string; + "emailNotConfiguredWarning": string; + "ratio": string; + "previewNoteText": string; + "customCss": string; + "customCssWarn": string; + "global": string; + "squareAvatars": string; + "sent": string; + "received": string; + "searchResult": string; + "hashtags": string; + "troubleshooting": string; + "useBlurEffect": string; + "learnMore": string; + "misskeyUpdated": string; + "whatIsNew": string; + "translate": string; + "translatedFrom": string; + "accountDeletionInProgress": string; + "usernameInfo": string; + "aiChanMode": string; + "devMode": string; + "keepCw": string; + "pubSub": string; + "lastCommunication": string; + "resolved": string; + "unresolved": string; + "breakFollow": string; + "breakFollowConfirm": string; + "itsOn": string; + "itsOff": string; + "on": string; + "off": string; + "emailRequiredForSignup": string; + "unread": string; + "filter": string; + "controlPanel": string; + "manageAccounts": string; + "makeReactionsPublic": string; + "makeReactionsPublicDescription": string; + "classic": string; + "muteThread": string; + "unmuteThread": string; + "ffVisibility": string; + "ffVisibilityDescription": string; + "continueThread": string; + "deleteAccountConfirm": string; + "incorrectPassword": string; + "voteConfirm": string; + "hide": string; + "useDrawerReactionPickerForMobile": string; + "welcomeBackWithName": string; + "clickToFinishEmailVerification": string; + "overridedDeviceKind": string; + "smartphone": string; + "tablet": string; + "auto": string; + "themeColor": string; + "size": string; + "numberOfColumn": string; + "searchByGoogle": string; + "instanceDefaultLightTheme": string; + "instanceDefaultDarkTheme": string; + "instanceDefaultThemeDescription": string; + "mutePeriod": string; + "period": string; + "indefinitely": string; + "tenMinutes": string; + "oneHour": string; + "oneDay": string; + "oneWeek": string; + "oneMonth": string; + "reflectMayTakeTime": string; + "failedToFetchAccountInformation": string; + "rateLimitExceeded": string; + "cropImage": string; + "cropImageAsk": string; + "cropYes": string; + "cropNo": string; + "file": string; + "recentNHours": string; + "recentNDays": string; + "noEmailServerWarning": string; + "thereIsUnresolvedAbuseReportWarning": string; + "recommended": string; + "check": string; + "driveCapOverrideLabel": string; + "driveCapOverrideCaption": string; + "requireAdminForView": string; + "isSystemAccount": string; + "typeToConfirm": string; + "deleteAccount": string; + "document": string; + "numberOfPageCache": string; + "numberOfPageCacheDescription": string; + "logoutConfirm": string; + "lastActiveDate": string; + "statusbar": string; + "pleaseSelect": string; + "reverse": string; + "colored": string; + "refreshInterval": string; + "label": string; + "type": string; + "speed": string; + "slow": string; + "fast": string; + "sensitiveMediaDetection": string; + "localOnly": string; + "remoteOnly": string; + "failedToUpload": string; + "cannotUploadBecauseInappropriate": string; + "cannotUploadBecauseNoFreeSpace": string; + "cannotUploadBecauseExceedsFileSizeLimit": string; + "beta": string; + "enableAutoSensitive": string; + "enableAutoSensitiveDescription": string; + "activeEmailValidationDescription": string; + "navbar": string; + "shuffle": string; + "account": string; + "move": string; + "pushNotification": string; + "subscribePushNotification": string; + "unsubscribePushNotification": string; + "pushNotificationAlreadySubscribed": string; + "pushNotificationNotSupported": string; + "sendPushNotificationReadMessage": string; + "sendPushNotificationReadMessageCaption": string; + "windowMaximize": string; + "windowMinimize": string; + "windowRestore": string; + "caption": string; + "loggedInAsBot": string; + "tools": string; + "cannotLoad": string; + "numberOfProfileView": string; + "like": string; + "unlike": string; + "numberOfLikes": string; + "show": string; + "neverShow": string; + "remindMeLater": string; + "didYouLikeMisskey": string; + "pleaseDonate": string; + "roles": string; + "role": string; + "noRole": string; + "normalUser": string; + "undefined": string; + "assign": string; + "unassign": string; + "color": string; + "manageCustomEmojis": string; + "youCannotCreateAnymore": string; + "cannotPerformTemporary": string; + "cannotPerformTemporaryDescription": string; + "invalidParamError": string; + "invalidParamErrorDescription": string; + "permissionDeniedError": string; + "permissionDeniedErrorDescription": string; + "preset": string; + "selectFromPresets": string; + "achievements": string; + "gotInvalidResponseError": string; + "gotInvalidResponseErrorDescription": string; + "thisPostMayBeAnnoying": string; + "thisPostMayBeAnnoyingHome": string; + "thisPostMayBeAnnoyingCancel": string; + "thisPostMayBeAnnoyingIgnore": string; + "collapseRenotes": string; + "internalServerError": string; + "internalServerErrorDescription": string; + "copyErrorInfo": string; + "joinThisServer": string; + "exploreOtherServers": string; + "letsLookAtTimeline": string; + "disableFederationConfirm": string; + "disableFederationConfirmWarn": string; + "disableFederationOk": string; + "invitationRequiredToRegister": string; + "emailNotSupported": string; + "postToTheChannel": string; + "cannotBeChangedLater": string; + "reactionAcceptance": string; + "likeOnly": string; + "likeOnlyForRemote": string; + "nonSensitiveOnly": string; + "nonSensitiveOnlyForLocalLikeOnlyForRemote": string; + "rolesAssignedToMe": string; + "resetPasswordConfirm": string; + "sensitiveWords": string; + "sensitiveWordsDescription": string; + "sensitiveWordsDescription2": string; + "notesSearchNotAvailable": string; + "license": string; + "unfavoriteConfirm": string; + "myClips": string; + "drivecleaner": string; + "retryAllQueuesNow": string; + "retryAllQueuesConfirmTitle": string; + "retryAllQueuesConfirmText": string; + "enableChartsForRemoteUser": string; + "enableChartsForFederatedInstances": string; + "showClipButtonInNoteFooter": string; + "largeNoteReactions": string; + "noteIdOrUrl": string; + "video": string; + "videos": string; + "dataSaver": string; + "accountMigration": string; + "accountMoved": string; + "accountMovedShort": string; + "operationForbidden": string; + "forceShowAds": string; + "addMemo": string; + "editMemo": string; + "reactionsList": string; + "renotesList": string; + "notificationDisplay": string; + "leftTop": string; + "rightTop": string; + "leftBottom": string; + "rightBottom": string; + "stackAxis": string; + "vertical": string; + "horizontal": string; + "position": string; + "serverRules": string; + "pleaseConfirmBelowBeforeSignup": string; + "pleaseAgreeAllToContinue": string; + "continue": string; + "preservedUsernames": string; + "preservedUsernamesDescription": string; + "createNoteFromTheFile": string; + "archive": string; + "channelArchiveConfirmTitle": string; + "channelArchiveConfirmDescription": string; + "thisChannelArchived": string; + "displayOfNote": string; + "initialAccountSetting": string; + "youFollowing": string; + "preventAiLearning": string; + "preventAiLearningDescription": string; + "options": string; + "specifyUser": string; + "failedToPreviewUrl": string; + "update": string; + "rolesThatCanBeUsedThisEmojiAsReaction": string; + "rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription": string; + "rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn": string; + "cancelReactionConfirm": string; + "changeReactionConfirm": string; + "_initialAccountSetting": { + "accountCreated": string; + "letsStartAccountSetup": string; + "letsFillYourProfile": string; + "profileSetting": string; + "privacySetting": string; + "theseSettingsCanEditLater": string; + "youCanEditMoreSettingsInSettingsPageLater": string; + "followUsers": string; + "pushNotificationDescription": string; + "initialAccountSettingCompleted": string; + "haveFun": string; + "ifYouNeedLearnMore": string; + "skipAreYouSure": string; + }; + "_serverRules": { + "description": string; + }; + "_accountMigration": { + "moveFrom": string; + "moveFromSub": string; + "moveFromLabel": string; + "moveFromDescription": string; + "moveTo": string; + "moveToLabel": string; + "moveCannotBeUndone": string; + "moveAccountDescription": string; + "moveAccountHowTo": string; + "startMigration": string; + "migrationConfirm": string; + "movedAndCannotBeUndone": string; + "postMigrationNote": string; + "movedTo": string; + }; + "_achievements": { + "earnedAt": string; + "_types": { + "_notes1": { + "title": string; + "description": string; + "flavor": string; + }; + "_notes10": { + "title": string; + "description": string; + }; + "_notes100": { + "title": string; + "description": string; + }; + "_notes500": { + "title": string; + "description": string; + }; + "_notes1000": { + "title": string; + "description": string; + }; + "_notes5000": { + "title": string; + "description": string; + }; + "_notes10000": { + "title": string; + "description": string; + }; + "_notes20000": { + "title": string; + "description": string; + }; + "_notes30000": { + "title": string; + "description": string; + }; + "_notes40000": { + "title": string; + "description": string; + }; + "_notes50000": { + "title": string; + "description": string; + }; + "_notes60000": { + "title": string; + "description": string; + }; + "_notes70000": { + "title": string; + "description": string; + }; + "_notes80000": { + "title": string; + "description": string; + }; + "_notes90000": { + "title": string; + "description": string; + }; + "_notes100000": { + "title": string; + "description": string; + "flavor": string; + }; + "_login3": { + "title": string; + "description": string; + "flavor": string; + }; + "_login7": { + "title": string; + "description": string; + "flavor": string; + }; + "_login15": { + "title": string; + "description": string; + }; + "_login30": { + "title": string; + "description": string; + }; + "_login60": { + "title": string; + "description": string; + }; + "_login100": { + "title": string; + "description": string; + "flavor": string; + }; + "_login200": { + "title": string; + "description": string; + }; + "_login300": { + "title": string; + "description": string; + }; + "_login400": { + "title": string; + "description": string; + }; + "_login500": { + "title": string; + "description": string; + "flavor": string; + }; + "_login600": { + "title": string; + "description": string; + }; + "_login700": { + "title": string; + "description": string; + }; + "_login800": { + "title": string; + "description": string; + }; + "_login900": { + "title": string; + "description": string; + }; + "_login1000": { + "title": string; + "description": string; + "flavor": string; + }; + "_noteClipped1": { + "title": string; + "description": string; + }; + "_noteFavorited1": { + "title": string; + "description": string; + }; + "_myNoteFavorited1": { + "title": string; + "description": string; + }; + "_profileFilled": { + "title": string; + "description": string; + }; + "_markedAsCat": { + "title": string; + "description": string; + "flavor": string; + }; + "_following1": { + "title": string; + "description": string; + }; + "_following10": { + "title": string; + "description": string; + }; + "_following50": { + "title": string; + "description": string; + }; + "_following100": { + "title": string; + "description": string; + }; + "_following300": { + "title": string; + "description": string; + }; + "_followers1": { + "title": string; + "description": string; + }; + "_followers10": { + "title": string; + "description": string; + }; + "_followers50": { + "title": string; + "description": string; + }; + "_followers100": { + "title": string; + "description": string; + }; + "_followers300": { + "title": string; + "description": string; + }; + "_followers500": { + "title": string; + "description": string; + }; + "_followers1000": { + "title": string; + "description": string; + }; + "_collectAchievements30": { + "title": string; + "description": string; + }; + "_viewAchievements3min": { + "title": string; + "description": string; + }; + "_iLoveMisskey": { + "title": string; + "description": string; + "flavor": string; + }; + "_foundTreasure": { + "title": string; + "description": string; + }; + "_client30min": { + "title": string; + "description": string; + }; + "_client60min": { + "title": string; + "description": string; + }; + "_noteDeletedWithin1min": { + "title": string; + "description": string; + }; + "_postedAtLateNight": { + "title": string; + "description": string; + "flavor": string; + }; + "_postedAt0min0sec": { + "title": string; + "description": string; + "flavor": string; + }; + "_selfQuote": { + "title": string; + "description": string; + }; + "_htl20npm": { + "title": string; + "description": string; + }; + "_viewInstanceChart": { + "title": string; + "description": string; + }; + "_outputHelloWorldOnScratchpad": { + "title": string; + "description": string; + }; + "_open3windows": { + "title": string; + "description": string; + }; + "_driveFolderCircularReference": { + "title": string; + "description": string; + }; + "_reactWithoutRead": { + "title": string; + "description": string; + }; + "_clickedClickHere": { + "title": string; + "description": string; + }; + "_justPlainLucky": { + "title": string; + "description": string; + }; + "_setNameToSyuilo": { + "title": string; + "description": string; + }; + "_passedSinceAccountCreated1": { + "title": string; + "description": string; + }; + "_passedSinceAccountCreated2": { + "title": string; + "description": string; + }; + "_passedSinceAccountCreated3": { + "title": string; + "description": string; + }; + "_loggedInOnBirthday": { + "title": string; + "description": string; + }; + "_loggedInOnNewYearsDay": { + "title": string; + "description": string; + "flavor": string; + }; + "_cookieClicked": { + "title": string; + "description": string; + "flavor": string; + }; + "_brainDiver": { + "title": string; + "description": string; + "flavor": string; + }; + }; + }; + "_role": { + "new": string; + "edit": string; + "name": string; + "description": string; + "permission": string; + "descriptionOfPermission": string; + "assignTarget": string; + "descriptionOfAssignTarget": string; + "manual": string; + "conditional": string; + "condition": string; + "isConditionalRole": string; + "isPublic": string; + "descriptionOfIsPublic": string; + "options": string; + "policies": string; + "baseRole": string; + "useBaseValue": string; + "chooseRoleToAssign": string; + "iconUrl": string; + "asBadge": string; + "descriptionOfAsBadge": string; + "isExplorable": string; + "descriptionOfIsExplorable": string; + "displayOrder": string; + "descriptionOfDisplayOrder": string; + "canEditMembersByModerator": string; + "descriptionOfCanEditMembersByModerator": string; + "priority": string; + "_priority": { + "low": string; + "middle": string; + "high": string; + }; + "_options": { + "gtlAvailable": string; + "ltlAvailable": string; + "canPublicNote": string; + "canInvite": string; + "canManageCustomEmojis": string; + "driveCapacity": string; + "alwaysMarkNsfw": string; + "pinMax": string; + "antennaMax": string; + "wordMuteMax": string; + "webhookMax": string; + "clipMax": string; + "noteEachClipsMax": string; + "userListMax": string; + "userEachUserListsMax": string; + "rateLimitFactor": string; + "descriptionOfRateLimitFactor": string; + "canHideAds": string; + "canSearchNotes": string; + }; + "_condition": { + "isLocal": string; + "isRemote": string; + "createdLessThan": string; + "createdMoreThan": string; + "followersLessThanOrEq": string; + "followersMoreThanOrEq": string; + "followingLessThanOrEq": string; + "followingMoreThanOrEq": string; + "notesLessThanOrEq": string; + "notesMoreThanOrEq": string; + "and": string; + "or": string; + "not": string; + }; + }; + "_sensitiveMediaDetection": { + "description": string; + "sensitivity": string; + "sensitivityDescription": string; + "setSensitiveFlagAutomatically": string; + "setSensitiveFlagAutomaticallyDescription": string; + "analyzeVideos": string; + "analyzeVideosDescription": string; + }; + "_emailUnavailable": { + "used": string; + "format": string; + "disposable": string; + "mx": string; + "smtp": string; + }; + "_ffVisibility": { + "public": string; + "followers": string; + "private": string; + }; + "_signup": { + "almostThere": string; + "emailAddressInfo": string; + "emailSent": string; + }; + "_accountDelete": { + "accountDelete": string; + "mayTakeTime": string; + "sendEmail": string; + "requestAccountDelete": string; + "started": string; + "inProgress": string; + }; + "_ad": { + "back": string; + "reduceFrequencyOfThisAd": string; + "hide": string; + }; + "_forgotPassword": { + "enterEmail": string; + "ifNoEmail": string; + "contactAdmin": string; + }; + "_gallery": { + "my": string; + "liked": string; + "like": string; + "unlike": string; + }; + "_email": { + "_follow": { + "title": string; + }; + "_receiveFollowRequest": { + "title": string; + }; + }; + "_plugin": { + "install": string; + "installWarn": string; + "manage": string; + }; + "_preferencesBackups": { + "list": string; + "saveNew": string; + "loadFile": string; + "apply": string; + "save": string; + "inputName": string; + "cannotSave": string; + "nameAlreadyExists": string; + "applyConfirm": string; + "saveConfirm": string; + "deleteConfirm": string; + "renameConfirm": string; + "noBackups": string; + "createdAt": string; + "updatedAt": string; + "cannotLoad": string; + "invalidFile": string; + }; + "_registry": { + "scope": string; + "key": string; + "keys": string; + "domain": string; + "createKey": string; + }; + "_aboutMisskey": { + "about": string; + "contributors": string; + "allContributors": string; + "source": string; + "translation": string; + "donate": string; + "morePatrons": string; + "patrons": string; + }; + "_nsfw": { + "respect": string; + "ignore": string; + "force": string; + }; + "_instanceTicker": { + "none": string; + "remote": string; + "always": string; + }; + "_serverDisconnectedBehavior": { + "reload": string; + "dialog": string; + "quiet": string; + }; + "_channel": { + "create": string; + "edit": string; + "setBanner": string; + "removeBanner": string; + "featured": string; + "owned": string; + "following": string; + "usersCount": string; + "notesCount": string; + "nameAndDescription": string; + "nameOnly": string; + }; + "_menuDisplay": { + "sideFull": string; + "sideIcon": string; + "top": string; + "hide": string; + }; + "_wordMute": { + "muteWords": string; + "muteWordsDescription": string; + "muteWordsDescription2": string; + "softDescription": string; + "hardDescription": string; + "soft": string; + "hard": string; + "mutedNotes": string; + }; + "_instanceMute": { + "instanceMuteDescription": string; + "instanceMuteDescription2": string; + "title": string; + "heading": string; + }; + "_theme": { + "explore": string; + "install": string; + "manage": string; + "code": string; + "description": string; + "installed": string; + "installedThemes": string; + "builtinThemes": string; + "alreadyInstalled": string; + "invalid": string; + "make": string; + "base": string; + "addConstant": string; + "constant": string; + "defaultValue": string; + "color": string; + "refProp": string; + "refConst": string; + "key": string; + "func": string; + "funcKind": string; + "argument": string; + "basedProp": string; + "alpha": string; + "darken": string; + "lighten": string; + "inputConstantName": string; + "importInfo": string; + "deleteConstantConfirm": string; + "keys": { + "accent": string; + "bg": string; + "fg": string; + "focus": string; + "indicator": string; + "panel": string; + "shadow": string; + "header": string; + "navBg": string; + "navFg": string; + "navHoverFg": string; + "navActive": string; + "navIndicator": string; + "link": string; + "hashtag": string; + "mention": string; + "mentionMe": string; + "renote": string; + "modalBg": string; + "divider": string; + "scrollbarHandle": string; + "scrollbarHandleHover": string; + "dateLabelFg": string; + "infoBg": string; + "infoFg": string; + "infoWarnBg": string; + "infoWarnFg": string; + "cwBg": string; + "cwFg": string; + "cwHoverBg": string; + "toastBg": string; + "toastFg": string; + "buttonBg": string; + "buttonHoverBg": string; + "inputBorder": string; + "listItemHoverBg": string; + "driveFolderBg": string; + "wallpaperOverlay": string; + "badge": string; + "messageBg": string; + "accentDarken": string; + "accentLighten": string; + "fgHighlighted": string; + }; + }; + "_sfx": { + "note": string; + "noteMy": string; + "notification": string; + "chat": string; + "chatBg": string; + "antenna": string; + "channel": string; + }; + "_ago": { + "future": string; + "justNow": string; + "secondsAgo": string; + "minutesAgo": string; + "hoursAgo": string; + "daysAgo": string; + "weeksAgo": string; + "monthsAgo": string; + "yearsAgo": string; + "invalid": string; + }; + "_time": { + "second": string; + "minute": string; + "hour": string; + "day": string; + }; + "_timelineTutorial": { + "title": string; + "step1_1": string; + "step1_2": string; + "step2_1": string; + "step2_2": string; + "step3_1": string; + "step3_2": string; + "step4_1": string; + "step4_2": string; + }; + "_2fa": { + "alreadyRegistered": string; + "registerTOTP": string; + "passwordToTOTP": string; + "step1": string; + "step2": string; + "step2Click": string; + "step2Url": string; + "step3Title": string; + "step3": string; + "step4": string; + "securityKeyNotSupported": string; + "registerTOTPBeforeKey": string; + "securityKeyInfo": string; + "chromePasskeyNotSupported": string; + "registerSecurityKey": string; + "securityKeyName": string; + "tapSecurityKey": string; + "removeKey": string; + "removeKeyConfirm": string; + "whyTOTPOnlyRenew": string; + "renewTOTP": string; + "renewTOTPConfirm": string; + "renewTOTPOk": string; + "renewTOTPCancel": string; + }; + "_permissions": { + "read:account": string; + "write:account": string; + "read:blocks": string; + "write:blocks": string; + "read:drive": string; + "write:drive": string; + "read:favorites": string; + "write:favorites": string; + "read:following": string; + "write:following": string; + "read:messaging": string; + "write:messaging": string; + "read:mutes": string; + "write:mutes": string; + "write:notes": string; + "read:notifications": string; + "write:notifications": string; + "read:reactions": string; + "write:reactions": string; + "write:votes": string; + "read:pages": string; + "write:pages": string; + "read:page-likes": string; + "write:page-likes": string; + "read:user-groups": string; + "write:user-groups": string; + "read:channels": string; + "write:channels": string; + "read:gallery": string; + "write:gallery": string; + "read:gallery-likes": string; + "write:gallery-likes": string; + }; + "_auth": { + "shareAccessTitle": string; + "shareAccess": string; + "shareAccessAsk": string; + "permission": string; + "permissionAsk": string; + "pleaseGoBack": string; + "callback": string; + "denied": string; + "pleaseLogin": string; + }; + "_antennaSources": { + "all": string; + "homeTimeline": string; + "users": string; + "userList": string; + }; + "_weekday": { + "sunday": string; + "monday": string; + "tuesday": string; + "wednesday": string; + "thursday": string; + "friday": string; + "saturday": string; + }; + "_widgets": { + "profile": string; + "instanceInfo": string; + "memo": string; + "notifications": string; + "timeline": string; + "calendar": string; + "trends": string; + "clock": string; + "rss": string; + "rssTicker": string; + "activity": string; + "photos": string; + "digitalClock": string; + "unixClock": string; + "federation": string; + "instanceCloud": string; + "postForm": string; + "slideshow": string; + "button": string; + "onlineUsers": string; + "jobQueue": string; + "serverMetric": string; + "aiscript": string; + "aiscriptApp": string; + "aichan": string; + "userList": string; + "_userList": { + "chooseList": string; + }; + "clicker": string; + }; + "_cw": { + "hide": string; + "show": string; + "chars": string; + "files": string; + }; + "_poll": { + "noOnlyOneChoice": string; + "choiceN": string; + "noMore": string; + "canMultipleVote": string; + "expiration": string; + "infinite": string; + "at": string; + "after": string; + "deadlineDate": string; + "deadlineTime": string; + "duration": string; + "votesCount": string; + "totalVotes": string; + "vote": string; + "showResult": string; + "voted": string; + "closed": string; + "remainingDays": string; + "remainingHours": string; + "remainingMinutes": string; + "remainingSeconds": string; + }; + "_visibility": { + "public": string; + "publicDescription": string; + "home": string; + "homeDescription": string; + "followers": string; + "followersDescription": string; + "specified": string; + "specifiedDescription": string; + "disableFederation": string; + "disableFederationDescription": string; + }; + "_postForm": { + "replyPlaceholder": string; + "quotePlaceholder": string; + "channelPlaceholder": string; + "_placeholders": { + "a": string; + "b": string; + "c": string; + "d": string; + "e": string; + "f": string; + }; + }; + "_profile": { + "name": string; + "username": string; + "description": string; + "youCanIncludeHashtags": string; + "metadata": string; + "metadataEdit": string; + "metadataDescription": string; + "metadataLabel": string; + "metadataContent": string; + "changeAvatar": string; + "changeBanner": string; + }; + "_exportOrImport": { + "allNotes": string; + "favoritedNotes": string; + "followingList": string; + "muteList": string; + "blockingList": string; + "userLists": string; + "excludeMutingUsers": string; + "excludeInactiveUsers": string; + }; + "_charts": { + "federation": string; + "apRequest": string; + "usersIncDec": string; + "usersTotal": string; + "activeUsers": string; + "notesIncDec": string; + "localNotesIncDec": string; + "remoteNotesIncDec": string; + "notesTotal": string; + "filesIncDec": string; + "filesTotal": string; + "storageUsageIncDec": string; + "storageUsageTotal": string; + }; + "_instanceCharts": { + "requests": string; + "users": string; + "usersTotal": string; + "notes": string; + "notesTotal": string; + "ff": string; + "ffTotal": string; + "cacheSize": string; + "cacheSizeTotal": string; + "files": string; + "filesTotal": string; + }; + "_timelines": { + "home": string; + "local": string; + "social": string; + "global": string; + }; + "_play": { + "new": string; + "edit": string; + "created": string; + "updated": string; + "deleted": string; + "pageSetting": string; + "editThisPage": string; + "viewSource": string; + "my": string; + "liked": string; + "featured": string; + "title": string; + "script": string; + "summary": string; + }; + "_pages": { + "newPage": string; + "editPage": string; + "readPage": string; + "created": string; + "updated": string; + "deleted": string; + "pageSetting": string; + "nameAlreadyExists": string; + "invalidNameTitle": string; + "invalidNameText": string; + "editThisPage": string; + "viewSource": string; + "viewPage": string; + "like": string; + "unlike": string; + "my": string; + "liked": string; + "featured": string; + "inspector": string; + "contents": string; + "content": string; + "variables": string; + "title": string; + "url": string; + "summary": string; + "alignCenter": string; + "hideTitleWhenPinned": string; + "font": string; + "fontSerif": string; + "fontSansSerif": string; + "eyeCatchingImageSet": string; + "eyeCatchingImageRemove": string; + "chooseBlock": string; + "selectType": string; + "contentBlocks": string; + "inputBlocks": string; + "specialBlocks": string; + "blocks": { + "text": string; + "textarea": string; + "section": string; + "image": string; + "button": string; + "note": string; + "_note": { + "id": string; + "idDescription": string; + "detailed": string; + }; + }; + }; + "_relayStatus": { + "requesting": string; + "accepted": string; + "rejected": string; + }; + "_notification": { + "fileUploaded": string; + "youGotMention": string; + "youGotReply": string; + "youGotQuote": string; + "youRenoted": string; + "youWereFollowed": string; + "youReceivedFollowRequest": string; + "yourFollowRequestAccepted": string; + "pollEnded": string; + "unreadAntennaNote": string; + "emptyPushNotificationMessage": string; + "achievementEarned": string; + "_types": { + "all": string; + "follow": string; + "mention": string; + "reply": string; + "renote": string; + "quote": string; + "reaction": string; + "pollEnded": string; + "receiveFollowRequest": string; + "followRequestAccepted": string; + "achievementEarned": string; + "app": string; + }; + "_actions": { + "followBack": string; + "reply": string; + "renote": string; + }; + }; + "_deck": { + "alwaysShowMainColumn": string; + "columnAlign": string; + "addColumn": string; + "configureColumn": string; + "swapLeft": string; + "swapRight": string; + "swapUp": string; + "swapDown": string; + "stackLeft": string; + "popRight": string; + "profile": string; + "newProfile": string; + "deleteProfile": string; + "introduction": string; + "introduction2": string; + "widgetsIntroduction": string; + "_columns": { + "main": string; + "widgets": string; + "notifications": string; + "tl": string; + "antenna": string; + "list": string; + "channel": string; + "mentions": string; + "direct": string; + "roleTimeline": string; + }; + }; + "_dialog": { + "charactersExceeded": string; + "charactersBelow": string; + }; + "_disabledTimeline": { + "title": string; + "description": string; + }; + "_drivecleaner": { + "orderBySizeDesc": string; + "orderByCreatedAtAsc": string; + }; + "_webhookSettings": { + "createWebhook": string; + "name": string; + "secret": string; + "events": string; + "active": string; + "_events": { + "follow": string; + "followed": string; + "note": string; + "reply": string; + "renote": string; + "reaction": string; + "mention": string; + }; + }; +} +declare const locales: { + [lang: string]: Locale; +}; export = locales; diff --git a/packages/frontend/src/i18n.ts b/packages/frontend/src/i18n.ts index 220c6210c..30771ec1b 100644 --- a/packages/frontend/src/i18n.ts +++ b/packages/frontend/src/i18n.ts @@ -1,8 +1,9 @@ import { markRaw } from 'vue'; +import type { Locale } from '../../../locales'; import { locale } from '@/config'; import { I18n } from '@/scripts/i18n'; -export const i18n = markRaw(new I18n(locale)); +export const i18n = markRaw(new I18n(locale)); export function updateI18n(newLocale) { i18n.ts = newLocale; diff --git a/packages/frontend/vite.config.ts b/packages/frontend/vite.config.ts index 3de9f9bdb..7c9b31c15 100644 --- a/packages/frontend/vite.config.ts +++ b/packages/frontend/vite.config.ts @@ -6,6 +6,7 @@ import { type UserConfig, defineConfig } from 'vite'; import ReactivityTransform from '@vue-macros/reactivity-transform/vite'; import locales from '../../locales'; +import generateDTS from '../../locales/generateDTS'; import meta from '../../package.json'; import pluginJson5 from './vite.json5'; @@ -64,6 +65,10 @@ export function getConfig(): UserConfig { }), ] : [], + { + name: 'locale:generateDTS', + buildStart: generateDTS, + }, ], resolve: { From 0513ff8b4e7177c4846d856b2a4023850c04ddde Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 24 May 2023 17:29:58 +0900 Subject: [PATCH 007/133] refactor --- .../src/components/MkForgotPassword.vue | 55 +++++++------------ 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/packages/frontend/src/components/MkForgotPassword.vue b/packages/frontend/src/components/MkForgotPassword.vue index 0befa7e3a..1264c4233 100644 --- a/packages/frontend/src/components/MkForgotPassword.vue +++ b/packages/frontend/src/components/MkForgotPassword.vue @@ -8,27 +8,28 @@ > -
-
- - - - + + +
+ + + + - - - - + + + + - {{ i18n.ts.send }} + {{ i18n.ts.send }} + + {{ i18n.ts._forgotPassword.ifNoEmail }} +
+ +
+ {{ i18n.ts._forgotPassword.contactAdmin }}
-
- {{ i18n.ts._forgotPassword.ifNoEmail }} -
- -
- {{ i18n.ts._forgotPassword.contactAdmin }} -
+
@@ -37,6 +38,7 @@ import { } from 'vue'; import MkModalWindow from '@/components/MkModalWindow.vue'; import MkButton from '@/components/MkButton.vue'; import MkInput from '@/components/MkInput.vue'; +import MkInfo from '@/components/MkInfo.vue'; import * as os from '@/os'; import { instance } from '@/instance'; import { i18n } from '@/i18n'; @@ -62,20 +64,3 @@ async function onSubmit() { dialog.close(); } - - From bdf08c8a54d670928576ba47921eadf7f4705ad6 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 24 May 2023 17:33:31 +0900 Subject: [PATCH 008/133] refactor --- .../src/widgets/server-metric/pie.vue | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/frontend/src/widgets/server-metric/pie.vue b/packages/frontend/src/widgets/server-metric/pie.vue index 868dbc048..398815a6a 100644 --- a/packages/frontend/src/widgets/server-metric/pie.vue +++ b/packages/frontend/src/widgets/server-metric/pie.vue @@ -1,11 +1,12 @@ @@ -33,20 +34,20 @@ const color = $computed(() => `hsl(${180 - (props.value * 180)}, 80%, 70%)`); const strokeDashoffset = $computed(() => (1 - props.value) * (Math.PI * (r * 2))); - From 1c57983bfde68325374a5b86ae1a993bdec937da Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 24 May 2023 17:50:15 +0900 Subject: [PATCH 009/133] refactor --- .../frontend/src/components/MkTagCloud.vue | 24 +++--- .../frontend/src/components/form/slot.vue | 38 +++++----- packages/frontend/src/pages/pages.vue | 36 +++------ packages/frontend/src/pages/settings/apps.vue | 46 ++++++------ packages/frontend/src/pages/user/activity.vue | 4 - .../frontend/src/pages/user/followers.vue | 3 - .../frontend/src/pages/user/following.vue | 3 - packages/frontend/src/pages/user/index.vue | 39 ++++------ packages/frontend/src/widgets/WidgetClock.vue | 74 +++++++++---------- 9 files changed, 113 insertions(+), 154 deletions(-) diff --git a/packages/frontend/src/components/MkTagCloud.vue b/packages/frontend/src/components/MkTagCloud.vue index 4e8d5bab7..6e4e054aa 100644 --- a/packages/frontend/src/components/MkTagCloud.vue +++ b/packages/frontend/src/components/MkTagCloud.vue @@ -1,7 +1,7 @@ @@ -118,14 +116,3 @@ definePageMetadata(computed(() => user ? { }, } : null)); - - diff --git a/packages/frontend/src/widgets/WidgetClock.vue b/packages/frontend/src/widgets/WidgetClock.vue index 7d814dcd5..707f40360 100644 --- a/packages/frontend/src/widgets/WidgetClock.vue +++ b/packages/frontend/src/widgets/WidgetClock.vue @@ -1,9 +1,9 @@ @@ -140,39 +140,10 @@ defineExpose({ }); - From 30cb791e93c58c13f4e718aaa822ccc97d54cb83 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 25 May 2023 08:17:09 +0900 Subject: [PATCH 010/133] =?UTF-8?q?enhance(frontend):=20=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=AD=E3=83=BC/=E3=83=95=E3=82=A9=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E8=A7=A3=E9=99=A4=E3=81=97=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=AB?= =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=81=A7TL=E3=82=92=E3=83=AA=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=99=E3=82=8B=E3=81=AE=E3=82=92=E3=82=84?= =?UTF-8?q?=E3=82=81=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 不便に感じる場合が多いように思う - 将来的にTLがpush型になったら無意味になる --- packages/frontend/src/components/MkTimeline.vue | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/frontend/src/components/MkTimeline.vue b/packages/frontend/src/components/MkTimeline.vue index 2adc4f1d0..2595ebc45 100644 --- a/packages/frontend/src/components/MkTimeline.vue +++ b/packages/frontend/src/components/MkTimeline.vue @@ -46,12 +46,6 @@ const onUserRemoved = () => { tlComponent.pagingComponent?.reload(); }; -const onChangeFollowing = () => { - if (!tlComponent.pagingComponent?.backed) { - tlComponent.pagingComponent?.reload(); - } -}; - let endpoint; let query; let connection; @@ -79,8 +73,6 @@ if (props.src === 'antenna') { connection.on('note', prepend); connection2 = stream.useChannel('main'); - connection2.on('follow', onChangeFollowing); - connection2.on('unfollow', onChangeFollowing); } else if (props.src === 'local') { endpoint = 'notes/local-timeline'; query = { From 4129ac157a8e4fb3a16285f4f7a72f93267eb079 Mon Sep 17 00:00:00 2001 From: tamaina Date: Thu, 25 May 2023 14:50:14 +0000 Subject: [PATCH 011/133] =?UTF-8?q?package.json=E3=81=AE=E4=B8=A6=E3=81=B3?= =?UTF-8?q?=E6=9B=BF=E3=81=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 4aa79222f..71da3bb55 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -103,8 +103,8 @@ "jsdom": "21.1.1", "json5": "2.2.3", "jsonld": "8.1.1", - "meilisearch": "0.32.4", "jsrsasign": "10.8.6", + "meilisearch": "0.32.4", "mfm-js": "0.23.3", "mime-types": "2.1.35", "misskey-js": "workspace:*", From 31a7350a1062739cbda440937dd9ad17d2356f46 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 26 May 2023 10:48:49 +0900 Subject: [PATCH 012/133] :art: --- packages/frontend/src/ui/deck/column.vue | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/frontend/src/ui/deck/column.vue b/packages/frontend/src/ui/deck/column.vue index e2c651bec..869e2c0af 100644 --- a/packages/frontend/src/ui/deck/column.vue +++ b/packages/frontend/src/ui/deck/column.vue @@ -13,6 +13,11 @@ @dragend="onDragend" @contextmenu.prevent.stop="onContextmenu" > + + + + +
@@ -43,6 +44,7 @@
+ {{ i18n.ts.goBack }} {{ i18n.ts.continue }}
@@ -53,6 +55,7 @@
+ {{ i18n.ts.goBack }} {{ i18n.ts.continue }}
@@ -64,7 +67,10 @@
- {{ i18n.ts.continue }} +
+ {{ i18n.ts.goBack }} + {{ i18n.ts.continue }} +
@@ -76,7 +82,10 @@
{{ i18n.ts.pushNotification }}
{{ i18n.t('_initialAccountSetting.pushNotificationDescription', { name: instance.name ?? host }) }}
- {{ i18n.ts.continue }} +
+ {{ i18n.ts.goBack }} + {{ i18n.ts.continue }} +
@@ -95,7 +104,10 @@
{{ i18n.t('_initialAccountSetting.haveFun', { name: instance.name ?? host }) }}
- {{ i18n.ts.close }} +
+ {{ i18n.ts.goBack }} + {{ i18n.ts.close }} +
@@ -144,6 +156,19 @@ async function close(skip: boolean) { dialog.value.close(); defaultStore.set('accountSetupWizard', -1); } + +async function later(later: boolean) { + if (later) { + const { canceled } = await os.confirm({ + type: 'warning', + text: i18n.ts._initialAccountSetting.laterAreYouSure, + }); + if (canceled) return; + } + + dialog.value.close(); + defaultStore.set('accountSetupWizard', 0); +} From 98aef974df0bc563ac2aaf47bee996194d5ec200 Mon Sep 17 00:00:00 2001 From: Chocolate Pie <106949016+chocolate-pie@users.noreply.github.com> Date: Fri, 26 May 2023 14:47:31 +0900 Subject: [PATCH 021/133] =?UTF-8?q?enhance:=20=E3=83=8F=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A5=E3=82=BF=E3=82=B0=E3=81=AE=E3=83=8E=E3=83=BC=E3=83=88?= =?UTF-8?q?=E4=B8=80=E8=A6=A7=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=8B=E3=82=89?= =?UTF-8?q?=E3=80=81=E3=81=9D=E3=81=AE=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=81=A7=E6=8A=95=E7=A8=BF=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=83=9C=E3=82=BF=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=81?= =?UTF-8?q?=E3=81=8A=E7=9F=A5=E3=82=89=E3=81=9B=E3=81=AE=E7=94=BB=E5=83=8F?= =?UTF-8?q?URL=E3=82=92=E7=A9=BA=E3=81=AB=E3=81=A7=E3=81=8D=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3=20(#1087?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: お知らせの画像URLを空にできない問題を修正 (misskey-dev/misskey#10657) * ハッシュタグのノート一覧ページからノートできるように(misskey-dev/misskey#10854) * fix: 色々直した * location.reloadを使わないように * CHANGELOGを編集 * tweak * Update tag.vue --------- Co-authored-by: syuilo --- CHANGELOG.md | 4 ++ locales/index.d.ts | 1 + locales/ja-JP.yml | 1 + .../endpoints/admin/announcements/update.ts | 5 ++- packages/frontend/src/pages/tag.vue | 39 ++++++++++++++++++- 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 829d3e207..ecbad51e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ - AiScriptを0.13.3に更新 - Deck UIを使用している場合、`/`以外にアクセスした際にZen UIで表示するように - メインカラムを設置していない場合の問題を解決 +- ハッシュタグのノート一覧ページから、そのハッシュタグで投稿するボタンを追加 - アカウント初期設定ウィザードに戻るボタンを追加 - アカウントの初期設定ウィザードにあとでボタンを追加 - Fix: URLプレビューで情報が取得できなかった際の挙動を修正 @@ -36,6 +37,9 @@ - fix:ロールタイムラインが無効でも投稿が流れてしまう問題の修正 - fix:ロールタイムラインにて全ての投稿が流れてしまう問題の修正 +### Server +- Fix: お知らせの画像URLを空にできない問題を修正 + ## 13.12.2 ## NOTE diff --git a/locales/index.d.ts b/locales/index.d.ts index 79f0b46d4..a54268676 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -795,6 +795,7 @@ export interface Locale { "noBotProtectionWarning": string; "configure": string; "postToGallery": string; + "postToHashtag": string; "gallery": string; "recentPosts": string; "popularPosts": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 56e2295f1..0ca37caa5 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -792,6 +792,7 @@ noMaintainerInformationWarning: "管理者情報が設定されていません noBotProtectionWarning: "Botプロテクションが設定されていません。" configure: "設定する" postToGallery: "ギャラリーへ投稿" +postToHashtag: "このハッシュタグで投稿" gallery: "ギャラリー" recentPosts: "最近の投稿" popularPosts: "人気の投稿" diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts index 2393c2441..12db1f78f 100644 --- a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts @@ -25,7 +25,7 @@ export const paramDef = { id: { type: 'string', format: 'misskey:id' }, title: { type: 'string', minLength: 1 }, text: { type: 'string', minLength: 1 }, - imageUrl: { type: 'string', nullable: true, minLength: 1 }, + imageUrl: { type: 'string', nullable: true, minLength: 0 }, }, required: ['id', 'title', 'text', 'imageUrl'], } as const; @@ -46,7 +46,8 @@ export default class extends Endpoint { updatedAt: new Date(), title: ps.title, text: ps.text, - imageUrl: ps.imageUrl, + /* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- 空の文字列の場合、nullを渡すようにするため */ + imageUrl: ps.imageUrl || null, }); }); } diff --git a/packages/frontend/src/pages/tag.vue b/packages/frontend/src/pages/tag.vue index b53db3f67..104e73886 100644 --- a/packages/frontend/src/pages/tag.vue +++ b/packages/frontend/src/pages/tag.vue @@ -2,15 +2,27 @@ - + + + + From a879607479c701733476659de1742d5f7d87eede Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 27 May 2023 11:35:26 +0900 Subject: [PATCH 022/133] refactor --- .../src/components/MkEmojiPickerDialog.vue | 16 +- .../frontend/src/components/MkTextarea.vue | 167 +++++++++--------- .../frontend/src/components/form/link.vue | 120 ++++++------- .../src/components/page/page.section.vue | 38 ++-- .../src/components/page/page.text.vue | 20 +-- .../frontend/src/components/page/page.vue | 18 +- packages/frontend/src/pages/admin/relays.vue | 30 +--- .../frontend/src/pages/flash/flash-index.vue | 32 +--- .../frontend/src/pages/my-lists/index.vue | 48 ++--- 9 files changed, 206 insertions(+), 283 deletions(-) diff --git a/packages/frontend/src/components/MkEmojiPickerDialog.vue b/packages/frontend/src/components/MkEmojiPickerDialog.vue index d60921803..cfb65e3b6 100644 --- a/packages/frontend/src/components/MkEmojiPickerDialog.vue +++ b/packages/frontend/src/components/MkEmojiPickerDialog.vue @@ -14,8 +14,8 @@ > - diff --git a/packages/frontend/src/components/MkTextarea.vue b/packages/frontend/src/components/MkTextarea.vue index e8f10ab04..f5e6c71b7 100644 --- a/packages/frontend/src/components/MkTextarea.vue +++ b/packages/frontend/src/components/MkTextarea.vue @@ -1,12 +1,12 @@ @@ -111,87 +111,82 @@ onMounted(() => { }); - diff --git a/packages/frontend/src/components/form/link.vue b/packages/frontend/src/components/form/link.vue index a1775c0bd..1424332da 100644 --- a/packages/frontend/src/components/form/link.vue +++ b/packages/frontend/src/components/form/link.vue @@ -1,19 +1,19 @@
- + {{ i18n.ts.controlPanel }} - + {{ i18n.ts.settings }}
From 3a924f3dc62048e5edea9288de195f0b60760cee Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 27 May 2023 11:44:04 +0900 Subject: [PATCH 024/133] refactor --- .../frontend/src/components/MkImageViewer.vue | 78 ------------------- .../frontend/src/components/form/suspense.vue | 41 ++++------ 2 files changed, 13 insertions(+), 106 deletions(-) delete mode 100644 packages/frontend/src/components/MkImageViewer.vue diff --git a/packages/frontend/src/components/MkImageViewer.vue b/packages/frontend/src/components/MkImageViewer.vue deleted file mode 100644 index e3b2ebe65..000000000 --- a/packages/frontend/src/components/MkImageViewer.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - diff --git a/packages/frontend/src/components/form/suspense.vue b/packages/frontend/src/components/form/suspense.vue index 9b39858ca..b3d8c22b2 100644 --- a/packages/frontend/src/components/form/suspense.vue +++ b/packages/frontend/src/components/form/suspense.vue @@ -1,18 +1,16 @@ - From fb54c58a661bee64365b7ec0c52d456062aaa200 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 27 May 2023 12:09:19 +0900 Subject: [PATCH 025/133] :art: --- packages/frontend/src/ui/deck.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/frontend/src/ui/deck.vue b/packages/frontend/src/ui/deck.vue index 69637b655..126aa807a 100644 --- a/packages/frontend/src/ui/deck.vue +++ b/packages/frontend/src/ui/deck.vue @@ -328,12 +328,12 @@ async function deleteProfile() { flex-direction: column; scroll-snap-align: start; flex-shrink: 0; - margin-top: var(--columnGap); - margin-bottom: var(--columnGap); - margin-right: var(--columnGap); + padding-top: var(--columnGap); + padding-bottom: var(--columnGap); + padding-right: var(--columnGap); &:first-of-type { - margin-left: var(--columnGap); + padding-left: var(--columnGap); } > .column:not(:last-of-type) { From a80003cde57da44b39189e32d43c5297f963f0cf Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 28 May 2023 20:58:39 +0900 Subject: [PATCH 026/133] =?UTF-8?q?fix(frontend):=20Zen=20UI=E3=81=A7?= =?UTF-8?q?=E3=80=81=E3=83=87=E3=83=83=E3=82=AD=E8=A8=AD=E5=AE=9A=E3=81=A7?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5/=E4=BB=A5=E5=A4=96=E3=82=92=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=97=E3=81=9F=E3=81=A8=E3=81=8D=E3=83=87=E3=83=83?= =?UTF-8?q?=E3=82=AD=E3=81=AB=E6=88=BB=E3=82=8B=E3=83=9C=E3=82=BF=E3=83=B3?= =?UTF-8?q?=E3=82=92=E8=A1=A8=E7=A4=BA=20(#10909)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(frontend): デッキ設定で直接/以外を表示したときのZen UIでデッキに戻るボタン * fix style * ?zenが指定されていた場合はボタンを表示しない --- packages/frontend/src/ui/zen.vue | 44 ++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/ui/zen.vue b/packages/frontend/src/ui/zen.vue index e656f00bb..d516a5df7 100644 --- a/packages/frontend/src/ui/zen.vue +++ b/packages/frontend/src/ui/zen.vue @@ -1,9 +1,17 @@ @@ -31,4 +46,29 @@ document.documentElement.style.overflowY = 'scroll'; min-height: 100dvh; box-sizing: border-box; } + +.rootWithBottom { + min-height: calc(100dvh - (60px + (var(--margin) * 2) + env(safe-area-inset-bottom, 0px))); + box-sizing: border-box; +} + +.bottom { + height: calc(60px + (var(--margin) * 2) + env(safe-area-inset-bottom, 0px)); + width: 100%; + margin-top: auto; +} + +.button { + position: fixed !important; + padding: 0; + aspect-ratio: 1; + width: 100%; + max-width: 60px; + margin: auto; + border-radius: 100%; + background: var(--panel); + color: var(--fg); + right: var(--margin); + bottom: calc(var(--margin) + env(safe-area-inset-bottom, 0px)); +} From 7cbd852fe5a2d1ef84049c48c30f51f1170cc5de Mon Sep 17 00:00:00 2001 From: tamaina Date: Mon, 29 May 2023 06:37:13 +0900 Subject: [PATCH 027/133] =?UTF-8?q?pnpm=20dev=E3=81=A7Ctrl+C=E3=81=A7?= =?UTF-8?q?=E7=B5=82=E4=BA=86=E3=81=95=E3=81=9B=E3=81=A6=E3=82=82=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=BB=E3=82=B9=E3=81=8C=E5=AE=8C=E5=85=A8=E3=81=AB?= =?UTF-8?q?=E6=AE=BA=E3=81=9B=E3=81=AA=E3=81=84=E3=81=AE=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20(#10914)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/dev.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/dev.js b/scripts/dev.js index db7bc11fe..2f20d8f07 100644 --- a/scripts/dev.js +++ b/scripts/dev.js @@ -44,11 +44,17 @@ const fs = require('fs'); if (!stat) throw new Error('not exist yet'); if (stat.size === 0) throw new Error('not built yet'); - await execa('pnpm', ['start'], { + const subprocess = await execa('pnpm', ['start'], { cwd: __dirname + '/../', stdout: process.stdout, stderr: process.stderr, }); + + // なぜかworkerだけが終了してmasterが残るのでその対策 + process.on('SIGINT', () => { + subprocess.kill('SIGINT'); + process.exit(0); + }); } catch (e) { await new Promise(resolve => setTimeout(resolve, 3000)); start(); From fd7b77c542b51313d8b8ea60124725fe65a295d5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 29 May 2023 11:54:49 +0900 Subject: [PATCH 028/133] enhance(backend): migrate bull to bullmq (#10910) * wip * wip * Update QueueService.ts * wip * refactor * :v: * fix * Update QueueStatsService.ts * refactor * Update ApNoteService.ts * Update mock-resolver.ts * refactor * Update mock-resolver.ts --- CHANGELOG.md | 1 + packages/backend/package.json | 3 +- packages/backend/src/config.ts | 2 +- packages/backend/src/core/CaptchaService.ts | 20 +- .../src/core/FetchInstanceMetadataService.ts | 6 +- .../backend/src/core/NoteCreateService.ts | 2 +- packages/backend/src/core/QueueModule.ts | 53 +-- packages/backend/src/core/QueueService.ts | 65 +++- .../core/activitypub/LdSignatureService.ts | 4 +- .../core/activitypub/models/ApNoteService.ts | 6 +- .../backend/src/daemons/QueueStatsService.ts | 16 +- packages/backend/src/misc/id/aid.ts | 2 +- packages/backend/src/misc/prelude/time.ts | 17 +- .../src/queue/QueueProcessorService.ts | 320 +++++++++++------- packages/backend/src/queue/const.ts | 26 ++ packages/backend/src/queue/get-job-info.ts | 15 - .../AggregateRetentionProcessorService.ts | 6 +- .../CheckExpiredMutingsProcessorService.ts | 5 +- .../processors/CleanChartsProcessorService.ts | 5 +- .../queue/processors/CleanProcessorService.ts | 5 +- .../CleanRemoteFilesProcessorService.ts | 11 +- .../DeleteAccountProcessorService.ts | 6 +- .../DeleteDriveFilesProcessorService.ts | 14 +- .../processors/DeleteFileProcessorService.ts | 6 +- .../processors/DeliverProcessorService.ts | 10 +- .../EndedPollNotificationProcessorService.ts | 7 +- .../ExportAntennasProcessorService.ts | 6 +- .../ExportBlockingProcessorService.ts | 15 +- .../ExportCustomEmojisProcessorService.ts | 39 +-- .../ExportFavoritesProcessorService.ts | 11 +- .../ExportFollowingProcessorService.ts | 11 +- .../ExportMutingProcessorService.ts | 15 +- .../processors/ExportNotesProcessorService.ts | 11 +- .../ExportUserListsProcessorService.ts | 11 +- .../ImportAntennasProcessorService.ts | 6 +- .../ImportBlockingProcessorService.ts | 13 +- .../ImportCustomEmojisProcessorService.ts | 6 +- .../ImportFollowingProcessorService.ts | 13 +- .../ImportMutingProcessorService.ts | 13 +- .../ImportUserListsProcessorService.ts | 7 +- .../queue/processors/InboxProcessorService.ts | 38 +-- .../RelationshipProcessorService.ts | 2 +- .../ResyncChartsProcessorService.ts | 5 +- .../processors/TickChartsProcessorService.ts | 5 +- .../WebhookDeliverProcessorService.ts | 6 +- .../server/api/endpoints/admin/relays/add.ts | 2 +- .../api/endpoints/notes/search-by-tag.ts | 4 +- .../src/server/api/endpoints/reset-db.ts | 2 +- packages/backend/test/misc/mock-resolver.ts | 6 +- packages/backend/test/utils.ts | 2 +- packages/frontend/src/scripts/time.ts | 17 +- packages/shared/.eslintrc.js | 2 +- pnpm-lock.yaml | 121 ++++--- 53 files changed, 532 insertions(+), 490 deletions(-) create mode 100644 packages/backend/src/queue/const.ts delete mode 100644 packages/backend/src/queue/get-job-info.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ecbad51e9..6b107c72f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ - fix:ロールタイムラインにて全ての投稿が流れてしまう問題の修正 ### Server +- bullをbull-mqにアップグレードし、ジョブキューのパフォーマンスを改善 - Fix: お知らせの画像URLを空にできない問題を修正 ## 13.12.2 diff --git a/packages/backend/package.json b/packages/backend/package.json index 71da3bb55..99c04d6bf 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -76,7 +76,7 @@ "autwh": "0.1.0", "bcryptjs": "2.4.3", "blurhash": "2.0.5", - "bull": "4.10.4", + "bullmq": "3.14.1", "cacheable-lookup": "6.1.0", "cbor": "8.1.0", "chalk": "5.2.0", @@ -167,7 +167,6 @@ "@types/accepts": "1.3.5", "@types/archiver": "5.3.2", "@types/bcryptjs": "2.4.2", - "@types/bull": "4.10.0", "@types/cbor": "6.0.0", "@types/color-convert": "2.0.0", "@types/content-disposition": "0.5.5", diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 744f99959..9d1945e4d 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -190,6 +190,6 @@ function tryCreateUrl(url: string) { try { return new URL(url); } catch (e) { - throw `url="${url}" is not a valid URL.`; + throw new Error(`url="${url}" is not a valid URL.`); } } diff --git a/packages/backend/src/core/CaptchaService.ts b/packages/backend/src/core/CaptchaService.ts index 7aaa1b833..1a52a229c 100644 --- a/packages/backend/src/core/CaptchaService.ts +++ b/packages/backend/src/core/CaptchaService.ts @@ -30,7 +30,7 @@ export class CaptchaService { }, { throwErrorWhenResponseNotOk: false }); if (!res.ok) { - throw `${res.status}`; + throw new Error(`${res.status}`); } return await res.json() as CaptchaResponse; @@ -39,48 +39,48 @@ export class CaptchaService { @bindThis public async verifyRecaptcha(secret: string, response: string | null | undefined): Promise { if (response == null) { - throw 'recaptcha-failed: no response provided'; + throw new Error('recaptcha-failed: no response provided'); } const result = await this.getCaptchaResponse('https://www.recaptcha.net/recaptcha/api/siteverify', secret, response).catch(err => { - throw `recaptcha-request-failed: ${err}`; + throw new Error(`recaptcha-request-failed: ${err}`); }); if (result.success !== true) { const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : ''; - throw `recaptcha-failed: ${errorCodes}`; + throw new Error(`recaptcha-failed: ${errorCodes}`); } } @bindThis public async verifyHcaptcha(secret: string, response: string | null | undefined): Promise { if (response == null) { - throw 'hcaptcha-failed: no response provided'; + throw new Error('hcaptcha-failed: no response provided'); } const result = await this.getCaptchaResponse('https://hcaptcha.com/siteverify', secret, response).catch(err => { - throw `hcaptcha-request-failed: ${err}`; + throw new Error(`hcaptcha-request-failed: ${err}`); }); if (result.success !== true) { const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : ''; - throw `hcaptcha-failed: ${errorCodes}`; + throw new Error(`hcaptcha-failed: ${errorCodes}`); } } @bindThis public async verifyTurnstile(secret: string, response: string | null | undefined): Promise { if (response == null) { - throw 'turnstile-failed: no response provided'; + throw new Error('turnstile-failed: no response provided'); } const result = await this.getCaptchaResponse('https://challenges.cloudflare.com/turnstile/v0/siteverify', secret, response).catch(err => { - throw `turnstile-request-failed: ${err}`; + throw new Error(`turnstile-request-failed: ${err}`); }); if (result.success !== true) { const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : ''; - throw `turnstile-failed: ${errorCodes}`; + throw new Error(`turnstile-failed: ${errorCodes}`); } } } diff --git a/packages/backend/src/core/FetchInstanceMetadataService.ts b/packages/backend/src/core/FetchInstanceMetadataService.ts index 8103d5afe..9de633350 100644 --- a/packages/backend/src/core/FetchInstanceMetadataService.ts +++ b/packages/backend/src/core/FetchInstanceMetadataService.ts @@ -116,14 +116,14 @@ export class FetchInstanceMetadataService { const wellknown = await this.httpRequestService.getJson('https://' + instance.host + '/.well-known/nodeinfo') .catch(err => { if (err.statusCode === 404) { - throw 'No nodeinfo provided'; + throw new Error('No nodeinfo provided'); } else { throw err.statusCode ?? err.message; } }) as Record; if (wellknown.links == null || !Array.isArray(wellknown.links)) { - throw 'No wellknown links'; + throw new Error('No wellknown links'); } const links = wellknown.links as any[]; @@ -134,7 +134,7 @@ export class FetchInstanceMetadataService { const link = lnik2_1 ?? lnik2_0 ?? lnik1_0; if (link == null) { - throw 'No nodeinfo link provided'; + throw new Error('No nodeinfo link provided'); } const info = await this.httpRequestService.getJson(link.href) diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 977c9052c..2fd7a8ac8 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -510,7 +510,7 @@ export class NoteCreateService implements OnApplicationShutdown { if (data.poll && data.poll.expiresAt) { const delay = data.poll.expiresAt.getTime() - Date.now(); - this.queueService.endedPollNotificationQueue.add({ + this.queueService.endedPollNotificationQueue.add(note.id, { noteId: note.id, }, { delay, diff --git a/packages/backend/src/core/QueueModule.ts b/packages/backend/src/core/QueueModule.ts index 1d7394777..6db9bb14c 100644 --- a/packages/backend/src/core/QueueModule.ts +++ b/packages/backend/src/core/QueueModule.ts @@ -1,42 +1,11 @@ import { setTimeout } from 'node:timers/promises'; import { Inject, Module, OnApplicationShutdown } from '@nestjs/common'; -import Bull from 'bull'; +import * as Bull from 'bullmq'; import { DI } from '@/di-symbols.js'; import type { Config } from '@/config.js'; +import { QUEUE, baseQueueOptions } from '@/queue/const.js'; import type { Provider } from '@nestjs/common'; -import type { DeliverJobData, InboxJobData, DbJobData, ObjectStorageJobData, EndedPollNotificationJobData, WebhookDeliverJobData, RelationshipJobData, DbJobMap } from '../queue/types.js'; - -function q(config: Config, name: string, limitPerSec = -1) { - return new Bull(name, { - redis: { - port: config.redisForJobQueue.port, - host: config.redisForJobQueue.host, - family: config.redisForJobQueue.family == null ? 0 : config.redisForJobQueue.family, - password: config.redisForJobQueue.pass, - db: config.redisForJobQueue.db ?? 0, - }, - prefix: config.redisForJobQueue.prefix ? `${config.redisForJobQueue.prefix}:queue` : 'queue', - limiter: limitPerSec > 0 ? { - max: limitPerSec, - duration: 1000, - } : undefined, - settings: { - backoffStrategies: { - apBackoff, - }, - }, - }); -} - -// ref. https://github.com/misskey-dev/misskey/pull/7635#issue-971097019 -function apBackoff(attemptsMade: number, err: Error) { - const baseDelay = 60 * 1000; // 1min - const maxBackoff = 8 * 60 * 60 * 1000; // 8hours - let backoff = (Math.pow(2, attemptsMade) - 1) * baseDelay; - backoff = Math.min(backoff, maxBackoff); - backoff += Math.round(backoff * Math.random() * 0.2); - return backoff; -} +import type { DeliverJobData, InboxJobData, EndedPollNotificationJobData, WebhookDeliverJobData, RelationshipJobData } from '../queue/types.js'; export type SystemQueue = Bull.Queue>; export type EndedPollNotificationQueue = Bull.Queue; @@ -49,49 +18,49 @@ export type WebhookDeliverQueue = Bull.Queue; const $system: Provider = { provide: 'queue:system', - useFactory: (config: Config) => q(config, 'system'), + useFactory: (config: Config) => new Bull.Queue(QUEUE.SYSTEM, baseQueueOptions(config, QUEUE.SYSTEM)), inject: [DI.config], }; const $endedPollNotification: Provider = { provide: 'queue:endedPollNotification', - useFactory: (config: Config) => q(config, 'endedPollNotification'), + useFactory: (config: Config) => new Bull.Queue(QUEUE.ENDED_POLL_NOTIFICATION, baseQueueOptions(config, QUEUE.ENDED_POLL_NOTIFICATION)), inject: [DI.config], }; const $deliver: Provider = { provide: 'queue:deliver', - useFactory: (config: Config) => q(config, 'deliver', config.deliverJobPerSec ?? 128), + useFactory: (config: Config) => new Bull.Queue(QUEUE.DELIVER, baseQueueOptions(config, QUEUE.DELIVER)), inject: [DI.config], }; const $inbox: Provider = { provide: 'queue:inbox', - useFactory: (config: Config) => q(config, 'inbox', config.inboxJobPerSec ?? 16), + useFactory: (config: Config) => new Bull.Queue(QUEUE.INBOX, baseQueueOptions(config, QUEUE.INBOX)), inject: [DI.config], }; const $db: Provider = { provide: 'queue:db', - useFactory: (config: Config) => q(config, 'db'), + useFactory: (config: Config) => new Bull.Queue(QUEUE.DB, baseQueueOptions(config, QUEUE.DB)), inject: [DI.config], }; const $relationship: Provider = { provide: 'queue:relationship', - useFactory: (config: Config) => q(config, 'relationship', config.relashionshipJobPerSec ?? 64), + useFactory: (config: Config) => new Bull.Queue(QUEUE.RELATIONSHIP, baseQueueOptions(config, QUEUE.RELATIONSHIP)), inject: [DI.config], }; const $objectStorage: Provider = { provide: 'queue:objectStorage', - useFactory: (config: Config) => q(config, 'objectStorage'), + useFactory: (config: Config) => new Bull.Queue(QUEUE.OBJECT_STORAGE, baseQueueOptions(config, QUEUE.OBJECT_STORAGE)), inject: [DI.config], }; const $webhookDeliver: Provider = { provide: 'queue:webhookDeliver', - useFactory: (config: Config) => q(config, 'webhookDeliver', 64), + useFactory: (config: Config) => new Bull.Queue(QUEUE.WEBHOOK_DELIVER, baseQueueOptions(config, QUEUE.WEBHOOK_DELIVER)), inject: [DI.config], }; diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts index b4ffffecc..2ae8a2b75 100644 --- a/packages/backend/src/core/QueueService.ts +++ b/packages/backend/src/core/QueueService.ts @@ -1,6 +1,5 @@ import { Inject, Injectable } from '@nestjs/common'; import { v4 as uuid } from 'uuid'; -import Bull from 'bull'; import type { IActivity } from '@/core/activitypub/type.js'; import type { DriveFile } from '@/models/entities/DriveFile.js'; import type { Webhook, webhookEventTypes } from '@/models/entities/Webhook.js'; @@ -11,6 +10,7 @@ import type { Antenna } from '@/server/api/endpoints/i/import-antennas.js'; import type { DbQueue, DeliverQueue, EndedPollNotificationQueue, InboxQueue, ObjectStorageQueue, RelationshipQueue, SystemQueue, WebhookDeliverQueue } from './QueueModule.js'; import type { DbJobData, RelationshipJobData, ThinUser } from '../queue/types.js'; import type httpSignature from '@peertube/http-signature'; +import type * as Bull from 'bullmq'; @Injectable() export class QueueService { @@ -26,7 +26,43 @@ export class QueueService { @Inject('queue:relationship') public relationshipQueue: RelationshipQueue, @Inject('queue:objectStorage') public objectStorageQueue: ObjectStorageQueue, @Inject('queue:webhookDeliver') public webhookDeliverQueue: WebhookDeliverQueue, - ) {} + ) { + this.systemQueue.add('tickCharts', { + }, { + repeat: { pattern: '55 * * * *' }, + removeOnComplete: true, + }); + + this.systemQueue.add('resyncCharts', { + }, { + repeat: { pattern: '0 0 * * *' }, + removeOnComplete: true, + }); + + this.systemQueue.add('cleanCharts', { + }, { + repeat: { pattern: '0 0 * * *' }, + removeOnComplete: true, + }); + + this.systemQueue.add('aggregateRetention', { + }, { + repeat: { pattern: '0 0 * * *' }, + removeOnComplete: true, + }); + + this.systemQueue.add('clean', { + }, { + repeat: { pattern: '0 0 * * *' }, + removeOnComplete: true, + }); + + this.systemQueue.add('checkExpiredMutings', { + }, { + repeat: { pattern: '*/5 * * * *' }, + removeOnComplete: true, + }); + } @bindThis public deliver(user: ThinUser, content: IActivity | null, to: string | null, isSharedInbox: boolean) { @@ -42,11 +78,10 @@ export class QueueService { isSharedInbox, }; - return this.deliverQueue.add(data, { + return this.deliverQueue.add(to, data, { attempts: this.config.deliverJobMaxAttempts ?? 12, - timeout: 1 * 60 * 1000, // 1min backoff: { - type: 'apBackoff', + type: 'custom', }, removeOnComplete: true, removeOnFail: true, @@ -60,11 +95,10 @@ export class QueueService { signature, }; - return this.inboxQueue.add(data, { + return this.inboxQueue.add('', data, { attempts: this.config.inboxJobMaxAttempts ?? 8, - timeout: 5 * 60 * 1000, // 5min backoff: { - type: 'apBackoff', + type: 'custom', }, removeOnComplete: true, removeOnFail: true, @@ -212,7 +246,7 @@ export class QueueService { private generateToDbJobData>(name: T, data: D): { name: string, data: D, - opts: Bull.JobOptions, + opts: Bull.JobsOptions, } { return { name, @@ -299,10 +333,10 @@ export class QueueService { } @bindThis - private generateRelationshipJobData(name: 'follow' | 'unfollow' | 'block' | 'unblock', data: RelationshipJobData, opts: Bull.JobOptions = {}): { + private generateRelationshipJobData(name: 'follow' | 'unfollow' | 'block' | 'unblock', data: RelationshipJobData, opts: Bull.JobsOptions = {}): { name: string, data: RelationshipJobData, - opts: Bull.JobOptions, + opts: Bull.JobsOptions, } { return { name, @@ -351,11 +385,10 @@ export class QueueService { eventId: uuid(), }; - return this.webhookDeliverQueue.add(data, { + return this.webhookDeliverQueue.add(webhook.id, data, { attempts: 4, - timeout: 1 * 60 * 1000, // 1min backoff: { - type: 'apBackoff', + type: 'custom', }, removeOnComplete: true, removeOnFail: true, @@ -367,11 +400,11 @@ export class QueueService { this.deliverQueue.once('cleaned', (jobs, status) => { //deliverLogger.succ(`Cleaned ${jobs.length} ${status} jobs`); }); - this.deliverQueue.clean(0, 'delayed'); + this.deliverQueue.clean(0, Infinity, 'delayed'); this.inboxQueue.once('cleaned', (jobs, status) => { //inboxLogger.succ(`Cleaned ${jobs.length} ${status} jobs`); }); - this.inboxQueue.clean(0, 'delayed'); + this.inboxQueue.clean(0, Infinity, 'delayed'); } } diff --git a/packages/backend/src/core/activitypub/LdSignatureService.ts b/packages/backend/src/core/activitypub/LdSignatureService.ts index 2dc1a410a..20fe2a0a7 100644 --- a/packages/backend/src/core/activitypub/LdSignatureService.ts +++ b/packages/backend/src/core/activitypub/LdSignatureService.ts @@ -94,7 +94,7 @@ class LdSignature { @bindThis private getLoader() { return async (url: string): Promise => { - if (!url.match('^https?\:\/\/')) throw `Invalid URL ${url}`; + if (!url.match('^https?\:\/\/')) throw new Error(`Invalid URL ${url}`); if (this.preLoad) { if (url in CONTEXTS) { @@ -126,7 +126,7 @@ class LdSignature { timeout: this.loderTimeout, }, { throwErrorWhenResponseNotOk: false }).then(res => { if (!res.ok) { - throw `${res.status} ${res.statusText}`; + throw new Error(`${res.status} ${res.statusText}`); } else { return res.json(); } diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts index 87a9db405..76757f530 100644 --- a/packages/backend/src/core/activitypub/models/ApNoteService.ts +++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts @@ -18,6 +18,7 @@ import { PollService } from '@/core/PollService.js'; import { StatusError } from '@/misc/status-error.js'; import { UtilityService } from '@/core/UtilityService.js'; import { bindThis } from '@/decorators.js'; +import { checkHttps } from '@/misc/check-https.js'; import { getOneApId, getApId, getOneApHrefNullable, validPost, isEmoji, getApType } from '../type.js'; // eslint-disable-next-line @typescript-eslint/consistent-type-imports import { ApLoggerService } from '../ApLoggerService.js'; @@ -32,7 +33,6 @@ import { ApQuestionService } from './ApQuestionService.js'; import { ApImageService } from './ApImageService.js'; import type { Resolver } from '../ApResolverService.js'; import type { IObject, IPost } from '../type.js'; -import { checkHttps } from '@/misc/check-https.js'; @Injectable() export class ApNoteService { @@ -230,7 +230,7 @@ export class ApNoteService { quote = results.filter((x): x is { status: 'ok', res: Note | null } => x.status === 'ok').map(x => x.res).find(x => x); if (!quote) { if (results.some(x => x.status === 'temperror')) { - throw 'quote resolve failed'; + throw new Error('quote resolve failed'); } } } @@ -311,7 +311,7 @@ export class ApNoteService { // ブロックしてたら中断 const meta = await this.metaService.fetch(); - if (this.utilityService.isBlockedHost(meta.blockedHosts, this.utilityService.extractDbHost(uri))) throw { statusCode: 451 }; + if (this.utilityService.isBlockedHost(meta.blockedHosts, this.utilityService.extractDbHost(uri))) throw new StatusError('blocked host', 451); const unlock = await this.appLockService.getApLock(uri); diff --git a/packages/backend/src/daemons/QueueStatsService.ts b/packages/backend/src/daemons/QueueStatsService.ts index b717434e0..0a5b3184d 100644 --- a/packages/backend/src/daemons/QueueStatsService.ts +++ b/packages/backend/src/daemons/QueueStatsService.ts @@ -1,7 +1,11 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import Xev from 'xev'; +import * as Bull from 'bullmq'; import { QueueService } from '@/core/QueueService.js'; import { bindThis } from '@/decorators.js'; +import { DI } from '@/di-symbols.js'; +import type { Config } from '@/config.js'; +import { QUEUE, baseQueueOptions } from '@/queue/const.js'; import type { OnApplicationShutdown } from '@nestjs/common'; const ev = new Xev(); @@ -13,6 +17,9 @@ export class QueueStatsService implements OnApplicationShutdown { private intervalId: NodeJS.Timer; constructor( + @Inject(DI.config) + private config: Config, + private queueService: QueueService, ) { } @@ -31,11 +38,14 @@ export class QueueStatsService implements OnApplicationShutdown { let activeDeliverJobs = 0; let activeInboxJobs = 0; - this.queueService.deliverQueue.on('global:active', () => { + const deliverQueueEvents = new Bull.QueueEvents(QUEUE.DELIVER, baseQueueOptions(this.config, QUEUE.DELIVER)); + const inboxQueueEvents = new Bull.QueueEvents(QUEUE.INBOX, baseQueueOptions(this.config, QUEUE.INBOX)); + + deliverQueueEvents.on('active', () => { activeDeliverJobs++; }); - this.queueService.inboxQueue.on('global:active', () => { + inboxQueueEvents.on('active', () => { activeInboxJobs++; }); diff --git a/packages/backend/src/misc/id/aid.ts b/packages/backend/src/misc/id/aid.ts index 9e206ee98..f0cbc9900 100644 --- a/packages/backend/src/misc/id/aid.ts +++ b/packages/backend/src/misc/id/aid.ts @@ -21,7 +21,7 @@ function getNoise(): string { export function genAid(date: Date): string { const t = date.getTime(); - if (isNaN(t)) throw 'Failed to create AID: Invalid Date'; + if (isNaN(t)) throw new Error('Failed to create AID: Invalid Date'); counter++; return getTime(t) + getNoise(); } diff --git a/packages/backend/src/misc/prelude/time.ts b/packages/backend/src/misc/prelude/time.ts index 34e8b6b17..b21978b18 100644 --- a/packages/backend/src/misc/prelude/time.ts +++ b/packages/backend/src/misc/prelude/time.ts @@ -5,15 +5,16 @@ const dateTimeIntervals = { }; export function dateUTC(time: number[]): Date { - const d = time.length === 2 ? Date.UTC(time[0], time[1]) - : time.length === 3 ? Date.UTC(time[0], time[1], time[2]) - : time.length === 4 ? Date.UTC(time[0], time[1], time[2], time[3]) - : time.length === 5 ? Date.UTC(time[0], time[1], time[2], time[3], time[4]) - : time.length === 6 ? Date.UTC(time[0], time[1], time[2], time[3], time[4], time[5]) - : time.length === 7 ? Date.UTC(time[0], time[1], time[2], time[3], time[4], time[5], time[6]) - : null; + const d = + time.length === 2 ? Date.UTC(time[0], time[1]) + : time.length === 3 ? Date.UTC(time[0], time[1], time[2]) + : time.length === 4 ? Date.UTC(time[0], time[1], time[2], time[3]) + : time.length === 5 ? Date.UTC(time[0], time[1], time[2], time[3], time[4]) + : time.length === 6 ? Date.UTC(time[0], time[1], time[2], time[3], time[4], time[5]) + : time.length === 7 ? Date.UTC(time[0], time[1], time[2], time[3], time[4], time[5], time[6]) + : null; - if (!d) throw 'wrong number of arguments'; + if (!d) throw new Error('wrong number of arguments'); return new Date(d); } diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index dc025f988..011082cd3 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -1,10 +1,9 @@ import { Inject, Injectable } from '@nestjs/common'; +import * as Bull from 'bullmq'; import type { Config } from '@/config.js'; import { DI } from '@/di-symbols.js'; import type Logger from '@/logger.js'; -import { QueueService } from '@/core/QueueService.js'; import { bindThis } from '@/decorators.js'; -import { getJobInfo } from './get-job-info.js'; import { WebhookDeliverProcessorService } from './processors/WebhookDeliverProcessorService.js'; import { EndedPollNotificationProcessorService } from './processors/EndedPollNotificationProcessorService.js'; import { DeliverProcessorService } from './processors/DeliverProcessorService.js'; @@ -35,6 +34,33 @@ import { CheckExpiredMutingsProcessorService } from './processors/CheckExpiredMu import { CleanProcessorService } from './processors/CleanProcessorService.js'; import { AggregateRetentionProcessorService } from './processors/AggregateRetentionProcessorService.js'; import { QueueLoggerService } from './QueueLoggerService.js'; +import { QUEUE, baseQueueOptions } from './const.js'; + +// ref. https://github.com/misskey-dev/misskey/pull/7635#issue-971097019 +function httpRelatedBackoff(attemptsMade: number) { + const baseDelay = 60 * 1000; // 1min + const maxBackoff = 8 * 60 * 60 * 1000; // 8hours + let backoff = (Math.pow(2, attemptsMade) - 1) * baseDelay; + backoff = Math.min(backoff, maxBackoff); + backoff += Math.round(backoff * Math.random() * 0.2); + return backoff; +} + +function getJobInfo(job: Bull.Job | undefined, increment = false): string { + if (job == null) return '-'; + + const age = Date.now() - job.timestamp; + + const formated = age > 60000 ? `${Math.floor(age / 1000 / 60)}m` + : age > 10000 ? `${Math.floor(age / 1000)}s` + : `${age}ms`; + + // onActiveとかonCompletedのattemptsMadeがなぜか0始まりなのでインクリメントする + const currentAttempts = job.attemptsMade + (increment ? 1 : 0); + const maxAttempts = job.opts ? job.opts.attempts : 0; + + return `id=${job.id} attempts=${currentAttempts}/${maxAttempts} age=${formated}`; +} @Injectable() export class QueueProcessorService { @@ -45,7 +71,6 @@ export class QueueProcessorService { private config: Config, private queueLoggerService: QueueLoggerService, - private queueService: QueueService, private webhookDeliverProcessorService: WebhookDeliverProcessorService, private endedPollNotificationProcessorService: EndedPollNotificationProcessorService, private deliverProcessorService: DeliverProcessorService, @@ -97,146 +122,191 @@ export class QueueProcessorService { } } - const systemLogger = this.logger.createSubLogger('system'); - const deliverLogger = this.logger.createSubLogger('deliver'); - const webhookLogger = this.logger.createSubLogger('webhook'); - const inboxLogger = this.logger.createSubLogger('inbox'); - const dbLogger = this.logger.createSubLogger('db'); - const relationshipLogger = this.logger.createSubLogger('relationship'); - const objectStorageLogger = this.logger.createSubLogger('objectStorage'); + //#region system + const systemQueueWorker = new Bull.Worker(QUEUE.SYSTEM, (job) => { + switch (job.name) { + case 'tickCharts': return this.tickChartsProcessorService.process(); + case 'resyncCharts': return this.resyncChartsProcessorService.process(); + case 'cleanCharts': return this.cleanChartsProcessorService.process(); + case 'aggregateRetention': return this.aggregateRetentionProcessorService.process(); + case 'checkExpiredMutings': return this.checkExpiredMutingsProcessorService.process(); + case 'clean': return this.cleanProcessorService.process(); + default: throw new Error(`unrecognized job type ${job.name} for system`); + } + }, { + ...baseQueueOptions(this.config, QUEUE.SYSTEM), + }); - this.queueService.systemQueue - .on('waiting', (jobId) => systemLogger.debug(`waiting id=${jobId}`)) + const systemLogger = this.logger.createSubLogger('system'); + + systemQueueWorker .on('active', (job) => systemLogger.debug(`active id=${job.id}`)) .on('completed', (job, result) => systemLogger.debug(`completed(${result}) id=${job.id}`)) - .on('failed', (job, err) => systemLogger.warn(`failed(${err}) id=${job.id}`, { job, e: renderError(err) })) - .on('error', (job: any, err: Error) => systemLogger.error(`error ${err}`, { job, e: renderError(err) })) - .on('stalled', (job) => systemLogger.warn(`stalled id=${job.id}`)); + .on('failed', (job, err) => systemLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) })) + .on('error', (err: Error) => systemLogger.error(`error ${err}`, { e: renderError(err) })) + .on('stalled', (jobId) => systemLogger.warn(`stalled id=${jobId}`)); + //#endregion - this.queueService.deliverQueue - .on('waiting', (jobId) => deliverLogger.debug(`waiting id=${jobId}`)) - .on('active', (job) => deliverLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`)) - .on('completed', (job, result) => deliverLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`)) - .on('failed', (job, err) => deliverLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job.data.to}`)) - .on('error', (job: any, err: Error) => deliverLogger.error(`error ${err}`, { job, e: renderError(err) })) - .on('stalled', (job) => deliverLogger.warn(`stalled ${getJobInfo(job)} to=${job.data.to}`)); + //#region db + const dbQueueWorker = new Bull.Worker(QUEUE.DB, (job) => { + switch (job.name) { + case 'deleteDriveFiles': return this.deleteDriveFilesProcessorService.process(job); + case 'exportCustomEmojis': return this.exportCustomEmojisProcessorService.process(job); + case 'exportNotes': return this.exportNotesProcessorService.process(job); + case 'exportFavorites': return this.exportFavoritesProcessorService.process(job); + case 'exportFollowing': return this.exportFollowingProcessorService.process(job); + case 'exportMuting': return this.exportMutingProcessorService.process(job); + case 'exportBlocking': return this.exportBlockingProcessorService.process(job); + case 'exportUserLists': return this.exportUserListsProcessorService.process(job); + case 'exportAntennas': return this.exportAntennasProcessorService.process(job); + case 'importFollowing': return this.importFollowingProcessorService.process(job); + case 'importFollowingToDb': return this.importFollowingProcessorService.processDb(job); + case 'importMuting': return this.importMutingProcessorService.process(job); + case 'importBlocking': return this.importBlockingProcessorService.process(job); + case 'importBlockingToDb': return this.importBlockingProcessorService.processDb(job); + case 'importUserLists': return this.importUserListsProcessorService.process(job); + case 'importCustomEmojis': return this.importCustomEmojisProcessorService.process(job); + case 'importAntennas': return this.importAntennasProcessorService.process(job); + case 'deleteAccount': return this.deleteAccountProcessorService.process(job); + default: throw new Error(`unrecognized job type ${job.name} for db`); + } + }, { + ...baseQueueOptions(this.config, QUEUE.DB), + }); - this.queueService.inboxQueue - .on('waiting', (jobId) => inboxLogger.debug(`waiting id=${jobId}`)) - .on('active', (job) => inboxLogger.debug(`active ${getJobInfo(job, true)}`)) - .on('completed', (job, result) => inboxLogger.debug(`completed(${result}) ${getJobInfo(job, true)}`)) - .on('failed', (job, err) => inboxLogger.warn(`failed(${err}) ${getJobInfo(job)} activity=${job.data.activity ? job.data.activity.id : 'none'}`, { job, e: renderError(err) })) - .on('error', (job: any, err: Error) => inboxLogger.error(`error ${err}`, { job, e: renderError(err) })) - .on('stalled', (job) => inboxLogger.warn(`stalled ${getJobInfo(job)} activity=${job.data.activity ? job.data.activity.id : 'none'}`)); + const dbLogger = this.logger.createSubLogger('db'); - this.queueService.dbQueue - .on('waiting', (jobId) => dbLogger.debug(`waiting id=${jobId}`)) + dbQueueWorker .on('active', (job) => dbLogger.debug(`active id=${job.id}`)) .on('completed', (job, result) => dbLogger.debug(`completed(${result}) id=${job.id}`)) - .on('failed', (job, err) => dbLogger.warn(`failed(${err}) id=${job.id}`, { job, e: renderError(err) })) - .on('error', (job: any, err: Error) => dbLogger.error(`error ${err}`, { job, e: renderError(err) })) - .on('stalled', (job) => dbLogger.warn(`stalled id=${job.id}`)); + .on('failed', (job, err) => dbLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) })) + .on('error', (err: Error) => dbLogger.error(`error ${err}`, { e: renderError(err) })) + .on('stalled', (jobId) => dbLogger.warn(`stalled id=${jobId}`)); + //#endregion - this.queueService.relationshipQueue - .on('waiting', (jobId) => relationshipLogger.debug(`waiting id=${jobId}`)) - .on('active', (job) => relationshipLogger.debug(`active id=${job.id}`)) - .on('completed', (job, result) => relationshipLogger.debug(`completed(${result}) id=${job.id}`)) - .on('failed', (job, err) => relationshipLogger.warn(`failed(${err}) id=${job.id}`, { job, e: renderError(err) })) - .on('error', (job: any, err: Error) => relationshipLogger.error(`error ${err}`, { job, e: renderError(err) })) - .on('stalled', (job) => relationshipLogger.warn(`stalled id=${job.id}`)); + //#region deliver + const deliverQueueWorker = new Bull.Worker(QUEUE.DELIVER, (job) => this.deliverProcessorService.process(job), { + ...baseQueueOptions(this.config, QUEUE.DELIVER), + concurrency: this.config.deliverJobConcurrency ?? 128, + limiter: { + max: this.config.deliverJobPerSec ?? 128, + duration: 1000, + }, + settings: { + backoffStrategy: httpRelatedBackoff, + }, + }); - this.queueService.objectStorageQueue - .on('waiting', (jobId) => objectStorageLogger.debug(`waiting id=${jobId}`)) - .on('active', (job) => objectStorageLogger.debug(`active id=${job.id}`)) - .on('completed', (job, result) => objectStorageLogger.debug(`completed(${result}) id=${job.id}`)) - .on('failed', (job, err) => objectStorageLogger.warn(`failed(${err}) id=${job.id}`, { job, e: renderError(err) })) - .on('error', (job: any, err: Error) => objectStorageLogger.error(`error ${err}`, { job, e: renderError(err) })) - .on('stalled', (job) => objectStorageLogger.warn(`stalled id=${job.id}`)); + const deliverLogger = this.logger.createSubLogger('deliver'); - this.queueService.webhookDeliverQueue - .on('waiting', (jobId) => webhookLogger.debug(`waiting id=${jobId}`)) + deliverQueueWorker + .on('active', (job) => deliverLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`)) + .on('completed', (job, result) => deliverLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`)) + .on('failed', (job, err) => deliverLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`)) + .on('error', (err: Error) => deliverLogger.error(`error ${err}`, { e: renderError(err) })) + .on('stalled', (jobId) => deliverLogger.warn(`stalled id=${jobId}`)); + //#endregion + + //#region inbox + const inboxQueueWorker = new Bull.Worker(QUEUE.INBOX, (job) => this.inboxProcessorService.process(job), { + ...baseQueueOptions(this.config, QUEUE.INBOX), + concurrency: this.config.inboxJobConcurrency ?? 16, + limiter: { + max: this.config.inboxJobPerSec ?? 16, + duration: 1000, + }, + settings: { + backoffStrategy: httpRelatedBackoff, + }, + }); + + const inboxLogger = this.logger.createSubLogger('inbox'); + + inboxQueueWorker + .on('active', (job) => inboxLogger.debug(`active ${getJobInfo(job, true)}`)) + .on('completed', (job, result) => inboxLogger.debug(`completed(${result}) ${getJobInfo(job, true)}`)) + .on('failed', (job, err) => inboxLogger.warn(`failed(${err}) ${getJobInfo(job)} activity=${job ? (job.data.activity ? job.data.activity.id : 'none') : '-'}`, { job, e: renderError(err) })) + .on('error', (err: Error) => inboxLogger.error(`error ${err}`, { e: renderError(err) })) + .on('stalled', (jobId) => inboxLogger.warn(`stalled id=${jobId}`)); + //#endregion + + //#region webhook deliver + const webhookDeliverQueueWorker = new Bull.Worker(QUEUE.WEBHOOK_DELIVER, (job) => this.webhookDeliverProcessorService.process(job), { + ...baseQueueOptions(this.config, QUEUE.WEBHOOK_DELIVER), + concurrency: 64, + limiter: { + max: 64, + duration: 1000, + }, + settings: { + backoffStrategy: httpRelatedBackoff, + }, + }); + + const webhookLogger = this.logger.createSubLogger('webhook'); + + webhookDeliverQueueWorker .on('active', (job) => webhookLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`)) .on('completed', (job, result) => webhookLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`)) - .on('failed', (job, err) => webhookLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job.data.to}`)) - .on('error', (job: any, err: Error) => webhookLogger.error(`error ${err}`, { job, e: renderError(err) })) - .on('stalled', (job) => webhookLogger.warn(`stalled ${getJobInfo(job)} to=${job.data.to}`)); + .on('failed', (job, err) => webhookLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`)) + .on('error', (err: Error) => webhookLogger.error(`error ${err}`, { e: renderError(err) })) + .on('stalled', (jobId) => webhookLogger.warn(`stalled id=${jobId}`)); + //#endregion - this.queueService.systemQueue.add('tickCharts', { + //#region relationship + const relationshipQueueWorker = new Bull.Worker(QUEUE.RELATIONSHIP, (job) => { + switch (job.name) { + case 'follow': return this.relationshipProcessorService.processFollow(job); + case 'unfollow': return this.relationshipProcessorService.processUnfollow(job); + case 'block': return this.relationshipProcessorService.processBlock(job); + case 'unblock': return this.relationshipProcessorService.processUnblock(job); + default: throw new Error(`unrecognized job type ${job.name} for relationship`); + } }, { - repeat: { cron: '55 * * * *' }, - removeOnComplete: true, + ...baseQueueOptions(this.config, QUEUE.RELATIONSHIP), + concurrency: this.config.relashionshipJobConcurrency ?? 16, + limiter: { + max: this.config.relashionshipJobPerSec ?? 64, + duration: 1000, + }, }); - this.queueService.systemQueue.add('resyncCharts', { - }, { - repeat: { cron: '0 0 * * *' }, - removeOnComplete: true, - }); - - this.queueService.systemQueue.add('cleanCharts', { - }, { - repeat: { cron: '0 0 * * *' }, - removeOnComplete: true, - }); - - this.queueService.systemQueue.add('aggregateRetention', { - }, { - repeat: { cron: '0 0 * * *' }, - removeOnComplete: true, - }); - - this.queueService.systemQueue.add('clean', { - }, { - repeat: { cron: '0 0 * * *' }, - removeOnComplete: true, - }); - - this.queueService.systemQueue.add('checkExpiredMutings', { - }, { - repeat: { cron: '*/5 * * * *' }, - removeOnComplete: true, - }); - - this.queueService.deliverQueue.process(this.config.deliverJobConcurrency ?? 128, (job) => this.deliverProcessorService.process(job)); - this.queueService.inboxQueue.process(this.config.inboxJobConcurrency ?? 16, (job) => this.inboxProcessorService.process(job)); - this.queueService.endedPollNotificationQueue.process((job, done) => this.endedPollNotificationProcessorService.process(job, done)); - this.queueService.webhookDeliverQueue.process(64, (job) => this.webhookDeliverProcessorService.process(job)); - - this.queueService.dbQueue.process('deleteDriveFiles', (job, done) => this.deleteDriveFilesProcessorService.process(job, done)); - this.queueService.dbQueue.process('exportCustomEmojis', (job, done) => this.exportCustomEmojisProcessorService.process(job, done)); - this.queueService.dbQueue.process('exportNotes', (job, done) => this.exportNotesProcessorService.process(job, done)); - this.queueService.dbQueue.process('exportFavorites', (job, done) => this.exportFavoritesProcessorService.process(job, done)); - this.queueService.dbQueue.process('exportFollowing', (job, done) => this.exportFollowingProcessorService.process(job, done)); - this.queueService.dbQueue.process('exportMuting', (job, done) => this.exportMutingProcessorService.process(job, done)); - this.queueService.dbQueue.process('exportBlocking', (job, done) => this.exportBlockingProcessorService.process(job, done)); - this.queueService.dbQueue.process('exportUserLists', (job, done) => this.exportUserListsProcessorService.process(job, done)); - this.queueService.dbQueue.process('exportAntennas', (job, done) => this.exportAntennasProcessorService.process(job, done)); - this.queueService.dbQueue.process('importFollowing', (job, done) => this.importFollowingProcessorService.process(job, done)); - this.queueService.dbQueue.process('importFollowingToDb', (job) => this.importFollowingProcessorService.processDb(job)); - this.queueService.dbQueue.process('importMuting', (job, done) => this.importMutingProcessorService.process(job, done)); - this.queueService.dbQueue.process('importBlocking', (job, done) => this.importBlockingProcessorService.process(job, done)); - this.queueService.dbQueue.process('importBlockingToDb', (job) => this.importBlockingProcessorService.processDb(job)); - this.queueService.dbQueue.process('importUserLists', (job, done) => this.importUserListsProcessorService.process(job, done)); - this.queueService.dbQueue.process('importCustomEmojis', (job, done) => this.importCustomEmojisProcessorService.process(job, done)); - this.queueService.dbQueue.process('importAntennas', (job, done) => this.importAntennasProcessorService.process(job, done)); - this.queueService.dbQueue.process('deleteAccount', (job) => this.deleteAccountProcessorService.process(job)); - - this.queueService.objectStorageQueue.process('deleteFile', 16, (job) => this.deleteFileProcessorService.process(job)); - this.queueService.objectStorageQueue.process('cleanRemoteFiles', 16, (job, done) => this.cleanRemoteFilesProcessorService.process(job, done)); + const relationshipLogger = this.logger.createSubLogger('relationship'); - { - const maxJobs = this.config.relashionshipJobConcurrency ?? 16; - this.queueService.relationshipQueue.process('follow', maxJobs, (job) => this.relationshipProcessorService.processFollow(job)); - this.queueService.relationshipQueue.process('unfollow', maxJobs, (job) => this.relationshipProcessorService.processUnfollow(job)); - this.queueService.relationshipQueue.process('block', maxJobs, (job) => this.relationshipProcessorService.processBlock(job)); - this.queueService.relationshipQueue.process('unblock', maxJobs, (job) => this.relationshipProcessorService.processUnblock(job)); - } + relationshipQueueWorker + .on('active', (job) => relationshipLogger.debug(`active id=${job.id}`)) + .on('completed', (job, result) => relationshipLogger.debug(`completed(${result}) id=${job.id}`)) + .on('failed', (job, err) => relationshipLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) })) + .on('error', (err: Error) => relationshipLogger.error(`error ${err}`, { e: renderError(err) })) + .on('stalled', (jobId) => relationshipLogger.warn(`stalled id=${jobId}`)); + //#endregion - this.queueService.systemQueue.process('tickCharts', (job, done) => this.tickChartsProcessorService.process(job, done)); - this.queueService.systemQueue.process('resyncCharts', (job, done) => this.resyncChartsProcessorService.process(job, done)); - this.queueService.systemQueue.process('cleanCharts', (job, done) => this.cleanChartsProcessorService.process(job, done)); - this.queueService.systemQueue.process('aggregateRetention', (job, done) => this.aggregateRetentionProcessorService.process(job, done)); - this.queueService.systemQueue.process('checkExpiredMutings', (job, done) => this.checkExpiredMutingsProcessorService.process(job, done)); - this.queueService.systemQueue.process('clean', (job, done) => this.cleanProcessorService.process(job, done)); + //#region object storage + const objectStorageQueueWorker = new Bull.Worker(QUEUE.OBJECT_STORAGE, (job) => { + switch (job.name) { + case 'deleteFile': return this.deleteFileProcessorService.process(job); + case 'cleanRemoteFiles': return this.cleanRemoteFilesProcessorService.process(job); + default: throw new Error(`unrecognized job type ${job.name} for objectStorage`); + } + }, { + ...baseQueueOptions(this.config, QUEUE.OBJECT_STORAGE), + concurrency: 16, + }); + + const objectStorageLogger = this.logger.createSubLogger('objectStorage'); + + objectStorageQueueWorker + .on('active', (job) => objectStorageLogger.debug(`active id=${job.id}`)) + .on('completed', (job, result) => objectStorageLogger.debug(`completed(${result}) id=${job.id}`)) + .on('failed', (job, err) => objectStorageLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) })) + .on('error', (err: Error) => objectStorageLogger.error(`error ${err}`, { e: renderError(err) })) + .on('stalled', (jobId) => objectStorageLogger.warn(`stalled id=${jobId}`)); + //#endregion + + //#region ended poll notification + const endedPollNotificationWorker = new Bull.Worker(QUEUE.ENDED_POLL_NOTIFICATION, (job) => this.endedPollNotificationProcessorService.process(job), { + ...baseQueueOptions(this.config, QUEUE.ENDED_POLL_NOTIFICATION), + }); + //#endregion } } diff --git a/packages/backend/src/queue/const.ts b/packages/backend/src/queue/const.ts new file mode 100644 index 000000000..d240fe70e --- /dev/null +++ b/packages/backend/src/queue/const.ts @@ -0,0 +1,26 @@ +import { Config } from '@/config.js'; +import type * as Bull from 'bullmq'; + +export const QUEUE = { + DELIVER: 'deliver', + INBOX: 'inbox', + SYSTEM: 'system', + ENDED_POLL_NOTIFICATION: 'endedPollNotification', + DB: 'db', + RELATIONSHIP: 'relationship', + OBJECT_STORAGE: 'objectStorage', + WEBHOOK_DELIVER: 'webhookDeliver', +}; + +export function baseQueueOptions(config: Config, queueName: typeof QUEUE[keyof typeof QUEUE]): Bull.QueueOptions { + return { + connection: { + port: config.redisForJobQueue.port, + host: config.redisForJobQueue.host, + family: config.redisForJobQueue.family == null ? 0 : config.redisForJobQueue.family, + password: config.redisForJobQueue.pass, + db: config.redisForJobQueue.db ?? 0, + }, + prefix: config.redisForJobQueue.prefix ? `${config.redisForJobQueue.prefix}:queue:${queueName}` : `queue:${queueName}`, + }; +} diff --git a/packages/backend/src/queue/get-job-info.ts b/packages/backend/src/queue/get-job-info.ts deleted file mode 100644 index d33e349c3..000000000 --- a/packages/backend/src/queue/get-job-info.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Bull from 'bull'; - -export function getJobInfo(job: Bull.Job, increment = false) { - const age = Date.now() - job.timestamp; - - const formated = age > 60000 ? `${Math.floor(age / 1000 / 60)}m` - : age > 10000 ? `${Math.floor(age / 1000)}s` - : `${age}ms`; - - // onActiveとかonCompletedのattemptsMadeがなぜか0始まりなのでインクリメントする - const currentAttempts = job.attemptsMade + (increment ? 1 : 0); - const maxAttempts = job.opts ? job.opts.attempts : 0; - - return `id=${job.id} attempts=${currentAttempts}/${maxAttempts} age=${formated}`; -} diff --git a/packages/backend/src/queue/processors/AggregateRetentionProcessorService.ts b/packages/backend/src/queue/processors/AggregateRetentionProcessorService.ts index e2720b4fe..600ce0828 100644 --- a/packages/backend/src/queue/processors/AggregateRetentionProcessorService.ts +++ b/packages/backend/src/queue/processors/AggregateRetentionProcessorService.ts @@ -9,7 +9,7 @@ import { deepClone } from '@/misc/clone.js'; import { IdService } from '@/core/IdService.js'; import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; @Injectable() export class AggregateRetentionProcessorService { @@ -32,7 +32,7 @@ export class AggregateRetentionProcessorService { } @bindThis - public async process(job: Bull.Job>, done: () => void): Promise { + public async process(): Promise { this.logger.info('Aggregating retention...'); const now = new Date(); @@ -62,7 +62,6 @@ export class AggregateRetentionProcessorService { } catch (err) { if (isDuplicateKeyValueError(err)) { this.logger.succ('Skip because it has already been processed by another worker.'); - done(); return; } throw err; @@ -88,6 +87,5 @@ export class AggregateRetentionProcessorService { } this.logger.succ('Retention aggregated.'); - done(); } } diff --git a/packages/backend/src/queue/processors/CheckExpiredMutingsProcessorService.ts b/packages/backend/src/queue/processors/CheckExpiredMutingsProcessorService.ts index 2476d71a5..c4ee212ba 100644 --- a/packages/backend/src/queue/processors/CheckExpiredMutingsProcessorService.ts +++ b/packages/backend/src/queue/processors/CheckExpiredMutingsProcessorService.ts @@ -7,7 +7,7 @@ import type Logger from '@/logger.js'; import { bindThis } from '@/decorators.js'; import { UserMutingService } from '@/core/UserMutingService.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; @Injectable() export class CheckExpiredMutingsProcessorService { @@ -27,7 +27,7 @@ export class CheckExpiredMutingsProcessorService { } @bindThis - public async process(job: Bull.Job>, done: () => void): Promise { + public async process(): Promise { this.logger.info('Checking expired mutings...'); const expired = await this.mutingsRepository.createQueryBuilder('muting') @@ -41,6 +41,5 @@ export class CheckExpiredMutingsProcessorService { } this.logger.succ('All expired mutings checked.'); - done(); } } diff --git a/packages/backend/src/queue/processors/CleanChartsProcessorService.ts b/packages/backend/src/queue/processors/CleanChartsProcessorService.ts index b45816704..22d7c1b4f 100644 --- a/packages/backend/src/queue/processors/CleanChartsProcessorService.ts +++ b/packages/backend/src/queue/processors/CleanChartsProcessorService.ts @@ -16,7 +16,7 @@ import PerUserDriveChart from '@/core/chart/charts/per-user-drive.js'; import ApRequestChart from '@/core/chart/charts/ap-request.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; @Injectable() export class CleanChartsProcessorService { @@ -45,7 +45,7 @@ export class CleanChartsProcessorService { } @bindThis - public async process(job: Bull.Job>, done: () => void): Promise { + public async process(): Promise { this.logger.info('Clean charts...'); await Promise.all([ @@ -64,6 +64,5 @@ export class CleanChartsProcessorService { ]); this.logger.succ('All charts successfully cleaned.'); - done(); } } diff --git a/packages/backend/src/queue/processors/CleanProcessorService.ts b/packages/backend/src/queue/processors/CleanProcessorService.ts index 1936e8df2..cefa6da5e 100644 --- a/packages/backend/src/queue/processors/CleanProcessorService.ts +++ b/packages/backend/src/queue/processors/CleanProcessorService.ts @@ -7,7 +7,7 @@ import type Logger from '@/logger.js'; import { bindThis } from '@/decorators.js'; import { IdService } from '@/core/IdService.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; @Injectable() export class CleanProcessorService { @@ -36,7 +36,7 @@ export class CleanProcessorService { } @bindThis - public async process(job: Bull.Job>, done: () => void): Promise { + public async process(): Promise { this.logger.info('Cleaning...'); this.userIpsRepository.delete({ @@ -72,6 +72,5 @@ export class CleanProcessorService { } this.logger.succ('Cleaned.'); - done(); } } diff --git a/packages/backend/src/queue/processors/CleanRemoteFilesProcessorService.ts b/packages/backend/src/queue/processors/CleanRemoteFilesProcessorService.ts index 5a33c2718..c54bf59ae 100644 --- a/packages/backend/src/queue/processors/CleanRemoteFilesProcessorService.ts +++ b/packages/backend/src/queue/processors/CleanRemoteFilesProcessorService.ts @@ -5,9 +5,9 @@ import type { DriveFilesRepository } from '@/models/index.js'; import type { Config } from '@/config.js'; import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; @Injectable() export class CleanRemoteFilesProcessorService { @@ -27,7 +27,7 @@ export class CleanRemoteFilesProcessorService { } @bindThis - public async process(job: Bull.Job>, done: () => void): Promise { + public async process(job: Bull.Job>): Promise { this.logger.info('Deleting cached remote files...'); let deletedCount = 0; @@ -47,7 +47,7 @@ export class CleanRemoteFilesProcessorService { }); if (files.length === 0) { - job.progress(100); + job.updateProgress(100); break; } @@ -62,10 +62,9 @@ export class CleanRemoteFilesProcessorService { isLink: false, }); - job.progress(deletedCount / total); + job.updateProgress(deletedCount / total); } this.logger.succ('All cached remote files has been deleted.'); - done(); } } diff --git a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts index e36a78de6..39dd801af 100644 --- a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts +++ b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts @@ -8,10 +8,10 @@ import { DriveService } from '@/core/DriveService.js'; import type { DriveFile } from '@/models/entities/DriveFile.js'; import type { Note } from '@/models/entities/Note.js'; import { EmailService } from '@/core/EmailService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbUserDeleteJobData } from '../types.js'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbUserDeleteJobData } from '../types.js'; @Injectable() export class DeleteAccountProcessorService { diff --git a/packages/backend/src/queue/processors/DeleteDriveFilesProcessorService.ts b/packages/backend/src/queue/processors/DeleteDriveFilesProcessorService.ts index 604497cf5..6772c5dc7 100644 --- a/packages/backend/src/queue/processors/DeleteDriveFilesProcessorService.ts +++ b/packages/backend/src/queue/processors/DeleteDriveFilesProcessorService.ts @@ -5,10 +5,10 @@ import type { UsersRepository, DriveFilesRepository } from '@/models/index.js'; import type { Config } from '@/config.js'; import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbJobDataWithUser } from '../types.js'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbJobDataWithUser } from '../types.js'; @Injectable() export class DeleteDriveFilesProcessorService { @@ -31,12 +31,11 @@ export class DeleteDriveFilesProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Deleting drive files of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -56,7 +55,7 @@ export class DeleteDriveFilesProcessorService { }); if (files.length === 0) { - job.progress(100); + job.updateProgress(100); break; } @@ -71,10 +70,9 @@ export class DeleteDriveFilesProcessorService { userId: user.id, }); - job.progress(deletedCount / total); + job.updateProgress(deletedCount / total); } this.logger.succ(`All drive files (${deletedCount}) of ${user.id} has been deleted.`); - done(); } } diff --git a/packages/backend/src/queue/processors/DeleteFileProcessorService.ts b/packages/backend/src/queue/processors/DeleteFileProcessorService.ts index 2fb2f56f8..edf87bd92 100644 --- a/packages/backend/src/queue/processors/DeleteFileProcessorService.ts +++ b/packages/backend/src/queue/processors/DeleteFileProcessorService.ts @@ -3,10 +3,10 @@ import { DI } from '@/di-symbols.js'; import type { Config } from '@/config.js'; import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { ObjectStorageFileJobData } from '../types.js'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { ObjectStorageFileJobData } from '../types.js'; @Injectable() export class DeleteFileProcessorService { diff --git a/packages/backend/src/queue/processors/DeliverProcessorService.ts b/packages/backend/src/queue/processors/DeliverProcessorService.ts index f293bd4d7..406e9df85 100644 --- a/packages/backend/src/queue/processors/DeliverProcessorService.ts +++ b/packages/backend/src/queue/processors/DeliverProcessorService.ts @@ -1,4 +1,5 @@ import { Inject, Injectable } from '@nestjs/common'; +import * as Bull from 'bullmq'; import { DI } from '@/di-symbols.js'; import type { DriveFilesRepository, InstancesRepository } from '@/models/index.js'; import type { Config } from '@/config.js'; @@ -16,7 +17,6 @@ import { StatusError } from '@/misc/status-error.js'; import { UtilityService } from '@/core/UtilityService.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; import type { DeliverJobData } from '../types.js'; @Injectable() @@ -121,15 +121,13 @@ export class DeliverProcessorService { isSuspended: true, }); }); - return `${host} is gone`; + throw new Bull.UnrecoverableError(`${host} is gone`); } - // HTTPステータスコード4xxはクライアントエラーであり、それはつまり - // 何回再送しても成功することはないということなのでエラーにはしないでおく - return `${res.statusCode} ${res.statusMessage}`; + throw new Bull.UnrecoverableError(`${res.statusCode} ${res.statusMessage}`); } // 5xx etc. - throw `${res.statusCode} ${res.statusMessage}`; + throw new Error(`${res.statusCode} ${res.statusMessage}`); } else { // DNS error, socket error, timeout ... throw res; diff --git a/packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts b/packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts index 501ed4090..21501592f 100644 --- a/packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts +++ b/packages/backend/src/queue/processors/EndedPollNotificationProcessorService.ts @@ -6,7 +6,7 @@ import type Logger from '@/logger.js'; import { NotificationService } from '@/core/NotificationService.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; import type { EndedPollNotificationJobData } from '../types.js'; @Injectable() @@ -30,10 +30,9 @@ export class EndedPollNotificationProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { const note = await this.notesRepository.findOneBy({ id: job.data.noteId }); if (note == null || !note.hasPoll) { - done(); return; } @@ -51,7 +50,5 @@ export class EndedPollNotificationProcessorService { noteId: note.id, }); } - - done(); } } diff --git a/packages/backend/src/queue/processors/ExportAntennasProcessorService.ts b/packages/backend/src/queue/processors/ExportAntennasProcessorService.ts index 894903e79..ac52325c8 100644 --- a/packages/backend/src/queue/processors/ExportAntennasProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportAntennasProcessorService.ts @@ -12,7 +12,7 @@ import { createTemp } from '@/misc/create-temp.js'; import { UtilityService } from '@/core/UtilityService.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; import type { DBExportAntennasData } from '../types.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; @Injectable() export class ExportAntennasProcessorService { @@ -39,10 +39,9 @@ export class ExportAntennasProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } const [path, cleanup] = await createTemp(); @@ -96,7 +95,6 @@ export class ExportAntennasProcessorService { this.logger.succ('Exported to: ' + driveFile.id); } finally { cleanup(); - done(); } } } diff --git a/packages/backend/src/queue/processors/ExportBlockingProcessorService.ts b/packages/backend/src/queue/processors/ExportBlockingProcessorService.ts index c7b54070d..eb758e162 100644 --- a/packages/backend/src/queue/processors/ExportBlockingProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportBlockingProcessorService.ts @@ -9,10 +9,10 @@ import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; import { createTemp } from '@/misc/create-temp.js'; import { UtilityService } from '@/core/UtilityService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbJobDataWithUser } from '../types.js'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbJobDataWithUser } from '../types.js'; @Injectable() export class ExportBlockingProcessorService { @@ -36,12 +36,11 @@ export class ExportBlockingProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Exporting blocking of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -69,7 +68,7 @@ export class ExportBlockingProcessorService { }); if (blockings.length === 0) { - job.progress(100); + job.updateProgress(100); break; } @@ -99,7 +98,7 @@ export class ExportBlockingProcessorService { blockerId: user.id, }); - job.progress(exportedCount / total); + job.updateProgress(exportedCount / total); } stream.end(); @@ -112,7 +111,5 @@ export class ExportBlockingProcessorService { } finally { cleanup(); } - - done(); } } diff --git a/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts b/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts index b50f373ef..3203d9f3e 100644 --- a/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts @@ -13,7 +13,7 @@ import { createTemp, createTempDir } from '@/misc/create-temp.js'; import { DownloadService } from '@/core/DownloadService.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; @Injectable() export class ExportCustomEmojisProcessorService { @@ -37,12 +37,11 @@ export class ExportCustomEmojisProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info('Exporting custom emojis ...'); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -117,24 +116,26 @@ export class ExportCustomEmojisProcessorService { metaStream.end(); // Create archive - const [archivePath, archiveCleanup] = await createTemp(); - const archiveStream = fs.createWriteStream(archivePath); - const archive = archiver('zip', { - zlib: { level: 0 }, - }); - archiveStream.on('close', async () => { - this.logger.succ(`Exported to: ${archivePath}`); + await new Promise(async (resolve) => { + const [archivePath, archiveCleanup] = await createTemp(); + const archiveStream = fs.createWriteStream(archivePath); + const archive = archiver('zip', { + zlib: { level: 0 }, + }); + archiveStream.on('close', async () => { + this.logger.succ(`Exported to: ${archivePath}`); - const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.zip'; - const driveFile = await this.driveService.addFile({ user, path: archivePath, name: fileName, force: true }); + const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.zip'; + const driveFile = await this.driveService.addFile({ user, path: archivePath, name: fileName, force: true }); - this.logger.succ(`Exported to: ${driveFile.id}`); - cleanup(); - archiveCleanup(); - done(); + this.logger.succ(`Exported to: ${driveFile.id}`); + cleanup(); + archiveCleanup(); + resolve(); + }); + archive.pipe(archiveStream); + archive.directory(path, false); + archive.finalize(); }); - archive.pipe(archiveStream); - archive.directory(path, false); - archive.finalize(); } } diff --git a/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts b/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts index f2f2383a8..76c38a6b8 100644 --- a/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts @@ -12,7 +12,7 @@ import type { Poll } from '@/models/entities/Poll.js'; import type { Note } from '@/models/entities/Note.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; import type { DbJobDataWithUser } from '../types.js'; @Injectable() @@ -42,12 +42,11 @@ export class ExportFavoritesProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Exporting favorites of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -91,7 +90,7 @@ export class ExportFavoritesProcessorService { }) as (NoteFavorite & { note: Note & { user: User } })[]; if (favorites.length === 0) { - job.progress(100); + job.updateProgress(100); break; } @@ -112,7 +111,7 @@ export class ExportFavoritesProcessorService { userId: user.id, }); - job.progress(exportedFavoritesCount / total); + job.updateProgress(exportedFavoritesCount / total); } await write(']'); @@ -127,8 +126,6 @@ export class ExportFavoritesProcessorService { } finally { cleanup(); } - - done(); } } diff --git a/packages/backend/src/queue/processors/ExportFollowingProcessorService.ts b/packages/backend/src/queue/processors/ExportFollowingProcessorService.ts index fa9c1ac1e..8726cb140 100644 --- a/packages/backend/src/queue/processors/ExportFollowingProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportFollowingProcessorService.ts @@ -10,10 +10,10 @@ import { DriveService } from '@/core/DriveService.js'; import { createTemp } from '@/misc/create-temp.js'; import type { Following } from '@/models/entities/Following.js'; import { UtilityService } from '@/core/UtilityService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbExportFollowingData } from '../types.js'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbExportFollowingData } from '../types.js'; @Injectable() export class ExportFollowingProcessorService { @@ -40,12 +40,11 @@ export class ExportFollowingProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Exporting following of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -116,7 +115,5 @@ export class ExportFollowingProcessorService { } finally { cleanup(); } - - done(); } } diff --git a/packages/backend/src/queue/processors/ExportMutingProcessorService.ts b/packages/backend/src/queue/processors/ExportMutingProcessorService.ts index b14bf5f5b..0f11a9e84 100644 --- a/packages/backend/src/queue/processors/ExportMutingProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportMutingProcessorService.ts @@ -9,10 +9,10 @@ import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; import { createTemp } from '@/misc/create-temp.js'; import { UtilityService } from '@/core/UtilityService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbJobDataWithUser } from '../types.js'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbJobDataWithUser } from '../types.js'; @Injectable() export class ExportMutingProcessorService { @@ -39,12 +39,11 @@ export class ExportMutingProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Exporting muting of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -73,7 +72,7 @@ export class ExportMutingProcessorService { }); if (mutes.length === 0) { - job.progress(100); + job.updateProgress(100); break; } @@ -103,7 +102,7 @@ export class ExportMutingProcessorService { muterId: user.id, }); - job.progress(exportedCount / total); + job.updateProgress(exportedCount / total); } stream.end(); @@ -116,7 +115,5 @@ export class ExportMutingProcessorService { } finally { cleanup(); } - - done(); } } diff --git a/packages/backend/src/queue/processors/ExportNotesProcessorService.ts b/packages/backend/src/queue/processors/ExportNotesProcessorService.ts index e4f12ad10..24fb33188 100644 --- a/packages/backend/src/queue/processors/ExportNotesProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportNotesProcessorService.ts @@ -12,7 +12,7 @@ import type { Poll } from '@/models/entities/Poll.js'; import type { Note } from '@/models/entities/Note.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; import type { DbJobDataWithUser } from '../types.js'; @Injectable() @@ -39,12 +39,11 @@ export class ExportNotesProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Exporting notes of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -87,7 +86,7 @@ export class ExportNotesProcessorService { }) as Note[]; if (notes.length === 0) { - job.progress(100); + job.updateProgress(100); break; } @@ -108,7 +107,7 @@ export class ExportNotesProcessorService { userId: user.id, }); - job.progress(exportedNotesCount / total); + job.updateProgress(exportedNotesCount / total); } await write(']'); @@ -123,8 +122,6 @@ export class ExportNotesProcessorService { } finally { cleanup(); } - - done(); } } diff --git a/packages/backend/src/queue/processors/ExportUserListsProcessorService.ts b/packages/backend/src/queue/processors/ExportUserListsProcessorService.ts index 54bde4404..ec6335805 100644 --- a/packages/backend/src/queue/processors/ExportUserListsProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportUserListsProcessorService.ts @@ -9,10 +9,10 @@ import type Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; import { createTemp } from '@/misc/create-temp.js'; import { UtilityService } from '@/core/UtilityService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbJobDataWithUser } from '../types.js'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbJobDataWithUser } from '../types.js'; @Injectable() export class ExportUserListsProcessorService { @@ -39,12 +39,11 @@ export class ExportUserListsProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Exporting user lists of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -92,7 +91,5 @@ export class ExportUserListsProcessorService { } finally { cleanup(); } - - done(); } } diff --git a/packages/backend/src/queue/processors/ImportAntennasProcessorService.ts b/packages/backend/src/queue/processors/ImportAntennasProcessorService.ts index d06131b8c..575cad69d 100644 --- a/packages/backend/src/queue/processors/ImportAntennasProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportAntennasProcessorService.ts @@ -8,7 +8,7 @@ import { DI } from '@/di-symbols.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; import { DBAntennaImportJobData } from '../types.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; const validate = new Ajv().compile({ type: 'object', @@ -59,7 +59,7 @@ export class ImportAntennasProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { const now = new Date(); try { for (const antenna of job.data.antenna) { @@ -89,8 +89,6 @@ export class ImportAntennasProcessorService { } } catch (err: any) { this.logger.error(err); - } finally { - done(); } } } diff --git a/packages/backend/src/queue/processors/ImportBlockingProcessorService.ts b/packages/backend/src/queue/processors/ImportBlockingProcessorService.ts index 3f075b02d..2f1a9e5b0 100644 --- a/packages/backend/src/queue/processors/ImportBlockingProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportBlockingProcessorService.ts @@ -7,11 +7,11 @@ import * as Acct from '@/misc/acct.js'; import { RemoteUserResolveService } from '@/core/RemoteUserResolveService.js'; import { DownloadService } from '@/core/DownloadService.js'; import { UtilityService } from '@/core/UtilityService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbUserImportJobData, DbUserImportToDbJobData } from '../types.js'; import { bindThis } from '@/decorators.js'; import { QueueService } from '@/core/QueueService.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbUserImportJobData, DbUserImportToDbJobData } from '../types.js'; @Injectable() export class ImportBlockingProcessorService { @@ -34,12 +34,11 @@ export class ImportBlockingProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Importing blocking of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -47,7 +46,6 @@ export class ImportBlockingProcessorService { id: job.data.fileId, }); if (file == null) { - done(); return; } @@ -56,7 +54,6 @@ export class ImportBlockingProcessorService { this.queueService.createImportBlockingToDbJob({ id: user.id }, targets); this.logger.succ('Import jobs created'); - done(); } @bindThis @@ -85,7 +82,7 @@ export class ImportBlockingProcessorService { } if (target == null) { - throw `Unable to resolve user: @${username}@${host}`; + throw new Error(`Unable to resolve user: @${username}@${host}`); } // skip myself diff --git a/packages/backend/src/queue/processors/ImportCustomEmojisProcessorService.ts b/packages/backend/src/queue/processors/ImportCustomEmojisProcessorService.ts index 600468a28..d86256787 100644 --- a/packages/backend/src/queue/processors/ImportCustomEmojisProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportCustomEmojisProcessorService.ts @@ -12,7 +12,7 @@ import { DriveService } from '@/core/DriveService.js'; import { DownloadService } from '@/core/DownloadService.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; import type { DbUserImportJobData } from '../types.js'; // TODO: 名前衝突時の動作を選べるようにする @@ -45,14 +45,13 @@ export class ImportCustomEmojisProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info('Importing custom emojis ...'); const file = await this.driveFilesRepository.findOneBy({ id: job.data.fileId, }); if (file == null) { - done(); return; } @@ -116,7 +115,6 @@ export class ImportCustomEmojisProcessorService { cleanup(); this.logger.succ('Imported'); - done(); }); unzipStream.pipe(extractor); this.logger.succ(`Unzipping to ${outputPath}`); diff --git a/packages/backend/src/queue/processors/ImportFollowingProcessorService.ts b/packages/backend/src/queue/processors/ImportFollowingProcessorService.ts index aa5cf12c5..15bee9672 100644 --- a/packages/backend/src/queue/processors/ImportFollowingProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportFollowingProcessorService.ts @@ -7,11 +7,11 @@ import * as Acct from '@/misc/acct.js'; import { RemoteUserResolveService } from '@/core/RemoteUserResolveService.js'; import { DownloadService } from '@/core/DownloadService.js'; import { UtilityService } from '@/core/UtilityService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbUserImportJobData, DbUserImportToDbJobData } from '../types.js'; import { bindThis } from '@/decorators.js'; import { QueueService } from '@/core/QueueService.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbUserImportJobData, DbUserImportToDbJobData } from '../types.js'; @Injectable() export class ImportFollowingProcessorService { @@ -34,12 +34,11 @@ export class ImportFollowingProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Importing following of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -47,7 +46,6 @@ export class ImportFollowingProcessorService { id: job.data.fileId, }); if (file == null) { - done(); return; } @@ -56,7 +54,6 @@ export class ImportFollowingProcessorService { this.queueService.createImportFollowingToDbJob({ id: user.id }, targets); this.logger.succ('Import jobs created'); - done(); } @bindThis @@ -85,7 +82,7 @@ export class ImportFollowingProcessorService { } if (target == null) { - throw `Unable to resolve user: @${username}@${host}`; + throw new Error(`Unable to resolve user: @${username}@${host}`); } // skip myself diff --git a/packages/backend/src/queue/processors/ImportMutingProcessorService.ts b/packages/backend/src/queue/processors/ImportMutingProcessorService.ts index 379994ee7..723935cd3 100644 --- a/packages/backend/src/queue/processors/ImportMutingProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportMutingProcessorService.ts @@ -9,10 +9,10 @@ import { RemoteUserResolveService } from '@/core/RemoteUserResolveService.js'; import { DownloadService } from '@/core/DownloadService.js'; import { UserMutingService } from '@/core/UserMutingService.js'; import { UtilityService } from '@/core/UtilityService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; -import type { DbUserImportJobData } from '../types.js'; import { bindThis } from '@/decorators.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbUserImportJobData } from '../types.js'; @Injectable() export class ImportMutingProcessorService { @@ -38,12 +38,11 @@ export class ImportMutingProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Importing muting of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -51,7 +50,6 @@ export class ImportMutingProcessorService { id: job.data.fileId, }); if (file == null) { - done(); return; } @@ -83,7 +81,7 @@ export class ImportMutingProcessorService { } if (target == null) { - throw `cannot resolve user: @${username}@${host}`; + throw new Error(`cannot resolve user: @${username}@${host}`); } // skip myself @@ -98,6 +96,5 @@ export class ImportMutingProcessorService { } this.logger.succ('Imported'); - done(); } } diff --git a/packages/backend/src/queue/processors/ImportUserListsProcessorService.ts b/packages/backend/src/queue/processors/ImportUserListsProcessorService.ts index c42386341..824ee8157 100644 --- a/packages/backend/src/queue/processors/ImportUserListsProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportUserListsProcessorService.ts @@ -12,7 +12,7 @@ import { IdService } from '@/core/IdService.js'; import { UtilityService } from '@/core/UtilityService.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; import type { DbUserImportJobData } from '../types.js'; @Injectable() @@ -46,12 +46,11 @@ export class ImportUserListsProcessorService { } @bindThis - public async process(job: Bull.Job, done: () => void): Promise { + public async process(job: Bull.Job): Promise { this.logger.info(`Importing user lists of ${job.data.user.id} ...`); const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); if (user == null) { - done(); return; } @@ -59,7 +58,6 @@ export class ImportUserListsProcessorService { id: job.data.fileId, }); if (file == null) { - done(); return; } @@ -109,6 +107,5 @@ export class ImportUserListsProcessorService { } this.logger.succ('Imported'); - done(); } } diff --git a/packages/backend/src/queue/processors/InboxProcessorService.ts b/packages/backend/src/queue/processors/InboxProcessorService.ts index ab8b1e9e2..ce1d7aaa1 100644 --- a/packages/backend/src/queue/processors/InboxProcessorService.ts +++ b/packages/backend/src/queue/processors/InboxProcessorService.ts @@ -1,8 +1,8 @@ import { URL } from 'node:url'; import { Inject, Injectable } from '@nestjs/common'; import httpSignature from '@peertube/http-signature'; +import * as Bull from 'bullmq'; import { DI } from '@/di-symbols.js'; -import type { InstancesRepository, DriveFilesRepository } from '@/models/index.js'; import type { Config } from '@/config.js'; import type Logger from '@/logger.js'; import { MetaService } from '@/core/MetaService.js'; @@ -23,10 +23,8 @@ import { LdSignatureService } from '@/core/activitypub/LdSignatureService.js'; import { ApInboxService } from '@/core/activitypub/ApInboxService.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; import type { InboxJobData } from '../types.js'; -// ユーザーのinboxにアクティビティが届いた時の処理 @Injectable() export class InboxProcessorService { private logger: Logger; @@ -35,12 +33,6 @@ export class InboxProcessorService { @Inject(DI.config) private config: Config, - @Inject(DI.instancesRepository) - private instancesRepository: InstancesRepository, - - @Inject(DI.driveFilesRepository) - private driveFilesRepository: DriveFilesRepository, - private utilityService: UtilityService, private metaService: MetaService, private apInboxService: ApInboxService, @@ -93,24 +85,24 @@ export class InboxProcessorService { try { authUser = await this.apDbResolverService.getAuthUserFromApId(getApId(activity.actor)); } catch (err) { - // 対象が4xxならスキップ + // 対象が4xxならスキップ if (err instanceof StatusError) { if (err.isClientError) { - return `skip: Ignored deleted actors on both ends ${activity.actor} - ${err.statusCode}`; + throw new Bull.UnrecoverableError(`skip: Ignored deleted actors on both ends ${activity.actor} - ${err.statusCode}`); } - throw `Error in actor ${activity.actor} - ${err.statusCode ?? err}`; + throw new Error(`Error in actor ${activity.actor} - ${err.statusCode ?? err}`); } } } // それでもわからなければ終了 if (authUser == null) { - return 'skip: failed to resolve user'; + throw new Bull.UnrecoverableError('skip: failed to resolve user'); } // publicKey がなくても終了 if (authUser.key == null) { - return 'skip: failed to resolve user publicKey'; + throw new Bull.UnrecoverableError('skip: failed to resolve user publicKey'); } // HTTP-Signatureの検証 @@ -118,10 +110,10 @@ export class InboxProcessorService { // また、signatureのsignerは、activity.actorと一致する必要がある if (!httpSignatureValidated || authUser.user.uri !== activity.actor) { - // 一致しなくても、でもLD-Signatureがありそうならそっちも見る + // 一致しなくても、でもLD-Signatureがありそうならそっちも見る if (activity.signature) { if (activity.signature.type !== 'RsaSignature2017') { - return `skip: unsupported LD-signature type ${activity.signature.type}`; + throw new Bull.UnrecoverableError(`skip: unsupported LD-signature type ${activity.signature.type}`); } // activity.signature.creator: https://example.oom/users/user#main-key @@ -134,32 +126,32 @@ export class InboxProcessorService { // keyIdからLD-Signatureのユーザーを取得 authUser = await this.apDbResolverService.getAuthUserFromKeyId(activity.signature.creator); if (authUser == null) { - return 'skip: LD-Signatureのユーザーが取得できませんでした'; + throw new Bull.UnrecoverableError('skip: LD-Signatureのユーザーが取得できませんでした'); } if (authUser.key == null) { - return 'skip: LD-SignatureのユーザーはpublicKeyを持っていませんでした'; + throw new Bull.UnrecoverableError('skip: LD-SignatureのユーザーはpublicKeyを持っていませんでした'); } // LD-Signature検証 const ldSignature = this.ldSignatureService.use(); const verified = await ldSignature.verifyRsaSignature2017(activity, authUser.key.keyPem).catch(() => false); if (!verified) { - return 'skip: LD-Signatureの検証に失敗しました'; + throw new Bull.UnrecoverableError('skip: LD-Signatureの検証に失敗しました'); } // もう一度actorチェック if (authUser.user.uri !== activity.actor) { - return `skip: LD-Signature user(${authUser.user.uri}) !== activity.actor(${activity.actor})`; + throw new Bull.UnrecoverableError(`skip: LD-Signature user(${authUser.user.uri}) !== activity.actor(${activity.actor})`); } // ブロックしてたら中断 const ldHost = this.utilityService.extractDbHost(authUser.user.uri); if (this.utilityService.isBlockedHost(meta.blockedHosts, ldHost)) { - return `Blocked request: ${ldHost}`; + throw new Bull.UnrecoverableError(`Blocked request: ${ldHost}`); } } else { - return `skip: http-signature verification failed and no LD-Signature. keyId=${signature.keyId}`; + throw new Bull.UnrecoverableError(`skip: http-signature verification failed and no LD-Signature. keyId=${signature.keyId}`); } } @@ -168,7 +160,7 @@ export class InboxProcessorService { const signerHost = this.utilityService.extractDbHost(authUser.user.uri!); const activityIdHost = this.utilityService.extractDbHost(activity.id); if (signerHost !== activityIdHost) { - return `skip: signerHost(${signerHost}) !== activity.id host(${activityIdHost}`; + throw new Bull.UnrecoverableError(`skip: signerHost(${signerHost}) !== activity.id host(${activityIdHost}`); } } diff --git a/packages/backend/src/queue/processors/RelationshipProcessorService.ts b/packages/backend/src/queue/processors/RelationshipProcessorService.ts index ff454df45..722260d94 100644 --- a/packages/backend/src/queue/processors/RelationshipProcessorService.ts +++ b/packages/backend/src/queue/processors/RelationshipProcessorService.ts @@ -1,5 +1,5 @@ import { Inject, Injectable } from '@nestjs/common'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; import { UserFollowingService } from '@/core/UserFollowingService.js'; import { UserBlockingService } from '@/core/UserBlockingService.js'; diff --git a/packages/backend/src/queue/processors/ResyncChartsProcessorService.ts b/packages/backend/src/queue/processors/ResyncChartsProcessorService.ts index e5840f3da..eab8e1e68 100644 --- a/packages/backend/src/queue/processors/ResyncChartsProcessorService.ts +++ b/packages/backend/src/queue/processors/ResyncChartsProcessorService.ts @@ -15,7 +15,7 @@ import PerUserDriveChart from '@/core/chart/charts/per-user-drive.js'; import ApRequestChart from '@/core/chart/charts/ap-request.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; @Injectable() export class ResyncChartsProcessorService { @@ -43,7 +43,7 @@ export class ResyncChartsProcessorService { } @bindThis - public async process(job: Bull.Job>, done: () => void): Promise { + public async process(): Promise { this.logger.info('Resync charts...'); // TODO: ユーザーごとのチャートも更新する @@ -55,6 +55,5 @@ export class ResyncChartsProcessorService { ]); this.logger.succ('All charts successfully resynced.'); - done(); } } diff --git a/packages/backend/src/queue/processors/TickChartsProcessorService.ts b/packages/backend/src/queue/processors/TickChartsProcessorService.ts index 7ff84c15a..f1696bf56 100644 --- a/packages/backend/src/queue/processors/TickChartsProcessorService.ts +++ b/packages/backend/src/queue/processors/TickChartsProcessorService.ts @@ -16,7 +16,7 @@ import PerUserDriveChart from '@/core/chart/charts/per-user-drive.js'; import ApRequestChart from '@/core/chart/charts/ap-request.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; +import type * as Bull from 'bullmq'; @Injectable() export class TickChartsProcessorService { @@ -45,7 +45,7 @@ export class TickChartsProcessorService { } @bindThis - public async process(job: Bull.Job>, done: () => void): Promise { + public async process(): Promise { this.logger.info('Tick charts...'); await Promise.all([ @@ -64,6 +64,5 @@ export class TickChartsProcessorService { ]); this.logger.succ('All charts successfully ticked.'); - done(); } } diff --git a/packages/backend/src/queue/processors/WebhookDeliverProcessorService.ts b/packages/backend/src/queue/processors/WebhookDeliverProcessorService.ts index 84a5c21c4..8b40c1674 100644 --- a/packages/backend/src/queue/processors/WebhookDeliverProcessorService.ts +++ b/packages/backend/src/queue/processors/WebhookDeliverProcessorService.ts @@ -1,4 +1,5 @@ import { Inject, Injectable } from '@nestjs/common'; +import * as Bull from 'bullmq'; import { DI } from '@/di-symbols.js'; import type { WebhooksRepository } from '@/models/index.js'; import type { Config } from '@/config.js'; @@ -7,7 +8,6 @@ import { HttpRequestService } from '@/core/HttpRequestService.js'; import { StatusError } from '@/misc/status-error.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; -import type Bull from 'bull'; import type { WebhookDeliverJobData } from '../types.js'; @Injectable() @@ -66,11 +66,11 @@ export class WebhookDeliverProcessorService { if (res instanceof StatusError) { // 4xx if (res.isClientError) { - return `${res.statusCode} ${res.statusMessage}`; + throw new Bull.UnrecoverableError(`${res.statusCode} ${res.statusMessage}`); } // 5xx etc. - throw `${res.statusCode} ${res.statusMessage}`; + throw new Error(`${res.statusCode} ${res.statusMessage}`); } else { // DNS error, socket error, timeout ... throw res; diff --git a/packages/backend/src/server/api/endpoints/admin/relays/add.ts b/packages/backend/src/server/api/endpoints/admin/relays/add.ts index f12738bd3..f2d4aa899 100644 --- a/packages/backend/src/server/api/endpoints/admin/relays/add.ts +++ b/packages/backend/src/server/api/endpoints/admin/relays/add.ts @@ -62,7 +62,7 @@ export default class extends Endpoint { ) { super(meta, paramDef, async (ps, me) => { try { - if (new URL(ps.inbox).protocol !== 'https:') throw 'https only'; + if (new URL(ps.inbox).protocol !== 'https:') throw new Error('https only'); } catch { throw new ApiError(meta.errors.invalidUrl); } diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts index 2956bf1cb..742df0ca9 100644 --- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts +++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts @@ -82,14 +82,14 @@ export default class extends Endpoint { try { if (ps.tag) { - if (!safeForSql(normalizeForSearch(ps.tag))) throw 'Injection'; + if (!safeForSql(normalizeForSearch(ps.tag))) throw new Error('Injection'); query.andWhere(`'{"${normalizeForSearch(ps.tag)}"}' <@ note.tags`); } else { query.andWhere(new Brackets(qb => { for (const tags of ps.query!) { qb.orWhere(new Brackets(qb => { for (const tag of tags) { - if (!safeForSql(normalizeForSearch(tag))) throw 'Injection'; + if (!safeForSql(normalizeForSearch(tag))) throw new Error('Injection'); qb.andWhere(`'{"${normalizeForSearch(tag)}"}' <@ note.tags`); } })); diff --git a/packages/backend/src/server/api/endpoints/reset-db.ts b/packages/backend/src/server/api/endpoints/reset-db.ts index 4ced6d3ff..1d4825f81 100644 --- a/packages/backend/src/server/api/endpoints/reset-db.ts +++ b/packages/backend/src/server/api/endpoints/reset-db.ts @@ -34,7 +34,7 @@ export default class extends Endpoint { private redisClient: Redis.Redis, ) { super(meta, paramDef, async (ps, me) => { - if (process.env.NODE_ENV !== 'test') throw 'NODE_ENV is not a test'; + if (process.env.NODE_ENV !== 'test') throw new Error('NODE_ENV is not a test'); await redisClient.flushdb(); await resetDb(this.db); diff --git a/packages/backend/test/misc/mock-resolver.ts b/packages/backend/test/misc/mock-resolver.ts index 6b31e6861..a7bcd859a 100644 --- a/packages/backend/test/misc/mock-resolver.ts +++ b/packages/backend/test/misc/mock-resolver.ts @@ -52,11 +52,7 @@ export class MockResolver extends Resolver { const r = this._rs.get(value); if (!r) { - throw { - name: 'StatusError', - statusCode: 404, - message: 'Not registed for mock', - }; + throw new Error('Not registed for mock'); } const object = JSON.parse(r.content); diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts index 1a4a0b354..22f7d81e4 100644 --- a/packages/backend/test/utils.ts +++ b/packages/backend/test/utils.ts @@ -478,7 +478,7 @@ export async function testPaginationConsistency=12'} + /bullmq@3.14.1: + resolution: {integrity: sha512-Fom78UKljYsnJmwbROVPx3eFLuVfQjQbw9KCnVupLzT31RQHhFHV2xd/4J4oWl4u34bZ1JmEUfNnqNBz+IOJuA==} dependencies: - cron-parser: 4.7.1 - debuglog: 1.0.1 - get-port: 5.1.1 + cron-parser: 4.8.1 + glob: 8.1.0 ioredis: 5.3.2 lodash: 4.17.21 - msgpackr: 1.8.1 + msgpackr: 1.9.2 semver: 7.5.1 - uuid: 8.3.2 + tslib: 2.5.2 + uuid: 9.0.0 transitivePeerDependencies: - supports-color + dev: false /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -9306,6 +9302,7 @@ packages: /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} + dev: false /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} @@ -9607,11 +9604,12 @@ packages: readable-stream: 3.6.0 dev: false - /cron-parser@4.7.1: - resolution: {integrity: sha512-WguFaoQ0hQ61SgsCZLHUcNbAvlK0lypKXu62ARguefYmjzaOXIVRNrAmyXzabTwUn4sQvQLkk6bjH+ipGfw8bA==} + /cron-parser@4.8.1: + resolution: {integrity: sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==} engines: {node: '>=12.0.0'} dependencies: - luxon: 3.2.1 + luxon: 3.3.0 + dev: false /cropperjs@2.0.0-beta.2: resolution: {integrity: sha512-jDRSODDGKmi9vp3p/+WXkxMqV/AE+GpSld1U3cHZDRdLy9UykRzurSe8k1dR0TExn45ygCMrv31qkg+K3EeXXw==} @@ -9890,9 +9888,6 @@ packages: ms: 2.1.2 supports-color: 8.1.1 - /debuglog@1.0.1: - resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} - /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -10084,6 +10079,7 @@ packages: /denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} + dev: false /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} @@ -11753,6 +11749,7 @@ packages: /get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + dev: true /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} @@ -12606,6 +12603,7 @@ packages: standard-as-callback: 2.1.0 transitivePeerDependencies: - supports-color + dev: false /iota-array@1.0.0: resolution: {integrity: sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==} @@ -14288,6 +14286,7 @@ packages: /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false /lodash.difference@4.5.0: resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} @@ -14319,6 +14318,7 @@ packages: /lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false /lodash.isempty@4.4.0: resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} @@ -14472,9 +14472,10 @@ packages: engines: {node: '>=16.14'} dev: true - /luxon@3.2.1: - resolution: {integrity: sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==} + /luxon@3.3.0: + resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} engines: {node: '>=12'} + dev: false /lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} @@ -14950,24 +14951,27 @@ packages: engines: {node: '>=12.13'} dev: false - /msgpackr-extract@2.2.0: - resolution: {integrity: sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog==} + /msgpackr-extract@3.0.2: + resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} + hasBin: true requiresBuild: true dependencies: - node-gyp-build-optional-packages: 5.0.3 + node-gyp-build-optional-packages: 5.0.7 optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 2.2.0 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 2.2.0 - '@msgpackr-extract/msgpackr-extract-linux-arm': 2.2.0 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 2.2.0 - '@msgpackr-extract/msgpackr-extract-linux-x64': 2.2.0 - '@msgpackr-extract/msgpackr-extract-win32-x64': 2.2.0 + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 + dev: false optional: true - /msgpackr@1.8.1: - resolution: {integrity: sha512-05fT4J8ZqjYlR4QcRDIhLCYKUOHXk7C/xa62GzMKj74l3up9k2QZ3LgFc6qWdsPHl91QA2WLWqWc8b8t7GLNNw==} + /msgpackr@1.9.2: + resolution: {integrity: sha512-xtDgI3Xv0AAiZWLRGDchyzBwU6aq0rwJ+W+5Y4CZhEWtkl/hJtFFLc+3JtGTw7nz1yquxs7nL8q/yA2aqpflIQ==} optionalDependencies: - msgpackr-extract: 2.2.0 + msgpackr-extract: 3.0.2 + dev: false /msw-storybook-addon@1.8.0(msw@1.2.1): resolution: {integrity: sha512-dw3vZwqjixmiur0vouRSOax7wPSu9Og2Hspy9JZFHf49bZRjwDiLF0Pfn2NXEkGviYJOJiGxS1ejoTiUwoSg4A==} @@ -15219,8 +15223,10 @@ packages: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - /node-gyp-build-optional-packages@5.0.3: - resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} + /node-gyp-build-optional-packages@5.0.7: + resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} + hasBin: true + dev: false optional: true /node-gyp-build@4.6.0: @@ -17252,6 +17258,7 @@ packages: /redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} + dev: false /redis-info@3.1.0: resolution: {integrity: sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==} @@ -17269,6 +17276,7 @@ packages: engines: {node: '>=4'} dependencies: redis-errors: 1.2.0 + dev: false /redis@4.5.1: resolution: {integrity: sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==} @@ -18395,6 +18403,7 @@ packages: /standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false /start-server-and-test@2.0.0: resolution: {integrity: sha512-UqKLw0mJbfrsG1jcRLTUlvuRi9sjNuUiDOLI42r7R5fA9dsFoywAy9DoLXNYys9B886E4RCKb+qM1Gzu96h7DQ==} From b6f21b6edb95882d1616c36ed7eeb1f78809e2f6 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 29 May 2023 13:21:26 +0900 Subject: [PATCH 029/133] refactor --- packages/backend/src/GlobalModule.ts | 6 +++++- packages/backend/src/core/AntennaService.ts | 15 ++++++++++----- packages/backend/src/core/CacheService.ts | 7 ++++++- packages/backend/src/core/MetaService.ts | 7 ++++++- packages/backend/src/core/NoteCreateService.ts | 8 +++++++- packages/backend/src/core/NoteReadService.ts | 8 +++++++- packages/backend/src/core/NotificationService.ts | 8 +++++++- packages/backend/src/core/QueueModule.ts | 6 +++++- packages/backend/src/core/RoleService.ts | 7 ++++++- packages/backend/src/core/WebhookService.ts | 7 ++++++- .../src/core/chart/ChartManagementService.ts | 8 +++++++- packages/backend/src/daemons/JanitorService.ts | 7 ++++++- packages/backend/src/daemons/QueueStatsService.ts | 9 +++++++-- .../backend/src/daemons/ServerStatsService.ts | 7 ++++++- packages/backend/src/server/ServerService.ts | 8 +++++++- packages/backend/src/server/api/ApiCallService.ts | 7 ++++++- 16 files changed, 104 insertions(+), 21 deletions(-) diff --git a/packages/backend/src/GlobalModule.ts b/packages/backend/src/GlobalModule.ts index 564787392..406e3192b 100644 --- a/packages/backend/src/GlobalModule.ts +++ b/packages/backend/src/GlobalModule.ts @@ -100,7 +100,7 @@ export class GlobalModule implements OnApplicationShutdown { @Inject(DI.redisForSub) private redisForSub: Redis.Redis, ) {} - async onApplicationShutdown(signal: string): Promise { + public async dispose(): Promise { if (process.env.NODE_ENV === 'test') { // XXX: // Shutting down the existing connections causes errors on Jest as @@ -116,4 +116,8 @@ export class GlobalModule implements OnApplicationShutdown { this.redisForSub.disconnect(), ]); } + + async onApplicationShutdown(signal: string): Promise { + await this.dispose(); + } } diff --git a/packages/backend/src/core/AntennaService.ts b/packages/backend/src/core/AntennaService.ts index 2d4226a32..d8df37191 100644 --- a/packages/backend/src/core/AntennaService.ts +++ b/packages/backend/src/core/AntennaService.ts @@ -55,11 +55,6 @@ export class AntennaService implements OnApplicationShutdown { this.redisForSub.on('message', this.onRedisMessage); } - @bindThis - public onApplicationShutdown(signal?: string | undefined) { - this.redisForSub.off('message', this.onRedisMessage); - } - @bindThis private async onRedisMessage(_: string, data: string): Promise { const obj = JSON.parse(data); @@ -196,4 +191,14 @@ export class AntennaService implements OnApplicationShutdown { return this.antennas; } + + @bindThis + public dispose(): void { + this.redisForSub.off('message', this.onRedisMessage); + } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/core/CacheService.ts b/packages/backend/src/core/CacheService.ts index cf1e81ffc..de33e4c24 100644 --- a/packages/backend/src/core/CacheService.ts +++ b/packages/backend/src/core/CacheService.ts @@ -166,7 +166,12 @@ export class CacheService implements OnApplicationShutdown { } @bindThis - public onApplicationShutdown(signal?: string | undefined) { + public dispose(): void { this.redisForSub.off('message', this.onMessage); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/core/MetaService.ts b/packages/backend/src/core/MetaService.ts index 0b861be8d..5acc9ad9a 100644 --- a/packages/backend/src/core/MetaService.ts +++ b/packages/backend/src/core/MetaService.ts @@ -120,8 +120,13 @@ export class MetaService implements OnApplicationShutdown { } @bindThis - public onApplicationShutdown(signal?: string | undefined) { + public dispose(): void { clearInterval(this.intervalId); this.redisForSub.off('message', this.onMessage); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 2fd7a8ac8..1c8491bf5 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -790,7 +790,13 @@ export class NoteCreateService implements OnApplicationShutdown { return mentionedUsers; } - onApplicationShutdown(signal?: string | undefined) { + @bindThis + public dispose(): void { this.#shutdownController.abort(); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/core/NoteReadService.ts b/packages/backend/src/core/NoteReadService.ts index 1129bd159..e57e57d31 100644 --- a/packages/backend/src/core/NoteReadService.ts +++ b/packages/backend/src/core/NoteReadService.ts @@ -122,7 +122,13 @@ export class NoteReadService implements OnApplicationShutdown { } } - onApplicationShutdown(signal?: string | undefined): void { + @bindThis + public dispose(): void { this.#shutdownController.abort(); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/core/NotificationService.ts b/packages/backend/src/core/NotificationService.ts index a245908c9..ed47165f7 100644 --- a/packages/backend/src/core/NotificationService.ts +++ b/packages/backend/src/core/NotificationService.ts @@ -152,7 +152,13 @@ export class NotificationService implements OnApplicationShutdown { */ } - onApplicationShutdown(signal?: string | undefined): void { + @bindThis + public dispose(): void { this.#shutdownController.abort(); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/core/QueueModule.ts b/packages/backend/src/core/QueueModule.ts index 6db9bb14c..3384ca457 100644 --- a/packages/backend/src/core/QueueModule.ts +++ b/packages/backend/src/core/QueueModule.ts @@ -100,7 +100,7 @@ export class QueueModule implements OnApplicationShutdown { @Inject('queue:webhookDeliver') public webhookDeliverQueue: WebhookDeliverQueue, ) {} - async onApplicationShutdown(signal: string): Promise { + public async dispose(): Promise { if (process.env.NODE_ENV === 'test') { // XXX: // Shutting down the existing connections causes errors on Jest as @@ -120,4 +120,8 @@ export class QueueModule implements OnApplicationShutdown { this.webhookDeliverQueue.close(), ]); } + + async onApplicationShutdown(signal: string): Promise { + await this.dispose(); + } } diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index 130ec5ec8..40ae10666 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -433,7 +433,12 @@ export class RoleService implements OnApplicationShutdown { } @bindThis - public onApplicationShutdown(signal?: string | undefined) { + public dispose(): void { this.redisForSub.off('message', this.onMessage); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/core/WebhookService.ts b/packages/backend/src/core/WebhookService.ts index 57baade77..467755a07 100644 --- a/packages/backend/src/core/WebhookService.ts +++ b/packages/backend/src/core/WebhookService.ts @@ -81,7 +81,12 @@ export class WebhookService implements OnApplicationShutdown { } @bindThis - public onApplicationShutdown(signal?: string | undefined) { + public dispose(): void { this.redisForSub.off('message', this.onMessage); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/core/chart/ChartManagementService.ts b/packages/backend/src/core/chart/ChartManagementService.ts index 03e361265..b0e9e534d 100644 --- a/packages/backend/src/core/chart/ChartManagementService.ts +++ b/packages/backend/src/core/chart/ChartManagementService.ts @@ -60,7 +60,8 @@ export class ChartManagementService implements OnApplicationShutdown { }, 1000 * 60 * 20); } - async onApplicationShutdown(signal: string): Promise { + @bindThis + public async dispose(): Promise { clearInterval(this.saveIntervalId); if (process.env.NODE_ENV !== 'test') { await Promise.all( @@ -68,4 +69,9 @@ export class ChartManagementService implements OnApplicationShutdown { ); } } + + @bindThis + async onApplicationShutdown(signal: string): Promise { + await this.dispose(); + } } diff --git a/packages/backend/src/daemons/JanitorService.ts b/packages/backend/src/daemons/JanitorService.ts index 8cdfb703f..f826d5062 100644 --- a/packages/backend/src/daemons/JanitorService.ts +++ b/packages/backend/src/daemons/JanitorService.ts @@ -34,7 +34,12 @@ export class JanitorService implements OnApplicationShutdown { } @bindThis - public onApplicationShutdown(signal?: string | undefined) { + public dispose(): void { clearInterval(this.intervalId); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/daemons/QueueStatsService.ts b/packages/backend/src/daemons/QueueStatsService.ts index 0a5b3184d..53a0d14cd 100644 --- a/packages/backend/src/daemons/QueueStatsService.ts +++ b/packages/backend/src/daemons/QueueStatsService.ts @@ -81,9 +81,14 @@ export class QueueStatsService implements OnApplicationShutdown { this.intervalId = setInterval(tick, interval); } - + @bindThis - public onApplicationShutdown(signal?: string | undefined) { + public dispose(): void { clearInterval(this.intervalId); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } diff --git a/packages/backend/src/daemons/ServerStatsService.ts b/packages/backend/src/daemons/ServerStatsService.ts index bb190cf60..6cd71c0e2 100644 --- a/packages/backend/src/daemons/ServerStatsService.ts +++ b/packages/backend/src/daemons/ServerStatsService.ts @@ -63,9 +63,14 @@ export class ServerStatsService implements OnApplicationShutdown { } @bindThis - public onApplicationShutdown(signal?: string | undefined) { + public dispose(): void { clearInterval(this.intervalId); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } // CPU STAT diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts index 9257fee13..ce6a1f704 100644 --- a/packages/backend/src/server/ServerService.ts +++ b/packages/backend/src/server/ServerService.ts @@ -222,7 +222,13 @@ export class ServerService implements OnApplicationShutdown { await fastify.ready(); } - async onApplicationShutdown(signal: string): Promise { + @bindThis + public async dispose(): Promise { await this.#fastify.close(); } + + @bindThis + async onApplicationShutdown(signal: string): Promise { + await this.dispose(); + } } diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts index e3483c82c..dad1a4132 100644 --- a/packages/backend/src/server/api/ApiCallService.ts +++ b/packages/backend/src/server/api/ApiCallService.ts @@ -359,7 +359,12 @@ export class ApiCallService implements OnApplicationShutdown { } @bindThis - public onApplicationShutdown(signal?: string | undefined) { + public dispose(): void { clearInterval(this.userIpHistoriesClearIntervalId); } + + @bindThis + public onApplicationShutdown(signal?: string | undefined): void { + this.dispose(); + } } From 4790ddfad68ab4889db11c3f9c7f0159a69d4829 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 29 May 2023 13:30:26 +0900 Subject: [PATCH 030/133] refactor of QueueProcessorService --- .../src/queue/QueueProcessorService.ts | 84 ++++++++++++++----- 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index 011082cd3..da5069c29 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common'; +import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common'; import * as Bull from 'bullmq'; import type { Config } from '@/config.js'; import { DI } from '@/di-symbols.js'; @@ -63,8 +63,16 @@ function getJobInfo(job: Bull.Job | undefined, increment = false): string { } @Injectable() -export class QueueProcessorService { +export class QueueProcessorService implements OnApplicationShutdown { private logger: Logger; + private systemQueueWorker: Bull.Worker; + private dbQueueWorker: Bull.Worker; + private deliverQueueWorker: Bull.Worker; + private inboxQueueWorker: Bull.Worker; + private webhookDeliverQueueWorker: Bull.Worker; + private relationshipQueueWorker: Bull.Worker; + private objectStorageQueueWorker: Bull.Worker; + private endedPollNotificationQueueWorker: Bull.Worker; constructor( @Inject(DI.config) @@ -102,10 +110,7 @@ export class QueueProcessorService { private cleanProcessorService: CleanProcessorService, ) { this.logger = this.queueLoggerService.logger; - } - @bindThis - public start() { function renderError(e: Error): any { if (e) { // 何故かeがundefinedで来ることがある return { @@ -123,7 +128,7 @@ export class QueueProcessorService { } //#region system - const systemQueueWorker = new Bull.Worker(QUEUE.SYSTEM, (job) => { + this.systemQueueWorker = new Bull.Worker(QUEUE.SYSTEM, (job) => { switch (job.name) { case 'tickCharts': return this.tickChartsProcessorService.process(); case 'resyncCharts': return this.resyncChartsProcessorService.process(); @@ -135,11 +140,12 @@ export class QueueProcessorService { } }, { ...baseQueueOptions(this.config, QUEUE.SYSTEM), + autorun: false, }); const systemLogger = this.logger.createSubLogger('system'); - systemQueueWorker + this.systemQueueWorker .on('active', (job) => systemLogger.debug(`active id=${job.id}`)) .on('completed', (job, result) => systemLogger.debug(`completed(${result}) id=${job.id}`)) .on('failed', (job, err) => systemLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) })) @@ -148,7 +154,7 @@ export class QueueProcessorService { //#endregion //#region db - const dbQueueWorker = new Bull.Worker(QUEUE.DB, (job) => { + this.dbQueueWorker = new Bull.Worker(QUEUE.DB, (job) => { switch (job.name) { case 'deleteDriveFiles': return this.deleteDriveFilesProcessorService.process(job); case 'exportCustomEmojis': return this.exportCustomEmojisProcessorService.process(job); @@ -172,11 +178,12 @@ export class QueueProcessorService { } }, { ...baseQueueOptions(this.config, QUEUE.DB), + autorun: false, }); const dbLogger = this.logger.createSubLogger('db'); - dbQueueWorker + this.dbQueueWorker .on('active', (job) => dbLogger.debug(`active id=${job.id}`)) .on('completed', (job, result) => dbLogger.debug(`completed(${result}) id=${job.id}`)) .on('failed', (job, err) => dbLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) })) @@ -185,8 +192,9 @@ export class QueueProcessorService { //#endregion //#region deliver - const deliverQueueWorker = new Bull.Worker(QUEUE.DELIVER, (job) => this.deliverProcessorService.process(job), { + this.deliverQueueWorker = new Bull.Worker(QUEUE.DELIVER, (job) => this.deliverProcessorService.process(job), { ...baseQueueOptions(this.config, QUEUE.DELIVER), + autorun: false, concurrency: this.config.deliverJobConcurrency ?? 128, limiter: { max: this.config.deliverJobPerSec ?? 128, @@ -199,7 +207,7 @@ export class QueueProcessorService { const deliverLogger = this.logger.createSubLogger('deliver'); - deliverQueueWorker + this.deliverQueueWorker .on('active', (job) => deliverLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`)) .on('completed', (job, result) => deliverLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`)) .on('failed', (job, err) => deliverLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`)) @@ -208,8 +216,9 @@ export class QueueProcessorService { //#endregion //#region inbox - const inboxQueueWorker = new Bull.Worker(QUEUE.INBOX, (job) => this.inboxProcessorService.process(job), { + this.inboxQueueWorker = new Bull.Worker(QUEUE.INBOX, (job) => this.inboxProcessorService.process(job), { ...baseQueueOptions(this.config, QUEUE.INBOX), + autorun: false, concurrency: this.config.inboxJobConcurrency ?? 16, limiter: { max: this.config.inboxJobPerSec ?? 16, @@ -222,7 +231,7 @@ export class QueueProcessorService { const inboxLogger = this.logger.createSubLogger('inbox'); - inboxQueueWorker + this.inboxQueueWorker .on('active', (job) => inboxLogger.debug(`active ${getJobInfo(job, true)}`)) .on('completed', (job, result) => inboxLogger.debug(`completed(${result}) ${getJobInfo(job, true)}`)) .on('failed', (job, err) => inboxLogger.warn(`failed(${err}) ${getJobInfo(job)} activity=${job ? (job.data.activity ? job.data.activity.id : 'none') : '-'}`, { job, e: renderError(err) })) @@ -231,8 +240,9 @@ export class QueueProcessorService { //#endregion //#region webhook deliver - const webhookDeliverQueueWorker = new Bull.Worker(QUEUE.WEBHOOK_DELIVER, (job) => this.webhookDeliverProcessorService.process(job), { + this.webhookDeliverQueueWorker = new Bull.Worker(QUEUE.WEBHOOK_DELIVER, (job) => this.webhookDeliverProcessorService.process(job), { ...baseQueueOptions(this.config, QUEUE.WEBHOOK_DELIVER), + autorun: false, concurrency: 64, limiter: { max: 64, @@ -245,7 +255,7 @@ export class QueueProcessorService { const webhookLogger = this.logger.createSubLogger('webhook'); - webhookDeliverQueueWorker + this.webhookDeliverQueueWorker .on('active', (job) => webhookLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`)) .on('completed', (job, result) => webhookLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`)) .on('failed', (job, err) => webhookLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`)) @@ -254,7 +264,7 @@ export class QueueProcessorService { //#endregion //#region relationship - const relationshipQueueWorker = new Bull.Worker(QUEUE.RELATIONSHIP, (job) => { + this.relationshipQueueWorker = new Bull.Worker(QUEUE.RELATIONSHIP, (job) => { switch (job.name) { case 'follow': return this.relationshipProcessorService.processFollow(job); case 'unfollow': return this.relationshipProcessorService.processUnfollow(job); @@ -264,6 +274,7 @@ export class QueueProcessorService { } }, { ...baseQueueOptions(this.config, QUEUE.RELATIONSHIP), + autorun: false, concurrency: this.config.relashionshipJobConcurrency ?? 16, limiter: { max: this.config.relashionshipJobPerSec ?? 64, @@ -273,7 +284,7 @@ export class QueueProcessorService { const relationshipLogger = this.logger.createSubLogger('relationship'); - relationshipQueueWorker + this.relationshipQueueWorker .on('active', (job) => relationshipLogger.debug(`active id=${job.id}`)) .on('completed', (job, result) => relationshipLogger.debug(`completed(${result}) id=${job.id}`)) .on('failed', (job, err) => relationshipLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) })) @@ -282,7 +293,7 @@ export class QueueProcessorService { //#endregion //#region object storage - const objectStorageQueueWorker = new Bull.Worker(QUEUE.OBJECT_STORAGE, (job) => { + this.objectStorageQueueWorker = new Bull.Worker(QUEUE.OBJECT_STORAGE, (job) => { switch (job.name) { case 'deleteFile': return this.deleteFileProcessorService.process(job); case 'cleanRemoteFiles': return this.cleanRemoteFilesProcessorService.process(job); @@ -290,12 +301,13 @@ export class QueueProcessorService { } }, { ...baseQueueOptions(this.config, QUEUE.OBJECT_STORAGE), + autorun: false, concurrency: 16, }); const objectStorageLogger = this.logger.createSubLogger('objectStorage'); - objectStorageQueueWorker + this.objectStorageQueueWorker .on('active', (job) => objectStorageLogger.debug(`active id=${job.id}`)) .on('completed', (job, result) => objectStorageLogger.debug(`completed(${result}) id=${job.id}`)) .on('failed', (job, err) => objectStorageLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) })) @@ -304,9 +316,41 @@ export class QueueProcessorService { //#endregion //#region ended poll notification - const endedPollNotificationWorker = new Bull.Worker(QUEUE.ENDED_POLL_NOTIFICATION, (job) => this.endedPollNotificationProcessorService.process(job), { + this.endedPollNotificationQueueWorker = new Bull.Worker(QUEUE.ENDED_POLL_NOTIFICATION, (job) => this.endedPollNotificationProcessorService.process(job), { ...baseQueueOptions(this.config, QUEUE.ENDED_POLL_NOTIFICATION), + autorun: false, }); //#endregion } + + @bindThis + public start() { + this.systemQueueWorker.run(); + this.dbQueueWorker.run(); + this.deliverQueueWorker.run(); + this.inboxQueueWorker.run(); + this.webhookDeliverQueueWorker.run(); + this.relationshipQueueWorker.run(); + this.objectStorageQueueWorker.run(); + this.endedPollNotificationQueueWorker.run(); + } + + @bindThis + public async stop(): Promise { + await Promise.all([ + this.systemQueueWorker.close(), + this.dbQueueWorker.close(), + this.deliverQueueWorker.close(), + this.inboxQueueWorker.close(), + this.webhookDeliverQueueWorker.close(), + this.relationshipQueueWorker.close(), + this.objectStorageQueueWorker.close(), + this.endedPollNotificationQueueWorker.close(), + ]); + } + + @bindThis + public async onApplicationShutdown(signal?: string | undefined): Promise { + await this.stop(); + } } From b35b9bc27ff762938495d2ce73521fbe68643793 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 29 May 2023 13:30:57 +0900 Subject: [PATCH 031/133] Update QueueProcessorService.ts --- .../src/queue/QueueProcessorService.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index da5069c29..42f9c1af7 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -324,15 +324,17 @@ export class QueueProcessorService implements OnApplicationShutdown { } @bindThis - public start() { - this.systemQueueWorker.run(); - this.dbQueueWorker.run(); - this.deliverQueueWorker.run(); - this.inboxQueueWorker.run(); - this.webhookDeliverQueueWorker.run(); - this.relationshipQueueWorker.run(); - this.objectStorageQueueWorker.run(); - this.endedPollNotificationQueueWorker.run(); + public async start(): Promise { + await Promise.all([ + this.systemQueueWorker.run(), + this.dbQueueWorker.run(), + this.deliverQueueWorker.run(), + this.inboxQueueWorker.run(), + this.webhookDeliverQueueWorker.run(), + this.relationshipQueueWorker.run(), + this.objectStorageQueueWorker.run(), + this.endedPollNotificationQueueWorker.run(), + ]); } @bindThis From f930eaee020520c1f9496803dcf445b2f2955526 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 29 May 2023 13:32:19 +0900 Subject: [PATCH 032/133] perf(backend): use websockets/ws instead of theturtle32/WebSocket-Node (#10884) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf(backend): use websockets/ws instead of theturtle32/WebSocket-Node Resolve #10883 * refactor * Update StreamingApiServerService.ts * Update StreamingApiServerService.ts * :v: * Update StreamingApiServerService.ts * fix main stream init * fix timing 2 * setIntervalの重複を避ける(気休め) * add comment * :v: --------- Co-authored-by: tamaina --- packages/backend/package.json | 5 +- packages/backend/src/server/ServerService.ts | 3 +- .../src/server/api/AuthenticateService.ts | 2 +- .../server/api/StreamingApiServerService.ts | 121 ++++++++++-------- .../backend/src/server/api/stream/index.ts | 21 ++- pnpm-lock.yaml | 63 +++------ 6 files changed, 107 insertions(+), 108 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 99c04d6bf..66bc7ee47 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -35,6 +35,7 @@ "@swc/core-win32-x64-msvc": "1.3.56", "@tensorflow/tfjs": "4.4.0", "@tensorflow/tfjs-node": "4.4.0", + "bufferutil": "^4.0.7", "slacc-android-arm-eabi": "0.0.9", "slacc-android-arm64": "0.0.9", "slacc-darwin-arm64": "0.0.9", @@ -46,7 +47,8 @@ "slacc-linux-arm64-musl": "0.0.9", "slacc-linux-x64-gnu": "0.0.9", "slacc-win32-arm64-msvc": "0.0.9", - "slacc-win32-x64-msvc": "0.0.9" + "slacc-win32-x64-msvc": "0.0.9", + "utf-8-validate": "^6.0.3" }, "dependencies": { "@aws-sdk/client-s3": "3.321.1", @@ -157,7 +159,6 @@ "uuid": "9.0.0", "vary": "1.1.2", "web-push": "3.6.1", - "websocket": "1.0.34", "ws": "8.13.0", "xev": "3.0.2" }, diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts index ce6a1f704..c3d45e4ad 100644 --- a/packages/backend/src/server/ServerService.ts +++ b/packages/backend/src/server/ServerService.ts @@ -194,7 +194,7 @@ export class ServerService implements OnApplicationShutdown { fastify.register(this.clientServerService.createServer); - this.streamingApiServerService.attachStreamingApi(fastify.server); + this.streamingApiServerService.attach(fastify.server); fastify.server.on('error', err => { switch ((err as any).code) { @@ -224,6 +224,7 @@ export class ServerService implements OnApplicationShutdown { @bindThis public async dispose(): Promise { + await this.streamingApiServerService.detach(); await this.#fastify.close(); } diff --git a/packages/backend/src/server/api/AuthenticateService.ts b/packages/backend/src/server/api/AuthenticateService.ts index 6548c475b..e23591d87 100644 --- a/packages/backend/src/server/api/AuthenticateService.ts +++ b/packages/backend/src/server/api/AuthenticateService.ts @@ -36,7 +36,7 @@ export class AuthenticateService { } @bindThis - public async authenticate(token: string | null | undefined): Promise<[LocalUser | null | undefined, AccessToken | null | undefined]> { + public async authenticate(token: string | null | undefined): Promise<[LocalUser | null, AccessToken | null]> { if (token == null) { return [null, null]; } diff --git a/packages/backend/src/server/api/StreamingApiServerService.ts b/packages/backend/src/server/api/StreamingApiServerService.ts index 258e8de03..fdda581ad 100644 --- a/packages/backend/src/server/api/StreamingApiServerService.ts +++ b/packages/backend/src/server/api/StreamingApiServerService.ts @@ -1,23 +1,25 @@ import { EventEmitter } from 'events'; import { Inject, Injectable } from '@nestjs/common'; import * as Redis from 'ioredis'; -import * as websocket from 'websocket'; +import * as WebSocket from 'ws'; import { DI } from '@/di-symbols.js'; -import type { UsersRepository, BlockingsRepository, ChannelFollowingsRepository, FollowingsRepository, MutingsRepository, UserProfilesRepository, RenoteMutingsRepository } from '@/models/index.js'; +import type { UsersRepository, AccessToken } from '@/models/index.js'; import type { Config } from '@/config.js'; import { NoteReadService } from '@/core/NoteReadService.js'; import { GlobalEventService } from '@/core/GlobalEventService.js'; import { NotificationService } from '@/core/NotificationService.js'; import { bindThis } from '@/decorators.js'; import { CacheService } from '@/core/CacheService.js'; -import { AuthenticateService } from './AuthenticateService.js'; +import { LocalUser } from '@/models/entities/User'; +import { AuthenticateService, AuthenticationError } from './AuthenticateService.js'; import MainStreamConnection from './stream/index.js'; import { ChannelsService } from './stream/ChannelsService.js'; -import type { ParsedUrlQuery } from 'querystring'; import type * as http from 'node:http'; @Injectable() export class StreamingApiServerService { + #wss: WebSocket.WebSocketServer; + constructor( @Inject(DI.config) private config: Config, @@ -28,24 +30,6 @@ export class StreamingApiServerService { @Inject(DI.usersRepository) private usersRepository: UsersRepository, - @Inject(DI.followingsRepository) - private followingsRepository: FollowingsRepository, - - @Inject(DI.mutingsRepository) - private mutingsRepository: MutingsRepository, - - @Inject(DI.renoteMutingsRepository) - private renoteMutingsRepository: RenoteMutingsRepository, - - @Inject(DI.blockingsRepository) - private blockingsRepository: BlockingsRepository, - - @Inject(DI.channelFollowingsRepository) - private channelFollowingsRepository: ChannelFollowingsRepository, - - @Inject(DI.userProfilesRepository) - private userProfilesRepository: UserProfilesRepository, - private cacheService: CacheService, private noteReadService: NoteReadService, private authenticateService: AuthenticateService, @@ -55,25 +39,65 @@ export class StreamingApiServerService { } @bindThis - public attachStreamingApi(server: http.Server) { - // Init websocket server - const ws = new websocket.server({ - httpServer: server, + public attach(server: http.Server): void { + this.#wss = new WebSocket.WebSocketServer({ + noServer: true, }); - ws.on('request', async (request) => { - const q = request.resourceURL.query as ParsedUrlQuery; - - // TODO: トークンが間違ってるなどしてauthenticateに失敗したら - // コネクション切断するなりエラーメッセージ返すなりする - // (現状はエラーがキャッチされておらずサーバーのログに流れて邪魔なので) - const [user, miapp] = await this.authenticateService.authenticate(q.i as string); - - if (user?.isSuspended) { - request.reject(400); + server.on('upgrade', async (request, socket, head) => { + if (request.url == null) { + socket.write('HTTP/1.1 400 Bad Request\r\n\r\n'); + socket.destroy(); return; } + const q = new URL(request.url, `http://${request.headers.host}`).searchParams; + + let user: LocalUser | null = null; + let app: AccessToken | null = null; + + try { + [user, app] = await this.authenticateService.authenticate(q.get('i')); + } catch (e) { + if (e instanceof AuthenticationError) { + socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); + } else { + socket.write('HTTP/1.1 500 Internal Server Error\r\n\r\n'); + } + socket.destroy(); + return; + } + + if (user?.isSuspended) { + socket.write('HTTP/1.1 403 Forbidden\r\n\r\n'); + socket.destroy(); + return; + } + + const stream = new MainStreamConnection( + this.channelsService, + this.noteReadService, + this.notificationService, + this.cacheService, + user, app, + ); + + await stream.init(); + + this.#wss.handleUpgrade(request, socket, head, (ws) => { + this.#wss.emit('connection', ws, request, { + stream, user, app, + }); + }); + }); + + this.#wss.on('connection', async (connection: WebSocket.WebSocket, request: http.IncomingMessage, ctx: { + stream: MainStreamConnection, + user: LocalUser | null; + app: AccessToken | null + }) => { + const { stream, user, app } = ctx; + const ev = new EventEmitter(); async function onRedisMessage(_: string, data: string): Promise { @@ -83,19 +107,7 @@ export class StreamingApiServerService { this.redisForSub.on('message', onRedisMessage); - const main = new MainStreamConnection( - this.channelsService, - this.noteReadService, - this.notificationService, - this.cacheService, - ev, user, miapp, - ); - - await main.init(); - - const connection = request.accept(); - - main.init2(connection); + await stream.listen(ev, connection); const intervalId = user ? setInterval(() => { this.usersRepository.update(user.id, { @@ -110,16 +122,23 @@ export class StreamingApiServerService { connection.once('close', () => { ev.removeAllListeners(); - main.dispose(); + stream.dispose(); this.redisForSub.off('message', onRedisMessage); if (intervalId) clearInterval(intervalId); }); connection.on('message', async (data) => { - if (data.type === 'utf8' && data.utf8Data === 'ping') { + if (data.toString() === 'ping') { connection.send('pong'); } }); }); } + + @bindThis + public detach(): Promise { + return new Promise((resolve) => { + this.#wss.close(() => resolve()); + }); + } } diff --git a/packages/backend/src/server/api/stream/index.ts b/packages/backend/src/server/api/stream/index.ts index fee56e366..8b1c2c09c 100644 --- a/packages/backend/src/server/api/stream/index.ts +++ b/packages/backend/src/server/api/stream/index.ts @@ -1,3 +1,4 @@ +import * as WebSocket from 'ws'; import type { User } from '@/models/entities/User.js'; import type { AccessToken } from '@/models/entities/AccessToken.js'; import type { Packed } from '@/misc/json-schema.js'; @@ -7,7 +8,6 @@ import { bindThis } from '@/decorators.js'; import { CacheService } from '@/core/CacheService.js'; import { UserProfile } from '@/models/index.js'; import type { ChannelsService } from './ChannelsService.js'; -import type * as websocket from 'websocket'; import type { EventEmitter } from 'events'; import type Channel from './channel.js'; import type { StreamEventEmitter, StreamMessages } from './types.js'; @@ -18,7 +18,7 @@ import type { StreamEventEmitter, StreamMessages } from './types.js'; export default class Connection { public user?: User; public token?: AccessToken; - private wsConnection: websocket.connection; + private wsConnection: WebSocket.WebSocket; public subscriber: StreamEventEmitter; private channels: Channel[] = []; private subscribingNotes: any = {}; @@ -37,11 +37,9 @@ export default class Connection { private notificationService: NotificationService, private cacheService: CacheService, - subscriber: EventEmitter, user: User | null | undefined, token: AccessToken | null | undefined, ) { - this.subscriber = subscriber; if (user) this.user = user; if (token) this.token = token; } @@ -70,12 +68,16 @@ export default class Connection { if (this.user != null) { await this.fetch(); - this.fetchIntervalId = setInterval(this.fetch, 1000 * 10); + if (!this.fetchIntervalId) { + this.fetchIntervalId = setInterval(this.fetch, 1000 * 10); + } } } @bindThis - public async init2(wsConnection: websocket.connection) { + public async listen(subscriber: EventEmitter, wsConnection: WebSocket.WebSocket) { + this.subscriber = subscriber; + this.wsConnection = wsConnection; this.wsConnection.on('message', this.onWsConnectionMessage); @@ -88,14 +90,11 @@ export default class Connection { * クライアントからメッセージ受信時 */ @bindThis - private async onWsConnectionMessage(data: websocket.Message) { - if (data.type !== 'utf8') return; - if (data.utf8Data == null) return; - + private async onWsConnectionMessage(data: WebSocket.RawData) { let obj: Record; try { - obj = JSON.parse(data.utf8Data); + obj = JSON.parse(data.toString()); } catch (e) { return; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7930458cb..57e8cf850 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,7 +96,7 @@ importers: version: 8.2.1 '@fastify/http-proxy': specifier: 9.1.0 - version: 9.1.0 + version: 9.1.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) '@fastify/multipart': specifier: 7.6.0 version: 7.6.0 @@ -219,7 +219,7 @@ importers: version: 4.1.0 jsdom: specifier: 21.1.1 - version: 21.1.1 + version: 21.1.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) json5: specifier: 2.2.3 version: 2.2.3 @@ -388,12 +388,9 @@ importers: web-push: specifier: 3.6.1 version: 3.6.1 - websocket: - specifier: 1.0.34 - version: 1.0.34 ws: specifier: 8.13.0 - version: 8.13.0 + version: 8.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) xev: specifier: 3.0.2 version: 3.0.2 @@ -437,6 +434,9 @@ importers: '@tensorflow/tfjs-node': specifier: 4.4.0 version: 4.4.0(seedrandom@3.0.5) + bufferutil: + specifier: ^4.0.7 + version: 4.0.7 slacc-android-arm-eabi: specifier: 0.0.9 version: 0.0.9 @@ -473,6 +473,9 @@ importers: slacc-win32-x64-msvc: specifier: 0.0.9 version: 0.0.9 + utf-8-validate: + specifier: ^6.0.3 + version: 6.0.3 devDependencies: '@jest/globals': specifier: 29.5.0 @@ -3852,12 +3855,12 @@ packages: fast-json-stringify: 5.7.0 dev: false - /@fastify/http-proxy@9.1.0: + /@fastify/http-proxy@9.1.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): resolution: {integrity: sha512-vgHCTDKOqLB437zQJiLWFFnsrYfFZ6Lfwu/xXQoKqRUKIPDt+xG6LBRtf8s5MNqfFVoTE7kw1U/0qdRGDsMp4Q==} dependencies: '@fastify/reply-from': 9.0.1 fastify-plugin: 4.5.0 - ws: 8.13.0 + ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -5532,7 +5535,7 @@ packages: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.0 - ws: 8.13.0 + ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) transitivePeerDependencies: - bufferutil - encoding @@ -8702,7 +8705,6 @@ packages: requiresBuild: true dependencies: node-gyp-build: 4.6.0 - dev: false /bullmq@3.14.1: resolution: {integrity: sha512-Fom78UKljYsnJmwbROVPx3eFLuVfQjQbw9KCnVupLzT31RQHhFHV2xd/4J4oWl4u34bZ1JmEUfNnqNBz+IOJuA==} @@ -13872,7 +13874,7 @@ packages: - supports-color dev: true - /jsdom@21.1.1: + /jsdom@21.1.1(bufferutil@4.0.7)(utf-8-validate@6.0.3): resolution: {integrity: sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==} engines: {node: '>=14'} peerDependencies: @@ -13905,7 +13907,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 12.0.1 - ws: 8.13.0 + ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -15231,7 +15233,7 @@ packages: /node-gyp-build@4.6.0: resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} - dev: false + hasBin: true /node-gyp@9.3.1: resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} @@ -19276,12 +19278,6 @@ packages: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} dev: false - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: false - /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -19656,13 +19652,12 @@ packages: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} - /utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + /utf-8-validate@6.0.3: + resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} engines: {node: '>=6.14.2'} requiresBuild: true dependencies: node-gyp-build: 4.6.0 - dev: false /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -20132,20 +20127,6 @@ packages: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} dev: false - /websocket@1.0.34: - resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} - engines: {node: '>=4.0.0'} - dependencies: - bufferutil: 4.0.7 - debug: 2.6.9 - es5-ext: 0.10.62 - typedarray-to-buffer: 3.1.5 - utf-8-validate: 5.0.10 - yaeti: 0.0.6 - transitivePeerDependencies: - - supports-color - dev: false - /well-known-symbols@2.0.0: resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} engines: {node: '>=6'} @@ -20336,7 +20317,7 @@ packages: async-limiter: 1.0.1 dev: true - /ws@8.13.0: + /ws@8.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -20347,6 +20328,9 @@ packages: optional: true utf-8-validate: optional: true + dependencies: + bufferutil: 4.0.7 + utf-8-validate: 6.0.3 /xev@3.0.2: resolution: {integrity: sha512-8kxuH95iMXzHZj+fwqfA4UrPcYOy6bGIgfWzo9Ji23JoEc30ge/Z++Ubkiuy8c0+M64nXmmxrmJ7C8wnuBhluw==} @@ -20394,11 +20378,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yaeti@0.0.6: - resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} - engines: {node: '>=0.10.32'} - dev: false - /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} From afa4cd9112b429afa53396c2435baf5ef3b3dea9 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 29 May 2023 13:34:55 +0900 Subject: [PATCH 033/133] 13.13.0-beta.4 --- CHANGELOG.md | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b107c72f..36bc63b0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ ### Server - bullをbull-mqにアップグレードし、ジョブキューのパフォーマンスを改善 +- ストリーミングのパフォーマンスを改善 - Fix: お知らせの画像URLを空にできない問題を修正 ## 13.12.2 diff --git a/package.json b/package.json index 772362319..58257a8b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.13.0-beta.3", + "version": "13.13.0-beta.4", "codename": "nasubi", "repository": { "type": "git", From 8c66fad96b28ae498b78610d88089d9c9a798eb1 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 29 May 2023 17:13:12 +0900 Subject: [PATCH 034/133] lint --- packages/frontend/.eslintrc.js | 1 + packages/frontend/src/pages/admin/RolesEditorFormula.vue | 4 ++-- packages/frontend/src/pages/admin/roles.role.vue | 6 +++--- packages/frontend/src/pages/admin/roles.vue | 8 ++++---- packages/frontend/src/pages/admin/security.vue | 8 ++++---- packages/frontend/src/pages/gallery/edit.vue | 2 +- packages/frontend/src/pages/gallery/index.vue | 6 +++--- packages/frontend/src/pages/gallery/post.vue | 2 +- packages/frontend/src/widgets/server-metric/index.vue | 2 +- 9 files changed, 20 insertions(+), 19 deletions(-) diff --git a/packages/frontend/.eslintrc.js b/packages/frontend/.eslintrc.js index 303b74ca1..24c3ad4b8 100644 --- a/packages/frontend/.eslintrc.js +++ b/packages/frontend/.eslintrc.js @@ -56,6 +56,7 @@ module.exports = { 'vue/require-v-for-key': 'warn', 'vue/no-unused-components': 'warn', 'vue/no-unused-vars': 'warn', + 'vue/no-dupe-keys': 'warn', 'vue/valid-v-for': 'warn', 'vue/return-in-computed-property': 'warn', 'vue/no-setup-props-destructure': 'warn', diff --git a/packages/frontend/src/pages/admin/RolesEditorFormula.vue b/packages/frontend/src/pages/admin/RolesEditorFormula.vue index 343d2c4c5..36e3c3239 100644 --- a/packages/frontend/src/pages/admin/RolesEditorFormula.vue +++ b/packages/frontend/src/pages/admin/RolesEditorFormula.vue @@ -25,11 +25,11 @@
- + diff --git a/packages/frontend/src/pages/admin/roles.role.vue b/packages/frontend/src/pages/admin/roles.role.vue index 6eac90257..4ed6abf20 100644 --- a/packages/frontend/src/pages/admin/roles.role.vue +++ b/packages/frontend/src/pages/admin/roles.role.vue @@ -2,7 +2,7 @@
- +
{{ i18n.ts.edit }} @@ -11,9 +11,9 @@ - + - + diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue index e8dbe1c5f..6634d9cba 100644 --- a/packages/frontend/src/pages/admin/roles.vue +++ b/packages/frontend/src/pages/admin/roles.vue @@ -2,7 +2,7 @@
- +
@@ -14,7 +14,7 @@ - + @@ -156,13 +156,13 @@
- +
- +
diff --git a/packages/frontend/src/pages/admin/security.vue b/packages/frontend/src/pages/admin/security.vue index cd8ef9e68..efb9f81f2 100644 --- a/packages/frontend/src/pages/admin/security.vue +++ b/packages/frontend/src/pages/admin/security.vue @@ -1,7 +1,7 @@
@@ -79,9 +78,15 @@ watch(() => props.image, () => { }); function showMenu(ev: MouseEvent) { - os.popupMenu([...(iAmModerator ? [{ - text: i18n.ts.markAsSensitive, + os.popupMenu([{ + text: i18n.ts.hide, icon: 'ti ti-eye-off', + action: () => { + hide = true; + }, + }, ...(iAmModerator ? [{ + text: i18n.ts.markAsSensitive, + icon: 'ti ti-eye-exclamation', action: () => { os.apiWithDialog('drive/files/update', { fileId: props.image.id, isSensitive: true }); }, @@ -122,21 +127,6 @@ function showMenu(ev: MouseEvent) { background-size: 16px 16px; } -.hide { - display: block; - position: absolute; - border-radius: 6px; - background-color: var(--accentedBg); - -webkit-backdrop-filter: var(--blur, blur(15px)); - backdrop-filter: var(--blur, blur(15px)); - color: var(--accent); - font-size: 0.8em; - padding: 6px 8px; - text-align: center; - top: 12px; - right: 12px; -} - .menu { display: block; position: absolute; @@ -148,8 +138,8 @@ function showMenu(ev: MouseEvent) { font-size: 0.8em; padding: 6px 8px; text-align: center; - bottom: 12px; - right: 12px; + bottom: 10px; + right: 10px; } .imageContainer { @@ -166,12 +156,10 @@ function showMenu(ev: MouseEvent) { .indicators { display: inline-flex; position: absolute; - top: 12px; - left: 12px; - text-align: center; + top: 10px; + left: 10px; pointer-events: none; opacity: .5; - font-size: 14px; gap: 6px; } @@ -182,7 +170,7 @@ function showMenu(ev: MouseEvent) { color: var(--accentLighten); display: inline-block; font-weight: bold; - font-size: 12px; - padding: 2px 6px; + font-size: 0.8em; + padding: 2px 5px; } diff --git a/packages/frontend/src/components/MkPostFormAttaches.vue b/packages/frontend/src/components/MkPostFormAttaches.vue index ee4d439cc..18fa142eb 100644 --- a/packages/frontend/src/components/MkPostFormAttaches.vue +++ b/packages/frontend/src/components/MkPostFormAttaches.vue @@ -93,7 +93,7 @@ function showFileMenu(file, ev: MouseEvent) { action: () => { rename(file); }, }, { text: file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive, - icon: file.isSensitive ? 'ti ti-eye-off' : 'ti ti-eye', + icon: file.isSensitive ? 'ti ti-eye-exclamation' : 'ti ti-eye', action: () => { toggleSensitive(file); }, }, { text: i18n.ts.describeFile, diff --git a/packages/frontend/src/scripts/get-drive-file-menu.ts b/packages/frontend/src/scripts/get-drive-file-menu.ts index ed01b4905..060c8a1a1 100644 --- a/packages/frontend/src/scripts/get-drive-file-menu.ts +++ b/packages/frontend/src/scripts/get-drive-file-menu.ts @@ -73,7 +73,7 @@ export function getDriveFileMenu(file: Misskey.entities.DriveFile) { action: () => rename(file), }, { text: file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive, - icon: file.isSensitive ? 'ti ti-eye' : 'ti ti-eye-off', + icon: file.isSensitive ? 'ti ti-eye' : 'ti ti-eye-exclamation', action: () => toggleSensitive(file), }, { text: i18n.ts.describeFile, From de71845b35c62c43f002e92848468cfd7fc38bcc Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 30 May 2023 14:38:13 +0900 Subject: [PATCH 053/133] :art: --- packages/frontend/src/pages/settings/drive.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue index 6fa387120..8d7b30dc6 100644 --- a/packages/frontend/src/pages/settings/drive.vue +++ b/packages/frontend/src/pages/settings/drive.vue @@ -141,6 +141,7 @@ definePageMetadata({ From 9521519cb82ef8e1b95b2a1fcb544912a25175a7 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 31 May 2023 13:41:38 +0900 Subject: [PATCH 066/133] reafactor --- .../src/ui/_common_/navbar-for-mobile.vue | 424 +++++++++--------- 1 file changed, 208 insertions(+), 216 deletions(-) diff --git a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue index 6aacdd015..365486a0a 100644 --- a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue +++ b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue @@ -1,43 +1,41 @@ @@ -73,192 +71,186 @@ function more() { } - From a535142e82400b1972f25cbbdbdf3ec295be905b Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 31 May 2023 13:43:36 +0900 Subject: [PATCH 067/133] 13.13.0-beta.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d2cfcafd1..089df44db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.13.0-beta.5", + "version": "13.13.0-beta.6", "codename": "nasubi", "repository": { "type": "git", From 6dd219b6c7d13d6852a5e4173fb8cd7430bd41ff Mon Sep 17 00:00:00 2001 From: mappi Date: Wed, 31 May 2023 14:03:54 +0900 Subject: [PATCH 068/133] =?UTF-8?q?fix:=20Firefox=E3=81=AB=E3=81=8A?= =?UTF-8?q?=E3=81=91=E3=82=8B=E7=B5=B5=E6=96=87=E5=AD=97=E3=83=94=E3=83=83?= =?UTF-8?q?=E3=82=AB=E3=83=BC=E3=81=AETab=E3=82=AD=E3=83=BC=E3=83=95?= =?UTF-8?q?=E3=82=A9=E3=83=BC=E3=82=AB=E3=82=B9=E5=95=8F=E9=A1=8C=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#10926)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix 10744 * fix 10744 * Update CHANGELOG.md * add comment --- CHANGELOG.md | 1 + packages/frontend/src/components/MkEmojiPicker.vue | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd7882c34..a53d506ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ - Fix: ロールタイムラインが無効でも投稿が流れてしまう問題の修正 - Fix: ロールタイムラインにて全ての投稿が流れてしまう問題の修正 - Fix: 「アクセストークンの管理」画面でアプリの情報が表示されない問題の修正 +- Fix: Firefoxにおける絵文字ピッカーのTabキーフォーカス問題の修正 ### Server - bullをbull-mqにアップグレードし、ジョブキューのパフォーマンスを改善 diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue index b632baaa2..aab00e17d 100644 --- a/packages/frontend/src/components/MkEmojiPicker.vue +++ b/packages/frontend/src/components/MkEmojiPicker.vue @@ -1,7 +1,8 @@ diff --git a/packages/frontend/src/components/MkModal.vue b/packages/frontend/src/components/MkModal.vue index a33bb2d0e..b9ce6de69 100644 --- a/packages/frontend/src/components/MkModal.vue +++ b/packages/frontend/src/components/MkModal.vue @@ -17,7 +17,7 @@ From ff94b64c91d93aa01bf727ab72ba6937a2028897 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 1 Jun 2023 07:51:02 +0900 Subject: [PATCH 071/133] :art: --- packages/frontend/src/components/MkMediaImage.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/components/MkMediaImage.vue b/packages/frontend/src/components/MkMediaImage.vue index b21776eb4..b921a066f 100644 --- a/packages/frontend/src/components/MkMediaImage.vue +++ b/packages/frontend/src/components/MkMediaImage.vue @@ -87,6 +87,7 @@ function showMenu(ev: MouseEvent) { }, ...(iAmModerator ? [{ text: i18n.ts.markAsSensitive, icon: 'ti ti-eye-exclamation', + danger: true, action: () => { os.apiWithDialog('drive/files/update', { fileId: props.image.id, isSensitive: true }); }, From d8a564c6a0686ce814e39df80aa70b05191a3466 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 1 Jun 2023 08:54:37 +0900 Subject: [PATCH 072/133] :art: --- packages/frontend/src/ui/universal.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue index 20bf08ad7..c9a494576 100644 --- a/packages/frontend/src/ui/universal.vue +++ b/packages/frontend/src/ui/universal.vue @@ -321,6 +321,7 @@ $widgets-hide-threshold: 1090px; top: 0; right: 0; z-index: 1001; + width: 310px; height: 100dvh; padding: var(--margin) var(--margin) calc(var(--margin) + env(safe-area-inset-bottom, 0px)) !important; box-sizing: border-box; From a2c77a0944a6b2fe0d958c01e6c449b5b57a3223 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 1 Jun 2023 09:20:37 +0900 Subject: [PATCH 073/133] Update style.scss --- packages/frontend/src/style.scss | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/frontend/src/style.scss b/packages/frontend/src/style.scss index 689cb6ed8..70d48d2da 100644 --- a/packages/frontend/src/style.scss +++ b/packages/frontend/src/style.scss @@ -22,11 +22,7 @@ } html { - touch-action: manipulation; background-color: var(--bg); - background-attachment: fixed; - background-size: cover; - background-position: center; color: var(--fg); accent-color: var(--accent); overflow: auto; @@ -87,6 +83,7 @@ html._themeChanging_ { } html, body { + touch-action: manipulation; margin: 0; padding: 0; scroll-behavior: smooth; From 8cc6c2c864b0cd93e0e270a774386d4fb0f139b6 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 1 Jun 2023 09:29:29 +0900 Subject: [PATCH 074/133] New Crowdin updates (#10929) * New translations ja-JP.yml (Korean) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (Norwegian) --- locales/ko-KR.yml | 6 +++--- locales/no-NO.yml | 51 ++++++++++++++++++++++++++++++++++------------- locales/zh-CN.yml | 18 +++++++++++++++++ 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 1f0e7294f..5903bf577 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -1065,7 +1065,7 @@ _initialAccountSetting: letsStartAccountSetup: "계정의 초기 설정을 진행합니다." letsFillYourProfile: "우선 나의 프로필을 설정해 보아요." profileSetting: "프로필 설정" - privacySetting: "\n프라이버시 설정" + privacySetting: "프라이버시 설정" theseSettingsCanEditLater: "이 설정들은 나중에도 변경할 수 있습니다." youCanEditMoreSettingsInSettingsPageLater: "이 외에도 '설정' 페이지에서 다양한 설정을 나의 입맛에 맞게 조절할 수 있습니다. 꼭 확인해 보세요!" followUsers: "관심사가 맞는 유저를 팔로우하여 타임라인을 가꾸어 봅시다." @@ -1073,8 +1073,8 @@ _initialAccountSetting: initialAccountSettingCompleted: "초기 설정을 모두 마쳤습니다!" haveFun: "{name}와 함께 즐거운 시간 보내세요!" ifYouNeedLearnMore: "{name}(Misskey)의 사용 방법에 대해 자세히 알아보려면 {link}를 참고해 주세요." - skipAreYouSure: "초기 설정을 넘기시겠습니까?" - laterAreYouSure: "초기 설정을 나중에 다시 진행하시겠습니까?" + skipAreYouSure: "초기 설정을 중단하시겠습니까?" + laterAreYouSure: "초기 설정을 나중에 진행하시겠습니까?" _serverRules: description: "회원 가입 이전에 간단하게 표시할 서버 규칙입니다. 이용 약관의 요약으로 구성하는 것을 추천합니다." _accountMigration: diff --git a/locales/no-NO.yml b/locales/no-NO.yml index 7bc647fc1..9d6c5fc50 100644 --- a/locales/no-NO.yml +++ b/locales/no-NO.yml @@ -1,7 +1,7 @@ --- _lang_: "Norsk Bokmål" -headlineMisskey: "Et nettverk forbundet med notes" -introMisskey: "Velkommen! Misskey er en desentralisert mikrobloggtjeneste med åpen kildekode.\nOpprett \"notes\" for å dele tankene dine med alle rundt deg. 📡\nMed \"reaksjoner\" kan du også raskt gi uttrykk for hva du synes om alles notes. 👍\nLa oss utforske en ny verden! 🚀" +headlineMisskey: "Et nettverk forbundet med Notes" +introMisskey: "Velkommen! Misskey er en desentralisert mikrobloggtjeneste med åpen kildekode.\nOpprett \"Notes\" for å dele tankene dine med alle rundt deg. 📡\nMed \"reaksjoner\" kan du også raskt gi uttrykk for hva du synes om alles Notes. 👍\nLa oss utforske en ny verden! 🚀" monthAndDay: "{day}-{month}" search: "Søk" notifications: "Varsler" @@ -15,7 +15,7 @@ cancel: "Avbryt" noThankYou: "Ikke nå" enterUsername: "Skriv inn brukernavn" renotedBy: "Renotes av {user}" -noNotes: "Ingen notes" +noNotes: "Ingen Notes" noNotifications: "Ingen varsler" instance: "Server" settings: "Innstillinger" @@ -46,7 +46,7 @@ copyContent: "Kopier innhold" copyLink: "Kopier lenke" delete: "Slett" deleteAndEdit: "Slett og rediger" -deleteAndEditConfirm: "Er du sikker på at du vil slette denne noten og redigere den? Du vil miste alle reaksjoner, renotes og svar på den." +deleteAndEditConfirm: "Er du sikker på at du vil slette denne Noten og redigere den? Du vil miste alle reaksjoner, Renotes og svar på den." addToList: "Legg til i liste" sendMessage: "Send en melding" copyRSS: "Kopier RSS" @@ -90,9 +90,9 @@ enterEmoji: "Skriv inn en emoji" renote: "Renote" renoted: "Renotet." cantRenote: "Dette innlegget kan ikke renotes." -cantReRenote: "En renote kan ikke renotes." +cantReRenote: "En Renote kan ikke renotes." quote: "Sitat" -pinnedNote: "Festet note" +pinnedNote: "Festet Note" pinned: "Fest til profil" you: "Du" clickToShow: "Klikk for å vise" @@ -101,13 +101,13 @@ reaction: "Reaksjon" reactions: "Reaksjoner" reactionSetting: "Reaksjoner som vises i reaksjonsvelgeren" reactionSettingDescription2: "Dra for å endre rekkefølgen, klikk for å slette, trykk \"+\" for å legge til." -rememberNoteVisibility: "Husk innstillingene for synlighet av notes" +rememberNoteVisibility: "Husk innstillingene for synlighet av Notes" attachCancel: "Fjern vedlegg" enterFileName: "Skriv inn filnavn" mute: "Skjul" unmute: "Vis" -renoteMute: "Skjul renotes" -renoteUnmute: "Vis renotes" +renoteMute: "Skjul Renotes" +renoteUnmute: "Vis Renotes" block: "Blokker" unblock: "Opphev blokkering" suspend: "Suspender" @@ -163,7 +163,7 @@ mutedUsers: "Skjulte brukere" blockedUsers: "Blokkerte brukere" noUsers: "Det er ingen brukere" editProfile: "Rediger profil" -noteDeleteConfirm: "Er du sikker på at du vil slette denne noten?" +noteDeleteConfirm: "Er du sikker på at du vil slette denne Noten?" pinLimitExceeded: "Du kan ikke feste flere." intro: "Installasjonen av Misskey er ferdig! Vennligst opprett en administratorkonto." done: "Ferdig" @@ -195,7 +195,7 @@ termsOfService: "Vilkår for bruk" home: "Hjem" activity: "Aktivitet" images: "Bilder" -image: "Bilder" +image: "Bilde" birthday: "Bursdag" yearsOld: "{age} år gammel" light: "Lys" @@ -226,7 +226,7 @@ instanceName: "Servernavn" instanceDescription: "Serverbeskrivelse" thisYear: "År" thisMonth: "Måned" -today: "Dag" +today: "I dag" dayX: "{day}" monthX: "{month}" yearX: "{year}" @@ -242,13 +242,14 @@ basicInfo: "Grunnleggende informasjon" pinnedUsers: "Festede brukrere" pinnedUsersDescription: "Liste over brukernavn atskilt med linjeskift som skal festes i \"Utforsk\" fanen." pinnedPages: "Festede sider" -pinnedNotes: "Festet note" +pinnedNotes: "Festet Note" hcaptcha: "hCaptcha" enableHcaptcha: "Aktiver hCaptcha" recaptcha: "reCAPTCHA" enableRecaptcha: "Aktiver reCAPTCHA" turnstile: "Turnstile" enableTurnstile: "Aktiver Turnstile" +antennas: "Antenner" name: "Navn" popularUsers: "Populære brukere" exploreUsersCount: "Det finnes {count} brukere" @@ -286,7 +287,7 @@ objectStorageRegion: "Region" objectStorageUseSSL: "Bruk SSL" objectStorageUseProxy: "Bruk Proxy" deleteAll: "Slett alt" -newNoteRecived: "Det er nye notes" +newNoteRecived: "Det er nye Notes" listen: "Lytt" none: "Ingen" volume: "Volum" @@ -339,6 +340,7 @@ developer: "Utvikler" makeExplorable: "Gjør konto synlig i \"Utforsk\"" makeExplorableDescription: "Hvis du slår av dette, vises ikke kontoen din i \"Utforsk\" delen." left: "Venstre" +nNotes: "{n} Notes" saveAs: "Lagre som" value: "Verdi" deleteConfirm: "Vil du slette?" @@ -424,6 +426,26 @@ _initialAccountSetting: theseSettingsCanEditLater: "Du kan endre disse innstillingene senere." _achievements: _types: + _notes10: + title: "Noen Notes" + _notes100: + title: "Mange Notes" + _notes500: + title: "Dekket i Notes" + _notes1000: + title: "Et fjell av Notes" + _notes5000: + title: "Overfylte Notes" + _notes10000: + title: "Super Notes" + _notes20000: + title: "Trenger... mer... Notes..." + _notes30000: + title: "Notes Notes Notes!" + _notes40000: + title: "Note fabrikk" + _notes50000: + title: "Planet av Notes" _notes100000: flavor: "Du har jammen mye å si." _noteFavorited1: @@ -650,6 +672,7 @@ _deck: _columns: notifications: "Varsler" tl: "Tidslinje" + antenna: "Antenner" list: "Lister" channel: "Kanaler" direct: "Direkte" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index f7d5ab0e6..a9ef92e7d 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -52,6 +52,8 @@ addToList: "添加至列表" sendMessage: "发送" copyRSS: "复制RSS" copyUsername: "复制用户名" +copyUserId: "复制用户ID" +copyNoteId: "复制帖子ID" searchUser: "搜索用户" reply: "回复" loadMore: "查看更多" @@ -790,6 +792,7 @@ noMaintainerInformationWarning: "管理人员信息未设置。" noBotProtectionWarning: "Bot保护未设置。" configure: "设置" postToGallery: "发送到图库" +postToHashtag: "投稿到这个标签" gallery: "图库" recentPosts: "最新发布" popularPosts: "热门投稿" @@ -823,6 +826,7 @@ translatedFrom: "从 {x} 翻译" accountDeletionInProgress: "正在删除账户" usernameInfo: "在服务器上唯一标识您的帐户的名称。您可以使用字母 (a ~ z, A ~ Z)、数字 (0 ~ 9) 和下划线 (_)。用户名以后不能更改。" aiChanMode: "小蓝模式" +devMode: "开发者模式" keepCw: "回复时维持隐藏内容" pubSub: "Pub/Sub账户" lastCommunication: "最近通信" @@ -832,6 +836,8 @@ breakFollow: "移除关注者" breakFollowConfirm: "你想取消关注吗?" itsOn: "已开启" itsOff: "已关闭" +on: "开启" +off: "关闭" emailRequiredForSignup: "注册账户需要电子邮件地址" unread: "未读" filter: "筛选" @@ -986,6 +992,8 @@ cannotBeChangedLater: "之后不能再更改。" reactionAcceptance: "接受表情回应" likeOnly: "仅点赞" likeOnlyForRemote: "远程仅点赞" +nonSensitiveOnly: "仅限非敏感内容" +nonSensitiveOnlyForLocalLikeOnlyForRemote: "仅限非敏感内容(远程仅点赞)" rolesAssignedToMe: "指派给自己的角色" resetPasswordConfirm: "确定重置密码?" sensitiveWords: "敏感词" @@ -1043,6 +1051,15 @@ preventAiLearning: "拒绝接受生成式AI的学习" preventAiLearningDescription: "要求文章生成AI或图像生成AI不能够以发布的帖子和图像等内容作为学习对象。这是通过在HTML响应中包含noai标志来实现的,这不能完全阻止AI学习你的发布内容,并不是所有AI都会遵守这类请求。" options: "选项" specifyUser: "用户指定" +failedToPreviewUrl: "无法预览" +update: "更新" +rolesThatCanBeUsedThisEmojiAsReaction: "可以使用表情作为回应的角色" +rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "在没有指定角色的情况下,任何人都可以使用表情作为回应。" +rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "角色必须是公开的。" +cancelReactionConfirm: "要取消回应吗?" +changeReactionConfirm: "要更改回应吗?" +later: "一会再说" +goToMisskey: "去往Misskey" _initialAccountSetting: accountCreated: "账户创建完成了!" letsStartAccountSetup: "来进行帐户的初始设置吧。" @@ -1057,6 +1074,7 @@ _initialAccountSetting: haveFun: "希望{name}在这里玩得开心!" ifYouNeedLearnMore: "关于{name}(Misskey)的使用方法,详见{link}。" skipAreYouSure: "要跳过初始设置吗?" + laterAreYouSure: "要稍后再进行初始设定吗?" _serverRules: description: "在新用户注册前显示服务器的简单规则。推荐显示服务条款的主要内容。" _accountMigration: From 31a8129cb932816228a5137f44cd6095d3ec40ed Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 1 Jun 2023 13:20:43 +0900 Subject: [PATCH 075/133] New translations ja-JP.yml (Korean) (#10933) --- locales/ko-KR.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 5903bf577..b4a9507b0 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -1080,12 +1080,12 @@ _serverRules: _accountMigration: moveFrom: "다른 계정에서 이 계정으로 이사" moveFromSub: "다른 계정에 대한 별칭을 생성" - moveFromLabel: "기존 계정:" + moveFromLabel: "기존 계정 #{n}" moveFromDescription: "다른 계정에서 이 계정으로 팔로워를 가져오려면, 우선 여기에서 별칭을 지정해야 합니다. 반드시 이사하기 전에 지정해야 합니다! 기존 계정을 다음과 같은 형식으로 입력해 주십시오: @person@instance.com" moveTo: "이 계정에서 다른 계정으로 이사" moveToLabel: "이사할 계정:" moveCannotBeUndone: "한 번 이사하면, 두 번 다시 되돌릴 수 없습니다." - moveAccountDescription: "이 작업은 취소할 수 없습니다. 먼저 이사할 계정에서 이 계정에 대한 별칭을 지정하였는지 다시 한 번 확인해 주십시오. 별칭을 지정한 다음, 이사할 계정을 다음과 같은 형식으로 입력해 주십시오: @person@instance.com" + moveAccountDescription: "새 계정으로 이전합니다.\n ・팔로워가 새 계정을 자동으로 팔로우 합니다\n ・이 계정에서 팔로우는 모두 해제됩니다\n ・이 계정으로는 노트 작성 등을 할 수 없게 됩니다\n\n팔로워의 이전은 자동이지만, 팔로우는 수동으로 진행해야 합니다. 이전하기 전에 이 계정에서 팔로우를 내보내고, 이전 후에는 즉시 이전한 계정에서 가져오기를 진행하십시오.\n리스트・뮤트・차단에 대해서도 마찬가지이므로 수동으로 이전해야 합니다.\n\n(이 설명은 이 서버(Misskey v13.12.0 이후)의 사양입니다. Mastodon 등의 다른 ActivityPub 소프트웨어에서는 작동이 다를 수 있습니다.)" moveAccountHowTo: "계정을 이사하려면 우선 이사갈 계정에서 이 계정에 대한 별칭을 지정해야 합니다.\n별칭을 작성한 다음, 이사갈 계정을 다음과 같이 입력하십시오:\n@username@server.example.com" startMigration: "이사하기" migrationConfirm: "정말로 이 계정을 {account} 으로 이전하시겠습니까? 한 번 이전한 다음에는 취소할 수 없으며, 두 번 다시 원래 상태로 복구할 수 없습니다.\n이사할 계정에서 계정 별칭을 지정하였는지 다시 한 번 확인하십시오." From ec2f05d4f79d8f9b1a866527d906db6a2a2b5ba7 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 1 Jun 2023 13:28:43 +0900 Subject: [PATCH 076/133] =?UTF-8?q?fix(backend):=20i/notifications?= =?UTF-8?q?=E3=81=AEsinceId=E3=81=8C=E6=A9=9F=E8=83=BD=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #10902 --- CHANGELOG.md | 1 + .../backend/src/server/api/endpoints/i/notifications.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a53d506ef..5b2b4784a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ - bullをbull-mqにアップグレードし、ジョブキューのパフォーマンスを改善 - ストリーミングのパフォーマンスを改善 - Fix: お知らせの画像URLを空にできない問題を修正 +- Fix: i/notificationsのsinceIdが機能しない問題を修正 ## 13.12.2 diff --git a/packages/backend/src/server/api/endpoints/i/notifications.ts b/packages/backend/src/server/api/endpoints/i/notifications.ts index e141be764..f5662f4a0 100644 --- a/packages/backend/src/server/api/endpoints/i/notifications.ts +++ b/packages/backend/src/server/api/endpoints/i/notifications.ts @@ -91,18 +91,18 @@ export default class extends Endpoint { const includeTypes = ps.includeTypes && ps.includeTypes.filter(type => !(obsoleteNotificationTypes).includes(type as any)) as typeof notificationTypes[number][]; const excludeTypes = ps.excludeTypes && ps.excludeTypes.filter(type => !(obsoleteNotificationTypes).includes(type as any)) as typeof notificationTypes[number][]; - const limit = ps.limit + (ps.untilId ? 1 : 0); // untilIdに指定したものも含まれるため+1 + const limit = ps.limit + (ps.untilId ? 1 : 0) + (ps.sinceId ? 1 : 0); // untilIdに指定したものも含まれるため+1 const notificationsRes = await this.redisClient.xrevrange( `notificationTimeline:${me.id}`, ps.untilId ? this.idService.parse(ps.untilId).date.getTime() : '+', - '-', + ps.sinceId ? this.idService.parse(ps.sinceId).date.getTime() : '-', 'COUNT', limit); if (notificationsRes.length === 0) { return []; } - let notifications = notificationsRes.map(x => JSON.parse(x[1][1])).filter(x => x.id !== ps.untilId) as Notification[]; + let notifications = notificationsRes.map(x => JSON.parse(x[1][1])).filter(x => x.id !== ps.untilId && x !== ps.sinceId) as Notification[]; if (includeTypes && includeTypes.length > 0) { notifications = notifications.filter(notification => includeTypes.includes(notification.type)); From 3089a86c8e111e2ddef0b359999b5b720fc1033a Mon Sep 17 00:00:00 2001 From: SASAGAWA Kiyoshi Date: Thu, 1 Jun 2023 13:29:44 +0900 Subject: [PATCH 077/133] =?UTF-8?q?fix:=20=E3=83=86=E3=83=BC=E3=83=9E?= =?UTF-8?q?=E3=81=AB=E3=83=97=E3=83=AD=E3=83=91=E3=83=86=E3=82=A3=20'fgOnW?= =?UTF-8?q?hite'=20=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=A6=E3=83=95?= =?UTF-8?q?=E3=82=A9=E3=83=AD=E3=83=BC=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=AE?= =?UTF-8?q?=E3=82=B9=E3=82=BF=E3=82=A4=E3=83=AB=E3=82=92=E8=AA=BF=E6=95=B4?= =?UTF-8?q?=20(#10931)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: add theme property 'fgOnWhite' and fix styles of follow button. * fix: add theme property 'fgOnWhite' and fix styles of follow button. --- CHANGELOG.md | 2 ++ packages/frontend/src/components/MkFollowButton.vue | 3 +-- packages/frontend/src/themes/_dark.json5 | 1 + packages/frontend/src/themes/_light.json5 | 1 + packages/frontend/src/themes/d-astro.json5 | 1 + packages/frontend/src/themes/d-botanical.json5 | 1 + packages/frontend/src/themes/d-cherry.json5 | 1 + packages/frontend/src/themes/d-dark.json5 | 1 + packages/frontend/src/themes/d-future.json5 | 1 + packages/frontend/src/themes/d-green-lime.json5 | 1 + packages/frontend/src/themes/d-green-orange.json5 | 1 + packages/frontend/src/themes/d-ice.json5 | 1 + packages/frontend/src/themes/d-persimmon.json5 | 1 + packages/frontend/src/themes/d-u0.json5 | 1 + packages/frontend/src/themes/l-apricot.json5 | 1 + packages/frontend/src/themes/l-botanical.json5 | 1 + packages/frontend/src/themes/l-cherry.json5 | 1 + packages/frontend/src/themes/l-coffee.json5 | 1 + packages/frontend/src/themes/l-light.json5 | 1 + packages/frontend/src/themes/l-rainy.json5 | 1 + packages/frontend/src/themes/l-sushi.json5 | 1 + packages/frontend/src/themes/l-u0.json5 | 1 + packages/frontend/src/themes/l-vivid.json5 | 1 + 23 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b2b4784a..a17c9c231 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,8 @@ - Fix: ロールタイムラインにて全ての投稿が流れてしまう問題の修正 - Fix: 「アクセストークンの管理」画面でアプリの情報が表示されない問題の修正 - Fix: Firefoxにおける絵文字ピッカーのTabキーフォーカス問題の修正 +- Fix: フォローボタンがテーマのカラースキームによって視認性が悪くなる問題を修正 + - 新しいプロパティ `fgOnWhite` が追加されました ### Server - bullをbull-mqにアップグレードし、ジョブキューのパフォーマンスを改善 diff --git a/packages/frontend/src/components/MkFollowButton.vue b/packages/frontend/src/components/MkFollowButton.vue index c4e13441e..b732fbb2b 100644 --- a/packages/frontend/src/components/MkFollowButton.vue +++ b/packages/frontend/src/components/MkFollowButton.vue @@ -131,8 +131,7 @@ onBeforeUnmount(() => { position: relative; display: inline-block; font-weight: bold; - color: var(--accent); - background: transparent; + color: var(--fgOnWhite); border: solid 1px var(--accent); padding: 0; height: 31px; diff --git a/packages/frontend/src/themes/_dark.json5 b/packages/frontend/src/themes/_dark.json5 index b8820bcf8..5ef6adb08 100644 --- a/packages/frontend/src/themes/_dark.json5 +++ b/packages/frontend/src/themes/_dark.json5 @@ -21,6 +21,7 @@ fgTransparent: ':alpha<0.5<@fg', fgHighlighted: ':lighten<3<@fg', fgOnAccent: '#fff', + fgOnWhite: '#333', divider: 'rgba(255, 255, 255, 0.1)', indicator: '@accent', panel: ':lighten<3<@bg', diff --git a/packages/frontend/src/themes/_light.json5 b/packages/frontend/src/themes/_light.json5 index da3c77055..32f3c7490 100644 --- a/packages/frontend/src/themes/_light.json5 +++ b/packages/frontend/src/themes/_light.json5 @@ -21,6 +21,7 @@ fgTransparent: ':alpha<0.5<@fg', fgHighlighted: ':darken<3<@fg', fgOnAccent: '#fff', + fgOnWhite: '#333', divider: 'rgba(0, 0, 0, 0.1)', indicator: '@accent', panel: ':lighten<3<@bg', diff --git a/packages/frontend/src/themes/d-astro.json5 b/packages/frontend/src/themes/d-astro.json5 index c6a927ec3..09a9ead1a 100644 --- a/packages/frontend/src/themes/d-astro.json5 +++ b/packages/frontend/src/themes/d-astro.json5 @@ -53,6 +53,7 @@ panelHeaderBg: ':lighten<3<@panel', panelHeaderFg: '@fg', htmlThemeColor: '@bg', + fgOnWhite: '@accent', panelHighlight: ':lighten<3<@panel', listItemHoverBg: 'rgba(255, 255, 255, 0.03)', scrollbarHandle: 'rgba(255, 255, 255, 0.2)', diff --git a/packages/frontend/src/themes/d-botanical.json5 b/packages/frontend/src/themes/d-botanical.json5 index 33cf7aa81..62208d237 100644 --- a/packages/frontend/src/themes/d-botanical.json5 +++ b/packages/frontend/src/themes/d-botanical.json5 @@ -11,6 +11,7 @@ bg: 'rgb(37, 38, 36)', fg: 'rgb(216, 212, 199)', fgHighlighted: '#fff', + fgOnWhite: '@accent', divider: 'rgba(255, 255, 255, 0.14)', panel: 'rgb(47, 47, 44)', panelHeaderDivider: 'rgba(0, 0, 0, 0)', diff --git a/packages/frontend/src/themes/d-cherry.json5 b/packages/frontend/src/themes/d-cherry.json5 index a7e1ad1c8..f9638124c 100644 --- a/packages/frontend/src/themes/d-cherry.json5 +++ b/packages/frontend/src/themes/d-cherry.json5 @@ -10,6 +10,7 @@ accent: 'rgb(255, 89, 117)', bg: 'rgb(28, 28, 37)', fg: 'rgb(236, 239, 244)', + fgOnWhite: '@accent', panel: 'rgb(35, 35, 47)', renote: '@accent', link: '@accent', diff --git a/packages/frontend/src/themes/d-dark.json5 b/packages/frontend/src/themes/d-dark.json5 index 63144e88e..ae4f7d53f 100644 --- a/packages/frontend/src/themes/d-dark.json5 +++ b/packages/frontend/src/themes/d-dark.json5 @@ -11,6 +11,7 @@ bg: '#232323', fg: 'rgb(199, 209, 216)', fgHighlighted: '#fff', + fgOnWhite: '@accent', divider: 'rgba(255, 255, 255, 0.14)', panel: '#2d2d2d', panelHeaderDivider: 'rgba(0, 0, 0, 0)', diff --git a/packages/frontend/src/themes/d-future.json5 b/packages/frontend/src/themes/d-future.json5 index 0962a1241..f2c1f3eb8 100644 --- a/packages/frontend/src/themes/d-future.json5 +++ b/packages/frontend/src/themes/d-future.json5 @@ -12,6 +12,7 @@ fg: '#D5D5D6', fgHighlighted: '#fff', fgOnAccent: '#000', + fgOnWhite: '@accent', divider: 'rgba(255, 255, 255, 0.1)', panel: '#18181c', panelHeaderDivider: 'rgba(0, 0, 0, 0)', diff --git a/packages/frontend/src/themes/d-green-lime.json5 b/packages/frontend/src/themes/d-green-lime.json5 index 9522f534a..ca4e688fd 100644 --- a/packages/frontend/src/themes/d-green-lime.json5 +++ b/packages/frontend/src/themes/d-green-lime.json5 @@ -12,6 +12,7 @@ fg: '#dee7e4', fgHighlighted: '#fff', fgOnAccent: '#192320', + fgOnWhite: '@accent', divider: '#e7fffb24', panel: '#192320', panelHeaderDivider: 'rgba(0, 0, 0, 0)', diff --git a/packages/frontend/src/themes/d-green-orange.json5 b/packages/frontend/src/themes/d-green-orange.json5 index e542782c6..c2539816e 100644 --- a/packages/frontend/src/themes/d-green-orange.json5 +++ b/packages/frontend/src/themes/d-green-orange.json5 @@ -12,6 +12,7 @@ fg: '#dee7e4', fgHighlighted: '#fff', fgOnAccent: '#192320', + fgOnWhite: '@accent', divider: '#e7fffb24', panel: '#192320', panelHeaderDivider: 'rgba(0, 0, 0, 0)', diff --git a/packages/frontend/src/themes/d-ice.json5 b/packages/frontend/src/themes/d-ice.json5 index 179b060dc..b4abc0cac 100644 --- a/packages/frontend/src/themes/d-ice.json5 +++ b/packages/frontend/src/themes/d-ice.json5 @@ -8,6 +8,7 @@ props: { accent: '#47BFE8', + fgOnWhite: '@accent', bg: '#212526', }, } diff --git a/packages/frontend/src/themes/d-persimmon.json5 b/packages/frontend/src/themes/d-persimmon.json5 index e36265ff1..0ab6523dd 100644 --- a/packages/frontend/src/themes/d-persimmon.json5 +++ b/packages/frontend/src/themes/d-persimmon.json5 @@ -11,6 +11,7 @@ bg: 'rgb(31, 33, 31)', fg: '#cdd8c7', fgHighlighted: '#fff', + fgOnWhite: '@accent', divider: 'rgba(255, 255, 255, 0.14)', panel: 'rgb(41, 43, 41)', infoFg: '@fg', diff --git a/packages/frontend/src/themes/d-u0.json5 b/packages/frontend/src/themes/d-u0.json5 index 3fce93b2f..ed776746a 100644 --- a/packages/frontend/src/themes/d-u0.json5 +++ b/packages/frontend/src/themes/d-u0.json5 @@ -55,6 +55,7 @@ codeNumber: '#cfff9e', codeString: '#ffb675', fgOnAccent: '#fff', + fgOnWhite: '@accent', infoWarnBg: '#42321c', infoWarnFg: '#ffbd3e', navHoverFg: ':lighten<17<@fg', diff --git a/packages/frontend/src/themes/l-apricot.json5 b/packages/frontend/src/themes/l-apricot.json5 index 1ed552557..fe1f9f892 100644 --- a/packages/frontend/src/themes/l-apricot.json5 +++ b/packages/frontend/src/themes/l-apricot.json5 @@ -10,6 +10,7 @@ accent: 'rgb(234, 154, 82)', bg: '#e6e5e2', fg: 'rgb(149, 143, 139)', + fgOnWhite: '@accent', panel: '#EEECE8', renote: '@accent', link: '@accent', diff --git a/packages/frontend/src/themes/l-botanical.json5 b/packages/frontend/src/themes/l-botanical.json5 index 2ea9a7d6c..5c9892789 100644 --- a/packages/frontend/src/themes/l-botanical.json5 +++ b/packages/frontend/src/themes/l-botanical.json5 @@ -11,6 +11,7 @@ bg: 'e2deda', fg: '#3d3d3d', fgHighlighted: '#6bc9a0', + fgOnWhite: '@accent', divider: '#cfcfcf', panel: '@X14', panelHeaderBg: '@panel', diff --git a/packages/frontend/src/themes/l-cherry.json5 b/packages/frontend/src/themes/l-cherry.json5 index 5ad240241..1189a28fe 100644 --- a/packages/frontend/src/themes/l-cherry.json5 +++ b/packages/frontend/src/themes/l-cherry.json5 @@ -10,6 +10,7 @@ accent: 'rgb(219, 96, 114)', bg: 'rgb(254, 248, 249)', fg: 'rgb(152, 13, 26)', + fgOnWhite: '@accent', panel: 'rgb(255, 255, 255)', renote: '@accent', link: 'rgb(156, 187, 5)', diff --git a/packages/frontend/src/themes/l-coffee.json5 b/packages/frontend/src/themes/l-coffee.json5 index fbcd4fa9e..b64cc7358 100644 --- a/packages/frontend/src/themes/l-coffee.json5 +++ b/packages/frontend/src/themes/l-coffee.json5 @@ -10,6 +10,7 @@ accent: '#9f8989', bg: '#f5f3f3', fg: '#7f6666', + fgOnWhite: '@accent', panel: '#fff', divider: 'rgba(87, 68, 68, 0.1)', renote: 'rgb(160, 172, 125)', diff --git a/packages/frontend/src/themes/l-light.json5 b/packages/frontend/src/themes/l-light.json5 index 248355c94..63c2e6d27 100644 --- a/packages/frontend/src/themes/l-light.json5 +++ b/packages/frontend/src/themes/l-light.json5 @@ -10,6 +10,7 @@ props: { bg: '#f9f9f9', fg: '#676767', + fgOnWhite: '@accent', divider: '#e8e8e8', header: ':alpha<0.7<@panel', navBg: '#fff', diff --git a/packages/frontend/src/themes/l-rainy.json5 b/packages/frontend/src/themes/l-rainy.json5 index 283dd74c6..e7d1d5af0 100644 --- a/packages/frontend/src/themes/l-rainy.json5 +++ b/packages/frontend/src/themes/l-rainy.json5 @@ -10,6 +10,7 @@ accent: '#5db0da', bg: 'rgb(246 248 249)', fg: '#636b71', + fgOnWhite: '@accent', panel: '#fff', divider: 'rgb(230 233 234)', panelHeaderDivider: '@divider', diff --git a/packages/frontend/src/themes/l-sushi.json5 b/packages/frontend/src/themes/l-sushi.json5 index 5846927d6..e787d6373 100644 --- a/packages/frontend/src/themes/l-sushi.json5 +++ b/packages/frontend/src/themes/l-sushi.json5 @@ -10,6 +10,7 @@ accent: '#e36749', bg: '#f0eee9', fg: '#5f5f5f', + fgOnWhite: '@accent', renote: '@accent', link: '@accent', mention: '@accent', diff --git a/packages/frontend/src/themes/l-u0.json5 b/packages/frontend/src/themes/l-u0.json5 index 03b114ba3..b77b15e3f 100644 --- a/packages/frontend/src/themes/l-u0.json5 +++ b/packages/frontend/src/themes/l-u0.json5 @@ -55,6 +55,7 @@ codeNumber: '#cfff9e', codeString: '#ffb675', fgOnAccent: '#fff', + fgOnWhite: '@accent', infoWarnBg: '#42321c', infoWarnFg: '#ffbd3e', navHoverFg: ':lighten<17<@fg', diff --git a/packages/frontend/src/themes/l-vivid.json5 b/packages/frontend/src/themes/l-vivid.json5 index b3c08f38a..822ef948d 100644 --- a/packages/frontend/src/themes/l-vivid.json5 +++ b/packages/frontend/src/themes/l-vivid.json5 @@ -52,6 +52,7 @@ driveFolderBg: ':alpha<0.3<@accent', fgHighlighted: ':darken<3<@fg', fgTransparent: ':alpha<0.5<@fg', + fgOnWhite: '@accent', panelHeaderBg: ':lighten<3<@panel', panelHeaderFg: '@fg', htmlThemeColor: '@bg', From 6c09361ec6ea50d816fc37cb2b5bbd00dc94ebbf Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 1 Jun 2023 13:50:13 +0900 Subject: [PATCH 078/133] :art: --- packages/frontend/src/ui/_common_/navbar.vue | 2 +- packages/frontend/src/ui/universal.vue | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/ui/_common_/navbar.vue b/packages/frontend/src/ui/_common_/navbar.vue index e9f0624a2..a184f1d2f 100644 --- a/packages/frontend/src/ui/_common_/navbar.vue +++ b/packages/frontend/src/ui/_common_/navbar.vue @@ -101,7 +101,7 @@ function more(ev: MouseEvent) { diff --git a/packages/frontend/src/components/MkWidgets.vue b/packages/frontend/src/components/MkWidgets.vue index 9fd1d6163..30547c744 100644 --- a/packages/frontend/src/components/MkWidgets.vue +++ b/packages/frontend/src/components/MkWidgets.vue @@ -1,7 +1,7 @@