From 8442beae922681c4ce61f07bc20a6c4948dc67fd Mon Sep 17 00:00:00 2001 From: naskya Date: Sun, 9 Jul 2023 13:58:58 +0000 Subject: [PATCH 001/162] fix reactions_not_public condition --- packages/backend/src/server/api/endpoints/users/reactions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/endpoints/users/reactions.ts b/packages/backend/src/server/api/endpoints/users/reactions.ts index 17b7a04a0..6b6d32e8a 100644 --- a/packages/backend/src/server/api/endpoints/users/reactions.ts +++ b/packages/backend/src/server/api/endpoints/users/reactions.ts @@ -49,7 +49,7 @@ export const paramDef = { export default define(meta, paramDef, async (ps, me) => { const profile = await UserProfiles.findOneByOrFail({ userId: ps.userId }); - if (me == null || (me.id !== ps.userId && !profile.publicReactions)) { + if (me.id !== ps.userId && !profile.publicReactions) { throw new ApiError(meta.errors.reactionsNotPublic); } From d2e4769fa4d366c46cff7cee4881fdf478218a44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Sun, 9 Jul 2023 18:22:53 +0200 Subject: [PATCH 002/162] Fix Mastodon compatibility string MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- packages/backend/src/server/api/mastodon/endpoints/meta.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/mastodon/endpoints/meta.ts b/packages/backend/src/server/api/mastodon/endpoints/meta.ts index 2df4af82a..042071f0e 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/meta.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/meta.ts @@ -1,4 +1,5 @@ import { Entity } from "megalodon"; +import config from "@/config/index.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; import { Users, Notes } from "@/models/index.js"; import { IsNull, MoreThan } from "typeorm"; @@ -17,7 +18,7 @@ export async function getInstance(response: Entity.Instance) { response.description || "This is a vanilla Calckey Instance. It doesnt seem to have a description. BTW you are using the Mastodon api to access this server :)", email: response.email || "", - version: "3.0.0 compatible (3.5+ Calckey)", //I hope this version string is correct, we will need to test it. + version: `3.0.0 (compatible; Calckey ${config.version})`, urls: response.urls, stats: { user_count: await totalUsers, From d850381376e789aeb7e64a2d9c1361396ad78581 Mon Sep 17 00:00:00 2001 From: sinofp Date: Sun, 9 Jul 2023 18:54:12 +0100 Subject: [PATCH 003/162] Implement speak-as-cat for Chinese and Greek MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Chinese meow character is 喵, whose pinyin is miāo. 妙, 庙, 描, 渺, 瞄, 秒, 苗, and 藐 are all the miao characters from *3500 commonly used Chinese characters.xls* @naskya proposed to include 廟 and να. Download the spreadsheet from https://faculty.blcu.edu.cn/xinghb/zh_CN/article/167473/content/1045.htm See the discussion at https://codeberg.org/calckey/calckey/issues/9746#issuecomment-974699 --- packages/backend/src/misc/nyaize.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/backend/src/misc/nyaize.ts b/packages/backend/src/misc/nyaize.ts index dd0c5bbdf..2b996c611 100644 --- a/packages/backend/src/misc/nyaize.ts +++ b/packages/backend/src/misc/nyaize.ts @@ -20,5 +20,9 @@ export function nyaize(text: string): string { ) .replace(/(다$)|(다(?=\.))|(다(?= ))|(다(?=!))|(다(?=\?))/gm, "다냥") .replace(/(야(?=\?))|(야$)|(야(?= ))/gm, "냥") + // Chinese + .replace(/(妙|庙|描|渺|瞄|秒|苗|藐|廟)/g, "喵") + // Greek + .replaceAll("να", "νια") ); } From 46d97d49a2298c1b8c1537ef1ed3eff376b49285 Mon Sep 17 00:00:00 2001 From: freeplay Date: Sun, 9 Jul 2023 15:05:39 -0400 Subject: [PATCH 004/162] style: link underlines --- packages/client/src/components/MkUrlPreview.vue | 3 ++- packages/client/src/components/global/MkUrl.vue | 2 ++ packages/client/src/components/mfm.ts | 1 + packages/client/src/style.scss | 16 ++++++++++++---- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 6452e135d..8fa8092b8 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -196,6 +196,7 @@ onUnmounted(() => { > a { display: flex; transition: background 0.2s; + text-decoration: none; > div:first-child:not(:last-child) { position: relative; width: 90px; @@ -277,7 +278,7 @@ onUnmounted(() => { &:focus, &:focus-within { background: var(--panelHighlight); - h1 { + h3 { text-decoration: underline; } } diff --git a/packages/client/src/components/global/MkUrl.vue b/packages/client/src/components/global/MkUrl.vue index 98ba8d94e..3453bf5ed 100644 --- a/packages/client/src/components/global/MkUrl.vue +++ b/packages/client/src/components/global/MkUrl.vue @@ -80,6 +80,8 @@ const target = self ? null : "_blank"; display: inline-block; overflow: clip; text-overflow: ellipsis; + text-decoration: none !important; + line-height: 1.05; > .icon { padding-left: 2px; diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index cb0942a33..63465f38b 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -409,6 +409,7 @@ export default defineComponent({ key: Math.random(), to: `/tags/${encodeURIComponent(token.props.hashtag)}`, style: "color:var(--hashtag);", + class: "_link", }, `#${token.props.hashtag}`, ), diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index a6ef73015..be12f8b15 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -145,6 +145,9 @@ a { cursor: pointer; color: inherit; -webkit-tap-highlight-color: transparent; + &:hover { + text-decoration: underline; + } } // i { @@ -229,6 +232,7 @@ hr { font-size: 1em; font-family: inherit; line-height: inherit; + text-decoration: none; &, * { @@ -628,18 +632,22 @@ hr { ._link { position: relative; color: var(--link); + text-decoration: none !important; - &:after { + &::before, &::after { content: ""; position: absolute; bottom: 0; left: 0; width: 0%; - border-bottom: 2px solid var(--link); + border-bottom: 1px solid var(--link); transition: 0.3s ease-in-out; } - - &:hover:after { + &::before { + width: 100%; + opacity: .4; + } + &:hover:after, &:focus:after { width: 100%; } } From 3237a0c27c15ca01a03ad22aec5efd2bc653d770 Mon Sep 17 00:00:00 2001 From: naskya Date: Sun, 9 Jul 2023 21:19:09 +0000 Subject: [PATCH 005/162] Nya-ify capital Greek alphabets --- packages/backend/src/misc/nyaize.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/misc/nyaize.ts b/packages/backend/src/misc/nyaize.ts index 2b996c611..2ae3ceccd 100644 --- a/packages/backend/src/misc/nyaize.ts +++ b/packages/backend/src/misc/nyaize.ts @@ -20,9 +20,11 @@ export function nyaize(text: string): string { ) .replace(/(다$)|(다(?=\.))|(다(?= ))|(다(?=!))|(다(?=\?))/gm, "다냥") .replace(/(야(?=\?))|(야$)|(야(?= ))/gm, "냥") - // Chinese + // zh-CN, zh-TW .replace(/(妙|庙|描|渺|瞄|秒|苗|藐|廟)/g, "喵") - // Greek + // el-GR .replaceAll("να", "νια") + .replaceAll("ΝΑ", "ΝΙΑ") + .replaceAll("Να", "Νια") ); } From d1c9c7cc3111fbaa5e09362688809635f27116f4 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 21:27:09 +0200 Subject: [PATCH 006/162] [mastodon-client] fix poll notifications --- packages/megalodon/src/misskey/api_client.ts | 13 +++++++++---- packages/megalodon/src/misskey/notification.ts | 2 +- packages/megalodon/src/notification.ts | 3 +-- packages/megalodon/test/integration/misskey.spec.ts | 4 ++-- .../megalodon/test/unit/misskey/api_client.spec.ts | 8 ++++---- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/packages/megalodon/src/misskey/api_client.ts b/packages/megalodon/src/misskey/api_client.ts index 34e11784e..813ffe08a 100644 --- a/packages/megalodon/src/misskey/api_client.ts +++ b/packages/megalodon/src/misskey/api_client.ts @@ -396,8 +396,8 @@ namespace MisskeyAPI { return MisskeyNotificationType.Reaction case NotificationType.Reblog: return MisskeyNotificationType.Renote - case NotificationType.PollVote: - return MisskeyNotificationType.PollVote + case NotificationType.Poll: + return MisskeyNotificationType.PollEnded case NotificationType.FollowRequest: return MisskeyNotificationType.ReceiveFollowRequest default: @@ -417,8 +417,8 @@ namespace MisskeyAPI { return NotificationType.Reblog case MisskeyNotificationType.Reaction: return NotificationType.EmojiReaction - case MisskeyNotificationType.PollVote: - return NotificationType.PollVote + case MisskeyNotificationType.PollEnded: + return NotificationType.Poll case MisskeyNotificationType.ReceiveFollowRequest: return NotificationType.FollowRequest case MisskeyNotificationType.FollowRequestAccepted: @@ -458,6 +458,11 @@ namespace MisskeyAPI { notification = Object.assign(notification, { status: this.note(n.note, host) }) + if (notification.type === NotificationType.Poll) { + notification = Object.assign(notification, { + account: this.note(n.note, host).account + }) + } } if (n.reaction) { notification = Object.assign(notification, { diff --git a/packages/megalodon/src/misskey/notification.ts b/packages/megalodon/src/misskey/notification.ts index 9cf3dc58a..e44b6159c 100644 --- a/packages/megalodon/src/misskey/notification.ts +++ b/packages/megalodon/src/misskey/notification.ts @@ -7,7 +7,7 @@ namespace MisskeyNotificationType { export const Renote: MisskeyEntity.NotificationType = 'renote' export const Quote: MisskeyEntity.NotificationType = 'quote' export const Reaction: MisskeyEntity.NotificationType = 'favourite' - export const PollVote: MisskeyEntity.NotificationType = 'pollVote' + export const PollEnded: MisskeyEntity.NotificationType = 'pollEnded' export const ReceiveFollowRequest: MisskeyEntity.NotificationType = 'receiveFollowRequest' export const FollowRequestAccepted: MisskeyEntity.NotificationType = 'followRequestAccepted' export const GroupInvited: MisskeyEntity.NotificationType = 'groupInvited' diff --git a/packages/megalodon/src/notification.ts b/packages/megalodon/src/notification.ts index 9ea3898c6..8e8c13579 100644 --- a/packages/megalodon/src/notification.ts +++ b/packages/megalodon/src/notification.ts @@ -8,8 +8,7 @@ namespace NotificationType { export const EmojiReaction: Entity.NotificationType = 'emoji_reaction' export const FollowRequest: Entity.NotificationType = 'follow_request' export const Status: Entity.NotificationType = 'status' - export const PollVote: Entity.NotificationType = 'poll_vote' - export const PollExpired: Entity.NotificationType = 'poll_expired' + export const Poll: Entity.NotificationType = 'poll' } export default NotificationType diff --git a/packages/megalodon/test/integration/misskey.spec.ts b/packages/megalodon/test/integration/misskey.spec.ts index 754f6cc28..49d39a097 100644 --- a/packages/megalodon/test/integration/misskey.spec.ts +++ b/packages/megalodon/test/integration/misskey.spec.ts @@ -93,7 +93,7 @@ const pollVote: MisskeyEntity.Notification = { createdAt: '2021-02-01T01:49:29', userId: user.id, user: user, - type: MisskeyNotificationType.PollVote, + type: MisskeyNotificationType.PollEnded, note: note } @@ -168,7 +168,7 @@ describe('getNotifications', () => { }, { event: pollVote, - expected: MegalodonNotificationType.PollVote, + expected: MegalodonNotificationType.Poll, title: 'pollVote' }, { diff --git a/packages/megalodon/test/unit/misskey/api_client.spec.ts b/packages/megalodon/test/unit/misskey/api_client.spec.ts index acaac39ca..b8e1df048 100644 --- a/packages/megalodon/test/unit/misskey/api_client.spec.ts +++ b/packages/megalodon/test/unit/misskey/api_client.spec.ts @@ -42,8 +42,8 @@ describe('api_client', () => { dist: MisskeyNotificationType.Renote }, { - src: MegalodonNotificationType.PollVote, - dist: MisskeyNotificationType.PollVote + src: MegalodonNotificationType.Poll, + dist: MisskeyNotificationType.PollEnded }, { src: MegalodonNotificationType.FollowRequest, @@ -83,8 +83,8 @@ describe('api_client', () => { dist: MegalodonNotificationType.EmojiReaction }, { - src: MisskeyNotificationType.PollVote, - dist: MegalodonNotificationType.PollVote + src: MisskeyNotificationType.PollEnded, + dist: MegalodonNotificationType.Poll }, { src: MisskeyNotificationType.ReceiveFollowRequest, From 32ea8320ac0a6111016e5cbc0fd96714a476f98a Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 21:47:49 +0200 Subject: [PATCH 007/162] [mastodon-client] populate user details for notifications --- packages/megalodon/src/misskey.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index dbf3471c0..1c15acf38 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -1236,6 +1236,8 @@ export default class Misskey implements MegalodonInterface { const notification = this.converter.notification(n, host); if (n.note) notification.status = await this.noteWithDetails(n.note, host, cache); + if (notification.account) + notification.account = (await this.getAccount(notification.account.id)).data return notification; } From 76a10c0a5481d1d3ca2ca9ee93fdd9850a413d5a Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 22:59:04 +0200 Subject: [PATCH 008/162] [mastodon-client] fix posting polls --- .../server/api/mastodon/endpoints/status.ts | 19 +++++++++++++++++++ packages/megalodon/src/misskey.ts | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/mastodon/endpoints/status.ts b/packages/backend/src/server/api/mastodon/endpoints/status.ts index 76057ef0a..1bff3aa4c 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/status.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/status.ts @@ -67,6 +67,25 @@ export function apiStatusMastodon(router: Router): void { const { sensitive } = body; body.sensitive = typeof sensitive === "string" ? sensitive === "true" : sensitive; + + if (body.poll) { + if ( + body.poll.expires_in != null && + typeof body.poll.expires_in === "string" + ) + body.poll.expires_in = parseInt(body.poll.expires_in); + if ( + body.poll.multiple != null && + typeof body.poll.multiple === "string" + ) + body.poll.multiple = body.poll.multiple == "true"; + if ( + body.poll.hide_totals != null && + typeof body.poll.hide_totals === "string" + ) + body.poll.hide_totals = body.poll.hide_totals == "true"; + } + const data = await client.postStatus(text, body); ctx.body = convertStatus(data.data); } catch (e: any) { diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index 1c15acf38..7ff802dc8 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -1169,7 +1169,7 @@ export default class Misskey implements MegalodonInterface { let pollParam = { choices: options.poll.options, expiresAt: null, - expiredAfter: options.poll.expires_in + expiredAfter: options.poll.expires_in * 1000 } if (options.poll.multiple !== undefined) { pollParam = Object.assign(pollParam, { From 28992db8e463a472ee2e489257376de527586f48 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 23:35:07 +0200 Subject: [PATCH 009/162] [server/api/notes/show] return correct status code --- packages/backend/src/server/api/endpoints/notes/show.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend/src/server/api/endpoints/notes/show.ts b/packages/backend/src/server/api/endpoints/notes/show.ts index 39d128134..8c5f91c5c 100644 --- a/packages/backend/src/server/api/endpoints/notes/show.ts +++ b/packages/backend/src/server/api/endpoints/notes/show.ts @@ -21,6 +21,7 @@ export const meta = { message: "No such note.", code: "NO_SUCH_NOTE", id: "24fcbfc6-2e37-42b6-8388-c29b3861a08d", + httpStatusCode: 404, }, }, } as const; From ec06d62d61dcfe2a17f033e50d8daa6078e98c15 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 23:39:48 +0200 Subject: [PATCH 010/162] [mastodon-client] return 404 instead of 401 on NO_SUCH_NOTE --- packages/backend/src/server/api/mastodon/endpoints/status.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/mastodon/endpoints/status.ts b/packages/backend/src/server/api/mastodon/endpoints/status.ts index 1bff3aa4c..caa9d1d68 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/status.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/status.ts @@ -105,7 +105,7 @@ export function apiStatusMastodon(router: Router): void { ctx.body = convertStatus(data.data); } catch (e: any) { console.error(e); - ctx.status = 401; + ctx.status = ctx.status == 404 ? 404 : 401; ctx.body = e.response.data; } }); From c1e43407d5a23e324c1671c413fb300f59bafeb4 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 23:53:15 +0200 Subject: [PATCH 011/162] [mastodon-client] enforce limits for favorites and bookmarks --- packages/megalodon/src/misskey.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index 7ff802dc8..fd765b3dc 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -408,7 +408,7 @@ export default class Misskey implements MegalodonInterface { if (options) { if (options.limit) { params = Object.assign(params, { - limit: options.limit + limit: options.limit <= 100 ? options.limit : 100 }) } if (options.max_id) { @@ -738,7 +738,7 @@ export default class Misskey implements MegalodonInterface { if (options) { if (options.limit) { params = Object.assign(params, { - limit: options.limit + limit: options.limit <= 100 ? options.limit : 100 }) } else { From 02ddbe2363661cd12ab485559a4c5e6432d23683 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Mon, 10 Jul 2023 00:05:52 +0200 Subject: [PATCH 012/162] [mastodon-client] return actual status bookmark state --- packages/megalodon/src/misskey.ts | 8 ++++++++ packages/megalodon/src/misskey/api_client.ts | 3 ++- packages/megalodon/src/misskey/entities/state.ts | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 packages/megalodon/src/misskey/entities/state.ts diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index fd765b3dc..026b8e9b7 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -1243,9 +1243,17 @@ export default class Misskey implements MegalodonInterface { public async noteWithDetails(n: MisskeyAPI.Entity.Note, host: string, cache: AccountCache): Promise { const status = await this.addUserDetailsToStatus(this.converter.note(n, host), cache); + status.bookmarked = await this.isStatusBookmarked(n.id); return this.addMentionsToStatus(status, cache); } + public async isStatusBookmarked(id: string) : Promise { + return this.client + .post('/api/notes/state', { + noteId: id + }).then(p => p.data.isFavorited ?? false); + } + public async addUserDetailsToStatus(status: Entity.Status, cache: AccountCache) : Promise { if (status.account.followers_count === 0 && status.account.followers_count === 0 && status.account.statuses_count === 0) status.account = await this.getAccountCached(status.account.id, status.account.acct, cache) ?? status.account; diff --git a/packages/megalodon/src/misskey/api_client.ts b/packages/megalodon/src/misskey/api_client.ts index 813ffe08a..f80d5a442 100644 --- a/packages/megalodon/src/misskey/api_client.ts +++ b/packages/megalodon/src/misskey/api_client.ts @@ -40,7 +40,8 @@ namespace MisskeyAPI { export type GetAll = MisskeyEntity.GetAll export type UserKey = MisskeyEntity.UserKey export type Session = MisskeyEntity.Session - export type Stats = MisskeyEntity.Stats + export type Stats = MisskeyEntity.Stats + export type State = MisskeyEntity.State export type APIEmoji = { emojis: Emoji[] } } diff --git a/packages/megalodon/src/misskey/entities/state.ts b/packages/megalodon/src/misskey/entities/state.ts new file mode 100644 index 000000000..4538fb461 --- /dev/null +++ b/packages/megalodon/src/misskey/entities/state.ts @@ -0,0 +1,7 @@ +namespace MisskeyEntity { + export type State = { + isFavorited: boolean + isMutedThread: boolean + isWatching: boolean + } +} From bc79ca77679aef80cf128c0cd8cfbb38e171c507 Mon Sep 17 00:00:00 2001 From: jolupa Date: Sat, 8 Jul 2023 22:48:22 +0000 Subject: [PATCH 013/162] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1819 of 1819 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 6cda10f96..1f291ac22 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -2144,3 +2144,6 @@ _skinTones: swipeOnMobile: Permet lliscar entre pàgines enableIdenticonGeneration: Habilitar la generació d'Identicon enableServerMachineStats: Habilitar les estadístiques del maquinari del servidor +showPopup: Notificar els usuaris amb una finestra emergent +showWithSparkles: Mostra amb espurnes +youHaveUnreadAnnouncements: Tens anuncis sense llegir From 4795a501626414c898e8b9792431d96daff4c74a Mon Sep 17 00:00:00 2001 From: freeplay Date: Sun, 9 Jul 2023 21:59:57 -0400 Subject: [PATCH 014/162] Isolate text directions in posts --- packages/client/src/components/MkSubNoteContent.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index 586c3678c..34ee945ad 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -35,7 +35,7 @@ />

-
-
+ Date: Sun, 9 Jul 2023 19:54:33 -0700 Subject: [PATCH 015/162] build: :zap: parallel build (pnpm 8.6.7) --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ec899739f..defe75bb3 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,11 @@ "type": "git", "url": "https://codeberg.org/calckey/calckey.git" }, - "packageManager": "pnpm@8.6.6", + "packageManager": "pnpm@8.6.7", "private": true, "scripts": { - "rebuild": "pnpm run clean && pnpm node ./scripts/build-greet.js && pnpm -r run build && pnpm run gulp", - "build": "pnpm node ./scripts/build-greet.js && pnpm -r run build && pnpm run gulp", + "rebuild": "pnpm run clean && pnpm node ./scripts/build-greet.js && pnpm -r --parallel run build && pnpm run gulp", + "build": "pnpm node ./scripts/build-greet.js && pnpm -r --parallel run build && pnpm run gulp", "start": "pnpm --filter backend run start", "start:test": "pnpm --filter backend run start:test", "init": "pnpm run migrate", @@ -21,13 +21,13 @@ "watch": "pnpm run dev", "dev": "pnpm node ./scripts/dev.js", "dev:staging": "NODE_OPTIONS=--max_old_space_size=3072 NODE_ENV=development pnpm run build && pnpm run start", - "lint": "pnpm -r run lint", + "lint": "pnpm -r --parallel run lint", "cy:open": "cypress open --browser --e2e --config-file=cypress.config.ts", "cy:run": "cypress run", "e2e": "start-server-and-test start:test http://localhost:61812 cy:run", "mocha": "pnpm --filter backend run mocha", "test": "pnpm run mocha", - "format": "pnpm -r run format", + "format": "pnpm -r --parallel run format", "clean": "pnpm node ./scripts/clean.js", "clean-all": "pnpm node ./scripts/clean-all.js", "cleanall": "pnpm run clean-all" From 5f3c676b5a9e3a209c27ef0f3a78326b90aa5316 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Mon, 10 Jul 2023 02:59:16 +0000 Subject: [PATCH 016/162] revert 4795a501626414c898e8b9792431d96daff4c74a revert Isolate text directions in posts --- packages/client/src/components/MkSubNoteContent.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index 34ee945ad..586c3678c 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -35,7 +35,7 @@ />

- - +
Date: Sun, 9 Jul 2023 20:00:55 -0700 Subject: [PATCH 017/162] Revert "Isolate text directions in posts" This reverts commit 4795a501626414c898e8b9792431d96daff4c74a. --- packages/client/src/components/MkSubNoteContent.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index 34ee945ad..586c3678c 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -35,7 +35,7 @@ />

- - +
Date: Sun, 9 Jul 2023 20:01:01 -0700 Subject: [PATCH 018/162] Revert "style: link underlines" This reverts commit 46d97d49a2298c1b8c1537ef1ed3eff376b49285. --- packages/client/src/components/MkUrlPreview.vue | 3 +-- packages/client/src/components/global/MkUrl.vue | 2 -- packages/client/src/components/mfm.ts | 1 - packages/client/src/style.scss | 16 ++++------------ 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 8fa8092b8..6452e135d 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -196,7 +196,6 @@ onUnmounted(() => { > a { display: flex; transition: background 0.2s; - text-decoration: none; > div:first-child:not(:last-child) { position: relative; width: 90px; @@ -278,7 +277,7 @@ onUnmounted(() => { &:focus, &:focus-within { background: var(--panelHighlight); - h3 { + h1 { text-decoration: underline; } } diff --git a/packages/client/src/components/global/MkUrl.vue b/packages/client/src/components/global/MkUrl.vue index 3453bf5ed..98ba8d94e 100644 --- a/packages/client/src/components/global/MkUrl.vue +++ b/packages/client/src/components/global/MkUrl.vue @@ -80,8 +80,6 @@ const target = self ? null : "_blank"; display: inline-block; overflow: clip; text-overflow: ellipsis; - text-decoration: none !important; - line-height: 1.05; > .icon { padding-left: 2px; diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 63465f38b..cb0942a33 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -409,7 +409,6 @@ export default defineComponent({ key: Math.random(), to: `/tags/${encodeURIComponent(token.props.hashtag)}`, style: "color:var(--hashtag);", - class: "_link", }, `#${token.props.hashtag}`, ), diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index be12f8b15..a6ef73015 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -145,9 +145,6 @@ a { cursor: pointer; color: inherit; -webkit-tap-highlight-color: transparent; - &:hover { - text-decoration: underline; - } } // i { @@ -232,7 +229,6 @@ hr { font-size: 1em; font-family: inherit; line-height: inherit; - text-decoration: none; &, * { @@ -632,22 +628,18 @@ hr { ._link { position: relative; color: var(--link); - text-decoration: none !important; - &::before, &::after { + &:after { content: ""; position: absolute; bottom: 0; left: 0; width: 0%; - border-bottom: 1px solid var(--link); + border-bottom: 2px solid var(--link); transition: 0.3s ease-in-out; } - &::before { - width: 100%; - opacity: .4; - } - &:hover:after, &:focus:after { + + &:hover:after { width: 100%; } } From 6e6c3c5845a2720d4220c0e075fd89a8dc47c59e Mon Sep 17 00:00:00 2001 From: naskya Date: Mon, 10 Jul 2023 03:05:27 +0000 Subject: [PATCH 019/162] revert Chinese cat mode for now https://codeberg.org/calckey/calckey/issues/9746#issuecomment-978014 --- packages/backend/src/misc/nyaize.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/backend/src/misc/nyaize.ts b/packages/backend/src/misc/nyaize.ts index 2ae3ceccd..13a112ce5 100644 --- a/packages/backend/src/misc/nyaize.ts +++ b/packages/backend/src/misc/nyaize.ts @@ -20,8 +20,6 @@ export function nyaize(text: string): string { ) .replace(/(다$)|(다(?=\.))|(다(?= ))|(다(?=!))|(다(?=\?))/gm, "다냥") .replace(/(야(?=\?))|(야$)|(야(?= ))/gm, "냥") - // zh-CN, zh-TW - .replace(/(妙|庙|描|渺|瞄|秒|苗|藐|廟)/g, "喵") // el-GR .replaceAll("να", "νια") .replaceAll("ΝΑ", "ΝΙΑ") From dfd9bd5dd106f27fc6dde09d80d40c07116ae517 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sun, 9 Jul 2023 20:12:13 -0700 Subject: [PATCH 020/162] Revert "[mastodon-client] send proper user preferences" This reverts commit 3fe156f79578d8506cfbb70f3f6f806f50a818b9. --- packages/megalodon/src/misskey.ts | 24 +++++++++++++++----- packages/megalodon/src/misskey/api_client.ts | 4 ++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index 026b8e9b7..b4a9c6adb 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -1079,11 +1079,23 @@ export default class Misskey implements MegalodonInterface { // accounts/preferences // ====================================== public async getPreferences(): Promise> { - return this.client.post('/api/i').then(async res => { - return Object.assign(res, { - data: this.converter.userPreferences(res.data, await this.getDefaultPostPrivacy()) - }) - }) + return this.client.post('/api/i').then(res => { + /* + return this.client.post('/api/i/registry/get-all', { + scope: ['client', 'base'], + }).then(ga => { + return Object.assign(res, { + data: this.converter.userPreferences(res.data, ga.data) + }) + }) + */ + + // TODO: + // FIXME: get this from api + return Object.assign(res, { + data: this.converter.userPreferences(res.data, {defaultNoteVisibility: "followers", tutorial: -1}) + }) + }) } // ====================================== @@ -1527,7 +1539,7 @@ export default class Misskey implements MegalodonInterface { .then(res => res.data[0] ?? '⭐'); } - private async getDefaultPostPrivacy(): Promise<'public' | 'unlisted' | 'private' | 'direct'> { + private async getDefaultPostPrivacy(): Promise { // NOTE: get-unsecure is calckey's extension. // Misskey doesn't have this endpoint and regular `/i/registry/get` won't work // unless you have a 'nativeToken', which is reserved for the frontend webapp. diff --git a/packages/megalodon/src/misskey/api_client.ts b/packages/megalodon/src/misskey/api_client.ts index f80d5a442..aabb1f3ee 100644 --- a/packages/megalodon/src/misskey/api_client.ts +++ b/packages/megalodon/src/misskey/api_client.ts @@ -175,13 +175,13 @@ namespace MisskeyAPI { } } - userPreferences = (u: MisskeyAPI.Entity.UserDetailMe, v: 'public' | 'unlisted' | 'private' | 'direct'): MegalodonEntity.Preferences => { + userPreferences = (u: MisskeyAPI.Entity.UserDetailMe, g: MisskeyAPI.Entity.GetAll): MegalodonEntity.Preferences => { return { "reading:expand:media": "default", "reading:expand:spoilers": false, "posting:default:language": u.lang, "posting:default:sensitive": u.alwaysMarkNsfw, - "posting:default:visibility": v + "posting:default:visibility": this.visibility(g.defaultNoteVisibility) } } From a441cc6067c487c563bf673be261a179d96e0533 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sun, 9 Jul 2023 20:12:16 -0700 Subject: [PATCH 021/162] Revert "[mastodon-client] send actual default post privacy instead of fallback value" This reverts commit 81145570fcb458a9239f88fe9a273d6c2f1810d3. --- .../api/endpoints/i/registry/get-unsecure.ts | 2 +- .../server/api/mastodon/endpoints/account.ts | 2 +- packages/megalodon/src/misskey.ts | 17 ----------------- 3 files changed, 2 insertions(+), 19 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-unsecure.ts b/packages/backend/src/server/api/endpoints/i/registry/get-unsecure.ts index a9bcf6935..f98c6c929 100644 --- a/packages/backend/src/server/api/endpoints/i/registry/get-unsecure.ts +++ b/packages/backend/src/server/api/endpoints/i/registry/get-unsecure.ts @@ -33,7 +33,7 @@ export const paramDef = { } as const; export default define(meta, paramDef, async (ps, user) => { - if (ps.key !== "reactions" && ps.key !== "defaultNoteVisibility") return; + if (ps.key !== "reactions") return; const query = RegistryItems.createQueryBuilder("item") .where("item.domain IS NULL") .andWhere("item.userId = :userId", { userId: user.id }) diff --git a/packages/backend/src/server/api/mastodon/endpoints/account.ts b/packages/backend/src/server/api/mastodon/endpoints/account.ts index 5d0abdedd..3fb1c9cbe 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/account.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/account.ts @@ -48,7 +48,7 @@ export function apiAccountMastodon(router: Router): void { acct.source = { note: acct.note, fields: acct.fields, - privacy: await client.getDefaultPostPrivacy(), + privacy: "public", sensitive: false, language: "", }; diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index b4a9c6adb..de62b9850 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -1539,23 +1539,6 @@ export default class Misskey implements MegalodonInterface { .then(res => res.data[0] ?? '⭐'); } - private async getDefaultPostPrivacy(): Promise { - // NOTE: get-unsecure is calckey's extension. - // Misskey doesn't have this endpoint and regular `/i/registry/get` won't work - // unless you have a 'nativeToken', which is reserved for the frontend webapp. - - return this.client - .post('/api/i/registry/get-unsecure', { - key: 'defaultNoteVisibility', - scope: ['client', 'base'], - }) - .then(res => { - if (!res.data || (res.data != 'public' && res.data != 'home' && res.data != 'followers' && res.data != 'specified')) - return 'public'; - return this.converter.visibility(res.data); - }); - } - public async unfavouriteStatus(id: string): Promise> { // NOTE: Misskey allows only one reaction per status, so we don't need to care what that emoji was. return this.deleteEmojiReaction(id, ''); From a5f84ec30b8ebe3eae6dad19441efc475d539b0b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sun, 9 Jul 2023 20:46:53 -0700 Subject: [PATCH 022/162] feat: :sparkles: Timestamps on announcements Closes #10453 --- packages/client/src/components/MkAnnouncement.vue | 11 +++++++++++ packages/client/src/pages/announcements.vue | 13 +++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkAnnouncement.vue b/packages/client/src/components/MkAnnouncement.vue index 24bf886dd..bd1091b7f 100644 --- a/packages/client/src/components/MkAnnouncement.vue +++ b/packages/client/src/components/MkAnnouncement.vue @@ -5,6 +5,13 @@ {{ title }}

{{ title }}

+
+ +
+ {{ i18n.ts.updatedAt }}: + +
+
{ } } +.time { + font-size: 0.8rem; +} + .gotIt { margin: 8px 0 0 0; } diff --git a/packages/client/src/pages/announcements.vue b/packages/client/src/pages/announcements.vue index 8e9975020..cc62ce0f5 100644 --- a/packages/client/src/pages/announcements.vue +++ b/packages/client/src/pages/announcements.vue @@ -15,8 +15,13 @@ class="_card announcement" >
- 🆕 {{ announcement.title }} + 🆕 +

{{ announcement.title }}

+ +
+ {{ i18n.ts.updatedAt }}: + +
@@ -76,6 +81,10 @@ definePageMetadata({ margin-bottom: var(--margin); } + > ._title { + padding: 14px 32px !important; + } + > ._content { > img { display: block; From 645480f889e38ab93fdce689dc14b091c5097f81 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sun, 9 Jul 2023 20:46:58 -0700 Subject: [PATCH 023/162] chore: :art: format --- packages/client/src/components/MkMedia.vue | 10 +++++++--- packages/client/src/pages/user/home.vue | 13 +++++++------ packages/client/src/ui/_common_/navbar.vue | 11 +++++++---- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/client/src/components/MkMedia.vue b/packages/client/src/components/MkMedia.vue index d697054b6..4c023f131 100644 --- a/packages/client/src/components/MkMedia.vue +++ b/packages/client/src/components/MkMedia.vue @@ -226,11 +226,13 @@ watch( display: flex; min-width: max-content; width: 110px; - transition: width 0.2s cubic-bezier(0,0,0,1); + transition: width 0.2s cubic-bezier(0, 0, 0, 1); [data-plyr="volume"] { width: 0; flex-grow: 1; - transition: margin 0.3s, opacity .2s 0.2s; + transition: + margin 0.3s, + opacity 0.2s 0.2s; } &:not(:hover):not(:focus-within) { width: 0px; @@ -238,7 +240,9 @@ watch( [data-plyr="volume"] { margin-inline: 0px; opacity: 0; - transition: margin 0.3s, opacity 0.1s; + transition: + margin 0.3s, + opacity 0.1s; } } } diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index 5a8482fb8..e87052ea2 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -26,12 +26,13 @@ class="banner" :style="{ backgroundImage: `url('${user.bannerUrl}')`, - '--backgroundImageStatic': defaultStore - .state.useBlurEffect && user.bannerUrl - ? `url('${getStaticImageUrl( - user.bannerUrl, - )}')` - : null, + '--backgroundImageStatic': + defaultStore.state.useBlurEffect && + user.bannerUrl + ? `url('${getStaticImageUrl( + user.bannerUrl, + )}')` + : null, }" >
diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue index e98aa738c..ef9f473f3 100644 --- a/packages/client/src/ui/_common_/navbar.vue +++ b/packages/client/src/ui/_common_/navbar.vue @@ -285,7 +285,8 @@ function more(ev: MouseEvent) { box-sizing: border-box; color: var(--navFg); - &:before, &.post::after { + &:before, + &.post::after { content: ""; display: block; width: calc(100% - 34px); @@ -342,7 +343,9 @@ function more(ev: MouseEvent) { &.active { color: var(--accent); opacity: 1; - transition: color 0.4s, opacity 0.4s; + transition: + color 0.4s, + opacity 0.4s; &::before { opacity: 1; } @@ -536,7 +539,6 @@ function more(ev: MouseEvent) { width: calc(100% - 32px); border-top: solid 0.5px var(--divider); } - } } .nav-item { @@ -571,7 +573,8 @@ function more(ev: MouseEvent) { width: 100%; height: 52px; margin-bottom: 16px; - &:before, &::after { + &:before, + &::after { inset: 0; margin: auto; width: 52px; From ce239565a7b5d9c4dd64346a35b0cba32a2607ff Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sun, 9 Jul 2023 21:08:24 -0700 Subject: [PATCH 024/162] Revert "fix: nav post button gradient transition (#10401) + half refactor ?" This reverts commit 6031e11721d02c26afae99b800a483b5aa514e1a. --- packages/client/src/ui/_common_/navbar.vue | 410 ++++++++++++--------- 1 file changed, 229 insertions(+), 181 deletions(-) diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue index ef9f473f3..7905c331c 100644 --- a/packages/client/src/ui/_common_/navbar.vue +++ b/packages/client/src/ui/_common_/navbar.vue @@ -26,7 +26,7 @@ @@ -78,7 +75,7 @@ v-if="$i.isAdmin || $i.isModerator" v-click-anime v-tooltip.noDelay.right="i18n.ts.controlPanel" - class="nav-item _button" + class="item _button" active-class="active" to="/admin" > @@ -91,7 +88,6 @@ updateAvailable " class="indicator" - :class="{ animateIndicator: $store.state.animation }" >{{ i18n.ts.controlPanel }} @@ -99,24 +95,21 @@ @@ -127,7 +120,7 @@
- From b46d43797169c02334970d1efd32c1b075a759df Mon Sep 17 00:00:00 2001 From: PrivateGER Date: Mon, 10 Jul 2023 23:44:31 +0200 Subject: [PATCH 033/162] Fix Postgres error loop when indexing notes --- .../processors/background/index-all-notes.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/backend/src/queue/processors/background/index-all-notes.ts b/packages/backend/src/queue/processors/background/index-all-notes.ts index 1dce4406a..fc453eb26 100644 --- a/packages/backend/src/queue/processors/background/index-all-notes.ts +++ b/packages/backend/src/queue/processors/background/index-all-notes.ts @@ -1,4 +1,5 @@ import type Bull from "bull"; +import type { DoneCallback } from "bull"; import { queueLogger } from "../../logger.js"; import { Notes } from "@/models/index.js"; @@ -11,7 +12,7 @@ const logger = queueLogger.createSubLogger("index-all-notes"); export default async function indexAllNotes( job: Bull.Job>, - done: () => void, + done: DoneCallback, ): Promise { logger.info("Indexing all notes..."); @@ -20,7 +21,7 @@ export default async function indexAllNotes( let total: number = (job.data.total as number) ?? 0; let running = true; - const take = 100000; + const take = 10000; const batch = 100; while (running) { logger.info( @@ -41,13 +42,14 @@ export default async function indexAllNotes( }, relations: ["user"], }); - } catch (e) { + } catch (e: any) { logger.error(`Failed to query notes ${e}`); - continue; + done(e); + break; } if (notes.length === 0) { - job.progress(100); + await job.progress(100); running = false; break; } @@ -55,7 +57,7 @@ export default async function indexAllNotes( try { const count = await Notes.count(); total = count; - job.update({ indexedCount, cursor, total }); + await job.update({indexedCount, cursor, total}); } catch (e) {} for (let i = 0; i < notes.length; i += batch) { @@ -69,12 +71,12 @@ export default async function indexAllNotes( indexedCount += chunk.length; const pct = (indexedCount / total) * 100; - job.update({ indexedCount, cursor, total }); - job.progress(+pct.toFixed(1)); + await job.update({ indexedCount, cursor, total }); + await job.progress(+pct.toFixed(1)); logger.info(`Indexed notes ${indexedCount}/${total ? total : "?"}`); } cursor = notes[notes.length - 1].id; - job.update({ indexedCount, cursor, total }); + await job.update({ indexedCount, cursor, total }); if (notes.length < take) { running = false; From a37daacc56d7e711fb6ce715e0a62548664740fb Mon Sep 17 00:00:00 2001 From: freeplay Date: Mon, 10 Jul 2023 19:02:31 -0400 Subject: [PATCH 034/162] style: don't truncate URL's --- .../client/src/components/MkUrlPreview.vue | 2 +- .../client/src/components/global/MkUrl.vue | 14 ++++--- packages/client/src/style.scss | 37 ++++++++++--------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 73938cf86..29d045ebf 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -255,7 +255,7 @@ onUnmounted(() => { margin-bottom: 0.2em; text-decoration: underline; text-decoration-color: transparent; - transition: text-decoration-color .2s; + transition: text-decoration-color 0.2s; } p { margin-bottom: -0.5em; diff --git a/packages/client/src/components/global/MkUrl.vue b/packages/client/src/components/global/MkUrl.vue index 3453bf5ed..6e50c851e 100644 --- a/packages/client/src/components/global/MkUrl.vue +++ b/packages/client/src/components/global/MkUrl.vue @@ -75,13 +75,11 @@ const target = self ? null : "_blank"; diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 7f3713881..a53f47f14 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -147,7 +147,7 @@ a { -webkit-tap-highlight-color: transparent; text-decoration: underline; text-decoration-color: transparent; - transition: text-decoration-color .2s; + transition: text-decoration-color 0.2s; &:hover { text-decoration-color: currentColor; } @@ -635,24 +635,25 @@ hr { ._link { position: relative; color: var(--link); - text-decoration: none !important; - &::before, &::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 0%; - border-bottom: 1px solid currentColor; - transition: 0.3s ease-in-out; - } - &::before { - width: 100%; - opacity: .4; - } - &:hover:after, &:focus:after { - width: 100%; - } + // &::before, + // &::after { + // content: ""; + // position: absolute; + // bottom: 0; + // left: 0; + // width: 0%; + // border-bottom: 1px solid currentColor; + // transition: 0.3s ease-in-out; + // } + // &::before { + // width: 100%; + // opacity: 0.4; + // } + // &:hover:after, + // &:focus:after { + // width: 100%; + // } } ._caption { From 6c85183da7988a410853c4b688cef3f1f93d9c98 Mon Sep 17 00:00:00 2001 From: freeplay Date: Mon, 10 Jul 2023 19:38:32 -0400 Subject: [PATCH 035/162] style: underline-offset tweak --- packages/client/src/style.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index a53f47f14..9df882ec7 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -635,6 +635,7 @@ hr { ._link { position: relative; color: var(--link); + text-underline-offset: 0.2em; // &::before, // &::after { From 8d9154c8c03fedf7e5a3a02db95f6f381da59c5a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Mon, 10 Jul 2023 21:09:07 -0700 Subject: [PATCH 036/162] perf: :zap: use fast-blurhash for blurhash decoding, up deps --- package.json | 12 +- .../processors/background/index-all-notes.ts | 2 +- packages/client/package.json | 35 +- .../src/components/MkImgWithBlurhash.vue | 6 +- .../extract-avg-color-from-blurhash.ts | 21 +- packages/client/src/ui/_common_/navbar.vue | 4 +- pnpm-lock.yaml | 751 +++++++++++------- 7 files changed, 484 insertions(+), 347 deletions(-) diff --git a/package.json b/package.json index defe75bb3..592788316 100644 --- a/package.json +++ b/package.json @@ -36,17 +36,17 @@ "chokidar": "^3.3.1" }, "dependencies": { - "@bull-board/api": "5.2.0", - "@bull-board/ui": "5.2.0", + "@bull-board/api": "5.6.0", + "@bull-board/ui": "5.6.0", "@napi-rs/cli": "^2.16.1", "@tensorflow/tfjs": "^3.21.0", "js-yaml": "4.1.0", "seedrandom": "^3.0.5" }, "devDependencies": { - "@types/node": "18.11.18", - "@types/gulp": "4.0.10", - "@types/gulp-rename": "2.0.1", + "@types/gulp": "4.0.13", + "@types/gulp-rename": "2.0.2", + "@types/node": "20.4.1", "chalk": "4.1.2", "cross-env": "7.0.3", "cypress": "10.11.0", @@ -59,6 +59,6 @@ "install-peers": "^1.0.4", "rome": "^12.1.3", "start-server-and-test": "1.15.2", - "typescript": "4.9.4" + "typescript": "5.1.6" } } diff --git a/packages/backend/src/queue/processors/background/index-all-notes.ts b/packages/backend/src/queue/processors/background/index-all-notes.ts index fc453eb26..c0275b420 100644 --- a/packages/backend/src/queue/processors/background/index-all-notes.ts +++ b/packages/backend/src/queue/processors/background/index-all-notes.ts @@ -57,7 +57,7 @@ export default async function indexAllNotes( try { const count = await Notes.count(); total = count; - await job.update({indexedCount, cursor, total}); + await job.update({ indexedCount, cursor, total }); } catch (e) {} for (let i = 0; i < notes.length; i += batch) { diff --git a/packages/client/package.json b/packages/client/package.json index e34773ffe..81c252d66 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -16,7 +16,7 @@ "@syuilo/aiscript": "0.11.1", "@types/escape-regexp": "0.0.1", "@types/glob": "8.1.0", - "@types/gulp": "4.0.11", + "@types/gulp": "4.0.13", "@types/gulp-rename": "2.0.2", "@types/katex": "0.16.0", "@types/matter-js": "0.18.2", @@ -29,8 +29,8 @@ "@vue/compiler-sfc": "3.3.4", "autobind-decorator": "2.4.0", "autosize": "5.0.2", - "blurhash": "1.1.5", - "broadcast-channel": "4.19.1", + "blurhash": "2.0.5", + "broadcast-channel": "5.1.0", "browser-image-resizer": "github:misskey-dev/browser-image-resizer", "calckey-js": "workspace:*", "chart.js": "4.3.0", @@ -39,51 +39,52 @@ "chartjs-plugin-gradient": "0.6.1", "chartjs-plugin-zoom": "2.0.1", "city-timezones": "^1.2.1", - "compare-versions": "5.0.3", + "compare-versions": "6.0.0", "cropperjs": "2.0.0-beta.2", "cross-env": "7.0.3", "cypress": "10.11.0", "date-fns": "2.30.0", "emojilib": "github:thatonecalculator/emojilib", "escape-regexp": "0.0.1", - "eventemitter3": "4.0.7", - "focus-trap": "^7.4.3", + "eventemitter3": "5.0.1", + "fast-blurhash": "^1.1.2", + "focus-trap": "^7.5.2", "focus-trap-vue": "^4.0.2", - "gsap": "^3.11.5", + "gsap": "^3.12.2", "idb-keyval": "6.2.1", "insert-text-at-cursor": "0.3.0", "json5": "2.2.3", - "katex": "0.16.7", + "katex": "0.16.8", "matter-js": "0.18.0", "mfm-js": "0.23.3", - "photoswipe": "5.3.7", + "photoswipe": "5.3.8", "prettier": "3.0.0", "prettier-plugin-vue": "1.1.6", "prismjs": "1.29.0", - "punycode": "2.1.1", + "punycode": "2.3.0", "querystring": "0.2.1", "rndstr": "1.0.0", - "rollup": "3.23.1", + "rollup": "3.26.2", "s-age": "1.1.2", - "sass": "1.62.1", + "sass": "1.63.6", "seedrandom": "3.0.5", "start-server-and-test": "1.15.2", "strict-event-emitter-types": "2.0.0", "stringz": "2.1.0", - "swiper": "9.3.2", + "swiper": "10.0.4", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "three": "0.146.0", "throttle-debounce": "5.0.0", - "tinycolor2": "1.5.2", - "tsc-alias": "1.8.6", + "tinycolor2": "1.6.0", + "tsc-alias": "1.8.7", "tsconfig-paths": "4.2.0", "twemoji-parser": "14.0.0", - "typescript": "5.1.3", + "typescript": "5.1.6", "unicode-emoji-json": "^0.4.0", "uuid": "9.0.0", "vanilla-tilt": "1.8.0", - "vite": "4.3.9", + "vite": "4.4.2", "vite-plugin-compression": "^0.5.1", "vue": "3.3.4", "vue-isyourpasswordsafe": "^2.0.0", diff --git a/packages/client/src/components/MkImgWithBlurhash.vue b/packages/client/src/components/MkImgWithBlurhash.vue index 03e6ea503..5a0cefec2 100644 --- a/packages/client/src/components/MkImgWithBlurhash.vue +++ b/packages/client/src/components/MkImgWithBlurhash.vue @@ -21,7 +21,7 @@ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b18c93854..8285d327c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,11 +12,11 @@ importers: .: dependencies: '@bull-board/api': - specifier: 5.2.0 - version: 5.2.0(@bull-board/ui@5.2.0) + specifier: 5.6.0 + version: 5.6.0(@bull-board/ui@5.6.0) '@bull-board/ui': - specifier: 5.2.0 - version: 5.2.0 + specifier: 5.6.0 + version: 5.6.0 '@napi-rs/cli': specifier: ^2.16.1 version: 2.16.1 @@ -31,14 +31,14 @@ importers: version: 3.0.5 devDependencies: '@types/gulp': - specifier: 4.0.10 - version: 4.0.10 + specifier: 4.0.13 + version: 4.0.13 '@types/gulp-rename': - specifier: 2.0.1 - version: 2.0.1 + specifier: 2.0.2 + version: 2.0.2 '@types/node': - specifier: 18.11.18 - version: 18.11.18 + specifier: 20.4.1 + version: 20.4.1 chalk: specifier: 4.1.2 version: 4.1.2 @@ -76,8 +76,8 @@ importers: specifier: 1.15.2 version: 1.15.2 typescript: - specifier: 4.9.4 - version: 4.9.4 + specifier: 5.1.6 + version: 5.1.6 packages/backend: dependencies: @@ -666,7 +666,7 @@ importers: version: 9.0.8 ts-jest: specifier: ^27.1.2 - version: 27.1.2(@babel/core@7.22.5)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3) + version: 27.1.2(@babel/core@7.22.8)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3) ts-node: specifier: 10.4.0 version: 10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3) @@ -687,10 +687,10 @@ importers: version: 2.0.3 '@rollup/plugin-alias': specifier: 3.1.9 - version: 3.1.9(rollup@3.23.1) + version: 3.1.9(rollup@3.26.2) '@rollup/plugin-json': specifier: 4.1.0 - version: 4.1.0(rollup@3.23.1) + version: 4.1.0(rollup@3.26.2) '@rollup/pluginutils': specifier: ^4.2.1 version: 4.2.1 @@ -704,8 +704,8 @@ importers: specifier: 8.1.0 version: 8.1.0 '@types/gulp': - specifier: 4.0.11 - version: 4.0.11 + specifier: 4.0.13 + version: 4.0.13 '@types/gulp-rename': specifier: 2.0.2 version: 2.0.2 @@ -732,7 +732,7 @@ importers: version: 8.3.4 '@vitejs/plugin-vue': specifier: 4.2.3 - version: 4.2.3(vite@4.3.9)(vue@3.3.4) + version: 4.2.3(vite@4.4.2)(vue@3.3.4) '@vue/compiler-sfc': specifier: 3.3.4 version: 3.3.4 @@ -743,11 +743,11 @@ importers: specifier: 5.0.2 version: 5.0.2 blurhash: - specifier: 1.1.5 - version: 1.1.5 + specifier: 2.0.5 + version: 2.0.5 broadcast-channel: - specifier: 4.19.1 - version: 4.19.1 + specifier: 5.1.0 + version: 5.1.0 browser-image-resizer: specifier: github:misskey-dev/browser-image-resizer version: github.com/misskey-dev/browser-image-resizer/56f504427ad7f6500e141a6d9f3aee42023d7f3e @@ -773,8 +773,8 @@ importers: specifier: ^1.2.1 version: 1.2.1 compare-versions: - specifier: 5.0.3 - version: 5.0.3 + specifier: 6.0.0 + version: 6.0.0 cropperjs: specifier: 2.0.0-beta.2 version: 2.0.0-beta.2 @@ -789,22 +789,25 @@ importers: version: 2.30.0 emojilib: specifier: github:thatonecalculator/emojilib - version: github.com/thatonecalculator/emojilib/9d16541664dc8fef3201ae9b647477070676a52e + version: github.com/thatonecalculator/emojilib/15fd9504f943763a057ff803ee2009ec0524c96b escape-regexp: specifier: 0.0.1 version: 0.0.1 eventemitter3: - specifier: 4.0.7 - version: 4.0.7 + specifier: 5.0.1 + version: 5.0.1 + fast-blurhash: + specifier: ^1.1.2 + version: 1.1.2 focus-trap: - specifier: ^7.4.3 - version: 7.4.3 + specifier: ^7.5.2 + version: 7.5.2 focus-trap-vue: specifier: ^4.0.2 - version: 4.0.2(focus-trap@7.4.3)(vue@3.3.4) + version: 4.0.2(focus-trap@7.5.2)(vue@3.3.4) gsap: - specifier: ^3.11.5 - version: 3.11.5 + specifier: ^3.12.2 + version: 3.12.2 idb-keyval: specifier: 6.2.1 version: 6.2.1 @@ -815,8 +818,8 @@ importers: specifier: 2.2.3 version: 2.2.3 katex: - specifier: 0.16.7 - version: 0.16.7 + specifier: 0.16.8 + version: 0.16.8 matter-js: specifier: 0.18.0 version: 0.18.0 @@ -824,8 +827,8 @@ importers: specifier: 0.23.3 version: 0.23.3 photoswipe: - specifier: 5.3.7 - version: 5.3.7 + specifier: 5.3.8 + version: 5.3.8 prettier: specifier: 3.0.0 version: 3.0.0 @@ -836,8 +839,8 @@ importers: specifier: 1.29.0 version: 1.29.0 punycode: - specifier: 2.1.1 - version: 2.1.1 + specifier: 2.3.0 + version: 2.3.0 querystring: specifier: 0.2.1 version: 0.2.1 @@ -845,14 +848,14 @@ importers: specifier: 1.0.0 version: 1.0.0 rollup: - specifier: 3.23.1 - version: 3.23.1 + specifier: 3.26.2 + version: 3.26.2 s-age: specifier: 1.1.2 version: 1.1.2 sass: - specifier: 1.62.1 - version: 1.62.1 + specifier: 1.63.6 + version: 1.63.6 seedrandom: specifier: 3.0.5 version: 3.0.5 @@ -866,8 +869,8 @@ importers: specifier: 2.1.0 version: 2.1.0 swiper: - specifier: 9.3.2 - version: 9.3.2 + specifier: 10.0.4 + version: 10.0.4 syuilo-password-strength: specifier: 0.0.1 version: 0.0.1 @@ -881,11 +884,11 @@ importers: specifier: 5.0.0 version: 5.0.0 tinycolor2: - specifier: 1.5.2 - version: 1.5.2 + specifier: 1.6.0 + version: 1.6.0 tsc-alias: - specifier: 1.8.6 - version: 1.8.6 + specifier: 1.8.7 + version: 1.8.7 tsconfig-paths: specifier: 4.2.0 version: 4.2.0 @@ -893,8 +896,8 @@ importers: specifier: 14.0.0 version: 14.0.0 typescript: - specifier: 5.1.3 - version: 5.1.3 + specifier: 5.1.6 + version: 5.1.6 unicode-emoji-json: specifier: ^0.4.0 version: 0.4.0 @@ -905,11 +908,11 @@ importers: specifier: 1.8.0 version: 1.8.0 vite: - specifier: 4.3.9 - version: 4.3.9(@types/node@18.11.18)(sass@1.62.1) + specifier: 4.4.2 + version: 4.4.2(@types/node@20.4.1)(sass@1.63.6) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@4.3.9) + version: 0.5.1(vite@4.4.2) vue: specifier: 3.3.4 version: 3.3.4 @@ -1039,7 +1042,7 @@ importers: version: 2.8.8 ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.22.5)(jest@29.4.0)(typescript@4.9.4) + version: 29.0.5(@babel/core@7.22.8)(jest@29.4.0)(typescript@4.9.4) typedoc: specifier: ^0.23.24 version: 0.23.24(typescript@4.9.4) @@ -1094,6 +1097,11 @@ packages: resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} engines: {node: '>=6.9.0'} + /@babel/compat-data@7.22.6: + resolution: {integrity: sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.22.5: resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} engines: {node: '>=6.9.0'} @@ -1116,6 +1124,29 @@ packages: transitivePeerDependencies: - supports-color + /@babel/core@7.22.8: + resolution: {integrity: sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.7 + '@babel/helper-compilation-targets': 7.22.6(@babel/core@7.22.8) + '@babel/helper-module-transforms': 7.22.5 + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + '@nicolo-ribaudo/semver-v6': 6.3.3 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.22.5: resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} engines: {node: '>=6.9.0'} @@ -1125,6 +1156,16 @@ packages: '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 + /@babel/generator@7.22.7: + resolution: {integrity: sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} engines: {node: '>=6.9.0'} @@ -1138,6 +1179,20 @@ packages: lru-cache: 5.1.1 semver: 6.3.0 + /@babel/helper-compilation-targets@7.22.6(@babel/core@7.22.8): + resolution: {integrity: sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.6 + '@babel/core': 7.22.8 + '@babel/helper-validator-option': 7.22.5 + '@nicolo-ribaudo/semver-v6': 6.3.3 + browserslist: 4.21.9 + lru-cache: 5.1.1 + dev: true + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -1192,6 +1247,13 @@ packages: dependencies: '@babel/types': 7.22.5 + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} @@ -1214,6 +1276,17 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers@7.22.6: + resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} @@ -1229,6 +1302,14 @@ packages: dependencies: '@babel/types': 7.22.5 + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.5): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -1392,8 +1473,8 @@ packages: - supports-color dev: false - /@babel/runtime@7.20.7: - resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} + /@babel/runtime@7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 @@ -1430,6 +1511,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.22.8: + resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.7 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} @@ -1451,6 +1550,15 @@ packages: redis-info: 3.1.0 dev: false + /@bull-board/api@5.6.0(@bull-board/ui@5.6.0): + resolution: {integrity: sha512-a2O15p5oEm+/E/0I2l2nE2NKK0dkgNNTaamu+0gGyfUxWoCS3fCGX6LLEyl3jgOz0IC3GKRnwtVgbZFzk42sGQ==} + peerDependencies: + '@bull-board/ui': 5.6.0 + dependencies: + '@bull-board/ui': 5.6.0 + redis-info: 3.1.0 + dev: false + /@bull-board/koa@5.2.0(@types/koa@2.13.5)(pug@3.0.2): resolution: {integrity: sha512-jntDAl/POouD0PS/iiKXBNl26SuUf7Y5uL3EgpDN7isvwFcpKhvdk0VdBypjrkRHN6rPaEJJPkEtK30qv01XYw==} dependencies: @@ -1525,6 +1633,12 @@ packages: '@bull-board/api': 5.2.0(@bull-board/ui@5.2.0) dev: false + /@bull-board/ui@5.6.0: + resolution: {integrity: sha512-mc9T+kijDX5ZJMJCzeKPk9uLfOtcuefdDLPqWi961EiiNKfkDex+Gh41DAfcyrNjYsAkBsphvgBgcvundHPGIw==} + dependencies: + '@bull-board/api': 5.6.0(@bull-board/ui@5.6.0) + dev: false + /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -1707,8 +1821,8 @@ packages: - supports-color dev: false - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + /@esbuild/android-arm64@0.18.11: + resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1716,8 +1830,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + /@esbuild/android-arm@0.18.11: + resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1725,8 +1839,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + /@esbuild/android-x64@0.18.11: + resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1734,8 +1848,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + /@esbuild/darwin-arm64@0.18.11: + resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1743,8 +1857,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + /@esbuild/darwin-x64@0.18.11: + resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1752,8 +1866,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + /@esbuild/freebsd-arm64@0.18.11: + resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1761,8 +1875,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + /@esbuild/freebsd-x64@0.18.11: + resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1770,8 +1884,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + /@esbuild/linux-arm64@0.18.11: + resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1779,8 +1893,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + /@esbuild/linux-arm@0.18.11: + resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1788,8 +1902,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + /@esbuild/linux-ia32@0.18.11: + resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1797,8 +1911,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + /@esbuild/linux-loong64@0.18.11: + resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1806,8 +1920,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + /@esbuild/linux-mips64el@0.18.11: + resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1815,8 +1929,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + /@esbuild/linux-ppc64@0.18.11: + resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1824,8 +1938,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + /@esbuild/linux-riscv64@0.18.11: + resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1833,8 +1947,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + /@esbuild/linux-s390x@0.18.11: + resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1842,8 +1956,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + /@esbuild/linux-x64@0.18.11: + resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1851,8 +1965,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + /@esbuild/netbsd-x64@0.18.11: + resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1860,8 +1974,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + /@esbuild/openbsd-x64@0.18.11: + resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1869,8 +1983,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + /@esbuild/sunos-x64@0.18.11: + resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1878,8 +1992,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + /@esbuild/win32-arm64@0.18.11: + resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1887,8 +2001,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + /@esbuild/win32-ia32@0.18.11: + resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1896,8 +2010,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + /@esbuild/win32-x64@0.18.11: + resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2013,7 +2127,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 chalk: 4.1.2 jest-message-util: 29.6.0 jest-util: 29.6.0 @@ -2079,14 +2193,14 @@ packages: '@jest/test-result': 29.6.0 '@jest/transform': 29.6.0 '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.6.0(@types/node@20.3.1) + jest-config: 29.6.0(@types/node@18.11.18) jest-haste-map: 29.6.0 jest-message-util: 29.6.0 jest-regex-util: 29.4.3 @@ -2123,7 +2237,7 @@ packages: dependencies: '@jest/fake-timers': 29.6.0 '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 jest-mock: 29.6.0 dev: true @@ -2162,7 +2276,7 @@ packages: dependencies: '@jest/types': 29.6.0 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 jest-message-util: 29.6.0 jest-mock: 29.6.0 jest-util: 29.6.0 @@ -2242,7 +2356,7 @@ packages: '@jest/transform': 29.6.0 '@jest/types': 29.6.0 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.3.1 + '@types/node': 18.11.18 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -2402,7 +2516,7 @@ packages: '@jest/schemas': 29.6.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.3.1 + '@types/node': 18.11.18 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -2650,6 +2764,11 @@ packages: engines: {node: '>= 10'} hasBin: true + /@nicolo-ribaudo/semver-v6@6.3.3: + resolution: {integrity: sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==} + hasBin: true + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2781,7 +2900,7 @@ packages: engines: {node: '>=12.0.0'} dependencies: '@redocly/ajv': 8.11.0 - '@types/node': 14.18.52 + '@types/node': 14.18.53 colorette: 1.4.0 js-levenshtein: 1.1.6 js-yaml: 4.1.0 @@ -2794,26 +2913,26 @@ packages: - encoding dev: false - /@rollup/plugin-alias@3.1.9(rollup@3.23.1): + /@rollup/plugin-alias@3.1.9(rollup@3.26.2): resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} engines: {node: '>=8.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 dependencies: - rollup: 3.23.1 + rollup: 3.26.2 slash: 3.0.0 dev: true - /@rollup/plugin-json@4.1.0(rollup@3.23.1): + /@rollup/plugin-json@4.1.0(rollup@3.26.2): resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0(rollup@3.23.1) - rollup: 3.23.1 + '@rollup/pluginutils': 3.1.0(rollup@3.26.2) + rollup: 3.26.2 dev: true - /@rollup/pluginutils@3.1.0(rollup@3.23.1): + /@rollup/pluginutils@3.1.0(rollup@3.26.2): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2822,7 +2941,7 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: 3.23.1 + rollup: 3.26.2 dev: true /@rollup/pluginutils@4.2.1: @@ -3373,12 +3492,12 @@ packages: /@types/accepts@1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/adm-zip@0.5.0: resolution: {integrity: sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/argparse@1.0.38: @@ -3426,7 +3545,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/bull@3.15.9: resolution: {integrity: sha512-MPUcyPPQauAmynoO3ezHAmCOhbB0pWmYyijr/5ctaCqhbKWsjW0YCod38ZcLzUBprosfZ9dPqfYIcfdKjk7RNQ==} @@ -3442,7 +3561,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.3.1 + '@types/node': 18.11.18 '@types/responselike': 1.0.0 /@types/cbor@6.0.0: @@ -3455,14 +3574,14 @@ packages: /@types/co-body@6.1.0: resolution: {integrity: sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 '@types/qs': 6.9.7 dev: false /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/content-disposition@0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} @@ -3473,7 +3592,7 @@ packages: '@types/connect': 3.4.35 '@types/express': 4.17.17 '@types/keygrip': 1.0.2 - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/core-js@2.5.0: resolution: {integrity: sha512-qjkHL3wF0JMHMqgm/kmL8Pf8rIiqvueEiZ0g6NVTcBX1WN46GWDr+V5z+gsHUeL0n8TfAmXnYmF7ajsxmBp4PQ==} @@ -3523,7 +3642,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3539,7 +3658,7 @@ packages: /@types/fluent-ffmpeg@2.1.20: resolution: {integrity: sha512-B+OvhCdJ3LgEq2PhvWNOiB/EfwnXLElfMCgc4Z1K5zXgSfo9I6uGKwR/lqmNPFQuebNnes7re3gqkV77SyypLg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/form-data@2.5.0: @@ -3552,13 +3671,13 @@ packages: /@types/formidable@2.0.6: resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: false /@types/glob-stream@8.0.0: resolution: {integrity: sha512-fxTWwdQmX9LWSHD7ZLlv3BHR992mKcVcDnT/2v+l/QZZo7TfDdyasqlSYVzOnMGWhRbrWeWkbj/mgezFjKynhw==} dependencies: - '@types/node': 20.3.1 + '@types/node': 20.4.1 '@types/picomatch': 2.3.0 '@types/streamx': 2.9.1 dev: true @@ -3567,7 +3686,7 @@ packages: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.3.1 + '@types/node': 20.4.1 dev: true /@types/graceful-fs@4.1.6: @@ -3576,34 +3695,19 @@ packages: '@types/node': 20.3.1 dev: true - /@types/gulp-rename@2.0.1: - resolution: {integrity: sha512-9ZjeS2RHEnmBmTcyi2+oeye3BgCsWhvi4uv3qCnAg8i6plOuRdaeNxjOves0ELysEXYLBl7bCl5fbVs7AZtgTA==} - dependencies: - '@types/node': 20.3.1 - '@types/vinyl': 2.0.7 - dev: true - /@types/gulp-rename@2.0.2: resolution: {integrity: sha512-CQsXqTVtAXqrPd4IbrrlJEEzRkUR3RXsyZbrVoOVqjlchDDmnyRDatAUisjpQjjCg/wjJrSiNg8T1uAbJ/7Qqg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 20.4.1 '@types/vinyl': 2.0.7 dev: true - /@types/gulp@4.0.10: - resolution: {integrity: sha512-spgZHJFqiEJGwqGlf7T/k4nkBpBcLgP7T0EfN6G2vvnhUfvd4uO1h8RwpXOE8x/54DVYUs1XCAtBHkX/R3axAQ==} + /@types/gulp@4.0.13: + resolution: {integrity: sha512-Ms20Q2tZ3MpThZGn4Ag6e7ifz/oQJFxsuiopqz5oHmhE6q2ohnELgafi5K/pKX/4ntlpidS61v/TXAguYsVcaA==} dependencies: '@types/undertaker': 1.2.8 '@types/vinyl-fs': 3.0.2 - chokidar: 3.3.1 - dev: true - - /@types/gulp@4.0.11: - resolution: {integrity: sha512-jy0nfcsjiGqO1prNsYMK/bHkTblIBgG04sL2nxPpnP9MyNicHp1SUblomjOla6JoW1qkR67HjFHqIibpPoShNQ==} - dependencies: - '@types/undertaker': 1.2.8 - '@types/vinyl-fs': 3.0.2 - chokidar: 3.3.1 + chokidar: 3.5.3 dev: true /@types/http-assert@1.5.3: @@ -3661,7 +3765,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -3692,7 +3796,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/koa-bodyparser@4.3.10: resolution: {integrity: sha512-6ae05pjhmrmGhUR8GYD5qr5p9LTEMEGfGXCsK8VaSL+totwigm8+H/7MHW7K4854CMeuwRAubT8qcc/EagaeIA==} @@ -3808,7 +3912,7 @@ packages: '@types/http-errors': 2.0.1 '@types/keygrip': 1.0.2 '@types/koa-compose': 3.2.5 - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/koa__cors@3.3.0: resolution: {integrity: sha512-FUN8YxcBakIs+walVe3+HcNP+Bxd0SB8BJHBWkglZ5C1XQWljlKcEFDG/dPiCIqwVCUbc5X0nYDlH62uEhdHMA==} @@ -3857,13 +3961,13 @@ packages: /@types/needle@3.2.0: resolution: {integrity: sha512-6XzvzEyJ2ozFNfPajFmqH9JOt0Hp+9TawaYpJT59iIP/zR0U37cfWCRwosyIeEBBZBi021Osq4jGAD3AOju5fg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 20.4.1 form-data: 3.0.1 dev: false @@ -3874,19 +3978,23 @@ packages: node-fetch: 3.3.1 dev: true - /@types/node@14.18.52: - resolution: {integrity: sha512-DGhiXKOHSFVVm+PJD+9Y0ObxXLeG6qwc0HoOn+ooQKeNNu+T2mEJCM5UBDUREKAggl9MHYjb5E71PAmx6MbzIg==} + /@types/node@14.18.53: + resolution: {integrity: sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==} /@types/node@18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} /@types/node@20.3.1: resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + dev: true + + /@types/node@20.4.1: + resolution: {integrity: sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==} /@types/nodemailer@6.4.8: resolution: {integrity: sha512-oVsJSCkqViCn8/pEu2hfjwVO+Gb3e+eTWjg3PcjeFKRItfKpKwHphQqbYmPQrlMk+op7pNNWPbsJIEthpFN/OQ==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/normalize-package-data@2.4.1: @@ -3896,7 +4004,7 @@ packages: /@types/oauth@0.9.1: resolution: {integrity: sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/object-assign-deep@0.4.0: resolution: {integrity: sha512-3D0F3rHRNDc8cQSXNzwF1jBrJi28Mdrhc10ZLlqbJWDPYRWTTWB9Tc8JoKrgBvLKioXoPoHT6Uzf3s2F7akCUg==} @@ -3926,7 +4034,7 @@ packages: resolution: {integrity: sha512-R5H3vw62gHNHrn+JGZbKejb+Z2D/6E5UNVlhCzIaBBLroMQMOFqy5Pap2gM+ZZHdqBtVU0/cx/M6to+mOJcoew==} dependencies: '@types/needle': 3.2.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/pug@2.0.6: @@ -3940,7 +4048,7 @@ packages: /@types/qrcode@1.5.0: resolution: {integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/qs@6.9.7: @@ -3960,7 +4068,7 @@ packages: /@types/redis@2.8.32: resolution: {integrity: sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/redis@4.0.11: @@ -3977,7 +4085,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/sanitize-html@2.9.0: resolution: {integrity: sha512-4fP/kEcKNj2u39IzrxWYuf/FnCCwwQCpif6wwY6ROUS1EPRIfWJjGkY3HIowY1EX/VbX5e86yq8AAE7UPMgATg==} @@ -4001,19 +4109,19 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/serve-static@1.15.2: resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/sharp@0.31.1: resolution: {integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/sinonjs__fake-timers@8.1.1: @@ -4035,7 +4143,7 @@ packages: /@types/streamx@2.9.1: resolution: {integrity: sha512-9bywzhouyedmci7WCIPFwJ8zASDnxt2gaVUy52X0p0Tt085IJSAEP0L6j4SSNeDMSLzpYu6cPz0GrJZ7kPJ6Bg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 20.4.1 dev: true /@types/throttle-debounce@5.0.0: @@ -4061,7 +4169,7 @@ packages: /@types/undertaker@1.2.8: resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 20.4.1 '@types/undertaker-registry': 1.0.1 async-done: 1.3.2 dev: true @@ -4078,7 +4186,7 @@ packages: resolution: {integrity: sha512-ctNcmmzbMIKooXjRkyyUCOu2Z4AyqibL+RhXoF3pb7K7j+ezItnakmpm31LymkYHSIM5ey0tjIFzTvFOTSBCGw==} dependencies: '@types/glob-stream': 8.0.0 - '@types/node': 20.3.1 + '@types/node': 20.4.1 '@types/vinyl': 2.0.7 dev: true @@ -4086,13 +4194,13 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 20.3.1 + '@types/node': 20.4.1 dev: true /@types/web-push@3.3.2: resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/webgl-ext@0.0.30: @@ -4106,13 +4214,13 @@ packages: /@types/websocket@1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 dev: true /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -4134,7 +4242,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 20.3.1 + '@types/node': 20.4.1 dev: true optional: true @@ -4267,14 +4375,14 @@ packages: eslint-visitor-keys: 3.4.1 dev: true - /@vitejs/plugin-vue@4.2.3(vite@4.3.9)(vue@3.3.4): + /@vitejs/plugin-vue@4.2.3(vite@4.4.2)(vue@3.3.4): resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.3.9(@types/node@18.11.18)(sass@1.62.1) + vite: 4.4.2(@types/node@20.4.1)(sass@1.63.6) vue: 3.3.4 dev: true @@ -4298,7 +4406,7 @@ packages: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} dependencies: '@babel/parser': 7.22.5 - postcss: 8.4.24 + postcss: 8.4.25 source-map: 0.6.1 dev: true @@ -5465,6 +5573,11 @@ packages: /blurhash@1.1.5: resolution: {integrity: sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==} + dev: false + + /blurhash@2.0.5: + resolution: {integrity: sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==} + dev: true /bmp-js@0.1.0: resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} @@ -5513,10 +5626,10 @@ packages: dependencies: fill-range: 7.0.1 - /broadcast-channel@4.19.1: - resolution: {integrity: sha512-CroDV8L4QdMuCHtjs0AATaN2w1rA5e6ca9a3yZATmAs3lbFu3q3QkITkuMS4sQ/NjtZwkVANXLlhgyQfiukBuw==} + /broadcast-channel@5.1.0: + resolution: {integrity: sha512-wAbP+mtQ28N+iX3scX6Q97UN39ER5jRWOtM3r1BNPLWFOMt3AGmwN9kS3fqwgaUW0tbWHRSfTpsT+pAvrzQz0Q==} dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.21.0 oblivious-set: 1.1.1 p-queue: 6.6.2 rimraf: 3.0.2 @@ -5646,7 +5759,7 @@ packages: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.2 - glob: 10.3.1 + glob: 10.3.3 lru-cache: 7.18.3 minipass: 5.0.0 minipass-collect: 1.0.2 @@ -5927,6 +6040,21 @@ packages: optionalDependencies: fsevents: 2.1.3 + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false @@ -6299,8 +6427,8 @@ packages: engines: {node: '>=4.0.0'} dev: true - /compare-versions@5.0.3: - resolution: {integrity: sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==} + /compare-versions@6.0.0: + resolution: {integrity: sha512-s2MzYxfRsE9f/ow8hjn7ysa7pod1xhHdQMsgiJtKx6XSNf4x2N1KG4fjrkUmXcP/e9Y2ZX4zB6sHIso0Lm6evQ==} dev: true /component-emitter@1.3.0: @@ -6587,6 +6715,12 @@ packages: /core-js@3.31.0: resolution: {integrity: sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==} requiresBuild: true + dev: false + + /core-js@3.31.1: + resolution: {integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==} + requiresBuild: true + dev: true /core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -6769,7 +6903,7 @@ packages: dependencies: '@cypress/request': 2.88.11 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 14.18.52 + '@types/node': 14.18.53 '@types/sinonjs__fake-timers': 8.1.1 '@types/sizzle': 2.3.3 arch: 2.2.0 @@ -7476,34 +7610,34 @@ packages: es6-symbol: 3.1.3 dev: true - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + /esbuild@0.18.11: + resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 + '@esbuild/android-arm': 0.18.11 + '@esbuild/android-arm64': 0.18.11 + '@esbuild/android-x64': 0.18.11 + '@esbuild/darwin-arm64': 0.18.11 + '@esbuild/darwin-x64': 0.18.11 + '@esbuild/freebsd-arm64': 0.18.11 + '@esbuild/freebsd-x64': 0.18.11 + '@esbuild/linux-arm': 0.18.11 + '@esbuild/linux-arm64': 0.18.11 + '@esbuild/linux-ia32': 0.18.11 + '@esbuild/linux-loong64': 0.18.11 + '@esbuild/linux-mips64el': 0.18.11 + '@esbuild/linux-ppc64': 0.18.11 + '@esbuild/linux-riscv64': 0.18.11 + '@esbuild/linux-s390x': 0.18.11 + '@esbuild/linux-x64': 0.18.11 + '@esbuild/netbsd-x64': 0.18.11 + '@esbuild/openbsd-x64': 0.18.11 + '@esbuild/sunos-x64': 0.18.11 + '@esbuild/win32-arm64': 0.18.11 + '@esbuild/win32-ia32': 0.18.11 + '@esbuild/win32-x64': 0.18.11 dev: true /escalade@3.1.1: @@ -7889,6 +8023,10 @@ packages: /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + /events@1.1.1: resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} engines: {node: '>=0.4.x'} @@ -8017,7 +8155,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/expect-utils': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 jest-get-type: 29.4.3 jest-matcher-utils: 29.6.0 jest-message-util: 29.6.0 @@ -8109,6 +8247,10 @@ packages: time-stamp: 1.1.0 dev: true + /fast-blurhash@1.1.2: + resolution: {integrity: sha512-lJVOgYSlahqkRhrKumNx/SGB2F/qS0D1z7xjGYjb5EZJRtlzySGMniZjkQ9h9Rv8sPmM/V9orEgRiMwazDNH6A==} + dev: true + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8127,6 +8269,17 @@ packages: micromatch: 4.0.5 dev: true + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -8371,18 +8524,18 @@ packages: readable-stream: 2.3.8 dev: true - /focus-trap-vue@4.0.2(focus-trap@7.4.3)(vue@3.3.4): + /focus-trap-vue@4.0.2(focus-trap@7.5.2)(vue@3.3.4): resolution: {integrity: sha512-2iQN2xKCSCzyhcD90VpueQcTIAhaCRxxo67fkz7RSqLmEd16QKjfGslCr3KxvBx0LfpVN9j0IAyKKuJKw3Intg==} peerDependencies: focus-trap: ^7.0.0 vue: ^3.0.0 dependencies: - focus-trap: 7.4.3 + focus-trap: 7.5.2 vue: 3.3.4 dev: true - /focus-trap@7.4.3: - resolution: {integrity: sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==} + /focus-trap@7.5.2: + resolution: {integrity: sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==} dependencies: tabbable: 6.2.0 dev: true @@ -8786,8 +8939,8 @@ packages: - supports-color dev: true - /glob@10.3.1: - resolution: {integrity: sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==} + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: @@ -8795,7 +8948,7 @@ packages: jackspeak: 2.2.1 minimatch: 9.0.2 minipass: 5.0.0 - path-scurry: 1.10.0 + path-scurry: 1.10.1 dev: false /glob@7.2.0: @@ -8879,7 +9032,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -8952,8 +9105,8 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - /gsap@3.11.5: - resolution: {integrity: sha512-Q89nKCLgoX5xUjznh9LcaIUkz54k1voNucT1Rpf9SJNFIQznBwFqt5qUUQbeVInFyN/n18OUJkpeI6CNEDt74w==} + /gsap@3.12.2: + resolution: {integrity: sha512-EkYnpG8qHgYBFAwsgsGEqvT1WUidX0tt/ijepx7z8EUJHElykg91RvW1XbkT59T0gZzzszOpjQv7SE41XuIXyQ==} dev: true /gulp-cli@2.3.0: @@ -9002,7 +9155,7 @@ packages: resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==} engines: {node: '>=10'} dependencies: - '@types/node': 20.3.1 + '@types/node': 20.4.1 '@types/vinyl': 2.0.7 istextorbinary: 3.3.0 replacestream: 4.0.3 @@ -10143,7 +10296,7 @@ packages: '@jest/expect': 29.6.0 '@jest/test-result': 29.6.0 '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -10301,45 +10454,6 @@ packages: - supports-color dev: true - /jest-config@29.6.0(@types/node@20.3.1): - resolution: {integrity: sha512-fKA4jM91PDqWVkMpb1FVKxIuhg3hC6hgaen57cr1rRZkR96dCatvJZsk3ik7/GNu9ERj9wgAspOmyvkFoGsZhA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.22.5 - '@jest/test-sequencer': 29.6.0 - '@jest/types': 29.6.0 - '@types/node': 20.3.1 - babel-jest: 29.6.0(@babel/core@7.22.5) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.0 - jest-environment-node: 29.6.0 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.0 - jest-runner: 29.6.0 - jest-util: 29.6.0 - jest-validate: 29.6.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -10443,7 +10557,7 @@ packages: '@jest/environment': 29.6.0 '@jest/fake-timers': 29.6.0 '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 jest-mock: 29.6.0 jest-util: 29.6.0 dev: true @@ -10493,7 +10607,7 @@ packages: dependencies: '@jest/types': 29.6.0 '@types/graceful-fs': 4.1.6 - '@types/node': 20.3.1 + '@types/node': 18.11.18 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -10610,7 +10724,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 jest-util: 29.6.0 dev: true @@ -10741,7 +10855,7 @@ packages: '@jest/test-result': 29.6.0 '@jest/transform': 29.6.0 '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -10802,7 +10916,7 @@ packages: '@jest/test-result': 29.6.0 '@jest/transform': 29.6.0 '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.1 @@ -10905,7 +11019,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -10955,7 +11069,7 @@ packages: dependencies: '@jest/test-result': 29.6.0 '@jest/types': 29.6.0 - '@types/node': 20.3.1 + '@types/node': 18.11.18 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -10976,7 +11090,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -10985,7 +11099,7 @@ packages: resolution: {integrity: sha512-dICMQ+Q4W0QVMsaQzWlA1FVQhKNz7QcDCOGtbk1GCAd0Lai+wdkQvfmQwL4MjGumineh1xz+6M5oMj3rfWS02A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 jest-util: 29.6.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -10995,7 +11109,7 @@ packages: resolution: {integrity: sha512-oiQHH1SnKmZIwwPnpOrXTq4kHBk3lKGY/07DpnH0sAu+x7J8rXlbLDROZsU6vy9GwB0hPiZeZpu6YlJ48QoKcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.3.1 + '@types/node': 18.11.18 jest-util: 29.6.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -11365,8 +11479,8 @@ packages: safe-buffer: 5.2.1 dev: false - /katex@0.16.7: - resolution: {integrity: sha512-Xk9C6oGKRwJTfqfIbtr0Kes9OSv6IFsuhFGc7tW4urlpMJtuh+7YhzU6YEG9n8gmWKcMAFzkp7nr+r69kV0zrA==} + /katex@0.16.8: + resolution: {integrity: sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==} hasBin: true dependencies: commander: 8.3.0 @@ -13238,8 +13352,8 @@ packages: path-root-regex: 0.1.2 dev: true - /path-scurry@1.10.0: - resolution: {integrity: sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==} + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.0.0 @@ -13345,8 +13459,8 @@ packages: split2: 4.2.0 dev: false - /photoswipe@5.3.7: - resolution: {integrity: sha512-zsyLsTTLFrj0XR1m4/hO7qNooboFKUrDy+Zt5i2d6qjFPAtBjzaj/Xtydso4uxzcXpcqbTmyxDibb3BcSISseg==} + /photoswipe@5.3.8: + resolution: {integrity: sha512-4vTzOQt8GP4Chsm0s+8j2xDtVHAEN252PxrU12A1zXauNn0zD5HRHgjALKO2GKTyBnTnOrJUOxbV8LTrFIMrYw==} engines: {node: '>= 0.12.0'} dev: true @@ -13672,6 +13786,15 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postcss@8.4.25: + resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -14003,11 +14126,6 @@ packages: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} dev: false - /punycode@2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} - engines: {node: '>=6'} - dev: true - /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -14256,6 +14374,13 @@ packages: dependencies: picomatch: 2.3.1 + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} @@ -14616,8 +14741,8 @@ packages: rangestr: 0.0.1 seedrandom: 2.4.2 - /rollup@3.23.1: - resolution: {integrity: sha512-ybRdFVHOoljGEFILHLd2g/qateqUdjE6YS41WXq4p3C/WwD3xtWxV4FYWETA1u9TeXQc5K8L8zHE5d/scOvrOQ==} + /rollup@3.26.2: + resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -14694,12 +14819,12 @@ packages: postcss: 8.4.24 dev: false - /sass@1.62.1: - resolution: {integrity: sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==} + /sass@1.63.6: + resolution: {integrity: sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==} engines: {node: '>=14.0.0'} hasBin: true dependencies: - chokidar: 3.3.1 + chokidar: 3.5.3 immutable: 4.3.0 source-map-js: 1.0.2 dev: true @@ -15172,10 +15297,6 @@ packages: safer-buffer: 2.1.2 tweetnacl: 0.14.5 - /ssr-window@4.0.2: - resolution: {integrity: sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==} - dev: true - /ssri@10.0.4: resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -15534,11 +15655,9 @@ packages: webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true - /swiper@9.3.2: - resolution: {integrity: sha512-Kj9Z4kXRmJR3YT/Wj+XLWj8P6IcRt+WG38uL8M3/Wny7+6sV0TlP9vnE1X+Co9c7VzNooojWGnFa+Wf/9+CUMA==} + /swiper@10.0.4: + resolution: {integrity: sha512-DlNR3KiaVkPep6RraZ2tNr7lvyuzELuR+4NZr4wO42t0UworIO3DxDlz8b5Q3uUioh7cJad99EdRJLkPF+r8Ag==} engines: {node: '>= 4.7.0'} - dependencies: - ssr-window: 4.0.2 dev: true /symbol-tree@3.2.4: @@ -15781,6 +15900,11 @@ packages: /tinycolor2@1.5.2: resolution: {integrity: sha512-h80m9GPFGbcLzZByXlNSEhp1gf8Dy+VX/2JCGUZsWLo7lV1mnE/XlxGYgRBoMLJh1lIDXP0EMC4RPTjlRaV+Bg==} + dev: false + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: true /tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} @@ -15905,7 +16029,7 @@ packages: escape-string-regexp: 5.0.0 dev: true - /ts-jest@27.1.2(@babel/core@7.22.5)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3): + /ts-jest@27.1.2(@babel/core@7.22.8)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3): resolution: {integrity: sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -15926,7 +16050,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 '@types/jest': 27.4.0 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -15940,7 +16064,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-jest@29.0.5(@babel/core@7.22.5)(jest@29.4.0)(typescript@4.9.4): + /ts-jest@29.0.5(@babel/core@7.22.8)(jest@29.4.0)(typescript@4.9.4): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -15961,7 +16085,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.8 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.4.0(@types/node@18.11.18) @@ -16051,11 +16175,11 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /tsc-alias@1.8.6: - resolution: {integrity: sha512-vq+i6VpE83IeMsSJVcFN03ZBofADhr8/gIJXjxpbnTRfN/MFXy0+SBaKG2o7p95QqXBGkeG98HYz3IkOOveFbg==} + /tsc-alias@1.8.7: + resolution: {integrity: sha512-59Q/zUQa3miTf99mLbSqaW0hi1jt4WoG8Uhe5hSZJHQpSoFW9eEwvW7jlKMHXWvT+zrzy3SN9PE/YBhQ+WVydA==} hasBin: true dependencies: - chokidar: 3.3.1 + chokidar: 3.5.3 commander: 9.5.0 globby: 11.1.0 mylas: 2.1.13 @@ -16315,6 +16439,12 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /ulid@2.3.0: resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==} hasBin: true @@ -16649,7 +16779,7 @@ packages: replace-ext: 1.0.1 dev: true - /vite-plugin-compression@0.5.1(vite@4.3.9): + /vite-plugin-compression@0.5.1(vite@4.4.2): resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} peerDependencies: vite: '>=2.0.0' @@ -16657,18 +16787,19 @@ packages: chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) fs-extra: 10.1.0 - vite: 4.3.9(@types/node@18.11.18)(sass@1.62.1) + vite: 4.4.2(@types/node@20.4.1)(sass@1.63.6) transitivePeerDependencies: - supports-color dev: true - /vite@4.3.9(@types/node@18.11.18)(sass@1.62.1): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + /vite@4.4.2(@types/node@20.4.1)(sass@1.63.6): + resolution: {integrity: sha512-zUcsJN+UvdSyHhYa277UHhiJ3iq4hUBwHavOpsNUGsTgjBeoBlK8eDt+iT09pBq0h9/knhG/SPrZiM7cGmg7NA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: '@types/node': '>= 14' less: '*' + lightningcss: ^1.21.0 sass: '*' stylus: '*' sugarss: '*' @@ -16678,6 +16809,8 @@ packages: optional: true less: optional: true + lightningcss: + optional: true sass: optional: true stylus: @@ -16687,11 +16820,11 @@ packages: terser: optional: true dependencies: - '@types/node': 18.11.18 - esbuild: 0.17.19 - postcss: 8.4.24 - rollup: 3.23.1 - sass: 1.62.1 + '@types/node': 20.4.1 + esbuild: 0.18.11 + postcss: 8.4.25 + rollup: 3.26.2 + sass: 1.63.6 optionalDependencies: fsevents: 2.3.2 dev: true @@ -17422,15 +17555,15 @@ packages: name: plyr version: 3.7.0 dependencies: - core-js: 3.31.0 + core-js: 3.31.1 custom-event-polyfill: 1.0.7 loadjs: 4.2.0 rangetouch: 2.0.1 url-polyfill: 1.1.12 dev: true - github.com/thatonecalculator/emojilib/9d16541664dc8fef3201ae9b647477070676a52e: - resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/9d16541664dc8fef3201ae9b647477070676a52e} + github.com/thatonecalculator/emojilib/15fd9504f943763a057ff803ee2009ec0524c96b: + resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/15fd9504f943763a057ff803ee2009ec0524c96b} name: emojilib version: 3.0.10 dev: true From 99b87138dcd5c4df4584a0642904e6740ffd567a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Mon, 10 Jul 2023 21:14:22 -0700 Subject: [PATCH 037/162] dev60 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 592788316..0f14400cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "14.0.0-rc3", + "version": "14.0.0-dev60", "codename": "aqua", "repository": { "type": "git", From 54b6106be3353f78fa888bc40639c7a2a4993a7e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Mon, 10 Jul 2023 21:16:56 -0700 Subject: [PATCH 038/162] fix: :ambulance: correct import for swiper 10 --- packages/client/src/pages/about.vue | 2 +- packages/client/src/pages/admin-file.vue | 2 +- packages/client/src/pages/channels.vue | 2 +- packages/client/src/pages/explore.vue | 2 +- packages/client/src/pages/gallery/index.vue | 2 +- packages/client/src/pages/instance-info.vue | 2 +- packages/client/src/pages/messaging/index.vue | 2 +- packages/client/src/pages/notifications.vue | 2 +- packages/client/src/pages/pages.vue | 2 +- packages/client/src/pages/search.vue | 2 +- packages/client/src/pages/tag.vue | 2 +- packages/client/src/pages/timeline.vue | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue index b7fe6fe7a..88ed1add2 100644 --- a/packages/client/src/pages/about.vue +++ b/packages/client/src/pages/about.vue @@ -163,7 +163,7 @@ From 7d41179b83f6a3b423b0dbf3fdf20cfd2de1b302 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Tue, 11 Jul 2023 20:56:40 -0700 Subject: [PATCH 061/162] feat: :sparkles: don't close emoji picker if shift is held down, like Discord https://snug.moe/notes/9h1p04dqytz2qfsz --- .../src/components/MkEmojiPickerDialog.vue | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/packages/client/src/components/MkEmojiPickerDialog.vue b/packages/client/src/components/MkEmojiPickerDialog.vue index fcd2f26a3..95000b353 100644 --- a/packages/client/src/components/MkEmojiPickerDialog.vue +++ b/packages/client/src/components/MkEmojiPickerDialog.vue @@ -12,7 +12,7 @@ :transparent-bg="true" :manual-showing="manualShowing" :src="src" - @click="modal?.close()" + @click="checkForShift" @opening="opening" @close="emit('close')" @closed="emit('closed')" @@ -31,7 +31,7 @@ diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts index 11b9a2eda..66be0430d 100644 --- a/packages/client/src/init.ts +++ b/packages/client/src/init.ts @@ -450,6 +450,29 @@ function checkForSplash() { } localStorage.setItem("lastUsed", Date.now().toString()); + const latestDonationInfoShownAt = localStorage.getItem( + "latestDonationInfoShownAt", + ); + const neverShowDonationInfo = localStorage.getItem("neverShowDonationInfo"); + if ( + neverShowDonationInfo !== "true" && + new Date($i.createdAt).getTime() < Date.now() - 1000 * 60 * 60 * 24 * 3 && + !location.pathname.startsWith("/miauth") + ) { + if ( + latestDonationInfoShownAt == null || + new Date(latestDonationInfoShownAt).getTime() < + Date.now() - 1000 * 60 * 60 * 24 * 30 + ) { + popup( + defineAsyncComponent(() => import("@/components/MkDonation.vue")), + {}, + {}, + "closed", + ); + } + } + if ("Notification" in window) { // 許可を得ていなかったらリクエスト if (Notification.permission === "default") { diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index b03a98ae5..4920a82fa 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -53,6 +53,20 @@ i18n.ts.maintainerEmail }} + + + + + @@ -435,6 +449,7 @@ let description: string | null = $ref(null); let tosUrl: string | null = $ref(null); let maintainerName: string | null = $ref(null); let maintainerEmail: string | null = $ref(null); +let donationLink: string | null = $ref(null); let iconUrl: string | null = $ref(null); let bannerUrl: string | null = $ref(null); let logoImageUrl: string | null = $ref(null); @@ -481,6 +496,7 @@ async function init() { defaultDarkTheme = meta.defaultDarkTheme; maintainerName = meta.maintainerName; maintainerEmail = meta.maintainerEmail; + donationLink = meta.donationLink; enableLocalTimeline = !meta.disableLocalTimeline; enableGlobalTimeline = !meta.disableGlobalTimeline; enableRecommendedTimeline = !meta.disableRecommendedTimeline; @@ -527,6 +543,7 @@ function save() { defaultDarkTheme: defaultDarkTheme === "" ? null : defaultDarkTheme, maintainerName, maintainerEmail, + donationLink, disableLocalTimeline: !enableLocalTimeline, disableGlobalTimeline: !enableGlobalTimeline, disableRecommendedTimeline: !enableRecommendedTimeline, diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue index e8c616493..4a1598e16 100644 --- a/packages/client/src/pages/settings/2fa.vue +++ b/packages/client/src/pages/settings/2fa.vue @@ -82,7 +82,7 @@

{{ `${i18n.ts.lastUsedDate}: ${key.lastUsed}` }}

-
+
Date: Tue, 11 Jul 2023 23:42:59 -0700 Subject: [PATCH 067/162] refactor: :recycle: donation link logic, add link to /about, fix typo --- locales/en-US.yml | 2 +- .../server/api/endpoints/admin/update-meta.ts | 18 ++++++++++++++++++ packages/client/src/components/MkDonation.vue | 14 +++----------- packages/client/src/pages/about.vue | 15 +++++++++++++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 08eb2a62f..d8a26b1f2 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1219,7 +1219,7 @@ _aboutMisskey: donate: "Donate to Calckey" donateTitle: "Enjoying Calckey?" pleaseDonateToCalckey: "Please consider donating to Calckey to support its development." - pleaseDonateToHost: "Please also consider donating to your honme server, {host}, to help support its operation costs." + pleaseDonateToHost: "Please also consider donating to your home server, {host}, to help support its operation costs." donateHost: "Donate to {host}" morePatrons: "We also appreciate the support of many other helpers not listed here. Thank you! 🥰" diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index cf22c6c48..16e49a85a 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -177,6 +177,9 @@ export const paramDef = { postImports: { type: "boolean" }, }, }, + enableServerMachineStats: { type: "boolean" }, + enableIdenticonGeneration: { type: "boolean" }, + donationLink: { type: "string", nullable: true }, }, required: [], } as const; @@ -568,6 +571,21 @@ export default define(meta, paramDef, async (ps, me) => { set.experimentalFeatures = ps.experimentalFeatures || undefined; } + if (ps.enableServerMachineStats !== undefined) { + set.enableServerMachineStats = ps.enableServerMachineStats; + } + + if (ps.enableIdenticonGeneration !== undefined) { + set.enableIdenticonGeneration = ps.enableIdenticonGeneration; + } + + if (ps.donationLink !== undefined) { + set.donationLink = ps.donationLink; + if (set.donationLink && !/^https?:\/\//i.test(set.donationLink)) { + set.donationLink = `https://${set.donationLink}`; + } + } + await db.transaction(async (transactionalEntityManager) => { const metas = await transactionalEntityManager.find(Meta, { order: { diff --git a/packages/client/src/components/MkDonation.vue b/packages/client/src/components/MkDonation.vue index beaeef2d2..367ec7b58 100644 --- a/packages/client/src/components/MkDonation.vue +++ b/packages/client/src/components/MkDonation.vue @@ -18,10 +18,10 @@

- {{ + {{ i18n.ts._aboutMisskey.donate }} - {{ + {{ i18n.t("_aboutMisskey.donateHost", { host: hostname, }) @@ -63,15 +63,7 @@ function neverShow() { close(); } -function openCalckeyDonation() { - window.open("https://opencollective.com/calckey", "_blank"); -} - -function openExternalDonation() { - let link = instance.donationLink; - if (!/^https?:\/\//i.test(link)) { - link = `http://${link}`; - } +function openExternal(link) { window.open(link, "_blank"); } diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue index 88ed1add2..bbc340fe2 100644 --- a/packages/client/src/pages/about.vue +++ b/packages/client/src/pages/about.vue @@ -93,6 +93,21 @@ external >{{ i18n.ts.tos }} + + + {{ + i18n.t("_aboutMisskey.donateHost", { + host: $instance.name || host, + }) + }} + + From c1ebe11ee9885f69cfdde87b005461210036a37d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Wed, 12 Jul 2023 00:13:39 -0700 Subject: [PATCH 068/162] dev70 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ef2cd9e70..15d7b2ab0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "14.0.0-dev69", + "version": "14.0.0-dev70", "codename": "aqua", "repository": { "type": "git", From d9fd0ea7141056a7a0255c9e8e7b8fbac9e95667 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Wed, 12 Jul 2023 00:23:54 -0700 Subject: [PATCH 069/162] fix: :lipstick: locales, transition for MkDonation --- locales/en-US.yml | 2 + locales/ja-JP.yml | 2 + packages/client/src/components/MkDonation.vue | 107 ++++++++++++------ 3 files changed, 74 insertions(+), 37 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index d8a26b1f2..c61b573ba 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1119,6 +1119,8 @@ showPopup: "Notify users with popup" showWithSparkles: "Show with sparkles" youHaveUnreadAnnouncements: "You have unread announcements" donationLink: "Link to donation page" +neverShow: "Don't show again" +remindMeLater: "Maybe later" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 95fb7bcf8..fe03d1f41 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -983,6 +983,8 @@ enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にす showPopup: "ポップアップを表示してユーザーに知らせる" showWithSparkles: "タイトルをキラキラさせる" youHaveUnreadAnnouncements: "未読のお知らせがあります" +neverShow: "今後表示しない" +remindMeLater: "また後で" _sensitiveMediaDetection: description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" diff --git a/packages/client/src/components/MkDonation.vue b/packages/client/src/components/MkDonation.vue index 367ec7b58..9ec99a6ec 100644 --- a/packages/client/src/components/MkDonation.vue +++ b/packages/client/src/components/MkDonation.vue @@ -1,50 +1,68 @@ + + From 66d7884b72ea2153bdf3c13e75fd39ec7033c822 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Wed, 12 Jul 2023 00:45:53 -0700 Subject: [PATCH 072/162] feat: :lipstick: fly in as well --- packages/client/src/components/MkDonation.vue | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/client/src/components/MkDonation.vue b/packages/client/src/components/MkDonation.vue index 5d3960799..b368b3e4e 100644 --- a/packages/client/src/components/MkDonation.vue +++ b/packages/client/src/components/MkDonation.vue @@ -88,20 +88,33 @@ function openExternal(link) { diff --git a/packages/client/src/components/MkInfo.vue b/packages/client/src/components/MkInfo.vue index ba3a606ab..0a9373885 100644 --- a/packages/client/src/components/MkInfo.vue +++ b/packages/client/src/components/MkInfo.vue @@ -12,6 +12,7 @@ v-tooltip="i18n.ts.close" class="_buttonIcon close" @click.stop="close" + :aria-label="i18n.t('close')" > diff --git a/packages/client/src/components/MkModalPageWindow.vue b/packages/client/src/components/MkModalPageWindow.vue index bf4d8d0bc..e35c6952b 100644 --- a/packages/client/src/components/MkModalPageWindow.vue +++ b/packages/client/src/components/MkModalPageWindow.vue @@ -26,7 +26,7 @@ > {{ pageMetadata?.value.title }} -
diff --git a/packages/client/src/components/MkPollEditor.vue b/packages/client/src/components/MkPollEditor.vue index e0474ac71..6215e6f2d 100644 --- a/packages/client/src/components/MkPollEditor.vue +++ b/packages/client/src/components/MkPollEditor.vue @@ -14,7 +14,7 @@ @update:modelValue="onInput(i, $event)" > - diff --git a/packages/client/src/components/MkPostForm.vue b/packages/client/src/components/MkPostForm.vue index ab110b14d..98fc00851 100644 --- a/packages/client/src/components/MkPostForm.vue +++ b/packages/client/src/components/MkPostForm.vue @@ -11,7 +11,7 @@ >
@@ -93,7 +93,7 @@
- diff --git a/packages/client/src/components/MkWidgets.vue b/packages/client/src/components/MkWidgets.vue index 272ba1404..f6241512f 100644 --- a/packages/client/src/components/MkWidgets.vue +++ b/packages/client/src/components/MkWidgets.vue @@ -40,6 +40,7 @@ diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index 4920a82fa..a33335089 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -59,9 +59,7 @@ class="_formBlock" > From 55d150f9b1f59475561cc4fde81922b732955fd1 Mon Sep 17 00:00:00 2001 From: freeplay Date: Thu, 13 Jul 2023 19:27:00 -0400 Subject: [PATCH 099/162] refactor: use new card design in user popup --- .../client/src/components/MkUserPreview.vue | 303 +----------------- 1 file changed, 2 insertions(+), 301 deletions(-) diff --git a/packages/client/src/components/MkUserPreview.vue b/packages/client/src/components/MkUserPreview.vue index 6c3838fd2..60a91c11b 100644 --- a/packages/client/src/components/MkUserPreview.vue +++ b/packages/client/src/components/MkUserPreview.vue @@ -19,96 +19,7 @@ } " > -
- - -
- -

-
-
- -
- -
-
-
- -
-
- -
-
-
-
-
-

{{ i18n.ts.notes }}

- {{ user.notesCount }} -
-
-

{{ i18n.ts.following }}

- {{ user.followingCount }} -
-
-

{{ i18n.ts.followers }}

- {{ user.followersCount }} -
-
- -
+
@@ -118,14 +29,10 @@ @@ -148,7 +139,6 @@ let collapsed = $ref(isLong); } } - .title { position: relative; display: block; @@ -159,7 +149,7 @@ let collapsed = $ref(isLong); background: var(--panel); line-height: 1; z-index: 4; - + .avatar { display: block; position: absolute; @@ -210,12 +200,10 @@ let collapsed = $ref(isLong); position: relative; max-height: calc(9em + 50px); mask: linear-gradient(black calc(100% - 64px), transparent); - -webkit-mask: linear-gradient( - black calc(100% - 64px), - transparent - ); + -webkit-mask: linear-gradient(black calc(100% - 64px), transparent); } - &.collapsed, &.truncate { + &.collapsed, + &.truncate { :deep(br) { display: none; // collapse white spaces } diff --git a/packages/client/src/components/MkUserPreview.vue b/packages/client/src/components/MkUserPreview.vue index 60a91c11b..894e3dfb8 100644 --- a/packages/client/src/components/MkUserPreview.vue +++ b/packages/client/src/components/MkUserPreview.vue @@ -93,6 +93,5 @@ onMounted(() => { width: 300px; overflow: hidden; transform-origin: center top; - } From 46c436bbb150a84494ceadf280d57b21cae9ceff Mon Sep 17 00:00:00 2001 From: freeplay Date: Thu, 13 Jul 2023 19:32:35 -0400 Subject: [PATCH 101/162] fix: collapsing white space --- packages/client/src/components/MkUserInfo.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkUserInfo.vue b/packages/client/src/components/MkUserInfo.vue index ad3602330..55979a229 100644 --- a/packages/client/src/components/MkUserInfo.vue +++ b/packages/client/src/components/MkUserInfo.vue @@ -205,7 +205,7 @@ let collapsed = $ref(isLong); &.collapsed, &.truncate { :deep(br) { - display: none; // collapse white spaces + display: block; // collapse white spaces } } } From 599417de6eabcac64fc92e79951c9cdd6c4fc56d Mon Sep 17 00:00:00 2001 From: okayurisotto Date: Wed, 12 Apr 2023 01:07:24 +0900 Subject: [PATCH 102/162] Refactor sw (#10579) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(sw): remove dead code * refactor(sw): remove dead code * refactor(sw): remove dead code * refactor(sw): remove dead code * refactor(sw): remove dead code * refactor(sw): remove dead code * refactor(sw): 冗長な部分を変更 * refactor(sw): 使われていない煩雑な機能を削除 * refactor(sw): remove dead code * refactor(sw): URL文字列の作成に`URL`を使うように * refactor(sw): 型アサーションの削除とそれに伴い露呈したエラーへの対処 * refactor(sw): `append` -> `set` in `URLSearchParams` * refactor(sw): `any`の削除とそれに伴い露呈したエラーへの対処 * refactor(sw): 型アサーションの削除とそれに伴い露呈したエラーへの対処 対処と言っても`throw`するだけ。いままでもこの状況ではエラーが投げられていたはずなので、この対処により新たな問題が起きることはないはず。 * refactor(sw): i18n loading * refactor(sw): 型推論がうまくできる書き方に変更 `codes`が`(string | undefined)[]`から`string[]`になった * refactor(sw): クエリ文字列の作成に`URLSearchParams`を使うように * refactor(sw): `findClient` * refactor(sw): `openClient`における`any`や`as`の書き換え * refactor(sw): `openPost`における`any`の書き換え * refactor(sw): `let` -> `const` * refactor(sw): `any` -> `unknown` * cleanup(sw): import * cleanup(sw) * cleanup(sw): `?.` * cleanup(sw/.eslintrc.js) * refactor(sw): `@typescript-eslint/explicit-function-return-type` * refactor(sw): `@typescript-eslint/no-unused-vars` * refactor(sw): どうしようもないところに`eslint-disable-next-line`を * refactor(sw): `import/no-default-export` * update operations.ts * throw new Error --------- Co-authored-by: tamaina Co-authored-by: Kainoa kanter --- packages/sw/src/@types/global.d.ts | 8 + packages/sw/src/filters/user.ts | 14 -- .../sw/src/scripts/create-notification.ts | 85 +++---- .../sw/src/scripts/get-account-from-id.ts | 11 +- packages/sw/src/scripts/get-user-name.ts | 4 +- packages/sw/src/scripts/i18n.ts | 7 +- packages/sw/src/scripts/lang.ts | 20 +- packages/sw/src/scripts/login-id.ts | 10 +- packages/sw/src/scripts/operations.ts | 112 +++++---- packages/sw/src/scripts/twemoji-base.ts | 12 +- packages/sw/src/scripts/url.ts | 15 -- packages/sw/src/sw.ts | 224 +++++++++--------- packages/sw/src/types.ts | 41 +++- 13 files changed, 291 insertions(+), 272 deletions(-) create mode 100644 packages/sw/src/@types/global.d.ts delete mode 100644 packages/sw/src/filters/user.ts delete mode 100644 packages/sw/src/scripts/url.ts diff --git a/packages/sw/src/@types/global.d.ts b/packages/sw/src/@types/global.d.ts new file mode 100644 index 000000000..a7d176b0b --- /dev/null +++ b/packages/sw/src/@types/global.d.ts @@ -0,0 +1,8 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type FIXME = any; + +declare const _LANGS_: string[][]; +declare const _VERSION_: string; +declare const _ENV_: string; +declare const _DEV_: boolean; +declare const _PERF_PREFIX_: string; diff --git a/packages/sw/src/filters/user.ts b/packages/sw/src/filters/user.ts deleted file mode 100644 index 782194d16..000000000 --- a/packages/sw/src/filters/user.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as misskey from "calckey-js"; -import * as Acct from "calckey-js/built/acct"; - -export const acct = (user: misskey.Acct) => { - return Acct.toString(user); -}; - -export const userName = (user: misskey.entities.User) => { - return user.name || user.username; -}; - -export const userPage = (user: misskey.Acct, path?, absolute = false) => { - return `${absolute ? origin : ""}/@${acct(user)}${path ? `/${path}` : ""}`; -}; diff --git a/packages/sw/src/scripts/create-notification.ts b/packages/sw/src/scripts/create-notification.ts index 03ce2a60d..12d76aabf 100644 --- a/packages/sw/src/scripts/create-notification.ts +++ b/packages/sw/src/scripts/create-notification.ts @@ -1,23 +1,36 @@ /* * Notification manager for SW */ -declare let self: ServiceWorkerGlobalScope; - -import { swLang } from "@/scripts/lang"; -import { cli } from "@/scripts/operations"; -import { pushNotificationDataMap } from "@/types"; -import getUserName from "@/scripts/get-user-name"; -import { I18n } from "@/scripts/i18n"; -import { getAccountFromId } from "@/scripts/get-account-from-id"; +import type { BadgeNames, PushNotificationDataMap } from "@/types"; import { char2fileName } from "@/scripts/twemoji-base"; -import * as url from "@/scripts/url"; +import { cli } from "@/scripts/operations"; +import { getAccountFromId } from "@/scripts/get-account-from-id"; +import { swLang } from "@/scripts/lang"; +import { getUserName } from "@/scripts/get-user-name"; -const iconUrl = (name: string) => - `/static-assets/notification-badges/${name}.png`; +const closeNotificationsByTags = async (tags: string[]): Promise => { + for (const n of ( + await Promise.all( + tags.map((tag) => globalThis.registration.getNotifications({ tag })), + ) + ).flat()) { + n.close(); + } +}; + +const iconUrl = (name: BadgeNames): string => + `/static-assets/tabler-badges/${name}.png`; +/* How to add a new badge: + * 1. Find the icon and download png from https://tabler-icons.io/ + * 2. vips resize ~/Downloads/icon-name.png vipswork.png 0.4; vips scRGB2BW vipswork.png ~/icon-name.png"[compression=9,strip]"; rm vipswork.png; + * 3. mv ~/icon-name.png ~/misskey/packages/backend/assets/tabler-badges/ + * 4. Add 'icon-name' to BadgeNames + * 5. Add `badge: iconUrl('icon-name'),` + */ export async function createNotification< - K extends keyof pushNotificationDataMap, ->(data: pushNotificationDataMap[K]) { + K extends keyof PushNotificationDataMap, +>(data: PushNotificationDataMap[K]): Promise { const n = await composeNotification(data); if (n) { @@ -28,11 +41,10 @@ export async function createNotification< } } -async function composeNotification( - data: pushNotificationDataMap[K], +async function composeNotification( + data: PushNotificationDataMap[keyof PushNotificationDataMap], ): Promise<[string, NotificationOptions] | null> { - if (!swLang.i18n) swLang.fetchLocale(); - const i18n = (await swLang.i18n) as I18n; + const i18n = await (swLang.i18n ?? swLang.fetchLocale()); const { t } = i18n; switch (data.type) { /* @@ -164,38 +176,20 @@ async function composeNotification( if (reaction.startsWith(":")) { // カスタム絵文字の場合 - const customEmoji = data.body.note.emojis.find( - (x) => x.name === reaction.substr(1, reaction.length - 2), - ); - if (customEmoji) { - if (reaction.includes("@")) { - reaction = `:${reaction.substr(1, reaction.indexOf("@") - 1)}:`; - } - - const u = new URL(customEmoji.url); - if (u.href.startsWith(`${origin}/proxy/`)) { - // もう既にproxyっぽそうだったらsearchParams付けるだけ - u.searchParams.set("badge", "1"); - badge = u.href; - } else { - const dummy = `${u.host}${u.pathname}`; // 拡張子がないとキャッシュしてくれないCDNがあるので - badge = `${origin}/proxy/${dummy}?${url.query({ - url: u.href, - badge: "1", - })}`; - } - } + const name = reaction.substring(1, reaction.length - 1); + const badgeUrl = new URL(`/emoji/${name}.webp`, origin); + badgeUrl.searchParams.set("badge", "1"); + badge = badgeUrl.href; + reaction = name.split("@")[0]; } else { // Unicode絵文字の場合 badge = `/twemoji-badge/${char2fileName(reaction)}.png`; } if ( - badge - ? await fetch(badge) - .then((res) => res.status !== 200) - .catch(() => true) - : true + await fetch(badge) + .then((res) => res.status !== 200) + .catch(() => true) ) { badge = iconUrl("plus"); } @@ -339,10 +333,9 @@ async function composeNotification( } } -export async function createEmptyNotification() { +export async function createEmptyNotification(): Promise { return new Promise(async (res) => { - if (!swLang.i18n) swLang.fetchLocale(); - const i18n = (await swLang.i18n) as I18n; + const i18n = await (swLang.i18n ?? swLang.fetchLocale()); const { t } = i18n; await self.registration.showNotification( diff --git a/packages/sw/src/scripts/get-account-from-id.ts b/packages/sw/src/scripts/get-account-from-id.ts index 24f5e590e..dfcb08d0e 100644 --- a/packages/sw/src/scripts/get-account-from-id.ts +++ b/packages/sw/src/scripts/get-account-from-id.ts @@ -1,7 +1,12 @@ import { get } from "idb-keyval"; -export async function getAccountFromId(id: string) { - const accounts = (await get("accounts")) as { token: string; id: string }[]; - if (!accounts) console.log("Accounts are not recorded"); +export async function getAccountFromId( + id: string, +): Promise<{ token: string; id: string } | void> { + const accounts = await get<{ token: string; id: string }[]>("accounts"); + if (!accounts) { + console.log("Accounts are not recorded"); + return; + } return accounts.find((e) => e.id === id); } diff --git a/packages/sw/src/scripts/get-user-name.ts b/packages/sw/src/scripts/get-user-name.ts index 0f8916de8..b0a87d9b8 100644 --- a/packages/sw/src/scripts/get-user-name.ts +++ b/packages/sw/src/scripts/get-user-name.ts @@ -1,6 +1,6 @@ -export default function (user: { +export function getUserName(user: { name?: string | null; username: string; }): string { - return user.name || user.username; + return user.name === "" ? user.username : user.name ?? user.username; } diff --git a/packages/sw/src/scripts/i18n.ts b/packages/sw/src/scripts/i18n.ts index 06fe83f31..71ac9e7b0 100644 --- a/packages/sw/src/scripts/i18n.ts +++ b/packages/sw/src/scripts/i18n.ts @@ -1,4 +1,6 @@ -export class I18n> { +export type Locale = { [key: string]: string | Locale }; + +export class I18n { public ts: T; constructor(locale: T) { @@ -15,7 +17,8 @@ export class I18n> { try { let str = key .split(".") - .reduce((o, i) => o[i], this.ts) as unknown as string; + .reduce((o, i) => o[i], this.ts); + if (typeof str !== "string") throw new Error(); if (args) { for (const [k, v] of Object.entries(args)) { diff --git a/packages/sw/src/scripts/lang.ts b/packages/sw/src/scripts/lang.ts index 31cfb7bd3..bdfc25ef6 100644 --- a/packages/sw/src/scripts/lang.ts +++ b/packages/sw/src/scripts/lang.ts @@ -1,10 +1,8 @@ /* * Language manager for SW */ -declare let self: ServiceWorkerGlobalScope; - import { get, set } from "idb-keyval"; -import { I18n } from "@/scripts/i18n"; +import { I18n, type Locale } from "@/scripts/i18n"; class SwLang { public cacheName = `mk-cache-${_VERSION_}`; @@ -14,19 +12,19 @@ class SwLang { return prelang; }); - public setLang(newLang: string) { + public setLang(newLang: string): Promise> { this.lang = Promise.resolve(newLang); set("lang", newLang); return this.fetchLocale(); } - public i18n: Promise> | null = null; + public i18n: Promise | null = null; - public fetchLocale() { - return this.i18n === this._fetch(); + public fetchLocale(): Promise> { + return (this.i18n = this._fetch()); } - private async _fetch() { + private async _fetch(): Promise> { // Service Workerは何度も起動しそのたびにlocaleを読み込むので、CacheStorageを使う const localeUrl = `/assets/locales/${await this.lang}.${_VERSION_}.json`; let localeRes = await caches.match(localeUrl); @@ -34,13 +32,13 @@ class SwLang { // _DEV_がtrueの場合は常に最新化 if (!localeRes || _DEV_) { localeRes = await fetch(localeUrl); - const clone = localeRes?.clone(); - if (!clone?.clone().ok) Error("locale fetching error"); + const clone = localeRes.clone(); + if (!clone.clone().ok) throw new Error("locale fetching error"); caches.open(this.cacheName).then((cache) => cache.put(localeUrl, clone)); } - return new I18n(await localeRes.json()); + return new I18n(await localeRes.json()); } } diff --git a/packages/sw/src/scripts/login-id.ts b/packages/sw/src/scripts/login-id.ts index 0fe345780..773b01536 100644 --- a/packages/sw/src/scripts/login-id.ts +++ b/packages/sw/src/scripts/login-id.ts @@ -1,11 +1,5 @@ -export function getUrlWithLoginId(url: string, loginId: string) { +export function getUrlWithLoginId(url: string, loginId: string): string { const u = new URL(url, origin); - u.searchParams.append("loginId", loginId); - return u.toString(); -} - -export function getUrlWithoutLoginId(url: string) { - const u = new URL(url); - u.searchParams.delete("loginId"); + u.searchParams.set("loginId", loginId); return u.toString(); } diff --git a/packages/sw/src/scripts/operations.ts b/packages/sw/src/scripts/operations.ts index ae76d6ecf..74d1b053e 100644 --- a/packages/sw/src/scripts/operations.ts +++ b/packages/sw/src/scripts/operations.ts @@ -2,69 +2,100 @@ * Operations * 各種操作 */ -declare let self: ServiceWorkerGlobalScope; - import * as Misskey from "calckey-js"; -import { SwMessage, swMessageOrderType } from "@/types"; -import { acct as getAcct } from "@/filters/user"; +import type { SwMessage, SwMessageOrderType } from "@/types"; import { getAccountFromId } from "@/scripts/get-account-from-id"; import { getUrlWithLoginId } from "@/scripts/login-id"; export const cli = new Misskey.api.APIClient({ origin, - fetch: (...args) => fetch(...args), + fetch: (...args): Promise => fetch(...args), }); -export async function api( +export async function api< + E extends keyof Misskey.Endpoints, + O extends Misskey.Endpoints[E]["req"], +>( endpoint: E, - userId: string, - options?: Misskey.Endpoints[E]["req"], -) { - const account = await getAccountFromId(userId); - if (!account) return; + userId?: string, + options?: O, +): Promise>> { + let account: { token: string; id: string } | void; - return cli.request(endpoint, options, account.token); + if (userId) { + account = await getAccountFromId(userId); + if (!account) return; + } + + return cli.request(endpoint, options, account?.token); +} + +// mark-all-as-read送出を1秒間隔に制限する +const readBlockingStatus = new Map(); +export function sendMarkAllAsRead( + userId: string, +): Promise { + if (readBlockingStatus.get(userId)) return Promise.resolve(); + readBlockingStatus.set(userId, true); + return new Promise((resolve) => { + setTimeout(() => { + readBlockingStatus.set(userId, false); + api("notifications/mark-all-as-read", userId).then(resolve, resolve); + }, 1000); + }); } // rendered acctからユーザーを開く -export function openUser(acct: string, loginId: string) { +export function openUser( + acct: string, + loginId?: string, +): ReturnType { return openClient("push", `/@${acct}`, loginId, { acct }); } // noteIdからノートを開く -export function openNote(noteId: string, loginId: string) { +export function openNote( + noteId: string, + loginId?: string, +): ReturnType { return openClient("push", `/notes/${noteId}`, loginId, { noteId }); } -export async function openChat(body: any, loginId: string) { - if (body.groupId === null) { - return openClient("push", `/my/messaging/${getAcct(body.user)}`, loginId, { - body, - }); - } else { - return openClient("push", `/my/messaging/group/${body.groupId}`, loginId, { - body, - }); - } +// noteIdからノートを開く +export function openAntenna( + antennaId: string, + loginId: string, +): ReturnType { + return openClient("push", `/timeline/antenna/${antennaId}`, loginId, { + antennaId, + }); } // post-formのオプションから投稿フォームを開く -export async function openPost(options: any, loginId: string) { +export async function openPost( + options: { + initialText?: string; + reply?: Misskey.entities.Note; + renote?: Misskey.entities.Note; + }, + loginId?: string, +): ReturnType { // クエリを作成しておく - let url = "/share?"; - if (options.initialText) url += `text=${options.initialText}&`; - if (options.reply) url += `replyId=${options.reply.id}&`; - if (options.renote) url += `renoteId=${options.renote.id}&`; + const url = "/share"; + const query = new URLSearchParams(); + if (options.initialText) query.set("text", options.initialText); + if (options.reply) query.set("replyId", options.reply.id); + if (options.renote) query.set("renoteId", options.renote.id); - return openClient("post", url, loginId, { options }); + return openClient("post", `${url}?${query}`, loginId, { options }); } export async function openClient( - order: swMessageOrderType, + order: SwMessageOrderType, url: string, - loginId: string, - query: any = {}, -) { + loginId?: string, + query: Record = {}, +): Promise { const client = await findClient(); if (client) { @@ -74,19 +105,16 @@ export async function openClient( order, loginId, url, - } as SwMessage); + } satisfies SwMessage); return client; } - return self.clients.openWindow(getUrlWithLoginId(url, loginId)); + return self.clients.openWindow(getUrlWithLoginId(url, loginId!)); } -export async function findClient() { - const clients = await self.clients.matchAll({ +export async function findClient(): Promise { + const clients = await globalThis.clients.matchAll({ type: "window", }); - for (const c of clients) { - if (c.url.indexOf("?zen") < 0) return c; - } - return null; + return clients.find((c) => !new URL(c.url).searchParams.has("zen")) ?? null; } diff --git a/packages/sw/src/scripts/twemoji-base.ts b/packages/sw/src/scripts/twemoji-base.ts index 0e45a527e..ca35befdc 100644 --- a/packages/sw/src/scripts/twemoji-base.ts +++ b/packages/sw/src/scripts/twemoji-base.ts @@ -1,12 +1,8 @@ -export const twemojiSvgBase = "/twemoji"; - export function char2fileName(char: string): string { - let codes = Array.from(char).map((x) => x.codePointAt(0)?.toString(16)); + let codes = Array.from(char) + .map((x) => x.codePointAt(0)?.toString(16)) + .filter((x: T | undefined): x is T => x !== undefined); if (!codes.includes("200d")) codes = codes.filter((x) => x !== "fe0f"); - codes = codes.filter((x) => x?.length); + codes = codes.filter((x) => x.length !== 0); return codes.join("-"); } - -export function char2filePath(char: string): string { - return `${twemojiSvgBase}/${char2fileName(char)}.svg`; -} diff --git a/packages/sw/src/scripts/url.ts b/packages/sw/src/scripts/url.ts deleted file mode 100644 index a11f5e28b..000000000 --- a/packages/sw/src/scripts/url.ts +++ /dev/null @@ -1,15 +0,0 @@ -export function query(obj: {}): string { - const params = Object.entries(obj) - .filter(([, v]) => (Array.isArray(v) ? v.length : v !== undefined)) - .reduce((a, [k, v]) => ((a[k] = v), a), {} as Record); - - return Object.entries(params) - .map((e) => `${e[0]}=${encodeURIComponent(e[1])}`) - .join("&"); -} - -export function appendQuery(url: string, query: string): string { - return `${url}${ - /\?/.test(url) ? (url.endsWith("?") ? "" : "&") : "?" - }${query}`; -} diff --git a/packages/sw/src/sw.ts b/packages/sw/src/sw.ts index 74603d67c..6a2ba3bf1 100644 --- a/packages/sw/src/sw.ts +++ b/packages/sw/src/sw.ts @@ -1,20 +1,18 @@ -declare let self: ServiceWorkerGlobalScope; - +import { get } from "idb-keyval"; +import * as Acct from "calckey-js/built/acct"; +import type { PushNotificationDataMap } from "@/types"; import { createEmptyNotification, createNotification, } from "@/scripts/create-notification"; import { swLang } from "@/scripts/lang"; -import { swNotificationRead } from "@/scripts/notification-read"; -import { pushNotificationDataMap } from "@/types"; import * as swos from "@/scripts/operations"; -import { acct as getAcct } from "@/filters/user"; -self.addEventListener("install", (ev) => { - ev.waitUntil(self.skipWaiting()); +globalThis.addEventListener("install", () => { + // ev.waitUntil(globalThis.skipWaiting()); }); -self.addEventListener("activate", (ev) => { +globalThis.addEventListener("activate", (ev) => { ev.waitUntil( caches .keys() @@ -25,11 +23,15 @@ self.addEventListener("activate", (ev) => { .map((name) => caches.delete(name)), ), ) - .then(() => self.clients.claim()), + .then(() => globalThis.clients.claim()), ); }); -self.addEventListener("fetch", (ev) => { +function offlineContentHTML(): string { + return `Offline. Service Worker @${_VERSION_} `; +} + +globalThis.addEventListener("fetch", (ev) => { let isHTMLRequest = false; if (ev.request.headers.get("sec-fetch-dest") === "document") { isHTMLRequest = true; @@ -41,90 +43,68 @@ self.addEventListener("fetch", (ev) => { if (!isHTMLRequest) return; ev.respondWith( - fetch(ev.request).catch( - () => - new Response(`Offline. Service Worker @${_VERSION_}`, { status: 200 }), - ), + fetch(ev.request).catch(() => { + return new Response(offlineContentHTML(), { + status: 200, + headers: { + "content-type": "text/html", + }, + }); + }), ); }); -self.addEventListener("push", (ev) => { +globalThis.addEventListener("push", (ev) => { // クライアント取得 ev.waitUntil( - self.clients + globalThis.clients .matchAll({ includeUncontrolled: true, type: "window", }) - .then( - async ( - clients: readonly WindowClient[], - ) => { - const data: pushNotificationDataMap[K] = ev.data?.json(); + .then(async () => { + const data: PushNotificationDataMap[keyof PushNotificationDataMap] = + ev.data?.json(); - switch (data.type) { - // case 'driveFileCreated': - case "notification": - case "unreadMessagingMessage": - // 1日以上経過している場合は無視 - if (new Date().getTime() - data.dateTime > 1000 * 60 * 60 * 24) - break; + switch (data.type) { + // case 'driveFileCreated': + case "notification": + case "unreadAntennaNote": + // 1日以上経過している場合は無視 + if (new Date().getTime() - data.dateTime > 1000 * 60 * 60 * 24) + break; - // クライアントがあったらストリームに接続しているということなので通知しない - if (clients.length !== 0) break; + return createNotification(data); + case "readAllNotifications": + await globalThis.registration + .getNotifications() + .then((notifications) => + notifications.forEach( + (n) => n.tag !== "read_notification" && n.close(), + ), + ); + break; + } - return createNotification(data); - case "readAllNotifications": - for (const n of await self.registration.getNotifications()) { - if (n?.data?.type === "notification") n.close(); - } - break; - case "readAllMessagingMessages": - for (const n of await self.registration.getNotifications()) { - if (n?.data?.type === "unreadMessagingMessage") n.close(); - } - break; - case "readNotifications": - for (const n of await self.registration.getNotifications()) { - if (data.body?.notificationIds?.includes(n.data.body.id)) { - n.close(); - } - } - break; - case "readAllMessagingMessagesOfARoom": - for (const n of await self.registration.getNotifications()) { - if ( - n.data.type === "unreadMessagingMessage" && - ("userId" in data.body - ? data.body.userId === n.data.body.userId - : data.body.groupId === n.data.body.groupId) - ) { - n.close(); - } - } - break; - } - - return createEmptyNotification(); - }, - ), + await createEmptyNotification(); + return; + }), ); }); -self.addEventListener( +(globalThis as unknown as ServiceWorkerGlobalScope).addEventListener( "notificationclick", - ( - ev: ServiceWorkerGlobalScopeEventMap["notificationclick"], - ) => { + (ev: ServiceWorkerGlobalScopeEventMap["notificationclick"]) => { ev.waitUntil( - (async () => { + (async (): Promise => { if (_DEV_) { console.log("notificationclick", ev.action, ev.notification.data); } const { action, notification } = ev; - const data: pushNotificationDataMap[K] = notification.data; - const { userId: id } = data; + const data: PushNotificationDataMap[keyof PushNotificationDataMap] = + notification.data ?? {}; + const { userId: loginId } = data; let client: WindowClient | null = null; switch (data.type) { @@ -132,57 +112,53 @@ self.addEventListener( switch (action) { case "follow": if ("userId" in data.body) - await swos.api("following/create", id, { + await swos.api("following/create", loginId, { userId: data.body.userId, }); break; case "showUser": if ("user" in data.body) - client = await swos.openUser(getAcct(data.body.user), id); + client = await swos.openUser( + Acct.toString(data.body.user), + loginId, + ); break; case "reply": if ("note" in data.body) - client = await swos.openPost({ reply: data.body.note }, id); + client = await swos.openPost( + { reply: data.body.note }, + loginId, + ); break; case "renote": if ("note" in data.body) - await swos.api("notes/create", id, { + await swos.api("notes/create", loginId, { renoteId: data.body.note.id, }); break; case "accept": switch (data.body.type) { case "receiveFollowRequest": - await swos.api("following/requests/accept", id, { + await swos.api("following/requests/accept", loginId, { userId: data.body.userId, }); break; - case "groupInvited": - await swos.api("users/groups/invitations/accept", id, { - invitationId: data.body.invitation.id, - }); - break; } break; case "reject": switch (data.body.type) { case "receiveFollowRequest": - await swos.api("following/requests/reject", id, { + await swos.api("following/requests/reject", loginId, { userId: data.body.userId, }); break; - case "groupInvited": - await swos.api("users/groups/invitations/reject", id, { - invitationId: data.body.invitation.id, - }); - break; } break; case "showFollowRequests": client = await swos.openClient( "push", "/my/follow-requests", - id, + loginId, ); break; default: @@ -191,35 +167,61 @@ self.addEventListener( client = await swos.openClient( "push", "/my/follow-requests", - id, + loginId, ); break; - case "groupInvited": - client = await swos.openClient("push", "/my/groups", id); - break; case "reaction": - client = await swos.openNote(data.body.note.id, id); + client = await swos.openNote(data.body.note.id, loginId); break; default: if ("note" in data.body) { - client = await swos.openNote(data.body.note.id, id); + client = await swos.openNote(data.body.note.id, loginId); } else if ("user" in data.body) { - client = await swos.openUser(getAcct(data.body.user), id); + client = await swos.openUser( + Acct.toString(data.body.user), + loginId, + ); } break; } } break; - case "unreadMessagingMessage": - client = await swos.openChat(data.body, id); + case "unreadAntennaNote": + client = await swos.openAntenna(data.body.antenna.id, loginId); break; + default: + switch (action) { + case "markAllAsRead": + await globalThis.registration + .getNotifications() + .then((notifications) => + notifications.forEach( + (n) => n.tag !== "read_notification" && n.close(), + ), + ); + await get("accounts").then((accounts) => { + return Promise.all( + accounts.map(async (account) => { + await swos.sendMarkAllAsRead(account.id); + }), + ); + }); + break; + case "settings": + client = await swos.openClient( + "push", + "/settings/notifications", + loginId, + ); + break; + } } if (client) { client.focus(); } if (data.type === "notification") { - swNotificationRead.then((that) => that.read(data)); + await swos.sendMarkAllAsRead(loginId); } notification.close(); @@ -228,24 +230,28 @@ self.addEventListener( }, ); -self.addEventListener( +(globalThis as unknown as ServiceWorkerGlobalScope).addEventListener( "notificationclose", - ( - ev: ServiceWorkerGlobalScopeEventMap["notificationclose"], - ) => { - const data: pushNotificationDataMap[K] = ev.notification.data; + (ev: ServiceWorkerGlobalScopeEventMap["notificationclose"]) => { + const data: PushNotificationDataMap[keyof PushNotificationDataMap] = + ev.notification.data; - if (data.type === "notification") { - swNotificationRead.then((that) => that.read(data)); - } + ev.waitUntil( + (async (): Promise => { + if (data.type === "notification") { + await swos.sendMarkAllAsRead(data.userId); + } + return; + })(), + ); }, ); -self.addEventListener( +(globalThis as unknown as ServiceWorkerGlobalScope).addEventListener( "message", (ev: ServiceWorkerGlobalScopeEventMap["message"]) => { ev.waitUntil( - (async () => { + (async (): Promise => { switch (ev.data) { case "clear": // Cache Storage全削除 diff --git a/packages/sw/src/types.ts b/packages/sw/src/types.ts index 984076dbe..f66362565 100644 --- a/packages/sw/src/types.ts +++ b/packages/sw/src/types.ts @@ -1,34 +1,51 @@ import * as Misskey from "calckey-js"; -export type swMessageOrderType = "post" | "push"; +export type SwMessageOrderType = "post" | "push"; export type SwMessage = { type: "order"; - order: swMessageOrderType; - loginId: string; + order: SwMessageOrderType; + loginId?: string; url: string; - [x: string]: any; + [x: string]: unknown; }; // Defined also @/services/push-notification.ts#L7-L14 -type pushNotificationDataSourceMap = { +type PushNotificationDataSourceMap = { notification: Misskey.entities.Notification; - unreadMessagingMessage: Misskey.entities.MessagingMessage; - readNotifications: { notificationIds: string[] }; + unreadAntennaNote: { + antenna: { id: string; name: string }; + note: Misskey.entities.Note; + }; readAllNotifications: undefined; readAllMessagingMessages: undefined; readAllMessagingMessagesOfARoom: { userId: string } | { groupId: string }; }; -export type pushNotificationData< - K extends keyof pushNotificationDataSourceMap, +export type PushNotificationData< + K extends keyof PushNotificationDataSourceMap, > = { type: K; - body: pushNotificationDataSourceMap[K]; + body: PushNotificationDataSourceMap[K]; userId: string; dateTime: number; }; -export type pushNotificationDataMap = { - [K in keyof pushNotificationDataSourceMap]: pushNotificationData; +export type PushNotificationDataMap = { + [K in keyof PushNotificationDataSourceMap]: PushNotificationData; }; + +export type BadgeNames = + | "null" + | "antenna" + | "arrow-back-up" + | "at" + | "chart-arrows" + | "circle-check" + | "medal" + | "messages" + | "plus" + | "quote" + | "repeat" + | "user-plus" + | "users"; From 5ecd33b6ecc03d0782ff415da52359419cb830e7 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Thu, 13 Jul 2023 16:52:36 -0700 Subject: [PATCH 103/162] dev75 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ca8bf72c..2065d40dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "14.0.0-dev73", + "version": "14.0.0-dev75", "codename": "aqua", "repository": { "type": "git", From 5d38558e8aa71ccf825092df03c043a90c0f8f18 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Thu, 13 Jul 2023 16:53:53 -0700 Subject: [PATCH 104/162] chore: :art: format --- packages/client/src/components/MkDonation.vue | 7 ++++++- packages/client/src/components/MkModalPageWindow.vue | 6 +++++- packages/client/src/components/MkPollEditor.vue | 6 +++++- packages/client/src/components/MkPostForm.vue | 12 ++++++++++-- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/packages/client/src/components/MkDonation.vue b/packages/client/src/components/MkDonation.vue index d6f6d4801..49a0115a1 100644 --- a/packages/client/src/components/MkDonation.vue +++ b/packages/client/src/components/MkDonation.vue @@ -46,7 +46,12 @@ }}
- diff --git a/packages/client/src/components/MkModalPageWindow.vue b/packages/client/src/components/MkModalPageWindow.vue index e35c6952b..a29571b4e 100644 --- a/packages/client/src/components/MkModalPageWindow.vue +++ b/packages/client/src/components/MkModalPageWindow.vue @@ -26,7 +26,11 @@ > {{ pageMetadata?.value.title }} - diff --git a/packages/client/src/components/MkPollEditor.vue b/packages/client/src/components/MkPollEditor.vue index 6215e6f2d..de691ba88 100644 --- a/packages/client/src/components/MkPollEditor.vue +++ b/packages/client/src/components/MkPollEditor.vue @@ -14,7 +14,11 @@ @update:modelValue="onInput(i, $event)" > - diff --git a/packages/client/src/components/MkPostForm.vue b/packages/client/src/components/MkPostForm.vue index 98fc00851..b1812c2f1 100644 --- a/packages/client/src/components/MkPostForm.vue +++ b/packages/client/src/components/MkPostForm.vue @@ -84,7 +84,11 @@
{{ i18n.ts.quoteAttached - }}
@@ -93,7 +97,11 @@
- From cb561ddef8c0119ea342c996e9a4b516562e23cf Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Thu, 13 Jul 2023 17:11:59 -0700 Subject: [PATCH 105/162] fix: :lipstick: different default font if cjk --- packages/backend/src/server/web/boot.js | 8 ++++++-- packages/client/src/style.scss | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/server/web/boot.js b/packages/backend/src/server/web/boot.js index d3b7c3b82..9c966036f 100644 --- a/packages/backend/src/server/web/boot.js +++ b/packages/backend/src/server/web/boot.js @@ -102,7 +102,11 @@ localStorage.setItem("fontSize", null); fontSize = localStorage.getItem("fontSize"); } - document.documentElement.style.fontSize = fontSize + "px"; + document.documentElement.style.fontSize = `${fontSize}px`; + } + + if (["ja-JP", "ja-KS", "ko-KR", "zh-CN", "zh-TW"].includes(lang)) { + document.documentElement.classList.add("useCJKFont"); } const useSystemFont = localStorage.getItem("useSystemFont"); @@ -123,7 +127,7 @@ } async function addStyle(styleText) { - let css = document.createElement("style"); + const css = document.createElement("style"); css.appendChild(document.createTextNode(styleText)); document.head.appendChild(css); } diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 9df882ec7..6d24f5ad7 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -39,7 +39,7 @@ html { accent-color: var(--accent); overflow: auto; overflow-wrap: break-word; - font-family: "BIZ UDGothic", Roboto, HelveticaNeue, Arial, sans-serif; + font-family: Roboto, HelveticaNeue, Arial, sans-serif; font-size: 14px; line-height: 1.6; text-size-adjust: 100%; @@ -47,6 +47,10 @@ html { scroll-padding: 60px; overflow-x: clip; + &.useCJKFont { + font-family: "Hiragino Maru Gothic Pro", "BIZ UDGothic", Roboto, HelveticaNeue, Arial, sans-serif; + } + &.useSystemFont { font-family: system-ui, From a82ef942b42f286dd15a05cf8d5c72c1d89cdbba Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Thu, 13 Jul 2023 17:22:35 -0700 Subject: [PATCH 106/162] refactor: :lipstick: relay icon --- packages/client/src/pages/admin/index.vue | 2 +- packages/client/src/pages/admin/relays.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/admin/index.vue b/packages/client/src/pages/admin/index.vue index d9feb8574..1a5207510 100644 --- a/packages/client/src/pages/admin/index.vue +++ b/packages/client/src/pages/admin/index.vue @@ -264,7 +264,7 @@ const menuDef = $computed(() => [ active: currentPage?.route.name === "security", }, { - icon: "ph-flow-arrow ph-bold ph-lg", + icon: "ph-arrows-merge ph-bold ph-lg", text: i18n.ts.relays, to: "/admin/relays", active: currentPage?.route.name === "relays", diff --git a/packages/client/src/pages/admin/relays.vue b/packages/client/src/pages/admin/relays.vue index 2565ac16c..34f76db69 100644 --- a/packages/client/src/pages/admin/relays.vue +++ b/packages/client/src/pages/admin/relays.vue @@ -108,7 +108,7 @@ const headerTabs = $computed(() => []); definePageMetadata({ title: i18n.ts.relays, - icon: "ph-flow-arrow ph-bold ph-lg", + icon: "ph-arrows-merge ph-bold ph-lg", }); From 5b2884c5d3e1e8668b01baef09f67e7105bf1cea Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Thu, 13 Jul 2023 17:24:24 -0700 Subject: [PATCH 107/162] refactor: :lipstick: privacy icon --- packages/client/src/pages/settings/index.vue | 2 +- packages/client/src/pages/settings/privacy.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue index ee0d77b99..def40a277 100644 --- a/packages/client/src/pages/settings/index.vue +++ b/packages/client/src/pages/settings/index.vue @@ -100,7 +100,7 @@ const menuDef = computed(() => [ active: currentPage?.route.name === "profile", }, { - icon: "ph-lock-open ph-bold ph-lg", + icon: "ph-keyhole ph-bold ph-lg", text: i18n.ts.privacy, to: "/settings/privacy", active: currentPage?.route.name === "privacy", diff --git a/packages/client/src/pages/settings/privacy.vue b/packages/client/src/pages/settings/privacy.vue index c670934ae..08a388bd8 100644 --- a/packages/client/src/pages/settings/privacy.vue +++ b/packages/client/src/pages/settings/privacy.vue @@ -184,6 +184,6 @@ const headerTabs = $computed(() => []); definePageMetadata({ title: i18n.ts.privacy, - icon: "ph-lock-open ph-bold ph-lg", + icon: "ph-keyhole ph-bold ph-lg", }); From be67a5e599dfeafea9c11bf66221815b30b82288 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Thu, 13 Jul 2023 17:38:44 -0700 Subject: [PATCH 108/162] fix: :lipstick: mkdonation bg --- packages/client/src/components/MkDonation.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/client/src/components/MkDonation.vue b/packages/client/src/components/MkDonation.vue index 49a0115a1..5dab6b614 100644 --- a/packages/client/src/components/MkDonation.vue +++ b/packages/client/src/components/MkDonation.vue @@ -137,6 +137,7 @@ function openExternal(link) { From 6072ec92ab6ce2a461a4b148eff48fe1b57edbf6 Mon Sep 17 00:00:00 2001 From: naskya Date: Fri, 14 Jul 2023 21:48:13 +0000 Subject: [PATCH 124/162] nowrap tab texts in MkNoteDetailed --- packages/client/src/components/MkNoteDetailed.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNoteDetailed.vue b/packages/client/src/components/MkNoteDetailed.vue index 7b571d8b2..3dfac1f0c 100644 --- a/packages/client/src/components/MkNoteDetailed.vue +++ b/packages/client/src/components/MkNoteDetailed.vue @@ -33,7 +33,12 @@ detailedView > - +