From eef368abd0c0dfcd76d2a48bf96394c1e11de01d Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 13 May 2023 20:50:16 +0900 Subject: [PATCH 01/54] Update about-misskey.vue --- packages/frontend/src/pages/about-misskey.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue index 9e0594db3..b487916ff 100644 --- a/packages/frontend/src/pages/about-misskey.vue +++ b/packages/frontend/src/pages/about-misskey.vue @@ -86,8 +86,13 @@ -
- DC Advirth +
+
+ Mask Network +
+
+ DC Advirth +
From 9166a58c5fa422c0cd5989bdff39ee6c62e382bf Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 13 May 2023 20:50:21 +0900 Subject: [PATCH 02/54] :art: --- packages/frontend/src/components/MkAnimBg.vue | 226 ++++++++++++++++++ .../src/components/MkUserSetupDialog.vue | 3 + 2 files changed, 229 insertions(+) create mode 100644 packages/frontend/src/components/MkAnimBg.vue diff --git a/packages/frontend/src/components/MkAnimBg.vue b/packages/frontend/src/components/MkAnimBg.vue new file mode 100644 index 000000000..df0765d49 --- /dev/null +++ b/packages/frontend/src/components/MkAnimBg.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/packages/frontend/src/components/MkUserSetupDialog.vue b/packages/frontend/src/components/MkUserSetupDialog.vue index 4e80a5c0f..3d7497526 100644 --- a/packages/frontend/src/components/MkUserSetupDialog.vue +++ b/packages/frontend/src/components/MkUserSetupDialog.vue @@ -27,6 +27,7 @@ > - diff --git a/packages/frontend/src/widgets/WidgetJobQueue.vue b/packages/frontend/src/widgets/WidgetJobQueue.vue index 84043cf13..73a480259 100644 --- a/packages/frontend/src/widgets/WidgetJobQueue.vue +++ b/packages/frontend/src/widgets/WidgetJobQueue.vue @@ -49,7 +49,7 @@ import { onUnmounted, reactive } from 'vue'; import { useWidgetPropsManager, Widget, WidgetComponentExpose } from './widget'; import { GetFormResultType } from '@/scripts/form'; -import { stream } from '@/stream'; +import { useStream } from '@/stream'; import number from '@/filters/number'; import * as sound from '@/scripts/sound'; import { deepClone } from '@/scripts/clone'; @@ -81,7 +81,7 @@ const { widgetProps, configure } = useWidgetPropsManager(name, emit, ); -const connection = stream.useChannel('queueStats'); +const connection = useStream().useChannel('queueStats'); const current = reactive({ inbox: { activeSincePrevTick: 0, diff --git a/packages/frontend/src/widgets/WidgetPhotos.vue b/packages/frontend/src/widgets/WidgetPhotos.vue index 716bbb427..1484aa194 100644 --- a/packages/frontend/src/widgets/WidgetPhotos.vue +++ b/packages/frontend/src/widgets/WidgetPhotos.vue @@ -20,7 +20,7 @@ import { onUnmounted, ref } from 'vue'; import { useWidgetPropsManager, Widget, WidgetComponentExpose } from './widget'; import { GetFormResultType } from '@/scripts/form'; -import { stream } from '@/stream'; +import { useStream } from '@/stream'; import { getStaticImageUrl } from '@/scripts/media-proxy'; import * as os from '@/os'; import MkContainer from '@/components/MkContainer.vue'; @@ -54,7 +54,7 @@ const { widgetProps, configure } = useWidgetPropsManager(name, emit, ); -const connection = stream.useChannel('main'); +const connection = useStream().useChannel('main'); const images = ref([]); const fetching = ref(true); diff --git a/packages/frontend/src/widgets/server-metric/index.vue b/packages/frontend/src/widgets/server-metric/index.vue index 357d0ab78..df8de10f6 100644 --- a/packages/frontend/src/widgets/server-metric/index.vue +++ b/packages/frontend/src/widgets/server-metric/index.vue @@ -25,7 +25,7 @@ import XDisk from './disk.vue'; import MkContainer from '@/components/MkContainer.vue'; import { GetFormResultType } from '@/scripts/form'; import * as os from '@/os'; -import { stream } from '@/stream'; +import { useStream } from '@/stream'; import { i18n } from '@/i18n'; const name = 'serverMetric'; @@ -75,7 +75,7 @@ const toggleView = () => { save(); }; -const connection = stream.useChannel('serverStats'); +const connection = useStream().useChannel('serverStats'); onUnmounted(() => { connection.dispose(); }); diff --git a/packages/frontend/vite.config.ts b/packages/frontend/vite.config.ts index fad0dd017..339761e78 100644 --- a/packages/frontend/vite.config.ts +++ b/packages/frontend/vite.config.ts @@ -117,7 +117,7 @@ export function getConfig(): UserConfig { manifest: 'manifest.json', rollupOptions: { input: { - app: './src/init.ts', + app: './src/_boot_.ts', }, output: { manualChunks: { From d10d5a8d53fd214ca75613f73bb7149632ec9cf9 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 16 May 2023 12:16:37 +0900 Subject: [PATCH 23/54] =?UTF-8?q?enhance:=20=E3=82=BF=E3=82=A4=E3=83=A0?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=83=B3=E3=81=AB=E3=83=95=E3=82=A9=E3=83=AD?= =?UTF-8?q?=E3=82=A4=E3=83=BC=E3=81=AE=E8=A1=8C=E3=81=A3=E3=81=9F=E4=BB=96?= =?UTF-8?q?=E4=BA=BA=E3=81=B8=E3=81=AE=E3=83=AA=E3=83=97=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=82=92=E5=90=AB=E3=82=81=E3=82=8B=E3=81=8B=E3=81=A9=E3=81=86?= =?UTF-8?q?=E3=81=8B=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=82=92=E3=82=A2=E3=82=AB?= =?UTF-8?q?=E3=82=A6=E3=83=B3=E3=83=88=E3=81=AB=E4=BF=9D=E5=AD=98=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=81=AE=E3=82=92=E3=82=84=E3=82=81=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve #10646 --- CHANGELOG.md | 4 +++ ...684206886988-remove-showTimelineReplies.js | 11 ++++++++ packages/backend/src/core/QueryService.ts | 4 +-- .../activitypub/models/ApPersonService.ts | 7 ++--- .../src/core/entities/UserEntityService.ts | 1 - packages/backend/src/models/entities/User.ts | 6 ---- .../src/server/api/endpoints/i/update.ts | 2 -- .../api/endpoints/notes/global-timeline.ts | 9 ++---- .../api/endpoints/notes/hybrid-timeline.ts | 9 ++---- .../api/endpoints/notes/local-timeline.ts | 9 ++---- .../server/api/endpoints/notes/timeline.ts | 9 ++---- .../api/stream/channels/global-timeline.ts | 5 +++- .../api/stream/channels/home-timeline.ts | 5 +++- .../api/stream/channels/hybrid-timeline.ts | 5 +++- .../api/stream/channels/local-timeline.ts | 5 +++- packages/backend/test/e2e/users.ts | 5 ---- .../frontend/src/components/MkTimeline.vue | 28 ++++++++++++++++--- .../frontend/src/pages/settings/general.vue | 2 ++ .../frontend/src/pages/settings/profile.vue | 2 -- packages/frontend/src/store.ts | 4 +++ 20 files changed, 78 insertions(+), 54 deletions(-) create mode 100644 packages/backend/migration/1684206886988-remove-showTimelineReplies.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 7087d73b9..a20120b48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ ## 13.x.x (unreleased) +### General +- タイムラインにフォロイーの行った他人へのリプライを含めるかどうかの設定をアカウントに保存するのをやめるように + - 今後はAPI呼び出し時およびストリーミング接続時に設定するようになります + ### Client - 開発者モードを追加 - AiScriptを0.13.3に更新 diff --git a/packages/backend/migration/1684206886988-remove-showTimelineReplies.js b/packages/backend/migration/1684206886988-remove-showTimelineReplies.js new file mode 100644 index 000000000..690653bd7 --- /dev/null +++ b/packages/backend/migration/1684206886988-remove-showTimelineReplies.js @@ -0,0 +1,11 @@ +export class RemoveShowTimelineReplies1684206886988 { + name = 'RemoveShowTimelineReplies1684206886988' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "showTimelineReplies"`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" ADD "showTimelineReplies" boolean NOT NULL DEFAULT false`); + } +} diff --git a/packages/backend/src/core/QueryService.ts b/packages/backend/src/core/QueryService.ts index 0cee2076b..bf50a1cde 100644 --- a/packages/backend/src/core/QueryService.ts +++ b/packages/backend/src/core/QueryService.ts @@ -208,7 +208,7 @@ export class QueryService { } @bindThis - public generateRepliesQuery(q: SelectQueryBuilder, me?: Pick | null): void { + public generateRepliesQuery(q: SelectQueryBuilder, withReplies: boolean, me?: Pick | null): void { if (me == null) { q.andWhere(new Brackets(qb => { qb .where('note.replyId IS NULL') // 返信ではない @@ -217,7 +217,7 @@ export class QueryService { .andWhere('note.replyUserId = note.userId'); })); })); - } else if (!me.showTimelineReplies) { + } else if (!withReplies) { q.andWhere(new Brackets(qb => { qb .where('note.replyId IS NULL') // 返信ではない .orWhere('note.replyUserId = :meId', { meId: me.id }) // 返信だけど自分のノートへの返信 diff --git a/packages/backend/src/core/activitypub/models/ApPersonService.ts b/packages/backend/src/core/activitypub/models/ApPersonService.ts index eea1d1b84..f52ebed10 100644 --- a/packages/backend/src/core/activitypub/models/ApPersonService.ts +++ b/packages/backend/src/core/activitypub/models/ApPersonService.ts @@ -32,6 +32,8 @@ import type { UserEntityService } from '@/core/entities/UserEntityService.js'; import { bindThis } from '@/decorators.js'; import { MetaService } from '@/core/MetaService.js'; import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js'; +import type { AccountMoveService } from '@/core/AccountMoveService.js'; +import { checkHttps } from '@/misc/check-https.js'; import { getApId, getApType, getOneApHrefNullable, isActor, isCollection, isCollectionOrOrderedCollection, isPropertyValue } from '../type.js'; import { extractApHashtags } from './tag.js'; import type { OnModuleInit } from '@nestjs/common'; @@ -42,8 +44,6 @@ import type { ApLoggerService } from '../ApLoggerService.js'; // eslint-disable-next-line @typescript-eslint/consistent-type-imports import type { ApImageService } from './ApImageService.js'; import type { IActor, IObject } from '../type.js'; -import type { AccountMoveService } from '@/core/AccountMoveService.js'; -import { checkHttps } from '@/misc/check-https.js'; const nameLength = 128; const summaryLength = 2048; @@ -306,7 +306,6 @@ export class ApPersonService implements OnModuleInit { tags, isBot, isCat: (person as any).isCat === true, - showTimelineReplies: false, })) as RemoteUser; await transactionalEntityManager.save(new UserProfile({ @@ -696,7 +695,7 @@ export class ApPersonService implements OnModuleInit { if (!dst.alsoKnownAs || dst.alsoKnownAs.length === 0) { return 'skip: dst.alsoKnownAs is empty'; } - if (!dst.alsoKnownAs?.includes(src.uri)) { + if (!dst.alsoKnownAs.includes(src.uri)) { return 'skip: alsoKnownAs does not include from.uri'; } diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts index 7f61e1d6f..bfd506ea8 100644 --- a/packages/backend/src/core/entities/UserEntityService.ts +++ b/packages/backend/src/core/entities/UserEntityService.ts @@ -466,7 +466,6 @@ export class UserEntityService implements OnModuleInit { mutedInstances: profile!.mutedInstances, mutingNotificationTypes: profile!.mutingNotificationTypes, emailNotificationTypes: profile!.emailNotificationTypes, - showTimelineReplies: user.showTimelineReplies ?? falsy, achievements: profile!.achievements, loggedInDays: profile!.loggedInDates.length, policies: this.roleService.getUserPolicies(user.id), diff --git a/packages/backend/src/models/entities/User.ts b/packages/backend/src/models/entities/User.ts index 8e10f999b..6669890cf 100644 --- a/packages/backend/src/models/entities/User.ts +++ b/packages/backend/src/models/entities/User.ts @@ -232,12 +232,6 @@ export class User { }) public followersUri: string | null; - @Column('boolean', { - default: false, - comment: 'Whether to show users replying to other users in the timeline.', - }) - public showTimelineReplies: boolean; - @Index({ unique: true }) @Column('char', { length: 16, nullable: true, unique: true, diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 74be00a8b..d10f690a3 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -141,7 +141,6 @@ export const paramDef = { preventAiLearning: { type: 'boolean' }, isBot: { type: 'boolean' }, isCat: { type: 'boolean' }, - showTimelineReplies: { type: 'boolean' }, injectFeaturedNote: { type: 'boolean' }, receiveAnnouncementEmail: { type: 'boolean' }, alwaysMarkNsfw: { type: 'boolean' }, @@ -239,7 +238,6 @@ export default class extends Endpoint { if (typeof ps.hideOnlineStatus === 'boolean') updates.hideOnlineStatus = ps.hideOnlineStatus; if (typeof ps.publicReactions === 'boolean') profileUpdates.publicReactions = ps.publicReactions; if (typeof ps.isBot === 'boolean') updates.isBot = ps.isBot; - if (typeof ps.showTimelineReplies === 'boolean') updates.showTimelineReplies = ps.showTimelineReplies; if (typeof ps.carefulBot === 'boolean') profileUpdates.carefulBot = ps.carefulBot; if (typeof ps.autoAcceptFollowed === 'boolean') profileUpdates.autoAcceptFollowed = ps.autoAcceptFollowed; if (typeof ps.noCrawle === 'boolean') profileUpdates.noCrawle = ps.noCrawle; diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts index c11c1eac4..88c1ca7f5 100644 --- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts @@ -34,11 +34,8 @@ export const meta = { export const paramDef = { type: 'object', properties: { - withFiles: { - type: 'boolean', - default: false, - description: 'Only show notes that have attached files.', - }, + withFiles: { type: 'boolean', default: false }, + withReplies: { type: 'boolean', default: false }, limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 }, sinceId: { type: 'string', format: 'misskey:id' }, untilId: { type: 'string', format: 'misskey:id' }, @@ -78,7 +75,7 @@ export default class extends Endpoint { .leftJoinAndSelect('reply.user', 'replyUser') .leftJoinAndSelect('renote.user', 'renoteUser'); - this.queryService.generateRepliesQuery(query, me); + this.queryService.generateRepliesQuery(query, ps.withReplies, me); if (me) { this.queryService.generateMutedUserQuery(query, me); this.queryService.generateMutedNoteQuery(query, me); diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts index 89abd91c7..7a3581e6e 100644 --- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -46,11 +46,8 @@ export const paramDef = { includeMyRenotes: { type: 'boolean', default: true }, includeRenotedMyNotes: { type: 'boolean', default: true }, includeLocalRenotes: { type: 'boolean', default: true }, - withFiles: { - type: 'boolean', - default: false, - description: 'Only show notes that have attached files.', - }, + withFiles: { type: 'boolean', default: false }, + withReplies: { type: 'boolean', default: false }, }, required: [], } as const; @@ -98,7 +95,7 @@ export default class extends Endpoint { .setParameters(followingQuery.getParameters()); this.queryService.generateChannelQuery(query, me); - this.queryService.generateRepliesQuery(query, me); + this.queryService.generateRepliesQuery(query, ps.withReplies, me); this.queryService.generateVisibilityQuery(query, me); this.queryService.generateMutedUserQuery(query, me); this.queryService.generateMutedNoteQuery(query, me); diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts index afdafc7c5..2ee549232 100644 --- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts @@ -36,11 +36,8 @@ export const meta = { export const paramDef = { type: 'object', properties: { - withFiles: { - type: 'boolean', - default: false, - description: 'Only show notes that have attached files.', - }, + withFiles: { type: 'boolean', default: false }, + withReplies: { type: 'boolean', default: false }, fileType: { type: 'array', items: { type: 'string', } }, @@ -86,7 +83,7 @@ export default class extends Endpoint { .leftJoinAndSelect('renote.user', 'renoteUser'); this.queryService.generateChannelQuery(query, me); - this.queryService.generateRepliesQuery(query, me); + this.queryService.generateRepliesQuery(query, ps.withReplies, me); this.queryService.generateVisibilityQuery(query, me); if (me) this.queryService.generateMutedUserQuery(query, me); if (me) this.queryService.generateMutedNoteQuery(query, me); diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts index c6ee1e5c2..e1f286439 100644 --- a/packages/backend/src/server/api/endpoints/notes/timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts @@ -35,11 +35,8 @@ export const paramDef = { includeMyRenotes: { type: 'boolean', default: true }, includeRenotedMyNotes: { type: 'boolean', default: true }, includeLocalRenotes: { type: 'boolean', default: true }, - withFiles: { - type: 'boolean', - default: false, - description: 'Only show notes that have attached files.', - }, + withFiles: { type: 'boolean', default: false }, + withReplies: { type: 'boolean', default: false }, }, required: [], } as const; @@ -84,7 +81,7 @@ export default class extends Endpoint { } this.queryService.generateChannelQuery(query, me); - this.queryService.generateRepliesQuery(query, me); + this.queryService.generateRepliesQuery(query, ps.withReplies, me); this.queryService.generateVisibilityQuery(query, me); this.queryService.generateMutedUserQuery(query, me); this.queryService.generateMutedNoteQuery(query, me); diff --git a/packages/backend/src/server/api/stream/channels/global-timeline.ts b/packages/backend/src/server/api/stream/channels/global-timeline.ts index 5454836fe..d3339072c 100644 --- a/packages/backend/src/server/api/stream/channels/global-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts @@ -13,6 +13,7 @@ class GlobalTimelineChannel extends Channel { public readonly chName = 'globalTimeline'; public static shouldShare = true; public static requireCredential = false; + private withReplies: boolean; constructor( private metaService: MetaService, @@ -31,6 +32,8 @@ class GlobalTimelineChannel extends Channel { const policies = await this.roleService.getUserPolicies(this.user ? this.user.id : null); if (!policies.gtlAvailable) return; + this.withReplies = params.withReplies as boolean; + // Subscribe events this.subscriber.on('notesStream', this.onNote); } @@ -54,7 +57,7 @@ class GlobalTimelineChannel extends Channel { } // 関係ない返信は除外 - if (note.reply && !this.user!.showTimelineReplies) { + if (note.reply && !this.withReplies) { const reply = note.reply; // 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/home-timeline.ts b/packages/backend/src/server/api/stream/channels/home-timeline.ts index ee874ad81..1755aa94c 100644 --- a/packages/backend/src/server/api/stream/channels/home-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts @@ -11,6 +11,7 @@ class HomeTimelineChannel extends Channel { public readonly chName = 'homeTimeline'; public static shouldShare = true; public static requireCredential = true; + private withReplies: boolean; constructor( private noteEntityService: NoteEntityService, @@ -24,6 +25,8 @@ class HomeTimelineChannel extends Channel { @bindThis public async init(params: any) { + this.withReplies = params.withReplies as boolean; + this.subscriber.on('notesStream', this.onNote); } @@ -63,7 +66,7 @@ class HomeTimelineChannel extends Channel { } // 関係ない返信は除外 - if (note.reply && !this.user!.showTimelineReplies) { + if (note.reply && !this.withReplies) { const reply = note.reply; // 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts index 4f7b4e78b..5a33e13cf 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -13,6 +13,7 @@ class HybridTimelineChannel extends Channel { public readonly chName = 'hybridTimeline'; public static shouldShare = true; public static requireCredential = true; + private withReplies: boolean; constructor( private metaService: MetaService, @@ -31,6 +32,8 @@ class HybridTimelineChannel extends Channel { const policies = await this.roleService.getUserPolicies(this.user ? this.user.id : null); if (!policies.ltlAvailable) return; + this.withReplies = params.withReplies as boolean; + // Subscribe events this.subscriber.on('notesStream', this.onNote); } @@ -75,7 +78,7 @@ class HybridTimelineChannel extends Channel { if (isInstanceMuted(note, new Set(this.userProfile!.mutedInstances ?? []))) return; // 関係ない返信は除外 - if (note.reply && !this.user!.showTimelineReplies) { + if (note.reply && !this.withReplies) { const reply = note.reply; // 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/local-timeline.ts b/packages/backend/src/server/api/stream/channels/local-timeline.ts index 09b0005ac..9ca4db8ce 100644 --- a/packages/backend/src/server/api/stream/channels/local-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts @@ -12,6 +12,7 @@ class LocalTimelineChannel extends Channel { public readonly chName = 'localTimeline'; public static shouldShare = true; public static requireCredential = false; + private withReplies: boolean; constructor( private metaService: MetaService, @@ -30,6 +31,8 @@ class LocalTimelineChannel extends Channel { const policies = await this.roleService.getUserPolicies(this.user ? this.user.id : null); if (!policies.ltlAvailable) return; + this.withReplies = params.withReplies as boolean; + // Subscribe events this.subscriber.on('notesStream', this.onNote); } @@ -54,7 +57,7 @@ class LocalTimelineChannel extends Channel { } // 関係ない返信は除外 - if (note.reply && this.user && !this.user.showTimelineReplies) { + if (note.reply && this.user && !this.withReplies) { const reply = note.reply; // 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 if (reply.userId !== this.user.id && note.userId !== this.user.id && reply.userId !== note.userId) return; diff --git a/packages/backend/test/e2e/users.ts b/packages/backend/test/e2e/users.ts index a7f8210c8..02684c93b 100644 --- a/packages/backend/test/e2e/users.ts +++ b/packages/backend/test/e2e/users.ts @@ -43,7 +43,6 @@ describe('ユーザー', () => { type MeDetailed = UserDetailedNotMe & misskey.entities.MeDetailed & { - showTimelineReplies: boolean, achievements: object[], loggedInDays: number, policies: object, @@ -160,7 +159,6 @@ describe('ユーザー', () => { mutedInstances: user.mutedInstances, mutingNotificationTypes: user.mutingNotificationTypes, emailNotificationTypes: user.emailNotificationTypes, - showTimelineReplies: user.showTimelineReplies, achievements: user.achievements, loggedInDays: user.loggedInDays, policies: user.policies, @@ -406,7 +404,6 @@ describe('ユーザー', () => { assert.deepStrictEqual(response.mutedInstances, []); assert.deepStrictEqual(response.mutingNotificationTypes, []); assert.deepStrictEqual(response.emailNotificationTypes, ['follow', 'receiveFollowRequest']); - assert.strictEqual(response.showTimelineReplies, false); assert.deepStrictEqual(response.achievements, []); assert.deepStrictEqual(response.loggedInDays, 0); assert.deepStrictEqual(response.policies, DEFAULT_POLICIES); @@ -470,8 +467,6 @@ describe('ユーザー', () => { { parameters: (): object => ({ isBot: false }) }, { parameters: (): object => ({ isCat: true }) }, { parameters: (): object => ({ isCat: false }) }, - { parameters: (): object => ({ showTimelineReplies: true }) }, - { parameters: (): object => ({ showTimelineReplies: false }) }, { parameters: (): object => ({ injectFeaturedNote: true }) }, { parameters: (): object => ({ injectFeaturedNote: false }) }, { parameters: (): object => ({ receiveAnnouncementEmail: true }) }, diff --git a/packages/frontend/src/components/MkTimeline.vue b/packages/frontend/src/components/MkTimeline.vue index 00a0cb760..25d813e39 100644 --- a/packages/frontend/src/components/MkTimeline.vue +++ b/packages/frontend/src/components/MkTimeline.vue @@ -70,7 +70,12 @@ if (props.src === 'antenna') { connection.on('note', prepend); } else if (props.src === 'home') { endpoint = 'notes/timeline'; - connection = stream.useChannel('homeTimeline'); + query = { + withReplies: defaultStore.state.showTimelineReplies, + }; + connection = stream.useChannel('homeTimeline', { + withReplies: defaultStore.state.showTimelineReplies, + }); connection.on('note', prepend); connection2 = stream.useChannel('main'); @@ -78,15 +83,30 @@ if (props.src === 'antenna') { connection2.on('unfollow', onChangeFollowing); } else if (props.src === 'local') { endpoint = 'notes/local-timeline'; - connection = stream.useChannel('localTimeline'); + query = { + withReplies: defaultStore.state.showTimelineReplies, + }; + connection = stream.useChannel('localTimeline', { + withReplies: defaultStore.state.showTimelineReplies, + }); connection.on('note', prepend); } else if (props.src === 'social') { endpoint = 'notes/hybrid-timeline'; - connection = stream.useChannel('hybridTimeline'); + query = { + withReplies: defaultStore.state.showTimelineReplies, + }; + connection = stream.useChannel('hybridTimeline', { + withReplies: defaultStore.state.showTimelineReplies, + }); connection.on('note', prepend); } else if (props.src === 'global') { endpoint = 'notes/global-timeline'; - connection = stream.useChannel('globalTimeline'); + query = { + withReplies: defaultStore.state.showTimelineReplies, + }; + connection = stream.useChannel('globalTimeline', { + withReplies: defaultStore.state.showTimelineReplies, + }); connection.on('note', prepend); } else if (props.src === 'mentions') { endpoint = 'notes/mentions'; diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue index ec2bc3623..0dfc84704 100644 --- a/packages/frontend/src/pages/settings/general.vue +++ b/packages/frontend/src/pages/settings/general.vue @@ -148,6 +148,7 @@
+ {{ i18n.ts.flagShowTimelineReplies }} {{ i18n.ts.deck }} {{ i18n.ts.customCss }}
@@ -216,6 +217,7 @@ const squareAvatars = computed(defaultStore.makeGetterSetter('squareAvatars')); const mediaListWithOneImageAppearance = computed(defaultStore.makeGetterSetter('mediaListWithOneImageAppearance')); const notificationPosition = computed(defaultStore.makeGetterSetter('notificationPosition')); const notificationStackAxis = computed(defaultStore.makeGetterSetter('notificationStackAxis')); +const showTimelineReplies = computed(defaultStore.makeGetterSetter('showTimelineReplies')); watch(lang, () => { miLocalStorage.setItem('lang', lang.value as string); diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue index dd552ed92..35af43d78 100644 --- a/packages/frontend/src/pages/settings/profile.vue +++ b/packages/frontend/src/pages/settings/profile.vue @@ -91,8 +91,6 @@ - - {{ i18n.ts.flagShowTimelineReplies }} diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 61085e5dc..0af4b5c02 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -102,6 +102,10 @@ export const defaultStore = markRaw(new Storage('base', { where: 'account', default: [] as string[], }, + showTimelineReplies: { + where: 'account', + default: false, + }, menu: { where: 'deviceAccount', From 0d8e1c5421c6c495b72bf52621bb0ebf0a4ead86 Mon Sep 17 00:00:00 2001 From: nenohi Date: Tue, 16 May 2023 12:28:59 +0900 Subject: [PATCH 24/54] =?UTF-8?q?channel=20favorite=E3=81=AE=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E4=BF=AE=E6=AD=A3=20(#10855)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/pages/channel.vue | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue index 9aa564a7d..2c0483aa0 100644 --- a/packages/frontend/src/pages/channel.vue +++ b/packages/frontend/src/pages/channel.vue @@ -5,6 +5,8 @@
+ +
@@ -17,9 +19,6 @@
- - -
@@ -229,6 +228,13 @@ definePageMetadata(computed(() => channel ? { left: 16px; } +.favorite { + position: absolute; + z-index: 1; + top: 16px; + right: 16px; +} + .banner { position: relative; height: 200px; From 153eed7d71e5071e63a2bc0eda1889f66b75ef9b Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 16 May 2023 18:41:34 +0900 Subject: [PATCH 25/54] =?UTF-8?q?fix(frontend/test):=20MkAnimBg=E3=81=A7?= =?UTF-8?q?=E6=AF=8E=E5=9B=9EChromatic=E3=81=AE=E5=B7=AE=E5=88=86=E3=81=8C?= =?UTF-8?q?=E7=94=9F=E6=88=90=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/components/MkAnimBg.vue | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/frontend/src/components/MkAnimBg.vue b/packages/frontend/src/components/MkAnimBg.vue index a4cc04dde..5a5c427cf 100644 --- a/packages/frontend/src/components/MkAnimBg.vue +++ b/packages/frontend/src/components/MkAnimBg.vue @@ -4,7 +4,7 @@ - - - - diff --git a/packages/frontend/src/components/index.ts b/packages/frontend/src/components/index.ts index 4ef8111da..ee2a2bc7b 100644 --- a/packages/frontend/src/components/index.ts +++ b/packages/frontend/src/components/index.ts @@ -1,6 +1,6 @@ import { App } from 'vue'; -import Mfm from './global/MkMisskeyFlavoredMarkdown.vue'; +import Mfm from './global/MkMisskeyFlavoredMarkdown.ts'; import MkA from './global/MkA.vue'; import MkAcct from './global/MkAcct.vue'; import MkAvatar from './global/MkAvatar.vue'; diff --git a/packages/frontend/src/style.scss b/packages/frontend/src/style.scss index 20254d335..689cb6ed8 100644 --- a/packages/frontend/src/style.scss +++ b/packages/frontend/src/style.scss @@ -483,3 +483,140 @@ hr { transform: scaleX(1.00) scaleY(1.00) ; } } + +// MFM ----------------------------- + +._mfm_blur_ { + filter: blur(6px); + transition: filter 0.3s; + + &:hover { + filter: blur(0px); + } +} + +.mfm-x2 { + --mfm-zoom-size: 200%; +} + +.mfm-x3 { + --mfm-zoom-size: 400%; +} + +.mfm-x4 { + --mfm-zoom-size: 600%; +} + +.mfm-x2, .mfm-x3, .mfm-x4 { + font-size: var(--mfm-zoom-size); + + .mfm-x2, .mfm-x3, .mfm-x4 { + /* only half effective */ + font-size: calc(var(--mfm-zoom-size) / 2 + 50%); + + .mfm-x2, .mfm-x3, .mfm-x4 { + /* disabled */ + font-size: 100%; + } + } +} + +@keyframes mfm-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +@keyframes mfm-spinX { + 0% { transform: perspective(128px) rotateX(0deg); } + 100% { transform: perspective(128px) rotateX(360deg); } +} + +@keyframes mfm-spinY { + 0% { transform: perspective(128px) rotateY(0deg); } + 100% { transform: perspective(128px) rotateY(360deg); } +} + +@keyframes mfm-jump { + 0% { transform: translateY(0); } + 25% { transform: translateY(-16px); } + 50% { transform: translateY(0); } + 75% { transform: translateY(-8px); } + 100% { transform: translateY(0); } +} + +@keyframes mfm-bounce { + 0% { transform: translateY(0) scale(1, 1); } + 25% { transform: translateY(-16px) scale(1, 1); } + 50% { transform: translateY(0) scale(1, 1); } + 75% { transform: translateY(0) scale(1.5, 0.75); } + 100% { transform: translateY(0) scale(1, 1); } +} + +// const val = () => `translate(${Math.floor(Math.random() * 20) - 10}px, ${Math.floor(Math.random() * 20) - 10}px)`; +// let css = ''; +// for (let i = 0; i <= 100; i += 5) { css += `${i}% { transform: ${val()} }\n`; } +@keyframes mfm-twitch { + 0% { transform: translate(7px, -2px) } + 5% { transform: translate(-3px, 1px) } + 10% { transform: translate(-7px, -1px) } + 15% { transform: translate(0px, -1px) } + 20% { transform: translate(-8px, 6px) } + 25% { transform: translate(-4px, -3px) } + 30% { transform: translate(-4px, -6px) } + 35% { transform: translate(-8px, -8px) } + 40% { transform: translate(4px, 6px) } + 45% { transform: translate(-3px, 1px) } + 50% { transform: translate(2px, -10px) } + 55% { transform: translate(-7px, 0px) } + 60% { transform: translate(-2px, 4px) } + 65% { transform: translate(3px, -8px) } + 70% { transform: translate(6px, 7px) } + 75% { transform: translate(-7px, -2px) } + 80% { transform: translate(-7px, -8px) } + 85% { transform: translate(9px, 3px) } + 90% { transform: translate(-3px, -2px) } + 95% { transform: translate(-10px, 2px) } + 100% { transform: translate(-2px, -6px) } +} + +// const val = () => `translate(${Math.floor(Math.random() * 6) - 3}px, ${Math.floor(Math.random() * 6) - 3}px) rotate(${Math.floor(Math.random() * 24) - 12}deg)`; +// let css = ''; +// for (let i = 0; i <= 100; i += 5) { css += `${i}% { transform: ${val()} }\n`; } +@keyframes mfm-shake { + 0% { transform: translate(-3px, -1px) rotate(-8deg) } + 5% { transform: translate(0px, -1px) rotate(-10deg) } + 10% { transform: translate(1px, -3px) rotate(0deg) } + 15% { transform: translate(1px, 1px) rotate(11deg) } + 20% { transform: translate(-2px, 1px) rotate(1deg) } + 25% { transform: translate(-1px, -2px) rotate(-2deg) } + 30% { transform: translate(-1px, 2px) rotate(-3deg) } + 35% { transform: translate(2px, 1px) rotate(6deg) } + 40% { transform: translate(-2px, -3px) rotate(-9deg) } + 45% { transform: translate(0px, -1px) rotate(-12deg) } + 50% { transform: translate(1px, 2px) rotate(10deg) } + 55% { transform: translate(0px, -3px) rotate(8deg) } + 60% { transform: translate(1px, -1px) rotate(8deg) } + 65% { transform: translate(0px, -1px) rotate(-7deg) } + 70% { transform: translate(-1px, -3px) rotate(6deg) } + 75% { transform: translate(0px, -2px) rotate(4deg) } + 80% { transform: translate(-2px, -1px) rotate(3deg) } + 85% { transform: translate(1px, -3px) rotate(-10deg) } + 90% { transform: translate(1px, 0px) rotate(3deg) } + 95% { transform: translate(-2px, 0px) rotate(-3deg) } + 100% { transform: translate(2px, 1px) rotate(2deg) } +} + +@keyframes mfm-rubberBand { + from { transform: scale3d(1, 1, 1); } + 30% { transform: scale3d(1.25, 0.75, 1); } + 40% { transform: scale3d(0.75, 1.25, 1); } + 50% { transform: scale3d(1.15, 0.85, 1); } + 65% { transform: scale3d(0.95, 1.05, 1); } + 75% { transform: scale3d(1.05, 0.95, 1); } + to { transform: scale3d(1, 1, 1); } +} + +@keyframes mfm-rainbow { + 0% { filter: hue-rotate(0deg) contrast(150%) saturate(150%); } + 100% { filter: hue-rotate(360deg) contrast(150%) saturate(150%); } +} From e707aadbcc47f1fd7cefb6071a37169503066752 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 17 May 2023 14:11:32 +0900 Subject: [PATCH 33/54] update deps --- packages/frontend/package.json | 60 +- pnpm-lock.yaml | 1176 +++++++++++++++++--------------- 2 files changed, 647 insertions(+), 589 deletions(-) diff --git a/packages/frontend/package.json b/packages/frontend/package.json index e03dc5182..7e6c1442b 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -21,10 +21,10 @@ "@rollup/pluginutils": "5.0.2", "@syuilo/aiscript": "0.13.3", "@tabler/icons-webfont": "2.17.0", - "@vitejs/plugin-vue": "4.2.2", - "@vue-macros/reactivity-transform": "0.3.6", - "@vue/compiler-sfc": "3.3.1", - "autosize": "5.0.2", + "@vitejs/plugin-vue": "4.2.3", + "@vue-macros/reactivity-transform": "0.3.7", + "@vue/compiler-sfc": "3.3.2", + "autosize": "6.0.1", "blurhash": "2.0.5", "broadcast-channel": "4.20.2", "browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3", @@ -53,7 +53,7 @@ "punycode": "2.3.0", "querystring": "0.2.1", "rndstr": "1.0.0", - "rollup": "3.21.6", + "rollup": "3.22.0", "s-age": "1.1.2", "sanitize-html": "2.10.0", "sass": "1.62.1", @@ -70,31 +70,31 @@ "typescript": "5.0.4", "uuid": "9.0.0", "vanilla-tilt": "1.8.0", - "vite": "4.3.5", - "vue": "3.3.1", + "vite": "4.3.7", + "vue": "3.3.2", "vue-plyr": "7.0.0", "vue-prism-editor": "2.0.0-alpha.2", "vuedraggable": "next" }, "devDependencies": { - "@storybook/addon-actions": "7.0.10", - "@storybook/addon-essentials": "7.0.10", - "@storybook/addon-interactions": "7.0.10", - "@storybook/addon-links": "7.0.10", - "@storybook/addon-storysource": "7.0.10", - "@storybook/addons": "7.0.10", - "@storybook/blocks": "7.0.10", - "@storybook/core-events": "7.0.10", + "@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/jest": "0.1.0", - "@storybook/manager-api": "7.0.10", - "@storybook/preview-api": "7.0.10", - "@storybook/react": "7.0.10", - "@storybook/react-vite": "7.0.10", + "@storybook/manager-api": "7.0.12", + "@storybook/preview-api": "7.0.12", + "@storybook/react": "7.0.12", + "@storybook/react-vite": "7.0.12", "@storybook/testing-library": "0.1.0", - "@storybook/theming": "7.0.10", - "@storybook/types": "7.0.10", - "@storybook/vue3": "7.0.10", - "@storybook/vue3-vite": "7.0.10", + "@storybook/theming": "7.0.12", + "@storybook/types": "7.0.12", + "@storybook/vue3": "7.0.12", + "@storybook/vue3-vite": "7.0.12", "@testing-library/jest-dom": "5.16.5", "@testing-library/vue": "7.0.0", "@types/escape-regexp": "0.0.1", @@ -103,7 +103,7 @@ "@types/gulp-rename": "2.0.2", "@types/matter-js": "0.18.3", "@types/micromatch": "4.0.2", - "@types/node": "20.1.3", + "@types/node": "20.1.7", "@types/punycode": "2.1.0", "@types/sanitize-html": "2.9.0", "@types/seedrandom": "3.0.5", @@ -116,16 +116,16 @@ "@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/parser": "5.59.5", "@vitest/coverage-c8": "0.31.0", - "@vue/runtime-core": "3.3.1", + "@vue/runtime-core": "3.3.2", "astring": "1.8.4", "chokidar-cli": "3.0.0", "cross-env": "7.0.3", "cypress": "12.12.0", "eslint": "8.40.0", "eslint-plugin-import": "2.27.5", - "eslint-plugin-vue": "9.12.0", + "eslint-plugin-vue": "9.13.0", "fast-glob": "3.2.12", - "happy-dom": "9.16.0", + "happy-dom": "9.18.3", "micromatch": "3.1.10", "msw": "1.2.1", "msw-storybook-addon": "1.8.0", @@ -133,13 +133,13 @@ "react": "18.2.0", "react-dom": "18.2.0", "start-server-and-test": "2.0.0", - "storybook": "7.0.10", + "storybook": "7.0.12", "storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme", "summaly": "github:misskey-dev/summaly", "vite-plugin-turbosnap": "1.0.2", "vitest": "0.31.0", "vitest-fetch-mock": "0.2.2", - "vue-eslint-parser": "9.2.1", - "vue-tsc": "1.6.4" + "vue-eslint-parser": "9.3.0", + "vue-tsc": "1.6.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04675a7da..f98ed0f65 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -629,16 +629,16 @@ importers: version: 14.1.2 '@rollup/plugin-alias': specifier: 5.0.0 - version: 5.0.0(rollup@3.21.6) + version: 5.0.0(rollup@3.22.0) '@rollup/plugin-json': specifier: 6.0.0 - version: 6.0.0(rollup@3.21.6) + version: 6.0.0(rollup@3.22.0) '@rollup/plugin-replace': specifier: 5.0.2 - version: 5.0.2(rollup@3.21.6) + version: 5.0.2(rollup@3.22.0) '@rollup/pluginutils': specifier: 5.0.2 - version: 5.0.2(rollup@3.21.6) + version: 5.0.2(rollup@3.22.0) '@syuilo/aiscript': specifier: 0.13.3 version: 0.13.3 @@ -646,17 +646,17 @@ importers: specifier: 2.17.0 version: 2.17.0 '@vitejs/plugin-vue': - specifier: 4.2.2 - version: 4.2.2(vite@4.3.5)(vue@3.3.1) + specifier: 4.2.3 + version: 4.2.3(vite@4.3.7)(vue@3.3.2) '@vue-macros/reactivity-transform': - specifier: 0.3.6 - version: 0.3.6(rollup@3.21.6)(vue@3.3.1) + specifier: 0.3.7 + version: 0.3.7(rollup@3.22.0)(vue@3.3.2) '@vue/compiler-sfc': - specifier: 3.3.1 - version: 3.3.1 + specifier: 3.3.2 + version: 3.3.2 autosize: - specifier: 5.0.2 - version: 5.0.2 + specifier: 6.0.1 + version: 6.0.1 blurhash: specifier: 2.0.5 version: 2.0.5 @@ -742,8 +742,8 @@ importers: specifier: 1.0.0 version: 1.0.0 rollup: - specifier: 3.21.6 - version: 3.21.6 + specifier: 3.22.0 + version: 3.22.0 s-age: specifier: 1.1.2 version: 1.1.2 @@ -793,81 +793,81 @@ importers: specifier: 1.8.0 version: 1.8.0 vite: - specifier: 4.3.5 - version: 4.3.5(@types/node@20.1.3)(sass@1.62.1) + specifier: 4.3.7 + version: 4.3.7(@types/node@20.1.7)(sass@1.62.1) vue: - specifier: 3.3.1 - version: 3.3.1 + specifier: 3.3.2 + version: 3.3.2 vue-plyr: specifier: 7.0.0 version: 7.0.0 vue-prism-editor: specifier: 2.0.0-alpha.2 - version: 2.0.0-alpha.2(vue@3.3.1) + version: 2.0.0-alpha.2(vue@3.3.2) vuedraggable: specifier: next - version: 4.1.0(vue@3.3.1) + version: 4.1.0(vue@3.3.2) devDependencies: '@storybook/addon-actions': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-essentials': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-interactions': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-links': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-storysource': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/addons': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/blocks': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': - specifier: 7.0.10 - version: 7.0.10 + specifier: 7.0.12 + version: 7.0.12 '@storybook/jest': specifier: 0.1.0 version: 0.1.0 '@storybook/manager-api': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/preview-api': - specifier: 7.0.10 - version: 7.0.10 + specifier: 7.0.12 + version: 7.0.12 '@storybook/react': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) '@storybook/react-vite': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.5) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.7) '@storybook/testing-library': specifier: 0.1.0 version: 0.1.0 '@storybook/theming': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0) '@storybook/types': - specifier: 7.0.10 - version: 7.0.10 + specifier: 7.0.12 + version: 7.0.12 '@storybook/vue3': - specifier: 7.0.10 - version: 7.0.10(vue@3.3.1) + specifier: 7.0.12 + version: 7.0.12(vue@3.3.2) '@storybook/vue3-vite': - specifier: 7.0.10 - version: 7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.5)(vue@3.3.1) + specifier: 7.0.12 + version: 7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.7)(vue@3.3.2) '@testing-library/jest-dom': specifier: 5.16.5 version: 5.16.5 '@testing-library/vue': specifier: 7.0.0 - version: 7.0.0(@vue/compiler-sfc@3.3.1)(vue@3.3.1) + version: 7.0.0(@vue/compiler-sfc@3.3.2)(vue@3.3.2) '@types/escape-regexp': specifier: 0.0.1 version: 0.0.1 @@ -887,8 +887,8 @@ importers: specifier: 4.0.2 version: 4.0.2 '@types/node': - specifier: 20.1.3 - version: 20.1.3 + specifier: 20.1.7 + version: 20.1.7 '@types/punycode': specifier: 2.1.0 version: 2.1.0 @@ -926,8 +926,8 @@ importers: specifier: 0.31.0 version: 0.31.0(vitest@0.31.0) '@vue/runtime-core': - specifier: 3.3.1 - version: 3.3.1 + specifier: 3.3.2 + version: 3.3.2 astring: specifier: 1.8.4 version: 1.8.4 @@ -947,14 +947,14 @@ importers: specifier: 2.27.5 version: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint@8.40.0) eslint-plugin-vue: - specifier: 9.12.0 - version: 9.12.0(eslint@8.40.0) + specifier: 9.13.0 + version: 9.13.0(eslint@8.40.0) fast-glob: specifier: 3.2.12 version: 3.2.12 happy-dom: - specifier: 9.16.0 - version: 9.16.0 + specifier: 9.18.3 + version: 9.18.3 micromatch: specifier: 3.1.10 version: 3.1.10 @@ -977,11 +977,11 @@ importers: specifier: 2.0.0 version: 2.0.0 storybook: - specifier: 7.0.10 - version: 7.0.10 + specifier: 7.0.12 + version: 7.0.12 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.10)(@storybook/components@7.0.10)(@storybook/core-events@7.0.10)(@storybook/manager-api@7.0.10)(@storybook/preview-api@7.0.10)(@storybook/theming@7.0.10)(@storybook/types@7.0.10)(react-dom@18.2.0)(react@18.2.0) + 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) summaly: specifier: github:misskey-dev/summaly version: github.com/misskey-dev/summaly/77dd5654bb82280b38c1f50e51a771c33f3df503 @@ -990,16 +990,16 @@ importers: version: 1.0.2 vitest: specifier: 0.31.0 - version: 0.31.0(happy-dom@9.16.0)(sass@1.62.1) + version: 0.31.0(happy-dom@9.18.3)(sass@1.62.1) vitest-fetch-mock: specifier: 0.2.2 version: 0.2.2(vitest@0.31.0) vue-eslint-parser: - specifier: 9.2.1 - version: 9.2.1(eslint@8.40.0) + specifier: 9.3.0 + version: 9.3.0(eslint@8.40.0) vue-tsc: - specifier: 1.6.4 - version: 1.6.4(typescript@5.0.4) + specifier: 1.6.5 + version: 1.6.5(typescript@5.0.4) packages/misskey-js: dependencies: @@ -2316,10 +2316,6 @@ packages: '@babel/types': 7.21.5 dev: true - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} - /@babel/helper-string-parser@7.21.5: resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} engines: {node: '>=6.9.0'} @@ -2365,19 +2361,12 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.21.4: - resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.21.4 - /@babel/parser@7.21.8: resolution: {integrity: sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.4 + '@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==} @@ -3379,9 +3368,10 @@ packages: resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.19.4 + '@babel/helper-string-parser': 7.21.5 '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.21.5: resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} @@ -3987,7 +3977,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 chalk: 4.1.2 jest-message-util: 29.5.0 jest-util: 29.5.0 @@ -4008,14 +3998,14 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 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.1.3) + jest-config: 29.5.0(@types/node@20.1.7) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -4049,7 +4039,7 @@ packages: dependencies: '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 jest-mock: 29.5.0 dev: true @@ -4076,7 +4066,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 20.1.3 + '@types/node': 20.1.7 jest-message-util: 29.5.0 jest-mock: 29.5.0 jest-util: 29.5.0 @@ -4109,7 +4099,7 @@ packages: '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 20.1.3 + '@types/node': 20.1.7 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4203,7 +4193,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.1.3 + '@types/node': 20.1.7 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -4215,12 +4205,12 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.1.3 + '@types/node': 20.1.7 '@types/yargs': 17.0.19 chalk: 4.1.2 dev: true - /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.0.4)(vite@4.3.5): + /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.0.4)(vite@4.3.7): resolution: {integrity: sha512-ou4ZJSXMMWHqGS4g8uNRbC5TiTWxAgQZiVucoUrOCWuPrTbkpJbmVyIi9jU72SBry7gQtuMEDp4YR8EEXAg7VQ==} peerDependencies: typescript: '>= 4.3.x' @@ -4234,7 +4224,7 @@ packages: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.0.4) typescript: 5.0.4 - vite: 4.3.5(@types/node@20.1.3)(sass@1.62.1) + vite: 4.3.7(@types/node@20.1.7)(sass@1.62.1) dev: true /@jridgewell/gen-mapping@0.1.1: @@ -4653,7 +4643,7 @@ packages: '@redis/client': 1.4.2 dev: true - /@rollup/plugin-alias@5.0.0(rollup@3.21.6): + /@rollup/plugin-alias@5.0.0(rollup@3.22.0): resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4662,11 +4652,11 @@ packages: rollup: optional: true dependencies: - rollup: 3.21.6 + rollup: 3.22.0 slash: 4.0.0 dev: false - /@rollup/plugin-json@6.0.0(rollup@3.21.6): + /@rollup/plugin-json@6.0.0(rollup@3.22.0): resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4675,11 +4665,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.21.6) - rollup: 3.21.6 + '@rollup/pluginutils': 5.0.2(rollup@3.22.0) + rollup: 3.22.0 dev: false - /@rollup/plugin-replace@5.0.2(rollup@3.21.6): + /@rollup/plugin-replace@5.0.2(rollup@3.22.0): resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4688,9 +4678,9 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.21.6) + '@rollup/pluginutils': 5.0.2(rollup@3.22.0) magic-string: 0.27.0 - rollup: 3.21.6 + rollup: 3.22.0 dev: false /@rollup/pluginutils@4.2.1: @@ -4701,7 +4691,7 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils@5.0.2(rollup@3.21.6): + /@rollup/pluginutils@5.0.2(rollup@3.22.0): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4713,7 +4703,7 @@ packages: '@types/estree': 1.0.1 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.21.6 + rollup: 3.22.0 dev: false /@rushstack/node-core-library@3.58.0(@types/node@18.16.3): @@ -4864,8 +4854,8 @@ packages: resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} dev: false - /@storybook/addon-actions@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-U8c7n918/mOjXnc1Iu/sglbK+ryC4xoyjWE5SG/68h0+sHb1rioNq7leAi24mCP6jNwNI5Q7TWtuvflOGxQDKQ==} + /@storybook/addon-actions@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-f07Mc3qwcG9heGsuUUTIJbWF2nw/Ite3mvyIZY2VbgwhMUMVHj4knY4fh/LojwcUmmmc7CNZu3sJN/wIqpaHCQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4875,14 +4865,14 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.10 + '@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/global': 5.0.0 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 dequal: 2.0.3 lodash: 4.17.21 polished: 4.2.2 @@ -4895,8 +4885,8 @@ packages: uuid: 9.0.0 dev: true - /@storybook/addon-backgrounds@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QtOxXO9hKtwBjjdLXWYKp4HpcpNOrLfc71dn78XbMKyCkQRlYtVe8GNk/++70UQtFfKCEJIB0hTHrPmSjDJE5A==} + /@storybook/addon-backgrounds@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sAZSxsbj3CcabowALKTafpdnqXMBZB8C42s4Uxv11FCP50GqrP8jp2TqsIiDZxUbeXwI094W/gHnw41MSphG8Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4906,22 +4896,22 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.10 + '@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/global': 5.0.0 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 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.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-j5UiPH8ZJx0ieUoIeV3iENlsIRDuQCeg3gTlLD668sebx8KHOCSJygh0Zvg1sTUUGSIbenhWaPlqfaW6ShKFWQ==} + /@storybook/addon-controls@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/+yBhswN1N7ttR1NGN94HE/25VELm4YuBtrkh+LJeKP/eQ5CZpLjexASN2GZcfmdnkwIYZAEH0X/AImLaCJAWA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4931,15 +4921,15 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.0.10 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.0.10 - '@storybook/preview-api': 7.0.10 - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4948,8 +4938,8 @@ packages: - supports-color dev: true - /@storybook/addon-docs@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1tUsJ+fuBqk4oTOBLabyPQeQYiRKs9I6+soY7dG8jN15Bxe/Ey2giNpqUkA3xAIuqS75ydRVKmsfQvILu2nLjg==} + /@storybook/addon-docs@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zgg4sq34Zz8TN74+kSogxRHsIZ5gsIazJpa0osZp91nJQvsKUEfldjBtQWbBWzjVCrWmzOhW5/RLCnmCNm9y/w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4958,19 +4948,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.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/csf-plugin': 7.0.10 - '@storybook/csf-tools': 7.0.10 + '@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/global': 5.0.0 '@storybook/mdx2-csf': 1.0.0 - '@storybook/node-logger': 7.0.10 - '@storybook/postinstall': 7.0.10 - '@storybook/preview-api': 7.0.10 - '@storybook/react-dom-shim': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 fs-extra: 11.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4981,25 +4971,25 @@ packages: - supports-color dev: true - /@storybook/addon-essentials@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nOeUtNbfLXOlgGqqqlsYC9gcYSrAxABBo8jHYiZg3xaEB9+cnKjCKK8VxrqJiR002AG5JZvi+uHeAauM94fkkQ==} + /@storybook/addon-essentials@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Js2cxvauAf8fkA5D0QrqPPe/FvpY1DbJp61VNGh82Xu0zZrczCGYP3jkWG79vl0zllJNs7hnkV8W6xY1JWgLoA==} 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.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-backgrounds': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-controls': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-docs': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-highlight': 7.0.10 - '@storybook/addon-measure': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-outline': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-toolbars': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-viewport': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.0.10 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.0.10 - '@storybook/preview-api': 7.0.10 + '@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 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 @@ -5007,16 +4997,16 @@ packages: - supports-color dev: true - /@storybook/addon-highlight@7.0.10: - resolution: {integrity: sha512-TohDxElSu7JrSvhLRZAwtNk/7Ot626wvlODwklocE4kbtn1fulFoUlRta7NImBGX554LITDFRy0m4R1rRQ9OfQ==} + /@storybook/addon-highlight@7.0.12: + resolution: {integrity: sha512-ccIsBVjUlZ7cM1adSSFTqqWXiELPdDqfZLz4dWfDbiLyG3InC953ugtvoUWCIZpC2OOnjVLpF7Rbshq2O/QoMw==} dependencies: - '@storybook/core-events': 7.0.10 + '@storybook/core-events': 7.0.12 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.10 + '@storybook/preview-api': 7.0.12 dev: true - /@storybook/addon-interactions@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7hdFgoetQblwysYwRlmC5fbMVDb6lIM6le1pVEmRci6X44Gr2Xe5w2s6h5bTp4tMpNS1CFKjru9kF/TqfK46wA==} + /@storybook/addon-interactions@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Rb1mv1RQrTd3sA/WwNTdv00rW+7APfvZEeZks6+8+kS1C4EFMDmLnVBZlPllFdo1BOnTCyer4GZZ5ncVkWNLyQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5026,16 +5016,16 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.0.10 - '@storybook/core-events': 7.0.10 + '@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/global': 5.0.0 - '@storybook/instrumenter': 7.0.10 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 jest-mock: 27.5.1 polished: 4.2.2 react: 18.2.0 @@ -5045,8 +5035,8 @@ packages: - supports-color dev: true - /@storybook/addon-links@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Odhe0eICqW9X2yyIjtOVb23cKXJ2WRxPHBm5oYf6hBBoXXK7EJicwyQSJLxJyHK7r1PeAnFxSGlNrO3w7JULjg==} + /@storybook/addon-links@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6kGClsIpX9dRKc5bUAPNcp/4wlgPIxMrieUV+6k1dTsRQqbaEfxih/Fq259D5+yVBDNi3YAnvRjMiIibl8fa5A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5056,22 +5046,22 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/core-events': 7.0.10 + '@storybook/client-logger': 7.0.12 + '@storybook/core-events': 7.0.12 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/router': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 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.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-70BQT8PM6r3qjXDgXuN5mx9CBq9dYTdEgR1tlZ8FbMi8B8tB1oZJD0o6tfGM3r8WjdI0sTwX70ic5pv9Ma/MiA==} + /@storybook/addon-measure@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Uq9cj9QmN7WKBQ6wqeneFmTqo1UQKXIc4CpGBEtJtfsYNLsERrVzOs/tRUf66Zl3lWgfFZxs1B5Ij6RDsYEjRw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5081,19 +5071,19 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.10 + '@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/global': 5.0.0 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/types': 7.0.10 + '@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 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/addon-outline@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Aakoc+II7orfgUDmjgMbnSp5HZS/47z0NeRAfh+FP4fxL0lFd9vmaeIXWYo1DjJqdEFfvlSLd8aS9Ltb+souMw==} + /@storybook/addon-outline@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-eZPkm3mECdqx1EDJ0S6DAzZ9WZLPIsZH7fRy6vdJJuAgvnOSzkt7AEpA0hlgiNyXcFpE1Cav6/g12FUf4Zo82g==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5103,20 +5093,20 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.10 + '@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/global': 5.0.0 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/types': 7.0.10 + '@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 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.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5anwqnBOcHDI/EB3F2q3Vs/JN+vCBRr8UVqnKS8NqN3BrpJ4q7jUeQ2cA0Q2/aAmdHJn9FLh/Cgx7aTO+6iC2w==} + /@storybook/addon-storysource@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-drWG7mY76eL8BwkD5KFMSxnErqF6iOZCk3bpUFGqT5uzx6oVkjmOimZHTEuHtHEi6TtK8QN5KTUi6vXzsGSGpA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5126,13 +5116,13 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/router': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/source-loader': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.0.10(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/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) estraverse: 5.3.0 prop-types: 15.8.1 react: 18.2.0 @@ -5140,8 +5130,8 @@ packages: react-syntax-highlighter: 15.5.0(react@18.2.0) dev: true - /@storybook/addon-toolbars@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-U4a45CDw4SZzrgboYVMgxyiD7Ejud1kSz2lyS+J3fGTZGXq2+tmJS/2oNrLJlSH7v8629lVUbKnFxsP0HbfShg==} + /@storybook/addon-toolbars@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7xRxk+999NVdEwzn2z1O9Tg5iuUSEXQ5jo+hiyK934VvuyqUsZnflKbSvwVEHb2W+DroaaXu8bdHWxGSH+6moQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5151,17 +5141,17 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/theming': 7.0.10(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/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) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/addon-viewport@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Ck9sdCg3T8ChXoxYL5IEi+ZUOwdH6Je5XeK4kRVq+Ar+Ytm5CFTGJCCZjI6biroTnuJCUefaV2K5NUZoHkZI+A==} + /@storybook/addon-viewport@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pMgqtDQF8e9AErnRKbbSK9m1lcKn1dFSOkk0PgSBwIIjmha6q+GeT45EHQrQGtkLdtWT0iTktC8ivzIiGKmHkg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5171,49 +5161,49 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.10 + '@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/global': 5.0.0 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/theming': 7.0.10(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) 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.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-RRtozbB0JovZdLgTgC03kOjNh/5sAN77VHZFC5aK/Y9Hz2A0C6V4w/SqTt0382skSllcGMcrHjB1k06BlxlZ8A==} + /@storybook/addons@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yVADbWCFdb12cSpspeb+/6lfTNarPtZZLql49Bhu6E7PxECw/Q3kfHu0LXBLcSnU7f4QqQvQjp88ultt01ABBQ==} 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.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/types': 7.0.10 + '@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 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/blocks@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OqXuN1x2TjXgrOqGSaD0Vz8iCqmLjiPkrQpWMD7bToFpHH0dpmcrzzRhLhxgJLN2CAzyr98IYIkUgXX9Da1neA==} + /@storybook/blocks@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MbJKjuTJ7xVbkUVwkEwb6vTYGrkRk4+Xtx1UGo+512o91ubqFs8hXwCHP+x/49RCIIQs5zl93Ig8fTtm+MejWw==} 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.10 - '@storybook/client-logger': 7.0.10 - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.10 + '@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/csf': 0.1.0 - '@storybook/docs-tools': 7.0.10 + '@storybook/docs-tools': 7.0.12 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 '@types/lodash': 4.14.191 color-convert: 2.0.1 dequal: 2.0.3 @@ -5231,13 +5221,13 @@ packages: - supports-color dev: true - /@storybook/builder-manager@7.0.10: - resolution: {integrity: sha512-izCVE4JEbDVN5DPkX/Ym1PifAJKlheBvXKmGXGklnJQ2l+TEuvesPbOmVFNuu7ptJAFw4JO5n2KAo9+a5FRwiw==} + /@storybook/builder-manager@7.0.12: + resolution: {integrity: sha512-bkZPSDH38/dUSsO087oQ8+goyaEDP/xD0/O61QcQ8EbaVeT6s6Qt7mMhqsLrtmEZHvPMQwKeIXhOJlRNNXB+SA==} dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.0.10 - '@storybook/manager': 7.0.10 - '@storybook/node-logger': 7.0.10 + '@storybook/core-common': 7.0.12 + '@storybook/manager': 7.0.12 + '@storybook/node-logger': 7.0.12 '@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) @@ -5254,8 +5244,8 @@ packages: - supports-color dev: true - /@storybook/builder-vite@7.0.10(typescript@5.0.4)(vite@4.3.5): - resolution: {integrity: sha512-tKY2QnHni10TE3+Sy2wfR7h4FuribR849VBpDI/LcwtRkCgoOBfMCdEnAKMWyU6qAlY+9KDSOQq9SDTu3WZGOg==} + /@storybook/builder-vite@7.0.12(typescript@5.0.4)(vite@4.3.7): + resolution: {integrity: sha512-6FJNXis+dYs/KrhfRQgz8HcRw/Oq4FaEghCwsjngQDy4PcpQuxkDbvGJKlBaSr92vUL36FWSPq8u5+VGCHjh5Q==} peerDependencies: '@preact/preset-vite': '*' typescript: '>= 4.3.x' @@ -5269,16 +5259,16 @@ packages: vite-plugin-glimmerx: optional: true dependencies: - '@storybook/channel-postmessage': 7.0.10 - '@storybook/channel-websocket': 7.0.10 - '@storybook/client-logger': 7.0.10 - '@storybook/core-common': 7.0.10 - '@storybook/csf-plugin': 7.0.10 + '@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/mdx2-csf': 1.0.0 - '@storybook/node-logger': 7.0.10 - '@storybook/preview': 7.0.10 - '@storybook/preview-api': 7.0.10 - '@storybook/types': 7.0.10 + '@storybook/node-logger': 7.0.12 + '@storybook/preview': 7.0.12 + '@storybook/preview-api': 7.0.12 + '@storybook/types': 7.0.12 browser-assert: 1.2.1 es-module-lexer: 0.9.3 express: 4.18.2 @@ -5288,19 +5278,19 @@ packages: magic-string: 0.27.0 remark-external-links: 8.0.0 remark-slug: 6.1.0 - rollup: 3.21.6 + rollup: 3.22.0 typescript: 5.0.4 - vite: 4.3.5(@types/node@20.1.3)(sass@1.62.1) + vite: 4.3.7(@types/node@20.1.7)(sass@1.62.1) transitivePeerDependencies: - supports-color dev: true - /@storybook/channel-postmessage@7.0.10: - resolution: {integrity: sha512-Y5ZSp9WYH3HznQ2rrGN78Y5fYM16Bfvyn3iKy5QD38gsQk1gTrra1osIZ0X+lk3sep14D4oW4QMW3DCSrn0Big==} + /@storybook/channel-postmessage@7.0.12: + resolution: {integrity: sha512-Tc7kQZ5yxlZ44Nmmzec92JaDJ6UZ3Ze4cBfiHik4XcnM1PtN8hr8VFoC6a2AIm1ybfIRenfT5w9TH5yriiPIhw==} dependencies: - '@storybook/channels': 7.0.10 - '@storybook/client-logger': 7.0.10 - '@storybook/core-events': 7.0.10 + '@storybook/channels': 7.0.12 + '@storybook/client-logger': 7.0.12 + '@storybook/core-events': 7.0.12 '@storybook/global': 5.0.0 qs: 6.11.1 telejson: 7.0.4 @@ -5328,17 +5318,17 @@ packages: telejson: 7.0.4 dev: true - /@storybook/channel-websocket@7.0.10: - resolution: {integrity: sha512-WXueykS71YxEqKlsIbbmmA6QSChEePffzqs7QASUpHhi21IDqmtq2HhAqYWlQptyqSWYdv6wxrOqwe6z4zakLA==} + /@storybook/channel-websocket@7.0.12: + resolution: {integrity: sha512-UV6b9gX2mQLtXlKaFKCHcy+6MaK2od6BYqSJfainnBjDsMIXyhcf7fJaj0XQkJrbNnRBwGhw+6s8JxL98xp7Ew==} dependencies: - '@storybook/channels': 7.0.10 - '@storybook/client-logger': 7.0.10 + '@storybook/channels': 7.0.12 + '@storybook/client-logger': 7.0.12 '@storybook/global': 5.0.0 telejson: 7.0.4 dev: true - /@storybook/channels@7.0.10: - resolution: {integrity: sha512-hdPaGV3W7s6MkVcg33S5hmkVgqXC16AA7H0ID9MROiU1lQzolKhSqCs2iVfGPQfmWzEJeqWQoEXU7dmCclRM0w==} + /@storybook/channels@7.0.12: + resolution: {integrity: sha512-KDdDmDs8kxAJU+vndTqTNazjLO+XoIPiTRlfP7mk7cgHiQXSjMYy3JSCQ7W0of0Q+9VSl/ve9CNbnGbcQF7rNQ==} dev: true /@storybook/channels@7.0.2: @@ -5349,20 +5339,20 @@ packages: resolution: {integrity: sha512-+34cVmrXZ3lb1s5tDK+OWd5HLtEPSUMas0VKFJ0k9LBpFlVl9aiCZBJRvSYmWL7beauUfa+HSmJgjlD6228ChQ==} dev: true - /@storybook/cli@7.0.10: - resolution: {integrity: sha512-FhtE6Yrk7MMa9AgLb3MTmqiQ3IlWHjjrj7Vcj2QM6BcP342xSe7C1d+V6+tYX/oPOEB3Upz+PKNrju1iHxurQQ==} + /@storybook/cli@7.0.12: + resolution: {integrity: sha512-OABCRIujxsszIJ0CCpKg8Uj4C1UlAwBpBQhv2aMX3lA/pur6Od524syv2ypWu6J2FyvK/ooeyMbjoP7330cIuA==} 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.10 - '@storybook/core-common': 7.0.10 - '@storybook/core-server': 7.0.10 - '@storybook/csf-tools': 7.0.10 - '@storybook/node-logger': 7.0.10 - '@storybook/telemetry': 7.0.10 - '@storybook/types': 7.0.10 + '@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 '@types/semver': 7.5.0 boxen: 5.1.2 chalk: 4.1.2 @@ -5398,8 +5388,8 @@ packages: - utf-8-validate dev: true - /@storybook/client-logger@7.0.10: - resolution: {integrity: sha512-hb8tO+w28ErzjEw69ERMtZT81Xyg835FQjH6Y42ejoGcBA9Z0W6RZmx4RgkcIUOlYXkU6lSnNVne9gXodV4/Hw==} + /@storybook/client-logger@7.0.12: + resolution: {integrity: sha512-MQMtIgGEgdixvxnBvZ2m8hhc0DGJWeCpHtxg7oqBLBEBmCYFueTqDZHl4Z6SoCrK0a2YS5X/BIXOcEtP1ulMKw==} dependencies: '@storybook/global': 5.0.0 dev: true @@ -5416,16 +5406,16 @@ packages: '@storybook/global': 5.0.0 dev: true - /@storybook/codemod@7.0.10: - resolution: {integrity: sha512-BnPknLV3wnaSk0azjFBAWLVfwgUHtFvVk9I6y1idIaQhc0nnegKoa0jTxWigthftZK/Pv9yG3gxG7o7O4KcChQ==} + /@storybook/codemod@7.0.12: + resolution: {integrity: sha512-eGbGZSglvbnY1omzRyEC4XP0FbpuCFKgjXmdHn9faGQUU5EJHwcGYYrRW8JZL3nEVIvNDuRAKzM3p0BVo1xeSQ==} 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.10 - '@storybook/node-logger': 7.0.10 - '@storybook/types': 7.0.10 + '@storybook/csf-tools': 7.0.12 + '@storybook/node-logger': 7.0.12 + '@storybook/types': 7.0.12 cross-spawn: 7.0.3 globby: 11.1.0 jscodeshift: 0.14.0(@babel/preset-env@7.21.4) @@ -5436,17 +5426,17 @@ packages: - supports-color dev: true - /@storybook/components@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-jdGiVP+a3XqoGpKkDFGt4g2cgb23aLfMS/RhnuhT7FK6hGh7WFfuuqx4QqQHx4VZCdXIWVIzszaCdGCs7AsW2w==} + /@storybook/components@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6TxByzYS4+LxwZRioGpP6Zh9If5ctjQs5OnR2UmQvP6HDjmMWYTntoHKIbDwAL9C6MrnQYpPOGCPkqrtODQ4/w==} 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.10 + '@storybook/client-logger': 7.0.12 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@storybook/theming': 7.0.12(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.12 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5454,18 +5444,18 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/core-client@7.0.10: - resolution: {integrity: sha512-sN/TKB7QHWP6josdjyNtoqDXihROPtgvzo5+akfW6+S7hhfsQ4BJd09nkBqEX9E7z81blmFFDUOU3a8bQbPdKQ==} + /@storybook/core-client@7.0.12: + resolution: {integrity: sha512-m0r+Vl3LfU8cJl8UqIwzh0sEN9I//nMaT8UIIm481AINhQTNihQcnYi9jRw7USjfz2fv5CYkg8cEr4KhI8QlRA==} dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/preview-api': 7.0.10 + '@storybook/client-logger': 7.0.12 + '@storybook/preview-api': 7.0.12 dev: true - /@storybook/core-common@7.0.10: - resolution: {integrity: sha512-AAYXixukGlpMy8XoSM8cTfcyQ6ijBq5q50xNTj/ssTbGnGSk6POgtoJZf6g8XtS0OxsFXBSxuBuMBBBbKtoztw==} + /@storybook/core-common@7.0.12: + resolution: {integrity: sha512-PFVjYXHUxDQO1oqfqwQe7S3XoLNO0aZYEr9Zl0LiexlxxnU1v+TQjEfNd/H3T0xxpXlsgzhtEcagdzJeAKyh2g==} dependencies: - '@storybook/node-logger': 7.0.10 - '@storybook/types': 7.0.10 + '@storybook/node-logger': 7.0.12 + '@storybook/types': 7.0.12 '@types/node': 16.18.16 '@types/pretty-hrtime': 1.0.1 chalk: 4.1.2 @@ -5487,8 +5477,8 @@ packages: - supports-color dev: true - /@storybook/core-events@7.0.10: - resolution: {integrity: sha512-OyBqhxVQOdI78Vgv6nKwXOdIVNChyfktpdxQZP1rz9MpO6MrqMaGAUL7k8xQMQAVx0VY+dAMYZB3bnyN2IC8FA==} + /@storybook/core-events@7.0.12: + resolution: {integrity: sha512-VTmb/zjbz3o1bg+bATzLigVXMVDC/S1FP8CqIrz4mkiys52139FGzMandL2Y2AecPZPGss7ZRdfma28HKVYTRg==} dev: true /@storybook/core-events@7.0.2: @@ -5499,23 +5489,23 @@ packages: resolution: {integrity: sha512-kGrtjlYtjd4iTVk+Phb4CymZaVkB+MGscKAgcO8gfgJ/Q/gq8HQLVZSIzeoCDcDSHOGlBzbg2WVtdHIHhCKlOQ==} dev: true - /@storybook/core-server@7.0.10: - resolution: {integrity: sha512-KFCc3turPed8tiC5IUKTV7oObVmFckMP1XqO7zec2g2NlGQsN83DRso+BA1wpV/bb8AD1NJDU6LJnyN3KKdi1Q==} + /@storybook/core-server@7.0.12: + resolution: {integrity: sha512-X35Kmg7y35Ph4J+gCDJrnVgBwlz4/DzOQofUS6rAbi4KvrPWDJXeM2OzOgx6B0abKl4CeMmjuc0tjbg4vbUFuA==} dependencies: '@aw-web-design/x-default-browser': 1.4.88 '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.0.10 - '@storybook/core-common': 7.0.10 - '@storybook/core-events': 7.0.10 + '@storybook/builder-manager': 7.0.12 + '@storybook/core-common': 7.0.12 + '@storybook/core-events': 7.0.12 '@storybook/csf': 0.1.0 - '@storybook/csf-tools': 7.0.10 + '@storybook/csf-tools': 7.0.12 '@storybook/docs-mdx': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager': 7.0.10 - '@storybook/node-logger': 7.0.10 - '@storybook/preview-api': 7.0.10 - '@storybook/telemetry': 7.0.10 - '@storybook/types': 7.0.10 + '@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 '@types/detect-port': 1.3.2 '@types/node': 16.18.16 '@types/node-fetch': 2.6.2 @@ -5551,24 +5541,24 @@ packages: - utf-8-validate dev: true - /@storybook/csf-plugin@7.0.10: - resolution: {integrity: sha512-uUty5rLs6O32tJaXIne2/42UxFL3eaRCDgtAoAkGxbUPa/FLYpO0rYtqF2OG9MagwXU7+As5RlLkDLeYAvUzlQ==} + /@storybook/csf-plugin@7.0.12: + resolution: {integrity: sha512-iiH0ynLQV5BYFc0o7RlSJS2S3GT/ffyfbV4rnCnPKdqyo4REEVvmhOuLhwzurtsXsjh+xF6VUYUDN+8/5mbkYw==} dependencies: - '@storybook/csf-tools': 7.0.10 + '@storybook/csf-tools': 7.0.12 unplugin: 0.10.2 transitivePeerDependencies: - supports-color dev: true - /@storybook/csf-tools@7.0.10: - resolution: {integrity: sha512-sl/995jq03HD7/Q9cb54h0glgt7JLGTkfikSlB35NGMEkgEXEswDmpQHA/TbzUYylIxuAwTKghwMqL3IwSSHwA==} + /@storybook/csf-tools@7.0.12: + resolution: {integrity: sha512-EcDzKeENzs4awyjx0VxlONDLibiEtIPDP1XdOCcZGtv3nXXBFtS2WDsYhJHkwyvE37jWTyw2e4xKQmBi0Hjvbw==} dependencies: '@babel/generator': 7.21.3 '@babel/parser': 7.21.8 '@babel/traverse': 7.21.3 '@babel/types': 7.21.5 '@storybook/csf': 0.1.0 - '@storybook/types': 7.0.10 + '@storybook/types': 7.0.12 fs-extra: 11.1.0 recast: 0.23.1 ts-dedent: 2.2.0 @@ -5586,13 +5576,13 @@ packages: resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} dev: true - /@storybook/docs-tools@7.0.10: - resolution: {integrity: sha512-w3m7+LlQGI50i07XjiOzIfoap8rnmsrs8hXGUTodbs9vvLt8HBdUaapOGnYr/1BzA0YQJ7Nz2z1nTirQEphmsQ==} + /@storybook/docs-tools@7.0.12: + resolution: {integrity: sha512-+HykeQLgjyDyF9G7HqY0FHXlX7X5YpQcmNjftJzBrc/GO1EeO0M78d54avcOPyyTfuWOh7oZtSJ0MzjA1qrqaQ==} dependencies: '@babel/core': 7.21.3 - '@storybook/core-common': 7.0.10 - '@storybook/preview-api': 7.0.10 - '@storybook/types': 7.0.10 + '@storybook/core-common': 7.0.12 + '@storybook/preview-api': 7.0.12 + '@storybook/types': 7.0.12 '@types/doctrine': 0.0.3 doctrine: 3.0.0 lodash: 4.17.21 @@ -5610,14 +5600,14 @@ packages: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} dev: true - /@storybook/instrumenter@7.0.10: - resolution: {integrity: sha512-Z+kIidnxaq3tneUnIKB2d0DCqb4lwUdOS/AC43LNvd9C6BWYgj89cIPdLDTNhOWa0ZiEju7wTS+K/3uMvcHZ4w==} + /@storybook/instrumenter@7.0.12: + resolution: {integrity: sha512-jx4rb4AMT1YIOpE0HCdfyLvpYU+94wPkC9vt7sZGWAp7nnYG+KO/lx3XCJaR9qQPIxVYejJtWkeGn4RID79SoQ==} dependencies: - '@storybook/channels': 7.0.10 - '@storybook/client-logger': 7.0.10 - '@storybook/core-events': 7.0.10 + '@storybook/channels': 7.0.12 + '@storybook/client-logger': 7.0.12 + '@storybook/core-events': 7.0.12 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.10 + '@storybook/preview-api': 7.0.12 dev: true /@storybook/instrumenter@7.0.2: @@ -5649,20 +5639,20 @@ packages: jest-mock: 27.5.1 dev: true - /@storybook/manager-api@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Dik73GKUX9QCFOvukTXjZoZX0G6n/LrRMkwLggb28E9m8iFt2ivWvF9MVvyRoDffR9VP5t53+nV5fqxqpXWoQw==} + /@storybook/manager-api@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3QXARtxpc6Xxqf5pviUw2UuhK53+IsINSljeWhAqdQ1Gzbywl67TpibTd7xVN6NKxhUH5Bzo9bIZTAzMZGqaKw==} 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.10 - '@storybook/client-logger': 7.0.10 - '@storybook/core-events': 7.0.10 + '@storybook/channels': 7.0.12 + '@storybook/client-logger': 7.0.12 + '@storybook/core-events': 7.0.12 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/router': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 @@ -5674,16 +5664,16 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/manager@7.0.10: - resolution: {integrity: sha512-cFMOOXmcRx1tN50TqC2huOsF91fAvNM82wTDnAbT2FtA+ZHFHNyE1PgWgiKDDepzOpKaG+FfT4bJcQAaAfYOBg==} + /@storybook/manager@7.0.12: + resolution: {integrity: sha512-19BsDcwJOYXn6zEarxvNGDdYLUqZyhX92x6GPHSC4cf8BoxHuhmtnz5vOTZHusCxkKIu/C9W0H6wH2Ma47kDCg==} dev: true /@storybook/mdx2-csf@1.0.0: resolution: {integrity: sha512-dBAnEL4HfxxJmv7LdEYUoZlQbWj9APZNIbOaq0tgF8XkxiIbzqvgB0jhL/9UOrysSDbQWBiCRTu2wOVxedGfmw==} dev: true - /@storybook/node-logger@7.0.10: - resolution: {integrity: sha512-btCCreucTApi7EP84jbfqlFQZDD4Kz9lFLftalZA7nskDZW6i8reNNykTU2Y22TQvlbpqs5kL1N1cEsbG3vepw==} + /@storybook/node-logger@7.0.12: + resolution: {integrity: sha512-VL+NXzc9NuOP6/9alg4Sofz9kh8tmlo3p+UtCIYCHH088yCsB3XsNhkG9lF1C5EZVWcuHxc2u6MMF3ezOjvKfQ==} dependencies: '@types/npmlog': 4.1.4 chalk: 4.1.2 @@ -5691,20 +5681,20 @@ packages: pretty-hrtime: 1.0.3 dev: true - /@storybook/postinstall@7.0.10: - resolution: {integrity: sha512-SVPKGuuvfn1MceLWzYHGbpP77+waLKXglAH4Gkdoa2mKdk3XO45Zn8OhwwNzHuP698boMNaGaB/utBLBpkXMMg==} + /@storybook/postinstall@7.0.12: + resolution: {integrity: sha512-RKNvBLgABBTQwvGyF2jX4vP7OMLB3KvEEOQDoeOKjqyWfekDn5smI+eT714mtmKIH0YMcwmvzLgEdZkjmM/XhA==} dev: true - /@storybook/preview-api@7.0.10: - resolution: {integrity: sha512-URj2YJKbs8hc6JZQ3aA+MmjB4hTSzGZAVFVs3kLUEuaQPDbU1RT5GKxedwF5zlMnkZQPNoaUtopN3z7aF+SKFQ==} + /@storybook/preview-api@7.0.12: + resolution: {integrity: sha512-YI/AfHszIOYt967fsRlc7j6I0zZB+RSsBwD/nMA8y9vszdpQ0MgRhxHgQxFf6cgqbuQcdCsnTIpT0iQ4GHjDXg==} dependencies: - '@storybook/channel-postmessage': 7.0.10 - '@storybook/channels': 7.0.10 - '@storybook/client-logger': 7.0.10 - '@storybook/core-events': 7.0.10 + '@storybook/channel-postmessage': 7.0.12 + '@storybook/channels': 7.0.12 + '@storybook/client-logger': 7.0.12 + '@storybook/core-events': 7.0.12 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/types': 7.0.10 + '@storybook/types': 7.0.12 '@types/qs': 6.9.7 dequal: 2.0.3 lodash: 4.17.21 @@ -5755,12 +5745,12 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/preview@7.0.10: - resolution: {integrity: sha512-IQX8v7OpKeo2Oqeyxo6/uSRys+dJ7zms12jViJWGzx9fg6IchV/iNtf4TBrF3Z2JBNKovk03kICAMHTpZuz9Qg==} + /@storybook/preview@7.0.12: + resolution: {integrity: sha512-za8El/nnkyAo/uqyqAg7PMuP6DSdPoEnDRyIk4LzY7sAGly6i4Uge377cdo1nUBQLS5S4kKIc4xf8TUegb3G1Q==} dev: true - /@storybook/react-dom-shim@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-NLuE2Be/BGmXHufwLp1Gje+IsTb0HWvwzHlci2U430WgwGU8fsTPNgALMrwCpqN9o1KnrRGpysQEoyIYStQBdg==} + /@storybook/react-dom-shim@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4z9J54TD7uphxPqSuLEzeKTV4oF8Fmv8qFfnT0XZJ2mpYTC2NTbkYoYZQ8N0eYzvNOk6xgfpDqBdmIANf4NaYw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5769,25 +5759,25 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-vite@7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.5): - resolution: {integrity: sha512-ZEwRpMEJAQtMruG/XGha52XHkb3extXudWT5SoXOcfiRy9eK7Y3oJwHR8KHNH3LE+LrRh7c+D53k7eMudRtsNA==} + /@storybook/react-vite@7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.7): + resolution: {integrity: sha512-SIszevqIKOW+5TwzNposDI+3giSZNVZ7HSu7u2JEpu0Iw/CWyYI06rUgH2ft8Xluhb8vEorZKiZjsdiQDVo64w==} engines: {node: '>=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: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.0.4)(vite@4.3.5) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.0.4)(vite@4.3.7) '@rollup/pluginutils': 4.2.1 - '@storybook/builder-vite': 7.0.10(typescript@5.0.4)(vite@4.3.5) - '@storybook/react': 7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) - '@vitejs/plugin-react': 3.1.0(vite@4.3.5) + '@storybook/builder-vite': 7.0.12(typescript@5.0.4)(vite@4.3.7) + '@storybook/react': 7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) + '@vitejs/plugin-react': 3.1.0(vite@4.3.7) 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.5(@types/node@20.1.3)(sass@1.62.1) + vite: 4.3.7(@types/node@20.1.7)(sass@1.62.1) transitivePeerDependencies: - '@preact/preset-vite' - supports-color @@ -5795,8 +5785,8 @@ packages: - vite-plugin-glimmerx dev: true - /@storybook/react@7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4): - resolution: {integrity: sha512-/DDUGFz0bk5c/HCfSr7fL74rQc+3s317TDDKY6ZrgUzdIkze4D/TlAbWV78XV/ceeFNi1fLAUzGjFzuDwmVkJw==} + /@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==} engines: {node: '>=16.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5806,13 +5796,13 @@ packages: typescript: optional: true dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/core-client': 7.0.10 - '@storybook/docs-tools': 7.0.10 + '@storybook/client-logger': 7.0.12 + '@storybook/core-client': 7.0.12 + '@storybook/docs-tools': 7.0.12 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.10 - '@storybook/react-dom-shim': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 '@types/node': 16.18.16 @@ -5834,27 +5824,27 @@ packages: - supports-color dev: true - /@storybook/router@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Vq3nuyrGsvbPYhsaVu0TwtzX8Yb5TZYg7v5gY/uk1brSIk7Mvw64E8WF4TKNhPcWnlxNrfP9S96IZgT9iuuCpw==} + /@storybook/router@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dOtBiCBGeDem86BCWR7AlTVQjoBk0yw/XZLXS9qcpUfpe+UDjd0Rh21ZdEEMHG1Wfu4d2AhhG5l/JSJ1IE83jQ==} 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.10 + '@storybook/client-logger': 7.0.12 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.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-DtdYllq0piU6vgoVjsuPsWaGlhSOJgJr/kRovu5zltaZzdEOyQZ7e0zQmA4Py0h9jnGbg2fQG9zccofY3jUdJw==} + /@storybook/source-loader@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dIT4uHiEFgIX/W1aYpKazeu+8GN2OljQsB84oO6Ea887f3emmVJRBGwvoChSAZH+ps2zGput88Lby+W5Paesow==} 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.10 + '@storybook/types': 7.0.12 estraverse: 5.3.0 lodash: 4.17.21 prettier: 2.8.8 @@ -5862,11 +5852,11 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/telemetry@7.0.10: - resolution: {integrity: sha512-0xlMECcSU2UnmpDTxKE/+pKpcW88fhxEZxh54yoA6NPpq6SGUN1r5ybUMffJCZ0JgaQ8HOc3Vxd13T3VXAMLXA==} + /@storybook/telemetry@7.0.12: + resolution: {integrity: sha512-oxqe15bn5W+1pLpLjXTfj3H+YPZq3jExjdJwTCUHtFrrsNs0k6dyqAUk8qTOUqOTclANHb6vlNBFJDvZ6qbfEQ==} dependencies: - '@storybook/client-logger': 7.0.10 - '@storybook/core-common': 7.0.10 + '@storybook/client-logger': 7.0.12 + '@storybook/core-common': 7.0.12 chalk: 4.1.2 detect-package-manager: 2.0.1 fetch-retry: 5.0.4 @@ -5889,24 +5879,24 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/theming@7.0.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kKxIMElOUAyIAJOlhU6NS6/F6KpZLWvfGnUYC5V4f5Rsu+lKnbWI/TJ1rCIooz2wZBQ6dv+fjA3sOh5K+LRh2w==} + /@storybook/theming@7.0.12(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-frBkvH7LF8j23ODaywLK4m4LLscw49oKblkZ+30QZkBAzRf2o3a/QSZW2V1zfBo7ygcXiUJ5bIjh7Y17mMJqbQ==} 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.10 + '@storybook/client-logger': 7.0.12 '@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.10: - resolution: {integrity: sha512-mFktvN8PjjDFJSjck4spikmjtr0AwfOhcEtIf4UCmUD5JHgGppkQmvO6483nGcprSFcWOvD2uYGs8Wp32wG/MQ==} + /@storybook/types@7.0.12: + resolution: {integrity: sha512-nlvU4MyO2grwPCRQ8alA3AnY1bQxGJ6A4QgJu+1MhtjVenifFlxOQX4H1OiA+YXfjlV096oO5LrxvetJPFAKKQ==} dependencies: - '@storybook/channels': 7.0.10 + '@storybook/channels': 7.0.12 '@types/babel__core': 7.20.0 '@types/express': 4.17.17 file-system-cache: 2.0.2 @@ -5930,23 +5920,23 @@ packages: file-system-cache: 2.0.2 dev: true - /@storybook/vue3-vite@7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.5)(vue@3.3.1): - resolution: {integrity: sha512-BbA6uLlNFIpSBW9UAJ9e96yCGGoMho0pogEbkzoRLdw/0OoqDqnRMue78CwW5eiIWXYjNZb3UwAyh9VgYqKk5g==} + /@storybook/vue3-vite@7.0.12(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.7)(vue@3.3.2): + resolution: {integrity: sha512-SdAGfBRfm4cR9VNLRcBCLo3rTzeUTvZfyh5ll0cgInCo9gTxwfs1Y4zEmmVqDDOWQ7qlpJanITNGFGiSsdvRmg==} 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.10(typescript@5.0.4)(vite@4.3.5) - '@storybook/core-server': 7.0.10 - '@storybook/vue3': 7.0.10(vue@3.3.1) - '@vitejs/plugin-vue': 4.2.2(vite@4.3.5)(vue@3.3.1) + '@storybook/builder-vite': 7.0.12(typescript@5.0.4)(vite@4.3.7) + '@storybook/core-server': 7.0.12 + '@storybook/vue3': 7.0.12(vue@3.3.2) + '@vitejs/plugin-vue': 4.2.3(vite@4.3.7)(vue@3.3.2) magic-string: 0.27.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - vite: 4.3.5(@types/node@20.1.3)(sass@1.62.1) - vue-docgen-api: 4.64.1(vue@3.3.1) + vite: 4.3.7(@types/node@20.1.7)(sass@1.62.1) + vue-docgen-api: 4.64.1(vue@3.3.2) transitivePeerDependencies: - '@preact/preset-vite' - bufferutil @@ -5958,20 +5948,20 @@ packages: - vue dev: true - /@storybook/vue3@7.0.10(vue@3.3.1): - resolution: {integrity: sha512-B4DW/lR9Am06RJM3TGrIgIYzurG6tsgUX9EQ6rQRDFd4EWw1bskcG8MrNwFBBiDBnXe1frL4AdDidF47CFStNg==} + /@storybook/vue3@7.0.12(vue@3.3.2): + resolution: {integrity: sha512-zxRhuuNcM9hT1/s968iHL+diqFqRmpwvEoI7rF1yje09saMck+PFStlE8b/ohQeDtm0GdwVqjbzfHZIdPbivYg==} engines: {node: '>=16.0.0'} peerDependencies: vue: ^3.0.0 dependencies: - '@storybook/core-client': 7.0.10 - '@storybook/docs-tools': 7.0.10 + '@storybook/core-client': 7.0.12 + '@storybook/docs-tools': 7.0.12 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.10 - '@storybook/types': 7.0.10 + '@storybook/preview-api': 7.0.12 + '@storybook/types': 7.0.12 ts-dedent: 2.2.0 type-fest: 2.19.0 - vue: 3.3.1 + vue: 3.3.2 transitivePeerDependencies: - supports-color dev: true @@ -6323,7 +6313,7 @@ packages: '@testing-library/dom': 8.20.0 dev: true - /@testing-library/vue@7.0.0(@vue/compiler-sfc@3.3.1)(vue@3.3.1): + /@testing-library/vue@7.0.0(@vue/compiler-sfc@3.3.2)(vue@3.3.2): resolution: {integrity: sha512-JU/q93HGo2qdm1dCgWymkeQlfpC0/0/DBZ2nAHgEAsVZxX11xVIxT7gbXdI7HACQpUbsUWt1zABGU075Fzt9XQ==} engines: {node: '>=14'} peerDependencies: @@ -6332,9 +6322,9 @@ packages: dependencies: '@babel/runtime': 7.21.0 '@testing-library/dom': 9.2.0 - '@vue/compiler-sfc': 3.3.1 - '@vue/test-utils': 2.3.2(vue@3.3.1) - vue: 3.3.1 + '@vue/compiler-sfc': 3.3.2 + '@vue/test-utils': 2.3.2(vue@3.3.2) + vue: 3.3.2 dev: true /@tokenizer/token@0.3.0: @@ -6373,8 +6363,8 @@ packages: /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 @@ -6407,7 +6397,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: true /@types/braces@3.0.1: @@ -6427,7 +6417,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.1.3 + '@types/node': 20.1.7 '@types/responselike': 1.0.0 dev: false @@ -6460,7 +6450,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: true /@types/content-disposition@0.5.5: @@ -6525,7 +6515,7 @@ packages: /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -6553,27 +6543,27 @@ packages: resolution: {integrity: sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==} dependencies: '@types/glob': 8.1.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.1.3 + '@types/node': 20.1.7 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.1.3 + '@types/node': 20.1.7 dev: true /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: true /@types/gulp-rename@2.0.1: @@ -6586,7 +6576,7 @@ packages: /@types/gulp-rename@2.0.2: resolution: {integrity: sha512-CQsXqTVtAXqrPd4IbrrlJEEzRkUR3RXsyZbrVoOVqjlchDDmnyRDatAUisjpQjjCg/wjJrSiNg8T1uAbJ/7Qqg==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 '@types/vinyl': 2.0.7 dev: true @@ -6665,7 +6655,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: false /@types/lodash@4.14.191: @@ -6713,7 +6703,7 @@ packages: /@types/node-fetch@2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 form-data: 3.0.1 /@types/node-fetch@3.0.3: @@ -6743,6 +6733,10 @@ packages: /@types/node@20.1.3: resolution: {integrity: sha512-NP2yfZpgmf2eDRPmgGq+fjGjSwFgYbihA8/gK+ey23qT9RkxsgNTZvGOEpXgzIGqesTYkElELLgtKoMQTys5vA==} + dev: true + + /@types/node@20.1.7: + resolution: {integrity: sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==} /@types/nodemailer@6.4.7: resolution: {integrity: sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==} @@ -6833,7 +6827,7 @@ packages: /@types/readdir-glob@1.1.1: resolution: {integrity: sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: true /@types/redis@4.0.11: @@ -6849,7 +6843,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: false /@types/sanitize-html@2.9.0: @@ -6877,7 +6871,7 @@ packages: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: true /@types/serviceworker@0.0.67: @@ -6887,7 +6881,7 @@ packages: /@types/set-cookie-parser@2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: true /@types/sharp@0.32.0: @@ -6952,7 +6946,7 @@ packages: /@types/undertaker@1.2.8: resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 '@types/undertaker-registry': 1.0.1 async-done: 1.3.2 dev: true @@ -6981,7 +6975,7 @@ packages: resolution: {integrity: sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==} dependencies: '@types/glob-stream': 6.1.1 - '@types/node': 20.1.3 + '@types/node': 20.1.7 '@types/vinyl': 2.0.7 dev: true @@ -6989,7 +6983,7 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 20.1.3 + '@types/node': 20.1.7 /@types/web-push@3.3.2: resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==} @@ -7037,7 +7031,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 dev: true optional: true @@ -7171,7 +7165,7 @@ packages: eslint-visitor-keys: 3.4.1 dev: true - /@vitejs/plugin-react@3.1.0(vite@4.3.5): + /@vitejs/plugin-react@3.1.0(vite@4.3.7): resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -7182,20 +7176,20 @@ 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.5(@types/node@20.1.3)(sass@1.62.1) + vite: 4.3.7(@types/node@20.1.7)(sass@1.62.1) transitivePeerDependencies: - supports-color dev: true - /@vitejs/plugin-vue@4.2.2(vite@4.3.5)(vue@3.3.1): - resolution: {integrity: sha512-kNH4wMAqs13UiZe/2If1ioO0Mjz71rr2oALTl2c5ajBIox9Vz/UGW/wGkr7GA3SC6Eb29c1HtzAtxdGfbXAkfQ==} + /@vitejs/plugin-vue@4.2.3(vite@4.3.7)(vue@3.3.2): + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.3.5(@types/node@20.1.3)(sass@1.62.1) - vue: 3.3.1 + vite: 4.3.7(@types/node@20.1.7)(sass@1.62.1) + vue: 3.3.2 /@vitest/coverage-c8@0.31.0(vitest@0.31.0): resolution: {integrity: sha512-h72qN1D962AO7UefQVulm9JFP5ACS7OfhCdBHioXU8f7ohH/+NTZCgAqmgcfRNHHO/8wLFxx+93YVxhodkEJVA==} @@ -7207,7 +7201,7 @@ packages: magic-string: 0.30.0 picocolors: 1.0.0 std-env: 3.3.2 - vitest: 0.31.0(happy-dom@9.16.0)(sass@1.62.1) + vitest: 0.31.0(happy-dom@9.18.3)(sass@1.62.1) dev: true /@vitest/expect@0.31.0: @@ -7261,8 +7255,8 @@ packages: muggle-string: 0.2.2 dev: true - /@volar/typescript@1.4.1(typescript@5.0.4): - resolution: {integrity: sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==} + /@volar/typescript@1.4.1-patch.2(typescript@5.0.4): + resolution: {integrity: sha512-lPFYaGt8OdMEzNGJJChF40uYqMO4Z/7Q9fHPQC/NRVtht43KotSXLrkPandVVMf9aPbiJ059eAT+fwHGX16k4w==} peerDependencies: typescript: '*' dependencies: @@ -7270,31 +7264,31 @@ packages: typescript: 5.0.4 dev: true - /@volar/vue-language-core@1.6.4: - resolution: {integrity: sha512-1o+cAtN2DIDNAX/HS8rkjZc8wTMTK+zCab/qtYbvEVlmokhZiDrQeoD9/l0Ug7YCNg+mVuMNHKNBY7pX8U2/Jw==} + /@volar/vue-language-core@1.6.5: + resolution: {integrity: sha512-IF2b6hW4QAxfsLd5mePmLgtkXzNi+YnH6ltCd80gb7+cbdpFMjM1I+w+nSg2kfBTyfu+W8useCZvW89kPTBpzg==} dependencies: '@volar/language-core': 1.4.1 '@volar/source-map': 1.4.1 - '@vue/compiler-dom': 3.3.1 - '@vue/compiler-sfc': 3.3.1 - '@vue/reactivity': 3.3.1 - '@vue/shared': 3.3.1 + '@vue/compiler-dom': 3.3.2 + '@vue/compiler-sfc': 3.3.2 + '@vue/reactivity': 3.3.2 + '@vue/shared': 3.3.2 minimatch: 9.0.0 muggle-string: 0.2.2 vue-template-compiler: 2.7.14 dev: true - /@volar/vue-typescript@1.6.4(typescript@5.0.4): - resolution: {integrity: sha512-qKwgP0KVQR/aaH/SN3AP7RB8NnXPWDn3tjyXP6IT6etxkDeZLBLsXWUD9KMak/RvV1DgbXDuz4F9yuZlbt29rA==} + /@volar/vue-typescript@1.6.5(typescript@5.0.4): + resolution: {integrity: sha512-er9rVClS4PHztMUmtPMDTl+7c7JyrxweKSAEe/o/Noeq2bQx6v3/jZHVHBe8ZNUti5ubJL/+Tg8L3bzmlalV8A==} peerDependencies: typescript: '*' dependencies: - '@volar/typescript': 1.4.1(typescript@5.0.4) - '@volar/vue-language-core': 1.6.4 + '@volar/typescript': 1.4.1-patch.2(typescript@5.0.4) + '@volar/vue-language-core': 1.6.5 typescript: 5.0.4 dev: true - /@vue-macros/common@1.3.1(rollup@3.21.6)(vue@3.3.1): + /@vue-macros/common@1.3.1(rollup@3.22.0)(vue@3.3.2): resolution: {integrity: sha512-Lc5aP/8HNJD1XrnvpeNuWcCf82bZdR3auN/chA1b/1rKZgSnmQkH9f33tKO9qLwXSy+u4hpCi8Rw+oUuF1KCeg==} engines: {node: '>=14.19.0'} peerDependencies: @@ -7304,28 +7298,28 @@ packages: optional: true dependencies: '@babel/types': 7.21.5 - '@rollup/pluginutils': 5.0.2(rollup@3.21.6) - '@vue/compiler-sfc': 3.3.1 + '@rollup/pluginutils': 5.0.2(rollup@3.22.0) + '@vue/compiler-sfc': 3.3.2 local-pkg: 0.4.3 magic-string-ast: 0.1.2 - vue: 3.3.1 + vue: 3.3.2 transitivePeerDependencies: - rollup dev: false - /@vue-macros/reactivity-transform@0.3.6(rollup@3.21.6)(vue@3.3.1): - resolution: {integrity: sha512-PFJRXHEdIP03LeNnfcwjUk8pKWjvyeOZjCNwbLgfqunI9tknG4IQMfl86qswK83f+DoOTMCoeMFoUnmlbr+yUw==} + /@vue-macros/reactivity-transform@0.3.7(rollup@3.22.0)(vue@3.3.2): + resolution: {integrity: sha512-o+u5qstvUjNoaZjr4lUtNf5MuLgQHikvurnk6b2DFd9nB52j+BqOhI22uyn6K6TTAU0i0/PxT5YgwDlwVdvEUw==} engines: {node: '>=14.19.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 dependencies: '@babel/parser': 7.21.8 - '@vue-macros/common': 1.3.1(rollup@3.21.6)(vue@3.3.1) + '@vue-macros/common': 1.3.1(rollup@3.22.0)(vue@3.3.2) '@vue/compiler-core': 3.3.1 - '@vue/shared': 3.3.1 + '@vue/shared': 3.3.2 magic-string: 0.30.0 unplugin: 1.3.1 - vue: 3.3.1 + vue: 3.3.2 transitivePeerDependencies: - rollup dev: false @@ -7337,12 +7331,21 @@ packages: '@vue/shared': 3.3.1 estree-walker: 2.0.2 source-map-js: 1.0.2 + dev: false - /@vue/compiler-dom@3.3.1: - resolution: {integrity: sha512-VmgIsoLivCft3+oNc5KM7b9wd0nZxP/g2qilMwi1hJyGA624KWnNKHn4hzBQs4FpzydUVpNy+TWVT8KiRCh3MQ==} + /@vue/compiler-core@3.3.2: + resolution: {integrity: sha512-CKZWo1dzsQYTNTft7whzjL0HsrEpMfiK7pjZ2WFE3bC1NA7caUjWioHSK+49y/LK7Bsm4poJZzAMnvZMQ7OTeg==} dependencies: - '@vue/compiler-core': 3.3.1 - '@vue/shared': 3.3.1 + '@babel/parser': 7.21.8 + '@vue/shared': 3.3.2 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + + /@vue/compiler-dom@3.3.2: + resolution: {integrity: sha512-6gS3auANuKXLw0XH6QxkWqyPYPunziS2xb6VRenM3JY7gVfZcJvkCBHkb5RuNY1FCbBO3lkIi0CdXUCW1c7SXw==} + dependencies: + '@vue/compiler-core': 3.3.2 + '@vue/shared': 3.3.2 /@vue/compiler-sfc@2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} @@ -7352,75 +7355,79 @@ packages: source-map: 0.6.1 dev: false - /@vue/compiler-sfc@3.3.1: - resolution: {integrity: sha512-G+FPwBbXSLaA4+Ry5/bdD9Oda+sRslQcE9o6JSZaougRiT4OjVL0vtkbQHPrGRTULZV28OcrAjRfSZOSB0OTXQ==} + /@vue/compiler-sfc@3.3.2: + resolution: {integrity: sha512-jG4jQy28H4BqzEKsQqqW65BZgmo3vzdLHTBjF+35RwtDdlFE+Fk1VWJYUnDMMqkFBo6Ye1ltSKVOMPgkzYj7SQ==} dependencies: - '@babel/parser': 7.21.4 - '@vue/compiler-core': 3.3.1 - '@vue/compiler-dom': 3.3.1 - '@vue/compiler-ssr': 3.3.1 - '@vue/reactivity-transform': 3.3.1 - '@vue/shared': 3.3.1 + '@babel/parser': 7.21.8 + '@vue/compiler-core': 3.3.2 + '@vue/compiler-dom': 3.3.2 + '@vue/compiler-ssr': 3.3.2 + '@vue/reactivity-transform': 3.3.2 + '@vue/shared': 3.3.2 estree-walker: 2.0.2 magic-string: 0.30.0 postcss: 8.4.23 source-map-js: 1.0.2 - /@vue/compiler-ssr@3.3.1: - resolution: {integrity: sha512-QOQWGNCWuSeyKx4KvWSJlnIMGg+/2oCHgkFUYo7aJ+9Uaaz45yRgKQ+FNigy50NYBQIhpXn2e4OSR8GXh4knrQ==} + /@vue/compiler-ssr@3.3.2: + resolution: {integrity: sha512-K8OfY5FQtZaSOJHHe8xhEfIfLrefL/Y9frv4k4NsyQL3+0lRKxr9QuJhfdBDjkl7Fhz8CzKh63mULvmOfx3l2w==} dependencies: - '@vue/compiler-dom': 3.3.1 - '@vue/shared': 3.3.1 + '@vue/compiler-dom': 3.3.2 + '@vue/shared': 3.3.2 - /@vue/reactivity-transform@3.3.1: - resolution: {integrity: sha512-MkOrJauAGH4MNdxGW/PmrDegMyOGX0wGIdKUZJRBXOTpotDONg7/TPJe2QeGeBCow/5v9iOqZOWCfvmOWIaDMg==} + /@vue/reactivity-transform@3.3.2: + resolution: {integrity: sha512-iu2WaQvlJHdnONrsyv4ibIEnSsuKF+aHFngGj/y1lwpHQtalpVhKg9wsKMoiKXS9zPNjG9mNKzJS9vudvjzvyg==} dependencies: '@babel/parser': 7.21.8 - '@vue/compiler-core': 3.3.1 - '@vue/shared': 3.3.1 + '@vue/compiler-core': 3.3.2 + '@vue/shared': 3.3.2 estree-walker: 2.0.2 magic-string: 0.30.0 - /@vue/reactivity@3.3.1: - resolution: {integrity: sha512-zCfmazOtyUdC1NS/EPiSYJ4RqojqmTAviJyBbyVvY8zAv5NhK44Yfw0E1tt+m5vz0ZO1ptI9jDKBr3MWIEkpgw==} + /@vue/reactivity@3.3.2: + resolution: {integrity: sha512-yX8C4uTgg2Tdj+512EEMnMKbLveoITl7YdQX35AYgx8vBvQGszKiiCN46g4RY6/deeo/5DLbeUUGxCq1qWMf5g==} dependencies: - '@vue/shared': 3.3.1 + '@vue/shared': 3.3.2 - /@vue/runtime-core@3.3.1: - resolution: {integrity: sha512-Ljb37LYafhQqKIasc0r32Cva8gIh6VeSMjlwO6V03tCjHd18gmjP0F4UD+8/a59sGTysAgA8Rb9lIC2DVxRz2Q==} + /@vue/runtime-core@3.3.2: + resolution: {integrity: sha512-qSl95qj0BvKfcsO+hICqFEoLhJn6++HtsPxmTkkadFbuhe3uQfJ8HmQwvEr7xbxBd2rcJB6XOJg7nWAn/ymC5A==} dependencies: - '@vue/reactivity': 3.3.1 - '@vue/shared': 3.3.1 + '@vue/reactivity': 3.3.2 + '@vue/shared': 3.3.2 - /@vue/runtime-dom@3.3.1: - resolution: {integrity: sha512-NBjYbQPtMklb7lsJsM2Juv5Ygry6mvZP7PdH1GZqrzfLkvlplQT3qCtQMd/sib6yiy8t9m/Y4hVU7X9nzb9Oeg==} + /@vue/runtime-dom@3.3.2: + resolution: {integrity: sha512-+drStsJT+0mtgHdarT7cXZReCcTFfm6ptxMrz0kAW5hms6UNBd8Q1pi4JKlncAhu+Ld/TevsSp7pqAZxBBoGng==} dependencies: - '@vue/runtime-core': 3.3.1 - '@vue/shared': 3.3.1 + '@vue/runtime-core': 3.3.2 + '@vue/shared': 3.3.2 csstype: 3.1.1 - /@vue/server-renderer@3.3.1(vue@3.3.1): - resolution: {integrity: sha512-sod8ggOwbkQXw3lBjfzrbdxRS9lw/lNHoMaXghHawNYowf+4WoaLWD5ouz6fPZadUqNKAsqK95p8DYb1vcVfPA==} + /@vue/server-renderer@3.3.2(vue@3.3.2): + resolution: {integrity: sha512-QCwh6OGwJg6GDLE0fbQhRTR6tnU+XDJ1iCsTYHXBiezCXAhqMygFRij7BiLF4ytvvHcg5kX9joX5R5vP85++wg==} peerDependencies: - vue: 3.3.1 + vue: 3.3.2 dependencies: - '@vue/compiler-ssr': 3.3.1 - '@vue/shared': 3.3.1 - vue: 3.3.1 + '@vue/compiler-ssr': 3.3.2 + '@vue/shared': 3.3.2 + vue: 3.3.2 /@vue/shared@3.3.1: resolution: {integrity: sha512-ybDBtQ+479HL/bkeIOIAwgpeAEACzztkvulJLbK3JMFuTOv4qDivmV3AIsR8RHYJ+RD9tQxcHWBsX4GqEcYrfw==} + dev: false - /@vue/test-utils@2.3.2(vue@3.3.1): + /@vue/shared@3.3.2: + resolution: {integrity: sha512-0rFu3h8JbclbnvvKrs7Fe5FNGV9/5X2rPD7KmOzhLSUAiQH5//Hq437Gv0fR5Mev3u/nbtvmLl8XgwCU20/ZfQ==} + + /@vue/test-utils@2.3.2(vue@3.3.2): resolution: {integrity: sha512-hJnVaYhbrIm0yBS0+e1Y0Sj85cMyAi+PAbK4JHqMRUZ6S622Goa+G7QzkRSyvCteG8wop7tipuEbHoZo26wsSA==} peerDependencies: vue: ^3.0.1 dependencies: js-beautify: 1.14.6 - vue: 3.3.1 + vue: 3.3.2 optionalDependencies: - '@vue/compiler-dom': 3.3.1 - '@vue/server-renderer': 3.3.1(vue@3.3.1) + '@vue/compiler-dom': 3.3.2 + '@vue/server-renderer': 3.3.2(vue@3.3.2) dev: true /@webgpu/types@0.1.30: @@ -8113,8 +8120,8 @@ packages: postcss-value-parser: 3.3.1 dev: false - /autosize@5.0.2: - resolution: {integrity: sha512-FPVt5ynkqUAA9gcMZnJHka1XfQgr1WNd/yRfIjmj5WGmjua+u5Hl9hn8M2nU5CNy2bEIcj1ZUwXq7IOHsfZG9w==} + /autosize@6.0.1: + resolution: {integrity: sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==} dev: false /autwh@0.1.0: @@ -8289,7 +8296,7 @@ packages: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.21.5 /bach@1.2.0: resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==} @@ -9435,8 +9442,8 @@ packages: /constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} @@ -10551,8 +10558,8 @@ packages: - supports-color dev: true - /eslint-plugin-vue@9.12.0(eslint@8.40.0): - resolution: {integrity: sha512-xH8PgpDW2WwmFSmRfs/3iWogef1CJzQqX264I65zz77jDuxF2yLy7+GA2diUM8ZNATuSl1+UehMQkb5YEyau5w==} + /eslint-plugin-vue@9.13.0(eslint@8.40.0): + resolution: {integrity: sha512-aBz9A8WB4wmpnVv0pYUt86cmH9EkcwWzgEwecBxMoRNhQjTL5i4sqadnwShv/hOdr8Hbl8XANGV7dtX9UQIAyA==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 @@ -10563,7 +10570,7 @@ packages: nth-check: 2.1.1 postcss-selector-parser: 6.0.11 semver: 7.5.0 - vue-eslint-parser: 9.2.1(eslint@8.40.0) + vue-eslint-parser: 9.3.0(eslint@8.40.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -12050,6 +12057,18 @@ packages: webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 + dev: false + + /happy-dom@9.18.3: + resolution: {integrity: sha512-b7iMGYeIXvUryNultA0AHEVU0FPpb2djJ/xSVlMDfP7HG4z7FomdqkCEpWtSv1zDL+t1gRUoBbpqFCoUBvjYtg==} + dependencies: + css.escape: 1.5.1 + entities: 4.5.0 + iconv-lite: 0.6.3 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + dev: true /har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} @@ -13130,7 +13149,7 @@ packages: '@jest/expect': 29.5.0 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -13284,6 +13303,45 @@ packages: - supports-color dev: true + /jest-config@29.5.0(@types/node@20.1.7): + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.3 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 20.1.7 + babel-jest: 29.5.0(@babel/core@7.21.3) + chalk: 4.1.2 + ci-info: 3.7.1 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-diff@28.1.3: resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13329,7 +13387,7 @@ packages: '@jest/environment': 29.5.0 '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 jest-mock: 29.5.0 jest-util: 29.5.0 dev: true @@ -13359,7 +13417,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.6 - '@types/node': 20.1.3 + '@types/node': 20.1.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13410,7 +13468,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.1.3 + '@types/node': 20.1.7 dev: true /jest-mock@29.5.0: @@ -13473,7 +13531,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -13504,7 +13562,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -13559,7 +13617,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 chalk: 4.1.2 ci-info: 3.7.1 graceful-fs: 4.2.11 @@ -13584,7 +13642,7 @@ packages: dependencies: '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 20.1.3 + '@types/node': 20.1.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -13603,7 +13661,7 @@ packages: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -17444,8 +17502,8 @@ packages: seedrandom: 2.4.2 dev: false - /rollup@3.21.6: - resolution: {integrity: sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==} + /rollup@3.22.0: + resolution: {integrity: sha512-imsigcWor5Y/dC0rz2q0bBt9PabcL3TORry2hAa6O6BuMvY71bqHyfReAz5qyAqiQATD1m70qdntqBfBQjVWpQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -18248,11 +18306,11 @@ packages: resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} dev: true - /storybook@7.0.10: - resolution: {integrity: sha512-L36+Um+Ra8AKTvv84ODFJfuthmWnR1Lc6pjslcb8LYO+PVlqEOeqSknmTcKntDYwgvKx5lg62urtJxzGdwO0yw==} + /storybook@7.0.12: + resolution: {integrity: sha512-HKi7NQQTZhBGEU3KUFxTNGtIZcG8+hokiO5TwcIr7s7smAVKdvj9vY5YGsVkiWF39o+5UtafW1B/i9D8lBFsYg==} hasBin: true dependencies: - '@storybook/cli': 7.0.10 + '@storybook/cli': 7.0.12 transitivePeerDependencies: - bufferutil - encoding @@ -19598,7 +19656,7 @@ packages: replace-ext: 1.0.1 dev: false - /vite-node@0.31.0(@types/node@20.1.3)(sass@1.62.1): + /vite-node@0.31.0(@types/node@20.1.7)(sass@1.62.1): resolution: {integrity: sha512-8x1x1LNuPvE2vIvkSB7c1mApX5oqlgsxzHQesYF7l5n1gKrEmrClIiZuOFbFDQcjLsmcWSwwmrWrcGWm9Fxc/g==} engines: {node: '>=v14.18.0'} hasBin: true @@ -19608,7 +19666,7 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.3.5(@types/node@20.1.3)(sass@1.62.1) + vite: 4.3.7(@types/node@20.1.7)(sass@1.62.1) transitivePeerDependencies: - '@types/node' - less @@ -19623,8 +19681,8 @@ packages: resolution: {integrity: sha512-irjKcKXRn7v5bPAg4mAbsS6DgibpP1VUFL9tlgxU6lloK6V9yw9qCZkS+s2PtbkZpWNzr3TN3zVJAc6J7gJZmA==} dev: true - /vite@4.3.5(@types/node@20.1.3)(sass@1.62.1): - resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==} + /vite@4.3.7(@types/node@20.1.7)(sass@1.62.1): + resolution: {integrity: sha512-MTIFpbIm9v7Hh5b0wSBgkcWzSBz7SAa6K/cBTwS4kUiQJfQLFlZZRJRQgqunCVzhTPCk674tW+0Qaqh3Q00dBg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -19648,10 +19706,10 @@ packages: terser: optional: true dependencies: - '@types/node': 20.1.3 + '@types/node': 20.1.7 esbuild: 0.17.18 postcss: 8.4.23 - rollup: 3.21.6 + rollup: 3.22.0 sass: 1.62.1 optionalDependencies: fsevents: 2.3.2 @@ -19663,12 +19721,12 @@ packages: vitest: '>=0.16.0' dependencies: cross-fetch: 3.1.5 - vitest: 0.31.0(happy-dom@9.16.0)(sass@1.62.1) + vitest: 0.31.0(happy-dom@9.18.3)(sass@1.62.1) transitivePeerDependencies: - encoding dev: true - /vitest@0.31.0(happy-dom@9.16.0)(sass@1.62.1): + /vitest@0.31.0(happy-dom@9.18.3)(sass@1.62.1): resolution: {integrity: sha512-JwWJS9p3GU9GxkG7eBSmr4Q4x4bvVBSswaCFf1PBNHiPx00obfhHRJfgHcnI0ffn+NMlIh9QGvG75FlaIBdKGA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -19701,7 +19759,7 @@ packages: dependencies: '@types/chai': 4.3.4 '@types/chai-subset': 1.3.3 - '@types/node': 20.1.3 + '@types/node': 20.1.7 '@vitest/expect': 0.31.0 '@vitest/runner': 0.31.0 '@vitest/snapshot': 0.31.0 @@ -19713,7 +19771,7 @@ packages: chai: 4.3.7 concordance: 5.0.4 debug: 4.3.4(supports-color@8.1.1) - happy-dom: 9.16.0 + happy-dom: 9.18.3 local-pkg: 0.4.3 magic-string: 0.30.0 pathe: 1.1.0 @@ -19722,8 +19780,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.4.0 tinypool: 0.5.0 - vite: 4.3.5(@types/node@20.1.3)(sass@1.62.1) - vite-node: 0.31.0(@types/node@20.1.3)(sass@1.62.1) + vite: 4.3.7(@types/node@20.1.7)(sass@1.62.1) + vite-node: 0.31.0(@types/node@20.1.7)(sass@1.62.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -19738,26 +19796,26 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} - /vue-docgen-api@4.64.1(vue@3.3.1): + /vue-docgen-api@4.64.1(vue@3.3.2): resolution: {integrity: sha512-jbOf7ByE3Zvtuk+429Jorl+eIeh2aB2Fx1GUo3xJd1aByJWE8KDlSEa6b11PB1ze8f0sRUBraRDinICCk0KY7g==} dependencies: '@babel/parser': 7.21.8 - '@babel/types': 7.21.4 - '@vue/compiler-dom': 3.3.1 - '@vue/compiler-sfc': 3.3.1 + '@babel/types': 7.21.5 + '@vue/compiler-dom': 3.3.2 + '@vue/compiler-sfc': 3.3.2 ast-types: 0.14.2 hash-sum: 2.0.0 lru-cache: 8.0.4 pug: 3.0.2 recast: 0.22.0 ts-map: 1.0.3 - vue-inbrowser-compiler-independent-utils: 4.64.1(vue@3.3.1) + vue-inbrowser-compiler-independent-utils: 4.64.1(vue@3.3.2) transitivePeerDependencies: - vue dev: true - /vue-eslint-parser@9.2.1(eslint@8.40.0): - resolution: {integrity: sha512-tPOex4n6jit4E7h68auOEbDMwE58XiP4dylfaVTCOVCouR45g+QFDBjgIdEU52EXJxKyjgh91dLfN2rxUcV0bQ==} + /vue-eslint-parser@9.3.0(eslint@8.40.0): + resolution: {integrity: sha512-48IxT9d0+wArT1+3wNIy0tascRoywqSUe2E1YalIC1L8jsUGe5aJQItWfRok7DVFGz3UYvzEI7n5wiTXsCMAcQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' @@ -19774,12 +19832,12 @@ packages: - supports-color dev: true - /vue-inbrowser-compiler-independent-utils@4.64.1(vue@3.3.1): + /vue-inbrowser-compiler-independent-utils@4.64.1(vue@3.3.2): resolution: {integrity: sha512-Hn32n07XZ8j9W8+fmOXPQL+i+W2e/8i6mkH4Ju3H6nR0+cfvmWM95GhczYi5B27+Y8JlCKgAo04IUiYce4mKAw==} peerDependencies: vue: '>=2' dependencies: - vue: 3.3.1 + vue: 3.3.2 dev: true /vue-plyr@7.0.0: @@ -19789,13 +19847,13 @@ packages: vue: 2.7.14 dev: false - /vue-prism-editor@2.0.0-alpha.2(vue@3.3.1): + /vue-prism-editor@2.0.0-alpha.2(vue@3.3.2): resolution: {integrity: sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==} engines: {node: '>=10'} peerDependencies: vue: ^3.0.0 dependencies: - vue: 3.3.1 + vue: 3.3.2 dev: false /vue-template-compiler@2.7.14: @@ -19805,14 +19863,14 @@ packages: he: 1.2.0 dev: true - /vue-tsc@1.6.4(typescript@5.0.4): - resolution: {integrity: sha512-8rg8S1AhRJ6/WriENQEhyqH5wsxSxuD5iaD+QnkZn2ArZ6evlhqfBAIcVN8mfSyCV9DeLkQXkOSv/MaeJiJPAQ==} + /vue-tsc@1.6.5(typescript@5.0.4): + resolution: {integrity: sha512-Wtw3J7CC+JM2OR56huRd5iKlvFWpvDiU+fO1+rqyu4V2nMTotShz4zbOZpW5g9fUOcjnyZYfBo5q5q+D/q27JA==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/vue-language-core': 1.6.4 - '@volar/vue-typescript': 1.6.4(typescript@5.0.4) + '@volar/vue-language-core': 1.6.5 + '@volar/vue-typescript': 1.6.5(typescript@5.0.4) semver: 7.5.0 typescript: 5.0.4 dev: true @@ -19824,22 +19882,22 @@ packages: csstype: 3.1.1 dev: false - /vue@3.3.1: - resolution: {integrity: sha512-3Rwy4I5idbPVSDZu6I+fFh6tdDSZbauImCTqLxE7y0LpHtiDvPeY01OI7RkFPbva1nk4hoO0sv/NzosH2h60sg==} + /vue@3.3.2: + resolution: {integrity: sha512-98hJcAhyDwZoOo2flAQBSPVYG/o0HA9ivIy2ktHshjE+6/q8IMQ+kvDKQzOZTFPxvnNMcGM+zS2A00xeZMA7tA==} dependencies: - '@vue/compiler-dom': 3.3.1 - '@vue/compiler-sfc': 3.3.1 - '@vue/runtime-dom': 3.3.1 - '@vue/server-renderer': 3.3.1(vue@3.3.1) - '@vue/shared': 3.3.1 + '@vue/compiler-dom': 3.3.2 + '@vue/compiler-sfc': 3.3.2 + '@vue/runtime-dom': 3.3.2 + '@vue/server-renderer': 3.3.2(vue@3.3.2) + '@vue/shared': 3.3.2 - /vuedraggable@4.1.0(vue@3.3.1): + /vuedraggable@4.1.0(vue@3.3.2): resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==} peerDependencies: vue: ^3.0.1 dependencies: sortablejs: 1.14.0 - vue: 3.3.1 + vue: 3.3.2 dev: false /w3c-xmlserializer@4.0.0: @@ -20054,8 +20112,8 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 @@ -20362,7 +20420,7 @@ packages: sharp: 0.31.3 dev: false - github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.0.10)(@storybook/components@7.0.10)(@storybook/core-events@7.0.10)(@storybook/manager-api@7.0.10)(@storybook/preview-api@7.0.10)(@storybook/theming@7.0.10)(@storybook/types@7.0.10)(react-dom@18.2.0)(react@18.2.0): + 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): 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 @@ -20383,13 +20441,13 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/components': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.10 - '@storybook/manager-api': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.10 - '@storybook/theming': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.10 + '@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 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true From 747d323584a288a7e6e98849ff9dae4b61753cb8 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, 17 May 2023 07:39:36 +0000 Subject: [PATCH 34/54] ci: fix breaking on foreign repos --- .github/workflows/storybook.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml index b04f4260c..8ca28c2ba 100644 --- a/.github/workflows/storybook.yml +++ b/.github/workflows/storybook.yml @@ -16,12 +16,19 @@ jobs: steps: - uses: actions/checkout@v3.3.0 + if: github.event_name != 'pull_request_target' with: fetch-depth: 0 submodules: true - - name: Checkout HEAD + - uses: actions/checkout@v3.3.0 if: github.event_name == 'pull_request_target' - run: git checkout ${{ github.head_ref }} + with: + fetch-depth: 0 + submodules: true + ref: "refs/pull/${{ github.event.number }}/merge" + - name: Checkout actual HEAD + if: github.event_name == 'pull_request_target' + run: git checkout $(git rev-list --parents -n1 HEAD | cut -d" " -f3) - name: Install pnpm uses: pnpm/action-setup@v2 with: From 45263f4cd013c89da302435f5baca2d965a4a634 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, 17 May 2023 07:51:45 +0000 Subject: [PATCH 35/54] ci: stop MkGalleryPostPreview snapshot --- .../src/components/MkGalleryPostPreview.stories.impl.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/frontend/src/components/MkGalleryPostPreview.stories.impl.ts b/packages/frontend/src/components/MkGalleryPostPreview.stories.impl.ts index 57b3e7551..72ac0a58f 100644 --- a/packages/frontend/src/components/MkGalleryPostPreview.stories.impl.ts +++ b/packages/frontend/src/components/MkGalleryPostPreview.stories.impl.ts @@ -44,6 +44,10 @@ export const Default = { ], parameters: { layout: 'centered', + chromatic: { + // FIXME: flaky + disableSnapshot: true, + }, }, } satisfies StoryObj; export const Hover = { From dd60f1a53381ab55cd82e0697da7e20eb252bd9b Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 17 May 2023 20:00:28 +0000 Subject: [PATCH 36/54] =?UTF-8?q?fix(frontend/MkUrlPreview):=20summaly?= =?UTF-8?q?=E3=81=8C=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AB=E3=81=AA=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E9=9A=9B=E3=81=AE=E6=8C=99=E5=8B=95=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + locales/ja-JP.yml | 1 + .../frontend/src/components/MkUrlPreview.vue | 30 ++++++++++++++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a20120b48..2ea1c2842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ ### Client - 開発者モードを追加 - AiScriptを0.13.3に更新 +- Fix: URLプレビューで情報が取得できなかった際の挙動を修正 ## 13.12.2 diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 340698a12..264908482 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1048,6 +1048,7 @@ preventAiLearning: "生成AIによる学習を拒否" preventAiLearningDescription: "外部の文章生成AIや画像生成AIに対して、投稿したノートや画像などのコンテンツを学習の対象にしないように要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されますが、この要求に従うかはそのAI次第であるため、学習を完全に防止するものではありません。" options: "オプション" specifyUser: "ユーザー指定" +failedToPreviewUrl: "プレビューできません" _initialAccountSetting: accountCreated: "アカウントの作成が完了しました!" diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue index 9c5622b1c..23be81432 100644 --- a/packages/frontend/src/components/MkUrlPreview.vue +++ b/packages/frontend/src/components/MkUrlPreview.vue @@ -41,14 +41,14 @@

{{ title }}

-

{{ i18n.ts.cannotLoad }}

+

{{ i18n.ts.failedToPreviewUrl }}

{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}

-

?

+

{{ requestUrl.host }}

-

{{ sitename }}

+

{{ sitename ?? requestUrl.host }}

@@ -128,17 +128,33 @@ if (requestUrl.hostname === 'music.youtube.com' && requestUrl.pathname.match('^/ requestUrl.hash = ''; -window.fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${versatileLang}`).then(res => { - res.json().then((info: SummalyResult) => { +window.fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${versatileLang}`) + .then(res => { + if (!res.ok) { + fetching = false; + unknownUrl = true; + return; + } + + return res.json(); + }) + .then((info: SummalyResult) => { + if (info.url == null) { + fetching = false; + unknownUrl = true; + return; + } + + fetching = false; + unknownUrl = false; + title = info.title; description = info.description; thumbnail = info.thumbnail; icon = info.icon; sitename = info.sitename; - fetching = false; player = info.player; }); -}); function adjustTweetHeight(message: any) { if (message.origin !== 'https://platform.twitter.com') return; From 6bb82cda37f56432a527a812a90b73861e38788a 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: Thu, 18 May 2023 14:16:07 +0900 Subject: [PATCH 37/54] ci: use actual base --- .github/workflows/storybook.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml index 8ca28c2ba..72528f95b 100644 --- a/.github/workflows/storybook.yml +++ b/.github/workflows/storybook.yml @@ -28,7 +28,10 @@ jobs: ref: "refs/pull/${{ github.event.number }}/merge" - name: Checkout actual HEAD if: github.event_name == 'pull_request_target' - run: git checkout $(git rev-list --parents -n1 HEAD | cut -d" " -f3) + id: rev + run: | + echo "base=$(git rev-list --parents -n1 HEAD | cut -d" " -f2)" >> $GITHUB_OUTPUT + git checkout $(git rev-list --parents -n1 HEAD | cut -d" " -f3) - name: Install pnpm uses: pnpm/action-setup@v2 with: @@ -75,7 +78,7 @@ jobs: if: github.event_name == 'pull_request_target' id: chromatic_pull_request run: | - DIFF="${{ github.base_ref }} HEAD" + DIFF="${{ steps.rev.outputs.base }} HEAD" if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then DIFF="HEAD" fi From 6173cebdca246f9e1b496d66c237ce4afc60dc31 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: Thu, 18 May 2023 08:05:09 +0000 Subject: [PATCH 38/54] ci: remove deprecated notifications --- .github/workflows/storybook.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml index 72528f95b..a9a5be758 100644 --- a/.github/workflows/storybook.yml +++ b/.github/workflows/storybook.yml @@ -101,18 +101,6 @@ jobs: commit_sha: context.sha, body: 'Chromatic detects changes. Please [review the changes on Chromatic](https://www.chromatic.com/builds?appId=6428f7d7b962f0b79f97d6e4).' }) - - name: Notify that Chromatic will skip testing - uses: actions/github-script@v6.4.0 - if: github.event_name == 'pull_request_target' && steps.chromatic_pull_request.outputs.skip == 'true' - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: 'Chromatic will skip testing but you may still have to [review the changes on Chromatic](https://www.chromatic.com/pullrequests?appId=6428f7d7b962f0b79f97d6e4).' - }) - name: Upload Artifacts uses: actions/upload-artifact@v3 with: From 9b5b3a4d1b887ff29ce79f1639886f3c69def54f Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 May 2023 18:18:25 +0900 Subject: [PATCH 39/54] perf(backend): pre-compile regexp --- packages/backend/src/core/ReactionService.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts index a274b19e4..2184cfeb4 100644 --- a/packages/backend/src/core/ReactionService.ts +++ b/packages/backend/src/core/ReactionService.ts @@ -54,6 +54,9 @@ type DecodedReaction = { host?: string | null; }; +const isCustomEmojiRegexp = /^:([\w+-]+)(?:@\.)?:$/; +const decodeCustomEmojiRegexp = /^:([\w+-]+)(?:@([\w.-]+))?:$/; + @Injectable() export class ReactionService { constructor( @@ -306,7 +309,7 @@ export class ReactionService { return unicode.match('\u200d') ? unicode : unicode.replace(/\ufe0f/g, ''); } - const custom = reaction.match(/^:([\w+-]+)(?:@\.)?:$/); + const custom = reaction.match(isCustomEmojiRegexp); if (custom) { const name = custom[1]; const emoji = reacterHost == null @@ -324,7 +327,7 @@ export class ReactionService { @bindThis public decodeReaction(str: string): DecodedReaction { - const custom = str.match(/^:([\w+-]+)(?:@([\w.-]+))?:$/); + const custom = str.match(decodeCustomEmojiRegexp); if (custom) { const name = custom[1]; From 7ce569424a67c786a4f44993ce74f06989eba9df Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 May 2023 18:45:49 +0900 Subject: [PATCH 40/54] =?UTF-8?q?feat:=20=E3=82=AB=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=A0=E7=B5=B5=E6=96=87=E5=AD=97=E3=81=94=E3=81=A8=E3=81=AB?= =?UTF-8?q?=E3=81=9D=E3=82=8C=E3=82=92=E3=83=AA=E3=82=A2=E3=82=AF=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=81=A8=E3=81=97=E3=81=A6=E4=BD=BF=E3=81=88?= =?UTF-8?q?=E3=82=8B=E3=83=AD=E3=83=BC=E3=83=AB=E3=82=92=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=81=A7=E3=81=8D=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 --- CHANGELOG.md | 1 + locales/ja-JP.yml | 3 + .../migration/1684386446061-emoji-improve.js | 15 ++ .../backend/src/core/CustomEmojiService.ts | 22 +- packages/backend/src/core/MfmService.ts | 2 +- packages/backend/src/core/ReactionService.ts | 51 +++-- packages/backend/src/core/WebfingerService.ts | 7 +- .../src/core/entities/EmojiEntityService.ts | 4 + packages/backend/src/models/entities/Emoji.ts | 16 ++ .../backend/src/models/json-schema/emoji.ts | 21 ++ .../ImportCustomEmojisProcessorService.ts | 3 + .../server/api/endpoints/admin/emoji/add.ts | 31 ++- .../api/endpoints/admin/emoji/update.ts | 27 +++ packages/backend/test/unit/ReactionService.ts | 42 ++-- .../frontend/src/components/MkRolePreview.vue | 13 +- .../src/pages/custom-emojis-manager.vue | 19 +- .../frontend/src/pages/emoji-edit-dialog.vue | 214 ++++++++++++++---- 17 files changed, 376 insertions(+), 115 deletions(-) create mode 100644 packages/backend/migration/1684386446061-emoji-improve.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ea1c2842..8b6fefc8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ ## 13.x.x (unreleased) ### General +- カスタム絵文字ごとにそれをリアクションとして使えるロールを設定できるように - タイムラインにフォロイーの行った他人へのリプライを含めるかどうかの設定をアカウントに保存するのをやめるように - 今後はAPI呼び出し時およびストリーミング接続時に設定するようになります diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 264908482..f49f9c5a3 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1049,6 +1049,9 @@ preventAiLearningDescription: "外部の文章生成AIや画像生成AIに対し options: "オプション" specifyUser: "ユーザー指定" failedToPreviewUrl: "プレビューできません" +update: "更新" +rolesThatCanBeUsedThisEmojiAsReaction: "リアクションとして使えるロール" +rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "ロールの指定が一つもない場合、誰でもリアクションとして使えます。" _initialAccountSetting: accountCreated: "アカウントの作成が完了しました!" diff --git a/packages/backend/migration/1684386446061-emoji-improve.js b/packages/backend/migration/1684386446061-emoji-improve.js new file mode 100644 index 000000000..40b0a2bc5 --- /dev/null +++ b/packages/backend/migration/1684386446061-emoji-improve.js @@ -0,0 +1,15 @@ +export class EmojiImprove1684386446061 { + name = 'EmojiImprove1684386446061' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "emoji" ADD "localOnly" boolean NOT NULL DEFAULT false`); + await queryRunner.query(`ALTER TABLE "emoji" ADD "isSensitive" boolean NOT NULL DEFAULT false`); + await queryRunner.query(`ALTER TABLE "emoji" ADD "roleIdsThatCanBeUsedThisEmojiAsReaction" character varying(128) array NOT NULL DEFAULT '{}'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "roleIdsThatCanBeUsedThisEmojiAsReaction"`); + await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "isSensitive"`); + await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "localOnly"`); + } +} diff --git a/packages/backend/src/core/CustomEmojiService.ts b/packages/backend/src/core/CustomEmojiService.ts index 93557ce61..3499df38b 100644 --- a/packages/backend/src/core/CustomEmojiService.ts +++ b/packages/backend/src/core/CustomEmojiService.ts @@ -7,7 +7,7 @@ import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js'; import { GlobalEventService } from '@/core/GlobalEventService.js'; import type { DriveFile } from '@/models/entities/DriveFile.js'; import type { Emoji } from '@/models/entities/Emoji.js'; -import type { EmojisRepository } from '@/models/index.js'; +import type { EmojisRepository, Role } from '@/models/index.js'; import { bindThis } from '@/decorators.js'; import { MemoryKVCache, RedisSingleCache } from '@/misc/cache.js'; import { UtilityService } from '@/core/UtilityService.js'; @@ -15,6 +15,8 @@ import type { Config } from '@/config.js'; import { query } from '@/misc/prelude/url.js'; import type { Serialized } from '@/server/api/stream/types.js'; +const parseEmojiStrRegexp = /^(\w+)(?:@([\w.-]+))?$/; + @Injectable() export class CustomEmojiService { private cache: MemoryKVCache; @@ -63,6 +65,9 @@ export class CustomEmojiService { aliases: string[]; host: string | null; license: string | null; + isSensitive: boolean; + localOnly: boolean; + roleIdsThatCanBeUsedThisEmojiAsReaction: Role['id'][]; }): Promise { const emoji = await this.emojisRepository.insert({ id: this.idService.genId(), @@ -75,6 +80,9 @@ export class CustomEmojiService { publicUrl: data.driveFile.webpublicUrl ?? data.driveFile.url, type: data.driveFile.webpublicType ?? data.driveFile.type, license: data.license, + isSensitive: data.isSensitive, + localOnly: data.localOnly, + roleIdsThatCanBeUsedThisEmojiAsReaction: data.roleIdsThatCanBeUsedThisEmojiAsReaction, }).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0])); if (data.host == null) { @@ -90,10 +98,14 @@ export class CustomEmojiService { @bindThis public async update(id: Emoji['id'], data: { + driveFile?: DriveFile; name?: string; category?: string | null; aliases?: string[]; license?: string | null; + isSensitive?: boolean; + localOnly?: boolean; + roleIdsThatCanBeUsedThisEmojiAsReaction?: Role['id'][]; }): Promise { const emoji = await this.emojisRepository.findOneByOrFail({ id: id }); const sameNameEmoji = await this.emojisRepository.findOneBy({ name: data.name, host: IsNull() }); @@ -105,6 +117,12 @@ export class CustomEmojiService { category: data.category, aliases: data.aliases, license: data.license, + isSensitive: data.isSensitive, + localOnly: data.localOnly, + originalUrl: data.driveFile != null ? data.driveFile.url : undefined, + publicUrl: data.driveFile != null ? (data.driveFile.webpublicUrl ?? data.driveFile.url) : undefined, + type: data.driveFile != null ? (data.driveFile.webpublicType ?? data.driveFile.type) : undefined, + roleIdsThatCanBeUsedThisEmojiAsReaction: data.roleIdsThatCanBeUsedThisEmojiAsReaction ?? undefined, }); this.localEmojisCache.refresh(); @@ -259,7 +277,7 @@ export class CustomEmojiService { @bindThis public parseEmojiStr(emojiName: string, noteUserHost: string | null) { - const match = emojiName.match(/^(\w+)(?:@([\w.-]+))?$/); + const match = emojiName.match(parseEmojiStrRegexp); if (!match) return { name: null, host: null }; const name = match[1]; diff --git a/packages/backend/src/core/MfmService.ts b/packages/backend/src/core/MfmService.ts index 9b2d5dc0f..dffee16e0 100644 --- a/packages/backend/src/core/MfmService.ts +++ b/packages/backend/src/core/MfmService.ts @@ -83,7 +83,7 @@ export class MfmService { if (hashtagNames && href && hashtagNames.map(x => x.toLowerCase()).includes(txt.toLowerCase())) { text += txt; // メンション - } else if (txt.startsWith('@') && !(rel && rel.value.match(/^me /))) { + } else if (txt.startsWith('@') && !(rel && rel.value.startsWith('me '))) { const part = txt.split('@'); if (part.length === 2 && href) { diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts index 2184cfeb4..27334b33e 100644 --- a/packages/backend/src/core/ReactionService.ts +++ b/packages/backend/src/core/ReactionService.ts @@ -20,6 +20,7 @@ import { bindThis } from '@/decorators.js'; import { UtilityService } from '@/core/UtilityService.js'; import { UserBlockingService } from '@/core/UserBlockingService.js'; import { CustomEmojiService } from '@/core/CustomEmojiService.js'; +import { RoleService } from '@/core/RoleService.js'; const FALLBACK = '❤'; @@ -75,6 +76,7 @@ export class ReactionService { private utilityService: UtilityService, private metaService: MetaService, private customEmojiService: CustomEmojiService, + private roleService: RoleService, private userEntityService: UserEntityService, private noteEntityService: NoteEntityService, private userBlockingService: UserBlockingService, @@ -88,7 +90,7 @@ export class ReactionService { } @bindThis - public async create(user: { id: User['id']; host: User['host']; isBot: User['isBot'] }, note: Note, reaction?: string | null) { + public async create(user: { id: User['id']; host: User['host']; isBot: User['isBot'] }, note: Note, _reaction?: string | null) { // Check blocking if (note.userId !== user.id) { const blocked = await this.userBlockingService.checkBlocked(note.userId, user.id); @@ -102,10 +104,36 @@ export class ReactionService { throw new IdentifiableError('68e9d2d1-48bf-42c2-b90a-b20e09fd3d48', 'Note not accessible for you.'); } + let reaction = _reaction ?? FALLBACK; + if (note.reactionAcceptance === 'likeOnly' || ((note.reactionAcceptance === 'likeOnlyForRemote') && (user.host != null))) { reaction = '❤️'; - } else { - reaction = await this.toDbReaction(reaction, user.host); + } else if (_reaction) { + const custom = reaction.match(isCustomEmojiRegexp); + if (custom) { + const reacterHost = this.utilityService.toPunyNullable(user.host); + + const name = custom[1]; + const emoji = reacterHost == null + ? (await this.customEmojiService.localEmojisCache.fetch()).get(name) + : await this.emojisRepository.findOneBy({ + host: reacterHost, + name, + }); + + if (emoji) { + if (emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.length === 0 || (await this.roleService.getUserRoles(user.id)).some(r => emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.includes(r.id))) { + reaction = reacterHost ? `:${name}@${reacterHost}:` : `:${name}:`; + } else { + // リアクションとして使う権限がない + reaction = FALLBACK; + } + } else { + reaction = FALLBACK; + } + } else { + reaction = this.normalize(reaction ?? null); + } } const record: NoteReaction = { @@ -291,11 +319,9 @@ export class ReactionService { } @bindThis - public async toDbReaction(reaction?: string | null, reacterHost?: string | null): Promise { + public normalize(reaction: string | null): string { if (reaction == null) return FALLBACK; - reacterHost = this.utilityService.toPunyNullable(reacterHost); - // 文字列タイプのリアクションを絵文字に変換 if (Object.keys(legacies).includes(reaction)) return legacies[reaction]; @@ -309,19 +335,6 @@ export class ReactionService { return unicode.match('\u200d') ? unicode : unicode.replace(/\ufe0f/g, ''); } - const custom = reaction.match(isCustomEmojiRegexp); - if (custom) { - const name = custom[1]; - const emoji = reacterHost == null - ? (await this.customEmojiService.localEmojisCache.fetch()).get(name) - : await this.emojisRepository.findOneBy({ - host: reacterHost, - name, - }); - - if (emoji) return reacterHost ? `:${name}@${reacterHost}:` : `:${name}:`; - } - return FALLBACK; } diff --git a/packages/backend/src/core/WebfingerService.ts b/packages/backend/src/core/WebfingerService.ts index 3ee799064..f58a6a10f 100644 --- a/packages/backend/src/core/WebfingerService.ts +++ b/packages/backend/src/core/WebfingerService.ts @@ -16,6 +16,9 @@ type IWebFinger = { subject: string; }; +const urlRegex = /^https?:\/\//; +const mRegex = /^([^@]+)@(.*)/; + @Injectable() export class WebfingerService { constructor( @@ -35,12 +38,12 @@ export class WebfingerService { @bindThis private genUrl(query: string): string { - if (query.match(/^https?:\/\//)) { + if (query.match(urlRegex)) { const u = new URL(query); return `${u.protocol}//${u.hostname}/.well-known/webfinger?` + urlQuery({ resource: query }); } - const m = query.match(/^([^@]+)@(.*)/); + const m = query.match(mRegex); if (m) { const hostname = m[2]; const useHttp = process.env.MISSKEY_WEBFINGER_USE_HTTP && process.env.MISSKEY_WEBFINGER_USE_HTTP.toLowerCase() === 'true'; diff --git a/packages/backend/src/core/entities/EmojiEntityService.ts b/packages/backend/src/core/entities/EmojiEntityService.ts index 3bad048bc..0c7bd9ed9 100644 --- a/packages/backend/src/core/entities/EmojiEntityService.ts +++ b/packages/backend/src/core/entities/EmojiEntityService.ts @@ -26,6 +26,7 @@ export class EmojiEntityService { category: emoji.category, // || emoji.originalUrl してるのは後方互換性のため(publicUrlはstringなので??はだめ) url: emoji.publicUrl || emoji.originalUrl, + isSensitive: emoji.isSensitive, }; } @@ -51,6 +52,9 @@ export class EmojiEntityService { // || emoji.originalUrl してるのは後方互換性のため(publicUrlはstringなので??はだめ) url: emoji.publicUrl || emoji.originalUrl, license: emoji.license, + isSensitive: emoji.isSensitive, + localOnly: emoji.localOnly, + roleIdsThatCanBeUsedThisEmojiAsReaction: emoji.roleIdsThatCanBeUsedThisEmojiAsReaction, }; } diff --git a/packages/backend/src/models/entities/Emoji.ts b/packages/backend/src/models/entities/Emoji.ts index dbb437d43..8fd3e65f5 100644 --- a/packages/backend/src/models/entities/Emoji.ts +++ b/packages/backend/src/models/entities/Emoji.ts @@ -60,4 +60,20 @@ export class Emoji { length: 1024, nullable: true, }) public license: string | null; + + @Column('boolean', { + default: false, + }) + public localOnly: boolean; + + @Column('boolean', { + default: false, + }) + public isSensitive: boolean; + + // TODO: 定期ジョブで存在しなくなったロールIDを除去するようにする + @Column('varchar', { + array: true, length: 128, default: '{}', + }) + public roleIdsThatCanBeUsedThisEmojiAsReaction: string[]; } diff --git a/packages/backend/src/models/json-schema/emoji.ts b/packages/backend/src/models/json-schema/emoji.ts index db4fd62cf..c59b5d1ef 100644 --- a/packages/backend/src/models/json-schema/emoji.ts +++ b/packages/backend/src/models/json-schema/emoji.ts @@ -22,6 +22,10 @@ export const packedEmojiSimpleSchema = { type: 'string', optional: false, nullable: false, }, + isSensitive: { + type: 'boolean', + optional: false, nullable: false, + }, }, } as const; @@ -63,5 +67,22 @@ export const packedEmojiDetailedSchema = { type: 'string', optional: false, nullable: true, }, + isSensitive: { + type: 'boolean', + optional: false, nullable: false, + }, + localOnly: { + type: 'boolean', + optional: false, nullable: false, + }, + roleIdsThatCanBeUsedThisEmojiAsReaction: { + type: 'array', + optional: false, nullable: false, + items: { + type: 'string', + optional: false, nullable: false, + format: 'id', + }, + }, }, } as const; diff --git a/packages/backend/src/queue/processors/ImportCustomEmojisProcessorService.ts b/packages/backend/src/queue/processors/ImportCustomEmojisProcessorService.ts index cf78d8330..600468a28 100644 --- a/packages/backend/src/queue/processors/ImportCustomEmojisProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportCustomEmojisProcessorService.ts @@ -107,6 +107,9 @@ export class ImportCustomEmojisProcessorService { aliases: emojiInfo.aliases, driveFile, license: emojiInfo.license, + isSensitive: emojiInfo.isSensitive, + localOnly: emojiInfo.localOnly, + roleIdsThatCanBeUsedThisEmojiAsReaction: [], }); } diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts index 2fb3e489e..509224e9c 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts @@ -25,9 +25,24 @@ export const meta = { export const paramDef = { type: 'object', properties: { + name: { type: 'string', pattern: '^[a-zA-Z0-9_]+$' }, fileId: { type: 'string', format: 'misskey:id' }, + category: { + type: 'string', + nullable: true, + description: 'Use `null` to reset the category.', + }, + aliases: { type: 'array', items: { + type: 'string', + } }, + license: { type: 'string', nullable: true }, + isSensitive: { type: 'boolean' }, + localOnly: { type: 'boolean' }, + roleIdsThatCanBeUsedThisEmojiAsReaction: { type: 'array', items: { + type: 'string', + } }, }, - required: ['fileId'], + required: ['name', 'fileId'], } as const; // TODO: ロジックをサービスに切り出す @@ -45,18 +60,18 @@ export default class extends Endpoint { ) { super(meta, paramDef, async (ps, me) => { const driveFile = await this.driveFilesRepository.findOneBy({ id: ps.fileId }); - if (driveFile == null) throw new ApiError(meta.errors.noSuchFile); - const name = driveFile.name.split('.')[0].match(/^[a-z0-9_]+$/) ? driveFile.name.split('.')[0] : `_${rndstr('a-z0-9', 8)}_`; - const emoji = await this.customEmojiService.add({ driveFile, - name, - category: null, - aliases: [], + name: ps.name, + category: ps.category ?? null, + aliases: ps.aliases ?? [], host: null, - license: null, + license: ps.license ?? null, + isSensitive: ps.isSensitive ?? false, + localOnly: ps.localOnly ?? false, + roleIdsThatCanBeUsedThisEmojiAsReaction: ps.roleIdsThatCanBeUsedThisEmojiAsReaction ?? [], }); this.moderationLogService.insertModerationLog(me, 'addEmoji', { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts index f63348b60..fb22bdc47 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts @@ -1,6 +1,8 @@ import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { CustomEmojiService } from '@/core/CustomEmojiService.js'; +import type { DriveFilesRepository } from '@/models/index.js'; +import { DI } from '@/di-symbols.js'; import { ApiError } from '../../../error.js'; export const meta = { @@ -15,6 +17,11 @@ export const meta = { code: 'NO_SUCH_EMOJI', id: '684dec9d-a8c2-4364-9aa8-456c49cb1dc8', }, + noSuchFile: { + message: 'No such file.', + code: 'NO_SUCH_FILE', + id: '14fb9fd9-0731-4e2f-aeb9-f09e4740333d', + }, sameNameEmojiExists: { message: 'Emoji that have same name already exists.', code: 'SAME_NAME_EMOJI_EXISTS', @@ -28,6 +35,7 @@ export const paramDef = { properties: { id: { type: 'string', format: 'misskey:id' }, name: { type: 'string', pattern: '^[a-zA-Z0-9_]+$' }, + fileId: { type: 'string', format: 'misskey:id' }, category: { type: 'string', nullable: true, @@ -37,6 +45,11 @@ export const paramDef = { type: 'string', } }, license: { type: 'string', nullable: true }, + isSensitive: { type: 'boolean' }, + localOnly: { type: 'boolean' }, + roleIdsThatCanBeUsedThisEmojiAsReaction: { type: 'array', items: { + type: 'string', + } }, }, required: ['id', 'name', 'aliases'], } as const; @@ -45,14 +58,28 @@ export const paramDef = { @Injectable() export default class extends Endpoint { constructor( + @Inject(DI.driveFilesRepository) + private driveFilesRepository: DriveFilesRepository, + private customEmojiService: CustomEmojiService, ) { super(meta, paramDef, async (ps, me) => { + let driveFile; + + if (ps.fileId) { + driveFile = await this.driveFilesRepository.findOneBy({ id: ps.fileId }); + if (driveFile == null) throw new ApiError(meta.errors.noSuchFile); + } + await this.customEmojiService.update(ps.id, { + driveFile, name: ps.name, category: ps.category ?? null, aliases: ps.aliases, license: ps.license ?? null, + isSensitive: ps.isSensitive, + localOnly: ps.localOnly, + roleIdsThatCanBeUsedThisEmojiAsReaction: ps.roleIdsThatCanBeUsedThisEmojiAsReaction, }); }); } diff --git a/packages/backend/test/unit/ReactionService.ts b/packages/backend/test/unit/ReactionService.ts index 38db081ac..aa68f4117 100644 --- a/packages/backend/test/unit/ReactionService.ts +++ b/packages/backend/test/unit/ReactionService.ts @@ -15,78 +15,74 @@ describe('ReactionService', () => { reactionService = app.get(ReactionService); }); - describe('toDbReaction', () => { + describe('normalize', () => { test('絵文字リアクションはそのまま', async () => { - assert.strictEqual(await reactionService.toDbReaction('👍'), '👍'); - assert.strictEqual(await reactionService.toDbReaction('🍅'), '🍅'); + assert.strictEqual(await reactionService.normalize('👍'), '👍'); + assert.strictEqual(await reactionService.normalize('🍅'), '🍅'); }); test('既存のリアクションは絵文字化する pudding', async () => { - assert.strictEqual(await reactionService.toDbReaction('pudding'), '🍮'); + assert.strictEqual(await reactionService.normalize('pudding'), '🍮'); }); test('既存のリアクションは絵文字化する like', async () => { - assert.strictEqual(await reactionService.toDbReaction('like'), '👍'); + assert.strictEqual(await reactionService.normalize('like'), '👍'); }); test('既存のリアクションは絵文字化する love', async () => { - assert.strictEqual(await reactionService.toDbReaction('love'), '❤'); + assert.strictEqual(await reactionService.normalize('love'), '❤'); }); test('既存のリアクションは絵文字化する laugh', async () => { - assert.strictEqual(await reactionService.toDbReaction('laugh'), '😆'); + assert.strictEqual(await reactionService.normalize('laugh'), '😆'); }); test('既存のリアクションは絵文字化する hmm', async () => { - assert.strictEqual(await reactionService.toDbReaction('hmm'), '🤔'); + assert.strictEqual(await reactionService.normalize('hmm'), '🤔'); }); test('既存のリアクションは絵文字化する surprise', async () => { - assert.strictEqual(await reactionService.toDbReaction('surprise'), '😮'); + assert.strictEqual(await reactionService.normalize('surprise'), '😮'); }); test('既存のリアクションは絵文字化する congrats', async () => { - assert.strictEqual(await reactionService.toDbReaction('congrats'), '🎉'); + assert.strictEqual(await reactionService.normalize('congrats'), '🎉'); }); test('既存のリアクションは絵文字化する angry', async () => { - assert.strictEqual(await reactionService.toDbReaction('angry'), '💢'); + assert.strictEqual(await reactionService.normalize('angry'), '💢'); }); test('既存のリアクションは絵文字化する confused', async () => { - assert.strictEqual(await reactionService.toDbReaction('confused'), '😥'); + assert.strictEqual(await reactionService.normalize('confused'), '😥'); }); test('既存のリアクションは絵文字化する rip', async () => { - assert.strictEqual(await reactionService.toDbReaction('rip'), '😇'); + assert.strictEqual(await reactionService.normalize('rip'), '😇'); }); test('既存のリアクションは絵文字化する star', async () => { - assert.strictEqual(await reactionService.toDbReaction('star'), '⭐'); + assert.strictEqual(await reactionService.normalize('star'), '⭐'); }); test('異体字セレクタ除去', async () => { - assert.strictEqual(await reactionService.toDbReaction('㊗️'), '㊗'); + assert.strictEqual(await reactionService.normalize('㊗️'), '㊗'); }); test('異体字セレクタ除去 必要なし', async () => { - assert.strictEqual(await reactionService.toDbReaction('㊗'), '㊗'); - }); - - test('fallback - undefined', async () => { - assert.strictEqual(await reactionService.toDbReaction(undefined), '❤'); + assert.strictEqual(await reactionService.normalize('㊗'), '㊗'); }); test('fallback - null', async () => { - assert.strictEqual(await reactionService.toDbReaction(null), '❤'); + assert.strictEqual(await reactionService.normalize(null), '❤'); }); test('fallback - empty', async () => { - assert.strictEqual(await reactionService.toDbReaction(''), '❤'); + assert.strictEqual(await reactionService.normalize(''), '❤'); }); test('fallback - unknown', async () => { - assert.strictEqual(await reactionService.toDbReaction('unknown'), '❤'); + assert.strictEqual(await reactionService.normalize('unknown'), '❤'); }); }); }); diff --git a/packages/frontend/src/components/MkRolePreview.vue b/packages/frontend/src/components/MkRolePreview.vue index 2f5866f34..9fbe1ec99 100644 --- a/packages/frontend/src/components/MkRolePreview.vue +++ b/packages/frontend/src/components/MkRolePreview.vue @@ -12,8 +12,10 @@ {{ role.name }} - {{ role.usersCount }} users - ({{ i18n.ts._role.conditional }}) +
{{ role.description }}
@@ -23,10 +25,13 @@ import { } from 'vue'; import { i18n } from '@/i18n'; -const props = defineProps<{ +const props = withDefaults(defineProps<{ role: any; forModeration: boolean; -}>(); + detailed: boolean; +}>(), { + detailed: true, +}); From db1098a18055e329eb4ebcddb64fabc1c9730dfc Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 May 2023 18:48:35 +0900 Subject: [PATCH 41/54] =?UTF-8?q?feat(backend):=20=E3=82=AB=E3=82=B9?= =?UTF-8?q?=E3=82=BF=E3=83=A0=E7=B5=B5=E6=96=87=E5=AD=97=E3=81=94=E3=81=A8?= =?UTF-8?q?=E3=81=AB=E9=80=A3=E5=90=88=E3=81=99=E3=82=8B=E3=81=8B=E3=81=A9?= =?UTF-8?q?=E3=81=86=E3=81=8B=E8=A8=AD=E5=AE=9A=E3=81=A7=E3=81=8D=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + packages/backend/src/core/activitypub/ApRendererService.ts | 6 +++--- packages/backend/src/server/ActivityPubServerService.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b6fefc8d..646522320 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ ### General - カスタム絵文字ごとにそれをリアクションとして使えるロールを設定できるように +- カスタム絵文字ごとに連合するかどうか設定できるように - タイムラインにフォロイーの行った他人へのリプライを含めるかどうかの設定をアカウントに保存するのをやめるように - 今後はAPI呼び出し時およびストリーミング接続時に設定するようになります diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts index 60e19bfca..d8b95ca4d 100644 --- a/packages/backend/src/core/activitypub/ApRendererService.ts +++ b/packages/backend/src/core/activitypub/ApRendererService.ts @@ -277,7 +277,7 @@ export class ApRendererService { const name = reaction.replaceAll(':', ''); const emoji = (await this.customEmojiService.localEmojisCache.fetch()).get(name); - if (emoji) object.tag = [this.renderEmoji(emoji)]; + if (emoji && !emoji.localOnly) object.tag = [this.renderEmoji(emoji)]; } return object; @@ -400,7 +400,7 @@ export class ApRendererService { })); const emojis = await this.getEmojis(note.emojis); - const apemojis = emojis.map(emoji => this.renderEmoji(emoji)); + const apemojis = emojis.filter(emoji => !emoji.localOnly).map(emoji => this.renderEmoji(emoji)); const tag = [ ...hashtagTags, @@ -479,7 +479,7 @@ export class ApRendererService { } const emojis = await this.getEmojis(user.emojis); - const apemojis = emojis.map(emoji => this.renderEmoji(emoji)); + const apemojis = emojis.filter(emoji => !emoji.localOnly).map(emoji => this.renderEmoji(emoji)); const hashtagTags = (user.tags ?? []).map(tag => this.renderHashtag(tag)); diff --git a/packages/backend/src/server/ActivityPubServerService.ts b/packages/backend/src/server/ActivityPubServerService.ts index e675d9cf1..455acd1e4 100644 --- a/packages/backend/src/server/ActivityPubServerService.ts +++ b/packages/backend/src/server/ActivityPubServerService.ts @@ -585,7 +585,7 @@ export class ActivityPubServerService { name: request.params.emoji, }); - if (emoji == null) { + if (emoji == null || emoji.localOnly) { reply.code(404); return; } From 231506772a47cdab965c686d9fb670a0dbd1a73e Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 May 2023 20:17:32 +0900 Subject: [PATCH 42/54] tweak of 7ce569424 --- locales/ja-JP.yml | 1 + .../src/core/entities/EmojiEntityService.ts | 3 +- .../backend/src/models/json-schema/emoji.ts | 11 ++- packages/frontend/src/account.ts | 84 ++++++++++--------- .../frontend/src/components/MkEmojiPicker.vue | 11 ++- .../frontend/src/pages/emoji-edit-dialog.vue | 13 +-- 6 files changed, 73 insertions(+), 50 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index f49f9c5a3..94c00bad3 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1052,6 +1052,7 @@ failedToPreviewUrl: "プレビューできません" update: "更新" rolesThatCanBeUsedThisEmojiAsReaction: "リアクションとして使えるロール" rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "ロールの指定が一つもない場合、誰でもリアクションとして使えます。" +rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "ロールは公開ロールである必要があります。" _initialAccountSetting: accountCreated: "アカウントの作成が完了しました!" diff --git a/packages/backend/src/core/entities/EmojiEntityService.ts b/packages/backend/src/core/entities/EmojiEntityService.ts index 0c7bd9ed9..4a18cd1b3 100644 --- a/packages/backend/src/core/entities/EmojiEntityService.ts +++ b/packages/backend/src/core/entities/EmojiEntityService.ts @@ -26,7 +26,8 @@ export class EmojiEntityService { category: emoji.category, // || emoji.originalUrl してるのは後方互換性のため(publicUrlはstringなので??はだめ) url: emoji.publicUrl || emoji.originalUrl, - isSensitive: emoji.isSensitive, + isSensitive: emoji.isSensitive ? true : undefined, + roleIdsThatCanBeUsedThisEmojiAsReaction: emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.length > 0 ? emoji.roleIdsThatCanBeUsedThisEmojiAsReaction : undefined, }; } diff --git a/packages/backend/src/models/json-schema/emoji.ts b/packages/backend/src/models/json-schema/emoji.ts index c59b5d1ef..63f56e77c 100644 --- a/packages/backend/src/models/json-schema/emoji.ts +++ b/packages/backend/src/models/json-schema/emoji.ts @@ -24,7 +24,16 @@ export const packedEmojiSimpleSchema = { }, isSensitive: { type: 'boolean', - optional: false, nullable: false, + optional: true, nullable: false, + }, + roleIdsThatCanBeUsedThisEmojiAsReaction: { + type: 'array', + optional: true, nullable: false, + items: { + type: 'string', + optional: false, nullable: false, + format: 'id', + }, }, }, } as const; diff --git a/packages/frontend/src/account.ts b/packages/frontend/src/account.ts index 9b104391d..4770f616a 100644 --- a/packages/frontend/src/account.ts +++ b/packages/frontend/src/account.ts @@ -3,11 +3,11 @@ import * as misskey from 'misskey-js'; import { showSuspendedDialog } from './scripts/show-suspended-dialog'; import { i18n } from './i18n'; import { miLocalStorage } from './local-storage'; +import { MenuButton } from './types/menu'; import { del, get, set } from '@/scripts/idb-proxy'; import { apiUrl } from '@/config'; import { waiting, api, popup, popupMenu, success, alert } from '@/os'; import { unisonReload, reloadChannel } from '@/scripts/unison-reload'; -import { MenuButton } from './types/menu'; // TODO: 他のタブと永続化されたstateを同期 @@ -101,57 +101,57 @@ function fetchAccount(token: string, id?: string, forceShowDialog?: boolean): Pr 'Content-Type': 'application/json', }, }) - .then(res => new Promise }>((done2, fail2) => { - if (res.status >= 500 && res.status < 600) { + .then(res => new Promise }>((done2, fail2) => { + if (res.status >= 500 && res.status < 600) { // サーバーエラー(5xx)の場合をrejectとする // (認証エラーなど4xxはresolve) - return fail2(res); - } - res.json().then(done2, fail2); - })) - .then(async res => { - if (res.error) { - if (res.error.id === 'a8c724b3-6e9c-4b46-b1a8-bc3ed6258370') { + return fail2(res); + } + res.json().then(done2, fail2); + })) + .then(async res => { + if (res.error) { + if (res.error.id === 'a8c724b3-6e9c-4b46-b1a8-bc3ed6258370') { // SUSPENDED - if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { - await showSuspendedDialog(); - } - } else if (res.error.id === 'e5b3b9f0-2b8f-4b9f-9c1f-8c5c1b2e1b1a') { + if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { + await showSuspendedDialog(); + } + } else if (res.error.id === 'e5b3b9f0-2b8f-4b9f-9c1f-8c5c1b2e1b1a') { // USER_IS_DELETED // アカウントが削除されている - if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { - await alert({ - type: 'error', - title: i18n.ts.accountDeleted, - text: i18n.ts.accountDeletedDescription, - }); - } - } else if (res.error.id === 'b0a7f5f8-dc2f-4171-b91f-de88ad238e14') { + if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { + await alert({ + type: 'error', + title: i18n.ts.accountDeleted, + text: i18n.ts.accountDeletedDescription, + }); + } + } else if (res.error.id === 'b0a7f5f8-dc2f-4171-b91f-de88ad238e14') { // AUTHENTICATION_FAILED // トークンが無効化されていたりアカウントが削除されたりしている - if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { + if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { + await alert({ + type: 'error', + title: i18n.ts.tokenRevoked, + text: i18n.ts.tokenRevokedDescription, + }); + } + } else { await alert({ type: 'error', - title: i18n.ts.tokenRevoked, - text: i18n.ts.tokenRevokedDescription, + title: i18n.ts.failedToFetchAccountInformation, + text: JSON.stringify(res.error), }); } - } else { - await alert({ - type: 'error', - title: i18n.ts.failedToFetchAccountInformation, - text: JSON.stringify(res.error), - }); - } - // rejectかつ理由がtrueの場合、削除対象であることを示す - fail(true); - } else { - (res as Account).token = token; - done(res as Account); - } - }) - .catch(fail); + // rejectかつ理由がtrueの場合、削除対象であることを示す + fail(true); + } else { + (res as Account).token = token; + done(res as Account); + } + }) + .catch(fail); }); } @@ -305,3 +305,7 @@ export async function openAccountMenu(opts: { }); } } + +if (_DEV_) { + (window as any).$i = $i; +} diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue index 9eaf16374..093a1ec6d 100644 --- a/packages/frontend/src/components/MkEmojiPicker.vue +++ b/packages/frontend/src/components/MkEmojiPicker.vue @@ -69,8 +69,8 @@ {{ category || i18n.ts.other }} @@ -102,6 +102,7 @@ import { deviceKind } from '@/scripts/device-kind'; import { i18n } from '@/i18n'; import { defaultStore } from '@/store'; import { customEmojiCategories, customEmojis } from '@/custom-emojis'; +import { $i } from '@/account'; const props = withDefaults(defineProps<{ showPinned?: boolean; @@ -274,10 +275,14 @@ watch(q, () => { return matches; }; - searchResultCustom.value = Array.from(searchCustom()); + searchResultCustom.value = Array.from(searchCustom()).filter(filterAvailable); searchResultUnicode.value = Array.from(searchUnicode()); }); +function filterAvailable(emoji: Misskey.entities.CustomEmoji): boolean { + return (emoji.roleIdsThatCanBeUsedThisEmojiAsReaction == null || emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.length === 0) || ($i && $i.roles.some(r => emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.includes(r.id))); +} + function focus() { if (!['smartphone', 'tablet'].includes(deviceKind) && !isTouchUsing) { searchEl.value?.focus({ diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue index 24b72b6f7..e36a26638 100644 --- a/packages/frontend/src/pages/emoji-edit-dialog.vue +++ b/packages/frontend/src/pages/emoji-edit-dialog.vue @@ -41,16 +41,19 @@ -
- {{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription }} + +
{{ i18n.ts.add }}
- +
+ + {{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription }} + {{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn }}
isSensitive @@ -128,8 +131,8 @@ async function removeRole(role, ev) { async function done() { const params = { name, - category, - aliases: aliases.split(' '), + category: category === '' ? null : category, + aliases: aliases.split(' ').filter(x => x !== ''), license: license === '' ? null : license, isSensitive, localOnly, From e3f91446082c1bf17dbda363fb106641729a5c3d Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 May 2023 20:29:13 +0900 Subject: [PATCH 43/54] 13.13.0-beta.1 --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 646522320..62f37763f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ --> -## 13.x.x (unreleased) +## 13.13.0 ### General - カスタム絵文字ごとにそれをリアクションとして使えるロールを設定できるように diff --git a/package.json b/package.json index a21d7ab9e..cc1e2e62e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.12.2", + "version": "13.13.0-beta.1", "codename": "nasubi", "repository": { "type": "git", From a3423bad601ae3577129e4d4c88afb659569af31 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 19 May 2023 09:14:54 +0900 Subject: [PATCH 44/54] tweak --- packages/frontend/src/pages/emoji-edit-dialog.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue index e36a26638..3208c9273 100644 --- a/packages/frontend/src/pages/emoji-edit-dialog.vue +++ b/packages/frontend/src/pages/emoji-edit-dialog.vue @@ -117,7 +117,7 @@ async function addRole() { const currentRoleIds = rolesThatCanBeUsedThisEmojiAsReaction.map(x => x.id); const { canceled, result: role } = await os.select({ - items: roles.filter(r => !currentRoleIds.includes(r.id)).map(r => ({ text: r.name, value: r })), + items: roles.filter(r => r.isPublic).filter(r => !currentRoleIds.includes(r.id)).map(r => ({ text: r.name, value: r })), }); if (canceled) return; From 527a13b77db229894e12c99ccb29a8ae06cfe898 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 19 May 2023 09:15:24 +0900 Subject: [PATCH 45/54] =?UTF-8?q?enhance(frontend):=20=E3=83=AA=E3=82=A2?= =?UTF-8?q?=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E5=8F=96=E3=82=8A?= =?UTF-8?q?=E6=B6=88=E3=81=97/=E5=A4=89=E6=9B=B4=E6=99=82=E3=81=AB?= =?UTF-8?q?=E7=A2=BA=E8=AA=8D=E3=83=80=E3=82=A4=E3=82=A2=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=92=E5=87=BA=E3=81=99=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + locales/ja-JP.yml | 2 ++ .../components/MkReactionsViewer.reaction.vue | 17 ++++++++++++----- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62f37763f..d9ce5fbe6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ - 今後はAPI呼び出し時およびストリーミング接続時に設定するようになります ### Client +- リアクションの取り消し/変更時に確認ダイアログを出すように - 開発者モードを追加 - AiScriptを0.13.3に更新 - Fix: URLプレビューで情報が取得できなかった際の挙動を修正 diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 94c00bad3..4067155a3 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1053,6 +1053,8 @@ update: "更新" rolesThatCanBeUsedThisEmojiAsReaction: "リアクションとして使えるロール" rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "ロールの指定が一つもない場合、誰でもリアクションとして使えます。" rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "ロールは公開ロールである必要があります。" +cancelReactionConfirm: "リアクションを取り消しますか?" +changeReactionConfirm: "リアクションを変更しますか?" _initialAccountSetting: accountCreated: "アカウントの作成が完了しました!" diff --git a/packages/frontend/src/components/MkReactionsViewer.reaction.vue b/packages/frontend/src/components/MkReactionsViewer.reaction.vue index 9480af510..b521171b2 100644 --- a/packages/frontend/src/components/MkReactionsViewer.reaction.vue +++ b/packages/frontend/src/components/MkReactionsViewer.reaction.vue @@ -6,7 +6,7 @@ :class="[$style.root, { [$style.reacted]: note.myReaction == reaction, [$style.canToggle]: canToggle, [$style.large]: defaultStore.state.largeNoteReactions }]" @click="toggleReaction()" > - + {{ count }} @@ -22,6 +22,7 @@ import { $i } from '@/account'; import MkReactionEffect from '@/components/MkReactionEffect.vue'; import { claimAchievement } from '@/scripts/achievements'; import { defaultStore } from '@/store'; +import { i18n } from '@/i18n'; const props = defineProps<{ reaction: string; @@ -34,11 +35,17 @@ const buttonEl = shallowRef(); const canToggle = computed(() => !props.reaction.match(/@\w/) && $i); -const toggleReaction = () => { +async function toggleReaction() { if (!canToggle.value) return; const oldReaction = props.note.myReaction; if (oldReaction) { + const confirm = await os.confirm({ + type: 'warning', + text: oldReaction !== props.reaction ? i18n.ts.changeReactionConfirm : i18n.ts.cancelReactionConfirm, + }); + if (confirm.canceled) return; + os.api('notes/reactions/delete', { noteId: props.note.id, }).then(() => { @@ -58,9 +65,9 @@ const toggleReaction = () => { claimAchievement('reactWithoutRead'); } } -}; +} -const anime = () => { +function anime() { if (document.hidden) return; if (!defaultStore.state.animation) return; @@ -68,7 +75,7 @@ const anime = () => { const x = rect.left + 16; const y = rect.top + (buttonEl.value.offsetHeight / 2); os.popup(MkReactionEffect, { reaction: props.reaction, x, y }, {}, 'end'); -}; +} watch(() => props.count, (newCount, oldCount) => { if (oldCount < newCount) anime(); From 3804c6e7ad8c08f87e99d7e68a7d5c0e8af68dfa Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 19 May 2023 09:43:38 +0900 Subject: [PATCH 46/54] =?UTF-8?q?feat:=20=E3=82=BB=E3=83=B3=E3=82=B7?= =?UTF-8?q?=E3=83=86=E3=82=A3=E3=83=96=E3=81=AA=E3=82=AB=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=A0=E7=B5=B5=E6=96=87=E5=AD=97=E3=81=AE=E3=83=AA=E3=82=A2?= =?UTF-8?q?=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E5=8F=97=E3=81=91?= =?UTF-8?q?=E5=85=A5=E3=82=8C=E3=81=AA=E3=81=84=E8=A8=AD=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ locales/ja-JP.yml | 4 +++- packages/backend/src/core/ReactionService.ts | 7 ++++++- packages/backend/src/models/entities/Note.ts | 2 +- .../src/server/api/endpoints/notes/create.ts | 2 +- packages/frontend/src/components/MkPostForm.vue | 6 ++++-- packages/frontend/src/pages/settings/profile.vue | 16 +++++++++------- packages/frontend/src/store.ts | 2 +- 8 files changed, 27 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9ce5fbe6..03b1bb4e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ ### General - カスタム絵文字ごとにそれをリアクションとして使えるロールを設定できるように - カスタム絵文字ごとに連合するかどうか設定できるように +- カスタム絵文字ごとにセンシティブフラグを設定できるように +- センシティブなカスタム絵文字のリアクションを受け入れない設定が可能に - タイムラインにフォロイーの行った他人へのリプライを含めるかどうかの設定をアカウントに保存するのをやめるように - 今後はAPI呼び出し時およびストリーミング接続時に設定するようになります diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 4067155a3..374eeba39 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -990,7 +990,9 @@ postToTheChannel: "チャンネルに投稿" cannotBeChangedLater: "後から変更できません。" reactionAcceptance: "リアクションの受け入れ" likeOnly: "いいねのみ" -likeOnlyForRemote: "リモートからはいいねのみ" +likeOnlyForRemote: "全て (リモートはいいねのみ)" +nonSensitiveOnly: "非センシティブのみ" +nonSensitiveOnlyForLocalLikeOnlyForRemote: "非センシティブのみ (リモートはいいねのみ)" rolesAssignedToMe: "自分に割り当てられたロール" resetPasswordConfirm: "パスワードリセットしますか?" sensitiveWords: "センシティブワード" diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts index 27334b33e..4b01b6af7 100644 --- a/packages/backend/src/core/ReactionService.ts +++ b/packages/backend/src/core/ReactionService.ts @@ -106,7 +106,7 @@ export class ReactionService { let reaction = _reaction ?? FALLBACK; - if (note.reactionAcceptance === 'likeOnly' || ((note.reactionAcceptance === 'likeOnlyForRemote') && (user.host != null))) { + if (note.reactionAcceptance === 'likeOnly' || ((note.reactionAcceptance === 'likeOnlyForRemote' || note.reactionAcceptance === 'nonSensitiveOnlyForLocalLikeOnlyForRemote') && (user.host != null))) { reaction = '❤️'; } else if (_reaction) { const custom = reaction.match(isCustomEmojiRegexp); @@ -124,6 +124,11 @@ export class ReactionService { if (emoji) { if (emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.length === 0 || (await this.roleService.getUserRoles(user.id)).some(r => emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.includes(r.id))) { reaction = reacterHost ? `:${name}@${reacterHost}:` : `:${name}:`; + + // センシティブ + if ((note.reactionAcceptance === 'nonSensitiveOnly') && emoji.isSensitive) { + reaction = FALLBACK; + } } else { // リアクションとして使う権限がない reaction = FALLBACK; diff --git a/packages/backend/src/models/entities/Note.ts b/packages/backend/src/models/entities/Note.ts index df508b4dc..4f49a0595 100644 --- a/packages/backend/src/models/entities/Note.ts +++ b/packages/backend/src/models/entities/Note.ts @@ -90,7 +90,7 @@ export class Note { @Column('varchar', { length: 64, nullable: true, }) - public reactionAcceptance: 'likeOnly' | 'likeOnlyForRemote' | null; + public reactionAcceptance: 'likeOnly' | 'likeOnlyForRemote' | 'nonSensitiveOnly' | 'nonSensitiveOnlyForLocalLikeOnlyForRemote' | null; @Column('smallint', { default: 0, diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts index 3f7f2cdec..96be5ed84 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.ts @@ -99,7 +99,7 @@ export const paramDef = { } }, cw: { type: 'string', nullable: true, maxLength: 100 }, localOnly: { type: 'boolean', default: false }, - reactionAcceptance: { type: 'string', nullable: true, enum: [null, 'likeOnly', 'likeOnlyForRemote'], default: null }, + reactionAcceptance: { type: 'string', nullable: true, enum: [null, 'likeOnly', 'likeOnlyForRemote', 'nonSensitiveOnly', 'nonSensitiveOnlyForLocalLikeOnlyForRemote'], default: null }, noExtractMentions: { type: 'boolean', default: false }, noExtractHashtags: { type: 'boolean', default: false }, noExtractEmojis: { type: 'boolean', default: false }, diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index c65cb7d6e..c43d353d9 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -31,7 +31,7 @@ -
- + - + - + - + @@ -48,7 +48,7 @@
- + @@ -88,8 +88,10 @@ - + + +
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 0af4b5c02..aa4b98c05 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -92,7 +92,7 @@ export const defaultStore = markRaw(new Storage('base', { }, reactionAcceptance: { where: 'account', - default: null as 'likeOnly' | 'likeOnlyForRemote' | null, + default: 'nonSensitiveOnly' as 'likeOnly' | 'likeOnlyForRemote' | 'nonSensitiveOnly' | 'nonSensitiveOnlyForLocalLikeOnlyForRemote' | null, }, mutedWords: { where: 'account', From 59255e11b8989d1e4f60c222590d2918a61adb54 Mon Sep 17 00:00:00 2001 From: tamaina Date: Fri, 19 May 2023 09:44:06 +0900 Subject: [PATCH 47/54] =?UTF-8?q?perf:=20MkImgWithBlurhash=E3=81=A8MkMedia?= =?UTF-8?q?Image=E3=82=92=E6=9C=80=E9=81=A9=E5=8C=96=20(#10782)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #10781 * fix tsconfig * fetch image?? * Revert "fetch image??" This reverts commit 0925c28d5a4f328264c39d5591dc736795541683. * wip * Revert "wip" This reverts commit be97c6cb88318bcea441edeeecb69b6d6ed0dd8f. * loading="eager" * loading="eager" 2 * error * wip * wip * wip * wip * clean up * fix * 生成するworkerを1つにする? * clean up * use buraha * wip * smaller width, height * update buraha * clean up * fix * Update MkMediaImage.vue * Update MkImgWithBlurhash.vue * Revert "fix(frontend): センシティブ設定された画像を開くとき一瞬レイアウトが崩れる問題を修正" This reverts commit 41e9aa6f9b03107518224e2ebde8889c64408204. * Update MkMediaList.vue * Update MkMediaList.vue * Update MkMediaList.vue * Update CHANGELOG.md * wait for decode * fix * ? * (test) remove container-type: inline-size; * Revert "(test) remove container-type: inline-size;" This reverts commit 9448e64228428175a3d624c04df1bfad0f59cb69. * container-name * Revert "container-name" This reverts commit 94385d32213a00a06a59fbd2296d6ef1b5f91785. * width: 100%; * improve performance * refactor * wip * WIP * wip * Revert "wip" This reverts commit 36e3b75cab8114e423544b79a8e2df353880f43b. * Revert "WIP" This reverts commit 05b729ef9189aea052ba411ac10f30a46cc668c8. * Revert "wip" This reverts commit 0801e7936116c58154d7cecfea955dd15fa61a77. * #10860 * wip * no worker * Revert "no worker" This reverts commit a9c49e4fb49976958a7594393343d52be0e082d7. * :v: * workerNumber固定は不要 --------- Co-authored-by: syuilo --- CHANGELOG.md | 1 + packages/frontend/package.json | 2 +- .../src/components/MkGalleryPostPreview.vue | 15 +- .../src/components/MkImgWithBlurhash.vue | 196 +++++++++++++----- .../frontend/src/components/MkMediaImage.vue | 55 +++-- .../frontend/src/components/MkMediaList.vue | 65 +++++- .../src/components/global/MkAvatar.vue | 3 +- .../frontend/src/pages/settings/general.vue | 3 +- .../src/scripts/worker-multi-dispatch.ts | 75 +++++++ .../frontend/src/workers/draw-blurhash.ts | 15 ++ packages/frontend/src/workers/test-webgl2.ts | 7 + packages/frontend/src/workers/tsconfig.json | 5 + packages/frontend/vite.config.ts | 4 + pnpm-lock.yaml | 12 +- 14 files changed, 367 insertions(+), 91 deletions(-) create mode 100644 packages/frontend/src/scripts/worker-multi-dispatch.ts create mode 100644 packages/frontend/src/workers/draw-blurhash.ts create mode 100644 packages/frontend/src/workers/test-webgl2.ts create mode 100644 packages/frontend/src/workers/tsconfig.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 03b1bb4e2..972958963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,7 @@ Meilisearchの設定に`index`が必要になりました。値はMisskeyサー * 画像が全て隠れた状態で表示されるようになります - 閲覧注意設定された画像は表示した状態でもそれが閲覧注意だと分かる表示をするように - モデレーターはノートに添付された画像上から直接NSFW設定できるように +- 1枚だけのメディアリストの画像のアスペクト比を画像に応じて縦長にするように - プロフィール設定「追加情報」の項目の削除と並び替えができるように - 新しい実績を追加 - AiScriptを0.13.2に更新 diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 7e6c1442b..2f754f8aa 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -25,9 +25,9 @@ "@vue-macros/reactivity-transform": "0.3.7", "@vue/compiler-sfc": "3.3.2", "autosize": "6.0.1", - "blurhash": "2.0.5", "broadcast-channel": "4.20.2", "browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3", + "buraha": "github:misskey-dev/buraha", "canvas-confetti": "1.6.0", "chart.js": "4.3.0", "chartjs-adapter-date-fns": "3.0.0", diff --git a/packages/frontend/src/components/MkGalleryPostPreview.vue b/packages/frontend/src/components/MkGalleryPostPreview.vue index 4f8f7b945..fccc33dcc 100644 --- a/packages/frontend/src/components/MkGalleryPostPreview.vue +++ b/packages/frontend/src/components/MkGalleryPostPreview.vue @@ -5,12 +5,9 @@ diff --git a/packages/frontend/src/pages/my-lists/index.vue b/packages/frontend/src/pages/my-lists/index.vue index 47437f3e5..6068e375e 100644 --- a/packages/frontend/src/pages/my-lists/index.vue +++ b/packages/frontend/src/pages/my-lists/index.vue @@ -70,6 +70,7 @@ definePageMetadata({ padding: 16px; border: solid 1px var(--divider); border-radius: 6px; + margin-bottom: 8px; &:hover { border: solid 1px var(--accent); diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue index 86201e8e0..dd431e8dc 100644 --- a/packages/frontend/src/pages/my-lists/list.vue +++ b/packages/frontend/src/pages/my-lists/list.vue @@ -1,35 +1,43 @@ + + diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index add4bd921..6b11137d7 100644 --- a/packages/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -30,6 +30,10 @@ export const routes = [{ name: 'note', path: '/notes/:noteId', component: page(() => import('./pages/note.vue')), +}, { + name: 'list', + path: '/list/:listId', + component: page(() => import('./pages/list.vue')), }, { path: '/clips/:clipId', component: page(() => import('./pages/clip.vue')), From 0c0ae6ff90029d8a5e0526c2c20276794db41114 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 19 May 2023 10:07:29 +0900 Subject: [PATCH 50/54] 13.13.0-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cc1e2e62e..5a8e1e7b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.13.0-beta.1", + "version": "13.13.0-beta.2", "codename": "nasubi", "repository": { "type": "git", From 8317772436590e76fc4a10bd7cf0f26c5120f80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=BE=E3=81=A3=E3=81=B4=E3=83=BC?= <75538777+mappi-pr@users.noreply.github.com> Date: Fri, 19 May 2023 11:35:46 +0900 Subject: [PATCH 51/54] =?UTF-8?q?fix:Firefox=E3=81=A7=E3=82=B5=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=82=A2=E3=83=83=E3=83=97=E3=81=99=E3=82=8B=E6=99=82?= =?UTF-8?q?=E3=80=81=E3=83=A1=E3=83=BC=E3=83=AB=E3=82=A2=E3=83=89=E3=83=AC?= =?UTF-8?q?=E3=82=B9=E3=81=8C=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E5=90=8D?= =?UTF-8?q?=E3=81=A8=E3=81=97=E3=81=A6=E8=AA=8D=E8=AD=98=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=82=8B#10523=20(#10869)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix:Firefoxでサインアップする時、メールアドレスがユーザー名として認識される * Update CHANGELOG.md edit CHANGELOG.md --- CHANGELOG.md | 1 + packages/frontend/src/components/MkSignupDialog.form.vue | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 994541538..454974ca2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ - 開発者モードを追加 - AiScriptを0.13.3に更新 - Fix: URLプレビューで情報が取得できなかった際の挙動を修正 +- Fix: Safari、Firefoxでの新規登録時、パスワードマネージャーにメールアドレスが登録されていた挙動を修正 ## 13.12.2 diff --git a/packages/frontend/src/components/MkSignupDialog.form.vue b/packages/frontend/src/components/MkSignupDialog.form.vue index 0e8bdb321..c8d805cc1 100644 --- a/packages/frontend/src/components/MkSignupDialog.form.vue +++ b/packages/frontend/src/components/MkSignupDialog.form.vue @@ -9,7 +9,7 @@
- + From 95b9284e79d00bb47184122760fac3933e8ef5ae Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 19 May 2023 13:35:46 +0900 Subject: [PATCH 52/54] :art: --- .../src/pages/admin/other-settings.vue | 25 ++++++++++++++++--- .../frontend/src/pages/admin/settings.vue | 24 +++--------------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/packages/frontend/src/pages/admin/other-settings.vue b/packages/frontend/src/pages/admin/other-settings.vue index 62dff6ce7..15d720a07 100644 --- a/packages/frontend/src/pages/admin/other-settings.vue +++ b/packages/frontend/src/pages/admin/other-settings.vue @@ -1,9 +1,17 @@