From fcc48640800f6dcf4eb31d438609d00059b654bd Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 07:56:25 +0900 Subject: [PATCH 001/369] 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 7cb7e4b913..9a59da4349 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 e4c34e00ce..251350ddaa 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 c499d1787e..9c623abf76 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 2cfe9572d3..247145d8c5 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 3ccf4af66d..eed5c699d9 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 760fab60a4..d9b5cafc85 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 a211041134..2424b468df 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 b73cedaa8b..c3b4c9d742 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/369] 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 251350ddaa..4d85e1ceec 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 9c623abf76..18b8e8245b 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 247145d8c5..fb9226413b 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 eed5c699d9..6914841534 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 d9b5cafc85..c353aaac0f 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 2424b468df..0823799d2c 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 c3b4c9d742..a5a9d189b4 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/369] 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 9a59da4349..66dbb66167 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/369] =?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 0000000000..fe0ea282d2 --- /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 30d7f3e76a..2c00418c47 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 1458e2b173..edf433025d 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 66dbb66167..b46b5528a5 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 ac7f57d5d6..a4358b9ba6 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 2caf0d0c3d..38c0054b55 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 4d85e1ceec..57034231a3 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 18b8e8245b..553c44071f 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 fb9226413b..f30b29cfd6 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 6914841534..2b235b9822 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 c353aaac0f..4e90912084 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 0823799d2c..9dd05b9b08 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 a5a9d189b4..6d83d4cb5b 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/369] 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 edf433025d..f3f2b04dd6 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 b46b5528a5..c100b92ee7 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/369] 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 e598b91e51..757cf21615 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/369] 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 f3f2b04dd6..4233b8d4c3 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/369] =?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 ee2d39cdef..8f895f8009 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 2c00418c47..f5cfe03122 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 2ae3fc89c8..ea3655f6bb 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 0000000000..0ac77e1006 --- /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 895f34689b..54bbfae145 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 e05412abb9..659045bd6e 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/369] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f895f8009..d0db7ed654 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/369] 2023.10.2-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8808b71d72..a60c641e60 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/369] =?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 9986c6e436..f8a7a6a8b7 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/369] 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 9d5688f96f..3b6c93fdf9 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 ce7e23c7780af4185e9c1140806f759e1e2b1421 Mon Sep 17 00:00:00 2001 From: Mar0xy Date: Thu, 19 Oct 2023 10:36:15 +0200 Subject: [PATCH 013/369] chore: update dev version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 54a07b5f2e..5e953828f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sharkey", - "version": "2023.10.2", + "version": "2023.10.3.beta1", "codename": "shonk", "repository": { "type": "git", From 77392786857f391f8ac4070c531e1724b74e34a3 Mon Sep 17 00:00:00 2001 From: Mar0xy Date: Thu, 19 Oct 2023 10:37:40 +0200 Subject: [PATCH 014/369] upd: don't show approved badge on remote users --- packages/frontend/src/pages/admin-user.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue index 2f6178d2b3..d10dc8ec48 100644 --- a/packages/frontend/src/pages/admin-user.vue +++ b/packages/frontend/src/pages/admin-user.vue @@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only @{{ acct(user) }} {{ i18n.ts.notApproved }} - {{ i18n.ts.approved }} + {{ i18n.ts.approved }} Suspended Silenced Moderator From 059401aeab675beba0f435d758277c4b6ec03527 Mon Sep 17 00:00:00 2001 From: Mar0xy Date: Thu, 19 Oct 2023 10:38:46 +0200 Subject: [PATCH 015/369] fix: system users not being set to approved on creation --- packages/backend/src/core/CreateSystemUserService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend/src/core/CreateSystemUserService.ts b/packages/backend/src/core/CreateSystemUserService.ts index f1ebb4f60a..58853c8e23 100644 --- a/packages/backend/src/core/CreateSystemUserService.ts +++ b/packages/backend/src/core/CreateSystemUserService.ts @@ -61,6 +61,7 @@ export class CreateSystemUserService { isRoot: false, isLocked: true, isExplorable: false, + approved: true, isBot: true, }).then(x => transactionalEntityManager.findOneByOrFail(MiUser, x.identifiers[0])); From c3f768181ae232a9ac03c69759f5508398b4cd55 Mon Sep 17 00:00:00 2001 From: Mar0xy Date: Thu, 19 Oct 2023 10:42:18 +0200 Subject: [PATCH 016/369] fix: invite code not being marked as used Fixes an issue where if approval and invite were enabled the code would stay as unused --- packages/backend/src/server/api/SignupApiService.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/SignupApiService.ts b/packages/backend/src/server/api/SignupApiService.ts index 418656fdbc..c07389d975 100644 --- a/packages/backend/src/server/api/SignupApiService.ts +++ b/packages/backend/src/server/api/SignupApiService.ts @@ -199,7 +199,7 @@ export class SignupApiService { reply.code(204); return; } else if (instance.approvalRequiredForSignup) { - await this.signupService.signup({ + const { account } = await this.signupService.signup({ username, password, host, reason, }); @@ -209,6 +209,14 @@ export class SignupApiService { 'Congratulations! Your account is now pending approval. You will get notified when you have been accepted.'); } + if (ticket) { + await this.registrationTicketsRepository.update(ticket.id, { + usedAt: new Date(), + usedBy: account, + usedById: account.id, + }); + } + reply.code(204); return; } else { From 721cbe085b39dc8feeb4e57cf75d9c801a5db66d Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 17:42:19 +0900 Subject: [PATCH 017/369] 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 ea3655f6bb..f937b5f9e1 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 c055578627dee106ee4023180e750503c5a2fa3a Mon Sep 17 00:00:00 2001 From: Amelia Yukii <123300075+Insert5StarName@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:04:00 +0200 Subject: [PATCH 018/369] chore: update readme --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c7f9500cb7..4f16f023a8 100644 --- a/README.md +++ b/README.md @@ -16,16 +16,14 @@ ## ✨ Features - **ActivityPub support**\ Not on Sharkey? No problem! Not only can Sharkey instances talk to each other, but you can make friends with people on other networks like Mastodon and Pixelfed! -- **Reactions**\ -You can add emoji reactions to any post! No longer are you bound by a like button, show everyone exactly how you feel with the tap of a button. -- **Post Editing**\ -In Sharkey you can edit your post, this is not possible in normal Misskey +- **Federated Backgrounds and Music status**\ +You can add a background to your profile as well as a music status via ListenBrainz, show everyone what music you are currently listening too - **Mastodon API**\ Sharkey implements the Mastodon API unlike normal Misskey - **UI/UX Improvements**\ Sharkey makes some UI/UX improvements to make it easier to navigate -- **Drive**\ -With Sharkey's built in drive, you get cloud storage right in your social media, where you can upload any files, make folders, and find media from posts you've made! +- **Sign-Up Approval**\ +With Sharkey, you can enable sign-ups, subject to manual moderator approval and mandatory user-provided reasons for joining. - **Rich Web UI**\ Sharkey has a rich and easy to use Web UI! It is highly customizable, from changing the layout and adding widgets to making custom themes. 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 019/369] =?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 54bbfae145..0136df2030 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 659045bd6e..50b4a40c49 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 020/369] =?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 f8a7a6a8b7..cbab13f30d 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 021/369] 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 39f29bf773..d2df953346 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 fb04cf1b00..03dfcd0a0b 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 3e5bb17902..a43789b754 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 33c85cbaf4..08cb91c2d0 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 2a1ac3a16c..edb18b04da 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 798e6f49a3..bcffc512bc 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 44f97645d0..0e76bdeb2f 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 ac7d1afda1..752e29ff7a 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 e67b516546..30829cb6a4 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 1846b628d3..b5c6bff641 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 c570018962..bcb89bb457 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 022/369] 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 5272bf865e..339d2ac71b 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 a1360aba9d..273984cc0a 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 c618532570..bda9c04ea4 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 023/369] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0db7ed654..4560cee898 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 024/369] 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 f131b18cb0..5f588efd44 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 b2440c2b66..7d97c976a6 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 15b2c7cbda..fb78c108ac 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 5efd8cd119..860b47f3e7 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 d5c346717b..c9f145bc4c 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 a706d39907..ebfab39eac 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 acb4dfa5e5..7fa30c1c66 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 025/369] 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 a60c641e60..973e261650 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 30ca2e1102..2518b0dd7f 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 feadbbb041..05498c6aee 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 2f65c3b95f..5b683e547e 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 c045b32165..6eeab6cc05 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 08f6e9b121..df0558e56d 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 026/369] 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 f5a982eb0a..df6ec8357d 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 e1e02a6dbce361d310b1d40ea181f9fa16f21198 Mon Sep 17 00:00:00 2001 From: Mar0xy Date: Thu, 19 Oct 2023 13:26:40 +0200 Subject: [PATCH 027/369] fix: being able to set birthday into the future --- packages/frontend/src/components/MkInput.vue | 2 +- .../frontend/src/pages/settings/profile.vue | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/components/MkInput.vue b/packages/frontend/src/components/MkInput.vue index a51a97efe5..9918a3ff60 100644 --- a/packages/frontend/src/components/MkInput.vue +++ b/packages/frontend/src/components/MkInput.vue @@ -62,7 +62,7 @@ const props = defineProps<{ step?: any; datalist?: string[]; min?: number; - max?: number; + max?: number | string; inline?: boolean; debounce?: boolean; manualSave?: boolean; diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue index 6d557aced4..10705cfa0e 100644 --- a/packages/frontend/src/pages/settings/profile.vue +++ b/packages/frontend/src/pages/settings/profile.vue @@ -28,7 +28,7 @@ SPDX-License-Identifier: AGPL-3.0-only - + @@ -134,6 +134,14 @@ const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.d const reactionAcceptance = computed(defaultStore.makeGetterSetter('reactionAcceptance')); +const now = new Date(); + +const setMaxBirthDate = () => { + const y = now.getFullYear(); + + return `${y}-12-31`; +}; + const profile = reactive({ name: $i.name, description: $i.description, @@ -178,6 +186,13 @@ function saveFields() { } function save() { + if (profile.birthday && profile.birthday > setMaxBirthDate()) { + os.alert({ + type: 'warning', + text: 'You can\'t set your birthday to the future', + }); + return undefined; + } os.apiWithDialog('i/update', { // 空文字列をnullにしたいので??は使うな // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing From 4a7c6e261a847a5cc622d72dc291755956bb71e8 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 19 Oct 2023 20:47:23 +0900 Subject: [PATCH 028/369] =?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 4560cee898..f5feec00c4 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 085a0fd58a..66f171a5d8 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 d6ebbf57211c802f4a80aaf3e8145c94140b98a6 Mon Sep 17 00:00:00 2001 From: Insert5StarName Date: Thu, 19 Oct 2023 14:48:31 +0200 Subject: [PATCH 029/369] fix: performance issues & respect blur option --- packages/frontend/src/components/MkContainer.vue | 2 -- packages/frontend/src/components/MkNotes.vue | 2 -- packages/frontend/src/pages/user/home.vue | 5 ++--- packages/frontend/src/style.scss | 1 - 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/frontend/src/components/MkContainer.vue b/packages/frontend/src/components/MkContainer.vue index 4928806aad..3195377d60 100644 --- a/packages/frontend/src/components/MkContainer.vue +++ b/packages/frontend/src/components/MkContainer.vue @@ -139,7 +139,6 @@ onUnmounted(() => { overflow: clip; contain: content; background: color-mix(in srgb, var(--panel) 65%, transparent); - backdrop-filter: blur(16px); &.naked { background: transparent !important; box-shadow: none !important; @@ -173,7 +172,6 @@ onUnmounted(() => { z-index: 2; line-height: 1.4em; background: color-mix(in srgb, var(--panelHeaderBg) 35%, transparent); - backdrop-filter: blur(16px); } .title { diff --git a/packages/frontend/src/components/MkNotes.vue b/packages/frontend/src/components/MkNotes.vue index 2fc50f4d47..024599767e 100644 --- a/packages/frontend/src/components/MkNotes.vue +++ b/packages/frontend/src/components/MkNotes.vue @@ -57,7 +57,6 @@ defineExpose({ &.noGap { > .notes { background: color-mix(in srgb, var(--panel) 65%, transparent); - backdrop-filter: blur(16px); } } @@ -67,7 +66,6 @@ defineExpose({ .note { background: color-mix(in srgb, var(--panel) 65%, transparent); - backdrop-filter: blur(16px); border-radius: var(--radius); } } diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue index d1e57db0e1..f65cf07e08 100644 --- a/packages/frontend/src/pages/user/home.vue +++ b/packages/frontend/src/pages/user/home.vue @@ -367,7 +367,7 @@ onUnmounted(() => { background-size: cover; background-position: center; pointer-events: none; - filter: blur(8px) opacity(0.6); + filter: var(--blur, blur(10px)) opacity(0.6); // Funny CSS schenanigans to make background escape container left: -100%; top: -5%; @@ -391,7 +391,6 @@ onUnmounted(() => { position: relative; overflow: clip; background: color-mix(in srgb, var(--panel) 65%, transparent); - backdrop-filter: blur(16px); > .banner-container { position: relative; @@ -755,7 +754,7 @@ onUnmounted(() => { margin: calc(var(--margin) / 2) 0; padding: calc(var(--margin) / 2) 0; background: color-mix(in srgb, var(--bg) 65%, transparent); - backdrop-filter: blur(16px); + backdrop-filter: var(--blur, blur(15px)); border-radius: 5px; > button { border-radius: 5px; diff --git a/packages/frontend/src/style.scss b/packages/frontend/src/style.scss index e155fd1ba0..aba205d003 100644 --- a/packages/frontend/src/style.scss +++ b/packages/frontend/src/style.scss @@ -268,7 +268,6 @@ hr { ._panel { background: color-mix(in srgb, var(--panel) 65%, transparent); - backdrop-filter: blur(16px); border-radius: var(--radius); overflow: clip; } From 456952007b3a9e1b37810c3a41f3a5085721ad6b Mon Sep 17 00:00:00 2001 From: Insert5StarName Date: Thu, 19 Oct 2023 14:57:42 +0200 Subject: [PATCH 030/369] fix: headers of containers --- packages/frontend/src/components/MkContainer.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/components/MkContainer.vue b/packages/frontend/src/components/MkContainer.vue index 3195377d60..f79d3418b2 100644 --- a/packages/frontend/src/components/MkContainer.vue +++ b/packages/frontend/src/components/MkContainer.vue @@ -172,6 +172,7 @@ onUnmounted(() => { z-index: 2; line-height: 1.4em; background: color-mix(in srgb, var(--panelHeaderBg) 35%, transparent); + backdrop-filter: var(--blur, blur(15px)); } .title { From 86f41914a6945bd149fbbc780b7516210ee98798 Mon Sep 17 00:00:00 2001 From: Insert5StarName Date: Thu, 19 Oct 2023 17:43:00 +0200 Subject: [PATCH 031/369] revert: blur in container --- packages/frontend/src/components/MkContainer.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/frontend/src/components/MkContainer.vue b/packages/frontend/src/components/MkContainer.vue index f79d3418b2..3195377d60 100644 --- a/packages/frontend/src/components/MkContainer.vue +++ b/packages/frontend/src/components/MkContainer.vue @@ -172,7 +172,6 @@ onUnmounted(() => { z-index: 2; line-height: 1.4em; background: color-mix(in srgb, var(--panelHeaderBg) 35%, transparent); - backdrop-filter: var(--blur, blur(15px)); } .title { From fc5d75f8d4085c71d39890154b8fc6527736d84a Mon Sep 17 00:00:00 2001 From: Mar0xy Date: Thu, 19 Oct 2023 22:23:27 +0200 Subject: [PATCH 032/369] fix: no translations on sub notes Closes bug: transfem-org/Sharkey#89 --- packages/frontend/src/components/MkNoteSub.vue | 4 ++-- .../frontend/src/components/MkSubNoteContent.vue | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/components/MkNoteSub.vue b/packages/frontend/src/components/MkNoteSub.vue index 83c91e34ed..7cf5d1abfe 100644 --- a/packages/frontend/src/components/MkNoteSub.vue +++ b/packages/frontend/src/components/MkNoteSub.vue @@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only

- +