From fcc48640800f6dcf4eb31d438609d00059b654bd Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 07:56:25 +0900 Subject: [PATCH 001/126] perf(backend): reduce needless populateMyReaction calls --- packages/backend/src/core/entities/NoteEntityService.ts | 2 +- packages/backend/src/server/api/stream/channels/channel.ts | 6 ++++-- .../src/server/api/stream/channels/global-timeline.ts | 6 ++++-- packages/backend/src/server/api/stream/channels/hashtag.ts | 6 ++++-- .../backend/src/server/api/stream/channels/home-timeline.ts | 6 ++++-- .../src/server/api/stream/channels/hybrid-timeline.ts | 6 ++++-- .../src/server/api/stream/channels/local-timeline.ts | 6 ++++-- .../backend/src/server/api/stream/channels/user-list.ts | 6 ++++-- 8 files changed, 29 insertions(+), 15 deletions(-) diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index 7cb7e4b91..9a59da434 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -357,7 +357,7 @@ export class NoteEntityService implements OnModuleInit { poll: note.hasPoll ? this.populatePoll(note, meId) : undefined, - ...(meId ? { + ...(meId && Object.keys(note.reactions).length > 0 ? { myReaction: this.populateMyReaction(note.id, meId, options?._hint_), } : {}), } : {}), diff --git a/packages/backend/src/server/api/stream/channels/channel.ts b/packages/backend/src/server/api/stream/channels/channel.ts index e4c34e00c..251350dda 100644 --- a/packages/backend/src/server/api/stream/channels/channel.ts +++ b/packages/backend/src/server/api/stream/channels/channel.ts @@ -46,8 +46,10 @@ class ChannelChannel extends Channel { if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; if (this.user && note.renoteId && !note.text) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + if (note.renote && Object.keys(note.renote.reactions).length > 0) { + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + note.renote!.myReaction = myRenoteReaction; + } } this.connection.cacheNote(note); 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 c499d1787..9c623abf7 100644 --- a/packages/backend/src/server/api/stream/channels/global-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts @@ -72,8 +72,10 @@ class GlobalTimelineChannel extends Channel { if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; if (this.user && note.renoteId && !note.text) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + if (note.renote && Object.keys(note.renote.reactions).length > 0) { + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + note.renote!.myReaction = myRenoteReaction; + } } this.connection.cacheNote(note); diff --git a/packages/backend/src/server/api/stream/channels/hashtag.ts b/packages/backend/src/server/api/stream/channels/hashtag.ts index 2cfe9572d..247145d8c 100644 --- a/packages/backend/src/server/api/stream/channels/hashtag.ts +++ b/packages/backend/src/server/api/stream/channels/hashtag.ts @@ -51,8 +51,10 @@ class HashtagChannel extends Channel { if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; if (this.user && note.renoteId && !note.text) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + if (note.renote && Object.keys(note.renote.reactions).length > 0) { + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + note.renote!.myReaction = myRenoteReaction; + } } this.connection.cacheNote(note); 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 3ccf4af66..eed5c699d 100644 --- a/packages/backend/src/server/api/stream/channels/home-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts @@ -74,8 +74,10 @@ class HomeTimelineChannel extends Channel { if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; if (this.user && note.renoteId && !note.text) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + if (note.renote && Object.keys(note.renote.reactions).length > 0) { + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + note.renote!.myReaction = myRenoteReaction; + } } this.connection.cacheNote(note); 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 760fab60a..d9b5cafc8 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -88,8 +88,10 @@ class HybridTimelineChannel extends Channel { if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; if (this.user && note.renoteId && !note.text) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + if (note.renote && Object.keys(note.renote.reactions).length > 0) { + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + note.renote!.myReaction = myRenoteReaction; + } } this.connection.cacheNote(note); 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 a21104113..2424b468d 100644 --- a/packages/backend/src/server/api/stream/channels/local-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts @@ -71,8 +71,10 @@ class LocalTimelineChannel extends Channel { if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; if (this.user && note.renoteId && !note.text) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + if (note.renote && Object.keys(note.renote.reactions).length > 0) { + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + note.renote!.myReaction = myRenoteReaction; + } } this.connection.cacheNote(note); diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts index b73cedaa8..c3b4c9d74 100644 --- a/packages/backend/src/server/api/stream/channels/user-list.ts +++ b/packages/backend/src/server/api/stream/channels/user-list.ts @@ -103,8 +103,10 @@ class UserListChannel extends Channel { if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; if (this.user && note.renoteId && !note.text) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + if (note.renote && Object.keys(note.renote.reactions).length > 0) { + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + note.renote!.myReaction = myRenoteReaction; + } } this.connection.cacheNote(note); From 2dfbf97db4fd18632cbbee5d1ec5fa83e29f9978 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 07:59:58 +0900 Subject: [PATCH 002/126] refactor --- packages/backend/src/server/api/stream/channels/channel.ts | 2 +- .../backend/src/server/api/stream/channels/global-timeline.ts | 2 +- packages/backend/src/server/api/stream/channels/hashtag.ts | 2 +- .../backend/src/server/api/stream/channels/home-timeline.ts | 2 +- .../backend/src/server/api/stream/channels/hybrid-timeline.ts | 2 +- .../backend/src/server/api/stream/channels/local-timeline.ts | 2 +- packages/backend/src/server/api/stream/channels/user-list.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/backend/src/server/api/stream/channels/channel.ts b/packages/backend/src/server/api/stream/channels/channel.ts index 251350dda..4d85e1cee 100644 --- a/packages/backend/src/server/api/stream/channels/channel.ts +++ b/packages/backend/src/server/api/stream/channels/channel.ts @@ -48,7 +48,7 @@ class ChannelChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + note.renote.myReaction = myRenoteReaction; } } 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 9c623abf7..18b8e8245 100644 --- a/packages/backend/src/server/api/stream/channels/global-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts @@ -74,7 +74,7 @@ class GlobalTimelineChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + note.renote.myReaction = myRenoteReaction; } } diff --git a/packages/backend/src/server/api/stream/channels/hashtag.ts b/packages/backend/src/server/api/stream/channels/hashtag.ts index 247145d8c..fb9226413 100644 --- a/packages/backend/src/server/api/stream/channels/hashtag.ts +++ b/packages/backend/src/server/api/stream/channels/hashtag.ts @@ -53,7 +53,7 @@ class HashtagChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + note.renote.myReaction = myRenoteReaction; } } 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 eed5c699d..691484153 100644 --- a/packages/backend/src/server/api/stream/channels/home-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts @@ -76,7 +76,7 @@ class HomeTimelineChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + note.renote.myReaction = myRenoteReaction; } } 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 d9b5cafc8..c353aaac0 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -90,7 +90,7 @@ class HybridTimelineChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + note.renote.myReaction = myRenoteReaction; } } 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 2424b468d..0823799d2 100644 --- a/packages/backend/src/server/api/stream/channels/local-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts @@ -73,7 +73,7 @@ class LocalTimelineChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + note.renote.myReaction = myRenoteReaction; } } diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts index c3b4c9d74..a5a9d189b 100644 --- a/packages/backend/src/server/api/stream/channels/user-list.ts +++ b/packages/backend/src/server/api/stream/channels/user-list.ts @@ -105,7 +105,7 @@ class UserListChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); - note.renote!.myReaction = myRenoteReaction; + note.renote.myReaction = myRenoteReaction; } } From 4d1d25e02f9863ede37b6c981f3c2418b14cf3a7 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 08:07:22 +0900 Subject: [PATCH 003/126] perf(backend): improve my reaction population performance --- packages/backend/src/core/entities/NoteEntityService.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index 9a59da434..66dbb6616 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -177,10 +177,9 @@ export class NoteEntityService implements OnModuleInit { const reaction = _hint_.myReactions.get(noteId); if (reaction) { return this.reactionService.convertLegacyReaction(reaction.reaction); - } else if (reaction === null) { + } else { return undefined; } - // 実装上抜けがあるだけかもしれないので、「ヒントに含まれてなかったら(=undefinedなら)return」のようにはしない } // パフォーマンスのためノートが作成されてから2秒以上経っていない場合はリアクションを取得しない @@ -387,11 +386,11 @@ export class NoteEntityService implements OnModuleInit { const renoteIds = notes.filter(n => n.renoteId != null).map(n => n.renoteId!); // パフォーマンスのためノートが作成されてから2秒以上経っていない場合はリアクションを取得しない const oldId = this.idService.gen(Date.now() - 2000); - const targets = [...notes.filter(n => n.id < oldId).map(n => n.id), ...renoteIds]; - const myReactions = await this.noteReactionsRepository.findBy({ + const targets = [...notes.filter(n => (n.id < oldId) && (Object.keys(n.reactions).length > 0)).map(n => n.id), ...renoteIds]; + const myReactions = targets.length > 0 ? await this.noteReactionsRepository.findBy({ userId: meId, noteId: In(targets), - }); + }) : []; for (const target of targets) { myReactionsMap.set(target, myReactions.find(reaction => reaction.noteId === target) ?? null); From 1671575d5d3d081c83f172f3439884010aafeb59 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 09:20:19 +0900 Subject: [PATCH 004/126] =?UTF-8?q?perf(backend):=20=E3=83=8E=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=81=AE=E3=83=AA=E3=82=A2=E3=82=AF=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E6=83=85=E5=A0=B1=E3=82=92=E3=82=AD=E3=83=A3=E3=83=83?= =?UTF-8?q?=E3=82=B7=E3=83=A5=E3=81=99=E3=82=8B=E3=81=93=E3=81=A8=E3=81=A7?= =?UTF-8?q?DB=E3=81=B8=E3=81=AE=E3=82=AF=E3=82=A8=E3=83=AA=E3=82=92?= =?UTF-8?q?=E5=89=8A=E6=B8=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...673894459-note-reactionAndUserPairCache.js | 17 +++++ .../backend/src/core/NoteCreateService.ts | 2 +- packages/backend/src/core/ReactionService.ts | 4 + .../src/core/entities/NoteEntityService.ts | 75 +++++++++++++++---- packages/backend/src/models/Note.ts | 5 ++ .../backend/src/models/json-schema/note.ts | 8 ++ .../src/server/api/stream/channels/channel.ts | 2 +- .../api/stream/channels/global-timeline.ts | 2 +- .../src/server/api/stream/channels/hashtag.ts | 2 +- .../api/stream/channels/home-timeline.ts | 2 +- .../api/stream/channels/hybrid-timeline.ts | 3 +- .../api/stream/channels/local-timeline.ts | 2 +- .../server/api/stream/channels/user-list.ts | 2 +- 13 files changed, 103 insertions(+), 23 deletions(-) create mode 100644 packages/backend/migration/1697673894459-note-reactionAndUserPairCache.js diff --git a/packages/backend/migration/1697673894459-note-reactionAndUserPairCache.js b/packages/backend/migration/1697673894459-note-reactionAndUserPairCache.js new file mode 100644 index 000000000..fe0ea282d --- /dev/null +++ b/packages/backend/migration/1697673894459-note-reactionAndUserPairCache.js @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + + +export class NoteReactionAndUserPairCache1697673894459 { + name = 'NoteReactionAndUserPairCache1697673894459' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "note" ADD "reactionAndUserPairCache" character varying(1024) array NOT NULL DEFAULT '{}'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "reactionAndUserPairCache"`); + } +} diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 30d7f3e76..2c00418c4 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -584,7 +584,7 @@ export class NoteCreateService implements OnApplicationShutdown { } // Pack the note - const noteObj = await this.noteEntityService.pack(note, null, { skipHide: true }); + const noteObj = await this.noteEntityService.pack(note, null, { skipHide: true, withReactionAndUserPairCache: true }); this.globalEventService.publishNotesStream(noteObj); diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts index 1458e2b17..edf433025 100644 --- a/packages/backend/src/core/ReactionService.ts +++ b/packages/backend/src/core/ReactionService.ts @@ -187,6 +187,9 @@ export class ReactionService { await this.notesRepository.createQueryBuilder().update() .set({ reactions: () => sql, + ...(note.reactionAndUserPairCache.length < 10 ? { + reactionAndUserPairCache: () => `array_append("reactionAndUserPairCache", '${user.id}:${reaction}')`, + } : {}), }) .where('id = :id', { id: note.id }) .execute(); @@ -293,6 +296,7 @@ export class ReactionService { await this.notesRepository.createQueryBuilder().update() .set({ reactions: () => sql, + reactionAndUserPairCache: () => `array_remove("reactionAndUserPairCache", '${user.id}:${exist.reaction}')`, }) .where('id = :id', { id: note.id }) .execute(); diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index 66dbb6616..b46b5528a 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -170,26 +170,37 @@ export class NoteEntityService implements OnModuleInit { } @bindThis - public async populateMyReaction(noteId: MiNote['id'], meId: MiUser['id'], _hint_?: { - myReactions: Map; + public async populateMyReaction(note: { id: MiNote['id']; reactions: MiNote['reactions']; reactionAndUserPairCache?: MiNote['reactionAndUserPairCache']; }, meId: MiUser['id'], _hint_?: { + myReactions: Map; }) { if (_hint_?.myReactions) { - const reaction = _hint_.myReactions.get(noteId); + const reaction = _hint_.myReactions.get(note.id); if (reaction) { - return this.reactionService.convertLegacyReaction(reaction.reaction); + return this.reactionService.convertLegacyReaction(reaction); + } else { + return undefined; + } + } + + const reactionsCount = Object.values(note.reactions).reduce((a, b) => a + b, 0); + if (reactionsCount === 0) return undefined; + if (note.reactionAndUserPairCache && reactionsCount <= note.reactionAndUserPairCache.length) { + const pair = note.reactionAndUserPairCache.find(p => p.startsWith(meId)); + if (pair) { + return this.reactionService.convertLegacyReaction(pair.split(':')[1]); } else { return undefined; } } // パフォーマンスのためノートが作成されてから2秒以上経っていない場合はリアクションを取得しない - if (this.idService.parse(noteId).date.getTime() + 2000 > Date.now()) { + if (this.idService.parse(note.id).date.getTime() + 2000 > Date.now()) { return undefined; } const reaction = await this.noteReactionsRepository.findOneBy({ userId: meId, - noteId: noteId, + noteId: note.id, }); if (reaction) { @@ -275,8 +286,9 @@ export class NoteEntityService implements OnModuleInit { options?: { detail?: boolean; skipHide?: boolean; + withReactionAndUserPairCache?: boolean; _hint_?: { - myReactions: Map; + myReactions: Map; packedFiles: Map | null>; }; }, @@ -284,6 +296,7 @@ export class NoteEntityService implements OnModuleInit { const opts = Object.assign({ detail: true, skipHide: false, + withReactionAndUserPairCache: false, }, options); const meId = me ? me.id : null; @@ -324,6 +337,7 @@ export class NoteEntityService implements OnModuleInit { repliesCount: note.repliesCount, reactions: this.reactionService.convertLegacyReactions(note.reactions), reactionEmojis: this.customEmojiService.populateEmojis(reactionEmojiNames, host), + reactionAndUserPairCache: opts.withReactionAndUserPairCache ? note.reactionAndUserPairCache : undefined, emojis: host != null ? this.customEmojiService.populateEmojis(note.emojis, host) : undefined, tags: note.tags.length > 0 ? note.tags : undefined, fileIds: note.fileIds, @@ -346,18 +360,20 @@ export class NoteEntityService implements OnModuleInit { reply: note.replyId ? this.pack(note.reply ?? note.replyId, me, { detail: false, + withReactionAndUserPairCache: opts.withReactionAndUserPairCache, _hint_: options?._hint_, }) : undefined, renote: note.renoteId ? this.pack(note.renote ?? note.renoteId, me, { detail: true, + withReactionAndUserPairCache: opts.withReactionAndUserPairCache, _hint_: options?._hint_, }) : undefined, poll: note.hasPoll ? this.populatePoll(note, meId) : undefined, ...(meId && Object.keys(note.reactions).length > 0 ? { - myReaction: this.populateMyReaction(note.id, meId, options?._hint_), + myReaction: this.populateMyReaction(note, meId, options?._hint_), } : {}), } : {}), }); @@ -381,19 +397,48 @@ export class NoteEntityService implements OnModuleInit { if (notes.length === 0) return []; const meId = me ? me.id : null; - const myReactionsMap = new Map(); + const myReactionsMap = new Map(); if (meId) { - const renoteIds = notes.filter(n => n.renoteId != null).map(n => n.renoteId!); + const idsNeedFetchMyReaction = new Set(); + // パフォーマンスのためノートが作成されてから2秒以上経っていない場合はリアクションを取得しない const oldId = this.idService.gen(Date.now() - 2000); - const targets = [...notes.filter(n => (n.id < oldId) && (Object.keys(n.reactions).length > 0)).map(n => n.id), ...renoteIds]; - const myReactions = targets.length > 0 ? await this.noteReactionsRepository.findBy({ + + for (const note of notes) { + if (note.renote && (note.text == null && note.fileIds.length === 0)) { // pure renote + const reactionsCount = Object.values(note.renote.reactions).reduce((a, b) => a + b, 0); + if (reactionsCount === 0) { + myReactionsMap.set(note.renote.id, null); + } else if (reactionsCount <= note.renote.reactionAndUserPairCache.length) { + const pair = note.renote.reactionAndUserPairCache.find(p => p.startsWith(meId)); + myReactionsMap.set(note.renote.id, pair ? pair.split(':')[1] : null); + } else { + idsNeedFetchMyReaction.add(note.renote.id); + } + } else { + if (note.id < oldId) { + const reactionsCount = Object.values(note.reactions).reduce((a, b) => a + b, 0); + if (reactionsCount === 0) { + myReactionsMap.set(note.id, null); + } else if (reactionsCount <= note.reactionAndUserPairCache.length) { + const pair = note.reactionAndUserPairCache.find(p => p.startsWith(meId)); + myReactionsMap.set(note.id, pair ? pair.split(':')[1] : null); + } else { + idsNeedFetchMyReaction.add(note.id); + } + } else { + myReactionsMap.set(note.id, null); + } + } + } + + const myReactions = idsNeedFetchMyReaction.size > 0 ? await this.noteReactionsRepository.findBy({ userId: meId, - noteId: In(targets), + noteId: In(Array.from(idsNeedFetchMyReaction)), }) : []; - for (const target of targets) { - myReactionsMap.set(target, myReactions.find(reaction => reaction.noteId === target) ?? null); + for (const id of idsNeedFetchMyReaction) { + myReactionsMap.set(id, myReactions.find(reaction => reaction.noteId === id)?.reaction ?? null); } } diff --git a/packages/backend/src/models/Note.ts b/packages/backend/src/models/Note.ts index ac7f57d5d..a4358b9ba 100644 --- a/packages/backend/src/models/Note.ts +++ b/packages/backend/src/models/Note.ts @@ -164,6 +164,11 @@ export class MiNote { }) public mentionedRemoteUsers: string; + @Column('varchar', { + length: 1024, array: true, default: '{}', + }) + public reactionAndUserPairCache: string[]; + @Column('varchar', { length: 128, array: true, default: '{}', }) diff --git a/packages/backend/src/models/json-schema/note.ts b/packages/backend/src/models/json-schema/note.ts index 2caf0d0c3..38c0054b5 100644 --- a/packages/backend/src/models/json-schema/note.ts +++ b/packages/backend/src/models/json-schema/note.ts @@ -174,6 +174,14 @@ export const packedNoteSchema = { type: 'string', optional: true, nullable: false, }, + reactionAndUserPairCache: { + type: 'array', + optional: true, nullable: false, + items: { + type: 'string', + optional: false, nullable: false, + }, + }, myReaction: { type: 'object', diff --git a/packages/backend/src/server/api/stream/channels/channel.ts b/packages/backend/src/server/api/stream/channels/channel.ts index 4d85e1cee..57034231a 100644 --- a/packages/backend/src/server/api/stream/channels/channel.ts +++ b/packages/backend/src/server/api/stream/channels/channel.ts @@ -47,7 +47,7 @@ class ChannelChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id); note.renote.myReaction = myRenoteReaction; } } 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 18b8e8245..553c44071 100644 --- a/packages/backend/src/server/api/stream/channels/global-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts @@ -73,7 +73,7 @@ class GlobalTimelineChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id); note.renote.myReaction = myRenoteReaction; } } diff --git a/packages/backend/src/server/api/stream/channels/hashtag.ts b/packages/backend/src/server/api/stream/channels/hashtag.ts index fb9226413..f30b29cfd 100644 --- a/packages/backend/src/server/api/stream/channels/hashtag.ts +++ b/packages/backend/src/server/api/stream/channels/hashtag.ts @@ -52,7 +52,7 @@ class HashtagChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id); note.renote.myReaction = myRenoteReaction; } } 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 691484153..2b235b982 100644 --- a/packages/backend/src/server/api/stream/channels/home-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts @@ -75,7 +75,7 @@ class HomeTimelineChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id); note.renote.myReaction = myRenoteReaction; } } 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 c353aaac0..4e9091208 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -89,7 +89,8 @@ class HybridTimelineChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + console.log(note.renote.reactionAndUserPairCache); + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id); note.renote.myReaction = myRenoteReaction; } } 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 0823799d2..9dd05b9b0 100644 --- a/packages/backend/src/server/api/stream/channels/local-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts @@ -72,7 +72,7 @@ class LocalTimelineChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id); note.renote.myReaction = myRenoteReaction; } } diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts index a5a9d189b..6d83d4cb5 100644 --- a/packages/backend/src/server/api/stream/channels/user-list.ts +++ b/packages/backend/src/server/api/stream/channels/user-list.ts @@ -104,7 +104,7 @@ class UserListChannel extends Channel { if (this.user && note.renoteId && !note.text) { if (note.renote && Object.keys(note.renote.reactions).length > 0) { - const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); + const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id); note.renote.myReaction = myRenoteReaction; } } From f9549e1f1b924e75270bf5b75aee1a399fc9a2a0 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 11:17:59 +0900 Subject: [PATCH 005/126] fix(backend): fix of 1671575d5d --- packages/backend/src/core/ReactionService.ts | 4 ++-- packages/backend/src/core/entities/NoteEntityService.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts index edf433025..f3f2b04dd 100644 --- a/packages/backend/src/core/ReactionService.ts +++ b/packages/backend/src/core/ReactionService.ts @@ -188,7 +188,7 @@ export class ReactionService { .set({ reactions: () => sql, ...(note.reactionAndUserPairCache.length < 10 ? { - reactionAndUserPairCache: () => `array_append("reactionAndUserPairCache", '${user.id}:${reaction}')`, + reactionAndUserPairCache: () => `array_append("reactionAndUserPairCache", '${user.id}/${reaction}')`, } : {}), }) .where('id = :id', { id: note.id }) @@ -296,7 +296,7 @@ export class ReactionService { await this.notesRepository.createQueryBuilder().update() .set({ reactions: () => sql, - reactionAndUserPairCache: () => `array_remove("reactionAndUserPairCache", '${user.id}:${exist.reaction}')`, + reactionAndUserPairCache: () => `array_remove("reactionAndUserPairCache", '${user.id}/${exist.reaction}')`, }) .where('id = :id', { id: note.id }) .execute(); diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index b46b5528a..c100b92ee 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -187,7 +187,7 @@ export class NoteEntityService implements OnModuleInit { if (note.reactionAndUserPairCache && reactionsCount <= note.reactionAndUserPairCache.length) { const pair = note.reactionAndUserPairCache.find(p => p.startsWith(meId)); if (pair) { - return this.reactionService.convertLegacyReaction(pair.split(':')[1]); + return this.reactionService.convertLegacyReaction(pair.split('/')[1]); } else { return undefined; } @@ -411,7 +411,7 @@ export class NoteEntityService implements OnModuleInit { myReactionsMap.set(note.renote.id, null); } else if (reactionsCount <= note.renote.reactionAndUserPairCache.length) { const pair = note.renote.reactionAndUserPairCache.find(p => p.startsWith(meId)); - myReactionsMap.set(note.renote.id, pair ? pair.split(':')[1] : null); + myReactionsMap.set(note.renote.id, pair ? pair.split('/')[1] : null); } else { idsNeedFetchMyReaction.add(note.renote.id); } @@ -422,7 +422,7 @@ export class NoteEntityService implements OnModuleInit { myReactionsMap.set(note.id, null); } else if (reactionsCount <= note.reactionAndUserPairCache.length) { const pair = note.reactionAndUserPairCache.find(p => p.startsWith(meId)); - myReactionsMap.set(note.id, pair ? pair.split(':')[1] : null); + myReactionsMap.set(note.id, pair ? pair.split('/')[1] : null); } else { idsNeedFetchMyReaction.add(note.id); } From 428d39a460f6672b675d751dfb0457538dee536a Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 11:18:17 +0900 Subject: [PATCH 006/126] chore: disable debug log of fastify --- packages/backend/src/server/ServerService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts index e598b91e5..757cf2161 100644 --- a/packages/backend/src/server/ServerService.ts +++ b/packages/backend/src/server/ServerService.ts @@ -73,7 +73,7 @@ export class ServerService implements OnApplicationShutdown { public async launch(): Promise { const fastify = Fastify({ trustProxy: true, - logger: !['production', 'test'].includes(process.env.NODE_ENV ?? ''), + logger: false, }); this.#fastify = fastify; From ec45db7870c0e157e9069bd2bceb1329c136a9fa Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 11:19:42 +0900 Subject: [PATCH 007/126] refactor and perf tweak --- packages/backend/src/core/ReactionService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts index f3f2b04dd..4233b8d4c 100644 --- a/packages/backend/src/core/ReactionService.ts +++ b/packages/backend/src/core/ReactionService.ts @@ -30,6 +30,7 @@ import { RoleService } from '@/core/RoleService.js'; import { FeaturedService } from '@/core/FeaturedService.js'; const FALLBACK = '❤'; +const PER_NOTE_REACTION_USER_PAIR_CACHE_MAX = 16; const legacies: Record = { 'like': '👍', @@ -187,7 +188,7 @@ export class ReactionService { await this.notesRepository.createQueryBuilder().update() .set({ reactions: () => sql, - ...(note.reactionAndUserPairCache.length < 10 ? { + ...(note.reactionAndUserPairCache.length < PER_NOTE_REACTION_USER_PAIR_CACHE_MAX ? { reactionAndUserPairCache: () => `array_append("reactionAndUserPairCache", '${user.id}/${reaction}')`, } : {}), }) From 30efd932a5828def2cd394e65d333fdbdb447231 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 11:42:17 +0900 Subject: [PATCH 008/126] =?UTF-8?q?enhance:=20nyaize=E3=81=AF=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=82=A2=E3=83=B3=E3=83=88=E3=81=A7=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E6=99=82=E3=81=AB=E8=A1=8C=E3=81=86=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve #12030 --- CHANGELOG.md | 3 ++- .../backend/src/core/NoteCreateService.ts | 23 +------------------ .../global/MkMisskeyFlavoredMarkdown.ts | 16 ++++++++----- packages/frontend/src/scripts/nyaize.ts | 20 ++++++++++++++++ packages/misskey-js/etc/misskey-js.api.md | 6 +++-- packages/misskey-js/src/entities.ts | 2 ++ 6 files changed, 39 insertions(+), 31 deletions(-) create mode 100644 packages/frontend/src/scripts/nyaize.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ee2d39cde..8f895f800 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,7 +30,8 @@ - Enhance: ストリーミングAPIのパフォーマンスを向上 - Fix: users/notesでDBから参照した際にチャンネル投稿のみ取得される問題を修正 - Fix: コントロールパネルの設定項目が正しく保存できない問題を修正 -- Change: nyaizeはAPIレスポンス時ではなく投稿時に一度だけ非可逆的に行われるようになりました +- Change: ユーザーのisCatがtrueでも、サーバーではnyaizeが行われなくなりました + - isCatな場合、クライアントでnyaize処理を行うことを推奨します ## 2023.10.1 ### General diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 2c00418c4..f5cfe0312 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -227,8 +227,6 @@ export class NoteCreateService implements OnApplicationShutdown { isBot: MiUser['isBot']; isCat: MiUser['isCat']; }, data: Option, silent = false): Promise { - let patsedText: mfm.MfmNode[] | null = null; - // チャンネル外にリプライしたら対象のスコープに合わせる // (クライアントサイドでやっても良い処理だと思うけどとりあえずサーバーサイドで) if (data.reply && data.channel && data.reply.channelId !== data.channel.id) { @@ -315,25 +313,6 @@ export class NoteCreateService implements OnApplicationShutdown { data.text = data.text.slice(0, DB_MAX_NOTE_TEXT_LENGTH); } data.text = data.text.trim(); - - if (user.isCat) { - patsedText = mfm.parse(data.text); - function nyaizeNode(node: mfm.MfmNode) { - if (node.type === 'quote') return; - if (node.type === 'text') { - node.props.text = nyaize(node.props.text); - } - if (node.children) { - for (const child of node.children) { - nyaizeNode(child); - } - } - } - for (const node of patsedText) { - nyaizeNode(node); - } - data.text = mfm.toString(patsedText); - } } else { data.text = null; } @@ -344,7 +323,7 @@ export class NoteCreateService implements OnApplicationShutdown { // Parse MFM if needed if (!tags || !emojis || !mentionedUsers) { - const tokens = patsedText ?? (data.text ? mfm.parse(data.text)! : []); + const tokens = (data.text ? mfm.parse(data.text)! : []); const cwTokens = data.cw ? mfm.parse(data.cw)! : []; const choiceTokens = data.poll && data.poll.choices ? concat(data.poll.choices.map(choice => mfm.parse(choice)!)) diff --git a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts index 2ae3fc89c..ea3655f6b 100644 --- a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts +++ b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts @@ -17,6 +17,7 @@ import MkSparkle from '@/components/MkSparkle.vue'; import MkA from '@/components/global/MkA.vue'; import { host } from '@/config.js'; import { defaultStore } from '@/store.js'; +import { nyaize } from '@/scripts/nyaize.js'; const QUOTE_STYLE = ` display: block; @@ -55,10 +56,13 @@ export default function(props: { * @param ast MFM AST * @param scale How times large the text is */ - const genEl = (ast: mfm.MfmNode[], scale: number) => ast.map((token): VNode | string | (VNode | string)[] => { + const genEl = (ast: mfm.MfmNode[], scale: number, disableNyaize = false) => ast.map((token): VNode | string | (VNode | string)[] => { switch (token.type) { case 'text': { - const text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n'); + let text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n'); + if (!disableNyaize && props.author.isCat) { + text = nyaize(text); + } if (!props.plain) { const res: (VNode | string)[] = []; @@ -260,7 +264,7 @@ export default function(props: { key: Math.random(), url: token.props.url, rel: 'nofollow noopener', - }, genEl(token.children, scale))]; + }, genEl(token.children, scale, true))]; } case 'mention': { @@ -299,11 +303,11 @@ export default function(props: { if (!props.nowrap) { return [h('div', { style: QUOTE_STYLE, - }, genEl(token.children, scale))]; + }, genEl(token.children, scale, true))]; } else { return [h('span', { style: QUOTE_STYLE, - }, genEl(token.children, scale))]; + }, genEl(token.children, scale, true))]; } } @@ -358,7 +362,7 @@ export default function(props: { } case 'plain': { - return [h('span', genEl(token.children, scale))]; + return [h('span', genEl(token.children, scale, true))]; } default: { diff --git a/packages/frontend/src/scripts/nyaize.ts b/packages/frontend/src/scripts/nyaize.ts new file mode 100644 index 000000000..0ac77e100 --- /dev/null +++ b/packages/frontend/src/scripts/nyaize.ts @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export function nyaize(text: string): string { + return text + // ja-JP + .replaceAll('な', 'にゃ').replaceAll('ナ', 'ニャ').replaceAll('ナ', 'ニャ') + // en-US + .replace(/(?<=n)a/gi, x => x === 'A' ? 'YA' : 'ya') + .replace(/(?<=morn)ing/gi, x => x === 'ING' ? 'YAN' : 'yan') + .replace(/(?<=every)one/gi, x => x === 'ONE' ? 'NYAN' : 'nyan') + // ko-KR + .replace(/[나-낳]/g, match => String.fromCharCode( + match.charCodeAt(0)! + '냐'.charCodeAt(0) - '나'.charCodeAt(0), + )) + .replace(/(다$)|(다(?=\.))|(다(?= ))|(다(?=!))|(다(?=\?))/gm, '다냥') + .replace(/(야(?=\?))|(야$)|(야(?= ))/gm, '냥'); +} diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md index 895f34689..54bbfae14 100644 --- a/packages/misskey-js/etc/misskey-js.api.md +++ b/packages/misskey-js/etc/misskey-js.api.md @@ -2977,6 +2977,8 @@ type UserLite = { faviconUrl: Instance['faviconUrl']; themeColor: Instance['themeColor']; }; + isCat?: boolean; + isBot?: boolean; }; // @public (undocumented) @@ -2987,8 +2989,8 @@ type UserSorting = '+follower' | '-follower' | '+createdAt' | '-createdAt' | '+u // src/api.types.ts:16:32 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts // src/api.types.ts:18:25 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts // src/api.types.ts:633:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts -// src/entities.ts:107:2 - (ae-forgotten-export) The symbol "notificationTypes_2" needs to be exported by the entry point index.d.ts -// src/entities.ts:603:2 - (ae-forgotten-export) The symbol "ModerationLogPayloads" needs to be exported by the entry point index.d.ts +// src/entities.ts:109:2 - (ae-forgotten-export) The symbol "notificationTypes_2" needs to be exported by the entry point index.d.ts +// src/entities.ts:605:2 - (ae-forgotten-export) The symbol "ModerationLogPayloads" needs to be exported by the entry point index.d.ts // src/streaming.types.ts:33:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/misskey-js/src/entities.ts b/packages/misskey-js/src/entities.ts index e05412abb..659045bd6 100644 --- a/packages/misskey-js/src/entities.ts +++ b/packages/misskey-js/src/entities.ts @@ -28,6 +28,8 @@ export type UserLite = { faviconUrl: Instance['faviconUrl']; themeColor: Instance['themeColor']; }; + isCat?: boolean; + isBot?: boolean; }; export type UserDetailed = UserLite & { From 5891adc5cfbdd02a091d8a60b44b4ac4216d5756 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 11:42:52 +0900 Subject: [PATCH 009/126] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f895f800..d0db7ed65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ - Enhance: TLの返信表示オプションを記憶するように ### Server +- Enhance: タイムライン取得時のパフォーマンスを向上 - Enhance: ストリーミングAPIのパフォーマンスを向上 - Fix: users/notesでDBから参照した際にチャンネル投稿のみ取得される問題を修正 - Fix: コントロールパネルの設定項目が正しく保存できない問題を修正 From f85a6559158e0227203771614fbad4a44c5a8668 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 11:43:28 +0900 Subject: [PATCH 010/126] 2023.10.2-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8808b71d7..a60c641e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "2023.10.2-beta.1", + "version": "2023.10.2-beta.2", "codename": "nasubi", "repository": { "type": "git", From 431d8c7802df0df8863211fd797a2eb073be7229 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 16:22:19 +0900 Subject: [PATCH 011/126] =?UTF-8?q?fix(backend):=20Redis=E3=81=8C=E3=81=8B?= =?UTF-8?q?=E3=82=89=E3=81=AE=E3=81=A8=E3=81=8D=E3=81=ABhybrid-timeline?= =?UTF-8?q?=E3=81=ABwithReplies=20=3D=20true=E3=81=A7=E3=82=A2=E3=82=AF?= =?UTF-8?q?=E3=82=BB=E3=82=B9=E3=81=99=E3=82=8B=E3=81=A8SQL=E3=81=AE?= =?UTF-8?q?=E3=82=B7=E3=83=B3=E3=82=BF=E3=83=83=E3=82=AF=E3=82=B9=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=81=AB=E3=81=AA=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #12064 --- .../backend/src/server/api/endpoints/notes/hybrid-timeline.ts | 2 ++ 1 file changed, 2 insertions(+) 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 9986c6e43..f8a7a6a8b 100644 --- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -123,6 +123,8 @@ export default class extends Endpoint { // eslint- noteIds.sort((a, b) => a > b ? -1 : 1); noteIds = noteIds.slice(0, ps.limit); + shouldFallbackToDb = shouldFallbackToDb || (noteIds.length === 0); + if (!shouldFallbackToDb) { const query = this.notesRepository.createQueryBuilder('note') .where('note.id IN (:...noteIds)', { noteIds: noteIds }) From 93d3501c907945a875453ed974955c22377aa272 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Thu, 19 Oct 2023 17:29:09 +0900 Subject: [PATCH 012/126] fix: replies are included even if withReplies = false in local timeline (#12074) --- .../src/server/api/endpoints/notes/local-timeline.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 9d5688f96..3b6c93fdf 100644 --- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts @@ -163,6 +163,18 @@ export default class extends Endpoint { // eslint- query.andWhere('note.fileIds != \'{}\''); } + if (!ps.withReplies) { + query.andWhere(new Brackets(qb => { + qb + .where('note.replyId IS NULL') // 返信ではない + .orWhere(new Brackets(qb => { + qb // 返信だけど投稿者自身への返信 + .where('note.replyId IS NOT NULL') + .andWhere('note.replyUserId = note.userId'); + })); + })); + } + const timeline = await query.limit(ps.limit).getMany(); process.nextTick(() => { From 721cbe085b39dc8feeb4e57cf75d9c801a5db66d Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 17:42:19 +0900 Subject: [PATCH 013/126] fix(frontend): fix of 30efd932a5 --- .../frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts index ea3655f6b..f937b5f9e 100644 --- a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts +++ b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts @@ -60,7 +60,7 @@ export default function(props: { switch (token.type) { case 'text': { let text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n'); - if (!disableNyaize && props.author.isCat) { + if (!disableNyaize && props.author?.isCat) { text = nyaize(text); } From 9afcdd10ed93b5dc877de510f8702213b674a083 Mon Sep 17 00:00:00 2001 From: "A.Yamamoto" <49822810+na2na-p@users.noreply.github.com> Date: Thu, 19 Oct 2023 19:33:45 +0900 Subject: [PATCH 014/126] =?UTF-8?q?UserLite.name=E3=81=ABnull=E3=81=8C?= =?UTF-8?q?=E5=85=A5=E3=82=8A=E3=81=86=E3=82=8B=E3=81=AE=E3=82=92=E5=9E=8B?= =?UTF-8?q?=E3=81=A7=E6=98=8E=E7=A4=BA=20(#12073)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * UserLite.nameにnullが入りうるのを型で明示 * ドキュメントの追従 --- packages/misskey-js/etc/misskey-js.api.md | 2 +- packages/misskey-js/src/entities.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md index 54bbfae14..0136df203 100644 --- a/packages/misskey-js/etc/misskey-js.api.md +++ b/packages/misskey-js/etc/misskey-js.api.md @@ -2961,7 +2961,7 @@ type UserLite = { id: ID; username: string; host: string | null; - name: string; + name: string | null; onlineStatus: 'online' | 'active' | 'offline' | 'unknown'; avatarUrl: string; avatarBlurhash: string; diff --git a/packages/misskey-js/src/entities.ts b/packages/misskey-js/src/entities.ts index 659045bd6..50b4a40c4 100644 --- a/packages/misskey-js/src/entities.ts +++ b/packages/misskey-js/src/entities.ts @@ -12,7 +12,7 @@ export type UserLite = { id: ID; username: string; host: string | null; - name: string; + name: string | null; onlineStatus: 'online' | 'active' | 'offline' | 'unknown'; avatarUrl: string; avatarBlurhash: string; From 991fa054a6844e16b22cb8e89d78af04a8df078e Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Thu, 19 Oct 2023 19:34:52 +0900 Subject: [PATCH 015/126] =?UTF-8?q?chore:=20STL=E3=81=AEdb=20fallback?= =?UTF-8?q?=E3=81=A7withReplies=E3=81=8Ctrue=E3=81=AE=E3=81=A8=E3=81=8D?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=81=B9=E3=81=A6=E3=81=AE=E3=83=AA=E3=83=97?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=82=92=E9=99=A4=E5=A4=96=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=20(#12075)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MiFollowingを見るのは実装コストが高いため現状実装していない Co-authored-by: syuilo --- .../api/endpoints/notes/hybrid-timeline.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) 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 f8a7a6a8b..cbab13f30 100644 --- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -182,15 +182,17 @@ export default class extends Endpoint { // eslint- .leftJoinAndSelect('reply.user', 'replyUser') .leftJoinAndSelect('renote.user', 'renoteUser'); - query.andWhere(new Brackets(qb => { - qb - .where('note.replyId IS NULL') // 返信ではない - .orWhere(new Brackets(qb => { - qb // 返信だけど投稿者自身への返信 - .where('note.replyId IS NOT NULL') - .andWhere('note.replyUserId = note.userId'); - })); - })); + if (!ps.withReplies) { + query.andWhere(new Brackets(qb => { + qb + .where('note.replyId IS NULL') // 返信ではない + .orWhere(new Brackets(qb => { + qb // 返信だけど投稿者自身への返信 + .where('note.replyId IS NOT NULL') + .andWhere('note.replyUserId = note.userId'); + })); + })); + } this.queryService.generateVisibilityQuery(query, me); this.queryService.generateMutedUserQuery(query, me); From 3c3d05ba2e1e123ccac8b65bbed0fb6b429a038e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 19:35:13 +0900 Subject: [PATCH 016/126] chore(deps): bump actions/checkout from 4.1.0 to 4.1.1 (#12062) Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/api-misskey-js.yml | 2 +- .github/workflows/check_copyright_year.yml | 2 +- .github/workflows/docker-develop.yml | 2 +- .github/workflows/docker.yml | 2 +- .github/workflows/dockle.yml | 2 +- .github/workflows/lint.yml | 6 +++--- .github/workflows/pr-preview-deploy.yml | 2 +- .github/workflows/test-backend.yml | 2 +- .github/workflows/test-frontend.yml | 4 ++-- .github/workflows/test-misskey-js.yml | 2 +- .github/workflows/test-production.yml | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/api-misskey-js.yml b/.github/workflows/api-misskey-js.yml index 39f29bf77..d2df95334 100644 --- a/.github/workflows/api-misskey-js.yml +++ b/.github/workflows/api-misskey-js.yml @@ -9,7 +9,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4.1.0 + uses: actions/checkout@v4.1.1 - run: corepack enable diff --git a/.github/workflows/check_copyright_year.yml b/.github/workflows/check_copyright_year.yml index fb04cf1b0..03dfcd0a0 100644 --- a/.github/workflows/check_copyright_year.yml +++ b/.github/workflows/check_copyright_year.yml @@ -10,7 +10,7 @@ jobs: check_copyright_year: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 - run: | if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then echo "Please change copyright year!" diff --git a/.github/workflows/docker-develop.yml b/.github/workflows/docker-develop.yml index 3e5bb1790..a43789b75 100644 --- a/.github/workflows/docker-develop.yml +++ b/.github/workflows/docker-develop.yml @@ -13,7 +13,7 @@ jobs: if: github.repository == 'misskey-dev/misskey' steps: - name: Check out the repo - uses: actions/checkout@v4.1.0 + uses: actions/checkout@v4.1.1 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v3.0.0 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 33c85cbaf..08cb91c2d 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Check out the repo - uses: actions/checkout@v4.1.0 + uses: actions/checkout@v4.1.1 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v3.0.0 diff --git a/.github/workflows/dockle.yml b/.github/workflows/dockle.yml index 2a1ac3a16..edb18b04d 100644 --- a/.github/workflows/dockle.yml +++ b/.github/workflows/dockle.yml @@ -14,7 +14,7 @@ jobs: env: DOCKER_CONTENT_TRUST: 1 steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 - run: | curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v0.4.10/dockle_0.4.10_Linux-64bit.deb" sudo dpkg -i dockle.deb diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 798e6f49a..bcffc512b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,7 +11,7 @@ jobs: pnpm_install: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 with: fetch-depth: 0 submodules: true @@ -38,7 +38,7 @@ jobs: - sw - misskey-js steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 with: fetch-depth: 0 submodules: true @@ -64,7 +64,7 @@ jobs: - backend - misskey-js steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 with: fetch-depth: 0 submodules: true diff --git a/.github/workflows/pr-preview-deploy.yml b/.github/workflows/pr-preview-deploy.yml index 44f97645d..0e76bdeb2 100644 --- a/.github/workflows/pr-preview-deploy.yml +++ b/.github/workflows/pr-preview-deploy.yml @@ -53,7 +53,7 @@ jobs: # Check out merge commit - name: Fork based /deploy checkout - uses: actions/checkout@v4.1.0 + uses: actions/checkout@v4.1.1 with: ref: 'refs/pull/${{ github.event.client_payload.pull_request.number }}/merge' diff --git a/.github/workflows/test-backend.yml b/.github/workflows/test-backend.yml index ac7d1afda..752e29ff7 100644 --- a/.github/workflows/test-backend.yml +++ b/.github/workflows/test-backend.yml @@ -29,7 +29,7 @@ jobs: - 56312:6379 steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 with: submodules: true - name: Install pnpm diff --git a/.github/workflows/test-frontend.yml b/.github/workflows/test-frontend.yml index e67b51654..30829cb6a 100644 --- a/.github/workflows/test-frontend.yml +++ b/.github/workflows/test-frontend.yml @@ -16,7 +16,7 @@ jobs: node-version: [20.5.1] steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 with: submodules: true - name: Install pnpm @@ -68,7 +68,7 @@ jobs: - 56312:6379 steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 with: submodules: true # https://github.com/cypress-io/cypress-docker-images/issues/150 diff --git a/.github/workflows/test-misskey-js.yml b/.github/workflows/test-misskey-js.yml index 1846b628d..b5c6bff64 100644 --- a/.github/workflows/test-misskey-js.yml +++ b/.github/workflows/test-misskey-js.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4.1.0 + uses: actions/checkout@v4.1.1 - run: corepack enable diff --git a/.github/workflows/test-production.yml b/.github/workflows/test-production.yml index c57001896..bcb89bb45 100644 --- a/.github/workflows/test-production.yml +++ b/.github/workflows/test-production.yml @@ -19,7 +19,7 @@ jobs: node-version: [20.5.1] steps: - - uses: actions/checkout@v4.1.0 + - uses: actions/checkout@v4.1.1 with: submodules: true - name: Install pnpm From 7b361224f8f8c5215700f70d2aea57a9befa8090 Mon Sep 17 00:00:00 2001 From: atsuchan <83960488+atsu1125@users.noreply.github.com> Date: Thu, 19 Oct 2023 19:36:18 +0900 Subject: [PATCH 017/126] fix(frontend): Recieve Unrenote on streaming (#12079) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(frontend): Recieve Unrenote 表示しているリノートがリノート解除されたらストリーミングで受信してすぐに消えるようにする * fix(frontend): Recieve Unrenote lint fixing * fix(frontend): Recieve Unrenote Decapture Decapture忘れてたー --- packages/frontend/src/components/MkNote.vue | 1 + packages/frontend/src/components/MkNoteDetailed.vue | 1 + packages/frontend/src/scripts/use-note-capture.ts | 10 +++++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 5272bf865..339d2ac71 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -232,6 +232,7 @@ const keymap = { useNoteCapture({ rootEl: el, note: $$(appearNote), + pureNote: $$(note), isDeletedRef: isDeleted, }); diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index a1360aba9..273984cc0 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -296,6 +296,7 @@ const reactionsPagination = $computed(() => ({ useNoteCapture({ rootEl: el, note: $$(appearNote), + pureNote: $$(note), isDeletedRef: isDeleted, }); diff --git a/packages/frontend/src/scripts/use-note-capture.ts b/packages/frontend/src/scripts/use-note-capture.ts index c61853257..bda9c04ea 100644 --- a/packages/frontend/src/scripts/use-note-capture.ts +++ b/packages/frontend/src/scripts/use-note-capture.ts @@ -11,15 +11,17 @@ import { $i } from '@/account.js'; export function useNoteCapture(props: { rootEl: Ref; note: Ref; + pureNote: Ref; isDeletedRef: Ref; }) { const note = props.note; + const pureNote = props.pureNote; const connection = $i ? useStream() : null; function onStreamNoteUpdated(noteData): void { const { type, id, body } = noteData; - if (id !== note.value.id) return; + if ((id !== note.value.id) && (id !== pureNote.value.id)) return; switch (type) { case 'reacted': { @@ -82,6 +84,7 @@ export function useNoteCapture(props: { if (connection) { // TODO: このノートがストリーミング経由で流れてきた場合のみ sr する connection.send(document.body.contains(props.rootEl.value) ? 'sr' : 's', { id: note.value.id }); + if (pureNote.value.id !== note.value.id) connection.send('s', { id: pureNote.value.id }); if (withHandler) connection.on('noteUpdated', onStreamNoteUpdated); } } @@ -91,6 +94,11 @@ export function useNoteCapture(props: { connection.send('un', { id: note.value.id, }); + if (pureNote.value.id !== note.value.id) { + connection.send('un', { + id: pureNote.value.id, + }); + } if (withHandler) connection.off('noteUpdated', onStreamNoteUpdated); } } From 84a9e4a27b11f2eb95bd07ed4c4d00437e664ed2 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 19:47:25 +0900 Subject: [PATCH 018/126] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0db7ed65..4560cee89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ - Feat: アンテナでローカルの投稿のみ収集できるようになりました - Feat: サーバーサイレンス機能が追加されました - Enhance: 新規にフォローした人の返信をデフォルトでTLに追加できるオプションを追加 -- Enhance: HTLとLTLを2023.10.0アップデート以前まで遡れるように +- Enhance: HTL/LTL/STLを2023.10.0アップデート以前まで遡れるように - Enhance: フォロー/フォロー解除したときに過去分のHTLにも含まれる投稿が反映されるように - Enhance: ローカリゼーションの更新 - Enhance: 依存関係の更新 From d9241df84d189a373120add6b3bfe70e1de7e24a Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 19:47:36 +0900 Subject: [PATCH 019/126] New Crowdin updates (#12070) * New translations ja-jp.yml (Thai) * New translations ja-jp.yml (French) * New translations ja-jp.yml (French) * New translations ja-jp.yml (French) * New translations ja-jp.yml (Italian) * New translations ja-jp.yml (English) * New translations ja-jp.yml (Korean) * New translations ja-jp.yml (Japanese, Kansai) * New translations ja-jp.yml (Chinese Traditional) --- locales/en-US.yml | 2 +- locales/fr-FR.yml | 15 +++++++++++++-- locales/it-IT.yml | 6 ++++-- locales/ja-KS.yml | 2 +- locales/ko-KR.yml | 2 +- locales/th-TH.yml | 4 ++-- locales/zh-TW.yml | 5 +++++ 7 files changed, 27 insertions(+), 9 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index f131b18cb..5f588efd4 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -593,7 +593,7 @@ poll: "Poll" useCw: "Hide content" enablePlayer: "Open video player" disablePlayer: "Close video player" -expandTweet: "Expand tweet" +expandTweet: "Expand post" themeEditor: "Theme editor" description: "Description" describeFile: "Add caption" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index b2440c2b6..7d97c976a 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -387,7 +387,7 @@ antennaSource: "Source de l’antenne" antennaKeywords: "Mots clés à recevoir" antennaExcludeKeywords: "Mots clés à exclure" antennaKeywordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec un saut de ligne pour une condition OR." -notifyAntenna: "Je souhaite recevoir les notifications des nouvelles notes" +notifyAntenna: "Me notifier pour les nouvelles notes" withFileAntenna: "Notes ayant des attachements uniquement" enableServiceworker: "Activer ServiceWorker" antennaUsersDescription: "Saisissez un seul nom d’utilisateur·rice par ligne" @@ -985,11 +985,13 @@ internalServerError: "Erreur interne du serveur" copyErrorInfo: "Copier les détails de l’erreur" exploreOtherServers: "Trouver une autre instance" disableFederationOk: "Désactiver" +postToTheChannel: "Publier au canal" likeOnly: "Les favoris uniquement" sensitiveWords: "Mots sensibles" notesSearchNotAvailable: "La recherche de notes n'est pas disponible." license: "Licence" myClips: "Mes clips" +retryAllQueuesConfirmText: "Cela peut augmenter temporairement la charge du serveur." showClipButtonInNoteFooter: "Ajouter « Clip » au menu d'action de la note" noteIdOrUrl: "Identifiant de la note ou URL" video: "Vidéo" @@ -1013,21 +1015,30 @@ vertical: "Vertical" horizontal: "Latéral" position: "Position" serverRules: "Règles du serveur" -preservedUsernames: "Nom d'utilisateur·rice réservé" +pleaseAgreeAllToContinue: "Pour continuer, veuillez accepter tous les champs ci-dessus." +continue: "Continuer" +preservedUsernames: "Noms d'utilisateur·rice réservés" archive: "Archive" displayOfNote: "Affichage de la note" +initialAccountSetting: "Réglage initial du profil" youFollowing: "Abonné·e" +preventAiLearning: "Refuser l'usage dans l'apprentissage automatique d'IA générative" options: "Options" later: "Plus tard" goToMisskey: "Retour vers Misskey" expirationDate: "Date d’expiration" +waitingForMailAuth: "En attente de la vérification de l'adresse courriel" usedAt: "Utilisé le" unused: "Non-utilisé" used: "Utilisé" expired: "Expiré" doYouAgree: "Êtes-vous d’accord ?" +beSureToReadThisAsItIsImportant: "Assurez-vous de le lire ; c'est important." +dialog: "Dialogue" icon: "Avatar" forYou: "Pour vous" +currentAnnouncements: "Annonces actuelles" +pastAnnouncements: "Annonces passées" replies: "Répondre" renotes: "Renoter" loadReplies: "Inclure les réponses" diff --git a/locales/it-IT.yml b/locales/it-IT.yml index 15b2c7cbd..fb78c108a 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -110,7 +110,7 @@ unrenote: "Elimina la Rinota" renoted: "Rinotato!" cantRenote: "È impossibile rinotare questa nota." cantReRenote: "È impossibile rinotare una Rinota." -quote: "Cita" +quote: "Citazione" inChannelRenote: "Rinota nel canale" inChannelQuote: "Cita nel canale" pinnedNote: "Nota in primo piano" @@ -534,6 +534,7 @@ serverLogs: "Log del server" deleteAll: "Cancella cronologia" showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timeline" showFixedPostFormInChannel: "Per i canali, mostra il modulo di pubblicazione in cima alla timeline" +withRepliesByDefaultForNewlyFollowed: "Quando segui nuovi profili, includi le risposte in TL come impostazione predefinita" newNoteRecived: "Nuove note da leggere" sounds: "Impostazioni suoni" sound: "Suono" @@ -1924,6 +1925,7 @@ _exportOrImport: userLists: "Liste" excludeMutingUsers: "Escludere gli utenti silenziati" excludeInactiveUsers: "Escludere i profili inutilizzati" + withReplies: "Includere le risposte da profili importati nella Timeline" _charts: federation: "Federazione" apRequest: "Richieste" @@ -2088,7 +2090,7 @@ _deck: list: "Liste" channel: "Canale" mentions: "Menzioni" - direct: "Diretta" + direct: "Note Dirette" roleTimeline: "Timeline Ruolo" _dialog: charactersExceeded: "Hai superato il limite di {max} caratteri! ({corrente})" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 5efd8cd11..860b47f3e 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -586,7 +586,7 @@ poll: "アンケート" useCw: "内容を隠す" enablePlayer: "プレイヤーを開く" disablePlayer: "プレイヤーを閉じる" -expandTweet: "ツイートを展開する" +expandTweet: "ポストを展開する" themeEditor: "テーマエディター" description: "説明" describeFile: "キャプションを付ける" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index d5c346717..c9f145bc4 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -589,7 +589,7 @@ poll: "투표" useCw: "내용 숨기기" enablePlayer: "플레이어 열기" disablePlayer: "플레이어 닫기" -expandTweet: "트윗 확장하기" +expandTweet: "게시물 확장하기" themeEditor: "테마 에디터" description: "설명" describeFile: "캡션 추가" diff --git a/locales/th-TH.yml b/locales/th-TH.yml index a706d3990..ebfab39ea 100644 --- a/locales/th-TH.yml +++ b/locales/th-TH.yml @@ -1747,8 +1747,8 @@ _2fa: renewTOTPOk: "ตั้งค่าคอนฟิกใหม่" renewTOTPCancel: "ไม่เป็นไร" backupCodes: "รหัสสำรองข้อมูล" - backupCodeUsedWarning: "มีการใช้รหัสสำรองแล้ว โปรดกรุณากำหนดค่าการตรวจสอบสิทธิ์แบบสองปัจจัยโดยเร็วที่สุดถ้าหากคุณยังไม่สามารถใช้งานได้อีกต่อไป" - backupCodesExhaustedWarning: "รหัสสำรองทั้งหมดถูกใช้แล้วถ้าหากคุณยังสูญเสียการเข้าถึงแอปการตรวจสอบสิทธิ์แบบสองปัจจัยคุณจะไม่สามารถเข้าถึงบัญชีนี้ได้ กรุณากำหนดค่าการรับรองความถูกต้องด้วยการยืนยันสองชั้น" + backupCodeUsedWarning: "มีการใช้รหัสสำรองแล้ว โปรดกรุณากำหนดค่าการตรวจสอบสิทธิ์แบบสองปัจจัยโดยเร็วที่สุดถ้าหากคุณยังไม่สามารถใช้งานได้อีก" + backupCodesExhaustedWarning: "รหัสสำรองทั้งหมดถูกใช้แล้ว ถ้าหากคุณยังสูญเสียการเข้าถึงแอปการตรวจสอบสิทธิ์แบบสองปัจจัยคุณจะยังไม่สามารถเข้าถึงบัญชีนี้ได้ กรุณากำหนดค่าการรับรองความถูกต้องด้วยการยืนยันสองชั้น" _permissions: "read:account": "ดูข้อมูลบัญชีของคุณ" "write:account": "แก้ไขข้อมูลบัญชีของคุณ" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index acb4dfa5e..7fa30c1c6 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -195,6 +195,7 @@ perHour: "每小時" perDay: "每日" stopActivityDelivery: "停止發送活動" blockThisInstance: "封鎖此伺服器" +silenceThisInstance: "禁言此伺服器" operations: "操作" software: "軟體" version: "版本" @@ -214,6 +215,8 @@ clearCachedFiles: "清除快取資料" clearCachedFilesConfirm: "確定要清除所有遠端暫存資料嗎?" blockedInstances: "已封鎖的伺服器" blockedInstancesDescription: "請逐行輸入需要封鎖的伺服器。已封鎖的伺服器將無法與本伺服器進行通訊。" +silencedInstances: "被禁言的伺服器" +silencedInstancesDescription: "設定要禁言的伺服器主機名稱,以換行分隔。隸屬於禁言伺服器的所有帳戶都將被視為「禁言帳戶」,只能發出「追隨請求」,而且無法提及未追隨的本地帳戶。這不會影響已封鎖的實例。" muteAndBlock: "靜音和封鎖" mutedUsers: "被靜音的使用者" blockedUsers: "被封鎖的使用者" @@ -531,6 +534,7 @@ serverLogs: "伺服器日誌" deleteAll: "刪除所有記錄" showFixedPostForm: "於時間軸頁頂顯示「發送貼文」方框" showFixedPostFormInChannel: "於時間軸頁頂顯示「發送貼文」方框(頻道)" +withRepliesByDefaultForNewlyFollowed: "在追隨其他人後,預設在時間軸納入回覆的貼文" newNoteRecived: "發現新貼文" sounds: "音效" sound: "音效" @@ -1921,6 +1925,7 @@ _exportOrImport: userLists: "清單" excludeMutingUsers: "排除被靜音的使用者" excludeInactiveUsers: "排除不活躍帳戶" + withReplies: "將被匯入的追隨中清單的貼文回覆包含在時間軸" _charts: federation: "聯邦宇宙" apRequest: "請求" From cc256f117eebe76fb9a5107a82622c53af9483a1 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 19:51:59 +0900 Subject: [PATCH 020/126] update deps --- package.json | 4 +- packages/backend/package.json | 66 +-- packages/frontend/package.json | 32 +- packages/misskey-js/package.json | 4 +- packages/sw/package.json | 2 +- pnpm-lock.yaml | 831 ++++++++++++++----------------- 6 files changed, 439 insertions(+), 500 deletions(-) diff --git a/package.json b/package.json index a60c641e6..973e26165 100644 --- a/package.json +++ b/package.json @@ -47,14 +47,14 @@ "cssnano": "6.0.1", "js-yaml": "4.1.0", "postcss": "8.4.31", - "terser": "5.21.0", + "terser": "5.22.0", "typescript": "5.2.2" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "6.8.0", "@typescript-eslint/parser": "6.8.0", "cross-env": "7.0.3", - "cypress": "13.3.1", + "cypress": "13.3.2", "eslint": "8.51.0", "start-server-and-test": "2.0.1" }, diff --git a/packages/backend/package.json b/packages/backend/package.json index 30ca2e110..2518b0dd7 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -76,7 +76,7 @@ "@nestjs/testing": "10.2.7", "@peertube/http-signature": "1.7.0", "@simplewebauthn/server": "8.3.2", - "@sinonjs/fake-timers": "11.1.0", + "@sinonjs/fake-timers": "11.2.1", "@swc/cli": "0.1.62", "@swc/core": "1.3.93", "accepts": "1.3.8", @@ -86,7 +86,7 @@ "bcryptjs": "2.4.3", "blurhash": "2.0.5", "body-parser": "1.20.2", - "bullmq": "4.12.4", + "bullmq": "4.12.5", "cacheable-lookup": "7.0.0", "cbor": "9.0.1", "chalk": "5.3.0", @@ -97,7 +97,7 @@ "content-disposition": "0.5.4", "date-fns": "2.30.0", "deep-email-validator": "0.1.21", - "fastify": "4.24.2", + "fastify": "4.24.3", "feed": "4.2.2", "file-type": "18.5.0", "fluent-ffmpeg": "2.1.2", @@ -180,38 +180,38 @@ "@types/cbor": "6.0.0", "@types/color-convert": "2.0.2", "@types/content-disposition": "0.5.7", - "@types/fluent-ffmpeg": "2.1.22", - "@types/http-link-header": "1.0.3", - "@types/jest": "29.5.5", - "@types/js-yaml": "4.0.7", - "@types/jsdom": "21.1.3", - "@types/jsonld": "1.5.10", - "@types/jsrsasign": "10.5.9", - "@types/mime-types": "2.1.2", - "@types/ms": "0.7.32", - "@types/node": "20.8.6", + "@types/fluent-ffmpeg": "2.1.23", + "@types/http-link-header": "1.0.4", + "@types/jest": "29.5.6", + "@types/js-yaml": "4.0.8", + "@types/jsdom": "21.1.4", + "@types/jsonld": "1.5.11", + "@types/jsrsasign": "10.5.10", + "@types/mime-types": "2.1.3", + "@types/ms": "0.7.33", + "@types/node": "20.8.7", "@types/node-fetch": "3.0.3", - "@types/nodemailer": "6.4.11", - "@types/oauth": "0.9.2", - "@types/oauth2orize": "1.11.1", - "@types/oauth2orize-pkce": "0.1.0", - "@types/pg": "8.10.5", - "@types/pug": "2.0.7", - "@types/punycode": "2.1.0", - "@types/qrcode": "1.5.2", - "@types/random-seed": "0.3.3", - "@types/ratelimiter": "3.4.4", - "@types/rename": "1.0.5", - "@types/sanitize-html": "2.9.2", - "@types/semver": "7.5.3", + "@types/nodemailer": "6.4.13", + "@types/oauth": "0.9.3", + "@types/oauth2orize": "1.11.2", + "@types/oauth2orize-pkce": "0.1.1", + "@types/pg": "8.10.7", + "@types/pug": "2.0.8", + "@types/punycode": "2.1.1", + "@types/qrcode": "1.5.4", + "@types/random-seed": "0.3.4", + "@types/ratelimiter": "3.4.5", + "@types/rename": "1.0.6", + "@types/sanitize-html": "2.9.3", + "@types/semver": "7.5.4", "@types/sharp": "0.32.0", - "@types/simple-oauth2": "5.0.5", - "@types/sinonjs__fake-timers": "8.1.3", - "@types/tinycolor2": "1.4.4", - "@types/tmp": "0.2.4", - "@types/vary": "1.1.1", - "@types/web-push": "3.6.1", - "@types/ws": "8.5.7", + "@types/simple-oauth2": "5.0.6", + "@types/sinonjs__fake-timers": "8.1.4", + "@types/tinycolor2": "1.4.5", + "@types/tmp": "0.2.5", + "@types/vary": "1.1.2", + "@types/web-push": "3.6.2", + "@types/ws": "8.5.8", "@typescript-eslint/eslint-plugin": "6.8.0", "@typescript-eslint/parser": "6.8.0", "aws-sdk-client-mock": "3.0.0", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index feadbbb04..05498c6ae 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -29,7 +29,7 @@ "@vue/compiler-sfc": "3.3.4", "astring": "1.8.6", "autosize": "6.0.1", - "broadcast-channel": "5.4.0", + "broadcast-channel": "5.5.0", "browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3", "buraha": "0.0.1", "canvas-confetti": "1.6.1", @@ -59,7 +59,7 @@ "querystring": "0.2.1", "rollup": "4.1.4", "sanitize-html": "2.11.0", - "sass": "1.69.3", + "sass": "1.69.4", "strict-event-emitter-types": "2.0.0", "textarea-caret": "3.1.0", "three": "0.157.0", @@ -72,7 +72,7 @@ "uuid": "9.0.1", "v-code-diff": "1.7.1", "vanilla-tilt": "1.8.1", - "vite": "4.4.11", + "vite": "4.5.0", "vue": "3.3.4", "vue-prism-editor": "2.0.0-alpha.2", "vuedraggable": "next" @@ -97,25 +97,25 @@ "@storybook/vue3": "7.5.0", "@storybook/vue3-vite": "7.5.0", "@testing-library/vue": "7.0.0", - "@types/escape-regexp": "0.0.1", - "@types/estree": "1.0.2", - "@types/matter-js": "0.19.1", - "@types/micromatch": "4.0.3", - "@types/node": "20.8.6", - "@types/punycode": "2.1.0", - "@types/sanitize-html": "2.9.2", - "@types/throttle-debounce": "5.0.0", - "@types/tinycolor2": "1.4.4", - "@types/uuid": "9.0.5", - "@types/websocket": "1.0.7", - "@types/ws": "8.5.7", + "@types/escape-regexp": "0.0.2", + "@types/estree": "1.0.3", + "@types/matter-js": "0.19.2", + "@types/micromatch": "4.0.4", + "@types/node": "20.8.7", + "@types/punycode": "2.1.1", + "@types/sanitize-html": "2.9.3", + "@types/throttle-debounce": "5.0.1", + "@types/tinycolor2": "1.4.5", + "@types/uuid": "9.0.6", + "@types/websocket": "1.0.8", + "@types/ws": "8.5.8", "@typescript-eslint/eslint-plugin": "6.8.0", "@typescript-eslint/parser": "6.8.0", "@vitest/coverage-v8": "0.34.6", "@vue/runtime-core": "3.3.4", "acorn": "8.10.0", "cross-env": "7.0.3", - "cypress": "13.3.1", + "cypress": "13.3.2", "eslint": "8.51.0", "eslint-plugin-import": "2.28.1", "eslint-plugin-vue": "9.17.0", diff --git a/packages/misskey-js/package.json b/packages/misskey-js/package.json index 2f65c3b95..5b683e547 100644 --- a/packages/misskey-js/package.json +++ b/packages/misskey-js/package.json @@ -22,8 +22,8 @@ "devDependencies": { "@microsoft/api-extractor": "7.38.0", "@swc/jest": "0.2.29", - "@types/jest": "29.5.5", - "@types/node": "20.8.6", + "@types/jest": "29.5.6", + "@types/node": "20.8.7", "@typescript-eslint/eslint-plugin": "6.8.0", "@typescript-eslint/parser": "6.8.0", "eslint": "8.51.0", diff --git a/packages/sw/package.json b/packages/sw/package.json index c045b3216..6eeab6cc0 100644 --- a/packages/sw/package.json +++ b/packages/sw/package.json @@ -9,7 +9,7 @@ "lint": "pnpm typecheck && pnpm eslint" }, "dependencies": { - "esbuild": "0.19.4", + "esbuild": "0.19.5", "idb-keyval": "6.2.1", "misskey-js": "workspace:*" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08f6e9b12..df0558e56 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,8 +25,8 @@ importers: specifier: 8.4.31 version: 8.4.31 terser: - specifier: 5.21.0 - version: 5.21.0 + specifier: 5.22.0 + version: 5.22.0 typescript: specifier: 5.2.2 version: 5.2.2 @@ -45,8 +45,8 @@ importers: specifier: 7.0.3 version: 7.0.3 cypress: - specifier: 13.3.1 - version: 13.3.1 + specifier: 13.3.2 + version: 13.3.2 eslint: specifier: 8.51.0 version: 8.51.0 @@ -114,8 +114,8 @@ importers: specifier: 8.3.2 version: 8.3.2 '@sinonjs/fake-timers': - specifier: 11.1.0 - version: 11.1.0 + specifier: 11.2.1 + version: 11.2.1 '@smithy/node-http-handler': specifier: 2.1.5 version: 2.1.5 @@ -147,8 +147,8 @@ importers: specifier: 1.20.2 version: 1.20.2 bullmq: - specifier: 4.12.4 - version: 4.12.4 + specifier: 4.12.5 + version: 4.12.5 cacheable-lookup: specifier: 7.0.0 version: 7.0.0 @@ -180,8 +180,8 @@ importers: specifier: 0.1.21 version: 0.1.21 fastify: - specifier: 4.24.2 - version: 4.24.2 + specifier: 4.24.3 + version: 4.24.3 feed: specifier: 4.2.2 version: 4.2.2 @@ -512,101 +512,101 @@ importers: specifier: 0.5.7 version: 0.5.7 '@types/fluent-ffmpeg': - specifier: 2.1.22 - version: 2.1.22 + specifier: 2.1.23 + version: 2.1.23 '@types/http-link-header': - specifier: 1.0.3 - version: 1.0.3 + specifier: 1.0.4 + version: 1.0.4 '@types/jest': - specifier: 29.5.5 - version: 29.5.5 + specifier: 29.5.6 + version: 29.5.6 '@types/js-yaml': - specifier: 4.0.7 - version: 4.0.7 + specifier: 4.0.8 + version: 4.0.8 '@types/jsdom': - specifier: 21.1.3 - version: 21.1.3 + specifier: 21.1.4 + version: 21.1.4 '@types/jsonld': - specifier: 1.5.10 - version: 1.5.10 + specifier: 1.5.11 + version: 1.5.11 '@types/jsrsasign': - specifier: 10.5.9 - version: 10.5.9 + specifier: 10.5.10 + version: 10.5.10 '@types/mime-types': - specifier: 2.1.2 - version: 2.1.2 + specifier: 2.1.3 + version: 2.1.3 '@types/ms': - specifier: 0.7.32 - version: 0.7.32 + specifier: 0.7.33 + version: 0.7.33 '@types/node': - specifier: 20.8.6 - version: 20.8.6 + specifier: 20.8.7 + version: 20.8.7 '@types/node-fetch': specifier: 3.0.3 version: 3.0.3 '@types/nodemailer': - specifier: 6.4.11 - version: 6.4.11 + specifier: 6.4.13 + version: 6.4.13 '@types/oauth': - specifier: 0.9.2 - version: 0.9.2 + specifier: 0.9.3 + version: 0.9.3 '@types/oauth2orize': - specifier: 1.11.1 - version: 1.11.1 + specifier: 1.11.2 + version: 1.11.2 '@types/oauth2orize-pkce': - specifier: 0.1.0 - version: 0.1.0 + specifier: 0.1.1 + version: 0.1.1 '@types/pg': - specifier: 8.10.5 - version: 8.10.5 + specifier: 8.10.7 + version: 8.10.7 '@types/pug': - specifier: 2.0.7 - version: 2.0.7 + specifier: 2.0.8 + version: 2.0.8 '@types/punycode': - specifier: 2.1.0 - version: 2.1.0 + specifier: 2.1.1 + version: 2.1.1 '@types/qrcode': - specifier: 1.5.2 - version: 1.5.2 + specifier: 1.5.4 + version: 1.5.4 '@types/random-seed': - specifier: 0.3.3 - version: 0.3.3 + specifier: 0.3.4 + version: 0.3.4 '@types/ratelimiter': - specifier: 3.4.4 - version: 3.4.4 + specifier: 3.4.5 + version: 3.4.5 '@types/rename': - specifier: 1.0.5 - version: 1.0.5 + specifier: 1.0.6 + version: 1.0.6 '@types/sanitize-html': - specifier: 2.9.2 - version: 2.9.2 + specifier: 2.9.3 + version: 2.9.3 '@types/semver': - specifier: 7.5.3 - version: 7.5.3 + specifier: 7.5.4 + version: 7.5.4 '@types/sharp': specifier: 0.32.0 version: 0.32.0 '@types/simple-oauth2': - specifier: 5.0.5 - version: 5.0.5 + specifier: 5.0.6 + version: 5.0.6 '@types/sinonjs__fake-timers': - specifier: 8.1.3 - version: 8.1.3 + specifier: 8.1.4 + version: 8.1.4 '@types/tinycolor2': - specifier: 1.4.4 - version: 1.4.4 + specifier: 1.4.5 + version: 1.4.5 '@types/tmp': - specifier: 0.2.4 - version: 0.2.4 + specifier: 0.2.5 + version: 0.2.5 '@types/vary': - specifier: 1.1.1 - version: 1.1.1 + specifier: 1.1.2 + version: 1.1.2 '@types/web-push': - specifier: 3.6.1 - version: 3.6.1 + specifier: 3.6.2 + version: 3.6.2 '@types/ws': - specifier: 8.5.7 - version: 8.5.7 + specifier: 8.5.8 + version: 8.5.8 '@typescript-eslint/eslint-plugin': specifier: 6.8.0 version: 6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2) @@ -630,7 +630,7 @@ importers: version: 8.0.1 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.8.6) + version: 29.7.0(@types/node@20.8.7) jest-mock: specifier: 29.7.0 version: 29.7.0 @@ -666,7 +666,7 @@ importers: version: 2.37.0 '@vitejs/plugin-vue': specifier: 4.4.0 - version: 4.4.0(vite@4.4.11)(vue@3.3.4) + version: 4.4.0(vite@4.5.0)(vue@3.3.4) '@vue-macros/reactivity-transform': specifier: 0.3.23 version: 0.3.23(rollup@4.1.4)(vue@3.3.4) @@ -680,8 +680,8 @@ importers: specifier: 6.0.1 version: 6.0.1 broadcast-channel: - specifier: 5.4.0 - version: 5.4.0 + specifier: 5.5.0 + version: 5.5.0 browser-image-resizer: specifier: github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3 version: github.com/misskey-dev/browser-image-resizer/0227e860621e55cbed0aabe6dc601096a7748c4a @@ -770,8 +770,8 @@ importers: specifier: 2.11.0 version: 2.11.0 sass: - specifier: 1.69.3 - version: 1.69.3 + specifier: 1.69.4 + version: 1.69.4 strict-event-emitter-types: specifier: 2.0.0 version: 2.0.0 @@ -809,8 +809,8 @@ importers: specifier: 1.8.1 version: 1.8.1 vite: - specifier: 4.4.11 - version: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + specifier: 4.5.0 + version: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) vue: specifier: 3.3.4 version: 3.3.4 @@ -859,7 +859,7 @@ importers: version: 7.5.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@storybook/react-vite': specifier: 7.5.0 - version: 7.5.0(react-dom@18.2.0)(react@18.2.0)(rollup@4.1.4)(typescript@5.2.2)(vite@4.4.11) + version: 7.5.0(react-dom@18.2.0)(react@18.2.0)(rollup@4.1.4)(typescript@5.2.2)(vite@4.5.0) '@storybook/testing-library': specifier: 0.2.2 version: 0.2.2 @@ -874,46 +874,46 @@ importers: version: 7.5.0(@vue/compiler-core@3.3.4)(vue@3.3.4) '@storybook/vue3-vite': specifier: 7.5.0 - version: 7.5.0(@vue/compiler-core@3.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.4.11)(vue@3.3.4) + version: 7.5.0(@vue/compiler-core@3.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.0)(vue@3.3.4) '@testing-library/vue': specifier: 7.0.0 version: 7.0.0(@vue/compiler-sfc@3.3.4)(vue@3.3.4) '@types/escape-regexp': - specifier: 0.0.1 - version: 0.0.1 + specifier: 0.0.2 + version: 0.0.2 '@types/estree': - specifier: 1.0.2 - version: 1.0.2 + specifier: 1.0.3 + version: 1.0.3 '@types/matter-js': - specifier: 0.19.1 - version: 0.19.1 + specifier: 0.19.2 + version: 0.19.2 '@types/micromatch': - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.0.4 + version: 4.0.4 '@types/node': - specifier: 20.8.6 - version: 20.8.6 + specifier: 20.8.7 + version: 20.8.7 '@types/punycode': - specifier: 2.1.0 - version: 2.1.0 + specifier: 2.1.1 + version: 2.1.1 '@types/sanitize-html': - specifier: 2.9.2 - version: 2.9.2 + specifier: 2.9.3 + version: 2.9.3 '@types/throttle-debounce': - specifier: 5.0.0 - version: 5.0.0 + specifier: 5.0.1 + version: 5.0.1 '@types/tinycolor2': - specifier: 1.4.4 - version: 1.4.4 + specifier: 1.4.5 + version: 1.4.5 '@types/uuid': - specifier: 9.0.5 - version: 9.0.5 + specifier: 9.0.6 + version: 9.0.6 '@types/websocket': - specifier: 1.0.7 - version: 1.0.7 + specifier: 1.0.8 + version: 1.0.8 '@types/ws': - specifier: 8.5.7 - version: 8.5.7 + specifier: 8.5.8 + version: 8.5.8 '@typescript-eslint/eslint-plugin': specifier: 6.8.0 version: 6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2) @@ -933,8 +933,8 @@ importers: specifier: 7.0.3 version: 7.0.3 cypress: - specifier: 13.3.1 - version: 13.3.1 + specifier: 13.3.2 + version: 13.3.2 eslint: specifier: 8.51.0 version: 8.51.0 @@ -979,7 +979,7 @@ importers: version: 7.5.0 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.5.0)(@storybook/components@7.4.6)(@storybook/core-events@7.5.0)(@storybook/manager-api@7.5.0)(@storybook/preview-api@7.5.0)(@storybook/theming@7.5.0)(@storybook/types@7.5.0)(react-dom@18.2.0)(react@18.2.0) + version: github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.5.0)(@storybook/components@7.5.0)(@storybook/core-events@7.5.0)(@storybook/manager-api@7.5.0)(@storybook/preview-api@7.5.0)(@storybook/theming@7.5.0)(@storybook/types@7.5.0)(react-dom@18.2.0)(react@18.2.0) summaly: specifier: github:misskey-dev/summaly version: github.com/misskey-dev/summaly/d2d8db49943ccb201c1b1b283e9d0a630519fac7 @@ -988,7 +988,7 @@ importers: version: 1.0.3 vitest: specifier: 0.34.6 - version: 0.34.6(happy-dom@10.0.3)(sass@1.69.3)(terser@5.21.0) + version: 0.34.6(happy-dom@10.0.3)(sass@1.69.4)(terser@5.22.0) vitest-fetch-mock: specifier: 0.2.2 version: 0.2.2(vitest@0.34.6) @@ -1016,16 +1016,16 @@ importers: devDependencies: '@microsoft/api-extractor': specifier: 7.38.0 - version: 7.38.0(@types/node@20.8.6) + version: 7.38.0(@types/node@20.8.7) '@swc/jest': specifier: 0.2.29 version: 0.2.29(@swc/core@1.3.93) '@types/jest': - specifier: 29.5.5 - version: 29.5.5 + specifier: 29.5.6 + version: 29.5.6 '@types/node': - specifier: 20.8.6 - version: 20.8.6 + specifier: 20.8.7 + version: 20.8.7 '@typescript-eslint/eslint-plugin': specifier: 6.8.0 version: 6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2) @@ -1037,7 +1037,7 @@ importers: version: 8.51.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.8.6) + version: 29.7.0(@types/node@20.8.7) jest-fetch-mock: specifier: 3.0.3 version: 3.0.3 @@ -1057,8 +1057,8 @@ importers: packages/sw: dependencies: esbuild: - specifier: 0.19.4 - version: 0.19.4 + specifier: 0.19.5 + version: 0.19.5 idb-keyval: specifier: 6.2.1 version: 6.2.1 @@ -3014,6 +3014,14 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 + dev: true + + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: false /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} @@ -3320,8 +3328,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm64@0.19.4: - resolution: {integrity: sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==} + /@esbuild/android-arm64@0.19.5: + resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -3337,8 +3345,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm@0.19.4: - resolution: {integrity: sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==} + /@esbuild/android-arm@0.19.5: + resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -3354,8 +3362,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-x64@0.19.4: - resolution: {integrity: sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==} + /@esbuild/android-x64@0.19.5: + resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -3371,8 +3379,8 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.19.4: - resolution: {integrity: sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==} + /@esbuild/darwin-arm64@0.19.5: + resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -3388,8 +3396,8 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-x64@0.19.4: - resolution: {integrity: sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==} + /@esbuild/darwin-x64@0.19.5: + resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -3405,8 +3413,8 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.19.4: - resolution: {integrity: sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==} + /@esbuild/freebsd-arm64@0.19.5: + resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -3422,8 +3430,8 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.19.4: - resolution: {integrity: sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==} + /@esbuild/freebsd-x64@0.19.5: + resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -3439,8 +3447,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm64@0.19.4: - resolution: {integrity: sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==} + /@esbuild/linux-arm64@0.19.5: + resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -3456,8 +3464,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm@0.19.4: - resolution: {integrity: sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==} + /@esbuild/linux-arm@0.19.5: + resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -3473,8 +3481,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ia32@0.19.4: - resolution: {integrity: sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==} + /@esbuild/linux-ia32@0.19.5: + resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -3490,8 +3498,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-loong64@0.19.4: - resolution: {integrity: sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==} + /@esbuild/linux-loong64@0.19.5: + resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -3507,8 +3515,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.19.4: - resolution: {integrity: sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==} + /@esbuild/linux-mips64el@0.19.5: + resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -3524,8 +3532,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.19.4: - resolution: {integrity: sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==} + /@esbuild/linux-ppc64@0.19.5: + resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -3541,8 +3549,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.19.4: - resolution: {integrity: sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==} + /@esbuild/linux-riscv64@0.19.5: + resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -3558,8 +3566,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-s390x@0.19.4: - resolution: {integrity: sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==} + /@esbuild/linux-s390x@0.19.5: + resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -3575,8 +3583,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-x64@0.19.4: - resolution: {integrity: sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==} + /@esbuild/linux-x64@0.19.5: + resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -3592,8 +3600,8 @@ packages: requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.19.4: - resolution: {integrity: sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==} + /@esbuild/netbsd-x64@0.19.5: + resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -3609,8 +3617,8 @@ packages: requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.19.4: - resolution: {integrity: sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==} + /@esbuild/openbsd-x64@0.19.5: + resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -3626,8 +3634,8 @@ packages: requiresBuild: true optional: true - /@esbuild/sunos-x64@0.19.4: - resolution: {integrity: sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==} + /@esbuild/sunos-x64@0.19.5: + resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -3643,8 +3651,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-arm64@0.19.4: - resolution: {integrity: sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==} + /@esbuild/win32-arm64@0.19.5: + resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -3660,8 +3668,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-ia32@0.19.4: - resolution: {integrity: sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==} + /@esbuild/win32-ia32@0.19.5: + resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -3677,8 +3685,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-x64@0.19.4: - resolution: {integrity: sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==} + /@esbuild/win32-x64@0.19.5: + resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -4012,7 +4020,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -4033,14 +4041,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.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.7.0 - jest-config: 29.7.0(@types/node@20.8.6) + jest-config: 29.7.0(@types/node@20.8.7) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4075,7 +4083,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 jest-mock: 29.7.0 dev: true @@ -4102,7 +4110,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.8.6 + '@types/node': 20.8.7 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4135,7 +4143,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.8.6 + '@types/node': 20.8.7 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4229,7 +4237,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.8.6 + '@types/node': 20.8.7 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -4241,12 +4249,12 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.8.6 + '@types/node': 20.8.7 '@types/yargs': 17.0.19 chalk: 4.1.2 dev: true - /@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.2.2)(vite@4.4.11): + /@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.2.2)(vite@4.5.0): resolution: {integrity: sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==} peerDependencies: typescript: '>= 4.3.x' @@ -4260,7 +4268,7 @@ packages: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.2.2) typescript: 5.2.2 - vite: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + vite: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) dev: true /@jridgewell/gen-mapping@0.3.2: @@ -4345,24 +4353,24 @@ packages: react: 18.2.0 dev: true - /@microsoft/api-extractor-model@7.28.2(@types/node@20.8.6): + /@microsoft/api-extractor-model@7.28.2(@types/node@20.8.7): resolution: {integrity: sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==} dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.61.0(@types/node@20.8.6) + '@rushstack/node-core-library': 3.61.0(@types/node@20.8.7) transitivePeerDependencies: - '@types/node' dev: true - /@microsoft/api-extractor@7.38.0(@types/node@20.8.6): + /@microsoft/api-extractor@7.38.0(@types/node@20.8.7): resolution: {integrity: sha512-e1LhZYnfw+JEebuY2bzhw0imDCl1nwjSThTrQqBXl40hrVo6xm3j/1EpUr89QyzgjqmAwek2ZkIVZbrhaR+cqg==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.28.2(@types/node@20.8.6) + '@microsoft/api-extractor-model': 7.28.2(@types/node@20.8.7) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.61.0(@types/node@20.8.6) + '@rushstack/node-core-library': 3.61.0(@types/node@20.8.7) '@rushstack/rig-package': 0.5.1 '@rushstack/ts-command-line': 4.16.1 colors: 1.2.5 @@ -5242,7 +5250,7 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 4.1.4 @@ -5331,7 +5339,7 @@ packages: requiresBuild: true optional: true - /@rushstack/node-core-library@3.61.0(@types/node@20.8.6): + /@rushstack/node-core-library@3.61.0(@types/node@20.8.7): resolution: {integrity: sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==} peerDependencies: '@types/node': '*' @@ -5339,7 +5347,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 colors: 1.2.5 fs-extra: 7.0.1 import-lazy: 4.0.0 @@ -5439,8 +5447,8 @@ packages: '@sinonjs/commons': 3.0.0 dev: true - /@sinonjs/fake-timers@11.1.0: - resolution: {integrity: sha512-pUBaWhXoa9N0R/LeYKLqkrN9mqN3jwKBeMfbvlRtHUzLmk55o+0swncIuZBcSH/PpXDttRf/AcPF22pknAzORQ==} + /@sinonjs/fake-timers@11.2.1: + resolution: {integrity: sha512-CiDPMFTZtdaEhKB6Rl2v2CmOMTbTNEOC0p3fSBCYtd0g2re4zu3ArYN8RxUeU8aftNi1Yvpm8f+UqgTPJ8mymA==} dependencies: '@sinonjs/commons': 3.0.0 dev: false @@ -6323,7 +6331,7 @@ packages: - supports-color dev: true - /@storybook/builder-vite@7.5.0(typescript@5.2.2)(vite@4.4.11): + /@storybook/builder-vite@7.5.0(typescript@5.2.2)(vite@4.5.0): resolution: {integrity: sha512-XqiXECAhIDhUryhcPfWfmrvCA2R9p4cebXdyH5Op17yKQ10Bp+OxDWXZlOY/PHdq2KBVhC8CF3Yp7JXCWk8BHw==} peerDependencies: '@preact/preset-vite': '*' @@ -6355,23 +6363,12 @@ packages: magic-string: 0.30.3 rollup: 3.29.4 typescript: 5.2.2 - vite: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + vite: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) transitivePeerDependencies: - encoding - supports-color dev: true - /@storybook/channels@7.4.6: - resolution: {integrity: sha512-yPv/sfo2c18fM3fvG0i1xse63vG8l33Al/OU0k/dtovltPu001/HVa1QgBgsb/QrEfZtvGjGhmtdVeYb39fv3A==} - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/core-events': 7.4.6 - '@storybook/global': 5.0.0 - qs: 6.11.1 - telejson: 7.2.0 - tiny-invariant: 1.3.1 - dev: true - /@storybook/channels@7.5.0: resolution: {integrity: sha512-/7QJS1UA7TX3uhZqCpjv4Ib8nfMnDOJrBWvjiXiUONaRcSk/he5X+W1Zz/c7dgt+wkYuAh+evjc7glIaBhVNVQ==} dependencies: @@ -6399,7 +6396,7 @@ packages: '@storybook/node-logger': 7.5.0 '@storybook/telemetry': 7.5.0 '@storybook/types': 7.5.0 - '@types/semver': 7.5.3 + '@types/semver': 7.5.4 '@yarnpkg/fslib': 2.10.3 '@yarnpkg/libzip': 2.3.0 chalk: 4.1.2 @@ -6435,12 +6432,6 @@ packages: - utf-8-validate dev: true - /@storybook/client-logger@7.4.6: - resolution: {integrity: sha512-XDw31ZziU//86PKuMRnmc+L/G0VopaGKENQOGEpvAXCU9IZASwGKlKAtcyosjrpi+ZiUXlMgUXCpXM7x3b1Ehw==} - dependencies: - '@storybook/global': 5.0.0 - dev: true - /@storybook/client-logger@7.5.0: resolution: {integrity: sha512-JV7J9vc69f9Il4uW62NIeweUU7O38VwFWxtCkhd0bcBA/9RG0go4M2avzxYYEAe9kIOX9IBBk8WGzMacwW4gKQ==} dependencies: @@ -6468,29 +6459,6 @@ packages: - supports-color dev: true - /@storybook/components@7.4.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nIRBhewAgrJJVafyCzuaLx1l+YOfvvD5dOZ0JxZsxJsefOdw1jFpUqUZ5fIpQ2moyvrR0mAUFw378rBfMdHz5Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@radix-ui/react-select': 1.2.2(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toolbar': 1.0.4(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.4.6 - '@storybook/csf': 0.1.0 - '@storybook/global': 5.0.0 - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.4.6 - memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - use-resize-observer: 9.1.0(react-dom@18.2.0)(react@18.2.0) - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - dev: true - /@storybook/components@7.5.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-6lmZ6PbS27xN32vTJ/NvgaiKkFIQRzZuBeBIg2u+FoAEgCiCwRXjZKe/O8NZC2Xr0uf97+7U2P0kD4Hwr9SNhw==} peerDependencies: @@ -6552,12 +6520,6 @@ packages: - supports-color dev: true - /@storybook/core-events@7.4.6: - resolution: {integrity: sha512-r5vrE+32lwrJh1NGFr1a0mWjvxo7q8FXYShylcwRWpacmL5NTtLkrXOoJSeGvJ4yKNYkvxQFtOPId4lzDxa32w==} - dependencies: - ts-dedent: 2.2.0 - dev: true - /@storybook/core-events@7.5.0: resolution: {integrity: sha512-FsD+clTzayqprbVllnL8LLch+uCslJFDgsv7Zh99/zoi7OHtHyauoCZkdLBSiDzgc84qS41dY19HqX1/y7cnOw==} dependencies: @@ -6585,7 +6547,7 @@ packages: '@types/detect-port': 1.3.2 '@types/node': 18.17.15 '@types/pretty-hrtime': 1.0.1 - '@types/semver': 7.5.3 + '@types/semver': 7.5.4 better-opn: 3.0.2 chalk: 4.1.2 cli-table3: 0.6.3 @@ -6771,7 +6733,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-vite@7.5.0(react-dom@18.2.0)(react@18.2.0)(rollup@4.1.4)(typescript@5.2.2)(vite@4.4.11): + /@storybook/react-vite@7.5.0(react-dom@18.2.0)(react@18.2.0)(rollup@4.1.4)(typescript@5.2.2)(vite@4.5.0): resolution: {integrity: sha512-MnXeO1P+D9l6tZoS9wvC0YwSb8Ur05haUw66I2EJgYVmszbWmAv1XI7lYmfTqBj8bfFXk4DbUdIOVvBMfmIIZg==} engines: {node: '>=16'} peerDependencies: @@ -6779,16 +6741,16 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 vite: ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.2.2)(vite@4.4.11) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.2.2)(vite@4.5.0) '@rollup/pluginutils': 5.0.5(rollup@4.1.4) - '@storybook/builder-vite': 7.5.0(typescript@5.2.2)(vite@4.4.11) + '@storybook/builder-vite': 7.5.0(typescript@5.2.2)(vite@4.5.0) '@storybook/react': 7.5.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@vitejs/plugin-react': 3.1.0(vite@4.4.11) + '@vitejs/plugin-react': 3.1.0(vite@4.5.0) magic-string: 0.30.3 react: 18.2.0 react-docgen: 6.0.4 react-dom: 18.2.0(react@18.2.0) - vite: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + vite: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) transitivePeerDependencies: - '@preact/preset-vite' - encoding @@ -6890,20 +6852,6 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/theming@7.4.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HW77iJ9ptCMqhoBOYFjRQw7VBap+38fkJGHP5KylEJCyYCgIAm2dEcQmtWpMVYFssSGcb6djfbtAMhYU4TL4Iw==} - 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.4.6 - '@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/theming@7.5.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uTo97oh+pvmlfsZocFq5qae0zGo0VGk7oiBqNSSw6CiTqE1rIuSxoPrMAY+oCTWCUZV7DjONIGvpnGl2QALsAw==} peerDependencies: @@ -6918,15 +6866,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/types@7.4.6: - resolution: {integrity: sha512-6QLXtMVsFZFpzPkdGWsu/iuc8na9dnS67AMOBKm5qCLPwtUJOYkwhMdFRSSeJthLRpzV7JLAL8Kwvl7MFP3QSw==} - dependencies: - '@storybook/channels': 7.4.6 - '@types/babel__core': 7.20.0 - '@types/express': 4.17.17 - file-system-cache: 2.3.0 - dev: true - /@storybook/types@7.5.0: resolution: {integrity: sha512-fiOUnHKFi/UZSfvc53F0WEQCiquqcSqslL3f5EffwQRiXfeXlGavJb0kU03BO+CvOXcliRn6qKSF2dL0Rgb7Xw==} dependencies: @@ -6936,7 +6875,7 @@ packages: file-system-cache: 2.3.0 dev: true - /@storybook/vue3-vite@7.5.0(@vue/compiler-core@3.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.4.11)(vue@3.3.4): + /@storybook/vue3-vite@7.5.0(@vue/compiler-core@3.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.0)(vue@3.3.4): resolution: {integrity: sha512-Mmyeu2bZGdwA6xXDFKzybOxaEPHhB01ezznlTljaVkVNRAYcxzOna+z6INKfP0LYz3anqSDl4vB5g5b05M7gCA==} engines: {node: ^14.18 || >=16} peerDependencies: @@ -6944,14 +6883,14 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 vite: ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: - '@storybook/builder-vite': 7.5.0(typescript@5.2.2)(vite@4.4.11) + '@storybook/builder-vite': 7.5.0(typescript@5.2.2)(vite@4.5.0) '@storybook/core-server': 7.5.0 '@storybook/vue3': 7.5.0(@vue/compiler-core@3.3.4)(vue@3.3.4) - '@vitejs/plugin-vue': 4.4.0(vite@4.4.11)(vue@3.3.4) + '@vitejs/plugin-vue': 4.4.0(vite@4.5.0)(vue@3.3.4) magic-string: 0.30.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - vite: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + vite: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) vue-docgen-api: 4.64.1(vue@3.3.4) transitivePeerDependencies: - '@preact/preset-vite' @@ -7439,7 +7378,7 @@ packages: dom-accessibility-api: 0.5.16 lodash: 4.17.21 redent: 3.0.0 - vitest: 0.34.6(happy-dom@10.0.3)(sass@1.69.3)(terser@5.21.0) + vitest: 0.34.6(happy-dom@10.0.3)(sass@1.69.4)(terser@5.22.0) dev: true /@testing-library/user-event@14.4.3(@testing-library/dom@9.2.0): @@ -7487,7 +7426,7 @@ packages: /@types/accepts@1.3.6: resolution: {integrity: sha512-6+qlUg57yfE9OO63wnsJXLeq9cG3gSHBBIxNMOjNrbDRlDnm/NaR7RctfYcVCPq+j7d+MwOxqVEludH5+FKrlg==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/archiver@5.3.4: @@ -7541,7 +7480,7 @@ packages: resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/braces@3.0.1: @@ -7553,7 +7492,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.8.6 + '@types/node': 20.8.7 '@types/responselike': 1.0.0 dev: false @@ -7586,7 +7525,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/content-disposition@0.5.7: @@ -7600,13 +7539,13 @@ packages: /@types/cross-spawn@6.0.2: resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: - '@types/ms': 0.7.32 + '@types/ms': 0.7.33 dev: true /@types/detect-port@1.3.2: @@ -7633,8 +7572,8 @@ packages: resolution: {integrity: sha512-tLqYV94vuqDrXh515F/FOGtBcRMTPGvVV1LzLbtYDcQmmhtpf/gLYf+hikBbQk8MzOHNz37wpFfJbYAuSn8HqA==} dev: true - /@types/escape-regexp@0.0.1: - resolution: {integrity: sha512-ogj/ZTIdeFkiuxDwawYuZSIgC6suFGgBeZPr6Xs5lHEcvIXTjXGtH+/n8f1XhZhespaUwJ5LIGRICPji972FLw==} + /@types/escape-regexp@0.0.2: + resolution: {integrity: sha512-YHLqlrMdV19R7f4z0eZrJMj3MjCYC3hi36s8n1oiAOwU1aoxIlne/3OVtCdGGb1lXIZ5YVfx6ZJeEIx2U3EySA==} dev: true /@types/escodegen@0.0.6: @@ -7644,7 +7583,7 @@ packages: /@types/eslint@7.29.0: resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.3 '@types/json-schema': 7.0.12 dev: true @@ -7652,13 +7591,13 @@ packages: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} dev: true - /@types/estree@1.0.2: - resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + /@types/estree@1.0.3: + resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -7676,23 +7615,23 @@ packages: resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} dev: true - /@types/fluent-ffmpeg@2.1.22: - resolution: {integrity: sha512-ZZPDDrDOb2Ahp5fxZzuw64f0rCcviv+SDuCyJ1PIF/UFn9wNHtb/bY8Dj/2nrbQ7SNsGI7gaO2wJVkkU2HBcMg==} + /@types/fluent-ffmpeg@2.1.23: + resolution: {integrity: sha512-ZEogBz8YpWflRox2uzGUNOYolQPUDGMNUFhf6fY/cW+6i00oeSTD0tYf4az6/162jv0YsRYi6uxigssnag7E7A==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/hast@2.3.4: @@ -7704,10 +7643,10 @@ packages: /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} - /@types/http-link-header@1.0.3: - resolution: {integrity: sha512-y8HkoD/vyid+5MrJ3aas0FvU3/BVBGcyG9kgxL0Zn4JwstA8CglFPnrR0RuzOjRCXwqzL5uxWC2IO7Ub0rMU2A==} + /@types/http-link-header@1.0.4: + resolution: {integrity: sha512-UeasLdPPSfmX45RH6h1lo932WfQUTuc1adQCpPioqRRVBM25dWwIPDBhM0CjWbdflmvr8vIzQg48yk1JzylhXg==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/istanbul-lib-coverage@2.0.4: @@ -7733,8 +7672,8 @@ packages: pretty-format: 28.1.3 dev: true - /@types/jest@29.5.5: - resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} + /@types/jest@29.5.6: + resolution: {integrity: sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -7744,14 +7683,14 @@ packages: resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} dev: true - /@types/js-yaml@4.0.7: - resolution: {integrity: sha512-RJZP9WAMMr1514KbdSXkLRrKvYQacjr1+HWnY8pui/uBTBoSgD9ZGR17u/d4nb9NpERp0FkdLBe7hq8NIPBgkg==} + /@types/js-yaml@4.0.8: + resolution: {integrity: sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==} dev: true - /@types/jsdom@21.1.3: - resolution: {integrity: sha512-1zzqSP+iHJYV4lB3lZhNBa012pubABkj9yG/GuXuf6LZH1cSPIJBqFDrm5JX65HHt6VOnNYdTui/0ySerRbMgA==} + /@types/jsdom@21.1.4: + resolution: {integrity: sha512-NzAMLEV0KQ4cBaDx3Ls8VfJUElyDUm1xrtYRmcMK0gF8L5xYbujFVaQlJ50yinQ/d47j2rEP1XUzkiYrw4YRFA==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -7764,18 +7703,18 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/jsonld@1.5.10: - resolution: {integrity: sha512-fEXxh7TnXYTPcbHb/p3bJ2V5CGpzwv7wCwQ4GsvyvbSufn8mVrCXNuw/L1WVFkBC9qUl4UgDA4LRV6B8SmAiEw==} + /@types/jsonld@1.5.11: + resolution: {integrity: sha512-/B5yjthc6MEJMR4+TUtaj5LgE3bByVSNIXvPcUxiecj5F7GZKQJS5oery5rbOni7T9QBpjDF0RufCcVVlCe4hw==} dev: true - /@types/jsrsasign@10.5.9: - resolution: {integrity: sha512-MTL0Glmvs7w1qspEsHkIt0MhvcEkWCY4gwaTneG6Mca+YsTGAl18flVYVWKELOZ0ECTLJ7LargBoIuUK3tqrWg==} + /@types/jsrsasign@10.5.10: + resolution: {integrity: sha512-tKEJPnbuWmMtYYzEv2v6mRX1vgiLh4jMdHUEj3pDQveXTFLlNyaWjW2jossmc1fn2shLF9BZczGrYk9q2NfDPg==} dev: true /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: false /@types/lodash@4.14.191: @@ -7787,22 +7726,22 @@ packages: requiresBuild: true dev: false - /@types/matter-js@0.19.1: - resolution: {integrity: sha512-GtX6SBzhQ+BpFimYx4oAQlwH8vFLcXv0rl7x0T59B/BJ/jp8UwpJq621trCvI8kBsEeAcfR+witutMrLANYzIA==} + /@types/matter-js@0.19.2: + resolution: {integrity: sha512-017JF8XkqIsuCpSAQOK94bpcs7Fyqx4YR3j1ZS68w18HLNEnG1KSfdMW098QN8alrbHFJOec8QDbyrsE7tx8ww==} dev: true /@types/mdx@2.0.3: resolution: {integrity: sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==} dev: true - /@types/micromatch@4.0.3: - resolution: {integrity: sha512-QX1czv7QoLU76Asb1NSVSlu5zTMx/TFNswUDtQSbH9hgvCg+JHvIEoVvVSzBf1WNCT8XsK515W+p3wFOCuvhCg==} + /@types/micromatch@4.0.4: + resolution: {integrity: sha512-ZeDgs/tFSdUqkAZmgdnu5enRwFXJ+nIF4TxK5ENw6x0bvfcgMD1H3GnTS+fIkBUcvijQNF7ZOa2tuOtOaEjt3w==} dependencies: '@types/braces': 3.0.1 dev: true - /@types/mime-types@2.1.2: - resolution: {integrity: sha512-q9QGHMGCiBJCHEvd4ZLdasdqXv570agPsUW0CeIm/B8DzhxsYMerD0l3IlI+EQ1A2RWHY2mmM9x1YIuuWxisCg==} + /@types/mime-types@2.1.3: + resolution: {integrity: sha512-bvxCbHeeS7quxS7uOJShyoOQj/BfLabhF6mk9Rmr+2MRfW8W1yxyyL/0GTxLFTHen41GrIw4K3D4DrLouhb8vg==} dev: true /@types/mime@3.0.1: @@ -7817,14 +7756,14 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/ms@0.7.32: - resolution: {integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==} + /@types/ms@0.7.33: + resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} dev: true /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 form-data: 3.0.1 /@types/node-fetch@3.0.3: @@ -7837,38 +7776,38 @@ packages: resolution: {integrity: sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==} dev: true - /@types/node@20.8.6: - resolution: {integrity: sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==} + /@types/node@20.8.7: + resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==} dependencies: undici-types: 5.25.3 - /@types/nodemailer@6.4.11: - resolution: {integrity: sha512-Ld2c0frwpGT4VseuoeboCXQ7UJIkK3X7Lx/4YsZEiUHtHsthWAOCYtf6PAiLhMtfwV0cWJRabLBS3+LD8x6Nrw==} + /@types/nodemailer@6.4.13: + resolution: {integrity: sha512-889Vq/77eEpidCwh52sVWpbnqQmIwL8yVBekNbrztVEaWKOCRH3Eq6hjIJh1jwsGDEAJEH0RR+YhpH9mfELLKA==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/oauth2orize-pkce@0.1.0: - resolution: {integrity: sha512-k3FH+QtfjV/zAWFdJwzPOCISpYYXbGIwejtEbUWWGhUJ+gk/DyPesSKh3tblBkFBabN4RBRBRnYutWFwtVEZzw==} + /@types/oauth2orize-pkce@0.1.1: + resolution: {integrity: sha512-nDQDDO+SegfJ8rfz3MUYwDaxY0tmIOdKDBlxmpOvygx7LIPo3GF3Ogig67Qh6D8YG7v1ruoGgqFeVX6NT4v2Ew==} dependencies: - '@types/oauth2orize': 1.11.1 + '@types/oauth2orize': 1.11.2 dev: true - /@types/oauth2orize@1.11.1: - resolution: {integrity: sha512-U3L0c4eQA6lTSZRgW4LYfhKlR084Aw19akmYHrMdYzaqg9mQDfc2b/1iyqm9+1FJDEnVS5ONi5fxdDrB4/7CpQ==} + /@types/oauth2orize@1.11.2: + resolution: {integrity: sha512-ZnHWsUZf3+gdR4sdsNRtu1jhULpLORn62s5UIvTtXStxy/P6/LiGjbeXVqNkNwCUNlBq6XItc9phMOfxNLX17w==} dependencies: '@types/express': 4.17.17 - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true - /@types/oauth@0.9.2: - resolution: {integrity: sha512-Nu3/abQ6yR9VlsCdX3aiGsWFkj6OJvJqDvg/36t8Gwf2mFXdBZXPDN3K+2yfeA6Lo2m1Q12F8Qil9TZ48nWhOQ==} + /@types/oauth@0.9.3: + resolution: {integrity: sha512-avZiwxSz/WS6EaEjhchzXKgWtlGGYGnEVJoHuQuDLHf7gIW1Gmm9eIxOMuJ6umQNNKZkJ3Uy+C/rLzEvL3I8Sw==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/offscreencanvas@2019.3.0: @@ -7881,10 +7820,10 @@ packages: requiresBuild: true dev: false - /@types/pg@8.10.5: - resolution: {integrity: sha512-GS3ebGcSJQqKSnq4/WnSH1XQvx0vTDLEmqLENk7onKvTnry9BWPsZiZeUMJlEPw+5bCQDzfxZFhxlUztpNCKgQ==} + /@types/pg@8.10.7: + resolution: {integrity: sha512-ksJqHipwYaSEHz9e1fr6H6erjoEdNNaOxwyJgPx9bNeaqOW3iWBQgVHfpwiSAoqGzchfc+ZyRLwEfeCcyYD3uQ==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 pg-protocol: 1.6.0 pg-types: 4.0.1 dev: true @@ -7897,34 +7836,34 @@ packages: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true - /@types/pug@2.0.7: - resolution: {integrity: sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw==} + /@types/pug@2.0.8: + resolution: {integrity: sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==} dev: true - /@types/punycode@2.1.0: - resolution: {integrity: sha512-PG5aLpW6PJOeV2fHRslP4IOMWn+G+Uq8CfnyJ+PDS8ndCbU+soO+fB3NKCKo0p/Jh2Y4aPaiQZsrOXFdzpcA6g==} + /@types/punycode@2.1.1: + resolution: {integrity: sha512-41wbJ1+JU2hECp2FDMAAzUZyiFyfeqAW/aTVsqY2RsDi5M2sliZgBp+7rv1Rc8oMJv0tt+74b6Sb1EcWldTCpA==} dev: true - /@types/qrcode@1.5.2: - resolution: {integrity: sha512-W4KDz75m7rJjFbyCctzCtRzZUj+PrUHV+YjqDp50sSRezTbrtEAIq2iTzC6lISARl3qw+8IlcCyljdcVJE0Wug==} + /@types/qrcode@1.5.4: + resolution: {integrity: sha512-ufYqUO7wUBq49hugJry+oIYKscvxIQerJSmXeny215aJKfrepN04DDZP8FCgxvV82kOqKPULCE4PIW3qUmZrRA==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/random-seed@0.3.3: - resolution: {integrity: sha512-kHsCbIRHNXJo6EN5W8EA5b4i1hdT6jaZke5crBPLUcLqaLdZ0QBq8QVMbafHzhjFF83Cl9qlee2dChD18d/kPg==} + /@types/random-seed@0.3.4: + resolution: {integrity: sha512-9YOd099WU/gzKG5zOZKfE31fDt/6rYAOxh7OA1jgLhFMqF0uwDZNnsb+1vuCwycZZ71BlmPieeQiTW6BWkS+KQ==} dev: true /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/ratelimiter@3.4.4: - resolution: {integrity: sha512-GSMb93iSA8KKFDgVL2Wzs/kqrHMJcU8xhLdwI5omoACcj7K18SacklLtY1C4G02HC5drd6GygtsIaGbfxJSe0g==} + /@types/ratelimiter@3.4.5: + resolution: {integrity: sha512-lAB/Va9OCFSi5jQHLz7x7MKPjRVHnyvOYzXSQorN30qWIJpudPbDkMHBWUoo38MFG3dr+/jsWhjcUkJwunoVUA==} dev: true /@types/react@18.0.28: @@ -7938,11 +7877,11 @@ packages: /@types/readdir-glob@1.1.1: resolution: {integrity: sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true - /@types/rename@1.0.5: - resolution: {integrity: sha512-8/ynozXfy9NZ8JhQRSTb0HMuu5Isl547Mih1fMEpNLi9coPcI16UdvIdSqssMgQEdbWsgQIPkLpkpAcK4DEZ3Q==} + /@types/rename@1.0.6: + resolution: {integrity: sha512-uLznlquGwzyFMxjBGcR3mY+k/zWv+9kk3yEzsldIU5OzjRw0i6EdZ1ydVCjTEYQ4HkWGBY+bXn62lrGKS+G1iw==} dev: true /@types/resolve@1.20.3: @@ -7952,11 +7891,11 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: false - /@types/sanitize-html@2.9.2: - resolution: {integrity: sha512-7TAQFoXdwjSvebOl0oKh5QXGrI+uyTc8Here+WcR9vpLEE7wxpoK6Vuvw++dsmL+Yw8K91x76tLoWchD5pqpRg==} + /@types/sanitize-html@2.9.3: + resolution: {integrity: sha512-1rsSdEJLV7utAG+Fms2uP+nSmmYmOhUUSSZvUz4wF2wlA0M5/A/gVgnpWZ7EKaPWsrrxWiSuNJqSBW8dh2isBA==} dependencies: htmlparser2: 8.0.1 dev: true @@ -7970,15 +7909,15 @@ packages: requiresBuild: true dev: false - /@types/semver@7.5.3: - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + /@types/semver@7.5.4: + resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} dev: true /@types/serve-static@1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/serviceworker@0.0.67: @@ -7988,7 +7927,7 @@ packages: /@types/set-cookie-parser@2.4.3: resolution: {integrity: sha512-7QhnH7bi+6KAhBB+Auejz1uV9DHiopZqu7LfR/5gZZTkejJV5nYeZZpgfFoE0N8aDsXuiYpfKyfyMatCwQhyTQ==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/sharp@0.32.0: @@ -7998,22 +7937,22 @@ packages: sharp: 0.32.6 dev: true - /@types/simple-oauth2@5.0.5: - resolution: {integrity: sha512-hsUpJyOQnexMxa2Ilvs1CwmcSN62Y4irIvBbviUJNiyxUGIOQS7CUs0QPq+nuxkaNeNqdjxJ1BE/AoCGiG7L+g==} + /@types/simple-oauth2@5.0.6: + resolution: {integrity: sha512-i1tx1TwdET6m9tit+p+pWABuNWz0W8LThmzwh+cYC9yKJTXD3q3zPWOwstuL8/ELO0HoE0f9r/yYQ3XHaiTjrw==} dev: true /@types/sinon@10.0.13: resolution: {integrity: sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==} dependencies: - '@types/sinonjs__fake-timers': 8.1.3 + '@types/sinonjs__fake-timers': 8.1.4 dev: true /@types/sinonjs__fake-timers@8.1.1: resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} dev: true - /@types/sinonjs__fake-timers@8.1.3: - resolution: {integrity: sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==} + /@types/sinonjs__fake-timers@8.1.4: + resolution: {integrity: sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==} dev: true /@types/sizzle@2.3.3: @@ -8024,16 +7963,16 @@ packages: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/throttle-debounce@5.0.0: - resolution: {integrity: sha512-Pb7k35iCGFcGPECoNE4DYp3Oyf2xcTd3FbFQxXUI9hEYKUl6YX+KLf7HrBmgVcD05nl50LIH6i+80js4iYmWbw==} + /@types/throttle-debounce@5.0.1: + resolution: {integrity: sha512-/fifasjlhpz/r4YsH0r0ZXJvivXFB3F6bmezMnqgsn/NK/fYJn7vN84k7eYn/oALu/aenXo+t8Pv+QlkS6iYBg==} dev: true - /@types/tinycolor2@1.4.4: - resolution: {integrity: sha512-FYK4mlLxUUajo/mblv7EUDHku20qT6ThYNsGZsTHilcHRvIkF8WXqtZO+DVTYkpHWCaAT97LueV59H/5Ve3bGA==} + /@types/tinycolor2@1.4.5: + resolution: {integrity: sha512-uLJijDHN5E6j5n1qefF9oaeplgszXglWXWTviMoFr/YxgvbyrkFil20yDT7ljhCiTQ/BfCYtxfJS81LdTro5DQ==} dev: true - /@types/tmp@0.2.4: - resolution: {integrity: sha512-Vq3rwM+2KgiLacq68EjTJD9cuJ/ne5pXntWn8B8Rxj25SLkGAhCgooCZ1lhcIcV5OFveJ+s5Cqpi+XKfFM/xZA==} + /@types/tmp@0.2.5: + resolution: {integrity: sha512-KodRrjqWrk/3VyzfR4aeXkf2n5Ssg+bvVUhXlvHVffLiIHriLlrO3vYobB+Kvnr9DkNzMiyWHT3G6hT/xX0ryQ==} dev: true /@types/tough-cookie@4.0.2: @@ -8044,20 +7983,20 @@ packages: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: true - /@types/uuid@9.0.5: - resolution: {integrity: sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ==} + /@types/uuid@9.0.6: + resolution: {integrity: sha512-BT2Krtx4xaO6iwzwMFUYvWBWkV2pr37zD68Vmp1CDV196MzczBRxuEpD6Pr395HAgebC/co7hOphs53r8V7jew==} dev: true - /@types/vary@1.1.1: - resolution: {integrity: sha512-XL8U62BpXBMMuFzFBYsWekQwo+dqcyN117IwFVMCkBCvc6HY1ODdRKNA0JHxnuTM5lX3kpqsnBH5OuEeXSN3aA==} + /@types/vary@1.1.2: + resolution: {integrity: sha512-eg5VDqVer3MPty3Ftd/T1ZMGhhBZVvW9rMn4psghY4JqcleHvyU0y2wkyIzrID34AYzdeXLDuxT3oc0AM8nJJQ==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true - /@types/web-push@3.6.1: - resolution: {integrity: sha512-Zu6Iju7c4IlE8I8eEeFLYRb7XFqvHFmWWAYr1cmug9EX3c6CDarxIXWN/GO0sxjbJLkHPwozUzp6cLdXsrq7Ew==} + /@types/web-push@3.6.2: + resolution: {integrity: sha512-v6Wdk1eIVbAJQjEAa1ZxuG3cfOYTd6nSv55BVJMtLQUvQ07v80MPt2Voq/z71WKhy4CORu4L3aH+8SXKX4BD5g==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/webgl-ext@0.0.30: @@ -8065,16 +8004,16 @@ packages: requiresBuild: true dev: false - /@types/websocket@1.0.7: - resolution: {integrity: sha512-62Omr8U0PO+hgjLCpPnMsmjh2/FRwIGOktZHyYAUzooEJotwkXHMp7vCacdYi8haxBNOiw9bc2HIHI+b/MPNjA==} + /@types/websocket@1.0.8: + resolution: {integrity: sha512-wvkOpWApbuxVfHhSQ1XrjVN4363vsfLJwEo4AboIZk0g1vJA5nmLp8GXUHuIdf4/Fe7+/V0Efe2HvWiLqHtlqw==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true - /@types/ws@8.5.7: - resolution: {integrity: sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==} + /@types/ws@8.5.8: + resolution: {integrity: sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true /@types/yargs-parser@21.0.0: @@ -8097,7 +8036,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 dev: true optional: true @@ -8213,7 +8152,7 @@ packages: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@types/json-schema': 7.0.12 - '@types/semver': 7.5.3 + '@types/semver': 7.5.4 '@typescript-eslint/scope-manager': 6.8.0 '@typescript-eslint/types': 6.8.0 '@typescript-eslint/typescript-estree': 6.8.0(typescript@5.2.2) @@ -8232,7 +8171,7 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@vitejs/plugin-react@3.1.0(vite@4.4.11): + /@vitejs/plugin-react@3.1.0(vite@4.5.0): resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8243,19 +8182,19 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.22.11) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + vite: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) transitivePeerDependencies: - supports-color dev: true - /@vitejs/plugin-vue@4.4.0(vite@4.4.11)(vue@3.3.4): + /@vitejs/plugin-vue@4.4.0(vite@4.5.0)(vue@3.3.4): resolution: {integrity: sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + vite: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) vue: 3.3.4 /@vitest/coverage-v8@0.34.6(vitest@0.34.6): @@ -8274,7 +8213,7 @@ packages: std-env: 3.3.3 test-exclude: 6.0.0 v8-to-istanbul: 9.1.0 - vitest: 0.34.6(happy-dom@10.0.3)(sass@1.69.3)(terser@5.21.0) + vitest: 0.34.6(happy-dom@10.0.3)(sass@1.69.4)(terser@5.22.0) transitivePeerDependencies: - supports-color dev: true @@ -9329,10 +9268,10 @@ packages: dependencies: fill-range: 7.0.1 - /broadcast-channel@5.4.0: - resolution: {integrity: sha512-mHr7IwCHv9DF+d39wpazXOuusJJOKWckZI4uZ4bp6VQr/VIgx5cvYbsyn2uuWfWuCINvLNtPGY107JyXQ0fkAg==} + /broadcast-channel@5.5.0: + resolution: {integrity: sha512-boNO+pUV0LzTlUV9AVhgJnOG43dJ0X/H4H4b5mrEduy1PoGMris1oNFgywzHCyXNe7UPdXiN21sp/hFyImvJ0A==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 oblivious-set: 1.1.1 p-queue: 6.6.2 unload: 2.4.1 @@ -9406,8 +9345,8 @@ packages: dependencies: node-gyp-build: 4.6.0 - /bullmq@4.12.4: - resolution: {integrity: sha512-t+vMfvc2gVZUZWXd0jMh3vr5K83ZEfwwaiLW2HlL+W76ktWzOpwDqkWHmLwu98xylpPI1YcZ2WoGcqG6RsnKiA==} + /bullmq@4.12.5: + resolution: {integrity: sha512-llBh5ejISbtdvSgQOqwgoXOdagBTLFbgy8FoYc03nKVV+H1OqlUOsTVmlUh3Q1GapMVzRilMHBMHBPKaaE5Bjg==} dependencies: cron-parser: 4.8.1 glob: 8.1.0 @@ -10094,7 +10033,7 @@ packages: readable-stream: 3.6.0 dev: false - /create-jest@29.7.0(@types/node@20.8.6): + /create-jest@29.7.0(@types/node@20.8.7): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -10103,7 +10042,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.8.6) + jest-config: 29.7.0(@types/node@20.8.7) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -10306,8 +10245,8 @@ packages: uniq: 1.0.1 dev: false - /cypress@13.3.1: - resolution: {integrity: sha512-g4mJLZxYN+UAF2LMy3Znd4LBnUmS59Vynd81VES59RdW48Yt+QtR2cush3melOoVNz0PPbADpWr8DcUx6mif8Q==} + /cypress@13.3.2: + resolution: {integrity: sha512-ArLmZObcLC+xxCp7zJZZbhby9FUf5CueLej9dUM4+5j37FTS4iMSgHxQLDu01PydFUvDXcNoIVRCYrHHxD7Ybg==} engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} hasBin: true requiresBuild: true @@ -11023,34 +10962,34 @@ packages: '@esbuild/win32-ia32': 0.18.17 '@esbuild/win32-x64': 0.18.17 - /esbuild@0.19.4: - resolution: {integrity: sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==} + /esbuild@0.19.5: + resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.19.4 - '@esbuild/android-arm64': 0.19.4 - '@esbuild/android-x64': 0.19.4 - '@esbuild/darwin-arm64': 0.19.4 - '@esbuild/darwin-x64': 0.19.4 - '@esbuild/freebsd-arm64': 0.19.4 - '@esbuild/freebsd-x64': 0.19.4 - '@esbuild/linux-arm': 0.19.4 - '@esbuild/linux-arm64': 0.19.4 - '@esbuild/linux-ia32': 0.19.4 - '@esbuild/linux-loong64': 0.19.4 - '@esbuild/linux-mips64el': 0.19.4 - '@esbuild/linux-ppc64': 0.19.4 - '@esbuild/linux-riscv64': 0.19.4 - '@esbuild/linux-s390x': 0.19.4 - '@esbuild/linux-x64': 0.19.4 - '@esbuild/netbsd-x64': 0.19.4 - '@esbuild/openbsd-x64': 0.19.4 - '@esbuild/sunos-x64': 0.19.4 - '@esbuild/win32-arm64': 0.19.4 - '@esbuild/win32-ia32': 0.19.4 - '@esbuild/win32-x64': 0.19.4 + '@esbuild/android-arm': 0.19.5 + '@esbuild/android-arm64': 0.19.5 + '@esbuild/android-x64': 0.19.5 + '@esbuild/darwin-arm64': 0.19.5 + '@esbuild/darwin-x64': 0.19.5 + '@esbuild/freebsd-arm64': 0.19.5 + '@esbuild/freebsd-x64': 0.19.5 + '@esbuild/linux-arm': 0.19.5 + '@esbuild/linux-arm64': 0.19.5 + '@esbuild/linux-ia32': 0.19.5 + '@esbuild/linux-loong64': 0.19.5 + '@esbuild/linux-mips64el': 0.19.5 + '@esbuild/linux-ppc64': 0.19.5 + '@esbuild/linux-riscv64': 0.19.5 + '@esbuild/linux-s390x': 0.19.5 + '@esbuild/linux-x64': 0.19.5 + '@esbuild/netbsd-x64': 0.19.5 + '@esbuild/openbsd-x64': 0.19.5 + '@esbuild/sunos-x64': 0.19.5 + '@esbuild/win32-arm64': 0.19.5 + '@esbuild/win32-ia32': 0.19.5 + '@esbuild/win32-x64': 0.19.5 dev: false /escalade@3.1.1: @@ -11303,7 +11242,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.3 dev: false /esutils@2.0.3: @@ -11601,8 +11540,8 @@ packages: resolution: {integrity: sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==} dev: false - /fastify@4.24.2: - resolution: {integrity: sha512-V/7fdhFas7HoAyjD8ha8wPCeiRLUzPgwwM5dSSUx/eBUv7GvG61YzjggqOchMOsa7Sw32MNN4uCCoFrl+9ccJA==} + /fastify@4.24.3: + resolution: {integrity: sha512-6HHJ+R2x2LS3y1PqxnwEIjOTZxFl+8h4kSC/TuDPXtA+v2JnV9yEtOsNSKK1RMD7sIR2y1ZsA4BEFaid/cK5pg==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.4.0 @@ -13278,7 +13217,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 chalk: 4.1.2 co: 4.6.0 dedent: 1.3.0 @@ -13299,7 +13238,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.8.6): + /jest-cli@29.7.0(@types/node@20.8.7): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -13313,10 +13252,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.8.6) + create-jest: 29.7.0(@types/node@20.8.7) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.8.6) + jest-config: 29.7.0(@types/node@20.8.7) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.6.2 @@ -13327,7 +13266,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.8.6): + /jest-config@29.7.0(@types/node@20.8.7): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -13342,7 +13281,7 @@ packages: '@babel/core': 7.22.11 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 babel-jest: 29.7.0(@babel/core@7.22.11) chalk: 4.1.2 ci-info: 3.7.1 @@ -13422,7 +13361,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -13452,7 +13391,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 - '@types/node': 20.8.6 + '@types/node': 20.8.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13513,7 +13452,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.8.6 + '@types/node': 20.8.7 dev: true /jest-mock@29.7.0: @@ -13521,7 +13460,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 jest-util: 29.7.0 dev: true @@ -13576,7 +13515,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -13607,7 +13546,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -13659,7 +13598,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 chalk: 4.1.2 ci-info: 3.7.1 graceful-fs: 4.2.11 @@ -13684,7 +13623,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -13703,13 +13642,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.8.6): + /jest@29.7.0(@types/node@20.8.7): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -13722,7 +13661,7 @@ packages: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.8.6) + jest-cli: 29.7.0(@types/node@20.8.7) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -16456,7 +16395,7 @@ packages: resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} engines: {node: '>=8.16.0'} dependencies: - '@types/mime-types': 2.1.2 + '@types/mime-types': 2.1.3 debug: 4.3.4(supports-color@8.1.1) extract-zip: 1.7.0 https-proxy-agent: 4.0.0 @@ -17285,8 +17224,8 @@ packages: postcss: 8.4.31 dev: false - /sass@1.69.3: - resolution: {integrity: sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ==} + /sass@1.69.4: + resolution: {integrity: sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -18258,8 +18197,8 @@ packages: unique-string: 2.0.0 dev: true - /terser@5.21.0: - resolution: {integrity: sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==} + /terser@5.22.0: + resolution: {integrity: sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -19065,7 +19004,7 @@ packages: core-util-is: 1.0.2 extsprintf: 1.3.0 - /vite-node@0.34.6(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0): + /vite-node@0.34.6(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0): resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -19075,7 +19014,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + vite: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) transitivePeerDependencies: - '@types/node' - less @@ -19091,8 +19030,8 @@ packages: resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==} dev: true - /vite@4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0): - resolution: {integrity: sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==} + /vite@4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -19119,12 +19058,12 @@ packages: terser: optional: true dependencies: - '@types/node': 20.8.6 + '@types/node': 20.8.7 esbuild: 0.18.17 postcss: 8.4.31 rollup: 3.29.4 - sass: 1.69.3 - terser: 5.21.0 + sass: 1.69.4 + terser: 5.22.0 optionalDependencies: fsevents: 2.3.2 @@ -19135,12 +19074,12 @@ packages: vitest: '>=0.16.0' dependencies: cross-fetch: 3.1.5 - vitest: 0.34.6(happy-dom@10.0.3)(sass@1.69.3)(terser@5.21.0) + vitest: 0.34.6(happy-dom@10.0.3)(sass@1.69.4)(terser@5.22.0) transitivePeerDependencies: - encoding dev: true - /vitest@0.34.6(happy-dom@10.0.3)(sass@1.69.3)(terser@5.21.0): + /vitest@0.34.6(happy-dom@10.0.3)(sass@1.69.4)(terser@5.22.0): resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} engines: {node: '>=v14.18.0'} hasBin: true @@ -19173,7 +19112,7 @@ packages: dependencies: '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 - '@types/node': 20.8.6 + '@types/node': 20.8.7 '@vitest/expect': 0.34.6 '@vitest/runner': 0.34.6 '@vitest/snapshot': 0.34.6 @@ -19193,8 +19132,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.11(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) - vite-node: 0.34.6(@types/node@20.8.6)(sass@1.69.3)(terser@5.21.0) + vite: 4.5.0(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) + vite-node: 0.34.6(@types/node@20.8.7)(sass@1.69.4)(terser@5.22.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -19753,7 +19692,7 @@ packages: sharp: 0.31.3 dev: false - github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.5.0)(@storybook/components@7.4.6)(@storybook/core-events@7.5.0)(@storybook/manager-api@7.5.0)(@storybook/preview-api@7.5.0)(@storybook/theming@7.5.0)(@storybook/types@7.5.0)(react-dom@18.2.0)(react@18.2.0): + github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.5.0)(@storybook/components@7.5.0)(@storybook/core-events@7.5.0)(@storybook/manager-api@7.5.0)(@storybook/preview-api@7.5.0)(@storybook/theming@7.5.0)(@storybook/types@7.5.0)(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 @@ -19775,7 +19714,7 @@ packages: optional: true dependencies: '@storybook/blocks': 7.5.0(react-dom@18.2.0)(react@18.2.0) - '@storybook/components': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.0(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.0 '@storybook/manager-api': 7.5.0(react-dom@18.2.0)(react@18.2.0) '@storybook/preview-api': 7.5.0 From e5598da7a23c74df5e1b475d99acaee0715de7f0 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 20:22:24 +0900 Subject: [PATCH 021/126] disable cypress widgets tests --- cypress/e2e/widgets.cy.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cypress/e2e/widgets.cy.js b/cypress/e2e/widgets.cy.js index f5a982eb0..df6ec8357 100644 --- a/cypress/e2e/widgets.cy.js +++ b/cypress/e2e/widgets.cy.js @@ -1,3 +1,4 @@ +/* flaky describe('After user signed in', () => { beforeEach(() => { cy.resetState(); @@ -67,3 +68,4 @@ describe('After user signed in', () => { buildWidgetTest('aiscript'); buildWidgetTest('aichan'); }); +*/ From 4a7c6e261a847a5cc622d72dc291755956bb71e8 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 20:47:23 +0900 Subject: [PATCH 022/126] =?UTF-8?q?fix(backend):=20=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E8=80=85=E6=A8=A9=E9=99=90=E3=81=AE=E3=83=AD=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E3=82=92=E6=8C=81=E3=81=A3=E3=81=A6=E3=81=84=E3=81=A6=E3=82=82?= =?UTF-8?q?=E4=B8=80=E9=83=A8=E3=81=AEAPI=E3=81=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=84=E3=81=93=E3=81=A8=E3=81=8C?= =?UTF-8?q?=E3=81=82=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + packages/backend/src/server/api/ApiCallService.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4560cee89..f5feec00c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ - Enhance: ストリーミングAPIのパフォーマンスを向上 - Fix: users/notesでDBから参照した際にチャンネル投稿のみ取得される問題を修正 - Fix: コントロールパネルの設定項目が正しく保存できない問題を修正 +- Fix: 管理者権限のロールを持っていても一部のAPIが使用できないことがある問題を修正 - Change: ユーザーのisCatがtrueでも、サーバーではnyaizeが行われなくなりました - isCatな場合、クライアントでnyaize処理を行うことを推奨します diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts index 085a0fd58..66f171a5d 100644 --- a/packages/backend/src/server/api/ApiCallService.ts +++ b/packages/backend/src/server/api/ApiCallService.ts @@ -318,8 +318,9 @@ export class ApiCallService implements OnApplicationShutdown { } if (ep.meta.requireRolePolicy != null && !user!.isRoot) { + const myRoles = await this.roleService.getUserRoles(user!.id); const policies = await this.roleService.getUserPolicies(user!.id); - if (!policies[ep.meta.requireRolePolicy]) { + if (!policies[ep.meta.requireRolePolicy] && !myRoles.some(r => r.isAdministrator)) { throw new ApiError({ message: 'You are not assigned to a required role.', code: 'ROLE_PERMISSION_DENIED', From 6ff5bfd2bc6c286c689fee9577b9e9036112e689 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 20 Oct 2023 07:48:31 +0900 Subject: [PATCH 023/126] clean up --- .../backend/src/core/NoteCreateService.ts | 1 - .../core/entities/InstanceEntityService.ts | 2 +- packages/backend/src/misc/nyaize.ts | 20 ------------------- .../api/endpoints/notes/user-list-timeline.ts | 8 +------- 4 files changed, 2 insertions(+), 29 deletions(-) delete mode 100644 packages/backend/src/misc/nyaize.ts diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index f5cfe0312..364a300d2 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -55,7 +55,6 @@ import { MetaService } from '@/core/MetaService.js'; import { SearchService } from '@/core/SearchService.js'; import { FeaturedService } from '@/core/FeaturedService.js'; import { FunoutTimelineService } from '@/core/FunoutTimelineService.js'; -import { nyaize } from '@/misc/nyaize.js'; import { UtilityService } from '@/core/UtilityService.js'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; diff --git a/packages/backend/src/core/entities/InstanceEntityService.ts b/packages/backend/src/core/entities/InstanceEntityService.ts index 9afe87eab..8bba150ec 100644 --- a/packages/backend/src/core/entities/InstanceEntityService.ts +++ b/packages/backend/src/core/entities/InstanceEntityService.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { Inject, Injectable } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import type { Packed } from '@/misc/json-schema.js'; import type { MiInstance } from '@/models/Instance.js'; import { MetaService } from '@/core/MetaService.js'; diff --git a/packages/backend/src/misc/nyaize.ts b/packages/backend/src/misc/nyaize.ts deleted file mode 100644 index 0ac77e100..000000000 --- a/packages/backend/src/misc/nyaize.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * SPDX-FileCopyrightText: syuilo and other misskey contributors - * SPDX-License-Identifier: AGPL-3.0-only - */ - -export function nyaize(text: string): string { - return text - // ja-JP - .replaceAll('な', 'にゃ').replaceAll('ナ', 'ニャ').replaceAll('ナ', 'ニャ') - // en-US - .replace(/(?<=n)a/gi, x => x === 'A' ? 'YA' : 'ya') - .replace(/(?<=morn)ing/gi, x => x === 'ING' ? 'YAN' : 'yan') - .replace(/(?<=every)one/gi, x => x === 'ONE' ? 'NYAN' : 'nyan') - // ko-KR - .replace(/[나-낳]/g, match => String.fromCharCode( - match.charCodeAt(0)! + '냐'.charCodeAt(0) - '나'.charCodeAt(0), - )) - .replace(/(다$)|(다(?=\.))|(다(?= ))|(다(?=!))|(다(?=\?))/gm, '다냥') - .replace(/(야(?=\?))|(야$)|(야(?= ))/gm, '냥'); -} diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts index 2b31e6169..96e1e94f7 100644 --- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts @@ -3,12 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { Brackets } from 'typeorm'; import { Inject, Injectable } from '@nestjs/common'; -import * as Redis from 'ioredis'; -import type { NotesRepository, UserListsRepository, UserListMembershipsRepository, MiNote } from '@/models/_.js'; +import type { NotesRepository, UserListsRepository } from '@/models/_.js'; import { Endpoint } from '@/server/api/endpoint-base.js'; -import { QueryService } from '@/core/QueryService.js'; import { NoteEntityService } from '@/core/entities/NoteEntityService.js'; import ActiveUsersChart from '@/core/chart/charts/active-users.js'; import { DI } from '@/di-symbols.js'; @@ -67,9 +64,6 @@ export const paramDef = { @Injectable() export default class extends Endpoint { // eslint-disable-line import/no-default-export constructor( - @Inject(DI.redisForTimelines) - private redisForTimelines: Redis.Redis, - @Inject(DI.notesRepository) private notesRepository: NotesRepository, From 216b20d2dbbc042c59bf421502904da468c931fb Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 20 Oct 2023 08:02:32 +0900 Subject: [PATCH 024/126] =?UTF-8?q?fix(backend):=20=E8=87=AA=E5=88=86?= =?UTF-8?q?=E3=81=AE=E3=83=95=E3=82=A9=E3=83=AD=E3=83=AF=E3=83=BC=E9=99=90?= =?UTF-8?q?=E5=AE=9A=E3=83=8E=E3=83=BC=E3=83=88=E3=81=8CWebsoket=E3=81=AB?= =?UTF-8?q?=E4=B9=97=E3=81=A3=E3=81=A6=E3=81=93=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #12081 --- .../src/server/api/stream/channels/home-timeline.ts | 8 +++++--- .../src/server/api/stream/channels/hybrid-timeline.ts | 8 +++++--- .../backend/src/server/api/stream/channels/user-list.ts | 6 ++++-- 3 files changed, 14 insertions(+), 8 deletions(-) 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 2b235b982..46071e82f 100644 --- a/packages/backend/src/server/api/stream/channels/home-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts @@ -39,20 +39,22 @@ class HomeTimelineChannel extends Channel { @bindThis private async onNote(note: Packed<'Note'>) { + const isMe = this.user!.id === note.userId; + if (this.withFiles && (note.fileIds == null || note.fileIds.length === 0)) return; if (note.channelId) { if (!this.followingChannels.has(note.channelId)) return; } else { // その投稿のユーザーをフォローしていなかったら弾く - if ((this.user!.id !== note.userId) && !Object.hasOwn(this.following, note.userId)) return; + if (!isMe && !Object.hasOwn(this.following, note.userId)) return; } // Ignore notes from instances the user has muted if (isInstanceMuted(note, new Set(this.userProfile!.mutedInstances))) return; if (note.visibility === 'followers') { - if (!Object.hasOwn(this.following, note.userId)) return; + if (!isMe && !Object.hasOwn(this.following, note.userId)) return; } else if (note.visibility === 'specified') { if (!note.visibleUserIds!.includes(this.user!.id)) return; } @@ -61,7 +63,7 @@ class HomeTimelineChannel extends Channel { if (note.reply && !this.following[note.userId]?.withReplies) { const reply = note.reply; // 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 - if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; + if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return; } if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) 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 4e9091208..2722ebcd5 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -49,6 +49,8 @@ class HybridTimelineChannel extends Channel { @bindThis private async onNote(note: Packed<'Note'>) { + const isMe = this.user!.id === note.userId; + if (this.withFiles && (note.fileIds == null || note.fileIds.length === 0)) return; // チャンネルの投稿ではなく、自分自身の投稿 または @@ -56,14 +58,14 @@ class HybridTimelineChannel extends Channel { // チャンネルの投稿ではなく、全体公開のローカルの投稿 または // フォローしているチャンネルの投稿 の場合だけ if (!( - (note.channelId == null && this.user!.id === note.userId) || + (note.channelId == null && isMe) || (note.channelId == null && Object.hasOwn(this.following, note.userId)) || (note.channelId == null && (note.user.host == null && note.visibility === 'public')) || (note.channelId != null && this.followingChannels.has(note.channelId)) )) return; if (note.visibility === 'followers') { - if (!Object.hasOwn(this.following, note.userId)) return; + if (!isMe && !Object.hasOwn(this.following, note.userId)) return; } else if (note.visibility === 'specified') { if (!note.visibleUserIds!.includes(this.user!.id)) return; } @@ -75,7 +77,7 @@ class HybridTimelineChannel extends Channel { if (note.reply && !this.following[note.userId]?.withReplies && !this.withReplies) { const reply = note.reply; // 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 - if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; + if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return; } if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) return; diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts index 6d83d4cb5..68927987d 100644 --- a/packages/backend/src/server/api/stream/channels/user-list.ts +++ b/packages/backend/src/server/api/stream/channels/user-list.ts @@ -78,12 +78,14 @@ class UserListChannel extends Channel { @bindThis private async onNote(note: Packed<'Note'>) { + const isMe = this.user!.id === note.userId; + if (this.withFiles && (note.fileIds == null || note.fileIds.length === 0)) return; if (!Object.hasOwn(this.membershipsMap, note.userId)) return; if (note.visibility === 'followers') { - if (!Object.hasOwn(this.following, note.userId)) return; + if (!isMe && !Object.hasOwn(this.following, note.userId)) return; } else if (note.visibility === 'specified') { if (!note.visibleUserIds!.includes(this.user!.id)) return; } @@ -92,7 +94,7 @@ class UserListChannel extends Channel { if (note.reply && !this.membershipsMap[note.userId]?.withReplies) { const reply = note.reply; // 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 - if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; + if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return; } // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する From 683b71fc7e4c2c041a4990555e2e72409e96397c Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 20 Oct 2023 08:13:20 +0900 Subject: [PATCH 025/126] add timeline tests --- packages/backend/test/e2e/streaming.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/backend/test/e2e/streaming.ts b/packages/backend/test/e2e/streaming.ts index 5a83bbb7d..43bbacd20 100644 --- a/packages/backend/test/e2e/streaming.ts +++ b/packages/backend/test/e2e/streaming.ts @@ -115,6 +115,16 @@ describe('Streaming', () => { assert.strictEqual(fired, true); }); + test('自分の visibility: followers な投稿が流れる', async () => { + const fired = await waitFire( + ayano, 'homeTimeline', // ayano:Home + () => api('notes/create', { text: 'foo', visibility: 'followers' }, ayano), // ayano posts + msg => msg.type === 'note' && msg.body.text === 'foo', + ); + + assert.strictEqual(fired, true); + }); + test('フォローしているユーザーの投稿が流れる', async () => { const fired = await waitFire( ayano, 'homeTimeline', // ayano:home @@ -125,6 +135,16 @@ describe('Streaming', () => { assert.strictEqual(fired, true); }); + test('フォローしているユーザーの visibility: followers な投稿が流れる', async () => { + const fired = await waitFire( + ayano, 'homeTimeline', // ayano:home + () => api('notes/create', { text: 'foo', visibility: 'followers' }, kyoko), // kyoko posts + msg => msg.type === 'note' && msg.body.userId === kyoko.id, // wait kyoko + ); + + assert.strictEqual(fired, true); + }); + test('フォローしていないユーザーの投稿は流れない', async () => { const fired = await waitFire( kyoko, 'homeTimeline', // kyoko:home From d962ea3889abf6c4396de2449636415587070de4 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 20 Oct 2023 08:15:31 +0900 Subject: [PATCH 026/126] add timeline tests --- packages/backend/test/e2e/streaming.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/backend/test/e2e/streaming.ts b/packages/backend/test/e2e/streaming.ts index 43bbacd20..b3b5f1955 100644 --- a/packages/backend/test/e2e/streaming.ts +++ b/packages/backend/test/e2e/streaming.ts @@ -261,6 +261,16 @@ describe('Streaming', () => { assert.strictEqual(fired, true); }); + test('自分の visibility: followers な投稿が流れる', async () => { + const fired = await waitFire( + ayano, 'hybridTimeline', + () => api('notes/create', { text: 'foo', visibility: 'followers' }, ayano), // ayano posts + msg => msg.type === 'note' && msg.body.text === 'foo', + ); + + assert.strictEqual(fired, true); + }); + test('フォローしていないローカルユーザーの投稿が流れる', async () => { const fired = await waitFire( ayano, 'hybridTimeline', // ayano:Hybrid @@ -313,6 +323,16 @@ describe('Streaming', () => { assert.strictEqual(fired, true); }); + test('フォローしているユーザーの visibility: followers な投稿が流れる', async () => { + const fired = await waitFire( + ayano, 'hybridTimeline', // ayano:Hybrid + () => api('notes/create', { text: 'foo', visibility: 'followers' }, kyoko), + msg => msg.type === 'note' && msg.body.userId === kyoko.id, // wait kyoko + ); + + assert.strictEqual(fired, true); + }); + test('フォローしていないローカルユーザーのホーム投稿は流れない', async () => { const fired = await waitFire( ayano, 'hybridTimeline', // ayano:Hybrid From 18af290b18cb73659a2421704ee9c7e474eaeca7 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 20 Oct 2023 11:33:33 +0900 Subject: [PATCH 027/126] chore: tweak MkNotifications --- packages/frontend/src/components/MkNotifications.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkNotifications.vue b/packages/frontend/src/components/MkNotifications.vue index 6ba2e513c..263e0aa1c 100644 --- a/packages/frontend/src/components/MkNotifications.vue +++ b/packages/frontend/src/components/MkNotifications.vue @@ -41,7 +41,7 @@ const pagingComponent = shallowRef>(); const pagination: Paging = { endpoint: 'i/notifications' as const, - limit: 10, + limit: 20, params: computed(() => ({ excludeTypes: props.excludeTypes ?? undefined, })), From 21986a2168d9c13725daef71ac8fd9722ee0fa91 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 20 Oct 2023 11:51:01 +0900 Subject: [PATCH 028/126] =?UTF-8?q?enhance(frontend):=20=E6=8A=95=E7=A8=BF?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=8B=E3=82=89=E6=99=82=E9=96=93?= =?UTF-8?q?=E3=81=8C=E7=B5=8C=E9=81=8E=E3=81=97=E3=81=A6=E3=81=84=E3=82=8B?= =?UTF-8?q?=E3=83=8E=E3=83=BC=E3=83=88=E3=81=A7=E3=81=82=E3=82=8B=E3=81=93?= =?UTF-8?q?=E3=81=A8=E3=82=92=E8=A6=96=E8=A6=9A=E7=9A=84=E3=81=AB=E5=88=86?= =?UTF-8?q?=E3=81=8B=E3=82=8A=E3=82=84=E3=81=99=E3=81=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + packages/frontend/src/components/MkNoteDetailed.vue | 2 +- packages/frontend/src/components/MkNoteHeader.vue | 2 +- packages/frontend/src/components/global/MkTime.vue | 13 ++++++++++++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5feec00c..4b10c8d12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ ### Client - Enhance: TLの返信表示オプションを記憶するように +- Enhance: 投稿されてから時間が経過しているノートであることを視覚的に分かりやすく ### Server - Enhance: タイムライン取得時のパフォーマンスを向上 diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index 273984cc0..4f40feffd 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -94,7 +94,7 @@ SPDX-License-Identifier: AGPL-3.0-only