From 6db3766505e7477437eb799796bf285e0c0d1fbf Mon Sep 17 00:00:00 2001 From: Kainoa Kanter <kainoa@t1c.dev> Date: Wed, 15 Mar 2023 04:20:29 +0000 Subject: [PATCH 001/309] Update 'package.json' --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bf5c1db69e..a9f8c8670b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.2.0-rc", + "version": "13.2.0-beta", "codename": "aqua", "repository": { "type": "git", From 6e898249ef76a14993d8869e2156f2ab13780f2f Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 23 Mar 2023 17:50:30 -0700 Subject: [PATCH 002/309] beta 31 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9f943fa287..83a2c44a8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.2.0-beta3", + "version": "13.2.0-beta31", "codename": "aqua", "repository": { "type": "git", From 00e2b09f994df57a9a45381ea5de5e593614d2b5 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 13:24:25 -0700 Subject: [PATCH 003/309] fix: add cargo to DOCKERFILE --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 118bf7cd41..c599f8751b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM node:19-alpine as build WORKDIR /calckey # Install compilation dependencies -RUN apk add --no-cache --no-progress git alpine-sdk python3 rust +RUN apk add --no-cache --no-progress git alpine-sdk python3 rust cargo # Copy only the dependency-related files first, to cache efficiently COPY package.json pnpm*.yaml ./ From 8c10084335c3c5e6e399023cdec3d7faa3a5df7a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 16:13:17 -0700 Subject: [PATCH 004/309] fix #9784 --- packages/client/src/components/MkEmojiPicker.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkEmojiPicker.vue b/packages/client/src/components/MkEmojiPicker.vue index 7daf2dabfd..2790965db3 100644 --- a/packages/client/src/components/MkEmojiPicker.vue +++ b/packages/client/src/components/MkEmojiPicker.vue @@ -46,7 +46,7 @@ </section> <section> - <header><i class="ph-alarm ph-bold ph-fw ph-lg"></i> {{ i18n.ts.recentUsed }}</header> + <header class="_acrylic"><i class="ph-alarm ph-bold ph-fw ph-lg"></i> {{ i18n.ts.recentUsed }}</header> <div class="body"> <button v-for="emoji in recentlyUsedEmojis" From 590aa544c16e5098ac36d18b44b45c9e141bc789 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 16:18:01 -0700 Subject: [PATCH 005/309] fix help button alignment iconsOnly --- packages/client/src/ui/_common_/navbar.vue | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue index c08f42641d..06f8789646 100644 --- a/packages/client/src/ui/_common_/navbar.vue +++ b/packages/client/src/ui/_common_/navbar.vue @@ -439,6 +439,20 @@ function more(ev: MouseEvent) { } } + > .help { + position: relative; + display: block; + text-align: center; + width: 100%; + margin-top: 1rem; + + > .icon { + display: inline-block; + width: 38px; + aspect-ratio: 1; + } + } + > .instance { position: relative; display: block; From 007b84a877d2dc74e18542f71f4db53e954eed94 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@mx.a-ef.org> Date: Sat, 1 Apr 2023 16:40:28 -0400 Subject: [PATCH 006/309] following en-US --- locales/ja-JP.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 0bdc4af1db..c2171c383a 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -96,7 +96,7 @@ unfollow: "フォロー解除" followRequestPending: "フォロー許可待ち" enterEmoji: "絵文字を入力" renote: "ブースト" -renoteAsUnlisted: "ホームにブースト" +renoteAsUnlisted: "未収載でブースト" renoteToFollowers: "フォロワー限定でブースト" renoteToRecipients: "宛先のユーザーにブースト" unrenote: "ブースト解除" @@ -800,6 +800,7 @@ previewNoteText: "本文をプレビュー" customCss: "カスタムCSS" customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。" global: "グローバル" +recommended: "推奨" squareAvatars: "アイコンを四角形で表示" seperateRenoteQuote: "ブーストと引用ボタンを分ける" sent: "送信" @@ -878,7 +879,6 @@ recentNHours: "直近{n}時間" recentNDays: "直近{n}日" noEmailServerWarning: "メールサーバーの設定がされていません。" thereIsUnresolvedAbuseReportWarning: "未対応の通報があります。" -recommended: "推奨" check: "チェック" driveCapOverrideLabel: "このユーザーのドライブ容量上限を変更" driveCapOverrideCaption: "0以下を指定すると解除されます。" @@ -942,6 +942,9 @@ moveFromDescription: "別のアカウントからこのアカウントにフォ migrationConfirm: "本当にこのアカウントを {account} に引っ越しますか?一度引っ越しを行うと取り消せず、二度とこのアカウントを元の状態で使用することはできません。\nまた、引っ越し先のアカウントでエイリアスを作成したことを確認してください。" defaultReaction: "リモートとローカルの投稿に対するデフォルトの絵文字リアクション" license: "ライセンス" +indexPosts: "投稿をインデックス" +indexFrom: "この投稿ID以降をインデックスする(空白で全ての投稿を指定します)" +indexNotice: "インデックス中です。完了まで時間がかかる可能性があるため、少なくとも一時間はサーバーを再起動しないでください。" customKaTeXMacro: "カスタムKaTeXマクロ" customKaTeXMacroDescription: "数式入力を楽にするためのマクロを設定しましょう!記法はLaTeXにおけるコマンドの定義と同様に \\newcommand{\\name}{content} または \\newcommand{\\add}[2]{#1 + #2} のように記述します。後者の例では \\add{3}{foo} が 3 + foo に展開されます。また、マクロの名前を囲む波括弧を丸括弧 () および角括弧 [] に変更した場合、マクロの引数に使用する括弧が変更されます。マクロの定義は一行に一つのみで、途中で改行はできません。マクロの定義が無効な行は無視されます。文字列を単純に置換する機能のみに対応していて、条件分岐などの高度な構文は使用できません。" enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" @@ -1119,7 +1122,7 @@ _channel: usersCount: "{n}人が参加中" notesCount: "{n}投稿があります" _messaging: - dms: "ディーエム" + dms: "プライベート" groups: "グループ" _menuDisplay: sideFull: "横" @@ -1379,7 +1382,7 @@ _poll: _visibility: public: "パブリック" publicDescription: "全てのユーザーに公開" - home: "ホーム" + home: "未収載" homeDescription: "ホームタイムラインのみに公開" followers: "フォロワー" followersDescription: "自分のフォロワーのみに公開" @@ -1788,9 +1791,9 @@ _deck: swapDown: "下に移動" stackLeft: "左に重ねる" popRight: "右に出す" - profile: "プロファイル" - newProfile: "新規プロファイル" - deleteProfile: "プロファイルを削除" + profile: "ワークスペース" + newProfile: "新規ワークスペース" + deleteProfile: "ワークスペースを削除" introduction: "カラムを組み合わせて自分だけのインターフェイスを作りましょう!" introduction2: "画面の右にある + を押して、いつでもカラムを追加できます。" widgetsIntroduction: "カラムのメニューから、「ウィジェットの編集」を選択してウィジェットを追加してください" From f1f067010009035aef37322afcbc3d6634370350 Mon Sep 17 00:00:00 2001 From: naskya <m@naskya.net> Date: Sun, 2 Apr 2023 07:34:59 +0900 Subject: [PATCH 007/309] Update Japanese locale --- locales/ja-JP.yml | 82 +++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index c2171c383a..5c12b17b51 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1,14 +1,14 @@ --- _lang_: "日本語" headlineMisskey: "ずっと無料でオープンソースの非中央集権型ソーシャルメディアプラットフォーム🚀" -introMisskey: "ようこそ!Calckeyは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆の投稿に素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀" +introMisskey: "ようこそ!Calckeyは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n「リアクション」機能で、皆の投稿に素早く反応を追加できます👍\n新しい世界を探検しよう🚀" monthAndDay: "{month}月 {day}日" search: "検索" notifications: "通知" username: "ユーザー名" password: "パスワード" -forgotPassword: "パスワードを忘れた" -fetchingAsApObject: "連合に照会中" +forgotPassword: "パスワードを忘れました" +fetchingAsApObject: "連合宇宙から取得中" ok: "OK" gotIt: "わかった!" cancel: "キャンセル" @@ -45,7 +45,7 @@ copyContent: "内容をコピー" copyLink: "リンクをコピー" delete: "削除" deleteAndEdit: "削除して編集" -deleteAndEditConfirm: "この投稿を削除してもう一度編集しますか?この投稿へのリアクション、ブースト、返信も全て削除されます。" +deleteAndEditConfirm: "この投稿を削除してもう一度編集しますか?この投稿へのリアクション、ブースト、返信は全て失われます。" addToList: "リストに追加" sendMessage: "メッセージを送信" copyUsername: "ユーザー名をコピー" @@ -141,14 +141,14 @@ emojiUrl: "絵文字画像URL" addEmoji: "絵文字を追加" settingGuide: "おすすめ設定" cacheRemoteFiles: "リモートのファイルをキャッシュする" -cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。" +cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクします。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。" flagAsBot: "Botとして設定" -flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Calckeyのシステム上での扱いがBotに合ったものになります。" +flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Calckeyのシステム上での扱いがBotに合ったものになります。" flagAsCat: "あなたは…猫?😺" flagAsCatDescription: "このアカウントが猫であることを示す場合は、このフラグをオンにします。" flagShowTimelineReplies: "タイムラインに投稿の返信を表示する" -flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーの投稿以外にもそのユーザーの他の投稿への返信を表示します。" -autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認" +flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーの他の投稿への返信も表示されます。" +autoAcceptFollowed: "フォローしているユーザーからのフォロー申請を自動承認" addAccount: "アカウントを追加" loginFailed: "ログインに失敗しました" showOnRemote: "リモートで表示" @@ -295,7 +295,7 @@ emptyDrive: "ドライブは空です" emptyFolder: "フォルダーは空です" unableToDelete: "削除できません" inputNewFileName: "新しいファイル名を入力してください" -inputNewDescription: "新しいキャプションを入力してください" +inputNewDescription: "新しい説明を入力してください" inputNewFolderName: "新しいフォルダ名を入力してください" circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。" hasChildFilesOrFolders: "このフォルダは空でないため、削除できません。" @@ -332,7 +332,7 @@ disconnectService: "切断する" enableLocalTimeline: "ローカルタイムラインを有効にする" enableGlobalTimeline: "グローバルタイムラインを有効にする" enableRecommendedTimeline: "おすすめタイムラインを有効にする" -disablingTimelinesInfo: "これらのタイムラインを無効化しても、利便性のため管理者およびモデレーターは引き続き利用することができます。" +disablingTimelinesInfo: "これらのタイムラインを無効化しても、利便性のため管理者およびモデレーターは引き続き利用できます。" registration: "登録" enableRegistration: "誰でも新規登録できるようにする" invite: "招待" @@ -566,8 +566,8 @@ disablePlayer: "プレイヤーを閉じる" expandTweet: "ツイートを展開する" themeEditor: "テーマエディター" description: "説明" -describeFile: "キャプションを付ける" -enterFileDescription: "キャプションを入力" +describeFile: "説明を付ける" +enterFileDescription: "説明を入力" author: "作者" leaveConfirm: "未保存の変更があります。破棄しますか?" manage: "管理" @@ -679,7 +679,7 @@ driveFilesCount: "ドライブのファイル数" driveUsage: "ドライブ使用量" noCrawle: "クローラーによるインデックスを拒否" noCrawleDescription: "検索エンジンにあなたのプロフィールや投稿、ページなどのコンテンツを登録(インデックス)しないよう要請します。" -lockedAccountInfo: "フォローを承認制にしても、投稿の公開範囲を「フォロワー」にしない限り、誰でもあなたの投稿を見ることができます。" +lockedAccountInfo: "フォローを承認制にしても、投稿の公開範囲を「フォロワー」にしない限り、誰でもあなたの投稿を見られます。" alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にする" loadRawImages: "添付画像のサムネイルをオリジナル画質にする" disableShowingAnimatedImages: "アニメーション画像を再生しない" @@ -710,7 +710,7 @@ onlineUsersCount: "{n}人がオンライン" nUsers: "{n}ユーザー" nNotes: "{n}投稿" sendErrorReports: "エラーリポートを送信" -sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がCalckeyに共有され、ソフトウェアの品質向上に役立てることができます。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。" +sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がCalckeyに共有され、ソフトウェアの品質向上に役立てられます。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。" myTheme: "マイテーマ" backgroundColor: "背景" accentColor: "アクセント" @@ -749,7 +749,7 @@ unlikeConfirm: "いいね解除しますか?" fullView: "フルビュー" quitFullView: "フルビュー解除" addDescription: "説明を追加" -userPagePinTip: "個々の投稿のメニューから「ピン留め」を選択することで、ここに投稿を表示しておくことができます。" +userPagePinTip: "個々の投稿のメニューから「ピン留め」を選択することで、ここに投稿を表示できます。" notSpecifiedMentionWarning: "宛先に含まれていないメンションがあります" info: "情報" userInfo: "ユーザー情報" @@ -793,7 +793,7 @@ secureMode: "セキュアモード (Authorized Fetch)" instanceSecurity: "インスタンスのセキュリティー" secureModeInfo: "他のインスタンスからリクエストするときに、証明を付けなければ返送しません。他のインスタンスの設定ファイルでsignToActivityPubGetはtrueにしてください。" privateMode: "非公開モード" -privateModeInfo: "有効にして、許可されているインスタンスのみがリクエストできます。すべての投稿が公開に非表示にします。" +privateModeInfo: "有効にすると、許可したインスタンスのみからリクエストを受け付けます。" allowedInstances: "許可されたインスタンス" allowedInstancesDescription: "許可したいインスタンスのホストを改行で区切って設定します。非公開モードだけで有効です。" previewNoteText: "本文をプレビュー" @@ -815,7 +815,7 @@ whatIsNew: "更新情報を見る" translate: "翻訳" translatedFrom: "{x}から翻訳" accountDeletionInProgress: "アカウントの削除が進行中です" -usernameInfo: "サーバー上であなたのアカウントを一意に識別するための名前。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できます。ユーザー名は後から変更することは出来ません。" +usernameInfo: "サーバー上であなたのアカウントを一意に識別するための名前です。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できます。ユーザー名は後から変更できません。" aiChanMode: "藍モード(クラシックUI)" enterSendsMessage: "メッセージングでReturnキーを押すと、メッセージが送信されます(デフォルトはCtrl + Returnです)" keepCw: "CWを維持する" @@ -929,7 +929,7 @@ splash: "スプラッシュスクリーン" updateAvailable: "アップデートがありますよ!" swipeOnDesktop: "デスクトップでモバイルスタイルのスワイプを可能にする" logoImageUrl: "ロゴのURL" -showAdminUpdates: "新しいCalckeyのバージョンが利用可能であることを示す(管理者のみ)" +showAdminUpdates: "新しいCalckeyのバージョンが利用可能なときに通知する(管理者のみ)" replayTutorial: "もう一度チュートリアルを見る" migration: "アカウントの引っ越し" moveTo: "このアカウントを新しいアカウントに引っ越す" @@ -939,7 +939,7 @@ moveAccountDescription: "この操作は取り消せません。まずは引っ moveFrom: "別のアカウントからこのアカウントに引っ越す" moveFromLabel: "引っ越し元のアカウント:" moveFromDescription: "別のアカウントからこのアカウントにフォロワーを引き継いで引っ越したい場合、ここでエイリアスを作成しておく必要があります。必ず引っ越しを実行する前に作成してください!引っ越し元のアカウントをこのように入力してください:@person@instance.com" -migrationConfirm: "本当にこのアカウントを {account} に引っ越しますか?一度引っ越しを行うと取り消せず、二度とこのアカウントを元の状態で使用することはできません。\nまた、引っ越し先のアカウントでエイリアスを作成したことを確認してください。" +migrationConfirm: "本当にこのアカウントを {account} に引っ越しますか?一度引っ越しを行うと取り消せず、二度とこのアカウントを元の状態で使用できなくなります。\nまた、引っ越し先のアカウントでエイリアスを作成したことを確認してください。" defaultReaction: "リモートとローカルの投稿に対するデフォルトの絵文字リアクション" license: "ライセンス" indexPosts: "投稿をインデックス" @@ -950,7 +950,7 @@ customKaTeXMacroDescription: "数式入力を楽にするためのマクロを enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" _sensitiveMediaDetection: - description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てることができます。サーバーの負荷が少し増えます。" + description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" sensitivity: "検出感度" sensitivityDescription: "感度を低くすると、誤検知(偽陽性)が減ります。感度を高くすると、検知漏れ(偽陰性)が減ります。" setSensitiveFlagAutomatically: "NSFWフラグを設定する" @@ -974,9 +974,9 @@ _signup: _accountDelete: accountDelete: "アカウントの削除" mayTakeTime: "アカウントの削除は負荷のかかる処理であるため、作成したコンテンツの数やアップロードしたファイルの数が多いと完了までに時間がかかることがあります。" - sendEmail: "アカウントの削除が完了する際は、登録してあったメールアドレス宛に通知を送信します。" + sendEmail: "アカウントの削除が完了した際に、登録されていたメールアドレス宛に通知を送信します。" requestAccountDelete: "アカウント削除をリクエスト" - started: "削除処理が開始されました。" + started: "削除処理を開始しました。" inProgress: "削除が進行中" _ad: back: "戻る" @@ -1015,7 +1015,7 @@ _preferencesBackups: noBackups: "バックアップはありません。「新規保存」で現在のクライアント設定をサーバーに保存できます。" createdAt: "作成日時: {date} {time}" updatedAt: "更新日時: {date} {time}" - cannotLoad: "読み込みできません" + cannotLoad: "読み込めません。" invalidFile: "ファイル形式が違います。" _registry: scope: "スコープ" @@ -1041,19 +1041,19 @@ _mfm: intro: "MFMは、MisskeyやCalckey、Akkomaなどの様々な場所で使用できるマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。" dummy: "CalckeyでFediverseの世界が広がります" mention: "メンション" - mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示すことができます。" + mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示せます。" hashtag: "ハッシュタグ" - hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示すことができます。" + hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示せます。" url: "URL" - urlDescription: "URLを示すことができます。" + urlDescription: "URLを示せます。" link: "リンク" - linkDescription: "文章の特定の範囲を、URLに紐づけることができます。" + linkDescription: "文章の特定の範囲を、URLに紐づけられます。" bold: "太字" - boldDescription: "文字を太く表示して強調することができます。" + boldDescription: "文字を太く表示して強調できます。" small: "目立たなく" - smallDescription: "内容を小さく・薄く表示させることができます。" + smallDescription: "内容を小さく・薄く表示させられます。" center: "中央寄せ" - centerDescription: "内容を中央寄せで表示させることができます。" + centerDescription: "内容を中央寄せで表示させられます。" inlineCode: "コード(インライン)" inlineCodeDescription: "プログラムなどのコードをインラインでシンタックスハイライトします。" blockCode: "コード(ブロック)" @@ -1063,11 +1063,11 @@ _mfm: blockMath: "数式(ブロック)" blockMathDescription: "複数行の数式(KaTeX)をブロックで表示します。" quote: "引用" - quoteDescription: "内容が引用であることを示すことができます。" + quoteDescription: "内容が引用であることを示せます。" emoji: "カスタム絵文字" - emojiDescription: "コロンでカスタム絵文字名を囲むと、カスタム絵文字を表示させることができます。" + emojiDescription: "コロンでカスタム絵文字名を囲むと、カスタム絵文字を表示させられます。" search: "検索" - searchDescription: "入力済み検索ボックスを表示させることができます。" + searchDescription: "検索ボックスを表示させられます。" flip: "反転" flipDescription: "内容を上下または左右に反転させます。" jelly: "アニメーション(びよんびよん)" @@ -1093,7 +1093,7 @@ _mfm: blur: "ぼかし" blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。" font: "フォント" - fontDescription: "内容のフォントを指定することができます。" + fontDescription: "内容のフォントを指定できます。" rainbow: "レインボー" rainbowDescription: "内容をレインボーにします。" sparkle: "キラキラ" @@ -1252,11 +1252,11 @@ _tutorial: step4_2: "最初は{introduction}に投稿したり、シンプルに「こんにちは、アカウント作ってみました!」などの投稿をする人もいます。" step5_1: "タイムライン、タイムラインだらけ!" step5_2: "あなたのインスタンスでは{timelines}種類のタイムラインが有効になっています。" - step5_3: "ホーム{icon}タイムラインでは、あなたがフォローしているアカウントとこのインスタンスのみんなの投稿を見ることができます。もしフォローしているアカウントの投稿だけ見たい場合は、設定から変更できます。" - step5_4: "ローカル{icon}タイムラインでは、このインスタンスのみんなの投稿を見ることができます。" - step5_5: "ソーシャル{icon}タイムラインでは、あなたがフォローしているアカウントの投稿を見ることができます。" - step5_6: "おすすめ{icon}タイムラインでは、管理人がおすすめするインスタンスの投稿を見ることができます。" - step5_7: "グローバル{icon}タイムラインでは、接続している他のすべてのインスタンスからの投稿を見ることができます。" + step5_3: "ホーム{icon}タイムラインでは、あなたがフォローしているアカウントとこのインスタンスのみんなの投稿を見られます。もしフォローしているアカウントの投稿だけ見たい場合は、設定から変更できます。" + step5_4: "ローカル{icon}タイムラインでは、このインスタンスにいるみんなの投稿を見られます。" + step5_5: "ソーシャル{icon}タイムラインでは、あなたがフォローしているアカウントの投稿を見られます。" + step5_6: "おすすめ{icon}タイムラインでは、管理人がおすすめするインスタンスの投稿を見られます。" + step5_7: "グローバル{icon}タイムラインでは、接続している他のすべてのインスタンスからの投稿を見られます。" step6_1: "じゃあ、ここはどんな場所なの?" step6_2: "実は、あなたはただCalckeyに参加しただけではありません。ここは、何千もの相互接続されたサーバーが構成する Fediverse への入口です。各サーバーは「インスタンス」と呼ばれます。" step6_3: "それぞれのサーバーでは必ずしもCalckeyが使われているわけではなく、異なる動作をするサーバーもあります。しかし、あなたは他のサーバーのアカウントもフォローしたり、返信・ブーストができます。一見難しそうですが大丈夫!すぐ慣れます。" @@ -1405,10 +1405,10 @@ _profile: name: "名前" username: "ユーザー名" description: "自己紹介" - youCanIncludeHashtags: "ハッシュタグを含めることができます。" + youCanIncludeHashtags: "ハッシュタグを含められます。" metadata: "追加情報" metadataEdit: "追加情報を編集" - metadataDescription: "プロフィールに表として追加情報を表示することができます。" + metadataDescription: "プロフィールに表として追加情報を表示できます。" metadataLabel: "ラベル" metadataContent: "内容" changeAvatar: "アバター画像を変更" From 91b946bda5b67950eaa591ac539d0732b28a4024 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@mx.a-ef.org> Date: Sat, 1 Apr 2023 19:20:39 -0400 Subject: [PATCH 008/309] change "quote attached" to "quote" --- locales/ja-JP.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 5c12b17b51..fe2eb6f4d2 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -433,7 +433,7 @@ next: "次へ" retype: "再入力" noteOf: "{user}の投稿" inviteToGroup: "グループに招待" -quoteAttached: "引用付き" +quoteAttached: "引用" quoteQuestion: "引用として添付しますか?" noMessagesYet: "まだチャットはありません" newMessageExists: "新しいメッセージがあります" From eb820fe471e1ce653023d2da5ac5eb41484745d4 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@mx.a-ef.org> Date: Sat, 1 Apr 2023 19:43:32 -0400 Subject: [PATCH 009/309] follow mastodon translation --- locales/ja-JP.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fe2eb6f4d2..0494c777c4 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -658,7 +658,7 @@ optional: "任意" createNewClip: "新しいクリップを作成" unclip: "クリップ解除" confirmToUnclipAlreadyClippedNote: "この投稿はすでにクリップ「{name}」に含まれています。投稿をこのクリップから除外しますか?" -public: "パブリック" +public: "公開" i18nInfo: "Calckeyは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。" manageAccessTokens: "アクセストークンの管理" accountInfo: "アカウント情報" @@ -1380,7 +1380,7 @@ _poll: remainingMinutes: "終了まであと{m}分{s}秒" remainingSeconds: "終了まであと{s}秒" _visibility: - public: "パブリック" + public: "公開" publicDescription: "全てのユーザーに公開" home: "未収載" homeDescription: "ホームタイムラインのみに公開" From ba8041d333f070547d28a073538d1f2bbe563ea0 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@mx.a-ef.org> Date: Sat, 1 Apr 2023 19:56:21 -0400 Subject: [PATCH 010/309] fix indexing description --- locales/ja-JP.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 0494c777c4..34dc974893 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -944,7 +944,7 @@ defaultReaction: "リモートとローカルの投稿に対するデフォル license: "ライセンス" indexPosts: "投稿をインデックス" indexFrom: "この投稿ID以降をインデックスする(空白で全ての投稿を指定します)" -indexNotice: "インデックス中です。完了まで時間がかかる可能性があるため、少なくとも一時間はサーバーを再起動しないでください。" +indexNotice: "インデックスを開始しました。完了まで時間がかかる場合があるため、少なくとも1時間はサーバーを再起動しないでください。" customKaTeXMacro: "カスタムKaTeXマクロ" customKaTeXMacroDescription: "数式入力を楽にするためのマクロを設定しましょう!記法はLaTeXにおけるコマンドの定義と同様に \\newcommand{\\name}{content} または \\newcommand{\\add}[2]{#1 + #2} のように記述します。後者の例では \\add{3}{foo} が 3 + foo に展開されます。また、マクロの名前を囲む波括弧を丸括弧 () および角括弧 [] に変更した場合、マクロの引数に使用する括弧が変更されます。マクロの定義は一行に一つのみで、途中で改行はできません。マクロの定義が無効な行は無視されます。文字列を単純に置換する機能のみに対応していて、条件分岐などの高度な構文は使用できません。" enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" From 342ed96b6c956a7bcb50e5a19265513bbc491575 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 21:04:15 -0700 Subject: [PATCH 011/309] fix: :passport_control: no longer need 2fa for webauthn --- .../src/server/api/endpoints/i/2fa/register-key.ts | 6 +++--- packages/client/src/components/MkDialog.vue | 1 + packages/client/src/pages/settings/2fa.vue | 8 +++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts index 8c0af28ee4..96239b56de 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts @@ -32,9 +32,9 @@ export default define(meta, paramDef, async (ps, user) => { throw new Error("incorrect password"); } - if (!profile.twoFactorEnabled) { - throw new Error("2fa not enabled"); - } + // if (!profile.twoFactorEnabled) { + // throw new Error("2fa not enabled"); + // } // 32 byte challenge const entropy = await randomBytes(32); diff --git a/packages/client/src/components/MkDialog.vue b/packages/client/src/components/MkDialog.vue index 5d5ca1e8d2..708db22efe 100644 --- a/packages/client/src/components/MkDialog.vue +++ b/packages/client/src/components/MkDialog.vue @@ -13,6 +13,7 @@ <MkLoading v-else-if="type === 'waiting'" :class="$style.iconInner" :em="true"/> </div> <header v-if="title" :class="$style.title"><Mfm :text="title"/></header> + <header v-if="title == null && input.type === 'password'" :class="$style.title"><Mfm :text="i18n.ts.password"/></header> <div v-if="text" :class="$style.text"><Mfm :text="text"/></div> <MkInput v-if="input && input.type !== 'paragraph'" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder || undefined" @keydown="onInputKeydown"> <template v-if="input.type === 'password'" #prefix><i class="ph-password ph-bold ph-lg"></i></template> diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue index 71a76c7164..bb3862b4bd 100644 --- a/packages/client/src/pages/settings/2fa.vue +++ b/packages/client/src/pages/settings/2fa.vue @@ -4,7 +4,9 @@ <template v-if="$i.twoFactorEnabled"> <p>{{ i18n.ts._2fa.alreadyRegistered }}</p> <MkButton @click="unregister">{{ i18n.ts.unregister }}</MkButton> + </template> + <template> <template v-if="supportsCredentials"> <hr class="totp-method-sep"> @@ -20,7 +22,7 @@ <MkSwitch v-if="$i.securityKeysList.length > 0" v-model="usePasswordLessLogin" @update:modelValue="updatePasswordLessLogin">{{ i18n.ts.passwordLessLogin }}</MkSwitch> - <MkInfo v-if="registration && registration.error" warn>{{ i18n.ts.error }} {{ registration.error }}</MkInfo> + <MkInfo v-if="registration && registration.error" style="margin-bottom: 1rem;" warn>{{ i18n.ts.error }}: {{ registration.error }}</MkInfo> <MkButton v-if="!registration || registration.error" @click="addSecurityKey">{{ i18n.ts._2fa.registerKey }}</MkButton> <ol v-if="registration && !registration.error"> @@ -45,7 +47,7 @@ <li> <I18n :src="i18n.ts._2fa.step1" tag="span"> <template #a> - <a href="https://authy.com/" rel="noopener" target="_blank" class="_link">Authy</a> + <a href="https://authpass.app/" rel="noopener" target="_blank" class="_link">AuthPass</a> </template> <template #b> <a href="https://support.google.com/accounts/answer/1066447" rel="noopener" target="_blank" class="_link">Google Authenticator</a> @@ -140,7 +142,7 @@ function registerKey() { attestationObject: hexify(registration.value.credential.response.attestationObject) }).then(key => { registration.value = null; - key.lastUsed = new Date(); + key!.lastUsed = new Date(); os.success(); }); } From b784874b55777fa625bb65767a72a2d66770f033 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 21:06:10 -0700 Subject: [PATCH 012/309] dev22 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e01cd696b5..aafdd7beab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.2.0-beta4", + "version": "13.2.0-beta5", "codename": "aqua", "repository": { "type": "git", From 19c69c5048ccef906f28ba3d8c7a000630ff4c3a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 21:10:31 -0700 Subject: [PATCH 013/309] chore: :art: format --- packages/backend/src/models/repositories/note.ts | 9 +++------ .../backend/src/server/api/stream/channels/channel.ts | 3 +-- .../backend/src/server/api/stream/channels/messaging.ts | 3 +-- packages/backend/src/server/web/cli.js | 6 +++--- packages/backend/src/services/chart/core.ts | 8 ++++++-- packages/client/src/scripts/helpMenu.ts | 2 +- packages/client/src/scripts/sound.ts | 3 ++- packages/client/src/types/menu.ts | 9 ++++++++- 8 files changed, 25 insertions(+), 18 deletions(-) diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts index ce589e1738..b99ce16350 100644 --- a/packages/backend/src/models/repositories/note.ts +++ b/packages/backend/src/models/repositories/note.ts @@ -266,10 +266,8 @@ export const NoteRepository = db.getRepository(Note).extend({ if (packed.user.isCat && packed.text) { const tokens = packed.text ? mfm.parse(packed.text) : []; function nyaizeNode(node: mfm.MfmNode) { - if (node.type === "quote") - return; - if (node.type === "text") - node.props.text = nyaize(node.props.text); + if (node.type === "quote") return; + if (node.type === "text") node.props.text = nyaize(node.props.text); if (node.children) { for (const child of node.children) { @@ -278,8 +276,7 @@ export const NoteRepository = db.getRepository(Note).extend({ } } - for (const node of tokens) - nyaizeNode(node); + for (const node of tokens) nyaizeNode(node); packed.text = mfm.toString(tokens); } diff --git a/packages/backend/src/server/api/stream/channels/channel.ts b/packages/backend/src/server/api/stream/channels/channel.ts index 5a0f709815..d2a2269a47 100644 --- a/packages/backend/src/server/api/stream/channels/channel.ts +++ b/packages/backend/src/server/api/stream/channels/channel.ts @@ -57,8 +57,7 @@ export default class extends Channel { // Remove not typing users for (const [userId, date] of Object.entries(this.typers)) { - if (now.getTime() - date.getTime() > 5000) - this.typers.delete(userId); + if (now.getTime() - date.getTime() > 5000) this.typers.delete(userId); } const userIds = Array.from(this.typers.keys()); diff --git a/packages/backend/src/server/api/stream/channels/messaging.ts b/packages/backend/src/server/api/stream/channels/messaging.ts index f20b1ead18..0622bd4649 100644 --- a/packages/backend/src/server/api/stream/channels/messaging.ts +++ b/packages/backend/src/server/api/stream/channels/messaging.ts @@ -108,8 +108,7 @@ export default class extends Channel { // Remove not typing users for (const [userId, date] of this.typers.entries()) { - if (now.getTime() - date.getTime() > 5000) - this.typers.delete(userId); + if (now.getTime() - date.getTime() > 5000) this.typers.delete(userId); } const userIds = Array.from(this.typers.keys()); diff --git a/packages/backend/src/server/web/cli.js b/packages/backend/src/server/web/cli.js index ca1c233759..85a61a2446 100644 --- a/packages/backend/src/server/web/cli.js +++ b/packages/backend/src/server/web/cli.js @@ -47,10 +47,10 @@ window.onload = async () => { const el = document.createElement("div"); const header = document.createElement("header"); const name = document.createElement("p"); - const avatar = document.createElement("img") + const avatar = document.createElement("img"); name.textContent = `${note.user.name} @${note.user.username}`; avatar.src = note.user.avatarUrl; - avatar.style = 'height: 40px' + avatar.style = "height: 40px"; const text = document.createElement("div"); text.textContent = `${note.text}`; el.appendChild(header); @@ -63,7 +63,7 @@ window.onload = async () => { for (const file of note.files) { const img = document.createElement("img"); img.src = file.properties.thumbnailUrl; - el.appendChild(img) + el.appendChild(img); } } tl.appendChild(el); diff --git a/packages/backend/src/services/chart/core.ts b/packages/backend/src/services/chart/core.ts index 207d8a93c3..36fe373269 100644 --- a/packages/backend/src/services/chart/core.ts +++ b/packages/backend/src/services/chart/core.ts @@ -556,7 +556,11 @@ export default abstract class Chart<T extends Schema> { // bake unique count for (const [k, v] of Object.entries(finalDiffs)) { - if (this.schema[k].uniqueIncrement && Array.isArray(v) && v.length > 0) { + if ( + this.schema[k].uniqueIncrement && + Array.isArray(v) && + v.length > 0 + ) { const name = (columnPrefix + k.replaceAll(".", columnDot)) as keyof Columns<T>; const tempColumnName = (uniqueTempColumnPrefix + @@ -660,7 +664,7 @@ export default abstract class Chart<T extends Schema> { const startTime = Date.now(); await Promise.all( - groups.map((group) => + groups.map((group) => limit(() => Promise.all([ this.claimCurrentLog(group, "hour"), diff --git a/packages/client/src/scripts/helpMenu.ts b/packages/client/src/scripts/helpMenu.ts index 56d3658e23..aca9d6e70c 100644 --- a/packages/client/src/scripts/helpMenu.ts +++ b/packages/client/src/scripts/helpMenu.ts @@ -67,6 +67,6 @@ export function openHelpMenu_(ev: MouseEvent) { ], }, ], - ev.currentTarget ?? ev.target + ev.currentTarget ?? ev.target, ); } diff --git a/packages/client/src/scripts/sound.ts b/packages/client/src/scripts/sound.ts index 07d543a33b..84388b81ca 100644 --- a/packages/client/src/scripts/sound.ts +++ b/packages/client/src/scripts/sound.ts @@ -30,7 +30,8 @@ export function play(type: string) { export function playFile(file: string, volume: number) { const masterVolume = ColdDeviceStorage.get("sound_masterVolume"); - if (masterVolume === 0 || volume === 0 || file.toLowerCase().includes("none")) return; + if (masterVolume === 0 || volume === 0 || file.toLowerCase().includes("none")) + return; const audio = setVolume(getAudio(file), volume); audio.play(); diff --git a/packages/client/src/types/menu.ts b/packages/client/src/types/menu.ts index a7ce81c714..4a0a9061e9 100644 --- a/packages/client/src/types/menu.ts +++ b/packages/client/src/types/menu.ts @@ -90,7 +90,14 @@ type OuterMenuItem = | MenuButtonMultipleIcons | MenuParent; type OuterPromiseMenuItem = Promise< - MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton | MenuButtonMultipleIcons | MenuParent + | MenuLabel + | MenuLink + | MenuA + | MenuUser + | MenuSwitch + | MenuButton + | MenuButtonMultipleIcons + | MenuParent >; export type MenuItem = OuterMenuItem | OuterPromiseMenuItem; export type InnerMenuItem = From a634d715f9a2c5c16060d1cdb1f78e73b5791bb5 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 21:18:23 -0700 Subject: [PATCH 014/309] chore: remove okteto --- .okteto/okteto-pipeline.yml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .okteto/okteto-pipeline.yml diff --git a/.okteto/okteto-pipeline.yml b/.okteto/okteto-pipeline.yml deleted file mode 100644 index e2996fbbc9..0000000000 --- a/.okteto/okteto-pipeline.yml +++ /dev/null @@ -1,6 +0,0 @@ -build: - misskey: - args: - - NODE_ENV=development -deploy: - - helm upgrade --install misskey chart --set image=${OKTETO_BUILD_MISSKEY_IMAGE} --set url="https://misskey-$(kubectl config view --minify -o jsonpath='{..namespace}').cloud.okteto.net" --set environment=development From 75d6d20454790b1438dbfe424d382123a435c279 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 21:37:47 -0700 Subject: [PATCH 015/309] plans --- CALCKEY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CALCKEY.md b/CALCKEY.md index 525bccf286..6121323ece 100644 --- a/CALCKEY.md +++ b/CALCKEY.md @@ -6,6 +6,7 @@ - [DragonflyDB](https://dragonflydb.io/) support as a Redis alternative - Optionally use [ScyllaDB](https://www.scylladb.com/open-source-nosql-database/) for storing notes - Rewrite backend in Rust and [Axum](https://github.com/tokio-rs/axum) + - Use [Magic ReGeXP](https://regexp.dev/) for ReGeX 🦄 - Function - Federate with note edits - User "choices" (recommended users) like Mastodon and Soapbox From 148eb80595cddbf26273f08f69a0dea684bd442e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 21:39:48 -0700 Subject: [PATCH 016/309] don't need extra template --- packages/client/src/pages/settings/2fa.vue | 58 +++++++++++----------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue index bb3862b4bd..acbd174807 100644 --- a/packages/client/src/pages/settings/2fa.vue +++ b/packages/client/src/pages/settings/2fa.vue @@ -6,41 +6,39 @@ <MkButton @click="unregister">{{ i18n.ts.unregister }}</MkButton> </template> - <template> - <template v-if="supportsCredentials"> - <hr class="totp-method-sep"> + <template v-if="supportsCredentials"> + <hr class="totp-method-sep"> - <h2 class="heading">{{ i18n.ts.securityKey }}</h2> - <p>{{ i18n.ts._2fa.securityKeyInfo }}</p> - <div class="key-list"> - <div v-for="key in $i.securityKeysList" class="key"> - <h3>{{ key.name }}</h3> - <div class="last-used">{{ i18n.ts.lastUsed }}<MkTime :time="key.lastUsed"/></div> - <MkButton @click="unregisterKey(key)">{{ i18n.ts.unregister }}</MkButton> - </div> + <h2 class="heading">{{ i18n.ts.securityKey }}</h2> + <p>{{ i18n.ts._2fa.securityKeyInfo }}</p> + <div class="key-list"> + <div v-for="key in $i.securityKeysList" class="key"> + <h3>{{ key.name }}</h3> + <div class="last-used">{{ i18n.ts.lastUsed }}<MkTime :time="key.lastUsed"/></div> + <MkButton @click="unregisterKey(key)">{{ i18n.ts.unregister }}</MkButton> </div> + </div> - <MkSwitch v-if="$i.securityKeysList.length > 0" v-model="usePasswordLessLogin" @update:modelValue="updatePasswordLessLogin">{{ i18n.ts.passwordLessLogin }}</MkSwitch> + <MkSwitch v-if="$i.securityKeysList.length > 0" v-model="usePasswordLessLogin" @update:modelValue="updatePasswordLessLogin">{{ i18n.ts.passwordLessLogin }}</MkSwitch> - <MkInfo v-if="registration && registration.error" style="margin-bottom: 1rem;" warn>{{ i18n.ts.error }}: {{ registration.error }}</MkInfo> - <MkButton v-if="!registration || registration.error" @click="addSecurityKey">{{ i18n.ts._2fa.registerKey }}</MkButton> + <MkInfo v-if="registration && registration.error" style="margin-bottom: 1rem;" warn>{{ i18n.ts.error }}: {{ registration.error }}</MkInfo> + <MkButton v-if="!registration || registration.error" @click="addSecurityKey">{{ i18n.ts._2fa.registerKey }}</MkButton> - <ol v-if="registration && !registration.error"> - <li v-if="registration.stage >= 0"> - {{ i18n.ts.tapSecurityKey }} - <i v-if="registration.saving && registration.stage == 0" class="ph-circle-notch ph-bold ph-lg fa-pulse ph-fw ph-lg"></i> - </li> - <li v-if="registration.stage >= 1"> - <MkForm :disabled="registration.stage != 1 || registration.saving"> - <MkInput v-model="keyName" :max="30"> - <template #label>{{ i18n.ts.securityKeyName }}</template> - </MkInput> - <MkButton :disabled="keyName.length == 0" @click="registerKey">{{ i18n.ts.registerSecurityKey }}</MkButton> - <i v-if="registration.saving && registration.stage == 1" class="ph-circle-notch ph-bold ph-lg fa-pulse ph-fw ph-lg"></i> - </MkForm> - </li> - </ol> - </template> + <ol v-if="registration && !registration.error"> + <li v-if="registration.stage >= 0"> + {{ i18n.ts.tapSecurityKey }} + <i v-if="registration.saving && registration.stage == 0" class="ph-circle-notch ph-bold ph-lg fa-pulse ph-fw ph-lg"></i> + </li> + <li v-if="registration.stage >= 1"> + <MkForm :disabled="registration.stage != 1 || registration.saving"> + <MkInput v-model="keyName" :max="30"> + <template #label>{{ i18n.ts.securityKeyName }}</template> + </MkInput> + <MkButton :disabled="keyName.length == 0" @click="registerKey">{{ i18n.ts.registerSecurityKey }}</MkButton> + <i v-if="registration.saving && registration.stage == 1" class="ph-circle-notch ph-bold ph-lg fa-pulse ph-fw ph-lg"></i> + </MkForm> + </li> + </ol> </template> <div v-if="twoFactorData && !$i.twoFactorEnabled"> <ol style="margin: 0; padding: 0 0 0 1em;"> From 5a7dee476b45c7dcc466bc24b4de98e35163cc59 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 21:44:19 -0700 Subject: [PATCH 017/309] attempt to fix #9797 --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index c599f8751b..53734b0691 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,8 @@ COPY package.json pnpm*.yaml ./ COPY packages/backend/package.json packages/backend/package.json COPY packages/client/package.json packages/client/package.json COPY packages/sw/package.json packages/sw/package.json +COPY packages/backend/native-utils/package.json packages/backend/native-utils/package.json +COPY packages/backend/native-utils/**/*/package.json packages/backend/native-utils/**/*/package.json # Configure corepack and pnpm RUN corepack enable From 67cdedfeeacf5179e5e3b8b38653c3d188cb05d9 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 23:28:55 -0700 Subject: [PATCH 018/309] fix import --- packages/backend/src/server/api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/index.ts b/packages/backend/src/server/api/index.ts index 529f09bd56..bfc373e58c 100644 --- a/packages/backend/src/server/api/index.ts +++ b/packages/backend/src/server/api/index.ts @@ -24,7 +24,7 @@ import discord from "./service/discord.js"; import github from "./service/github.js"; import twitter from "./service/twitter.js"; import { koaBody } from "koa-body"; -import { convertId, IdConvertType as IdType } from "native-utils"; +import { convertId, IdConvertType as IdType } from "../../../native-utils/built/index.js"; // re-export native rust id conversion (function and enum) export { IdType, convertId }; From 81190525b34f0cde76429e3746e134932ff9c4fc Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 23:34:02 -0700 Subject: [PATCH 019/309] style --- packages/client/src/components/MkSignin.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkSignin.vue b/packages/client/src/components/MkSignin.vue index 63a5bf10e9..d03341e56d 100644 --- a/packages/client/src/components/MkSignin.vue +++ b/packages/client/src/components/MkSignin.vue @@ -14,7 +14,7 @@ <template #prefix><i class="ph-lock ph-bold ph-lg"></i></template> <template #caption><button class="_textButton" type="button" @click="resetPassword">{{ i18n.ts.forgotPassword }}</button></template> </MkInput> - <MkButton class="_formBlock" type="submit" primary :disabled="signing" style="margin: 0 auto;">{{ signing ? i18n.ts.loggingIn : i18n.ts.login }}</MkButton> + <MkButton class="_formBlock" type="submit" primary :disabled="signing" style="margin: 1rem auto;">{{ signing ? i18n.ts.loggingIn : i18n.ts.login }}</MkButton> </div> <div v-if="totpLogin" class="2fa-signin" :class="{ securityKeys: user && user.securityKeys }"> <div v-if="user && user.securityKeys" class="twofa-group tap-group"> From f8474063fe12c51e853df32f342f8ca798a60c2e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 23:44:59 -0700 Subject: [PATCH 020/309] don't show delete button if profile is default --- packages/client/src/ui/deck.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index 5cb8e36c38..84f6ace6a9 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -35,7 +35,7 @@ <div class="sideMenu"> <div class="top"> <button v-tooltip.noDelay.left="`${i18n.ts._deck.profile}: ${deckStore.state.profile}`" class="_button button" @click="changeProfile"><i class="ph-caret-down ph-bold ph-lg"></i></button> - <button v-tooltip.noDelay.left="i18n.ts._deck.deleteProfile" class="_button button" @click="deleteProfile"><i class="ph-trash ph-bold ph-lg"></i></button> + <button v-if="deckStore.state.profile !== 'default'" v-tooltip.noDelay.left="i18n.ts._deck.deleteProfile" class="_button button" @click="deleteProfile"><i class="ph-trash ph-bold ph-lg"></i></button> </div> <div class="middle"> <button v-tooltip.noDelay.left="i18n.ts._deck.addColumn" class="_button button new" @click="addColumn"><i class="ph-plus ph-bold ph-lg"></i></button> From aa0ec5016b163e08348cea689e96a68397058bf6 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Apr 2023 23:53:31 -0700 Subject: [PATCH 021/309] fix button alignments --- packages/client/src/components/MkFollowButton.vue | 4 +++- packages/client/src/ui/deck.vue | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/client/src/components/MkFollowButton.vue b/packages/client/src/components/MkFollowButton.vue index 48fe686b13..37c48261fa 100644 --- a/packages/client/src/components/MkFollowButton.vue +++ b/packages/client/src/components/MkFollowButton.vue @@ -141,7 +141,9 @@ onBeforeUnmount(() => { <style lang="scss" scoped> .kpoogebi { position: relative; - display: inline-block; + display: flex; + align-items: center; + justify-content: center; font-weight: bold; color: var(--accent); border: solid 1px var(--accent); diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index 84f6ace6a9..a052c5d943 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -343,6 +343,11 @@ async function deleteProfile() { > .new { font-size: 20px; background-color: var(--accentedBg); + display: flex; + align-items: center; + justify-content: center; + border-radius: 10px; + margin: -0.5rem; } } From 753c8c4f48d30221fb46546f8f2a1ddb45c25023 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 00:07:48 -0700 Subject: [PATCH 022/309] fix: dialogs not coming up --- packages/client/src/components/MkDialog.vue | 2 +- packages/client/src/os.ts | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/MkDialog.vue b/packages/client/src/components/MkDialog.vue index 708db22efe..de9cbe8101 100644 --- a/packages/client/src/components/MkDialog.vue +++ b/packages/client/src/components/MkDialog.vue @@ -13,7 +13,7 @@ <MkLoading v-else-if="type === 'waiting'" :class="$style.iconInner" :em="true"/> </div> <header v-if="title" :class="$style.title"><Mfm :text="title"/></header> - <header v-if="title == null && input.type === 'password'" :class="$style.title"><Mfm :text="i18n.ts.password"/></header> + <header v-if="title == null && (input && input.type === 'password')" :class="$style.title"><Mfm :text="i18n.ts.password"/></header> <div v-if="text" :class="$style.text"><Mfm :text="text"/></div> <MkInput v-if="input && input.type !== 'paragraph'" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder || undefined" @keydown="onInputKeydown"> <template v-if="input.type === 'password'" #prefix><i class="ph-password ph-bold ph-lg"></i></template> diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts index ae2fc23a2d..ae78a73a4c 100644 --- a/packages/client/src/os.ts +++ b/packages/client/src/os.ts @@ -715,9 +715,7 @@ export async function openEmojiPicker( for (const node of Array.from(record.addedNodes).filter( (node) => node instanceof HTMLElement, ) as HTMLElement[]) { - const textareas = node.querySelectorAll( - "textarea, input", - ) as NodeListOf<NonNullable<typeof activeTextarea>>; + const textareas = node.querySelectorAll("textarea, input"); for (const textarea of Array.from(textareas).filter( (textarea) => textarea.dataset.preventEmojiInsert == null, )) { From 08ba6700ac0d1dea72261d367123f1eeb413bd1d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 00:13:26 -0700 Subject: [PATCH 023/309] correct color for help button --- packages/client/src/ui/_common_/navbar-for-mobile.vue | 1 + packages/client/src/ui/_common_/navbar.vue | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/client/src/ui/_common_/navbar-for-mobile.vue b/packages/client/src/ui/_common_/navbar-for-mobile.vue index da0aa68deb..71bf05b668 100644 --- a/packages/client/src/ui/_common_/navbar-for-mobile.vue +++ b/packages/client/src/ui/_common_/navbar-for-mobile.vue @@ -174,6 +174,7 @@ function more() { text-align: center; width: 100%; margin-top: 1rem; + color: var(--navFg); > .icon { display: inline-block; diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue index 06f8789646..589868699b 100644 --- a/packages/client/src/ui/_common_/navbar.vue +++ b/packages/client/src/ui/_common_/navbar.vue @@ -274,6 +274,7 @@ function more(ev: MouseEvent) { text-align: center; width: 100%; margin-top: 1rem; + color: var(--navFg); > .icon { display: inline-block; @@ -445,6 +446,7 @@ function more(ev: MouseEvent) { text-align: center; width: 100%; margin-top: 1rem; + color: var(--navFg); > .icon { display: inline-block; From d50bafef88b41481a9c1532bbb12f705d76bf4de Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 00:21:43 -0700 Subject: [PATCH 024/309] attempt fix --- packages/client/src/ui/deck.vue | 4 +++- packages/client/src/ui/deck/deck-store.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index a052c5d943..e3af9aa6fc 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -211,6 +211,7 @@ function changeProfile(ev: MouseEvent) { } async function deleteProfile() { + console.log(deckStore.state.profile) const { canceled } = await os.confirm({ type: 'warning', text: i18n.t('deleteAreYouSure', { x: deckStore.state.profile }), @@ -347,7 +348,8 @@ async function deleteProfile() { align-items: center; justify-content: center; border-radius: 10px; - margin: -0.5rem; + margin: -0.35rem; + transform: scale(0.8); } } diff --git a/packages/client/src/ui/deck/deck-store.ts b/packages/client/src/ui/deck/deck-store.ts index 075cc5cea6..4c9df35590 100644 --- a/packages/client/src/ui/deck/deck-store.ts +++ b/packages/client/src/ui/deck/deck-store.ts @@ -108,7 +108,7 @@ export async function getProfiles(): Promise<string[]> { }); } -export async function deleteProfile(key: string): Promise<void> { +export async function deleteProfile(key: string): Promise<any> { return await api("i/registry/remove", { scope: ["client", "deck", "profiles"], key: key, From 24b8f910da277f595716ec18bf644738d3241e2e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 00:42:35 -0700 Subject: [PATCH 025/309] remove console.log --- packages/client/src/ui/deck.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index e3af9aa6fc..137496c8ed 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -211,7 +211,6 @@ function changeProfile(ev: MouseEvent) { } async function deleteProfile() { - console.log(deckStore.state.profile) const { canceled } = await os.confirm({ type: 'warning', text: i18n.t('deleteAreYouSure', { x: deckStore.state.profile }), From bbfb359e0492c2713236f6084edce51db7b05b6f Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 01:00:40 -0700 Subject: [PATCH 026/309] styling --- packages/client/src/pages/page-editor/page-editor.vue | 10 ---------- packages/client/src/pages/page.vue | 4 ++-- packages/client/src/pages/scratchpad.vue | 2 +- packages/client/src/style.scss | 4 ++++ 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/client/src/pages/page-editor/page-editor.vue b/packages/client/src/pages/page-editor/page-editor.vue index 89af1a63e5..185b4347a0 100644 --- a/packages/client/src/pages/page-editor/page-editor.vue +++ b/packages/client/src/pages/page-editor/page-editor.vue @@ -83,12 +83,6 @@ <script lang="ts" setup> import { defineAsyncComponent, computed, provide, watch } from 'vue'; -import 'prismjs'; -import { highlight, languages } from 'prismjs/components/prism-core'; -import 'prismjs/components/prism-clike'; -import 'prismjs/components/prism-javascript'; -import 'prismjs/themes/prism-okaidia.css'; -import 'vue-prism-editor/dist/prismeditor.min.css'; import { v4 as uuid } from 'uuid'; import XVariable from './page-editor.script-block.vue'; import XBlocks from './page-editor.blocks.vue'; @@ -357,10 +351,6 @@ function removeEyeCatchingImage() { eyeCatchingImageId = null; } -function highlighter(code) { - return highlight(code, languages.js, 'javascript'); -} - async function init() { hpml = new HpmlTypeChecker(); diff --git a/packages/client/src/pages/page.vue b/packages/client/src/pages/page.vue index f1a967c4a0..26887e4df5 100644 --- a/packages/client/src/pages/page.vue +++ b/packages/client/src/pages/page.vue @@ -16,9 +16,9 @@ </div> <div class="menu-actions"> <button v-tooltip="i18n.ts.copyUrl" @click="copyUrl" class="menu _button"><i class="ph-link-simple ph-bold ph-lg"/></button> - <MkA v-tooltip="i18n.ts._pages.viewSource" :to="`/@${username}/pages/${pageName}/view-source`" class="menu _button"><i class="ph-code ph-bold ph-lg"/></MkA> + <MkA v-tooltip="i18n.ts._pages.viewSource" :to="`/@${username}/pages/${pageName}/view-source`" class="menu _button" style="transform: translateY(2px);"><i class="ph-code ph-bold ph-lg"/></MkA> <template v-if="$i && $i.id === page.userId"> - <MkA v-tooltip="i18n.ts._pages.editPage" class="menu _button" :to="`/pages/edit/${page.id}`"><i class="ph-pencil ph-bold ph-lg"/></MkA> + <MkA v-tooltip="i18n.ts._pages.editPage" class="menu _button" :to="`/pages/edit/${page.id}`" style="transform: translateY(2px);"><i class="ph-pencil ph-bold ph-lg"/></MkA> <button v-if="$i.pinnedPageId === page.id" v-tooltip="i18n.ts.unpin" class="menu _button" @click="pin(false)"><i class="ph-push-pin-slash ph-bold ph-lg"/></button> <button v-else v-tooltip="i18n.ts.pin" class="menu _button" @click="pin(true)"><i class="ph-push-pin ph-bold ph-lg"/></button> </template> diff --git a/packages/client/src/pages/scratchpad.vue b/packages/client/src/pages/scratchpad.vue index c448986a57..7d423e7dde 100644 --- a/packages/client/src/pages/scratchpad.vue +++ b/packages/client/src/pages/scratchpad.vue @@ -1,7 +1,7 @@ <template> <div class="iltifgqe"> <div class="editor _panel _gap"> - <PrismEditor v-model="code" class="_code code" :highlight="highlighter" :line-numbers="false"/> + <PrismEditor v-model="code" class="_code code" style="height: 30vh" :highlight="highlighter" :line-numbers="false"/> <MkButton style="position: absolute; top: 8px; right: 8px;" primary @click="run()"><i class="ph-play ph-bold ph-lg"></i></MkButton> </div> diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 0176f7c809..7a8a78f00b 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -518,6 +518,10 @@ hr { padding: 5px; } +.prism-editor__container { + height: 100%; +} + .prism-editor__textarea:focus { outline: none; } From 92aa892826ae8af4d0a5824d6620cd554423d739 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 01:59:18 -0700 Subject: [PATCH 027/309] fix: dockerfile --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 53734b0691..c0a654654d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,8 @@ COPY packages/backend/package.json packages/backend/package.json COPY packages/client/package.json packages/client/package.json COPY packages/sw/package.json packages/sw/package.json COPY packages/backend/native-utils/package.json packages/backend/native-utils/package.json -COPY packages/backend/native-utils/**/*/package.json packages/backend/native-utils/**/*/package.json +COPY packages/backend/native-utils/npm/linux-x64-musl/package.json packages/backend/native-utils/npm/linux-x64-musl/package.json +COPY packages/backend/native-utils/npm/linux-arm64-musl/package.json packages/backend/native-utils/npm/linux-arm64-musl/package.json # Configure corepack and pnpm RUN corepack enable From d524b7b1a28692509d755c8ecb765fc480807e3d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 02:07:02 -0700 Subject: [PATCH 028/309] fix: add copy for build from native-utils --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index c0a654654d..3378f1e612 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,6 +48,8 @@ COPY --from=build /calckey/packages/client/node_modules /calckey/packages/client COPY --from=build /calckey/built /calckey/built COPY --from=build /calckey/packages/backend/built /calckey/packages/backend/built COPY --from=build /calckey/packages/backend/assets/instance.css /calckey/packages/backend/assets/instance.css +COPY --from=build /calckey/packages/backend/native-utils/built /calckey/packages/backend/native-utils/built +COPY --from=build /calckey/packages/backend/native-utils/target /calckey/packages/backend/native-utils/target RUN corepack enable ENTRYPOINT [ "/sbin/tini", "--" ] From 943efadbb781e95ed418044cd32ca06079ca9cce Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 02:09:49 -0700 Subject: [PATCH 029/309] add VIPS to dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3378f1e612..1a1a0aac64 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM node:19-alpine as build WORKDIR /calckey # Install compilation dependencies -RUN apk add --no-cache --no-progress git alpine-sdk python3 rust cargo +RUN apk add --no-cache --no-progress git alpine-sdk python3 rust cargo vips # Copy only the dependency-related files first, to cache efficiently COPY package.json pnpm*.yaml ./ From 2ed9c7c31dec19183dbc1507a49d2a259703eeeb Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Apr 2023 02:17:54 -0700 Subject: [PATCH 030/309] ci: :construction_worker: add beta to commit --- .woodpecker/commit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/commit.yml b/.woodpecker/commit.yml index 386484ce22..6bb1b2d814 100644 --- a/.woodpecker/commit.yml +++ b/.woodpecker/commit.yml @@ -18,4 +18,4 @@ services: image: redis branches: - include: [ main, develop, feature/* ] + include: [ main, beta, develop, feature/* ] From 99a21e70de659dec7aa6a52885cb2bf5e4c53dc6 Mon Sep 17 00:00:00 2001 From: Kaity A <kaity@theallans.com.au> Date: Sun, 2 Apr 2023 21:24:12 +1000 Subject: [PATCH 031/309] Separate cat-avatar mode and speak-as-cat nyanification --- locales/en-US.yml | 2 ++ .../migration/1680426269172-SpeakAsCat.js | 20 +++++++++++++++++++ packages/backend/src/models/entities/user.ts | 6 ++++++ .../backend/src/models/repositories/note.ts | 2 +- .../backend/src/models/repositories/user.ts | 1 + packages/backend/src/models/schema/user.ts | 5 +++++ .../src/server/api/endpoints/i/update.ts | 2 ++ .../client/src/pages/settings/profile.vue | 3 +++ 8 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 packages/backend/migration/1680426269172-SpeakAsCat.js diff --git a/locales/en-US.yml b/locales/en-US.yml index 8802039220..3649e97011 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -146,6 +146,8 @@ flagAsBot: "Mark this account as a bot" flagAsBotDescription: "Enable this option if this account is controlled by a program. If enabled, it will act as a flag for other developers to prevent endless interaction chains with other bots and adjust Calckey's internal systems to treat this account as a bot." flagAsCat: "Are you a cat? 😺" flagAsCatDescription: "You'll get cat ears and speak like a cat!" +flagSpeakAsCat: "Speak as a cat" +flagSpeakAsCatDescription: "Your posts will get nyanified when in cat mode" flagShowTimelineReplies: "Show replies in timeline" flagShowTimelineRepliesDescription: "Shows replies of users to posts of other users in the timeline if turned on." autoAcceptFollowed: "Automatically approve follow requests from users you're following" diff --git a/packages/backend/migration/1680426269172-SpeakAsCat.js b/packages/backend/migration/1680426269172-SpeakAsCat.js new file mode 100644 index 0000000000..3655e27265 --- /dev/null +++ b/packages/backend/migration/1680426269172-SpeakAsCat.js @@ -0,0 +1,20 @@ +export class SpeakAsCat1680426269172 { + name = 'SpeakAsCat1680426269172' + + async up(queryRunner) { + await queryRunner.query(` + ALTER TABLE "user" + ADD "speakAsCat" boolean NOT NULL DEFAULT true + `); + await queryRunner.query(` + COMMENT ON COLUMN "user"."speakAsCat" + IS 'Whether to speak as a cat if isCat.' + `); + } + + async down(queryRunner) { + await queryRunner.query(` + ALTER TABLE "user" DROP COLUMN "speakAsCat" + `); + } +} diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index c57ad916c9..c23f4f28d7 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -156,6 +156,12 @@ export class User { }) public isCat: boolean; + @Column('boolean', { + default: true, + comment: 'Whether to speak as a cat if isCat.', + }) + public speakAsCat: boolean; + @Column('boolean', { default: false, comment: 'Whether the User is the admin.', diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts index b99ce16350..5e56a817bc 100644 --- a/packages/backend/src/models/repositories/note.ts +++ b/packages/backend/src/models/repositories/note.ts @@ -263,7 +263,7 @@ export const NoteRepository = db.getRepository(Note).extend({ : {}), }); - if (packed.user.isCat && packed.text) { + if (packed.user.isCat && packed.user.speakAsCat && packed.text) { const tokens = packed.text ? mfm.parse(packed.text) : []; function nyaizeNode(node: mfm.MfmNode) { if (node.type === "quote") return; diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 0bf31b1b33..27b0c78d6e 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -438,6 +438,7 @@ export const UserRepository = db.getRepository(User).extend({ isModerator: user.isModerator || falsy, isBot: user.isBot || falsy, isCat: user.isCat || falsy, + speakAsCat: user.speakAsCat || falsy, instance: user.host ? userInstanceCache .fetch( diff --git a/packages/backend/src/models/schema/user.ts b/packages/backend/src/models/schema/user.ts index 9fb5aa8f3b..7f76891650 100644 --- a/packages/backend/src/models/schema/user.ts +++ b/packages/backend/src/models/schema/user.ts @@ -66,6 +66,11 @@ export const packedUserLiteSchema = { nullable: false, optional: true, }, + speakAsCat: { + type: "boolean", + nullable: false, + optional: true, + }, emojis: { type: "array", nullable: false, diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 48868de37e..56ed64296b 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -104,6 +104,7 @@ export const paramDef = { noCrawle: { type: "boolean" }, isBot: { type: "boolean" }, isCat: { type: "boolean" }, + speakAsCat: { type: "boolean" }, showTimelineReplies: { type: "boolean" }, injectFeaturedNote: { type: "boolean" }, receiveAnnouncementEmail: { type: "boolean" }, @@ -191,6 +192,7 @@ export default define(meta, paramDef, async (ps, _user, token) => { profileUpdates.autoAcceptFollowed = ps.autoAcceptFollowed; if (typeof ps.noCrawle === "boolean") profileUpdates.noCrawle = ps.noCrawle; if (typeof ps.isCat === "boolean") updates.isCat = ps.isCat; + if (typeof ps.speakAsCat === "boolean") updates.speakAsCat = ps.speakAsCat; if (typeof ps.injectFeaturedNote === "boolean") profileUpdates.injectFeaturedNote = ps.injectFeaturedNote; if (typeof ps.receiveAnnouncementEmail === "boolean") diff --git a/packages/client/src/pages/settings/profile.vue b/packages/client/src/pages/settings/profile.vue index a2ed6fd41f..4e51a339b7 100644 --- a/packages/client/src/pages/settings/profile.vue +++ b/packages/client/src/pages/settings/profile.vue @@ -59,6 +59,7 @@ </FormSlot> <FormSwitch v-model="profile.isCat" class="_formBlock">{{ i18n.ts.flagAsCat }}<template #caption>{{ i18n.ts.flagAsCatDescription }}</template></FormSwitch> + <FormSwitch v-if="profile.isCat" v-model="profile.speakAsCat" class="_formBlock">{{ i18n.ts.flagSpeakAsCat }}<template #caption>{{ i18n.ts.flagSpeakAsCatDescription }}</template></FormSwitch> <FormSwitch v-model="profile.showTimelineReplies" class="_formBlock">{{ i18n.ts.flagShowTimelineReplies }}<template #caption>{{ i18n.ts.flagShowTimelineRepliesDescription }} {{ i18n.ts.reflectMayTakeTime }}</template></FormSwitch> <FormSwitch v-model="profile.isBot" class="_formBlock">{{ i18n.ts.flagAsBot }}<template #caption>{{ i18n.ts.flagAsBotDescription }}</template></FormSwitch> <div v-if="saveButton == true"> @@ -92,6 +93,7 @@ const profile = reactive({ lang: $i?.lang, isBot: $i?.isBot, isCat: $i?.isCat, + speakAsCat: $i?.speakAsCat, showTimelineReplies: $i?.showTimelineReplies, }); @@ -135,6 +137,7 @@ function save() { lang: profile.lang || null, isBot: !!profile.isBot, isCat: !!profile.isCat, + speakAsCat: !!profile.speakAsCat, showTimelineReplies: !!profile.showTimelineReplies, }); } From 226e497e3b523bcb4e04cdeec3c120aa7ff1e55e Mon Sep 17 00:00:00 2001 From: Free <freeplay@duck.com> Date: Sun, 2 Apr 2023 21:39:25 +0000 Subject: [PATCH 032/309] note-improvements (#9799) Boop! Co-authored-by: Freeplay <Freeplay@duck.com> Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9799 Co-authored-by: Free <freeplay@duck.com> Co-committed-by: Free <freeplay@duck.com> --- locales/en-US.yml | 14 +++---- packages/client/src/components/MkNote.vue | 14 ++++--- .../client/src/components/MkNoteDetailed.vue | 3 +- packages/client/src/components/MkNoteSub.vue | 39 ++++++++++++++----- .../src/components/MkSubNoteContent.vue | 2 +- packages/client/src/ui/universal.vue | 8 +++- 6 files changed, 53 insertions(+), 27 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 3649e97011..f4913e9041 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1230,13 +1230,13 @@ _sfx: _ago: future: "Future" justNow: "Just now" - secondsAgo: "{n} second(s) ago" - minutesAgo: "{n} minute(s) ago" - hoursAgo: "{n} hour(s) ago" - daysAgo: "{n} day(s) ago" - weeksAgo: "{n} week(s) ago" - monthsAgo: "{n} month(s) ago" - yearsAgo: "{n} year(s) ago" + secondsAgo: "{n}s ago" + minutesAgo: "{n}m ago" + hoursAgo: "{n}h ago" + daysAgo: "{n}d ago" + weeksAgo: "{n}w ago" + monthsAgo: "{n}mo ago" + yearsAgo: "{n}y ago" _time: second: "Second(s)" minute: "Minute(s)" diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index c02e79d005..f80aabbc92 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -10,16 +10,16 @@ :class="{ renote: isRenote }" > <MkNoteSub v-if="appearNote.reply" :note="appearNote.reply" class="reply-to"/> - <div class="note-context"> + <div class="note-context" @click="noteClick"> <div class="line"></div> - <div v-if="appearNote._prId_" class="info"><i class="ph-megaphone-simple-bold ph-lg"></i> {{ i18n.ts.promotion }}<button class="_textButton hide" @click="readPromo()">{{ i18n.ts.hideThisNote }} <i class="ph-x ph-bold ph-lg"></i></button></div> + <div v-if="appearNote._prId_" class="info"><i class="ph-megaphone-simple-bold ph-lg"></i> {{ i18n.ts.promotion }}<button class="_textButton hide" @click.stop="readPromo()">{{ i18n.ts.hideThisNote }} <i class="ph-x ph-bold ph-lg"></i></button></div> <div v-if="appearNote._featuredId_" class="info"><i class="ph-lightning ph-bold ph-lg"></i> {{ i18n.ts.featured }}</div> <div v-if="pinned" class="info"><i class="ph-push-pin ph-bold ph-lg"></i>{{ i18n.ts.pinnedNote }}</div> <div v-if="isRenote" class="renote"> <i class="ph-repeat ph-bold ph-lg"></i> <I18n :src="i18n.ts.renotedBy" tag="span"> <template #user> - <MkA v-user-preview="note.userId" class="name" :to="userPage(note.user)"> + <MkA v-user-preview="note.userId" class="name" :to="userPage(note.user)" @click.stop> <MkUserName :user="note.user"/> </MkA> </template> @@ -93,7 +93,6 @@ <i class="ph-dots-three-outline ph-bold ph-lg"></i> </button> </footer> - <!-- <MkNoteFooter :note="appearNote"></MkNoteFooter> --> </div> </article> </div> @@ -418,8 +417,8 @@ function readPromo() { align-items: center; white-space: pre; color: var(--renote); + cursor: pointer; - > i { margin-right: 4px; } @@ -504,7 +503,7 @@ function readPromo() { width: 100%; margin-top: 1em; position: sticky; - bottom: 1em; + bottom: var(--stickyBottom); > span { display: inline-block; @@ -663,6 +662,9 @@ function readPromo() { } > .line { margin-right: 10px; + &::before { + margin-top: 8px; + } } } > .article { diff --git a/packages/client/src/components/MkNoteDetailed.vue b/packages/client/src/components/MkNoteDetailed.vue index a06bac3705..4eed184e22 100644 --- a/packages/client/src/components/MkNoteDetailed.vue +++ b/packages/client/src/components/MkNoteDetailed.vue @@ -352,6 +352,7 @@ onUnmounted(() => { <style lang="scss" scoped> .lxwezrsl { + font-size: 1.05em; position: relative; transition: box-shadow 0.1s ease; contain: content; @@ -451,7 +452,7 @@ onUnmounted(() => { &:last-child { padding-bottom: 24px; } - font-size: 1.2em; + font-size: 1.1em; overflow: clip; outline: none; scroll-margin-top: calc(var(--stickyTop) + 20vh); diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue index 401d33ca85..4f172fb0d9 100644 --- a/packages/client/src/components/MkNoteSub.vue +++ b/packages/client/src/components/MkNoteSub.vue @@ -7,25 +7,25 @@ <div v-if="conversation && depth > 1" class="line"></div> <div class="main" @click="noteClick"> <div class="avatar-container"> - <MkAvatar class="avatar" :user="note.user"/> + <MkAvatar class="avatar" :user="appearNote.user"/> <div v-if="(!conversation) || replies.length > 0" class="line"></div> </div> <div class="body"> <XNoteHeader class="header" :note="note" :mini="true"/> <div class="body"> - <p v-if="note.cw != null" class="cw"> - <MkA v-if="note.replyId" :to="`/notes/${note.replyId}`" class="reply-icon" @click.stop> + <p v-if="appearNote.cw != null" class="cw"> + <MkA v-if="appearNote.replyId" :to="`/notes/${appearNote.replyId}`" class="reply-icon" @click.stop> <i class="ph-arrow-bend-left-up ph-bold ph-lg"></i> </MkA> - <MkA v-if="conversation && note.renoteId && note.renoteId != parentId && !note.replyId" :to="`/notes/${note.renoteId}`" class="reply-icon" @click.stop> + <MkA v-if="conversation && appearNote.renoteId && appearNote.renoteId != parentId && !appearNote.replyId" :to="`/notes/${appearNote.renoteId}`" class="reply-icon" @click.stop> <i class="ph-quotes ph-bold ph-lg"></i> </MkA> - <Mfm v-if="note.cw != ''" class="text" :text="note.cw" :author="note.user" :i="$i" :custom-emojis="note.emojis"/> + <Mfm v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/> <br/> <XCwButton v-model="showContent" :note="note"/> </p> - <div v-show="note.cw == null || showContent" class="content"> - <MkSubNoteContent class="text" :note="note" :detailed="true" :parentId="note.parentId" :conversation="conversation"/> + <div v-show="appearNote.cw == null || showContent" class="content"> + <MkSubNoteContent class="text" :note="note" :detailed="true" :parentId="appearNote.parentId" :conversation="conversation"/> </div> <div v-if="translating || translation" class="translation"> <MkLoading v-if="translating" mini/> @@ -56,15 +56,14 @@ <i class="ph-dots-three-outline ph-bold ph-lg"></i> </button> </footer> - <!-- <MkNoteFooter :note="note" :directReplies="replies.length"></MkNoteFooter> --> </div> </div> <template v-if="conversation"> <template v-if="replies.length == 1"> - <MkNoteSub v-for="reply in replies" :key="reply.id" :note="reply" class="reply single" :conversation="conversation" :depth="depth" :parentId="note.replyId"/> + <MkNoteSub v-for="reply in replies" :key="reply.id" :note="reply" class="reply single" :conversation="conversation" :depth="depth" :parentId="appearNote.replyId"/> </template> <template v-else-if="depth < 5"> - <MkNoteSub v-for="reply in replies" :key="reply.id" :note="reply" class="reply" :conversation="conversation" :depth="depth + 1" :parentId="note.replyId"/> + <MkNoteSub v-for="reply in replies" :key="reply.id" :note="reply" class="reply" :conversation="conversation" :depth="depth + 1" :parentId="appearNote.replyId"/> </template> <div v-else-if="replies.length > 0" class="more"> <div class="line"></div> @@ -457,6 +456,26 @@ function noteClick(e) { -webkit-mask: linear-gradient(to right, transparent 2px, black 2px); } } + // End Reply Divider + .children > .main:last-child { + padding-bottom: 1em; + &::before { + bottom: 1em; + } + // &::after { + // content: ""; + // border-top: 1px solid var(--X13); + // position: absolute; + // bottom: 0; + // margin-left: calc(var(--avatarSize) + 12px); + // inset-inline: 0; + // } + } + &.firstColumn > .children:last-child > .main { + padding-bottom: 0 !important; + &::before { bottom: 0 !important } + // &::after { content: unset } + } &.max-width_500px { :not(.reply) > & { diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index f58e9b763d..fa421d10f8 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -130,7 +130,7 @@ const urls = props.note.text ? extractUrlFromMfm(mfm.parse(props.note.text)) : n width: 100%; margin-top: 1em; position: sticky; - bottom: 1em; + bottom: var(--stickyBottom); > span { display: inline-block; diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue index bd95f7131d..3912340978 100644 --- a/packages/client/src/ui/universal.vue +++ b/packages/client/src/ui/universal.vue @@ -1,5 +1,5 @@ <template> -<div class="dkgtipfy" :class="{ wallpaper }"> +<div class="dkgtipfy" :class="{ wallpaper, isMobile }"> <XSidebar v-if="!isMobile" class="sidebar"/> <MkStickyContainer class="contents"> @@ -319,6 +319,10 @@ console.log(mainRouter.currentRoute.value.name); box-sizing: border-box; display: flex; + --stickyBottom: 1em; + &.isMobile { + --stickyBottom: 6rem; + } &.wallpaper { background: var(--wallpaperOverlay); //backdrop-filter: var(--blur, blur(4px)); @@ -363,7 +367,7 @@ console.log(mainRouter.currentRoute.value.name); } > .postButton, .widgetButton { - bottom: 6rem; + bottom: var(--stickyBottom); right: 1.5rem; height: 4rem; width: 4rem; From 143576bc294c5e7bf459e5f521b8dff5255f0c1c Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@mx.a-ef.org> Date: Mon, 3 Apr 2023 00:17:51 -0400 Subject: [PATCH 033/309] add "speak as cat" setting to ja-jp --- locales/ja-JP.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 34dc974893..64d804928e 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -145,7 +145,9 @@ cacheRemoteFilesDescription: "この設定を無効にすると、リモート flagAsBot: "Botとして設定" flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Calckeyのシステム上での扱いがBotに合ったものになります。" flagAsCat: "あなたは…猫?😺" -flagAsCatDescription: "このアカウントが猫であることを示す場合は、このフラグをオンにします。" +flagAsCatDescription: "このアカウントが猫であることを示す猫モードを有効にするには、このフラグをオンにします。" +flagSpeakAsCat: "猫語で話す" +flagSpeakAsCatDescription: "猫モードが有効の場合にオンにすると、あなたの投稿の「な」を「にゃ」に変換します。" flagShowTimelineReplies: "タイムラインに投稿の返信を表示する" flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーの他の投稿への返信も表示されます。" autoAcceptFollowed: "フォローしているユーザーからのフォロー申請を自動承認" From 662e7a96cfc4b7ab6ce0aed9a6af1e93f5011331 Mon Sep 17 00:00:00 2001 From: amy bones <amy@spookygirl.boo> Date: Mon, 3 Apr 2023 02:23:51 -0700 Subject: [PATCH 034/309] fix: changing passwords, 2fa, and password resets. The argon2 usage was only implemented for sign-ins which broke a bunch of other endpoints and features. --- packages/backend/src/server/api/common/signup.ts | 5 ++--- .../src/server/api/endpoints/admin/reset-password.ts | 6 ++++-- .../backend/src/server/api/endpoints/i/2fa/key-done.ts | 4 ++-- .../backend/src/server/api/endpoints/i/2fa/register-key.ts | 4 ++-- .../backend/src/server/api/endpoints/i/2fa/register.ts | 4 ++-- .../backend/src/server/api/endpoints/i/2fa/remove-key.ts | 4 ++-- .../backend/src/server/api/endpoints/i/2fa/unregister.ts | 4 ++-- .../backend/src/server/api/endpoints/i/change-password.ts | 7 +++---- .../backend/src/server/api/endpoints/i/delete-account.ts | 4 ++-- .../backend/src/server/api/endpoints/i/regenerate-token.ts | 4 ++-- .../backend/src/server/api/endpoints/i/update-email.ts | 4 ++-- .../backend/src/server/api/endpoints/reset-password.ts | 5 ++--- packages/backend/src/server/api/private/signin.ts | 1 - packages/backend/src/server/api/private/signup.ts | 5 ++--- packages/backend/src/services/create-system-user.ts | 5 ++--- 15 files changed, 31 insertions(+), 35 deletions(-) diff --git a/packages/backend/src/server/api/common/signup.ts b/packages/backend/src/server/api/common/signup.ts index bb178506b7..6beae2c782 100644 --- a/packages/backend/src/server/api/common/signup.ts +++ b/packages/backend/src/server/api/common/signup.ts @@ -1,4 +1,3 @@ -import bcrypt from "bcryptjs"; import { generateKeyPair } from "node:crypto"; import generateUserToken from "./generate-native-user-token.js"; import { User } from "@/models/entities/user.js"; @@ -12,6 +11,7 @@ import { usersChart } from "@/services/chart/index.js"; import { UsedUsername } from "@/models/entities/used-username.js"; import { db } from "@/db/postgre.js"; import config from "@/config/index.js"; +import { hashPassword } from "@/misc/password.js"; export async function signup(opts: { username: User["username"]; @@ -42,8 +42,7 @@ export async function signup(opts: { } // Generate hash of password - const salt = await bcrypt.genSalt(8); - hash = await bcrypt.hash(password, salt); + hash = await hashPassword(password); } // Generate secret diff --git a/packages/backend/src/server/api/endpoints/admin/reset-password.ts b/packages/backend/src/server/api/endpoints/admin/reset-password.ts index dd3f258f74..cbe6735ce5 100644 --- a/packages/backend/src/server/api/endpoints/admin/reset-password.ts +++ b/packages/backend/src/server/api/endpoints/admin/reset-password.ts @@ -1,7 +1,8 @@ import define from "../../define.js"; -import bcrypt from "bcryptjs"; +// import bcrypt from "bcryptjs"; import rndstr from "rndstr"; import { Users, UserProfiles } from "@/models/index.js"; +import { hashPassword } from "@/misc/password.js"; export const meta = { tags: ["admin"], @@ -47,7 +48,8 @@ export default define(meta, paramDef, async (ps) => { const passwd = rndstr("a-zA-Z0-9", 8); // Generate hash of password - const hash = bcrypt.hashSync(passwd); + // const hash = bcrypt.hashSync(passwd); + const hash = await hashPassword(passwd); await UserProfiles.update( { diff --git a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts index e80dc4d711..f0581de4b4 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts @@ -1,4 +1,3 @@ -import bcrypt from "bcryptjs"; import { promisify } from "node:util"; import * as cbor from "cbor"; import define from "../../../define.js"; @@ -11,6 +10,7 @@ import { import config from "@/config/index.js"; import { procedures, hash } from "../../../2fa.js"; import { publishMainStream } from "@/services/stream.js"; +import { comparePassword } from "@/misc/password.js"; const cborDecodeFirst = promisify(cbor.decodeFirst) as any; const rpIdHashReal = hash(Buffer.from(config.hostname, "utf-8")); @@ -43,7 +43,7 @@ export default define(meta, paramDef, async (ps, user) => { const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); // Compare password - const same = await bcrypt.compare(ps.password, profile.password!); + const same = await comparePassword(ps.password, profile.password!); if (!same) { throw new Error("incorrect password"); diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts index 96239b56de..a10dc9b256 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts @@ -1,10 +1,10 @@ -import bcrypt from "bcryptjs"; import define from "../../../define.js"; import { UserProfiles, AttestationChallenges } from "@/models/index.js"; import { promisify } from "node:util"; import * as crypto from "node:crypto"; import { genId } from "@/misc/gen-id.js"; import { hash } from "../../../2fa.js"; +import { comparePassword } from "@/misc/password.js"; const randomBytes = promisify(crypto.randomBytes); @@ -26,7 +26,7 @@ export default define(meta, paramDef, async (ps, user) => { const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); // Compare password - const same = await bcrypt.compare(ps.password, profile.password!); + const same = await comparePassword(ps.password, profile.password!); if (!same) { throw new Error("incorrect password"); diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register.ts b/packages/backend/src/server/api/endpoints/i/2fa/register.ts index 9019787f23..533035bc91 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/register.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/register.ts @@ -1,9 +1,9 @@ -import bcrypt from "bcryptjs"; import * as speakeasy from "speakeasy"; import * as QRCode from "qrcode"; import config from "@/config/index.js"; import { UserProfiles } from "@/models/index.js"; import define from "../../../define.js"; +import { comparePassword } from "@/misc/password.js"; export const meta = { requireCredential: true, @@ -23,7 +23,7 @@ export default define(meta, paramDef, async (ps, user) => { const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); // Compare password - const same = await bcrypt.compare(ps.password, profile.password!); + const same = await comparePassword(ps.password, profile.password!); if (!same) { throw new Error("incorrect password"); diff --git a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts index d491f0a6ee..862c971e75 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts @@ -1,4 +1,4 @@ -import bcrypt from "bcryptjs"; +import { comparePassword } from "@/misc/password.js"; import define from "../../../define.js"; import { UserProfiles, UserSecurityKeys, Users } from "@/models/index.js"; import { publishMainStream } from "@/services/stream.js"; @@ -22,7 +22,7 @@ export default define(meta, paramDef, async (ps, user) => { const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); // Compare password - const same = await bcrypt.compare(ps.password, profile.password!); + const same = await comparePassword(ps.password, profile.password!); if (!same) { throw new Error("incorrect password"); diff --git a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts index 9bb1538b00..57d57ff65a 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts @@ -1,6 +1,6 @@ -import bcrypt from "bcryptjs"; import define from "../../../define.js"; import { UserProfiles } from "@/models/index.js"; +import { comparePassword } from "@/misc/password.js"; export const meta = { requireCredential: true, @@ -20,7 +20,7 @@ export default define(meta, paramDef, async (ps, user) => { const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); // Compare password - const same = await bcrypt.compare(ps.password, profile.password!); + const same = await comparePassword(ps.password, profile.password!); if (!same) { throw new Error("incorrect password"); diff --git a/packages/backend/src/server/api/endpoints/i/change-password.ts b/packages/backend/src/server/api/endpoints/i/change-password.ts index fcfc38bd14..8bbb3ad93a 100644 --- a/packages/backend/src/server/api/endpoints/i/change-password.ts +++ b/packages/backend/src/server/api/endpoints/i/change-password.ts @@ -1,6 +1,6 @@ -import bcrypt from "bcryptjs"; import define from "../../define.js"; import { UserProfiles } from "@/models/index.js"; +import { hashPassword, comparePassword } from "@/misc/password.js"; export const meta = { requireCredential: true, @@ -21,15 +21,14 @@ export default define(meta, paramDef, async (ps, user) => { const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); // Compare password - const same = await bcrypt.compare(ps.currentPassword, profile.password!); + const same = await comparePassword(ps.currentPassword, profile.password!); if (!same) { throw new Error("incorrect password"); } // Generate hash of password - const salt = await bcrypt.genSalt(8); - const hash = await bcrypt.hash(ps.newPassword, salt); + const hash = await hashPassword(ps.newPassword); await UserProfiles.update(user.id, { password: hash, diff --git a/packages/backend/src/server/api/endpoints/i/delete-account.ts b/packages/backend/src/server/api/endpoints/i/delete-account.ts index 81aee9a41a..781abe0b38 100644 --- a/packages/backend/src/server/api/endpoints/i/delete-account.ts +++ b/packages/backend/src/server/api/endpoints/i/delete-account.ts @@ -1,7 +1,7 @@ -import bcrypt from "bcryptjs"; import { UserProfiles, Users } from "@/models/index.js"; import { deleteAccount } from "@/services/delete-account.js"; import define from "../../define.js"; +import { comparePassword } from "@/misc/password.js"; export const meta = { requireCredential: true, @@ -25,7 +25,7 @@ export default define(meta, paramDef, async (ps, user) => { } // Compare password - const same = await bcrypt.compare(ps.password, profile.password!); + const same = await comparePassword(ps.password, profile.password!); if (!same) { throw new Error("incorrect password"); diff --git a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts index dff37cf3d3..b5b34c0902 100644 --- a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts +++ b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts @@ -1,4 +1,3 @@ -import bcrypt from "bcryptjs"; import { publishInternalEvent, publishMainStream, @@ -7,6 +6,7 @@ import { import generateUserToken from "../../common/generate-native-user-token.js"; import define from "../../define.js"; import { Users, UserProfiles } from "@/models/index.js"; +import { comparePassword } from "@/misc/password.js"; export const meta = { requireCredential: true, @@ -29,7 +29,7 @@ export default define(meta, paramDef, async (ps, user) => { const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); // Compare password - const same = await bcrypt.compare(ps.password, profile.password!); + const same = await comparePassword(ps.password, profile.password!); if (!same) { throw new Error("incorrect password"); diff --git a/packages/backend/src/server/api/endpoints/i/update-email.ts b/packages/backend/src/server/api/endpoints/i/update-email.ts index c3c24d4d3d..94ad6b3c72 100644 --- a/packages/backend/src/server/api/endpoints/i/update-email.ts +++ b/packages/backend/src/server/api/endpoints/i/update-email.ts @@ -2,12 +2,12 @@ import { publishMainStream } from "@/services/stream.js"; import define from "../../define.js"; import rndstr from "rndstr"; import config from "@/config/index.js"; -import bcrypt from "bcryptjs"; import { Users, UserProfiles } from "@/models/index.js"; import { sendEmail } from "@/services/send-email.js"; import { ApiError } from "../../error.js"; import { validateEmailForAccount } from "@/services/validate-email-for-account.js"; import { HOUR } from "@/const.js"; +import { comparePassword } from "@/misc/password.js"; export const meta = { requireCredential: true, @@ -47,7 +47,7 @@ export default define(meta, paramDef, async (ps, user) => { const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); // Compare password - const same = await bcrypt.compare(ps.password, profile.password!); + const same = await comparePassword(ps.password, profile.password!); if (!same) { throw new ApiError(meta.errors.incorrectPassword); diff --git a/packages/backend/src/server/api/endpoints/reset-password.ts b/packages/backend/src/server/api/endpoints/reset-password.ts index 51755727a3..f695ae41f1 100644 --- a/packages/backend/src/server/api/endpoints/reset-password.ts +++ b/packages/backend/src/server/api/endpoints/reset-password.ts @@ -1,8 +1,8 @@ -import bcrypt from "bcryptjs"; import { publishMainStream } from "@/services/stream.js"; import { Users, UserProfiles, PasswordResetRequests } from "@/models/index.js"; import define from "../define.js"; import { ApiError } from "../error.js"; +import { hashPassword } from "@/misc/password.js"; export const meta = { tags: ["reset password"], @@ -34,8 +34,7 @@ export default define(meta, paramDef, async (ps, user) => { } // Generate hash of password - const salt = await bcrypt.genSalt(8); - const hash = await bcrypt.hash(ps.password, salt); + const hash = await hashPassword(ps.password); await UserProfiles.update(req.userId, { password: hash, diff --git a/packages/backend/src/server/api/private/signin.ts b/packages/backend/src/server/api/private/signin.ts index 7c4b511a2f..ef5b137813 100644 --- a/packages/backend/src/server/api/private/signin.ts +++ b/packages/backend/src/server/api/private/signin.ts @@ -1,5 +1,4 @@ import type Koa from "koa"; -import bcrypt from "bcryptjs"; import * as speakeasy from "speakeasy"; import signin from "../common/signin.js"; import config from "@/config/index.js"; diff --git a/packages/backend/src/server/api/private/signup.ts b/packages/backend/src/server/api/private/signup.ts index dc5eb23168..754d86c3b8 100644 --- a/packages/backend/src/server/api/private/signup.ts +++ b/packages/backend/src/server/api/private/signup.ts @@ -1,6 +1,5 @@ import type Koa from "koa"; import rndstr from "rndstr"; -import bcrypt from "bcryptjs"; import { fetchMeta } from "@/misc/fetch-meta.js"; import { verifyHcaptcha, verifyRecaptcha } from "@/misc/captcha.js"; import { Users, RegistrationTickets, UserPendings } from "@/models/index.js"; @@ -9,6 +8,7 @@ import config from "@/config/index.js"; import { sendEmail } from "@/services/send-email.js"; import { genId } from "@/misc/gen-id.js"; import { validateEmailForAccount } from "@/services/validate-email-for-account.js"; +import { hashPassword } from "@/misc/password.js"; export default async (ctx: Koa.Context) => { const body = ctx.request.body; @@ -79,8 +79,7 @@ export default async (ctx: Koa.Context) => { const code = rndstr("a-z0-9", 16); // Generate hash of password - const salt = await bcrypt.genSalt(8); - const hash = await bcrypt.hash(password, salt); + const hash = await hashPassword(password); await UserPendings.insert({ id: genId(), diff --git a/packages/backend/src/services/create-system-user.ts b/packages/backend/src/services/create-system-user.ts index def3ee98fb..24536090a9 100644 --- a/packages/backend/src/services/create-system-user.ts +++ b/packages/backend/src/services/create-system-user.ts @@ -1,4 +1,3 @@ -import bcrypt from "bcryptjs"; import { v4 as uuid } from "uuid"; import generateNativeUserToken from "../server/api/common/generate-native-user-token.js"; import { genRsaKeyPair } from "@/misc/gen-key-pair.js"; @@ -9,13 +8,13 @@ import { genId } from "@/misc/gen-id.js"; import { UserKeypair } from "@/models/entities/user-keypair.js"; import { UsedUsername } from "@/models/entities/used-username.js"; import { db } from "@/db/postgre.js"; +import { hashPassword } from "@/misc/password.js"; export async function createSystemUser(username: string) { const password = uuid(); // Generate hash of password - const salt = await bcrypt.genSalt(8); - const hash = await bcrypt.hash(password, salt); + const hash = await hashPassword(password); // Generate secret const secret = generateNativeUserToken(); From e8b70cb7f55180e9f6bf46e0bbf04ae3be1255d6 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 25 Apr 2023 11:12:47 -0700 Subject: [PATCH 035/309] hotfix: explore page --- packages/client/src/pages/explore.vue | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/client/src/pages/explore.vue b/packages/client/src/pages/explore.vue index fbdbd85feb..b7f6d3c713 100644 --- a/packages/client/src/pages/explore.vue +++ b/packages/client/src/pages/explore.vue @@ -22,10 +22,10 @@ @slide-change="onSlideChange" > <swiper-slide> - <XFeatured /> + <XUsers /> </swiper-slide> <swiper-slide> - <XUsers /> + <XFeatured /> </swiper-slide> </swiper> </MkSpacer> @@ -53,16 +53,16 @@ watch($$(tab), () => syncSlide(tabs.indexOf(tab))); const headerActions = $computed(() => []); const headerTabs = $computed(() => [ - { - key: "featured", - icon: "ph-lightning ph-bold ph-lg", - title: i18n.ts.featured, - }, { key: "users", icon: "ph-users ph-bold ph-lg", title: i18n.ts.users, }, + { + key: "featured", + icon: "ph-lightning ph-bold ph-lg", + title: i18n.ts.featured, + }, ]); definePageMetadata( From 1690d787ce333e8e85d42efa5e563dfdbc9abb0a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 25 Apr 2023 11:13:20 -0700 Subject: [PATCH 036/309] hotfix --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b197aa4fa1..278be869be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.2.0-beta7", + "version": "13.2.0-beta7h", "codename": "aqua", "repository": { "type": "git", From e7b714c1348f140ff0d6993f56d06f771ef26277 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 29 Apr 2023 16:26:51 -0700 Subject: [PATCH 037/309] beta9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42b44031ca..300ff61217 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.2.0-rc", + "version": "13.2.0-beta9", "codename": "aqua", "repository": { "type": "git", From 0e602a2824fa671206416ea573aacf3399cc7c83 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 29 Apr 2023 19:39:04 -0700 Subject: [PATCH 038/309] Revert "Merge pull request 'Add show more button to notifications' (#9942) from Freeplay/calckey:notifications into develop" This reverts commit 8cb321b110dca7f8020f8a7a9af6a49308a0c036, reversing changes made to 133391122b77c92bff6e0e94f40cfdea542c6f35. --- packages/client/src/components/MkCwButton.vue | 37 ---------- .../client/src/components/MkNotification.vue | 47 ++++--------- .../src/components/MkShowMoreButton.vue | 68 ------------------- .../src/components/MkSubNoteContent.vue | 56 +++++++++++++-- .../client/src/components/MkUserPreview.vue | 16 ++++- 5 files changed, 79 insertions(+), 145 deletions(-) delete mode 100644 packages/client/src/components/MkShowMoreButton.vue diff --git a/packages/client/src/components/MkCwButton.vue b/packages/client/src/components/MkCwButton.vue index 1f6340510b..01ab113516 100644 --- a/packages/client/src/components/MkCwButton.vue +++ b/packages/client/src/components/MkCwButton.vue @@ -77,42 +77,5 @@ defineExpose({ background: var(--cwFg) !important; color: var(--cwBg) !important; } - - &.fade { - display: block; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - z-index: 2; - > span { - display: inline-block; - background: var(--panel); - padding: 0.4em 1em; - font-size: 0.8em; - border-radius: 999px; - box-shadow: 0 2px 6px rgb(0 0 0 / 20%); - } - &:hover, &:focus { - > span { - background: var(--panelHighlight); - } - } - } - &.showLess { - width: 100%; - margin-top: 1em; - position: sticky; - bottom: var(--stickyBottom); - - > span { - display: inline-block; - background: var(--panel); - padding: 6px 10px; - font-size: 0.8em; - border-radius: 999px; - box-shadow: 0 0 7px 7px var(--bg); - } - } } </style> diff --git a/packages/client/src/components/MkNotification.vue b/packages/client/src/components/MkNotification.vue index 2c7281dbe5..c909873a55 100644 --- a/packages/client/src/components/MkNotification.vue +++ b/packages/client/src/components/MkNotification.vue @@ -89,7 +89,7 @@ /> </div> </div> - <div class="tail" :class="{ collapsed }"> + <div class="tail"> <header> <span v-if="notification.type === 'pollEnded'">{{ i18n.ts._notification.pollEnded @@ -112,11 +112,11 @@ v-if="notification.type === 'reaction'" class="text" :to="notePage(notification.note)" - :title="summary" + :title="getNoteSummary(notification.note)" > <i class="ph-quotes ph-fill ph-lg"></i> <Mfm - :text="summary" + :text="getNoteSummary(notification.note)" :plain="true" :nowrap="!full" :custom-emojis="notification.note.emojis" @@ -142,10 +142,10 @@ v-if="notification.type === 'reply'" class="text" :to="notePage(notification.note)" - :title="summary" + :title="getNoteSummary(notification.note)" > <Mfm - :text="summary" + :text="getNoteSummary(notification.note)" :plain="true" :nowrap="!full" :custom-emojis="notification.note.emojis" @@ -155,10 +155,10 @@ v-if="notification.type === 'mention'" class="text" :to="notePage(notification.note)" - :title="summary" + :title="getNoteSummary(notification.note)" > <Mfm - :text="summary" + :text="getNoteSummary(notification.note)" :plain="true" :nowrap="!full" :custom-emojis="notification.note.emojis" @@ -168,10 +168,10 @@ v-if="notification.type === 'quote'" class="text" :to="notePage(notification.note)" - :title="summary" + :title="getNoteSummary(notification.note)" > <Mfm - :text="summary" + :text="getNoteSummary(notification.note)" :plain="true" :nowrap="!full" :custom-emojis="notification.note.emojis" @@ -181,11 +181,11 @@ v-if="notification.type === 'pollVote'" class="text" :to="notePage(notification.note)" - :title="summary" + :title="getNoteSummary(notification.note)" > <i class="ph-quotes ph-fill ph-lg"></i> <Mfm - :text="summary" + :text="getNoteSummary(notification.note)" :plain="true" :nowrap="!full" :custom-emojis="notification.note.emojis" @@ -196,11 +196,11 @@ v-if="notification.type === 'pollEnded'" class="text" :to="notePage(notification.note)" - :title="summary" + :title="getNoteSummary(notification.note)" > <i class="ph-quotes ph-fill ph-lg"></i> <Mfm - :text="summary" + :text="getNoteSummary(notification.note)" :plain="true" :nowrap="!full" :custom-emojis="notification.note.emojis" @@ -264,7 +264,6 @@ <span v-if="notification.type === 'app'" class="text"> <Mfm :text="notification.body" :nowrap="!full" /> </span> - <xShowMoreButton v-if="isLong" v-model="collapsed"></xShowMoreButton> </div> </div> </template> @@ -275,7 +274,6 @@ import * as misskey from "calckey-js"; import XReactionIcon from "@/components/MkReactionIcon.vue"; import MkFollowButton from "@/components/MkFollowButton.vue"; import XReactionTooltip from "@/components/MkReactionTooltip.vue"; -import XShowMoreButton from "./MkShowMoreButton.vue"; import { getNoteSummary } from "@/scripts/get-note-summary"; import { notePage } from "@/filters/note"; import { userPage } from "@/filters/user"; @@ -301,19 +299,12 @@ const props = withDefaults( const elRef = ref<HTMLElement>(null); const reactionRef = ref(null); -const summary = getNoteSummary(props.notification.note); - const showEmojiReactions = defaultStore.state.enableEmojiReactions || defaultStore.state.showEmojisInReactionNotifications; const defaultReaction = ["⭐", "👍", "❤️"].includes(instance.defaultReaction) ? instance.defaultReaction : "⭐"; -const isLong = (summary.split("\n").length > 3 || summary.length > 200); -const collapsed = $ref(isLong); - - - let readObserver: IntersectionObserver | undefined; let connection; @@ -495,7 +486,6 @@ useTooltip(reactionRef, (showing) => { } > .tail { - position: relative; flex: 1; min-width: 0; @@ -536,17 +526,6 @@ useTooltip(reactionRef, (showing) => { margin-left: 4px; } } - &.collapsed > .text { - display: block; - position: relative; - max-height: calc(4em + 50px); - overflow: hidden; - mask: linear-gradient(black calc(100% - 64px), transparent); - -webkit-mask: linear-gradient( - black calc(100% - 64px), - transparent - ); - } } } </style> diff --git a/packages/client/src/components/MkShowMoreButton.vue b/packages/client/src/components/MkShowMoreButton.vue deleted file mode 100644 index 3516d6f43c..0000000000 --- a/packages/client/src/components/MkShowMoreButton.vue +++ /dev/null @@ -1,68 +0,0 @@ -<template> - <button - v-if="modelValue" - class="fade _button" - @click.stop="toggle" - > - <span>{{ i18n.ts.showMore }}</span> - </button> - <button - v-if="!modelValue" - class="showLess _button" - @click.stop="toggle" - > - <span>{{ i18n.ts.showLess }}</span> - </button> -</template> -<script lang="ts" setup> -import { i18n } from "@/i18n"; - -const props = defineProps<{ - modelValue: boolean; -}>(); - -const emit = defineEmits<{ - (ev: "update:modelValue", v: boolean): void; -}>(); - -const toggle = () => { - emit("update:modelValue", !props.modelValue); -}; -</script> -<style lang="scss" scoped> -.fade { - display: block; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - > span { - display: inline-block; - background: var(--panel); - padding: 0.4em 1em; - font-size: 0.8em; - border-radius: 999px; - box-shadow: 0 2px 6px rgb(0 0 0 / 20%); - } - &:hover { - > span { - background: var(--panelHighlight); - } - } -} -.showLess { - width: 100%; - margin-top: 1em; - position: sticky; - bottom: var(--stickyBottom); - - > span { - display: inline-block; - background: var(--panel); - padding: 6px 10px; - font-size: 0.8em; - border-radius: 999px; - box-shadow: 0 0 7px 7px var(--bg); - } -} -</style> diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index 68439527a7..94869402f8 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -106,8 +106,21 @@ v-on:focus="cwButton?.focus()" ></div> </div> - <XShowMoreButton v-if="isLong" v-model="collapsed"></XShowMoreButton> - <XCwButton v-if="note.cw && showContent" v-model="showContent" :note="note" /> + <button + v-if="isLong && collapsed" + class="fade _button" + @click.stop="collapsed = false" + > + <span>{{ i18n.ts.showMore }}</span> + </button> + <button + v-if="isLong && !collapsed" + class="showLess _button" + @click.stop="collapsed = true" + > + <span>{{ i18n.ts.showLess }}</span> + </button> + <XCwButton v-if="note.cw" v-model="showContent" :note="note" /> </div> </div> </template> @@ -120,7 +133,6 @@ import XNoteSimple from "@/components/MkNoteSimple.vue"; import XMediaList from "@/components/MkMediaList.vue"; import XPoll from "@/components/MkPoll.vue"; import MkUrlPreview from "@/components/MkUrlPreview.vue"; -import XShowMoreButton from "./MkShowMoreButton.vue"; import XCwButton from "@/components/MkCwButton.vue"; import { extractUrlFromMfm } from "@/scripts/extract-url-from-mfm"; import { i18n } from "@/i18n"; @@ -145,7 +157,6 @@ const isLong = props.note.text != null && (props.note.text.split("\n").length > 9 || props.note.text.length > 500); const collapsed = $ref(props.note.cw == null && isLong); - const urls = props.note.text ? extractUrlFromMfm(mfm.parse(props.note.text)).slice(0, 5) : null; @@ -274,6 +285,43 @@ function focusFooter(ev) { top: 40px; } } + + :deep(.fade) { + display: block; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + > span { + display: inline-block; + background: var(--panel); + padding: 0.4em 1em; + font-size: 0.8em; + border-radius: 999px; + box-shadow: 0 2px 6px rgb(0 0 0 / 20%); + } + &:hover { + > span { + background: var(--panelHighlight); + } + } + } + } + + :deep(.showLess) { + width: 100%; + margin-top: 1em; + position: sticky; + bottom: var(--stickyBottom); + + > span { + display: inline-block; + background: var(--panel); + padding: 6px 10px; + font-size: 0.8em; + border-radius: 999px; + box-shadow: 0 0 7px 7px var(--bg); + } } } } diff --git a/packages/client/src/components/MkUserPreview.vue b/packages/client/src/components/MkUserPreview.vue index ddfd39f14a..1e6db14423 100644 --- a/packages/client/src/components/MkUserPreview.vue +++ b/packages/client/src/components/MkUserPreview.vue @@ -55,7 +55,20 @@ :custom-emojis="user.emojis" /> </div> - <XShowMoreButton v-if="isLong" v-model="collapsed"></XShowMoreButton> + <button + v-if="isLong && collapsed" + class="fade _button" + @click.stop="collapsed = false" + > + <span>{{ i18n.ts.showMore }}</span> + </button> + <button + v-if="isLong && !collapsed" + class="showLess _button" + @click.stop="collapsed = true" + > + <span>{{ i18n.ts.showLess }}</span> + </button> <div v-if="user.fields.length > 0" class="fields"> <dl v-for="(field, i) in user.fields" @@ -115,7 +128,6 @@ import * as Acct from "calckey-js/built/acct"; import type * as misskey from "calckey-js"; import MkFollowButton from "@/components/MkFollowButton.vue"; import { userPage } from "@/filters/user"; -import XShowMoreButton from "./MkShowMoreButton.vue"; import * as os from "@/os"; import { $i } from "@/account"; import { i18n } from "@/i18n"; From a1c874eff5af0c6750a409444fa9e53f2fb13b39 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 29 Apr 2023 19:39:28 -0700 Subject: [PATCH 039/309] 9h --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 300ff61217..454ba4d30e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.2.0-beta9", + "version": "13.2.0-beta9h", "codename": "aqua", "repository": { "type": "git", From e44052cd250ca676e6d5c3cfc5919e00ddebe037 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 1 May 2023 21:08:44 -0700 Subject: [PATCH 040/309] fix show more import --- packages/client/src/components/MkSubNoteContent.vue | 1 + packages/client/src/components/MkUserPreview.vue | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index c84f7f0641..c1fdfddc04 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -133,6 +133,7 @@ import XMediaList from "@/components/MkMediaList.vue"; import XPoll from "@/components/MkPoll.vue"; import MkUrlPreview from "@/components/MkUrlPreview.vue"; import XCwButton from "@/components/MkCwButton.vue"; +import XShowMoreButton from "./MkShowMoreButton.vue"; import { extractUrlFromMfm } from "@/scripts/extract-url-from-mfm"; import { i18n } from "@/i18n"; diff --git a/packages/client/src/components/MkUserPreview.vue b/packages/client/src/components/MkUserPreview.vue index 9656b053f6..b154e529e9 100644 --- a/packages/client/src/components/MkUserPreview.vue +++ b/packages/client/src/components/MkUserPreview.vue @@ -121,6 +121,7 @@ import * as Acct from "calckey-js/built/acct"; import type * as misskey from "calckey-js"; import MkFollowButton from "@/components/MkFollowButton.vue"; import { userPage } from "@/filters/user"; +import XShowMoreButton from "./MkShowMoreButton.vue"; import * as os from "@/os"; import { $i } from "@/account"; import { i18n } from "@/i18n"; From b28c3f5da768e3d45d9d2de9b5610a6c0a0d56ae Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 1 May 2023 21:50:14 -0700 Subject: [PATCH 041/309] max import posts twice a month --- packages/backend/src/server/api/endpoints/i/import-posts.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/i/import-posts.ts b/packages/backend/src/server/api/endpoints/i/import-posts.ts index 6fdf562fdb..5f4b99f029 100644 --- a/packages/backend/src/server/api/endpoints/i/import-posts.ts +++ b/packages/backend/src/server/api/endpoints/i/import-posts.ts @@ -8,8 +8,8 @@ export const meta = { secure: true, requireCredential: true, limit: { - duration: DAY, - max: 1, + duration: DAY * 30, + max: 2, }, errors: { noSuchFile: { From c836bcfd0af4e20f352bcbedcf31b9b5057bbc9f Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 1 May 2023 23:09:10 -0700 Subject: [PATCH 042/309] no imports --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4fc9a2996..497ba9cae9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "14.0.0-rc", + "version": "14.0.0-rc-ni", "codename": "aqua", "repository": { "type": "git", From 2d79418851021c0dbd215871d6ec543bdfd98155 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 5 Jun 2023 21:21:10 -0700 Subject: [PATCH 043/309] rc2b --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 583befeee4..10611acab6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "14.0.0-rc2", + "version": "14.0.0-rc2b", "codename": "aqua", "repository": { "type": "git", From 0485b545e24589aca99a31cf2045f53a83910028 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 6 Jun 2023 12:13:54 -0700 Subject: [PATCH 044/309] =?UTF-8?q?release:=20=F0=9F=9A=91=20rc2c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7315 +++++++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 3664 insertions(+), 3653 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f1f76bf54..af69478734 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,18 @@ All changes from v13.0.0 onwards, for a full list of differences read CALCKEY.md -## [14.0.0-rc2] - 2023-06-06 +## [14.0.0-rc2c] - 2023-06-06 + +### Bug Fixes + +- Fix: post editing meta +- Fix: cw button position + +### Miscellaneous Tasks + +- Update cargo.lock + +## [14.0.0-rc2] - 2023-06-05 ### Bug Fixes @@ -3574,10 +3585,10 @@ fix: :fire: Remove meta implementation in routing for now - Feat: show header with current user avatar on TL ([#9051](https://github.com/orhun/git-cliff/issues/9051)) -* feat: show header with current user avatar on TL - -* refactor(client): use displayMyAvatar prop instead of metadata - +* feat: show header with current user avatar on TL + +* refactor(client): use displayMyAvatar prop instead of metadata + * refactor(client): prefer v-if to `display: none;` - Feat: :bookmark: .1 @@ -3690,23 +3701,23 @@ From yarn upgrade-interactive - Chore(sw): only proxies HTML requests ([#9070](https://github.com/orhun/git-cliff/issues/9070)) -* chore(sw): only proxies HTML requests - -もはやHTMLじゃなさそうなリクエストにはSWで関与しないようにする - -こうするといろいろな面倒事が解決するはず…たぶん - -Resolve #9037 -Resolve #9038 - -* align code style - -* Update packages/sw/src/sw.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> -Co-authored-by: tamaina <tamaina@hotmail.co.jp> +* chore(sw): only proxies HTML requests + +もはやHTMLじゃなさそうなリクエストにはSWで関与しないようにする + +こうするといろいろな面倒事が解決するはず…たぶん + +Resolve #9037 +Resolve #9038 + +* align code style + +* Update packages/sw/src/sw.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> +Co-authored-by: tamaina <tamaina@hotmail.co.jp> Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Chore: :twisted_rightwards_arrows: Merge upstream to 12.119.0 @@ -3834,57 +3845,57 @@ Fix #9043 - Feature: Client Preferences Registry ([#8511](https://github.com/orhun/git-cliff/issues/8511)) -* Fix settings page - -* nanka iroiro - -* clean up - -* clean up - -* feature: Client Preferences Registry on the account - -* add changelog - -* インデックスに戻ってもタイトルが残ってしまうのを修正 - -* fix createdAt -> updatedAt - -* remove console.log - -* 適用→このデバイスに適用 - -* add wallpaper - -* ローカルのjsonファイルを保存・読み込みできるように - -* clean up - -* use apiWithDialog - -* Update packages/client/src/pages/settings/preferences-registry.vue - -Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> - -* Update packages/client/src/pages/settings/preferences-registry.vue - -Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> - -* Update packages/client/src/pages/settings/preferences-registry.vue - -Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> - -* fix lint - -* :v: - -* change router - -* nanka iroiro - -* tweak - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> +* Fix settings page + +* nanka iroiro + +* clean up + +* clean up + +* feature: Client Preferences Registry on the account + +* add changelog + +* インデックスに戻ってもタイトルが残ってしまうのを修正 + +* fix createdAt -> updatedAt + +* remove console.log + +* 適用→このデバイスに適用 + +* add wallpaper + +* ローカルのjsonファイルを保存・読み込みできるように + +* clean up + +* use apiWithDialog + +* Update packages/client/src/pages/settings/preferences-registry.vue + +Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> + +* Update packages/client/src/pages/settings/preferences-registry.vue + +Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> + +* Update packages/client/src/pages/settings/preferences-registry.vue + +Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> + +* fix lint + +* :v: + +* change router + +* nanka iroiro + +* tweak + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> - Feat(client): improve widget @@ -3973,10 +3984,10 @@ Fix #9026 - Fix: broken chats ([#8983](https://github.com/orhun/git-cliff/issues/8983)) -* Fix broken chats - -Co-authored-by: @ltlapy - +* Fix broken chats + +Co-authored-by: @ltlapy + * :art: - Fix @@ -4008,19 +4019,19 @@ Co-authored-by: @ltlapy - Chore(deps): bump terser from 5.9.0 to 5.14.2 ([#9024](https://github.com/orhun/git-cliff/issues/9024)) -Bumps [terser](https://github.com/terser/terser) from 5.9.0 to 5.14.2. -- [Release notes](https://github.com/terser/terser/releases) -- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) -- [Commits](https://github.com/terser/terser/commits) - ---- -updated-dependencies: -- dependency-name: terser - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [terser](https://github.com/terser/terser) from 5.9.0 to 5.14.2. +- [Release notes](https://github.com/terser/terser/releases) +- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) +- [Commits](https://github.com/terser/terser/commits) + +--- +updated-dependencies: +- dependency-name: terser + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak theme select ui @@ -4030,33 +4041,33 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump file-type from 17.1.2 to 17.1.3 in /packages/backend ([#9030](https://github.com/orhun/git-cliff/issues/9030)) -Bumps [file-type](https://github.com/sindresorhus/file-type) from 17.1.2 to 17.1.3. -- [Release notes](https://github.com/sindresorhus/file-type/releases) -- [Commits](https://github.com/sindresorhus/file-type/compare/v17.1.2...v17.1.3) - ---- -updated-dependencies: -- dependency-name: file-type - dependency-type: direct:production -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [file-type](https://github.com/sindresorhus/file-type) from 17.1.2 to 17.1.3. +- [Release notes](https://github.com/sindresorhus/file-type/releases) +- [Commits](https://github.com/sindresorhus/file-type/compare/v17.1.2...v17.1.3) + +--- +updated-dependencies: +- dependency-name: file-type + dependency-type: direct:production +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump undici from 5.5.1 to 5.8.0 in /packages/backend ([#9028](https://github.com/orhun/git-cliff/issues/9028)) -Bumps [undici](https://github.com/nodejs/undici) from 5.5.1 to 5.8.0. -- [Release notes](https://github.com/nodejs/undici/releases) -- [Commits](https://github.com/nodejs/undici/compare/v5.5.1...v5.8.0) - ---- -updated-dependencies: -- dependency-name: undici - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [undici](https://github.com/nodejs/undici) from 5.5.1 to 5.8.0. +- [Release notes](https://github.com/nodejs/undici/releases) +- [Commits](https://github.com/nodejs/undici/compare/v5.5.1...v5.8.0) + +--- +updated-dependencies: +- dependency-name: undici + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak style @@ -5326,25 +5337,25 @@ Closes #2519 - Fix(package): update @types/node to version 10.9.4 - Fix #2315 ([#2339](https://github.com/orhun/git-cliff/issues/2339)) -* improve MFM to html - -* improve html to MFM - -* missing semicolon - -* missing semicolon - -* fix html to MFM - -タグのリンクは解除するように - -* fix bug - -* misssing semicolon - -* Update html-to-mfm.ts - -* Update html-to-mfm.ts +* improve MFM to html + +* improve html to MFM + +* missing semicolon + +* missing semicolon + +* fix html to MFM + +タグのリンクは解除するように + +* fix bug + +* misssing semicolon + +* Update html-to-mfm.ts + +* Update html-to-mfm.ts - Fix @@ -5613,11 +5624,11 @@ Closes #2986 - Fix #5214 ウィジェットが選択されていないときは追加されないように ([#5227](https://github.com/orhun/git-cliff/issues/5227)) -* fix #5214 - -* null削除の取り消し - -* 空白文字の調整 +* fix #5214 + +* null削除の取り消し + +* 空白文字の調整 - Fix typo in misskey.nginx ([#5445](https://github.com/orhun/git-cliff/issues/5445)) @@ -5700,15 +5711,15 @@ Close #6434 - Fix サイドバーの設定に不具合があるとページが表示できなくなる ([#6473](https://github.com/orhun/git-cliff/issues/6473)) -* fix #6460 - -* Update app.vue - +* fix #6460 + +* Update app.vue + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix 非ログイン時に n または p キー押下で投稿フォームが出る ([#6508](https://github.com/orhun/git-cliff/issues/6508)) -* fix #5851 - +* fix #5851 + * post-formのスポーンを弾く場所を変更 - Fix(client): Fix style @@ -5944,20 +5955,20 @@ Resolve #7540 - Fix: truncate user information if it is too long ([#7629](https://github.com/orhun/git-cliff/issues/7629)) -* truncate user information if it is too long - -Some AP software allows for user names or summaries to be very long. -Misskey can not handle this and the profile page can not be opened and -no activities from such users can be seen. - -Instead, the user name and summary are cut off after the maximum length -so misskey can still process the activities of the profile. - -Co-authored-by: Toast <toast@toast.cafe> - -* fix code style - -Co-authored-by: Toast <toast@toast.cafe> +* truncate user information if it is too long + +Some AP software allows for user names or summaries to be very long. +Misskey can not handle this and the profile page can not be opened and +no activities from such users can be seen. + +Instead, the user name and summary are cut off after the maximum length +so misskey can still process the activities of the profile. + +Co-authored-by: Toast <toast@toast.cafe> + +* fix code style + +Co-authored-by: Toast <toast@toast.cafe> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix typo @@ -6001,17 +6012,17 @@ Fix #7648 - Fix missing strings ([#7674](https://github.com/orhun/git-cliff/issues/7674)) -* fix sort menu in federation panel - -* add missing strings in report menu - +* fix sort menu in federation panel + +* add missing strings in report menu + * change i18n key too - Fix Dockerfile ([#7763](https://github.com/orhun/git-cliff/issues/7763)) -* fix Dockerfile - -* remove unnecessary change - +* fix Dockerfile + +* remove unnecessary change + * add misskey-assets in .dockerignore - Fix(server): ノート翻訳時に公開範囲が考慮されていない問題を修正 @@ -6045,32 +6056,32 @@ from: https://gitlab.com/xianon/misskey/-/commit/a89742319caea378f9cdd70c8ebd83b - Fix: truncate image descriptions ([#7699](https://github.com/orhun/git-cliff/issues/7699)) -* move truncate function to separate file to reuse it - -* truncate image descriptions - -* show image description limit in UI - -* correctly treat null - -Co-authored-by: nullobsi <me@nullob.si> - -* make truncate Unicode-aware - -The strings that truncate returns should now be valid Unicode. - -PostgreSQL also counts Unicode Code Points instead of bytes so this -should be correct. - -* move truncate to internal, validate in API - -Truncating could also be done in src/services/drive/add-file.ts or -src/services/drive/upload-from-url.ts but those would also affect -local images. But local images should result in a hard error if the -image comment is too long. - -* avoid overwriting - +* move truncate function to separate file to reuse it + +* truncate image descriptions + +* show image description limit in UI + +* correctly treat null + +Co-authored-by: nullobsi <me@nullob.si> + +* make truncate Unicode-aware + +The strings that truncate returns should now be valid Unicode. + +PostgreSQL also counts Unicode Code Points instead of bytes so this +should be correct. + +* move truncate to internal, validate in API + +Truncating could also be done in src/services/drive/add-file.ts or +src/services/drive/upload-from-url.ts but those would also affect +local images. But local images should result in a hard error if the +image comment is too long. + +* avoid overwriting + Co-authored-by: nullobsi <me@nullob.si> - Fix bug @@ -6135,33 +6146,33 @@ Fix #7905 - Fix: Fix #7895 ([#7937](https://github.com/orhun/git-cliff/issues/7937)) -* Fix #7895 - +* Fix #7895 + * CHANGELOG - Fix: 削除したノートやユーザーがリモートから参照されると復活することがあるのを修正 ([#7918](https://github.com/orhun/git-cliff/issues/7918)) -* Fix #7557 - -* CHANGELOG - -* Fix user - -* CHANGELOG - -* Tune CHANGELOG - -* Tune CHANGELOG - -* resolver - -* Remove check - -* Remove import - -* CHANGELOG - -* Tune - +* Fix #7557 + +* CHANGELOG + +* Fix user + +* CHANGELOG + +* Tune CHANGELOG + +* Tune CHANGELOG + +* resolver + +* Remove check + +* Remove import + +* CHANGELOG + +* Tune + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix(client): ページ編集時のドロップダウンメニューなどが動作しない問題を修正 @@ -6175,10 +6186,10 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix(client): Add missing localization string ([#7944](https://github.com/orhun/git-cliff/issues/7944)) -* 欠けるi18nストリングの追加 - -* Update ja-JP.yml - +* 欠けるi18nストリングの追加 + +* Update ja-JP.yml + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix @@ -6196,12 +6207,12 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix: mention local users in replies ([#7975](https://github.com/orhun/git-cliff/issues/7975)) -* mention local users in replies - +* mention local users in replies + * fix merge - Fix(client): reaction viewer layout ([#7942](https://github.com/orhun/git-cliff/issues/7942)) -The profile picture and name should be grouped together as they belong, and +The profile picture and name should be grouped together as they belong, and it should be clear which picture belongs to which name. - Fix for lint @@ -6216,8 +6227,8 @@ it should be clear which picture belongs to which name. - Fix(client): fix plugin activate and uninstall ([#7991](https://github.com/orhun/git-cliff/issues/7991)) -* fix(client): fix plugin activate and uninstall - +* fix(client): fix plugin activate and uninstall + * Fix(client): fix package activates - Fix(client): better error handling of file upload @@ -6227,48 +6238,48 @@ it should be clear which picture belongs to which name. - Fix: toolsが動かないのを修正 ([#8008](https://github.com/orhun/git-cliff/issues/8008)) -* Move tools - +* Move tools + * Fix DB - Fix: notification.vueのIntersectionObserverまわりを修正 ([#8010](https://github.com/orhun/git-cliff/issues/8010)) -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* Update packages/client/src/components/notification.vue - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* disconnect - -* oops - +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* Update packages/client/src/components/notification.vue + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* disconnect + +* oops + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Fix(client): モバイルでタップしたときにツールチップが表示される問題を修正 - Fix: LTLやGTLが無効になっている場合でもUI上にタブが表示される問題を修正 ([#8026](https://github.com/orhun/git-cliff/issues/8026)) -* wip - -* add changelog - +* wip + +* add changelog + * 変換ミス修正 - Fix mentions in replies ([#8030](https://github.com/orhun/git-cliff/issues/8030)) - Fix: 画像ファイルの縦横サイズの取得で Exif Orientation を考慮する ([#8014](https://github.com/orhun/git-cliff/issues/8014)) -* 画像ファイルの縦横サイズの取得で Exif Orientation を考慮する - -* test: Add rotate.jpg test - -* Webpublic 画像を返す時のみ Exif Orientation を考慮して縦横サイズを返す - +* 画像ファイルの縦横サイズの取得で Exif Orientation を考慮する + +* test: Add rotate.jpg test + +* Webpublic 画像を返す時のみ Exif Orientation を考慮して縦横サイズを返す + * test: Support orientation - Fix(server): Fix #8032 @@ -6359,35 +6370,35 @@ https://github.com/misskey-dev/misskey/commit/d53795184cd0ee326b0da58b267e3460f9 - Fix: proxyでsvgをpngに変換するように ([#8106](https://github.com/orhun/git-cliff/issues/8106)) -* wip - -* revert send-drive-file change - -* fix - -* Update packages/backend/src/server/proxy/proxy-media.ts - -Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> - +* wip + +* revert send-drive-file change + +* fix + +* Update packages/backend/src/server/proxy/proxy-media.ts + +Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> + Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> - Fix: code url in documentation ([#8117](https://github.com/orhun/git-cliff/issues/8117)) It seems this was not changed while refactoring the modules apart. - Fix([#8133](https://github.com/orhun/git-cliff/issues/8133)): hCaptcha の reCAPTCHA 互換挙動を無効化する ([#8135](https://github.com/orhun/git-cliff/issues/8135)) -* fix([#8133](https://github.com/orhun/git-cliff/issues/8133)): hCaptcha の reCAPTCHA 互換挙動を無効化する - -* Update packages/client/src/components/captcha.vue - -* fix: hCaptcha host - +* fix([#8133](https://github.com/orhun/git-cliff/issues/8133)): hCaptcha の reCAPTCHA 互換挙動を無効化する + +* Update packages/client/src/components/captcha.vue + +* fix: hCaptcha host + Co-authored-by: tamaina <tamaina@hotmail.co.jp> - Fix(client): タイムラインのkeep-aliveが効かなくなっているのを修正 - Fix: アップロードエラー時の処理を修正 ([#8182](https://github.com/orhun/git-cliff/issues/8182)) -* アップロードのエラー応答で詰むのを修正 - +* アップロードのエラー応答で詰むのを修正 + * CHANGELOG - Fix: change keypress to keydown ([#8192](https://github.com/orhun/git-cliff/issues/8192)) @@ -6418,41 +6429,41 @@ Fix #8212 - Fix federation widged ([#8221](https://github.com/orhun/git-cliff/issues/8221)) -The variables accidentally shadowed the variables that contain the ref's +The variables accidentally shadowed the variables that contain the ref's to be rendered into the template. - Fix federation widget - Fix eslint rule - Fix: ensure that specified users does not get duplicates ([#8233](https://github.com/orhun/git-cliff/issues/8233)) -* ensure that specified users does not get duplicates - -* Update packages/client/src/components/post-form.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - +* ensure that specified users does not get duplicates + +* Update packages/client/src/components/post-form.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix: Fix Sideview ([#8235](https://github.com/orhun/git-cliff/issues/8235)) -* Fix #7890 - -* a- - -* 3度目の正直 - -* fix - -* :v: - -* update CHANGELOG - +* Fix #7890 + +* a- + +* 3度目の正直 + +* fix + +* :v: + +* update CHANGELOG + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix(client): ツールチップの表示位置が正しくない問題を修正 - Fix: ストリーミングからのAPIリクエストが出来ないのを修正 ([#8244](https://github.com/orhun/git-cliff/issues/8244)) -* Update call.ts - +* Update call.ts + * あれ - Fix(client): fix compare-versions import @@ -6462,30 +6473,30 @@ Fix #6831 - Fix chart clean - Fix: NodeInfo のユーザー数と投稿数の内容を見直す ([#8255](https://github.com/orhun/git-cliff/issues/8255)) -* NodeInfoのアクティブユーザーの取得方法を変更する - +* NodeInfoのアクティブユーザーの取得方法を変更する + * NodeInfoの投稿数の出力内容を見直す - Fix - Fix: v-sizeディレクティブの動作を修正 ([#8249](https://github.com/orhun/git-cliff/issues/8249)) -* Fix size directive behavior not activated - -* calc - -* wip - -* cache computed classes - -* fix Vue3では使えなくなった - -* 不要なIntersection Observerを削除 - +* Fix size directive behavior not activated + +* calc + +* wip + +* cache computed classes + +* fix Vue3では使えなくなった + +* 不要なIntersection Observerを削除 + * comment - Fix: instance ticker ([#8260](https://github.com/orhun/git-cliff/issues/8260)) -* add type and default values - +* add type and default values + * remove unnecessary string operation - Fix(server): system queueが動いていないのを修正 @@ -6519,23 +6530,23 @@ Fix #8252 - Fix: regular expressions in word mutes ([#8254](https://github.com/orhun/git-cliff/issues/8254)) -* fix: handle regex exceptions for word mutes - -* add i18n strings - -Co-authored-by: rinsuki <428rinsuki+git@gmail.com> - -* stricter input validation in backend - -* add migration for hard mutes - -* fix - -* use correct regex library in migration - -* use query builder to avoid SQL injection - -Co-authored-by: Robin B <robflop98@outlook.com> +* fix: handle regex exceptions for word mutes + +* add i18n strings + +Co-authored-by: rinsuki <428rinsuki+git@gmail.com> + +* stricter input validation in backend + +* add migration for hard mutes + +* fix + +* use correct regex library in migration + +* use query builder to avoid SQL injection + +Co-authored-by: Robin B <robflop98@outlook.com> Co-authored-by: rinsuki <428rinsuki+git@gmail.com> - Fix(client): word mute cannot save @@ -6568,26 +6579,26 @@ Fix #8071 - Fix: also recognize "shortcut icon" favicon ([#8220](https://github.com/orhun/git-cliff/issues/8220)) -* also recognize "shortcut icon" favicon - -Not using querySelector for this because it uses jsdom which might be slower. -Reversing the order because WHATWG says the last appropriate link should be used. - -* also fetchIconUrl - -* br - -* improve readability - -* fix - -* フォールバックにhrefの評価を含める - -* fix val name - -* 将来的な拡張を考えたコードにした - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> +* also recognize "shortcut icon" favicon + +Not using querySelector for this because it uses jsdom which might be slower. +Reversing the order because WHATWG says the last appropriate link should be used. + +* also fetchIconUrl + +* br + +* improve readability + +* fix + +* フォールバックにhrefの評価を含める + +* fix val name + +* 将来的な拡張を考えたコードにした + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix: better language settings @@ -6635,12 +6646,12 @@ Fix #8318 - Fix: iPhone X以降(?)でページの内容が全て表示しきれないのを修正 ([#8375](https://github.com/orhun/git-cliff/issues/8375)) -* add safe-area-inset-bottom to spacer - -* fix - -* :v: - +* add safe-area-inset-bottom to spacer + +* fix + +* :v: + * fix - Fix federation chart @@ -6659,7 +6670,7 @@ Fix #8392 - Fix API console ([#8416](https://github.com/orhun/git-cliff/issues/8416)) -Adjusted the server to send the API description based on the new +Adjusted the server to send the API description based on the new API type declarations introduced previously. - Fix(client): fix popup menu direction calclation @@ -6680,10 +6691,10 @@ Fix #8455 - Fix(federation): avoid duplicate activity delivery ([#8429](https://github.com/orhun/git-cliff/issues/8429)) -* prefer shared inbox over individual inbox - -* no new shared inbox for direct recipes - +* prefer shared inbox over individual inbox + +* no new shared inbox for direct recipes + * fix type error - Fix syntax error @@ -6694,12 +6705,12 @@ Fix #8455 - Fix: validation ([#8456](https://github.com/orhun/git-cliff/issues/8456)) ([#8461](https://github.com/orhun/git-cliff/issues/8461)) -* Revert "revert 484e023c0" - -This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. - -* also allow pure renote - +* Revert "revert 484e023c0" + +This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. + +* also allow pure renote + * fix checks for pure renote - Fix e2e test @@ -6715,34 +6726,34 @@ This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. - Fix: アンテナ、クリップ、リストの表示を速くする ([#8518](https://github.com/orhun/git-cliff/issues/8518)) -* アンテナノートを取得するクエリがタイムアウトしないように速くする - -* テーブル名を直接指定しないようにする - -* クリップの取得を速くする - +* アンテナノートを取得するクエリがタイムアウトしないように速くする + +* テーブル名を直接指定しないようにする + +* クリップの取得を速くする + * リストの取得を速くする - Fix: Fix settings page ([#8508](https://github.com/orhun/git-cliff/issues/8508)) -* Fix settings page - -* nanka iroiro - -* clean up - -* clean up - +* Fix settings page + +* nanka iroiro + +* clean up + +* clean up + * インデックスに戻ってもタイトルが残ってしまうのを修正 - Fix ogp rendering and refactor - Fix: アンテナ、クリップ、リストの表示を速くする ([#8518](https://github.com/orhun/git-cliff/issues/8518)) -* アンテナノートを取得するクエリがタイムアウトしないように速くする - -* テーブル名を直接指定しないようにする - -* クリップの取得を速くする - +* アンテナノートを取得するクエリがタイムアウトしないように速くする + +* テーブル名を直接指定しないようにする + +* クリップの取得を速くする + * リストの取得を速くする - Fix: Promises -> Promise ([#8545](https://github.com/orhun/git-cliff/issues/8545)) @@ -6752,8 +6763,8 @@ This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. - Fix: Add rel attribute to host-meta ([#8583](https://github.com/orhun/git-cliff/issues/8583)) -* Add rel attribute to host-meta - +* Add rel attribute to host-meta + * CHANGELOG - Fix _misskey_content of quote renotes ([#8533](https://github.com/orhun/git-cliff/issues/8533)) @@ -6777,8 +6788,8 @@ This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. - Fix: ユーザー検索で、クエリがusernameの条件を満たす場合はusernameもLIKE検索するように ([#8644](https://github.com/orhun/git-cliff/issues/8644)) -* Fix #8643 - +* Fix #8643 + * 部分一致にする - Fix(client): additional background for acrylic popups if unsupported @@ -6795,32 +6806,32 @@ Fix a bug introduced in #8659. Solution was already tested there. - Fix: ノートのインスタンス情報の文字に縁を付けて見やすくする ([#8697](https://github.com/orhun/git-cliff/issues/8697)) -* ノートのインスタンス情報の背景色が反映されないことがあるのを修正する - -* ノートのインスタンス情報の文字に縁を付けて見やすくする - -* Revert "ノートのインスタンス情報の背景色が反映されないことがあるのを修正する" - -This reverts commit de920dfc537d1f2c68804d0d6930520f2b3cbce7. - +* ノートのインスタンス情報の背景色が反映されないことがあるのを修正する + +* ノートのインスタンス情報の文字に縁を付けて見やすくする + +* Revert "ノートのインスタンス情報の背景色が反映されないことがあるのを修正する" + +This reverts commit de920dfc537d1f2c68804d0d6930520f2b3cbce7. + * ノートのインスタンス情報の文字の影の数を増やしてさらに見やすくする - Fix: Unable to generate video thumbnails ([#8696](https://github.com/orhun/git-cliff/issues/8696)) -* fix: Unable to generate video thumbnails - +* fix: Unable to generate video thumbnails + * CHANGELOG - Fix(client): fix lint issues in Deck UI components ([#8681](https://github.com/orhun/git-cliff/issues/8681)) - Fix: ノート詳細ページの新しいノートを表示する機能の動作が正しくなるように修正する ([#8607](https://github.com/orhun/git-cliff/issues/8607)) -* ノート詳細で新しいノートの表示が正しくないのを修正する - +* ノート詳細で新しいノートの表示が正しくないのを修正する + * ノート詳細から別のノート詳細を表示した時に前後の表示をリセットする - Fix(activitypub): add authorization checks ([#8534](https://github.com/orhun/git-cliff/issues/8534)) -* fix spelling - +* fix spelling + * fix(activitypub): add authorization checks - Fix(client): make emoji stand out more on reaction button @@ -6841,24 +6852,24 @@ Co-Authored-By: Johann150 <20990607+Johann150@users.noreply.github.com> - Fix: assume remote users are following each other ([#8734](https://github.com/orhun/git-cliff/issues/8734)) -Misskey does not know if two remote users are following each other. -Because ActivityPub actions would otherwise fail on followers only -notes, we have to assume that two remote users are following each other +Misskey does not know if two remote users are following each other. +Because ActivityPub actions would otherwise fail on followers only +notes, we have to assume that two remote users are following each other when an interaction about a remote note occurs. - Fix lints ([#8737](https://github.com/orhun/git-cliff/issues/8737)) -* fix: emits use ev instead of e - -* fix: errors use err instead of e - -* fix: replace use of data where possible - -* fix: events use evt instead of e - -* fix: use strict equals - -* fix: use emoji instead of e - +* fix: emits use ev instead of e + +* fix: errors use err instead of e + +* fix: replace use of data where possible + +* fix: events use evt instead of e + +* fix: use strict equals + +* fix: use emoji instead of e + * fix: vue lints - Fix(docs): correct information for drive upload ([#8736](https://github.com/orhun/git-cliff/issues/8736)) @@ -6868,12 +6879,12 @@ when an interaction about a remote note occurs. fix #8747 - Fix(client): Vite related boot mechanism revision ([#8753](https://github.com/orhun/git-cliff/issues/8753)) -* preload app css - -* remove salt - -* APP_FETCH_FAILED error - +* preload app css + +* remove salt + +* APP_FETCH_FAILED error + * set max-age to 15s - Fix(client): fix popout url ([#8494](https://github.com/orhun/git-cliff/issues/8494)) @@ -6905,56 +6916,56 @@ fix #8756 - Fix: correctly render empty note text ([#8746](https://github.com/orhun/git-cliff/issues/8746)) -Ensure that the _misskey_content attribute will always exist. Because -the API endpoint does not require the existence of the `text` field, -that field may be `undefined`. By using `?? null` it can be ensured -that the value is at least `null`. - -Furthermore, the rendered HTML of a note with empty text will also be -the empty string. From git blame it seems that this behaviour was added -because of a Mastodon bug that might have previously existed. Hoever, -this seems to be no longer the case as I can find mastodon posts that -have empty content. - -The code could be made a bit more succinct by using the null coercion +Ensure that the _misskey_content attribute will always exist. Because +the API endpoint does not require the existence of the `text` field, +that field may be `undefined`. By using `?? null` it can be ensured +that the value is at least `null`. + +Furthermore, the rendered HTML of a note with empty text will also be +the empty string. From git blame it seems that this behaviour was added +because of a Mastodon bug that might have previously existed. Hoever, +this seems to be no longer the case as I can find mastodon posts that +have empty content. + +The code could be made a bit more succinct by using the null coercion operator. - Fix: ensure resolver does not fetch local resources via HTTP(S) ([#8733](https://github.com/orhun/git-cliff/issues/8733)) -* refactor: parseUri types and checks - -The type has been refined to better represent what it actually is. Uses of -parseUri are now also checking the parsed object type before resolving. - -* cannot resolve URLs with fragments - -* also take remaining part of URL into account - -Needed for parsing the follows URIs. - -* Resolver uses DbResolver for local - -* remove unnecessary use of DbResolver - -Using DbResolver would mean that the URL is parsed and handled again. -This duplicated processing can be avoided by querying the database directly. - +* refactor: parseUri types and checks + +The type has been refined to better represent what it actually is. Uses of +parseUri are now also checking the parsed object type before resolving. + +* cannot resolve URLs with fragments + +* also take remaining part of URL into account + +Needed for parsing the follows URIs. + +* Resolver uses DbResolver for local + +* remove unnecessary use of DbResolver + +Using DbResolver would mean that the URL is parsed and handled again. +This duplicated processing can be avoided by querying the database directly. + * fix missing property name - Fix: add id for activitypub follows ([#8689](https://github.com/orhun/git-cliff/issues/8689)) -* add id for activitypub follows - -* fix lint - -* fix: follower must be local, followee must be remote - -Misskey will only use ActivityPub follow requests for users that are local -and are requesting to follow a remote user. This check is to ensure that -this endpoint can not be used by other services or instances. - -* fix: missing import - -* render block with id - +* add id for activitypub follows + +* fix lint + +* fix: follower must be local, followee must be remote + +Misskey will only use ActivityPub follow requests for users that are local +and are requesting to follow a remote user. This check is to ensure that +this endpoint can not be used by other services or instances. + +* fix: missing import + +* render block with id + * fix comment - Fix test @@ -6987,10 +6998,10 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix: some fixes of multiple notification read ([#8819](https://github.com/orhun/git-cliff/issues/8819)) -* fix: limit multiple notification read - -* fix - +* fix: limit multiple notification read + +* fix + * fix - Fix(client): デッキでウィジェットの情報が保存されない問題を修正 @@ -7005,24 +7016,24 @@ Fix #8818 - Fix: add limit to i/notifications ([#8836](https://github.com/orhun/git-cliff/issues/8836)) -* fix: add limit to i/notifications - -* ms - +* fix: add limit to i/notifications + +* ms + * remove ms - Fix: tmpdir cleanup removes contained files ([#8826](https://github.com/orhun/git-cliff/issues/8826)) - Fix: GenerateVideoThumbnail ([#8825](https://github.com/orhun/git-cliff/issues/8825)) -* fix: GenerateVideoThumbnail - -* CHANGELOG - -* fix cleanup - -* Revert "fix cleanup" - +* fix: GenerateVideoThumbnail + +* CHANGELOG + +* fix cleanup + +* Revert "fix cleanup" + This reverts commit d54cf8262ac01a3deb6b8dd7689ec144d4d09ea8. - Fix: correctly render note text @@ -7061,17 +7072,17 @@ Instead of coercing to `null`, coercing to an empty string should simplify handl - Fix: always respect instance mutes ([#8854](https://github.com/orhun/git-cliff/issues/8854)) -* fix: muted user query also checks instances - -This way it can be ensured that the instance mute is used everywhere it -is required without checking the whole codebase again. Muted users and -muted instances should be used together anyways. - +* fix: muted user query also checks instances + +This way it can be ensured that the instance mute is used everywhere it +is required without checking the whole codebase again. Muted users and +muted instances should be used together anyways. + * fix lint - Fix(client): only enable hotkeys for logged in users ([#8793](https://github.com/orhun/git-cliff/issues/8793)) -* fix(client): only enable hotkeys for logged in users - +* fix(client): only enable hotkeys for logged in users + * fix(client): keep theme and search hotkeys for logged out users - Fix notification-setting-window.vue @@ -7081,28 +7092,28 @@ muted instances should be used together anyways. - Fix: mocha テストが動かないのを修正 v2 ([#8892](https://github.com/orhun/git-cliff/issues/8892)) -* on push - -* Fix mute test - -* fix note test - -* api - -* inc timeout - -* uploadUrl - -* Revert "on push" - -This reverts commit 778a58df61ff9a22421f8ec5dcce96b364eab38d. - -* lint - -* waitFire - -* Wrap connectStream - +* on push + +* Fix mute test + +* fix note test + +* api + +* inc timeout + +* uploadUrl + +* Revert "on push" + +This reverts commit 778a58df61ff9a22421f8ec5dcce96b364eab38d. + +* lint + +* waitFire + +* Wrap connectStream + * return - Fix(api): add missing themeColor property of instance @@ -7185,8 +7196,8 @@ fixes #8944 - Fix: QueryFailedError when logging user's IPs ([#8973](https://github.com/orhun/git-cliff/issues/8973)) -* fix QueryFailedError when logging user's IPs - +* fix QueryFailedError when logging user's IPs + * use `orIgnore` to fix - Fix(client): fix style of mention @@ -7196,25 +7207,25 @@ Fix #8878 - Fix(sw, notification): Don't issue an event if there is no affect ([#8979](https://github.com/orhun/git-cliff/issues/8979)) -* test - +* test + * ]v] - Fix: add `es2017` build target ([#8931](https://github.com/orhun/git-cliff/issues/8931)) -* remove top level awaits - -* add es2017 target - +* remove top level awaits + +* add es2017 target + * refactor: use setup and ref sugar - Fix(client): hide bot protection warning with disabled registrations ([#8794](https://github.com/orhun/git-cliff/issues/8794)) -* fix(client): hide bot protection warning with disabled registrations - -* Apply review suggestion from @Johann150 - -Co-authored-by: Johann150 <johann@qwertqwefsday.eu> - -Co-authored-by: Johann150 <johann@qwertqwefsday.eu> +* fix(client): hide bot protection warning with disabled registrations + +* Apply review suggestion from @Johann150 + +Co-authored-by: Johann150 <johann@qwertqwefsday.eu> + +Co-authored-by: Johann150 <johann@qwertqwefsday.eu> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix @@ -7267,11 +7278,11 @@ Fix #8474 - Docs(readme): add Greenkeeper badge - Docs to run in production mode ([#4347](https://github.com/orhun/git-cliff/issues/4347)) -* run in production mode from systemd - -* NODE_ENV=production npm run build - -* npm start +* run in production mode from systemd + +* NODE_ENV=production npm run build + +* npm start - Docs @@ -7322,20 +7333,20 @@ Fix #8474 - Add an endpoint users/lists/update ([#2585](https://github.com/orhun/git-cliff/issues/2585)) -* add an endpoint users/lists/update - -* add meta params - -* fix packing +* add an endpoint users/lists/update + +* add meta params + +* fix packing - Adds ko-KR な to にゃ ([#3820](https://github.com/orhun/git-cliff/issues/3820)) -* adds ko-KR な to にゃ -- this only take considers pre-composed "Hangul Syllables", -not composable area "Hangul Jamo" which are not used commonly -- 56 is '냐' - '나' - -* replace magic number as suggested +* adds ko-KR な to にゃ +- this only take considers pre-composed "Hangul Syllables", +not composable area "Hangul Jamo" which are not used commonly +- 56 is '냐' - '나' + +* replace magic number as suggested - ✨🌎✨ A federated blogging platform ✨🚀✨ @@ -7385,142 +7396,142 @@ Resolve #5819 - Feat(client): 翻訳をIndexedDBに保存・プッシュ通知を翻訳 ([#6396](https://github.com/orhun/git-cliff/issues/6396)) -* wip - -* tabun ok - -* better msg - -* oops - -* fix lint - -* Update gulpfile.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* Update src/client/scripts/set-i18n-contexts.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* refactor - -Co-authored-by: acid-chicken <root@acid-chicken.com> - -* ✨ - -* wip - -* fix lint - -* たぶんおk - -* fix flush - -* Translate Notification - -* remove console.log - -* fix - -* add notifications - -* remove san - -* wip - -* ok - -* :v: - -* Update src/prelude/array.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* wip - -* i18n refactor - -* Update init.ts - -* :v: - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> +* wip + +* tabun ok + +* better msg + +* oops + +* fix lint + +* Update gulpfile.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* Update src/client/scripts/set-i18n-contexts.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* refactor + +Co-authored-by: acid-chicken <root@acid-chicken.com> + +* ✨ + +* wip + +* fix lint + +* たぶんおk + +* fix flush + +* Translate Notification + +* remove console.log + +* fix + +* add notifications + +* remove san + +* wip + +* ok + +* :v: + +* Update src/prelude/array.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* wip + +* i18n refactor + +* Update init.ts + +* :v: + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <syuilotan@yahoo.co.jp> - Feat(client): 自動でもっと見るオプション ([#6403](https://github.com/orhun/git-cliff/issues/6403)) -* wip - -* ugokanai - -* wip - -* implement setting subscribing - -* fix lint - -* :v: - -* Update notifications.vue - +* wip + +* ugokanai + +* wip + +* implement setting subscribing + +* fix lint + +* :v: + +* Update notifications.vue + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat(client): Convert text mfm node to text (v)dom node instead of span tag ([#6399](https://github.com/orhun/git-cliff/issues/6399)) -* Convert text mfm node to text (v)dom node -instead of span tag - -* Update mfm.ts - +* Convert text mfm node to text (v)dom node +instead of span tag + +* Update mfm.ts + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat(client): 投稿フォームのボタンの説明を表示するように ([#6408](https://github.com/orhun/git-cliff/issues/6408)) -* Add title attr with buttons on the post form - -* fix - -* tooltip - -* missing ; - -* remove title attr - -* fix bug - -* Update reactions-viewer.details.vue - -* help wip - -* ok! - -* i18n - +* Add title attr with buttons on the post form + +* fix + +* tooltip + +* missing ; + +* remove title attr + +* fix bug + +* Update reactions-viewer.details.vue + +* help wip + +* ok! + +* i18n + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat: Observe notification read and fix #6406 ([#6407](https://github.com/orhun/git-cliff/issues/6407)) -* Resolve https://github.com/syuilo/misskey/pull/6406#issuecomment-633203670 - -* Improve typing - -* Observe notification read - -* capture readAllNotifications - -* fix - -* fix - -* Refactor - -* Update src/client/components/notification.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* Update src/client/components/notification.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* missing ; - +* Resolve https://github.com/syuilo/misskey/pull/6406#issuecomment-633203670 + +* Improve typing + +* Observe notification read + +* capture readAllNotifications + +* fix + +* fix + +* Refactor + +* Update src/client/components/notification.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* Update src/client/components/notification.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* missing ; + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat(theme): Add mentionMe property @@ -7564,10 +7575,10 @@ Resolve #6544 - Feat(server): Fetch icon url of an instance ([#6591](https://github.com/orhun/git-cliff/issues/6591)) -* feat(server): Fetch icon url of an instance - -Resolve #6589 - +* feat(server): Fetch icon url of an instance + +Resolve #6589 + * chore: Rename the function - Feat(client): Display instance icon @@ -7616,46 +7627,46 @@ Resolve #5213 - Feat: Implement api sw/unregister ([#7611](https://github.com/orhun/git-cliff/issues/7611)) -* Implement api sw/unregister - -* remove all mode - -* add changelog - +* Implement api sw/unregister + +* remove all mode + +* add changelog + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Add setting to keep content warning ([#7682](https://github.com/orhun/git-cliff/issues/7682)) - Feat: リモートからユーザー削除が飛んできたら削除するように ([#7768](https://github.com/orhun/git-cliff/issues/7768)) -* Delete Actor - -* Update src/remote/activitypub/kernel/delete/actor.ts - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - +* Delete Actor + +* Update src/remote/activitypub/kernel/delete/actor.ts + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Add sponsors section - Add resolver check for blocked instance ([#7777](https://github.com/orhun/git-cliff/issues/7777)) -* add resolver check for blocked instance - -* lint - +* add resolver check for blocked instance + +* lint + * Update note.ts - Feat: 凍結された場合のダイアログを実装 ([#7811](https://github.com/orhun/git-cliff/issues/7811)) -* feat: 凍結された場合のダイアログを実装 - -* Update CHANGELOG.md - -* Update basic.js - -* improve error handling - -* cypressなんもわからん - +* feat: 凍結された場合のダイアログを実装 + +* Update CHANGELOG.md + +* Update basic.js + +* improve error handling + +* cypressなんもわからん + * Update basic.js - Feat(server): 管理者用アカウント削除API実装 @@ -7664,29 +7675,29 @@ Resolve #7735 - Feat: MFM Sparkle animation ([#7813](https://github.com/orhun/git-cliff/issues/7813)) -* Add sparkle mfm animation ✨ - -* Cleanup sparkle effect - -+ spaces -> tabs and other codestyle -+ use proper image -+ listen for resizes +* Add sparkle mfm animation ✨ + +* Cleanup sparkle effect + ++ spaces -> tabs and other codestyle ++ use proper image ++ listen for resizes + use font-size to determine particle size (for fun with x2/3/4 stacking) - Feat(client): MFM関数構文のサジェストを実装 - Add todo - Feat: アカウント作成にメールアドレス必須にするオプション ([#7856](https://github.com/orhun/git-cliff/issues/7856)) -* feat: アカウント作成にメールアドレス必須にするオプション - -* ui - -* fix bug - -* fix bug - -* fix bug - +* feat: アカウント作成にメールアドレス必須にするオプション + +* ui + +* fix bug + +* fix bug + +* fix bug + * :art: - Feat: 未読の通知のみ表示する機能 @@ -7698,18 +7709,18 @@ Resolve #7735 - Feat: ノートプレビューを追加 ([#7596](https://github.com/orhun/git-cliff/issues/7596)) -* add note preview - -* use if - -* add draftedNote property - -* custom emojis work - -* Only show CW on preview when enabled - -* move button to top - +* add note preview + +* use if + +* add draftedNote property + +* custom emojis work + +* Only show CW on preview when enabled + +* move button to top + * fix css style - Feat(api): add users/groups/leave @@ -7733,21 +7744,21 @@ Close #7808 - Feat: thread mute ([#7930](https://github.com/orhun/git-cliff/issues/7930)) -* feat: thread mute - -* chore: fix comment - -* fix test - -* fix - +* feat: thread mute + +* chore: fix comment + +* fix test + +* fix + * refactor - Feat: クライアントでログインするアカウントidを指定するクエリ(loginId=:userId) ([#7929](https://github.com/orhun/git-cliff/issues/7929)) -* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 - -* await? - +* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 + +* await? + * rename - Add some locales @@ -7755,16 +7766,16 @@ Resolve #7940 - Feat: make possible to configure following/followers visibility ([#7959](https://github.com/orhun/git-cliff/issues/7959)) -* feat: make possible to configure following/followers visibility - -* add test - -* ap - -* add ap test - -* set Cache-Control - +* feat: make possible to configure following/followers visibility + +* add test + +* ap + +* add ap test + +* set Cache-Control + * hide following/followers count - Feat: improve email validation @@ -7798,85 +7809,85 @@ Resolve #7025 - Feat: Undo Accept ([#7980](https://github.com/orhun/git-cliff/issues/7980)) -* allow breaking of follow - -* send undo - +* allow breaking of follow + +* send undo + * delete by using reject follow - Add note - Feat: user-level instance mute ([#7712](https://github.com/orhun/git-cliff/issues/7712)) -* Update ja-JP.yml - -* Added settable config for muted instances - -* added psql query for removal of muted notes - -* Added filtering and trimming for instance mutes - -* cleaned up filtering of bad instance mutes and added a refresh at the end for the list on the client - -* Added notification & streaming timeline muting - -* Updated changelog - -* Added missing semicolon - -* Apply japanese string suggestions from robflop - -Co-authored-by: Robin B. <robflop98@outlook.com> - -* Changed Ja-JP instance mute title string to one suggested by sousuke - -Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> - -* Update ja-JP instanceMuteDescription based on sousuke's suggestion - -Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> - -* added notification mute - -* added notification and note children muting - -* Fixed a bug where local notifications were getting filtered on cold start - -* Fixed instance mute imports - -* Fixed not saving/loading instance mutes - -* removed en-US translations for instance mute - -* moved instance mute migration to js - -* changed settings index back to spaces - -* removed destructuring assignment from notification stream in instance mute check call - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> - -* added .note accessor for checking note data instead of notification data - -* changed note to use Packed<'Note'> instead of any and removed usage of snake case - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> - -* changed notification mute check to check specifically for notification host - -* changed to using single quotes - -* moved @click to the end for the linter - -* revert unnecessary changes - -* restored newlines - -* whitespace removal - -Co-authored-by: syuilo <syuilotan@yahoo.co.jp> -Co-authored-by: Robin B. <robflop98@outlook.com> -Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> -Co-authored-by: puffaboo <emilis@jigglypuff.club> +* Update ja-JP.yml + +* Added settable config for muted instances + +* added psql query for removal of muted notes + +* Added filtering and trimming for instance mutes + +* cleaned up filtering of bad instance mutes and added a refresh at the end for the list on the client + +* Added notification & streaming timeline muting + +* Updated changelog + +* Added missing semicolon + +* Apply japanese string suggestions from robflop + +Co-authored-by: Robin B. <robflop98@outlook.com> + +* Changed Ja-JP instance mute title string to one suggested by sousuke + +Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> + +* Update ja-JP instanceMuteDescription based on sousuke's suggestion + +Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> + +* added notification mute + +* added notification and note children muting + +* Fixed a bug where local notifications were getting filtered on cold start + +* Fixed instance mute imports + +* Fixed not saving/loading instance mutes + +* removed en-US translations for instance mute + +* moved instance mute migration to js + +* changed settings index back to spaces + +* removed destructuring assignment from notification stream in instance mute check call + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> + +* added .note accessor for checking note data instead of notification data + +* changed note to use Packed<'Note'> instead of any and removed usage of snake case + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> + +* changed notification mute check to check specifically for notification host + +* changed to using single quotes + +* moved @click to the end for the linter + +* revert unnecessary changes + +* restored newlines + +* whitespace removal + +Co-authored-by: syuilo <syuilotan@yahoo.co.jp> +Co-authored-by: Robin B. <robflop98@outlook.com> +Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> +Co-authored-by: puffaboo <emilis@jigglypuff.club> Co-authored-by: tamaina <tamaina@hotmail.co.jp> - Feat: improve follow export @@ -7912,8 +7923,8 @@ Resolve #8231 - Feat: Option to show replies in timeline ([#7685](https://github.com/orhun/git-cliff/issues/7685)) ([#8202](https://github.com/orhun/git-cliff/issues/8202)) -* Add an option for timeline replies. Credit to Emilis (puffaboo) - +* Add an option for timeline replies. Credit to Emilis (puffaboo) + * update db on request - Feat(client): 自インスタンス情報ページでチャートを見れるように @@ -7958,14 +7969,14 @@ Resolve #4664 - Feat: Webhook ([#8457](https://github.com/orhun/git-cliff/issues/8457)) -* feat: introduce webhook - -* wip - -* wip - -* wip - +* feat: introduce webhook + +* wip + +* wip + +* wip + * Update CHANGELOG.md - Add x,y parameters to rotate MFM @@ -7973,270 +7984,270 @@ Resolve #4664 - Feat: Improve Push Notification ([#7667](https://github.com/orhun/git-cliff/issues/7667)) -* clean up - -* ev => data - -* refactor - -* clean up - -* add type - -* antenna - -* channel - -* fix - -* add Packed type - -* add PackedRef - -* fix lint - -* add emoji schema - -* add reversiGame - -* add reversiMatching - -* remove signin schema (use Signin entity) - -* add schemas refs, fix Packed type - -* wip PackedHoge => Packed<'Hoge'> - -* add Packed type - -* note-reaction - -* user - -* user-group - -* user-list - -* note - -* app, messaging-message - -* notification - -* drive-file - -* drive-folder - -* following - -* muting - -* blocking - -* hashtag - -* page - -* app (with modifying schema) - -* import user? - -* channel - -* antenna - -* clip - -* gallery-post - -* emoji - -* Packed - -* reversi-matching - -* update stream.ts - -* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 - -* fix lint - -* clean up? - -* add app - -* fix - -* nanka iroiro - -* wip - -* wip - -* fix lint - -* fix loginId - -* fix - -* refactor - -* refactor - -* remove follow action - -* clean up - -* Revert "remove follow action" - -This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. - -* Revert "clean up" - -This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. - -* remove fetch specification - -* renoteの条件追加 - -* apiFetch => cli - -* bypass fetch? - -* fix - -* refactor: use path alias - -* temp: add submodule - -* remove submodule - -* enhane: unison-reloadに指定したパスに移動できるように - -* null - -* null - -* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 - -* null - -* await? - -* rename - -* rename - -* Update read.ts - -* merge - -* get-note-summary - -* fix - -* swパッケージに - -* add missing packages - -* fix getNoteSummary - -* add webpack-cli - -* :v: - -* remove plugins - -* sw-inject分離したがテストしてない - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix - -* :v: - -* clean up config - -* typesを戻した - -* Update packages/client/src/components/notification.vue - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* disconnect - -* oops - -* Failed to load the script unexpectedly回避 -sw.jsとlib.tsを分離してみた - -* truncate notification - -* Update packages/client/src/ui/_common_/common.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* clean up - -* clean up - -* キャッシュ対策 - -* Truncate push notification message - -* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 - -* components/drive-file-thumbnail.vue - -* components/drive-select-dialog.vue - -* components/drive-window.vue - -* merge - -* fix - -* Service Workerのビルドにesbuildを使うようにする - -* return createEmptyNotification() - -* fix - -* i18n.ts - -* update - -* :v: - -* remove ts-loader - -* fix - -* fix - -* enhance: Service Workerを常に登録するように - -* pollEnded - -* URLをsw.jsに戻す - -* clean up - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> +* clean up + +* ev => data + +* refactor + +* clean up + +* add type + +* antenna + +* channel + +* fix + +* add Packed type + +* add PackedRef + +* fix lint + +* add emoji schema + +* add reversiGame + +* add reversiMatching + +* remove signin schema (use Signin entity) + +* add schemas refs, fix Packed type + +* wip PackedHoge => Packed<'Hoge'> + +* add Packed type + +* note-reaction + +* user + +* user-group + +* user-list + +* note + +* app, messaging-message + +* notification + +* drive-file + +* drive-folder + +* following + +* muting + +* blocking + +* hashtag + +* page + +* app (with modifying schema) + +* import user? + +* channel + +* antenna + +* clip + +* gallery-post + +* emoji + +* Packed + +* reversi-matching + +* update stream.ts + +* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 + +* fix lint + +* clean up? + +* add app + +* fix + +* nanka iroiro + +* wip + +* wip + +* fix lint + +* fix loginId + +* fix + +* refactor + +* refactor + +* remove follow action + +* clean up + +* Revert "remove follow action" + +This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. + +* Revert "clean up" + +This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. + +* remove fetch specification + +* renoteの条件追加 + +* apiFetch => cli + +* bypass fetch? + +* fix + +* refactor: use path alias + +* temp: add submodule + +* remove submodule + +* enhane: unison-reloadに指定したパスに移動できるように + +* null + +* null + +* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 + +* null + +* await? + +* rename + +* rename + +* Update read.ts + +* merge + +* get-note-summary + +* fix + +* swパッケージに + +* add missing packages + +* fix getNoteSummary + +* add webpack-cli + +* :v: + +* remove plugins + +* sw-inject分離したがテストしてない + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix + +* :v: + +* clean up config + +* typesを戻した + +* Update packages/client/src/components/notification.vue + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* disconnect + +* oops + +* Failed to load the script unexpectedly回避 +sw.jsとlib.tsを分離してみた + +* truncate notification + +* Update packages/client/src/ui/_common_/common.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* clean up + +* clean up + +* キャッシュ対策 + +* Truncate push notification message + +* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 + +* components/drive-file-thumbnail.vue + +* components/drive-select-dialog.vue + +* components/drive-window.vue + +* merge + +* fix + +* Service Workerのビルドにesbuildを使うようにする + +* return createEmptyNotification() + +* fix + +* i18n.ts + +* update + +* :v: + +* remove ts-loader + +* fix + +* fix + +* enhance: Service Workerを常に登録するように + +* pollEnded + +* URLをsw.jsに戻す + +* clean up + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat: make captcha required when signin to improve security @@ -8249,52 +8260,52 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> Highlight PRs that edit locales other than the ja-JP one so the author may see and fix it themselves. - Feat(tests): add e2e tests for widgets ([#8735](https://github.com/orhun/git-cliff/issues/8735)) -* test(e2e): add baseline for widget tests - -* chore(repo): enable test running in branch - -* fix(e2e): set viewport for widget tests - -* fix(client): add widget identifier classes to widgets - -* test(e2e): add memo widget test - -* fix(tests): force select value - -* fix(tests): force button press for widget addition - -* fix(tests): invoke select value differently - -* fix(tests): adjust widget submit - -* fix(tests): don't explicitly navigate for widget test - -* fix(tests): click label to hide select popup - -* fix(tests): just click modal background - -* fix(tests): adjust modal background selector - -* fix(tests): click all modal backgrounds - -* feat(e2e): add test for adding timeline widget - -* fix(client): add more widget identifier classes - -* feat(tests): add method abstraction for test cases - -* fix(tests): force-click overlays - -* fix(tests): force widget button press - -* fix(tests): remove timeout from final widget check - -* feat(tests): add widget removal test case - -* fix(client): use mk instead of msky as class prefix - -* fix(tests): check widgets for existence rather than visibility - +* test(e2e): add baseline for widget tests + +* chore(repo): enable test running in branch + +* fix(e2e): set viewport for widget tests + +* fix(client): add widget identifier classes to widgets + +* test(e2e): add memo widget test + +* fix(tests): force select value + +* fix(tests): force button press for widget addition + +* fix(tests): invoke select value differently + +* fix(tests): adjust widget submit + +* fix(tests): don't explicitly navigate for widget test + +* fix(tests): click label to hide select popup + +* fix(tests): just click modal background + +* fix(tests): adjust modal background selector + +* fix(tests): click all modal backgrounds + +* feat(e2e): add test for adding timeline widget + +* fix(client): add more widget identifier classes + +* feat(tests): add method abstraction for test cases + +* fix(tests): force-click overlays + +* fix(tests): force widget button press + +* fix(tests): remove timeout from final widget check + +* feat(tests): add widget removal test case + +* fix(client): use mk instead of msky as class prefix + +* fix(tests): check widgets for existence rather than visibility + * chore(meta): don't run tests for specific feature branch - Add @rollup/pluginutils @@ -8304,236 +8315,236 @@ Co-authored-by: acid-chicken <root@acid-chicken.com> - Feat: option to collapse long notes ([#8561](https://github.com/orhun/git-cliff/issues/8561)) -* feat: option to collapse long notes - -Closes #8559 - -* do not collapse if cw exists - -* use '閉じる' to close / show less. - -* make it sticky - +* feat: option to collapse long notes + +Closes #8559 + +* do not collapse if cw exists + +* use '閉じる' to close / show less. + +* make it sticky + * Change style of the Show less button - Add packageExtensions - Feat: image cropping ([#8808](https://github.com/orhun/git-cliff/issues/8808)) -* wip - -* wip - +* wip + +* wip + * wip - Feat: Add Badge Image to Push Notification ([#8012](https://github.com/orhun/git-cliff/issues/8012)) -* fix - -* nanka iroiro - -* wip - -* wip - -* fix lint - -* fix loginId - -* fix - -* refactor - -* refactor - -* remove follow action - -* clean up - -* Revert "remove follow action" - -This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. - -* Revert "clean up" - -This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. - -* remove fetch specification - -* renoteの条件追加 - -* apiFetch => cli - -* bypass fetch? - -* fix - -* refactor: use path alias - -* temp: add submodule - -* remove submodule - -* enhane: unison-reloadに指定したパスに移動できるように - -* null - -* null - -* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 - -* null - -* await? - -* rename - -* rename - -* Update read.ts - -* merge - -* get-note-summary - -* fix - -* swパッケージに - -* add missing packages - -* fix getNoteSummary - -* add webpack-cli - -* :v: - -* remove plugins - -* sw-inject分離したがテストしてない - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix - -* :v: - -* clean up config - -* typesを戻した - -* backend/src/web/index.ts - -* notification-badges - -* add scripts - -* change create-notification.ts - -* Update packages/client/src/components/notification.vue - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* disconnect - -* oops - -* Failed to load the script unexpectedly回避 -sw.jsとlib.tsを分離してみた - -* truncate notification - -* Update packages/client/src/ui/_common_/common.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* clean up - -* clean up - -* refactor - -* キャッシュ対策 - -* Truncate push notification message - -* fix - -* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 - -* components/drive-file-thumbnail.vue - -* components/drive-select-dialog.vue - -* components/drive-window.vue - -* merge - -* fix - -* Service Workerのビルドにesbuildを使うようにする - -* return createEmptyNotification() - -* fix - -* fix - -* i18n.ts - -* update - -* :v: - -* remove ts-loader - -* fix - -* fix - -* enhance: Service Workerを常に登録するように - -* pollEnded - -* pollEnded - -* URLをsw.jsに戻す - -* clean up - -* fix lint - -* changelog - -* alpha-test - -* also with twemoji - -* add isMimeImage function - -* catch - -* Colour => Color - -* char2file => char2filePath - -* Update autocomplete.vue - -* remove clone? - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> +* fix + +* nanka iroiro + +* wip + +* wip + +* fix lint + +* fix loginId + +* fix + +* refactor + +* refactor + +* remove follow action + +* clean up + +* Revert "remove follow action" + +This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. + +* Revert "clean up" + +This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. + +* remove fetch specification + +* renoteの条件追加 + +* apiFetch => cli + +* bypass fetch? + +* fix + +* refactor: use path alias + +* temp: add submodule + +* remove submodule + +* enhane: unison-reloadに指定したパスに移動できるように + +* null + +* null + +* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 + +* null + +* await? + +* rename + +* rename + +* Update read.ts + +* merge + +* get-note-summary + +* fix + +* swパッケージに + +* add missing packages + +* fix getNoteSummary + +* add webpack-cli + +* :v: + +* remove plugins + +* sw-inject分離したがテストしてない + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix + +* :v: + +* clean up config + +* typesを戻した + +* backend/src/web/index.ts + +* notification-badges + +* add scripts + +* change create-notification.ts + +* Update packages/client/src/components/notification.vue + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* disconnect + +* oops + +* Failed to load the script unexpectedly回避 +sw.jsとlib.tsを分離してみた + +* truncate notification + +* Update packages/client/src/ui/_common_/common.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* clean up + +* clean up + +* refactor + +* キャッシュ対策 + +* Truncate push notification message + +* fix + +* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 + +* components/drive-file-thumbnail.vue + +* components/drive-select-dialog.vue + +* components/drive-window.vue + +* merge + +* fix + +* Service Workerのビルドにesbuildを使うようにする + +* return createEmptyNotification() + +* fix + +* fix + +* i18n.ts + +* update + +* :v: + +* remove ts-loader + +* fix + +* fix + +* enhance: Service Workerを常に登録するように + +* pollEnded + +* pollEnded + +* URLをsw.jsに戻す + +* clean up + +* fix lint + +* changelog + +* alpha-test + +* also with twemoji + +* add isMimeImage function + +* catch + +* Colour => Color + +* char2file => char2filePath + +* Update autocomplete.vue + +* remove clone? + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat: 管理者が特定ユーザーのアップロードしたファイル一覧を見れるように @@ -8559,22 +8570,22 @@ Resolve #8830 - Feat: Log user ips ([#8872](https://github.com/orhun/git-cliff/issues/8872)) -* wip - -* store ip and headers - -* Update admin-file.vue - -* require admin for view ip/headers - -* IP (recent) 消した - -* admin必須 - -* opt in - -* clean ips periodically - +* wip + +* store ip and headers + +* Update admin-file.vue + +* require admin for view ip/headers + +* IP (recent) 消した + +* admin必須 + +* opt in + +* clean ips periodically + * respect logging setting in drive/files/create - Feature(client): Timeline page for non-login users - Feat(server): add fetch-rss api to reduce dependency of external apis @@ -8585,85 +8596,85 @@ Resolve #8830 - Feat: styled error screen ([#8930](https://github.com/orhun/git-cliff/issues/8930)) -* Styled error screen - -* Make details margin auto - -* Update boot.css - -* Replace fontawesome with tabler svg - -* Remove hr - -* Add new style to flush screen - +* Styled error screen + +* Make details margin auto + +* Update boot.css + +* Replace fontawesome with tabler svg + +* Remove hr + +* Add new style to flush screen + * Rename to `error.css` - Feat(client): メニューからページをリロードできるように - Feat: auto nsfw detection ([#8840](https://github.com/orhun/git-cliff/issues/8840)) -* feat: auto nsfw detection - -* :v: - -* Update ja-JP.yml - -* Update ja-JP.yml - -* ポルノ判定のしきい値を高めに - -* エラーハンドリングちゃんとした - -* Update ja-JP.yml - -* 感度設定を強化 - -* refactor - -* feat: add video support for auto nsfw detection - -* rename: image -> media - -* .js - -* fix: add missing error handling - -* fix: use valid pathname instead of using filename due to invalid usage - -* perf(nsfw-detection): decode frames - -* disable detection of video for some reasons - -* perf(nsfw-detection): streamify detection process for video - -* disable disallowUploadWhenPredictedAsPorn option - -* fix(nsfw-detection): improve reliability - -* fix(nsfw-detection): use Math.ceil instead of Math.round - -* perf(nsfw-detection): delete tmp frames after used - -* fix(nsfw-detection): FSWatcher does not emit ready event - -* perf(nsfw-detection): skip black frames - -* refactor: strip exists check - -* Update package.json - -* めっちゃ変えた - -* lint - -* Update COPYING - -* オプションで動画解析できるように - -* Update yarn.lock - -* Update CHANGELOG.md - +* feat: auto nsfw detection + +* :v: + +* Update ja-JP.yml + +* Update ja-JP.yml + +* ポルノ判定のしきい値を高めに + +* エラーハンドリングちゃんとした + +* Update ja-JP.yml + +* 感度設定を強化 + +* refactor + +* feat: add video support for auto nsfw detection + +* rename: image -> media + +* .js + +* fix: add missing error handling + +* fix: use valid pathname instead of using filename due to invalid usage + +* perf(nsfw-detection): decode frames + +* disable detection of video for some reasons + +* perf(nsfw-detection): streamify detection process for video + +* disable disallowUploadWhenPredictedAsPorn option + +* fix(nsfw-detection): improve reliability + +* fix(nsfw-detection): use Math.ceil instead of Math.round + +* perf(nsfw-detection): delete tmp frames after used + +* fix(nsfw-detection): FSWatcher does not emit ready event + +* perf(nsfw-detection): skip black frames + +* refactor: strip exists check + +* Update package.json + +* めっちゃ変えた + +* lint + +* Update COPYING + +* オプションで動画解析できるように + +* Update yarn.lock + +* Update CHANGELOG.md + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Feat: support <plain> syntax for mfm @@ -9226,16 +9237,16 @@ Fix #6418 - Update page editor ([#7317](https://github.com/orhun/git-cliff/issues/7317)) -* fix buttons visibility +* fix buttons visibility * fix title of page editor - Update mfm.js ([#7435](https://github.com/orhun/git-cliff/issues/7435)) -* use mfm.js 0.14.0 - -* use mfm.extract - -* use mfm.extract - +* use mfm.js 0.14.0 + +* use mfm.extract + +* use mfm.extract + * use mfm.extract - Update mfm-js @@ -9271,31 +9282,31 @@ Fix #6418 - Chore: APIドキュメントの修正 ([#7771](https://github.com/orhun/git-cliff/issues/7771)) -* packedNotificationSchemaを更新 - -* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 - -* fix - +* packedNotificationSchemaを更新 + +* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 + +* fix + * add header, choice, invitation - Chore: .configをdockerイメージに入れないように ([#7625](https://github.com/orhun/git-cliff/issues/7625)) -* .configをdockerイメージに入れないように - -* Update docker-compose.yml - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> - -Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> +* .configをdockerイメージに入れないように + +* Update docker-compose.yml + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> + +Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> Co-authored-by: tamaina <tamaina@hotmail.co.jp> - Update deps - Chore, perf: Reduce redis memory ([#7816](https://github.com/orhun/git-cliff/issues/7816)) -* Reduce redis memory - -* CHANGELOG - +* Reduce redis memory + +* CHANGELOG + * a - Update contribution guide @@ -9375,20 +9386,20 @@ Close #7924 - Chore(deps-dev): bump cypress from 9.3.1 to 9.4.1 ([#8239](https://github.com/orhun/git-cliff/issues/8239)) -Bumps [cypress](https://github.com/cypress-io/cypress) from 9.3.1 to 9.4.1. -- [Release notes](https://github.com/cypress-io/cypress/releases) -- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js) -- [Commits](https://github.com/cypress-io/cypress/compare/v9.3.1...v9.4.1) - ---- -updated-dependencies: -- dependency-name: cypress - dependency-type: direct:development - update-type: version-update:semver-minor -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [cypress](https://github.com/cypress-io/cypress) from 9.3.1 to 9.4.1. +- [Release notes](https://github.com/cypress-io/cypress/releases) +- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js) +- [Commits](https://github.com/cypress-io/cypress/compare/v9.3.1...v9.4.1) + +--- +updated-dependencies: +- dependency-name: cypress + dependency-type: direct:development + update-type: version-update:semver-minor +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps @@ -9402,175 +9413,175 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump axios from 0.21.1 to 0.21.4 in /packages/client ([#8286](https://github.com/orhun/git-cliff/issues/8286)) -Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. -- [Release notes](https://github.com/axios/axios/releases) -- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) -- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) - ---- -updated-dependencies: -- dependency-name: axios - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. +- [Release notes](https://github.com/axios/axios/releases) +- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) +- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) + +--- +updated-dependencies: +- dependency-name: axios + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump path-parse from 1.0.6 to 1.0.7 in /packages/client ([#8288](https://github.com/orhun/git-cliff/issues/8288)) -Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. -- [Release notes](https://github.com/jbgutierrez/path-parse/releases) -- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) - ---- -updated-dependencies: -- dependency-name: path-parse - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. +- [Release notes](https://github.com/jbgutierrez/path-parse/releases) +- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) + +--- +updated-dependencies: +- dependency-name: path-parse + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump glob-parent from 5.1.1 to 5.1.2 in /packages/client ([#8289](https://github.com/orhun/git-cliff/issues/8289)) -Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. -- [Release notes](https://github.com/gulpjs/glob-parent/releases) -- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) -- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) - ---- -updated-dependencies: -- dependency-name: glob-parent - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. +- [Release notes](https://github.com/gulpjs/glob-parent/releases) +- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) +- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) + +--- +updated-dependencies: +- dependency-name: glob-parent + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump simple-get from 4.0.0 to 4.0.1 in /packages/backend ([#8292](https://github.com/orhun/git-cliff/issues/8292)) -Bumps [simple-get](https://github.com/feross/simple-get) from 4.0.0 to 4.0.1. -- [Release notes](https://github.com/feross/simple-get/releases) -- [Commits](https://github.com/feross/simple-get/compare/v4.0.0...v4.0.1) - ---- -updated-dependencies: -- dependency-name: simple-get - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [simple-get](https://github.com/feross/simple-get) from 4.0.0 to 4.0.1. +- [Release notes](https://github.com/feross/simple-get/releases) +- [Commits](https://github.com/feross/simple-get/compare/v4.0.0...v4.0.1) + +--- +updated-dependencies: +- dependency-name: simple-get + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump node-fetch from 2.6.1 to 2.6.7 in /packages/client ([#8291](https://github.com/orhun/git-cliff/issues/8291)) -Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. -- [Release notes](https://github.com/node-fetch/node-fetch/releases) -- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) - ---- -updated-dependencies: -- dependency-name: node-fetch - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. +- [Release notes](https://github.com/node-fetch/node-fetch/releases) +- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) + +--- +updated-dependencies: +- dependency-name: node-fetch + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump node-fetch from 2.6.1 to 2.6.7 in /packages/backend ([#8293](https://github.com/orhun/git-cliff/issues/8293)) -Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. -- [Release notes](https://github.com/node-fetch/node-fetch/releases) -- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) - ---- -updated-dependencies: -- dependency-name: node-fetch - dependency-type: direct:production -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. +- [Release notes](https://github.com/node-fetch/node-fetch/releases) +- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) + +--- +updated-dependencies: +- dependency-name: node-fetch + dependency-type: direct:production +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump browserslist from 4.16.3 to 4.19.1 in /packages/client ([#8290](https://github.com/orhun/git-cliff/issues/8290)) -Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.16.3 to 4.19.1. -- [Release notes](https://github.com/browserslist/browserslist/releases) -- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) -- [Commits](https://github.com/browserslist/browserslist/compare/4.16.3...4.19.1) - ---- -updated-dependencies: -- dependency-name: browserslist - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.16.3 to 4.19.1. +- [Release notes](https://github.com/browserslist/browserslist/releases) +- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) +- [Commits](https://github.com/browserslist/browserslist/compare/4.16.3...4.19.1) + +--- +updated-dependencies: +- dependency-name: browserslist + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak chart - Chore(deps): bump tar from 6.0.5 to 6.1.11 in /packages/backend ([#8294](https://github.com/orhun/git-cliff/issues/8294)) -Bumps [tar](https://github.com/npm/node-tar) from 6.0.5 to 6.1.11. -- [Release notes](https://github.com/npm/node-tar/releases) -- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md) -- [Commits](https://github.com/npm/node-tar/compare/v6.0.5...v6.1.11) - ---- -updated-dependencies: -- dependency-name: tar - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [tar](https://github.com/npm/node-tar) from 6.0.5 to 6.1.11. +- [Release notes](https://github.com/npm/node-tar/releases) +- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md) +- [Commits](https://github.com/npm/node-tar/compare/v6.0.5...v6.1.11) + +--- +updated-dependencies: +- dependency-name: tar + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump path-parse from 1.0.6 to 1.0.7 in /packages/backend ([#8301](https://github.com/orhun/git-cliff/issues/8301)) -Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. -- [Release notes](https://github.com/jbgutierrez/path-parse/releases) -- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) - ---- -updated-dependencies: -- dependency-name: path-parse - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. +- [Release notes](https://github.com/jbgutierrez/path-parse/releases) +- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) + +--- +updated-dependencies: +- dependency-name: path-parse + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump normalize-url from 4.5.0 to 4.5.1 in /packages/backend ([#8302](https://github.com/orhun/git-cliff/issues/8302)) -Bumps [normalize-url](https://github.com/sindresorhus/normalize-url) from 4.5.0 to 4.5.1. -- [Release notes](https://github.com/sindresorhus/normalize-url/releases) -- [Commits](https://github.com/sindresorhus/normalize-url/commits) - ---- -updated-dependencies: -- dependency-name: normalize-url - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [normalize-url](https://github.com/sindresorhus/normalize-url) from 4.5.0 to 4.5.1. +- [Release notes](https://github.com/sindresorhus/normalize-url/releases) +- [Commits](https://github.com/sindresorhus/normalize-url/commits) + +--- +updated-dependencies: +- dependency-name: normalize-url + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump glob-parent from 5.1.1 to 5.1.2 in /packages/backend ([#8303](https://github.com/orhun/git-cliff/issues/8303)) -Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. -- [Release notes](https://github.com/gulpjs/glob-parent/releases) -- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) -- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) - ---- -updated-dependencies: -- dependency-name: glob-parent - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. +- [Release notes](https://github.com/gulpjs/glob-parent/releases) +- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) +- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) + +--- +updated-dependencies: +- dependency-name: glob-parent + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps @@ -9592,80 +9603,80 @@ Close #8327 - Chore(deps): bump minimist from 1.2.5 to 1.2.6 in /packages/backend ([#8447](https://github.com/orhun/git-cliff/issues/8447)) -Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. -- [Release notes](https://github.com/substack/minimist/releases) -- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) - ---- -updated-dependencies: -- dependency-name: minimist - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. +- [Release notes](https://github.com/substack/minimist/releases) +- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) + +--- +updated-dependencies: +- dependency-name: minimist + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps - Chore(deps): bump minimist from 1.2.5 to 1.2.6 in /packages/client ([#8446](https://github.com/orhun/git-cliff/issues/8446)) -Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. -- [Release notes](https://github.com/substack/minimist/releases) -- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) - ---- -updated-dependencies: -- dependency-name: minimist - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. +- [Release notes](https://github.com/substack/minimist/releases) +- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) + +--- +updated-dependencies: +- dependency-name: minimist + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump minimist from 1.2.5 to 1.2.6 ([#8445](https://github.com/orhun/git-cliff/issues/8445)) -Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. -- [Release notes](https://github.com/substack/minimist/releases) -- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) - ---- -updated-dependencies: -- dependency-name: minimist - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. +- [Release notes](https://github.com/substack/minimist/releases) +- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) + +--- +updated-dependencies: +- dependency-name: minimist + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump follow-redirects in /packages/backend ([#8314](https://github.com/orhun/git-cliff/issues/8314)) -Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8. -- [Release notes](https://github.com/follow-redirects/follow-redirects/releases) -- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8) - ---- -updated-dependencies: -- dependency-name: follow-redirects - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8. +- [Release notes](https://github.com/follow-redirects/follow-redirects/releases) +- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8) + +--- +updated-dependencies: +- dependency-name: follow-redirects + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump follow-redirects from 1.14.1 to 1.14.8 ([#8313](https://github.com/orhun/git-cliff/issues/8313)) -Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.1 to 1.14.8. -- [Release notes](https://github.com/follow-redirects/follow-redirects/releases) -- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.1...v1.14.8) - ---- -updated-dependencies: -- dependency-name: follow-redirects - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.1 to 1.14.8. +- [Release notes](https://github.com/follow-redirects/follow-redirects/releases) +- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.1...v1.14.8) + +--- +updated-dependencies: +- dependency-name: follow-redirects + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps @@ -9677,19 +9688,19 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump axios from 0.21.1 to 0.21.4 ([#8471](https://github.com/orhun/git-cliff/issues/8471)) -Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. -- [Release notes](https://github.com/axios/axios/releases) -- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) -- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) - ---- -updated-dependencies: -- dependency-name: axios - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. +- [Release notes](https://github.com/axios/axios/releases) +- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) +- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) + +--- +updated-dependencies: +- dependency-name: axios + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps @@ -9701,27 +9712,27 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump moment from 2.24.0 to 2.29.3 in /packages/backend ([#8531](https://github.com/orhun/git-cliff/issues/8531)) -Bumps [moment](https://github.com/moment/moment) from 2.24.0 to 2.29.3. -- [Release notes](https://github.com/moment/moment/releases) -- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md) -- [Commits](https://github.com/moment/moment/compare/2.24.0...2.29.3) - ---- -updated-dependencies: -- dependency-name: moment - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [moment](https://github.com/moment/moment) from 2.24.0 to 2.29.3. +- [Release notes](https://github.com/moment/moment/releases) +- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md) +- [Commits](https://github.com/moment/moment/compare/2.24.0...2.29.3) + +--- +updated-dependencies: +- dependency-name: moment + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(lint): fix type definitions for jsrsasign ([#8528](https://github.com/orhun/git-cliff/issues/8528)) -* fix type definitions for jsrsasign - -The @types/jsrsasign is not available in exactly the same version as the jsrsa -package misskey uses, so i used an earlier patch version of the same package. - +* fix type definitions for jsrsasign + +The @types/jsrsasign is not available in exactly the same version as the jsrsa +package misskey uses, so i used an earlier patch version of the same package. + * update yarn.lock - Chore: fix lint command for windows @@ -9734,45 +9745,45 @@ add user facing changes to changelog - Chore(deps): bump ejs from 3.1.6 to 3.1.7 in /packages/backend ([#8560](https://github.com/orhun/git-cliff/issues/8560)) -Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.7. -- [Release notes](https://github.com/mde/ejs/releases) -- [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md) -- [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.7) - ---- -updated-dependencies: -- dependency-name: ejs - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.7. +- [Release notes](https://github.com/mde/ejs/releases) +- [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md) +- [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.7) + +--- +updated-dependencies: +- dependency-name: ejs + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump postcss from 8.2.8 to 8.4.13 in /packages/client ([#8588](https://github.com/orhun/git-cliff/issues/8588)) -Bumps [postcss](https://github.com/postcss/postcss) from 8.2.8 to 8.4.13. -- [Release notes](https://github.com/postcss/postcss/releases) -- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) -- [Commits](https://github.com/postcss/postcss/compare/8.2.8...8.4.13) - ---- -updated-dependencies: -- dependency-name: postcss - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [postcss](https://github.com/postcss/postcss) from 8.2.8 to 8.4.13. +- [Release notes](https://github.com/postcss/postcss/releases) +- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) +- [Commits](https://github.com/postcss/postcss/compare/8.2.8...8.4.13) + +--- +updated-dependencies: +- dependency-name: postcss + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore: synchronize code and database schema ([#8577](https://github.com/orhun/git-cliff/issues/8577)) -* chore: remove default null - -null is always the default value if a table column is nullable, and typeorm's -@Column only accepts strings for default. - -* chore: synchronize code with database schema - +* chore: remove default null + +null is always the default value if a table column is nullable, and typeorm's +@Column only accepts strings for default. + +* chore: synchronize code with database schema + * chore: sync generated migrations with code - Update deps @@ -9782,34 +9793,34 @@ null is always the default value if a table column is nullable, and typeorm's - Chore(deps): bump path-parse from 1.0.6 to 1.0.7 ([#8705](https://github.com/orhun/git-cliff/issues/8705)) -Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. -- [Release notes](https://github.com/jbgutierrez/path-parse/releases) -- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) - ---- -updated-dependencies: -- dependency-name: path-parse - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. +- [Release notes](https://github.com/jbgutierrez/path-parse/releases) +- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) + +--- +updated-dependencies: +- dependency-name: path-parse + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump async from 3.2.0 to 3.2.3 in /packages/backend ([#8706](https://github.com/orhun/git-cliff/issues/8706)) -Bumps [async](https://github.com/caolan/async) from 3.2.0 to 3.2.3. -- [Release notes](https://github.com/caolan/async/releases) -- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) -- [Commits](https://github.com/caolan/async/compare/v3.2.0...v3.2.3) - ---- -updated-dependencies: -- dependency-name: async - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [async](https://github.com/caolan/async) from 3.2.0 to 3.2.3. +- [Release notes](https://github.com/caolan/async/releases) +- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) +- [Commits](https://github.com/caolan/async/compare/v3.2.0...v3.2.3) + +--- +updated-dependencies: +- dependency-name: async + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak loading spinner design @@ -9817,70 +9828,70 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump async from 3.2.1 to 3.2.3 in /packages/client ([#8707](https://github.com/orhun/git-cliff/issues/8707)) -Bumps [async](https://github.com/caolan/async) from 3.2.1 to 3.2.3. -- [Release notes](https://github.com/caolan/async/releases) -- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) -- [Commits](https://github.com/caolan/async/compare/v3.2.1...v3.2.3) - ---- -updated-dependencies: -- dependency-name: async - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [async](https://github.com/caolan/async) from 3.2.1 to 3.2.3. +- [Release notes](https://github.com/caolan/async/releases) +- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) +- [Commits](https://github.com/caolan/async/compare/v3.2.1...v3.2.3) + +--- +updated-dependencies: +- dependency-name: async + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump async from 3.2.1 to 3.2.3 ([#8501](https://github.com/orhun/git-cliff/issues/8501)) -Bumps [async](https://github.com/caolan/async) from 3.2.1 to 3.2.3. -- [Release notes](https://github.com/caolan/async/releases) -- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) -- [Commits](https://github.com/caolan/async/compare/v3.2.1...v3.2.3) - ---- -updated-dependencies: -- dependency-name: async - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [async](https://github.com/caolan/async) from 3.2.1 to 3.2.3. +- [Release notes](https://github.com/caolan/async/releases) +- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) +- [Commits](https://github.com/caolan/async/compare/v3.2.1...v3.2.3) + +--- +updated-dependencies: +- dependency-name: async + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump copy-props from 2.0.4 to 2.0.5 ([#8709](https://github.com/orhun/git-cliff/issues/8709)) -Bumps [copy-props](https://github.com/gulpjs/copy-props) from 2.0.4 to 2.0.5. -- [Release notes](https://github.com/gulpjs/copy-props/releases) -- [Changelog](https://github.com/gulpjs/copy-props/blob/master/CHANGELOG.md) -- [Commits](https://github.com/gulpjs/copy-props/compare/2.0.4...2.0.5) - ---- -updated-dependencies: -- dependency-name: copy-props - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [copy-props](https://github.com/gulpjs/copy-props) from 2.0.4 to 2.0.5. +- [Release notes](https://github.com/gulpjs/copy-props/releases) +- [Changelog](https://github.com/gulpjs/copy-props/blob/master/CHANGELOG.md) +- [Commits](https://github.com/gulpjs/copy-props/compare/2.0.4...2.0.5) + +--- +updated-dependencies: +- dependency-name: copy-props + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(meta): add pixeldesu to patron list ([#8714](https://github.com/orhun/git-cliff/issues/8714)) - Chore(deps): bump hosted-git-info from 2.8.8 to 2.8.9 ([#8708](https://github.com/orhun/git-cliff/issues/8708)) -Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. -- [Release notes](https://github.com/npm/hosted-git-info/releases) -- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) -- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) - ---- -updated-dependencies: -- dependency-name: hosted-git-info - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. +- [Release notes](https://github.com/npm/hosted-git-info/releases) +- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) +- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) + +--- +updated-dependencies: +- dependency-name: hosted-git-info + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(dev): tweak text - Update deps @@ -9906,12 +9917,12 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore: fix some lints automatically ([#8788](https://github.com/orhun/git-cliff/issues/8788)) -* chore: fix some lints automatically - -Fixed lints that were automatically fixable with `eslint --fix`. - -* fix type - +* chore: fix some lints automatically + +Fixed lints that were automatically fixable with `eslint --fix`. + +* fix type + * workaround for empty interface lint - Chore: tweak logo @@ -9925,17 +9936,17 @@ Fixed lints that were automatically fixable with `eslint --fix`. - Chore: synchronize visibility checks ([#8687](https://github.com/orhun/git-cliff/issues/8687)) -* reuse single meId parameter - -* unify code style - -Use template string to avoid having to use escaped quote marks. - -* fix: follower only notes are visible to mentioned users - -This synchronizes the visibility rules with the Notes.isVisibleForMe -method from packages/backend/src/models/repositories/note.ts - +* reuse single meId parameter + +* unify code style + +Use template string to avoid having to use escaped quote marks. + +* fix: follower only notes are visible to mentioned users + +This synchronizes the visibility rules with the Notes.isVisibleForMe +method from packages/backend/src/models/repositories/note.ts + * add comment - Chore(client): tweak range control design @@ -9960,49 +9971,49 @@ method from packages/backend/src/models/repositories/note.ts - Chore(deps): bump undici from 5.4.0 to 5.5.1 in /packages/backend ([#8842](https://github.com/orhun/git-cliff/issues/8842)) -Bumps [undici](https://github.com/nodejs/undici) from 5.4.0 to 5.5.1. -- [Release notes](https://github.com/nodejs/undici/releases) -- [Commits](https://github.com/nodejs/undici/compare/v5.4.0...v5.5.1) - ---- -updated-dependencies: -- dependency-name: undici - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [undici](https://github.com/nodejs/undici) from 5.4.0 to 5.5.1. +- [Release notes](https://github.com/nodejs/undici/releases) +- [Commits](https://github.com/nodejs/undici/compare/v5.4.0...v5.5.1) + +--- +updated-dependencies: +- dependency-name: undici + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump jpeg-js from 0.4.1 to 0.4.4 in /packages/backend ([#8843](https://github.com/orhun/git-cliff/issues/8843)) -Bumps [jpeg-js](https://github.com/eugeneware/jpeg-js) from 0.4.1 to 0.4.4. -- [Release notes](https://github.com/eugeneware/jpeg-js/releases) -- [Commits](https://github.com/eugeneware/jpeg-js/compare/v0.4.1...v0.4.4) - ---- -updated-dependencies: -- dependency-name: jpeg-js - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [jpeg-js](https://github.com/eugeneware/jpeg-js) from 0.4.1 to 0.4.4. +- [Release notes](https://github.com/eugeneware/jpeg-js/releases) +- [Commits](https://github.com/eugeneware/jpeg-js/compare/v0.4.1...v0.4.4) + +--- +updated-dependencies: +- dependency-name: jpeg-js + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump jsrsasign from 10.5.24 to 10.5.25 in /packages/backend ([#8889](https://github.com/orhun/git-cliff/issues/8889)) -Bumps [jsrsasign](https://github.com/kjur/jsrsasign) from 10.5.24 to 10.5.25. -- [Release notes](https://github.com/kjur/jsrsasign/releases) -- [Changelog](https://github.com/kjur/jsrsasign/blob/master/ChangeLog.txt) -- [Commits](https://github.com/kjur/jsrsasign/compare/10.5.24...10.5.25) - ---- -updated-dependencies: -- dependency-name: jsrsasign - dependency-type: direct:production -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [jsrsasign](https://github.com/kjur/jsrsasign) from 10.5.24 to 10.5.25. +- [Release notes](https://github.com/kjur/jsrsasign/releases) +- [Changelog](https://github.com/kjur/jsrsasign/blob/master/ChangeLog.txt) +- [Commits](https://github.com/kjur/jsrsasign/compare/10.5.24...10.5.25) + +--- +updated-dependencies: +- dependency-name: jsrsasign + dependency-type: direct:production +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak ui @@ -10102,12 +10113,12 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore: fix client lint errors ([#8934](https://github.com/orhun/git-cliff/issues/8934)) -* Fix client lint - -* Hide no-v-html - -* Ignore banned type - +* Fix client lint + +* Hide no-v-html + +* Ignore banned type + * Update page-editor.vue - Chore(client): tweak ui @@ -10147,19 +10158,19 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump moment from 2.29.3 to 2.29.4 in /packages/backend ([#8958](https://github.com/orhun/git-cliff/issues/8958)) -Bumps [moment](https://github.com/moment/moment) from 2.29.3 to 2.29.4. -- [Release notes](https://github.com/moment/moment/releases) -- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) -- [Commits](https://github.com/moment/moment/compare/2.29.3...2.29.4) - ---- -updated-dependencies: -- dependency-name: moment - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [moment](https://github.com/moment/moment) from 2.29.3 to 2.29.4. +- [Release notes](https://github.com/moment/moment/releases) +- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) +- [Commits](https://github.com/moment/moment/compare/2.29.3...2.29.4) + +--- +updated-dependencies: +- dependency-name: moment + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(server): tweak api for admin @@ -10224,10 +10235,10 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore: improve ad style ([#8995](https://github.com/orhun/git-cliff/issues/8995)) -* Improve ad style - -* :art: - +* Improve ad style + +* :art: + * `ad` -> `info` - Chore(client): tweak style @@ -10307,30 +10318,30 @@ See: https://forum.vuejs.org/t/how-to-avoid-non-function-value-encountered-for-d - Perf: Improve network request performance ([#7636](https://github.com/orhun/git-cliff/issues/7636)) -* perf: Improve fetch - -* CHANGELOG - +* perf: Improve fetch + +* CHANGELOG + * lifo - Perf: Tune AP job queue timings ([#7635](https://github.com/orhun/git-cliff/issues/7635)) -* perf: Tune AP job queue timings - -* CHANGELOG - -* chore: add reference - +* perf: Tune AP job queue timings + +* CHANGELOG + +* chore: add reference + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Perf: delete-account処理を軽くする ([#7958](https://github.com/orhun/git-cliff/issues/7958)) -* Revert "#7892" - -This reverts commit 71d9c2a53d116a61f4c9b21ff98712a0000412b8. - -* アカウント削除処理でノート削除を重複して行なわないようにする - -* ドライブファイル削除時に参照しているノートを削除しないようにする - +* Revert "#7892" + +This reverts commit 71d9c2a53d116a61f4c9b21ff98712a0000412b8. + +* アカウント削除処理でノート削除を重複して行なわないようにする + +* ドライブファイル削除時に参照しているノートを削除しないようにする + * 不要となったコードを削除する - Perf(server): reduce memory usage of redis - Perf(server): reduce db query @@ -10357,9 +10368,9 @@ This reverts commit 71d9c2a53d116a61f4c9b21ff98712a0000412b8. - Perf: fix caching ([#8660](https://github.com/orhun/git-cliff/issues/8660)) -The cache implementation did previously not store the results of the -computation and was thus not a cache at all. This can cause a significant -number of database queries each time someone with a large number of +The cache implementation did previously not store the results of the +computation and was thus not a cache at all. This can cause a significant +number of database queries each time someone with a large number of followers does something that causes an activity to be federated. - Perf(client): remove needless reactivity @@ -10412,9 +10423,9 @@ followers does something that causes an activity to be federated. - Refactor(client): Add note - Refactor: use Object.fromEntries() instead of in-house implementation ([#6401](https://github.com/orhun/git-cliff/issues/6401)) -* refactor: use Object.fromEntries() -instead of in-house implementation - +* refactor: use Object.fromEntries() +instead of in-house implementation + * Remove extra type assertions - Refactor @@ -10495,16 +10506,16 @@ path aliasをサーバーサイドでも使ったりしたいため - Refactor mfm extract ([#7434](https://github.com/orhun/git-cliff/issues/7434)) -* refactor extractCustomEmojisFromMfm() - -* refactor extract-hashtags - -* refactor extract-mentions - -* refactor extract-hashtags - -* refactor extract-url-from-mfm - +* refactor extractCustomEmojisFromMfm() + +* refactor extract-hashtags + +* refactor extract-mentions + +* refactor extract-hashtags + +* refactor extract-url-from-mfm + * refactor extract-mentions - Refactor @@ -10531,24 +10542,24 @@ path aliasをサーバーサイドでも使ったりしたいため - Enhance(server): Improve user block ([#7640](https://github.com/orhun/git-cliff/issues/7640)) -* enhance(server): Improve user block - -* Update CHANGELOG.md - -* ユーザーリスト対応 - -* 相手から見れなくなるように - -* Update 1629004542760-chart-reindex.ts - -https://github.com/misskey-dev/misskey/commit/2365761ba5445f26c8b66b3b20ef4be44e70d549#commitcomment-54919821 - -* update test - -* add test - -* add todos - +* enhance(server): Improve user block + +* Update CHANGELOG.md + +* ユーザーリスト対応 + +* 相手から見れなくなるように + +* Update 1629004542760-chart-reindex.ts + +https://github.com/misskey-dev/misskey/commit/2365761ba5445f26c8b66b3b20ef4be44e70d549#commitcomment-54919821 + +* update test + +* add test + +* add todos + * Update 1629004542760-chart-reindex.ts - Refactor @@ -10564,23 +10575,23 @@ Related: #7658 - Refactor: localStorageのaccountsはindexedDBで保持するように ([#7609](https://github.com/orhun/git-cliff/issues/7609)) -* accountsストアはindexedDBで保持するように - -* fix lint - -* fix indexeddb available detection - -* remove debugging code - -* fix lint - -* resolve https://github.com/misskey-dev/misskey/pull/7609/files/ba756204b77ce6e1189b8443e9641f2d02119621#diff-f565878e8202f0037b830c780b7c0932dc1bb5fd3d05ede14d72d10efbc3740c -Firefoxでの動作を改善 - -* fix lint - -* fix lint - +* accountsストアはindexedDBで保持するように + +* fix lint + +* fix indexeddb available detection + +* remove debugging code + +* fix lint + +* resolve https://github.com/misskey-dev/misskey/pull/7609/files/ba756204b77ce6e1189b8443e9641f2d02119621#diff-f565878e8202f0037b830c780b7c0932dc1bb5fd3d05ede14d72d10efbc3740c +Firefoxでの動作を改善 + +* fix lint + +* fix lint + * add changelog - Enhance(client): Improve emoji autocomplete behaviour @@ -10588,26 +10599,26 @@ cherry picked from https://github.com/kat-atat/misskey/commit/4b2c215e25a0bae47f - Enhance(server): Use job queue for account delete ([#7668](https://github.com/orhun/git-cliff/issues/7668)) -* enhance(server): Use job queue for account delete - -Fix #5336 - -* ジョブをひとつに - -* remove done call - -* clean up - -* add User.isDeleted - -* コミット忘れ - -* Update 1629512953000-user-is-deleted.ts - -* show dialog - -* lint - +* enhance(server): Use job queue for account delete + +Fix #5336 + +* ジョブをひとつに + +* remove done call + +* clean up + +* add User.isDeleted + +* コミット忘れ + +* Update 1629512953000-user-is-deleted.ts + +* show dialog + +* lint + * Update 1629512953000-user-is-deleted.ts - Enhance: Improve account deletion experience @@ -10619,32 +10630,32 @@ Fix #5336 - Refactor: Expand schema ([#7772](https://github.com/orhun/git-cliff/issues/7772)) -* packedNotificationSchemaを更新 - -* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 - -* fix - -* add header, choice, invitation - -* test - -* fix - -* yatta - -* remove no longer needed "as PackedUser/PackedNote" - -* clean up - -* add simple-schema - -* fix lint - -* define items in full Schema - -* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 - +* packedNotificationSchemaを更新 + +* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 + +* fix + +* add header, choice, invitation + +* test + +* fix + +* yatta + +* remove no longer needed "as PackedUser/PackedNote" + +* clean up + +* add simple-schema + +* fix lint + +* define items in full Schema + +* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 + * user packとnote packの型不整合を修正 - Enhance(server): アカウントが凍結されたときのエラーを判定しやすく @@ -10652,10 +10663,10 @@ Fix #5336 - Enhance: ノートヘッダーにflex-shrinkを設定し、Acctを優先的に縮小して見栄えをよくするように ([#7752](https://github.com/orhun/git-cliff/issues/7752)) -* MAKE NOTE HEADER FLEX AGAIN - -* span => div - +* MAKE NOTE HEADER FLEX AGAIN + +* span => div + * remove submodules - Enhance(client): リスト、アンテナタイムラインを個別ページとして分割 @@ -10665,106 +10676,106 @@ Resolve #7756 - Refactor: PackedHoge型をPacked<'Hoge'>型に書き換える ([#7792](https://github.com/orhun/git-cliff/issues/7792)) -* packedNotificationSchemaを更新 - -* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 - -* fix - -* add header, choice, invitation - -* test - -* fix - -* yatta - -* remove no longer needed "as PackedUser/PackedNote" - -* clean up - -* add simple-schema - -* fix lint - -* define items in full Schema - -* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 - -* user packとnote packの型不整合を修正 - -* add prelude/types.ts - -* emoji - -* signin - -* game - -* matching - -* fix - -* add emoji schema - -* add reversiGame - -* add reversiMatching - -* remove signin schema (use Signin entity) - -* add Packed type - -* note-reaction - -* user - -* user-group - -* user-list - -* note - -* app, messaging-message - -* notification - -* drive-file - -* drive-folder - -* following - -* muting - -* blocking - -* hashtag - -* page - -* app (with modifying schema) - -* import user? - -* channel - -* antenna - -* clip - -* gallery-post - -* emoji - -* Packed - -* reversi-matching - -* add changelog - -* add changelog - +* packedNotificationSchemaを更新 + +* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 + +* fix + +* add header, choice, invitation + +* test + +* fix + +* yatta + +* remove no longer needed "as PackedUser/PackedNote" + +* clean up + +* add simple-schema + +* fix lint + +* define items in full Schema + +* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 + +* user packとnote packの型不整合を修正 + +* add prelude/types.ts + +* emoji + +* signin + +* game + +* matching + +* fix + +* add emoji schema + +* add reversiGame + +* add reversiMatching + +* remove signin schema (use Signin entity) + +* add Packed type + +* note-reaction + +* user + +* user-group + +* user-list + +* note + +* app, messaging-message + +* notification + +* drive-file + +* drive-folder + +* following + +* muting + +* blocking + +* hashtag + +* page + +* app (with modifying schema) + +* import user? + +* channel + +* antenna + +* clip + +* gallery-post + +* emoji + +* Packed + +* reversi-matching + +* add changelog + +* add changelog + * revert fix - Enhance(client): アップデートが利用可能な場合エラー表示およびダイアログ表示しないように @@ -10782,14 +10793,14 @@ Resolve #7854 - Enhance: ページロードエラーページにリロードボタンを追加 ([#7835](https://github.com/orhun/git-cliff/issues/7835)) -* wip - -* modify page load error page - -* add changelog - -* サーバーが死んでるエラーを追加 - +* wip + +* modify page load error page + +* add changelog + +* サーバーが死んでるエラーを追加 + * add MkLoading - Enhance(api): ap系のエンドポイントをログイン必須化+レートリミット追加 @@ -10811,223 +10822,223 @@ Resolve #7854 - Enhance: shareページでより多くの情報を渡せるように ([#7606](https://github.com/orhun/git-cliff/issues/7606)) -* shareでより多くの情報を渡せるように - -* from chat ui post-form, remove instant and add share - -* fix await eating array, make document - -* add changelog - -* https://github.com/misskey-dev/misskey/pull/7606/files/3581bf9a060742dc59bf7fb8ea7316809cc60522#r692265037 - -* reply, renoteにも型定義 - -* :art: - +* shareでより多くの情報を渡せるように + +* from chat ui post-form, remove instant and add share + +* fix await eating array, make document + +* add changelog + +* https://github.com/misskey-dev/misskey/pull/7606/files/3581bf9a060742dc59bf7fb8ea7316809cc60522#r692265037 + +* reply, renoteにも型定義 + +* :art: + * 閉じなければ100ms後タイムラインに - Refactor: publishHogeStreamとStreamのEventEmitterに型定義する ([#7769](https://github.com/orhun/git-cliff/issues/7769)) -* wip - -* wip - -* wip - -* :v: - -* add main stream - -* packedNotificationSchemaを更新 - -* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 - -* fix - -* ok - -* add header, choice, invitation - -* add header, choice, invitation - -* test - -* fix - -* fix - -* yatta - -* remove no longer needed "as PackedUser/PackedNote" - -* clean up - -* add simple-schema - -* fix lint - -* fix lint - -* wip - -* wip! - -* wip - -* fix - -* wip - -* wip - -* :v: - -* 送信側に型エラーがないことを3回確認した - -* :v: - -* wip - -* update typescript - -* define items in full Schema - -* edit comment - -* edit comment - -* edit comment - -* Update src/prelude/types.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* https://github.com/misskey-dev/misskey/pull/7769#discussion_r703058458 - -* user packとnote packの型不整合を修正 - -* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 - -* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 - -* user packとnote packの型不整合を修正 - -* add prelude/types.ts - -* emoji - -* signin - -* game - -* matching - -* clean up - -* ev => data - -* refactor - -* clean up - -* add type - -* antenna - -* channel - -* fix - -* add Packed type - -* add PackedRef - -* fix lint - -* add emoji schema - -* add reversiGame - -* add reversiMatching - -* remove signin schema (use Signin entity) - -* add schemas refs, fix Packed type - -* wip PackedHoge => Packed<'Hoge'> - -* add Packed type - -* note-reaction - -* user - -* user-group - -* user-list - -* note - -* app, messaging-message - -* notification - -* drive-file - -* drive-folder - -* following - -* muting - -* blocking - -* hashtag - -* page - -* app (with modifying schema) - -* import user? - -* channel - -* antenna - -* clip - -* gallery-post - -* emoji - -* Packed - -* reversi-matching - -* update stream.ts - -* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 - -* fix lint - -* clean up? - -* add changelog - -* add changelog - -* add changelog - -* fix: アンテナが既読にならないのを修正 - -* revert fix - -* https://github.com/misskey-dev/misskey/pull/7769#discussion_r711474875 - -* spec => payload - -* edit commetn - +* wip + +* wip + +* wip + +* :v: + +* add main stream + +* packedNotificationSchemaを更新 + +* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 + +* fix + +* ok + +* add header, choice, invitation + +* add header, choice, invitation + +* test + +* fix + +* fix + +* yatta + +* remove no longer needed "as PackedUser/PackedNote" + +* clean up + +* add simple-schema + +* fix lint + +* fix lint + +* wip + +* wip! + +* wip + +* fix + +* wip + +* wip + +* :v: + +* 送信側に型エラーがないことを3回確認した + +* :v: + +* wip + +* update typescript + +* define items in full Schema + +* edit comment + +* edit comment + +* edit comment + +* Update src/prelude/types.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* https://github.com/misskey-dev/misskey/pull/7769#discussion_r703058458 + +* user packとnote packの型不整合を修正 + +* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 + +* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 + +* user packとnote packの型不整合を修正 + +* add prelude/types.ts + +* emoji + +* signin + +* game + +* matching + +* clean up + +* ev => data + +* refactor + +* clean up + +* add type + +* antenna + +* channel + +* fix + +* add Packed type + +* add PackedRef + +* fix lint + +* add emoji schema + +* add reversiGame + +* add reversiMatching + +* remove signin schema (use Signin entity) + +* add schemas refs, fix Packed type + +* wip PackedHoge => Packed<'Hoge'> + +* add Packed type + +* note-reaction + +* user + +* user-group + +* user-list + +* note + +* app, messaging-message + +* notification + +* drive-file + +* drive-folder + +* following + +* muting + +* blocking + +* hashtag + +* page + +* app (with modifying schema) + +* import user? + +* channel + +* antenna + +* clip + +* gallery-post + +* emoji + +* Packed + +* reversi-matching + +* update stream.ts + +* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 + +* fix lint + +* clean up? + +* add changelog + +* add changelog + +* add changelog + +* fix: アンテナが既読にならないのを修正 + +* revert fix + +* https://github.com/misskey-dev/misskey/pull/7769#discussion_r711474875 + +* spec => payload + +* edit commetn + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Refactor clinet @@ -11037,23 +11048,23 @@ Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Enhance: Provide Twemoji SVGs from Misskey server ([#2](https://github.com/orhun/git-cliff/issues/2)) ([#7897](https://github.com/orhun/git-cliff/issues/7897)) -* Selfhosting Twemoji - -* ちっ - -* うざっ - -* あ - -* add test - +* Selfhosting Twemoji + +* ちっ + +* うざっ + +* あ + +* add test + Co-authored-by: mei23 <m@m544.net> - Refactor - Refactor: Introduce list of MFM Functions ([#7882](https://github.com/orhun/git-cliff/issues/7882)) -* introduce list of MFM Functions - +* introduce list of MFM Functions + * add note - Refactoring @@ -11069,21 +11080,21 @@ Resolve #7779 - Enhance: show renoters ([#7954](https://github.com/orhun/git-cliff/issues/7954)) -* refactor: deduplicate renote button into component - -For now the renoters tooltip just uses the reaction viewer component -with a fixed emoji symbol instead. - -* chore: remove unnecessary CSS - -* fix: forgot to rename variable - -* enhance: use own tooltip instead of reaction viewer - -* clean up style - -* fix additional renoters number - +* refactor: deduplicate renote button into component + +For now the renoters tooltip just uses the reaction viewer component +with a fixed emoji symbol instead. + +* chore: remove unnecessary CSS + +* fix: forgot to rename variable + +* enhance: use own tooltip instead of reaction viewer + +* clean up style + +* fix additional renoters number + * rename file to better represent content - Refactor(client): use composition api for tooltip logic @@ -11150,22 +11161,22 @@ Fix #8029 - Enhance: pizzaxでstreamingのuser storage updateイベントを監視して更新 ([#8095](https://github.com/orhun/git-cliff/issues/8095)) -* wip - -* wip? - -* ? - -* streamingのuser storage updateイベントを監視して更新 - -* 必要な時以外はストレージを更新しない - -* fix? - -* wip - -* fix - +* wip + +* wip? + +* ? + +* streamingのuser storage updateイベントを監視して更新 + +* 必要な時以外はストレージを更新しない + +* fix? + +* wip + +* fix + * fix - Enhance(client): tweak ui @@ -11177,8 +11188,8 @@ Fix #8029 - Enhance: 許可されていないファイルタイプでは、オブジェクトストレージのファイル名に拡張子を付与しないように ([#8108](https://github.com/orhun/git-cliff/issues/8108)) -* 許可されていないファイルタイプでは、オブジェクトストレージのファイル名に拡張子を付与しないように - +* 許可されていないファイルタイプでは、オブジェクトストレージのファイル名に拡張子を付与しないように + * add comment - Refactor(client): use composition api @@ -11200,67 +11211,67 @@ Fix #8029 - Refactor: Widgetのcomposition api移行 ([#8125](https://github.com/orhun/git-cliff/issues/8125)) -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + * fix - Refactor: Composition APIへ移行 ([#8121](https://github.com/orhun/git-cliff/issues/8121)) -* components/abuse-report-window.vue - -* use <script setup> - -* :v: - -* components/analog-clock.vue - -* wip components/autocomplete.vue - -* :v: - -* :v: - -* fix - -* wip components/captcha.vue - -* clean up - -* components/channel-follow-button - -* components/channel-preview.vue - -* components/core-core.vue - -* components/code.vue - -* wip components/date-separated-list.vue - -* fix - -* fix autocomplete.vue - -* :v: - -* remove global property - -* use <script setup> - -* components/dialog.vue - -* clena up - -* fix dialog.vue - +* components/abuse-report-window.vue + +* use <script setup> + +* :v: + +* components/analog-clock.vue + +* wip components/autocomplete.vue + +* :v: + +* :v: + +* fix + +* wip components/captcha.vue + +* clean up + +* components/channel-follow-button + +* components/channel-preview.vue + +* components/core-core.vue + +* components/code.vue + +* wip components/date-separated-list.vue + +* fix + +* fix autocomplete.vue + +* :v: + +* remove global property + +* use <script setup> + +* components/dialog.vue + +* clena up + +* fix dialog.vue + * Resolve https://github.com/misskey-dev/misskey/pull/8121#discussion_r781250966 - Refactor @@ -11276,204 +11287,204 @@ Fix #8029 - Refactor: APIエンドポイントファイルの定義を良い感じにする ([#8154](https://github.com/orhun/git-cliff/issues/8154)) -* Fix API Schema Error - -* Delete SimpleSchema/SimpleObj -and Move schemas to dedicated files - -* Userのスキーマを分割してみる - -* define packMany type - -* add , - -* Ensure enum schema and Make "as const" put once - -* test? - -* Revert "test?" - -This reverts commit 97dc9bfa70851bfb7d1cf38e883f8df20fb78b79. - -* Revert "Fix API Schema Error" - -This reverts commit 21b6176d974ed8e3eb73723ad21a105c5d297323. - -* :v: - -* clean up - -* test? - -* wip - -* wip - -* better schema def - -* :v: - -* fix - -* add minLength property - -* wip - -* wip - -* wip - -* anyOf/oneOf/allOfに対応? ~ relation.ts - -* refactor! - -* Define MinimumSchema - -* wip - -* wip - -* anyOf/oneOf/allOfが動作するようにUnionSchemaTypeを修正 - -* anyOf/oneOf/allOfが動作するようにUnionSchemaTypeを修正 - -* Update packages/backend/src/misc/schema.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* fix - -* array oneOfをより正確な型に - -* array oneOfをより正確な型に - -* wip - -* :v: - -* なんかもういろいろ - -* remove - -* very good schema - -* api schema - -* wip - -* refactor: awaitAllの型定義を変えてみる - -* fix - -* specify types in awaitAll - -* specify types in awaitAll - -* :v: - -* wip - -* ... - -* :v: - -* AllowDateはやめておく - -* 不必要なoptional: false, nullable: falseを廃止 - -* Packedが展開されないように - -* 続packed - -* wip - -* define note type - -* wip - -* UserDetailedをMeDetailedかUserDetailedNotMeかを区別できるように - -* wip - -* wip - -* wip specify user type of other schemas - -* ok - -* convertSchemaToOpenApiSchemaを改修 - -* convertSchemaToOpenApiSchemaを改修 - -* Fix - -* fix - -* :v: - -* wip - -* 分割代入ではなくallOfで定義するように - +* Fix API Schema Error + +* Delete SimpleSchema/SimpleObj +and Move schemas to dedicated files + +* Userのスキーマを分割してみる + +* define packMany type + +* add , + +* Ensure enum schema and Make "as const" put once + +* test? + +* Revert "test?" + +This reverts commit 97dc9bfa70851bfb7d1cf38e883f8df20fb78b79. + +* Revert "Fix API Schema Error" + +This reverts commit 21b6176d974ed8e3eb73723ad21a105c5d297323. + +* :v: + +* clean up + +* test? + +* wip + +* wip + +* better schema def + +* :v: + +* fix + +* add minLength property + +* wip + +* wip + +* wip + +* anyOf/oneOf/allOfに対応? ~ relation.ts + +* refactor! + +* Define MinimumSchema + +* wip + +* wip + +* anyOf/oneOf/allOfが動作するようにUnionSchemaTypeを修正 + +* anyOf/oneOf/allOfが動作するようにUnionSchemaTypeを修正 + +* Update packages/backend/src/misc/schema.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* fix + +* array oneOfをより正確な型に + +* array oneOfをより正確な型に + +* wip + +* :v: + +* なんかもういろいろ + +* remove + +* very good schema + +* api schema + +* wip + +* refactor: awaitAllの型定義を変えてみる + +* fix + +* specify types in awaitAll + +* specify types in awaitAll + +* :v: + +* wip + +* ... + +* :v: + +* AllowDateはやめておく + +* 不必要なoptional: false, nullable: falseを廃止 + +* Packedが展開されないように + +* 続packed + +* wip + +* define note type + +* wip + +* UserDetailedをMeDetailedかUserDetailedNotMeかを区別できるように + +* wip + +* wip + +* wip specify user type of other schemas + +* ok + +* convertSchemaToOpenApiSchemaを改修 + +* convertSchemaToOpenApiSchemaを改修 + +* Fix + +* fix + +* :v: + +* wip + +* 分割代入ではなくallOfで定義するように + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Refactor: Composition APIへ移行 ([#8138](https://github.com/orhun/git-cliff/issues/8138)) -* components/drive-file-thumbnail.vue - -* components/drive-select-dialog.vue - -* components/drive-window.vue - -* wip - -* wip drive.file.vue, drive.vue - -* fix prop - -* wip( - -* components/drive.folder.vue - -* maybe ok - -* :v: - -* fix variable - -* FIX FOLDER VARIABLE - -* components/emoji-picker-dialog.vue - -* Hate `$emit` - -* hate global property - -* components/emoji-picker-window.vue - -* components/emoji-picker.section.vue - -* fix - -* fixx - -* wip components/emoji-picker.vue - -* fix - -* defineExpose - -* ユニコード絵文字の型をもっといい感じに - -* components/featured-photos.vue - -* components/follow-button.vue - -* forgot-password.vue - -* forgot-password.vue - -* :art: - +* components/drive-file-thumbnail.vue + +* components/drive-select-dialog.vue + +* components/drive-window.vue + +* wip + +* wip drive.file.vue, drive.vue + +* fix prop + +* wip( + +* components/drive.folder.vue + +* maybe ok + +* :v: + +* fix variable + +* FIX FOLDER VARIABLE + +* components/emoji-picker-dialog.vue + +* Hate `$emit` + +* hate global property + +* components/emoji-picker-window.vue + +* components/emoji-picker.section.vue + +* fix + +* fixx + +* wip components/emoji-picker.vue + +* fix + +* defineExpose + +* ユニコード絵文字の型をもっといい感じに + +* components/featured-photos.vue + +* components/follow-button.vue + +* forgot-password.vue + +* forgot-password.vue + +* :art: + * fix - Refactor @@ -11485,147 +11496,147 @@ Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Enhance: Forward report ([#8001](https://github.com/orhun/git-cliff/issues/8001)) -* implement sending AP Flag object - -Optionally allow a user to select to forward a report about a remote -user to the other instance. This is added in a backwards-compatible way. - -* add locale string - -* forward report only for moderators - -* add switch to moderator UI to forward report - -* fix report note url - -* return forwarded status from API - -apparently forgot to carry this over from my testing environment - -* object in Flag activity has to be an array - -For correct interoperability with Pleroma the "object" property of the Flag -activity has to be an array. - -This array will in the future also hold the link to respective notes, so it -makes sense to correct this on our side. - -* Update get-note-menu.ts - +* implement sending AP Flag object + +Optionally allow a user to select to forward a report about a remote +user to the other instance. This is added in a backwards-compatible way. + +* add locale string + +* forward report only for moderators + +* add switch to moderator UI to forward report + +* fix report note url + +* return forwarded status from API + +apparently forgot to carry this over from my testing environment + +* object in Flag activity has to be an array + +For correct interoperability with Pleroma the "object" property of the Flag +activity has to be an array. + +This array will in the future also hold the link to respective notes, so it +makes sense to correct this on our side. + +* Update get-note-menu.ts + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: e2eテストをできるだけ改良してみた ([#8159](https://github.com/orhun/git-cliff/issues/8159)) -* update docker image? - -* 続 - -* serial run delete from "${table}" cascade - -* use cypress official github action - -* refuse install by cypress action - -* clean up - -* use wait? - -* use more wait? - -* Revert "use more wait?" - -This reverts commit 18d0fcae9c7d8f98a4cafb4a846a031ece57350c. - -* Revert "use wait?" - -This reverts commit 5aa8feec9cdc3e2f79e566249f0a0eff6c0df6a0. - -* fix - -* test - -* test - -* log? - -* 握りつぶしてみる - -* clean up - -* env? - -* clean up? - -* disable video - -* add comment - -* remove test - -* 成功? - -* test browser - -* nodeインストール無効化 - -* node16.13.0-chrome95-ff94 - -* node.js復活 - -* ? - -* ちょっと戻してみる - -* chrome? - -* cross browser test2 - -* --shm-size=2g - -* artifact? - -* misskey.local? - -* firefoxはあきらめる - -* not headless? - -* oops - -* fix - -* ?? - -* test1 - -* if? - -* fail-fast: false - -* headless: false - -* easy error ignoreing describe - -* エラーの解消 -とちょっとリファクター - -* add browser name to artifact - -* Install mplayer for FireFox - -* no wait? - -* タイムアウトを甘くしてみる - -* firefoxをあきらめる(n回目) - -* remove timeout setting - -* wait復活 - -* Update basic.js - -* Update index.js - +* update docker image? + +* 続 + +* serial run delete from "${table}" cascade + +* use cypress official github action + +* refuse install by cypress action + +* clean up + +* use wait? + +* use more wait? + +* Revert "use more wait?" + +This reverts commit 18d0fcae9c7d8f98a4cafb4a846a031ece57350c. + +* Revert "use wait?" + +This reverts commit 5aa8feec9cdc3e2f79e566249f0a0eff6c0df6a0. + +* fix + +* test + +* test + +* log? + +* 握りつぶしてみる + +* clean up + +* env? + +* clean up? + +* disable video + +* add comment + +* remove test + +* 成功? + +* test browser + +* nodeインストール無効化 + +* node16.13.0-chrome95-ff94 + +* node.js復活 + +* ? + +* ちょっと戻してみる + +* chrome? + +* cross browser test2 + +* --shm-size=2g + +* artifact? + +* misskey.local? + +* firefoxはあきらめる + +* not headless? + +* oops + +* fix + +* ?? + +* test1 + +* if? + +* fail-fast: false + +* headless: false + +* easy error ignoreing describe + +* エラーの解消 +とちょっとリファクター + +* add browser name to artifact + +* Install mplayer for FireFox + +* no wait? + +* タイムアウトを甘くしてみる + +* firefoxをあきらめる(n回目) + +* remove timeout setting + +* wait復活 + +* Update basic.js + +* Update index.js + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor @@ -11633,27 +11644,27 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor, enhance: ドライブ引数のオブジェクト化, 追加時のcomment指定 ([#8180](https://github.com/orhun/git-cliff/issues/8180)) -* refactor: ドライブの引数をオブジェクト化する Resolve #8177 - -* Resolve #8181 - -* fix - +* refactor: ドライブの引数をオブジェクト化する Resolve #8177 + +* Resolve #8181 + +* fix + * archivePath - Refactor(backend): use insert instead of save - Enhance: Improve poll-editor UI + composition port ([#8186](https://github.com/orhun/git-cliff/issues/8186)) -* Poll editor UI changes - -Use a horizontal layout when possible, wrap to vertical when constrained - -* Port poll-editor to composition API - -* Fix poll-editor `get` time calcs - -* fix - +* Poll editor UI changes + +Use a horizontal layout when possible, wrap to vertical when constrained + +* Port poll-editor to composition API + +* Fix poll-editor `get` time calcs + +* fix + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor @@ -11665,8 +11676,8 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: MediaListでは、サーバーで許可された形式しか表示しないように ([#8113](https://github.com/orhun/git-cliff/issues/8113)) -* wip - +* wip + * fix - Refactor(client): use composition api @@ -11686,26 +11697,26 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: メニュー関連をComposition API化、switchアイテム追加 ([#8215](https://github.com/orhun/git-cliff/issues/8215)) -* メニューをComposition API化、switchアイテム追加 -クライアントサイド画像圧縮の準備 - -* メニュー型定義を分離 (TypeScriptの型支援が効かないので) - -* disabled - -* make keepOriginal to follow setting value - -* fix - -* fix - -* Fix - +* メニューをComposition API化、switchアイテム追加 +クライアントサイド画像圧縮の準備 + +* メニュー型定義を分離 (TypeScriptの型支援が効かないので) + +* disabled + +* make keepOriginal to follow setting value + +* fix + +* fix + +* Fix + * clean up - Refactor: APIで非JSON入力の型変換はendpointに渡す前に行うように ([#8229](https://github.com/orhun/git-cliff/issues/8229)) -* Resolve #8228 - +* Resolve #8228 + * fix - Enhance(client): Chartjsのツールチップを自前に @@ -11761,122 +11772,122 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor: use ajv instead of cafy ([#8324](https://github.com/orhun/git-cliff/issues/8324)) -* wip - -* wip - -* Update abuse-user-reports.ts - -* Update files.ts - -* Update list-remote.ts - -* Update list.ts - -* Update show-users.ts - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* Update update.ts - -* Update search.ts - -* Update reactions.ts - -* Update search.ts - -* wip - -* wip - -* wip - -* wip - -* Update update.ts - -* Update relation.ts - -* Update available.ts - -* wip - -* wip - -* wip - -* Update packages/backend/src/server/api/define.ts - -Co-authored-by: Johann150 <johann.galle@protonmail.com> - -* Update define.ts - -* Update define.ts - -* typo - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* Update update.ts - -* wip - -* Update signup.ts - -* Update call.ts - -* minimum for limit - -* type - -* remove needless annotation - -* wip - -* Update signup.ts - -* wip - -* wip - -* fix - -* Update create.ts - +* wip + +* wip + +* Update abuse-user-reports.ts + +* Update files.ts + +* Update list-remote.ts + +* Update list.ts + +* Update show-users.ts + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* Update update.ts + +* Update search.ts + +* Update reactions.ts + +* Update search.ts + +* wip + +* wip + +* wip + +* wip + +* Update update.ts + +* Update relation.ts + +* Update available.ts + +* wip + +* wip + +* wip + +* Update packages/backend/src/server/api/define.ts + +Co-authored-by: Johann150 <johann.galle@protonmail.com> + +* Update define.ts + +* Update define.ts + +* typo + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* Update update.ts + +* wip + +* Update signup.ts + +* Update call.ts + +* minimum for limit + +* type + +* remove needless annotation + +* wip + +* Update signup.ts + +* wip + +* wip + +* fix + +* Update create.ts + Co-authored-by: Johann150 <johann.galle@protonmail.com> - Refactor: fix type @@ -11890,18 +11901,18 @@ Co-authored-by: Johann150 <johann.galle@protonmail.com> - Refactor: Use ESM ([#8358](https://github.com/orhun/git-cliff/issues/8358)) -* wip - -* wip - -* fix - -* clean up - -* Update tsconfig.json - -* Update activitypub.ts - +* wip + +* wip + +* fix + +* clean up + +* Update tsconfig.json + +* Update activitypub.ts + * wip - Refactor @@ -11919,26 +11930,26 @@ Co-authored-by: Johann150 <johann.galle@protonmail.com> - Refactor: migrate to typeorm 3.0 ([#8443](https://github.com/orhun/git-cliff/issues/8443)) -* wip - -* wip - -* wip - -* Update following.ts - -* wip - -* wip - -* wip - -* Update resolve-user.ts - -* maxQueryExecutionTime - -* wip - +* wip + +* wip + +* wip + +* Update following.ts + +* wip + +* wip + +* wip + +* Update resolve-user.ts + +* maxQueryExecutionTime + +* wip + * wip - Refactor and performance improvements @@ -11950,55 +11961,55 @@ Co-authored-by: Johann150 <johann.galle@protonmail.com> - Enhance(doc): required input fields ([#8456](https://github.com/orhun/git-cliff/issues/8456)) -* remove empty file - -If the endpoint is to be implemented later, the file can be added back, -but for now it is confusing to have an empty file. - -* enhance(doc): document defaults - -Default for `isPublic` is based on the database schema default value. -Defaults for `local` and `withFiles` are based on the behaviour of the endpoint. - -* enhance(doc): explain nullable emoji category - -* fix: make nullable if default is null - -* enhance(doc): explain mute attribute expiresAt - -* fix: define required fields - -- `notes/create`: the default for `text` has been removed because ajv can not handle - `default` inside of `anyOf`, see - https://ajv.js.org/guide/modifying-data.html#assigning-defaults - and the default value cannot be `null` if text is `nullable: false` in the `anyOf` - first alternative. -- `notes/create`: The `mediaIds` property has been marked as deprecated because it - has the same behaviour as using `fileIds`, but the implementation tries to handlè - `fileIds` first. -- The result schema for `admin/emoji/list` has been altered because the `host` - property will always be `null` as it is filtered this way in the database query. - See packages/backend/src/server/api/endpoints/admin/emoji/list.ts line 67. - -* enhance(doc): explain nullable hostname - -* update changelog - +* remove empty file + +If the endpoint is to be implemented later, the file can be added back, +but for now it is confusing to have an empty file. + +* enhance(doc): document defaults + +Default for `isPublic` is based on the database schema default value. +Defaults for `local` and `withFiles` are based on the behaviour of the endpoint. + +* enhance(doc): explain nullable emoji category + +* fix: make nullable if default is null + +* enhance(doc): explain mute attribute expiresAt + +* fix: define required fields + +- `notes/create`: the default for `text` has been removed because ajv can not handle + `default` inside of `anyOf`, see + https://ajv.js.org/guide/modifying-data.html#assigning-defaults + and the default value cannot be `null` if text is `nullable: false` in the `anyOf` + first alternative. +- `notes/create`: The `mediaIds` property has been marked as deprecated because it + has the same behaviour as using `fileIds`, but the implementation tries to handlè + `fileIds` first. +- The result schema for `admin/emoji/list` has been altered because the `host` + property will always be `null` as it is filtered this way in the database query. + See packages/backend/src/server/api/endpoints/admin/emoji/list.ts line 67. + +* enhance(doc): explain nullable hostname + +* update changelog + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: タッチパッド・タッチスクリーンでのデッキの操作性を向上 ([#8450](https://github.com/orhun/git-cliff/issues/8450)) -* enhance experience of deck with touchpad - -* test: 単純にdeltaYを加算してみる - -* clean up - -* ios bug fix? - -* :v: - -* use overflow-y - +* enhance experience of deck with touchpad + +* test: 単純にdeltaYを加算してみる + +* clean up + +* ios bug fix? + +* :v: + +* use overflow-y + * Safari does not supports clip - Refactor actions @@ -12048,86 +12059,86 @@ Resolve #8467 - Enhance: only render public notes in HTML template ([#8527](https://github.com/orhun/git-cliff/issues/8527)) -* only render public notes in HTML template - +* only render public notes in HTML template + * fix missing import - Refactor: use composition API ([#8541](https://github.com/orhun/git-cliff/issues/8541)) - Enhance: ドライブに画像ファイルをアップロードするときオリジナル画像を破棄してwebpublicのみ保持するオプション ([#8216](https://github.com/orhun/git-cliff/issues/8216)) -* wip - -* Update packages/client/src/os.ts - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> - -* メニューをComposition API化、switchアイテム追加 -クライアントサイド画像圧縮の準備 - -* メニュー型定義を分離 (TypeScriptの型支援が効かないので) - -* disabled - -* make keepOriginal to follow setting value - -* :v: - -* fix - -* fix - -* :v: - -* WEBP - -* aaa - -* :v: - -* webp - -* lazy load browser-image-resizer - -* rename - -* rename 2 - -* Fix - -* clean up - -* add comment - -* clean up - -* jpeg, pngにもどす - -* fix - -* fix name - -* webpでなくする ただしサムネやプレビューはwebpのまま (テスト) - -* 動画サムネイルはjpegに - -* エラーハンドリング - -* :v: - -* v2.2.1-misskey-beta.2 - -* browser-image-resizer#v2.2.1-misskey.1 - -* :v: - -* fix alert - -* update browser-image-resizer to v2.2.1-misskey.2 - -* lockfile - -Co-authored-by: mei23 <m@m544.net> +* wip + +* Update packages/client/src/os.ts + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> + +* メニューをComposition API化、switchアイテム追加 +クライアントサイド画像圧縮の準備 + +* メニュー型定義を分離 (TypeScriptの型支援が効かないので) + +* disabled + +* make keepOriginal to follow setting value + +* :v: + +* fix + +* fix + +* :v: + +* WEBP + +* aaa + +* :v: + +* webp + +* lazy load browser-image-resizer + +* rename + +* rename 2 + +* Fix + +* clean up + +* add comment + +* clean up + +* jpeg, pngにもどす + +* fix + +* fix name + +* webpでなくする ただしサムネやプレビューはwebpのまま (テスト) + +* 動画サムネイルはjpegに + +* エラーハンドリング + +* :v: + +* v2.2.1-misskey-beta.2 + +* browser-image-resizer#v2.2.1-misskey.1 + +* :v: + +* fix alert + +* update browser-image-resizer to v2.2.1-misskey.2 + +* lockfile + +Co-authored-by: mei23 <m@m544.net> Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> - Refactor(client): refactor api-console to use Composition API ([#8566](https://github.com/orhun/git-cliff/issues/8566)) @@ -12140,266 +12151,266 @@ Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> - Refactor: use Vite to build instead of webpack ([#8575](https://github.com/orhun/git-cliff/issues/8575)) -* update stream.ts - -* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 - -* fix lint - -* clean up? - -* add app - -* fix - -* nanka iroiro - -* wip - -* wip - -* fix lint - -* fix loginId - -* fix - -* refactor - -* refactor - -* remove follow action - -* clean up - -* Revert "remove follow action" - -This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. - -* Revert "clean up" - -This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. - -* remove fetch specification - -* renoteの条件追加 - -* apiFetch => cli - -* bypass fetch? - -* fix - -* refactor: use path alias - -* temp: add submodule - -* remove submodule - -* enhane: unison-reloadに指定したパスに移動できるように - -* null - -* null - -* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 - -* null - -* await? - -* rename - -* rename - -* Update read.ts - -* merge - -* get-note-summary - -* fix - -* swパッケージに - -* add missing packages - -* fix getNoteSummary - -* add webpack-cli - -* :v: - -* remove plugins - -* sw-inject分離したがテストしてない - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix - -* :v: - -* clean up config - -* typesを戻した - -* Update packages/client/src/components/notification.vue - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* disconnect - -* oops - -* Failed to load the script unexpectedly回避 -sw.jsとlib.tsを分離してみた - -* truncate notification - -* Update packages/client/src/ui/_common_/common.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* clean up - -* clean up - -* キャッシュ対策 - -* Truncate push notification message - -* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 - -* components/drive-file-thumbnail.vue - -* components/drive-select-dialog.vue - -* components/drive-window.vue - -* merge - -* fix - -* Service Workerのビルドにesbuildを使うようにする - -* return createEmptyNotification() - -* fix - -* i18n.ts - -* update - -* :v: - -* remove ts-loader - -* fix - -* fix - -* enhance: Service Workerを常に登録するように - -* pollEnded - -* URLをsw.jsに戻す - -* clean up - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* :v: - -* use import - -* fix - -* install rollup - -* use defineAsyncComponent. - -* fix emojilist - -* wip use defineAsyncComponent - -* popup(import -> popup(defineAsyncComponent(() => import - -* draggable? - -* fix init import - -* clean up - -* fix router - -* add comment - -* :v: - -* :v: - -* :v: - -* remove webpack - -* update vite - -* fix boot sequence - -* Revert "fix boot sequence" - -This reverts commit e893dbf37aed83bf9f12e427d98c78a7065b4a39. - -* revert boot import - -* never make two app div - -* ; - -* remove console.log - -* change clientEntry sequence - -* fix - -* Revert "fix" - -This reverts commit 12741b3d89950a31dbb1bb81477ddb27b0e9951a. - -* fix - -* add comment https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 - -* add log - -* add comment - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> +* update stream.ts + +* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 + +* fix lint + +* clean up? + +* add app + +* fix + +* nanka iroiro + +* wip + +* wip + +* fix lint + +* fix loginId + +* fix + +* refactor + +* refactor + +* remove follow action + +* clean up + +* Revert "remove follow action" + +This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. + +* Revert "clean up" + +This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. + +* remove fetch specification + +* renoteの条件追加 + +* apiFetch => cli + +* bypass fetch? + +* fix + +* refactor: use path alias + +* temp: add submodule + +* remove submodule + +* enhane: unison-reloadに指定したパスに移動できるように + +* null + +* null + +* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 + +* null + +* await? + +* rename + +* rename + +* Update read.ts + +* merge + +* get-note-summary + +* fix + +* swパッケージに + +* add missing packages + +* fix getNoteSummary + +* add webpack-cli + +* :v: + +* remove plugins + +* sw-inject分離したがテストしてない + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix + +* :v: + +* clean up config + +* typesを戻した + +* Update packages/client/src/components/notification.vue + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* disconnect + +* oops + +* Failed to load the script unexpectedly回避 +sw.jsとlib.tsを分離してみた + +* truncate notification + +* Update packages/client/src/ui/_common_/common.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* clean up + +* clean up + +* キャッシュ対策 + +* Truncate push notification message + +* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 + +* components/drive-file-thumbnail.vue + +* components/drive-select-dialog.vue + +* components/drive-window.vue + +* merge + +* fix + +* Service Workerのビルドにesbuildを使うようにする + +* return createEmptyNotification() + +* fix + +* i18n.ts + +* update + +* :v: + +* remove ts-loader + +* fix + +* fix + +* enhance: Service Workerを常に登録するように + +* pollEnded + +* URLをsw.jsに戻す + +* clean up + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* :v: + +* use import + +* fix + +* install rollup + +* use defineAsyncComponent. + +* fix emojilist + +* wip use defineAsyncComponent + +* popup(import -> popup(defineAsyncComponent(() => import + +* draggable? + +* fix init import + +* clean up + +* fix router + +* add comment + +* :v: + +* :v: + +* :v: + +* remove webpack + +* update vite + +* fix boot sequence + +* Revert "fix boot sequence" + +This reverts commit e893dbf37aed83bf9f12e427d98c78a7065b4a39. + +* revert boot import + +* never make two app div + +* ; + +* remove console.log + +* change clientEntry sequence + +* fix + +* Revert "fix" + +This reverts commit 12741b3d89950a31dbb1bb81477ddb27b0e9951a. + +* fix + +* add comment https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 + +* add log + +* add comment + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor(client): refactor settings/accounts to use Composition API ([#8604](https://github.com/orhun/git-cliff/issues/8604)) @@ -12463,57 +12474,57 @@ Co-Authored-By: tamaina <tamaina@hotmail.co.jp> - Enhance: Perform port diagnosis at startup only when Listen fails ([#8698](https://github.com/orhun/git-cliff/issues/8698)) -* Change port check - -* Comment: disableClustering - -* CHANGELOG - +* Change port check + +* Comment: disableClustering + +* CHANGELOG + * Smart message - Enhance: uniform theme color ([#8702](https://github.com/orhun/git-cliff/issues/8702)) -* enhance: make theme color format uniform - -All newly fetched instance theme colors will be uniformely formatted -as hashtag followed by 6 hexadecimal digits. - -Colors are checked for validity and invalid colors are not handled. - -* better input validation for own theme color - -* migration to unify theme color formats - -Fixes theme colors of other instances as well as the local instance. - -* add changelog entry - +* enhance: make theme color format uniform + +All newly fetched instance theme colors will be uniformely formatted +as hashtag followed by 6 hexadecimal digits. + +Colors are checked for validity and invalid colors are not handled. + +* better input validation for own theme color + +* migration to unify theme color formats + +Fixes theme colors of other instances as well as the local instance. + +* add changelog entry + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor(client): refactor admin/settings to use Composition API ([#8678](https://github.com/orhun/git-cliff/issues/8678)) - Enhance(MFM): limit large MFM ([#8540](https://github.com/orhun/git-cliff/issues/8540)) -* add CSS classes for zoom MFM - -* limit nesting of x2, x3, x4 MFM - -* simplify CSS calculation - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - +* add CSS classes for zoom MFM + +* limit nesting of x2, x3, x4 MFM + +* simplify CSS calculation + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Enhance: page image component with alt text ([#8634](https://github.com/orhun/git-cliff/issues/8634)) -* refactor to composition API - -* use existing image component - -This improves user experience because alt text is displayed correctly. - -* fix: correct image src - -* fix: defineProps - +* refactor to composition API + +* use existing image component + +This improves user experience because alt text is displayed correctly. + +* fix: correct image src + +* fix: defineProps + * fix - Refactor @@ -12522,33 +12533,33 @@ This improves user experience because alt text is displayed correctly. - Refactor: temporary files ([#8713](https://github.com/orhun/git-cliff/issues/8713)) -* simplify temporary files for thumbnails - -Because only a single file will be written to the directory, creating a -separate directory seems unnecessary. If only a temporary file is created, -the code from `createTemp` can be reused here as well. - -* refactor: deduplicate code for temporary files/directories - -To follow the DRY principle, the same code should not be duplicated -across different files. Instead an already existing function is used. - -Because temporary directories are also create in multiple locations, -a function for this is also newly added to reduce duplication. - -* fix: clean up identicon temp files - -The temporary files for identicons are not reused and can be deleted -after they are fully read. This condition is met when the stream is closed -and so the file can be cleaned up using the events API of the stream. - -* fix: ensure cleanup is called when download fails - -* fix: ensure cleanup is called in error conditions - -This covers import/export queue jobs and is mostly just wrapping all -code in a try...finally statement where the finally runs the cleanup. - +* simplify temporary files for thumbnails + +Because only a single file will be written to the directory, creating a +separate directory seems unnecessary. If only a temporary file is created, +the code from `createTemp` can be reused here as well. + +* refactor: deduplicate code for temporary files/directories + +To follow the DRY principle, the same code should not be duplicated +across different files. Instead an already existing function is used. + +Because temporary directories are also create in multiple locations, +a function for this is also newly added to reduce duplication. + +* fix: clean up identicon temp files + +The temporary files for identicons are not reused and can be deleted +after they are fully read. This condition is met when the stream is closed +and so the file can be cleaned up using the events API of the stream. + +* fix: ensure cleanup is called when download fails + +* fix: ensure cleanup is called in error conditions + +This covers import/export queue jobs and is mostly just wrapping all +code in a try...finally statement where the finally runs the cleanup. + * fix: use correct type instead of `any` - Refactor: use === @@ -12557,123 +12568,123 @@ code in a try...finally statement where the finally runs the cleanup. fix #8744 - Enhance: replace signin CAPTCHA with rate limit ([#8740](https://github.com/orhun/git-cliff/issues/8740)) -* enhance: rate limit works without signed in user - -* fix: make limit key required for limiter - -As before the fallback limiter key will be set from the endpoint name. - -* enhance: use limiter for signin - -* Revert "CAPTCHA求めるのは2fa認証が無効になっているときだけにした" - -This reverts commit 02a43a310f6ad0cc9e9beccc26e51ab5b339e15f. - -* Revert "feat: make captcha required when signin to improve security" - -This reverts commit b21b0580058c14532ff3f4033e2a9147643bfca6. - -* fix undefined reference - -* fix: better error message - +* enhance: rate limit works without signed in user + +* fix: make limit key required for limiter + +As before the fallback limiter key will be set from the endpoint name. + +* enhance: use limiter for signin + +* Revert "CAPTCHA求めるのは2fa認証が無効になっているときだけにした" + +This reverts commit 02a43a310f6ad0cc9e9beccc26e51ab5b339e15f. + +* Revert "feat: make captcha required when signin to improve security" + +This reverts commit b21b0580058c14532ff3f4033e2a9147643bfca6. + +* fix undefined reference + +* fix: better error message + * enhance: only handle prefix of IPv6 - Refactor: use css module at components/global/loading.vue ([#8750](https://github.com/orhun/git-cliff/issues/8750)) -* refactor: use css module at components/global/loading.vue - +* refactor: use css module at components/global/loading.vue + * rename class name to "root" - Refactor: improve code quality ([#8751](https://github.com/orhun/git-cliff/issues/8751)) -* remove unnecessary if - -`Array.prototype.some` already returns a boolean so an if to return -true or false is completely unnecessary in this case. - -* perf: use count instead of find - -When using `count` instead of `findOneBy`, the data is not -unnecessarily loaded. - -* remove duplicate null check - -The variable is checked for null in the lines above and the function -returns if so. Therefore, it can not be null at this point. - -* simplify `getJsonSchema` - -Because the assigned value is `null` and the used keys are only -shallow, use of `nestedProperty.set` seems inappropriate. Because the -value is not read, the initial for loop can be replaced by a `for..in` -loop. - -Since all keys will be assigned `null`, the condition of the ternary -expression in the nested function will always be true. Therefore the -recursion case will never happen. With this the nested function can be -eliminated. - -* remove duplicate condition - -The code above already checks `dragging` and returns if it is truthy. -Checking it again later is therefore unnecessary. - -To make this more obvious the `return` is removed in favour of using -an if...else construct. - -* remove impossible "unknown" time - -The `ago` variable will always be a number and all non-negative numbers -are already covered by other cases, the negative case is handled with +* remove unnecessary if + +`Array.prototype.some` already returns a boolean so an if to return +true or false is completely unnecessary in this case. + +* perf: use count instead of find + +When using `count` instead of `findOneBy`, the data is not +unnecessarily loaded. + +* remove duplicate null check + +The variable is checked for null in the lines above and the function +returns if so. Therefore, it can not be null at this point. + +* simplify `getJsonSchema` + +Because the assigned value is `null` and the used keys are only +shallow, use of `nestedProperty.set` seems inappropriate. Because the +value is not read, the initial for loop can be replaced by a `for..in` +loop. + +Since all keys will be assigned `null`, the condition of the ternary +expression in the nested function will always be true. Therefore the +recursion case will never happen. With this the nested function can be +eliminated. + +* remove duplicate condition + +The code above already checks `dragging` and returns if it is truthy. +Checking it again later is therefore unnecessary. + +To make this more obvious the `return` is removed in favour of using +an if...else construct. + +* remove impossible "unknown" time + +The `ago` variable will always be a number and all non-negative numbers +are already covered by other cases, the negative case is handled with `future` so there is no case when `unkown` could be achieved. - Enhance(dev): ask for log snippets - Refactor: use awaitAll to reduce duplication ([#8791](https://github.com/orhun/git-cliff/issues/8791)) -* refactor: use awaitAll to reduce duplication - -* fix lint - +* refactor: use awaitAll to reduce duplication + +* fix lint + * fix typo - Enhance: improve documentation for `/users/` endpoints ([#8790](https://github.com/orhun/git-cliff/issues/8790)) -* docs: category & description for reset password - -* docs: category & description for testing - -* docs: descriptions for groups endpoints - -* docs: descriptions for drive file endpoints - -* docs: descriptions for sw endpoints - -* docs: descriptions for user list endpoints - -* docs: descriptions & result type for gallery posts - -* docs: descriptions & result type for user endpoints - +* docs: category & description for reset password + +* docs: category & description for testing + +* docs: descriptions for groups endpoints + +* docs: descriptions for drive file endpoints + +* docs: descriptions for sw endpoints + +* docs: descriptions for user list endpoints + +* docs: descriptions & result type for gallery posts + +* docs: descriptions & result type for user endpoints + * docs: add return type for stats - Refactor: follow button ([#8789](https://github.com/orhun/git-cliff/issues/8789)) -* fix: display cancelling follow request - -* remove unnecessary branch - -The executed code is the same as in the else branch so this special -condition is unnecessary. - -* remove code duplication - -Use the same callback as later for updating these variables. - -* use $ref sugar - -* remove unused import - +* fix: display cancelling follow request + +* remove unnecessary branch + +The executed code is the same as in the else branch so this special +condition is unnecessary. + +* remove code duplication + +Use the same callback as later for updating these variables. + +* use $ref sugar + +* remove unused import + Co-authored-by: blackskye-sx <saul.newman@gmail.com> - Enhance(federation): use ActivityPub defined property in favour of proprietary property. ([#8787](https://github.com/orhun/git-cliff/issues/8787)) -* add activitypub `source` property - +* add activitypub `source` property + * parse MFM from new `source` attribute - Enhance(server): モデレーターであってもレートリミットを有効に @@ -12683,29 +12694,29 @@ Co-authored-by: blackskye-sx <saul.newman@gmail.com> - Enhance: Improve player detection in URL preview ([#8849](https://github.com/orhun/git-cliff/issues/8849)) -* enhance: Improve player detection in URL preview - +* enhance: Improve player detection in URL preview + * CHANGELOG - Refactor: チャットルームをComposition API化 ([#8850](https://github.com/orhun/git-cliff/issues/8850)) -* pick form - -* pick message - -* pick room - -* fix lint - -* fix scroll? - -* fix scroll.ts - -* fix directives/sticky-container - -* update global/sticky-container.vue - -* fix, :art: - +* pick form + +* pick message + +* pick room + +* fix lint + +* fix scroll? + +* fix scroll.ts + +* fix directives/sticky-container + +* update global/sticky-container.vue + +* fix, :art: + * test.1 - Refactor(client): Refine routing ([#8846](https://github.com/orhun/git-cliff/issues/8846)) @@ -12725,45 +12736,45 @@ Co-authored-by: blackskye-sx <saul.newman@gmail.com> - Refactor: simplify ap/show with DbResolver ([#8838](https://github.com/orhun/git-cliff/issues/8838)) -Using the existing code in DbResolver we can avoid separate code for -parsing the URIs in this endpoint. - +Using the existing code in DbResolver we can avoid separate code for +parsing the URIs in this endpoint. + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor(client): use composition api - Enhance: Redisをioredisに統一してIPv6サポート ([#8869](https://github.com/orhun/git-cliff/issues/8869)) -* Use ioredis, Supports IPv6 host - -https://github.com/misskey-dev/misskey/issues/8862 - -* Fix import - -* order - -* a - -* i - -* fix - -* flushdb - -* family - -* CHANGELOG - -* redis_version - +* Use ioredis, Supports IPv6 host + +https://github.com/misskey-dev/misskey/issues/8862 + +* Fix import + +* order + +* a + +* i + +* fix + +* flushdb + +* family + +* CHANGELOG + +* redis_version + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor: remove unused import - Refactor: notification setting window composition API ([#8860](https://github.com/orhun/git-cliff/issues/8860)) -* refactor: notification setting window composition API - -* fix lint vue/require-valid-default-prop - +* refactor: notification setting window composition API + +* fix lint vue/require-valid-default-prop + * fix type - Refactor(client): extract tooltip logic of chart @@ -12777,12 +12788,12 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance(client): Enhance boot error display ([#8879](https://github.com/orhun/git-cliff/issues/8879)) -* Change boot error message - -* fix - -* :v: - +* Change boot error message + +* fix + +* :v: + * fix - Refactor: remove duplicate code ([#8895](https://github.com/orhun/git-cliff/issues/8895)) @@ -12853,63 +12864,63 @@ more accurately. - Enhance: Styled error screen ([#8946](https://github.com/orhun/git-cliff/issues/8946)) -* Styled error screen - -* Make details margin auto - -* Update boot.css - -* Replace fontawesome with tabler svg - -* Remove hr - -* Add new style to flush screen - -* Rename to `error.css` - -* Fix - -* Update base.pug - -* Finally fix! - -* Wrap details in `<code>` - -* Add style to flush - -* Fix - -* BIOS -> Repair tool - -* Fix - -* Typo - -* Adjust style - -* Adjust text - -* Flush -> Clear - -* Revert flush changes - -* Responsive - +* Styled error screen + +* Make details margin auto + +* Update boot.css + +* Replace fontawesome with tabler svg + +* Remove hr + +* Add new style to flush screen + +* Rename to `error.css` + +* Fix + +* Update base.pug + +* Finally fix! + +* Wrap details in `<code>` + +* Add style to flush + +* Fix + +* BIOS -> Repair tool + +* Fix + +* Typo + +* Adjust style + +* Adjust text + +* Flush -> Clear + +* Revert flush changes + +* Responsive + * Also hide splash - Enhance: show recipients of notes with specified visibility ([#8949](https://github.com/orhun/git-cliff/issues/8949)) -* enhance: reusable visibility component - -* rename renote tooltip component - -The tooltip that is used for renotes can be used in other cases as well. - -* add tooltip for specified recipients - -* add changelog entry - -* Update visibility.vue - +* enhance: reusable visibility component + +* rename renote tooltip component + +The tooltip that is used for renotes can be used in other cases as well. + +* add tooltip for specified recipients + +* add changelog entry + +* Update visibility.vue + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance(server): tweak identicon generation @@ -12917,14 +12928,14 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance(sw): If receiving a push notification issued more than a day, ignore it. ([#8980](https://github.com/orhun/git-cliff/issues/8980)) -* enhance(sw): ignore old push notification - -* :v: - -* 半日 - -* !== - +* enhance(sw): ignore old push notification + +* :v: + +* 半日 + +* !== + * 1日 - Enhance(client): update themes @@ -12932,22 +12943,22 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: read theme color nodeinfo ([#8977](https://github.com/orhun/git-cliff/issues/8977)) -* provide theme color in nodeinfo metadata - -* read theme color from nodeinfo - -Prefer to read the theme color from the nodeinfo since it is more +* provide theme color in nodeinfo metadata + +* read theme color from nodeinfo + +Prefer to read the theme color from the nodeinfo since it is more performant than performing selector search on a DOM. - Refactor(client): rename menu(sidebar) -> navbar - Refactor(client): remove useCssModule ([#8999](https://github.com/orhun/git-cliff/issues/8999)) -* refactor(client): remove useCssModule() - -* use MkStickyContainer - -* Revert "use MkStickyContainer" - +* refactor(client): remove useCssModule() + +* use MkStickyContainer + +* Revert "use MkStickyContainer" + This reverts commit 639746786bb7e3342db9cbd3452854fc29aacf88. - Enhance(client): RSSティッカーで表示順序をシャッフルできるように @@ -13020,26 +13031,26 @@ Fix #8817 - Test: e2eテストがCIで失敗していた問題をいくつか修正 ([#8642](https://github.com/orhun/git-cliff/issues/8642)) -* test: indexeddbをテスト毎に初期化するように - -* fix: metaが無いときにfetch-metaを同時に呼ぶと死ぬことがある問題を修正 - +* test: indexeddbをテスト毎に初期化するように + +* fix: metaが無いときにfetch-metaを同時に呼ぶと死ぬことがある問題を修正 + * test: ログイン後のクライアント側処理を待たずにリロードされてログイン出来ないことがあったのを修正 - Test: `__dirname`はESModuleでは使えないので置き換えた ([#8626](https://github.com/orhun/git-cliff/issues/8626)) - Test: Nodeのカスタムローダーを直してテストが動くように ([#8625](https://github.com/orhun/git-cliff/issues/8625)) -* test: Nodeのカスタムローダーを直してテストが動くように - -* dev: mochaを呼ぶコマンドにNODE_ENV=testを追加 - -* Update packages/backend/test/loader.js - -Co-authored-by: Johann150 <johann@qwertqwefsday.eu> - -* chore: change export style in loader.js - +* test: Nodeのカスタムローダーを直してテストが動くように + +* dev: mochaを呼ぶコマンドにNODE_ENV=testを追加 + +* Update packages/backend/test/loader.js + +Co-authored-by: Johann150 <johann@qwertqwefsday.eu> + +* chore: change export style in loader.js + Co-authored-by: Johann150 <johann@qwertqwefsday.eu> - Test diff --git a/package.json b/package.json index 10611acab6..dd251ea04e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "14.0.0-rc2b", + "version": "14.0.0-rc2c", "codename": "aqua", "repository": { "type": "git", From 41dcd109002774d1a8d938fc6b90c76789126c45 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 6 Jun 2023 12:29:45 -0700 Subject: [PATCH 045/309] fix: editing caption accuracy --- locales/en-US.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 7169367548..5368214dd0 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -2032,7 +2032,7 @@ _experiments: title: "Experiments" enablePostEditing: "Enable post editing" postEditingCaption: "Shows the option for users to edit their existing posts via\ - \ the post options menu." + \ the post options menu, and allows post edits from other instances to be recieved." enablePostImports: "Enable post imports" postImportsCaption: "Allows users to import their posts from past Calckey,\ \ Misskey, Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during\ From 441bdd621198645e88b79d71b51aea1d0a32d7bd Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 6 Jun 2023 13:02:30 -0700 Subject: [PATCH 046/309] refactor: client assets --- packages/client/assets/fedi.jpg | Bin 51388 -> 0 bytes packages/client/assets/label-red.svg | 7 +------ packages/client/assets/label.svg | 7 +------ packages/client/assets/remove.png | Bin 424 -> 0 bytes packages/client/assets/unread.svg | 7 ------- .../client/src/components/MkChatPreview.vue | 6 +----- .../pages/messaging/messaging-room.message.vue | 2 +- 7 files changed, 4 insertions(+), 25 deletions(-) delete mode 100644 packages/client/assets/fedi.jpg delete mode 100644 packages/client/assets/remove.png delete mode 100644 packages/client/assets/unread.svg diff --git a/packages/client/assets/fedi.jpg b/packages/client/assets/fedi.jpg deleted file mode 100644 index 9eecfd9630882ada30a2b34bcea2a8747a4d28db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51388 zcmbSyWmHt*_wK*|Lyn}>5W>(Q3?V~<wB*pCQqna;my{sj&>=B&r*xxqhjb%Kw~`X- zpWn^3?x%b2KI?osd!4nP_q=EAXFtz5{}%sk07%u8RFwc&SXcm+hXe3$1@Ig|2m;}Q z@Cfno@reitiNG|ZU=k8A1Jz?P8dfGYC<_zI6Ly|wPuaPIxt_2H$O#I=C8VXL+4vPy zpG&GdlaiMB&rPrhiHN`?U<fHGM1qrrQ{w+Q{&fM!@Ug%+03a3%0GkX8NQU*V55NQf zVBtPg`=5gUM_^$Cad7cK_ymMR4+)K=0BkHE5E}=Gi;IKvkRAAN9e_iIOa4Sq4v#{| z0>px(goPyJ;j_xuc2gmyenN#TQK1BckEv;B>DbsgIJvlmMMR&8!Ns2|C@LwdsH*Ae z=^Gdt8Jk#Hzp=5kvv+X!@bvQb@%0OP7as9GGAcSTDLEzeV_JGfenDYTaY<=ed0l-& zV^ecWYg<omU;n`1(D2Cg%<SC!!s62M_aB>E+dI2^`v<?y&Mz*nu7BU${s$M<1J3^$ z{~g%>fs5<`7d8$K5C`-hTv*uN4=0ce2lt5}9=V(j$O1{h0t>;XluyX3?IvIqLj0t% zL`@Msh6;aY`}H4a{|(vy9k9^<FJ%7<*#E}03?K$#Jv=-h89)Yb?x{&|aa~fWfZmKV ziDyX$ad`RC9KRU3fVyWKsf=uUnOT#{QBHIBlB{Gco^VKBN?*)JX7w9xgK&b8s=4Y_ z--_6=q_cM_b7LT<a?Aj<b;wNEABU$;zsMQGhPps-v3^z|iebJ1n1e^$gspzm2U4|n z$E&+5w52cAM8V>=RT|NBe!npOGw&){1d)xA9NV-**N5w2*KVc>D~+(Ms8;rc7~omq z{fHJ4gZ#adx^uR3CdW25DHIH_g^MxZDu>!}%XLF$G>Xh|&0`BoJ#ok@HR%td9f1j5 zw7X$ydePuV^Y7U4i&pt%SCNTsoT)PWO7bHsny?b)KO_L%OqZ$H&izG0n(yvswluVp zpZutrTAYAk7{-X?Gat&r?GMkOm-#)dt=~JP7xZUSiGEZ7QPaTY(d$XAt_7XV*Wf)m zh^lltb6ZNh?RChz0AfLHiMwB~-ZqotE`zD7K@I`Uh=v~dtr~#)IHYn)gU(CT@dwfV zR@;}RdJ9_TiFT?;1^}?iax4^XY}ibDS>no(jRoIANdLkoF2UK>T>soLpNQO2<x}Zg zBBf8m?hYIme|FYO^#<f3FpAlonNDD`d8_Z-%k<3E&khFz)<pJOS;X3sG~j51EY?%G za8SINz!c_iixe3XJMd9yZtWhWyT+D30&8Uv8;kjw_9GMVGB}W-3`jNuxkXP~?+S;0 zM~KCZ#97w7^|t;Qh+k;0Dw`?WJ%L=k{F^+LVJ<cZ^*2sPekR`=W=Ik`Owv-Hwz{g( z(m|HDnznzr$q`+7Hq6a3%qoC(R)k`RcjNkIbfU$W6E4JrjjBkaXnnE4CAk&U%K^8} zhs$Qcb;UqV_%ibAETWBeDNiYeV5H0`Ub><5le?Hfyo=T7&?4|a!ypw}D^<6+T8Q#> zuZy1`*B<Hxgrvxro$EKHT7_WT2Zd_~J0tli0h*>_`_swRZzYj0s>4Y2#@LdDYIs?( zUSM@G;EIY}x2T8nB2&eHhX|4pTCzn}E4N7y(?nM2mW4YapMB#scgyj7NcbN7vWUa2 zT!o*$MtZ;dkNrDaAbhY<0^+$l9V#)GC<c|5vwCvw4WMwvF+b0+64j)ZP+kL-QYKsN z%K{D&A;Ba{__Q>j^~x@aarq6()Ar~Vo?0PgjoIppJKyliQ(8A5?g`Ixg*j&@*YLS% zyky7`!mIWgUfzZ=AmbMv4HNg}HcROSby`~Qv@zsEmzIBzzHVG#Be;59FTQCNcGtvk z8zlbYr5c9Jpnof&o)tG$=pGD{d8F2mVfiYQceSzwbaW08{0H#3u5?i4BUIawBM2Yx z_MTL0ECwuRwb0TgAa7>anljcAbpumvmxd<oxu)rj?IPX7>Hhu;l1;7l4*G3uuGKJ~ zb0hQXora)#*DB$y&*V}a)P!Enu3y4t{s9*BJ?%{ROb&Ve0r)Z>Ug0OPe~+p<Sd9JO znbk0btGUWw%uy|>eE&e!y+slBkY2`jT$J-pUiM%u++HN53G?NbVEl_`b}TN2e>PY4 z^>^ESXL&8GqWoBpFG&}^3#MkGSBOEb<YJr9fP#Am_=}T2J17Y<v~C!P6UxN$(+dC= zx<6R9H$>Q1l?LapG1*)CF%@|z8Vw)VV*4Q&g|ZuYtrZ63SWaU?^m*dH<uGL_p!$+l z=ZarYZfnwC6enl`u9%9%`hLg=RBK~w*Rz7nsT^qDT2o*rV5}1suS;<a+UGc8S&3l` zt+W?IWmzgSF<WB&<4bgOgIAs@hea{pv$3wNEkb=RDo>kwHk5aiM7KhHCYzAP2$H@N zepN||eGLm}R7-A;1&W$xLK7^*G}3V$^HITzSJ*FOUlPHTDC@A+K9Ftx(RcM7{{S$1 z>8jcqo1V29X<}g59^@@i4PwqNS#B;uqq9o#V$>znehE)`GirjW9PPFDt;cS|dwF%r zdP>&guLfzZcj|QJ(!G;vvb`>W%UQwN$NSlr%gYXfY#-<_^DqsjMRI+#5|98N+Wa=F z{4-(j-~xkhVZ>9BpOcO9NiCtW_nrR$S^P??Ryk(VVUQ>>UbSkF1tPccalLO9b50ze z9!bf9u(8%QExqN?9r$Y(hUrzOvPm5Isu}h($=J14==@5$C+k{lGABFcz|s<3_)MP0 zBlq#z0Lte_r91!tpKKKTmGk!E$Lg(K)0Cpf2ye9ki`%qSi0WQM^e4*bP$eb&zHm!1 zsORo4rYz=3ht*#YgH-;e4A0*kO#>)5uj~##gGXXO5mIkMVTXQnkMqQ~JC~F{)}Nr; zIqY3fSii(Br<T~Hup+&*Tcy5|riA_x%i6ogu#b0dW}Zhb7SFAv9?8(f7!|sRTFYRS zlXlGJk}(n?v#Di1?Q5^+n`3cm!tg+^lC#=$Q)pKlxGep#GT;E)PK~VLmNa32hH8ij znY}%GI^TYKlraq!fooQ0R~4_uNK>|Ki&i7ZPL4hlA}X;dbzmK`O+M}#9?OUt!vabM zYE4(frj?M@YzVku4dwT(zCHex!hzXJ`gVV=vThwrT0kgx7PqU>txW*Re&1*|V-vf) z&7Mh5x%CNdv5%f!GE>xb+Q_d<VM7t<YQsqX0R*<PgAMI}Fp=74WTCZ}O^LkmVT)bT ztB?ie5xMQR@93gY$thcvW{H}^tCnRe?H~rM;|v3BFcywqw6@#ZQ^w?yeG^h<0OKP{ zM!bh6EKW66-ttQ87v#}E7R&b4eE|q3HpfIA?>SD=myeWAC;ptn6@K<-)xA_}!6>0_ zMvNYf9ft)ZeOYDw9eQr>@oI++-(TC*fblh<V?=j7d}Y@)K?VBLK03shA^45t@!G;Y z*BP<k?F@9_?W^CrG=q)o(dv%e;l!WLgUAyu_kRb8Hx@Zk`w1WORd<aQslHk3rqW|L zqTI}emoyM&TYelZ>(bw1dSx%%mYh~M$v5&QxW_hslUDl6Ym?v#AzVNz2MsVI{T~1| zNoh#GDFzLeb#k9M)W&;KR~QP%@yY|PYDd=ProYq<Hf2B_>!h&m05<0nqJ(pgooaBv zUYK*)zHS`7sRydU5ohwj`;Mg~3Y7e2y#wMrIp%YCQAQI-KR{VW1%?&Ib%-NxXMYY2 zTM6O>Zf~GxdHZs=Fv#Hwfv(e%F-jN9(cq5R+Wc~rBb|VrTx;TNYAO3`!}=HGrjj9> zVNV3V269yqJ)w^e4s>Au9t&c;I0{D=08>E;gAUrNl79pD^-+E<gAQ$N{(rJ;U`p#Y znnI~Gm&LgL$R_9Rk*AUywp5FD*<4A=^%+CPWxQeOq}c99pd$DAHv5#i!CQmE$E<I6 zocoB~jkQwtM&e*|RQw#i)x=+ISTxm+0dakV(a)i2<n4l!ek-P&v0eR2O77X1>k{cq zV!OJr5i3h2AW0Wu*OaoX9?XMMAxqRMDKbe?Z+1Ibcx%e*-!ugGI>EIweqrzIMU3?Q z4dM5lbcp>ipvtbC#VD4Oc=z^LS*F7&x6(r0wy{Nm;Q3M#`fe7bd5S&AF8YM`3+FJ$ zx2jj*)K9y<_HMZe5fjU~uiae%*kIX<s)QsiA;^r|7(q9)r-*aDV-x_!@?De291Jg2 zN1pbi4wn4`$e7frKx`9zi*)|RJ-K<r95A@U;HN(tZuE<e6)X7dTNS8#T$O<x_Q0o3 zRZFF*Ipm?NSt&}>2NK9-lnRM;uxGJrO9VbDR#dK!C2?bT4i-emi^o-Q4>L#QgL|Ga z*M)VnmYfS$mQ&m7w!<fa)M|0KwNG?0ZgRPVnes^~Lo5kj%em{UB*Rvtr$lQTLe$&! zVvWi+Hj51G9+jxQC$C0GB-9b;#?J9ICL1=FVXqeA_oj15=s~Rib`YvkCe19TU-`OK z>V-QU+iXBQw`Lc;nLQS_u)z{D$c%*e*p@BZuncu`tbPf67eUQIcTHe6*BB7bQuFAi zl!F>u>W>!}%}quY&&gA8DY;zSQ>DgrSCWD|rkmW=h*<G(9yYsvq0Qn<D**yu3cpZ< zH+H(|+HzuW#|AzwXjFg)fcSfs*RmSY(uy&*6at(%BzKG8b!J)ZzIz}w0f9&RvT0%2 z+;VinP6M(KQtZvrT@LBhw;s`098j=OoC*H$1Xu7j9yYr{OtdsW41V2xz)fwbDtSEI zFNV=`P8x=nC8&nhg_~;&S_EtTJf989zQBrD3ma5Njx$pgf%9l)N*dFR$bYB=)a3H) zVt!$)B*B-DxhM;``<r<hVq(HgY2c@WGDXI8rdeE<kE8)*%yA>IM*>^6PXf7XdYi>? zvW<4*{9N#4c>{m%Yfm}!il&;E!?Xb4i?ceD5m=G6+4f6u#w-$X$W6Ikyc`YlM)c}@ zL;DMV`WFqe;oEZ~)agQr?>Wj&9Q{1Z^0(SZmnLy19a0G%Q}cc;%q=sMc7q9KKhl|x zK<B}`SRpn^TW2jKUnDWVq9^8YNP-0@Em}cvmP`zGk&^rDB_-!7@=$GQ^*J%*e1OZy zn~}*~NCoIZbJ2ZS?A%X+zAuppmy#1>ya>iNpDmUu0VaaQw%&St6*M?<`P=VF)uRlF zp|`aTLp9GD)JD5%TeG^Mwqt+z!b<>oL%b@q-8u_1RT|tcJfY2u25aMqWN&qH)X*RC zS*^~>pilE;{+74O6+#CvwZmH(x?hQPd&mXw+_gfN?YE77$e*m@0;`mIYss-NO+Nc^ zuV$-tq6T~~r4D?ZcA~}B@;!|4^qQ5ryZhybHqqo17v-y_WJjP*F(qV3Y@of0wkaS- z%K<K_V@`t|DxUL->*Z2gEwh`@qV83=jF@l*g^G&e)9_U<^oEXGjgo4tR&H^yhBOSv z^|y9OF^R)^WWscNi-IM-TzJ<$LfM^Hpus+vCRB4>jzPd*SHI3^I|RrI6c(AS3?YIL zUyGnKou(MTDHU=7Ju`;&cY5k#3CgDwd;Vxc&s-nI0iIIVDz<Ygk`|YP#-85}GkR%% z3XX%U8nilvV?uuWEfm?k<(rY7VhHaXHIw#Ar~e(-h|>B|x40G{ZR66o5d-JQxV_Sa zy!jB{kz^)XR?XJd*c9h@CFZNkFXQtMp!+JR%BMslTh+;?-O(6}o9$Kb-9qN?h*ACK zc!{;Z^7-e<SztrPzbSfi+csP>Uc2Ho<J_tO25;0|UDYqfxy=b1QEUzAxzs!YG&cos z-QP3h&pw`P$Cdb<qD@w}lVr<_RId)B8Ma9&!Ct#!Yk#;`9fgdBG7TM2K3neV<qe4N z)n13&?1*N=+H`GVj8&5E@wuFrH9}LAv-=)bt)8u|MM2q~0;layFJ{~K@btu??eU`r zVs$$$EAb>jTlqbR7U%r3D0|+~F$}lQnKIgKWD_UQzM8P<5stQTVc<kx(ri*jMWjpa zsCiPKm)gy8qSDO+eXFui>Hg^k0zka0q~6G@l-BtsgnE6(2c4G}Xteu3>xktL9a$kx z+mue(+~j_0Z*wKFr^xxb_2vAtcwe$1pgAW8lH-fqp*r(mic_3+puL{JD6`B{XvlN{ zN_A`Ny4t#pJ`pd(xfgrgC#X%2a^)|)6s9^ZhRZYD%~bUQO7m`<l#dkE9=V^LegwuU zpTerL{5nae45>EaT(y2#AT{_Z`?3@C-V@FXO?PH{gJWL4#e_WI$(pXl)U6B+v3y`t z%N_m)kiOg#4~pGs_-Z|qR~M6X66_0QY#sEwbeqPM@$pZJH&_-==u56}L4(ym8KNqA zHTXkf9EZ^rSzBOSyXEDkPo+1aBN3`C`YEBu(yc#o+v^`E`r=+|RvIV*%t?K^Cq?$; zhgZr*z9DFSmiypjzi+9CS20f|`rx0HRBieMSreNkb<o&G@WyDA+lAT1D){qGB@|0{ zjB}gps^i1ZZZ6|J-CUvd;zvyg?<s6tD0RKam-a;KZR5+43K(zu+}m9o&(mYIP4{d( z4TZ(s=zu0VZ#sYLU6#U#U&pDkwFOa>B@?ZKEf>Pyc%6yM`^Z97PM?>DYtxt~C8-`E zo_IkYcs1t+SPI2u8WQsLvdnpkE!{xbXf6^r@_XQcW%bCzG=^L(s#)>5NhUqqCawms zVlFst^cBB7N~;|Y4@yZfJte-rgy<k4ZezocP<@0faw=TFnOp#&w!1yF6^$}@0-&`( zL}9^`o(@P!m?L<D+RlldnmJF(ye{HC>t(jg<Ii`J9rW^pSjBR3#eVtQhAQpe*VKts zHfbkwQ)D>s|5DG}?o1rRNSzKK!MM*fx$BhwQtLZfNkU&7s~a-lII;|xywRwLr-!>* zXoVLTZ`wu`D!S-;!K8%r2Tc-b)lmfzZ@9ZoUKQ-C^;li`F33wAgsfCF6XoctTYE|v zSpg-pKmRCfjW<)X*0&fisvYKN<v3KS_zWvWn+5cpYyv+~eyw(p%M+PMVEfq;uJF2R z{Ji<AK8@sHRQ~SKLH9OyW^`=&9|u@9EU$aho8&mdUKM+{*6e3*F;drdF8q$<&C4yN z7XVGL1Of|VZcADItOkg_&F1dUYJWMBI(2O5HL&AED2iPX_yZYN#0m6TZCY;~bm%NK z(y)*)(O{`p_=Yrf+bv^?FBjw8s9kBf9HeYEe9rr_s9asK@DtR`ylvy|mw|Jvweicj z4`m~tZ~`4L@i(fiX=Lp{Vi@vx_N_i!IuHC7qPHTa5*h#!gBRl)$B&2}8vwS@TX%1% zSeq6`66rZg9Kz4yLfxCc{*u#qBIBbMjy<+*jZ67wdy{pM(H@Pxi^3$FoyVQ`i&IdK zSr7O8e4yI1kEN;u77^6?+UdRA!J2`A4qPlelR5`nRR~3v{69OZnxdQA{hGZzH3dlv z866g;kzc%sU;cc%e>|U&il8MNQ7}g6CG;|OS<M#>6-Fz}ekHDz++<9aR7cAp@I`D` zb{6H!1?b_+LO0VbM^Gd>R2II8_o<)0zsO8LH|s!d(A6ZC9$q9t$gp%#<uSAK;d!fp z0r5-ZMddbB&vMLhTxnA~nlfFNw0dr_<wtoWP3UhZKMdJb(K9utm)1o)_^M&b78<Jz zc;we;-M})j#Y0|Ro~JxSY%Di)Re`R}#TJldwngqr?ayDW(2ET=zJ6RLiamJluh+_w zY|7Hy{edm?e1^eci`F81Pa->o*Pv<sS87(2n?QL<+(6mOu}uI;SzIz0*S7uZ^lE#m zb*h+PQfE8HjT>Nc2^|~xY_f&7DS1IfuHocy!>A>o(SkF$HW+X>D`>_;@GQdCdbveP z=5{fEo@kXN%XtU93x$LOg2Y$mF5BDJ*r_tcpuiB8*!PED=K-}Hc4Ivpi<MX|y&^V$ zPZ6X<kKoyBn))hT_od0Y_Q^%i^mMn6WUfnJT)w_0LIY=Hiu5BZWF~x=s!Y<%RG$dF z2$jY4vj$`I*eMzy(MvS7bfRR~+M80yK@oDLrFF^_#D5mfC&fa)+bC)`DO5RVK3=Xh z<d2m7sse&SqT@YQ+Ac6yhA_BnU|JJT<#z5LpuRb?(ds7cXMs$LB2-NJ&z`!I2!pgy z(dwR8(sk$FjBvx3_7|33)aH^CBT|Pb4FlXTR(_hm0XXQKDoeD4H6XHfkopY}yCcV8 zdGRtZS_?IiS7@}~EUiBFQG(#lS?x_{+cXh9$kMW*!yHfT6SKcZd5%M$LM8r^lgs2q zh2N{fk&O;?AtRn!!95S{g#Al;B~m}4He&n*4Si7YhN?`g92JYb*PX&7g}l&+C~c5r zESJq3zjZ>gq^aCZmha&2Is58)WoetUEZ|jTirR-V%@k2(WZnv`sK_c1NN7dNcj9|! zd>awICHp2qOH@S63QZ;bqcJaZaWsJ$)#p`Zx&n7PdXvghsFI7VBnLV))a<~_8fU2q zqUj~~gj0{!jhBtpvLzTv<hvh>FxSQ>wW|FDIWbK%y<(+w=L(020qTLtyQP0$$GmyL zBuRMTt0lelJYm3IQ$_Nv@J0)c-&9y^aw}*|$Xsj}b5Wck#qC@atHGV`8w`KqJ`9x9 zFHJxJKF>kRNL|;21iH3ALN+t%1sQ!(If=R5hH{f;K5Mn)Z+~w|7B={S)x}+@vL_Wp z@p~FctNvJ4K2d0aG8*ef3n+>4C`lF;hb1zoaDWmH6+<^ggZsFKCP6ggTvSlGW()8$ zV!dm@&XmdIeWr9G^NkbYpoH?Kk7Tm3_U*pAMMhrsTlO^7C!d37t^EzWI4v|cPMAiL zAm<1V90Z&gMap?WTWXj0`8Cc75GZ+FXuyN9N(k#$IjS7Abkao=?^2E-Y6#E}LLcHj zE^~oLy3q+61g?~yot$2?TIQr94|SYzY^N*qu#!TB7OL23hs8Krg^xCNONzN*$Yu_} zFV*0%JQ^kwbwtPtgM;2{eg)3w*)0RU7yUfMQHGsHh+pNYW@R}1-v__zl)agdh)&6W z<I0Ok5o3nLbww8jn}eXSvzG>Iq4<MNh{!X|ugVPjR&tmcu?lVfsCtvZS1q+O{7z3) z?kmu)tGP*Ghs*VA9bI2Iv6MgzK?5099@@q#BtuZoJlU!u4rtQjzIWeSu#k(8nGZFD zD<ROgEWrg{-#QakqCFz_W2TaiXCSd8%FH)u3ow4*H7#V;NlBC2hZ&Z5RB0K9r=&kI zh0(jM^z&OwD3<($heurS&>Xdr4TT2Ti+S#f?J(w?>jZ#ZDZr%gpdv!F=>+~G^_kI{ zSt<@B^gWJVqq#a-!s4SFAQmM)Q<ct&5yEhSegoZO#e}<4&4q%sbhXS`1D;I)n8~`N ze-!4v()k=(*w~!7^P2maB9!91MW<_0w;v{8Y($)NtaVoKAw4ta<mv0bjiyWF%?vo+ z)IyZ##4&+EF`8@X6pu^>e#9HSjur+oQ$dc+_4=KTM1`|i{LQ}y{{Yzz?WD3@@Y6|? z;fmC(56x{=>$!5-W~JY)UQsF6RQzS+!z;5wu|03w;FA3&us<OMuT-R^9lAAW%5gEz z9ynwre-YOq6tC=3P+Bt7syJRcZuxz8o<H_z$7XO>F{078qyh>9QsiVmqcteCjeb$3 zw4ofcveqg#K_Kau5r$*K{xI#?q9NDiItDeOr|#C73@=EWdPcn90!epG(go9b0%mL@ z{gSSo;tXBHfk-{pNCDnQYi0?*e^hsus<V));nZYDu6<5HYD$o=P5c8W&Id^0B}jTN zW_!wYUWHxIc8$B;j{07++bxdMiWwNt0A~QideinH&Nx$=?Kbi~Qe7?Gd&;v00fxFJ z$}CDN0dvb64|>_HM^$b?g~D)Wx=sj#9Fqx(N6485Vw)7pWfVaxNp{??-`d&OtnM43 zDs-)fjQjKtU=pP!Xy}wy!bfJsd{JJ1K-!%`()kD1X6@D3$#8r{cC`ELoQ=8BF%EbM z-jCGl|E9v=)@!;c%I{j(K4Y=kSE%lmm7M)$NZ;s^AaVUgKt#+CRA5p|Eq36|P1V+2 zqK9-uCa)3~A=%7jwfK~-n(OOx(eV6L*-4h0P*K6c4sot7R`}qI$dg8YcSt>HxqK5< z#E(Zv?RUJ$SO<eh7%{N@OEFK@o~b>V2D#E`oqiJPMC|zZvUqd*L1dXVd9(HP1(Fgx zr2tCXa4T3(U0z(R;6<M02&t$Jh|&D9FXPDfrtmYXFEJUYwvJg=Tzp2}((BE5*_7C8 zSNbz0tuEk@#jSA5>L1{fafJsTrE#db@v6S+z>$>*67K>}<Tx9C@A$3ztUTajyJ@zD zy}Q~L_m&{@Mvk9ft$V~M)2oZ?SkCXbQLtKE`FN#u_nhZCT+BP|(}LEcOq0L$qE)UL zvtmR|qc}3h5}M&aj8zF0i+Nb~7qtc}76K5wpRYq_==Hd<+B-{P$DB-v?aF)>cfxW$ zo`S*RSYE_T*uruWH?N(du`I2t`qS5%Qe1UeLtuS3WDPK<N)?hQ$D&GEWUbq+J94*E z@CJH5Up(-UW#W6-N(q(y(VOOIIER6p_(|jytJvh8L(?>#o9~{3(aPPDxdc#`fo5^7 zB=*4vBeDNb`iVD{C>=+B=}{s%^NU1Zoay}xr)Bgfs+JEZR#9v7R+?)myCehl9WTN4 zVlqMWP#@=UcGX3p=c3vrOE@hnFKE69X8eS#=^LL>z!%X?OpXip;*87VuGhjrd)p&; z*Zm0HFoS|N4`?1M97{YTA-dC#w)X0buj9!W>FCEHev}eO-8OG>Uq|3wW%vh|uBDIx z|J}>NWq)um#gNSIz6PtXks&L<dIuw*+_EoUIyvShxIpzZeqANr%HFvk0rN-vx;Uh^ zsv*zvZQwT#FxS!7%r|nh#?Q&kno!ayd;^)Dj;@sF@<U13Rve$X0k7==KiBLG{PB9V zH*TlB3xPYpA`^+JujLBGLN#Y#t+L_W!|BYg3T`w%609>=p}x%3$ee)$6ahDKJ;4Ww zF~5z@77pPj><Is{yCWAGB%TTsYPsKN26YOAv@^Ttvt~6)+PBQGMHa-XxVoXZ1leUr zF)72er--FLX9D7k_5-jfi4A1zhTg4{yl)dMAt9#Amg<pZv!Zd_5Cu`NDh^h*KZX7% zu97ZYqKZT;N~XxO?zgnhMPEls@CWF&UaHdtO*QK8@(cJnoNrk=mjG*A!Isu82L6U& z<XU${W$5d2WEYx;%TmtC%KNh45b+C(1>-XGz4bz7BBoWO$hVL$H4}F%v7+O?R2gJ< z+Tu4Sni|fh-mz1uN>#VgH#Pa$U@|QeS)UC*)$iKf0qx6zWYkh&W+P-*g8E4jfQ@GX zR%aDnChz8l5{But2%Egb{sGv_A0>n3CMCTp9)Eup;R29y*WnQsYl?YR`*$IE(ypuC zI?d>q=Sa$7Agid&g`#?%A+o!w)U}~iII^I***Xgj3%R}1ySjeC9p0kRTOT&=Hd2__ z82elI!)zID$;V08BKtJink27BtYSNrnRuQsS?|6<W?-UpqYIzZL=L;&Sx;+`!O_09 zDg=}I^Cr&}Krz8d)_WDiE#bbC`u+CTe)PA$!!~TII6C(l+N!*db1Q-FA=fLn2EQr- z(Qh;dVEg%O=lnS%nxpqhnQRO9_06yOBobz46F+7RySMDZrAo8cY1D4qdDFGEaLjKF zM#pwtYah>X8?PqKS7_j;hYq$gz#MD`ra>lhbk&d2G3XpuhsHem^lQ;LXNkTop{Md_ z{K<t*aT2NZ$1Q+&=$OIPJN+dAW%UO)U`+2?I{7B^xsGb4$+M3v?^?XhU_!0PKMw2d z&Neie)Wd^(&3tAXt(Hq`(H__2=_plVo(#Rh-EsF~5kyS1uJKXIYx@Am_XwfOom6Lj zBfh_1#|h+>iI}0*wnfIiV+G{4-c@Fy>(h>`<bB5;<7X{0{L(2?6F(XSks5mzO3{l5 zmECF~wULm|>UTLND|8@Gz+#YW>rSLF0-qX8=><%5c*T<S$xV-=5uNhq2kF7sy?N5g zbQ5ofczyn;s3pMT<lA=>H`8Sk+%rquyL!(uGa<~#is5>T!)EH#*MpLGheG4(XY6lL zg|W)+&(*F8i2|h?zp9ojt@T*(Qn#4nDO$a>uU~A-wSWfdH*JbwtkXNbbKa6x%ib+r zQt_V4Ph{&U2`>ZjoVGTTRytXf0QUIbm5_(p@I<+mT%sI@#xn3;_TvGQXHFjb=-ELl zaRSzjO%C|x0+k6dzk57#Fo3RMoXc)Btc4$j2b0qJG@q}-4fEo7F>InTrNbgv-CbiP z_8{4=7)Mq1cb=WdyJ-bk8KoxlQKdDHqj6c<=oy~4<m+n-_-=Vsi(hG|c50?c3`|<F z8aFh=jtY((K_&75#Qr<2QGCX6fDPiLSj>WBpd(*jt(;9le%`X=_FZ50oUXyo@wqmF zbwNt!Rm?;0S$OrCuB0I*dpFbMBTw7nwyU#MQ|p@u&lY_E2pBeK?$Fky^(v)|SB`+t zn_@2VP)C)H9b3>TBvDDgKl(@qPR}!GCDNb@jcT+8lnrgsRg9oY5(ONUwqF@dBcjXk zx*Kk-?j1@#jz44U>5MdxyetwV?e?=>h_1b+O~!?9vgV8wc*1w9I2f>RQ!<OEHF1?w z2@N@Lw&F~(78n#+$rty7C5R1_!bpR`%1)0Ql$kF#W9Rq@A!HL0aSm2brQA<dtc@l) zs?=Q|UGc}VrK%viN$KJwi+xPAoBD1vMN^mJc1mQsl3Fw28i1Ad_SgLZOQUtQ5)7#l z)!OtE#8E9_;FMpZyV59Ov(0OUT)Y%{qRt;^|EV?BC^1k&WdKWQCe8s>wz*!!lh(B? z#}K%`sDMN4u@fKbw^I#MN~r5>uNaPq`e2T`+XSD4-02~>_|7?B7P#nnvP4AJ0;pJP zZ23z`nZCaY4Gov&fS_aT^^NN&DMB)EKsNnd67S8jxvg9U!d>WKtX|yowXCIo6qUS4 z+x5zT+3rc22VfYe$VAqIk!e=gl+#6~;V9!oNnHtO{<PCteH1#*Ym5&zWH6l0m0Q@? zBno?}>7rAMZ5907I=f)HC^#R^A0C1bpl4_))Sq-{B{uj6uu0fTDagV<OEEn4OLQOL zhU22jJxl6cEKPY;x3U||r;i`}gu-xSdJl$NXcl}aQ18`vr((VG#f2zlO$g(s%TJu` z?ppu`;|~aG$Ww-~Y-{>&Hsi$)DhiYFMi^x%v0ht?Vq;<pAZTmLJf)~=$zcjI5N^tY zX)UM9(=bgkd7LQzs3(6Jg$$K)q^-+`Lzg&x&I%!)q_|z{1>z=>2<Sb!CxXD8<pBAM zt=kOwu{BkZ$K2bc)@x}$mc!fXNo7pR2Qe9b<OR&}%0;|AqGW0BGSe7V-UnP=Zc=Gk z<0$MTi4C#-%KbH6^6lzfZwY6Ju4S<J_2ua}GrcQE68GqKWr&J|*&D6evZF%wzvMEz zxn1`TpqNcP;uhj(V86?f<@k?eVy>A!n^cBh<<}yp-Cbx{l!or@+m}|{MSlPe{9@Az z({^lSj_Hih4%OD^CMC*<fk&Ud_!Y7~SD68qz@uzpSty(K>471K+HH}m)$U>FS^O>U z((PIEcT|>@U64m6a}$Cwi-{;N#YT&B8`(6Rt$zUSh-;%@{(1Tpi20ceU0=&ATMjeB zhdpjkN}<YJZR7wo0K9d6IN#!6`6YotySKu>@0xl>tIN4;k4t*S#p55~N!2h$T4AM) zU)<_&Jrg3R7X3Id@xDI{%?}vrKG9;Oxw!lxj2>Fie<A8`NLhFw<t@R|nRxA?9*6ea z$xcvZ$0iw+!nHHqCsq;4%DuvC<oj-vT&eOPr1}}^O9~fNHo!Sv2`-Lk@b*$?d8k#x z0H-?ac?=UQZ9_yoGPxCWm)}^H2v!zoCqPA(`m@O58_R|ROH4_HI1eA}#ppXl9u|0) zrxZ`gFHku1l(R+R^u}5`HA!>+A7sYHMMH*TV=SD(u)_RD<3yRim7jrXCef6Zq#=V7 zADqoFL+3?)y}E7{=e}c|m7`yzReYLWuv%>wYw3@S>7KeF<{shT_(<?qEsG@MYif#h z)y@)MB8HCIdmdTiL8LvI(lCH{6LL+ZS2kd%XV|%8dHAgGz1{Tw&voD1{Q3v)J0E>& z@s-g}Z`Z)MC}^!*E@^u}CYWOJA0WnBi&Sao<%gtjzC`H;etj&Q1%_wb`hn#xn|=cW zca3GWH~N34zDU%c9S@dNJ5--2o6Yg~=RDnVI+iJVxw>xSGqf4cvtRSObUtQ&S0X&> zytU5lZA#EF;S4nO>z^Elkh3Nfa(H*Xw5!zUrg}&~<q1l4kl~MmYdVuT)N0l$<EYJs zT(MJretBJ%x$QheTT{CX)WT9KMuR1{`Kid*r`qO`+bA@cDSc8hM^}fpu8S=Ox?IN( zu{tH*z18u50@X(m>`yuwWGAp^g7awSSnQp<wzcC;*Xw<rhN>|33X_j488B}`7-utf zG^lIYORnHgi$v9iU0aeFR2a%T+dE)|2}45%C>l>)HG0ReSY^rCq!E|uS2hYt?iiME zoeN+QzbQ*K@c422R7wFqp%^P|H;8GZ#D3j5LfQ6-C^5zyE96GMigEnpgg&sc8QF(E zio8P(n*G(sS1^iNZJiL^%-Kd{xbzM0qu^ESQC8=aae~jEO34+T?S?Cl?BT;X^6(0k z2)i&%5(dQ;71BkH_Bhi#zN!r@%AtiGyPqAP%l0@<GceJo$(8ik?vodVi09Za{5{1- zkOcLqy7&VX))tn?Y>{~3Xtj{6&n4fM8`M){B%FnGqGug+dhd!{FVR@E_YT62J_WAQ zPk4sjyG-llP3jJcJiS`$wI{L;>2tV2f%U?^S~cpVYMh4KaKcERSzxBsw0^Ly<o0x6 z;stM~^SI?0{G#ol$om6Dr{E8<@F7UX*U<5~?YWiH)|9o#gE<J7<XC)9<*wJZHhl7i z@-)5&Ca`fisiUFqW9CW>hT$P+ky^#?R;_EusI#Z}e{8GS?%e+2`UNdsH^%XwlQpmu zYUYUcT<dFgiI8noAQUZyJStM4s$GaSxnvlMylL6eZ)icDiC18SgcdM^m+l?f@i;IT zk201ar>#(|ebw0Q!>Gio%Qe<mDk<!rom{EibQ(GQW2kDsoZfXzEIV15!N?O@zQOI~ z!shqR6|2yMiUI)TpUs5?<K>Yamy=x`*Nr=S5ARlrWE=V>Z^oY1WFC9eFk!C#WI)p8 zeW__h0Z~cD7Ddvzo+^*(lXGdSuye-7WDDpwq1M8Z#~-<Cp|?Bv^F3?TFW7w_j1FV( zAkiLVV(a(%Zx>~2M%4fu;%tzJ@eHll(6~c>YG2v2R#TTp>WB^J)9l$ZX{$lT<Sq4_ z_TT!j6L|{0U|3+;Ss{4HYBe{cqxn;SWl_dbu5)E27#PqCA<ICMEDaAbrX(5i3Fr~N z4+({#9PAi{Lv?nXpN7=at_mHl6g{sgzaM&Q(JlOe)<$PK<^7oBk_L7zqU!gv2bH4n zsM^w4G`{~)r+ZD|H8>%6RhbY_9WgQTO#|EX#+^fl5EVqXQ$aPmR|F4;ZB`_l=8<P& zm^k67Fl;{4RJ&WqQT|k!07d3S$!!5=y{c3iA^T?nE<nQbA~hX<h67~cYG=hplbPVF zK1QCj_C)4?0G6DIYSEf0a>^6kIn%sS>ob?pLZ-d*x^w#2f|cpU5)i}Kfu5Fvt?PT* zVJ6-6TwC;RB67Z<HNw%Gi}_8zKJSarK8!iau}Q$RAZq+*w4cJE!O19LXizOwuHh#N zi6NY6oO7zIQjMT~1}YH5dHQ=^&w>A>r{M#c<y)_P#SaQkdBOpqxU!Q;hNmtz@l}PD z=qDpw+JflYS>0v6_WY0XV?Y;@gfMwKFKeDujX!PfYVYuNp;K97nt<Ws=}J>s7yieB zvl!dyh-pJB)zuhFAr-)|jZBuul>lE>Ihy3p1UDz2MIG^w0{Y8fEQ!*zWC2Ic7SBNc z58ppSM}B&osJm(2abJin;PN!KVf>d$D~@HkO2Tn3<XlHWm^t`8&5+2p@wEiG;-rZD z4;CRcJz@WBi*^}rNXBrW{vcti^uxz^XKG5D=lZ3u-4-W87t6QM6f2T*Q6K-%DD~zI ztr=_ZHt9Zw!Iu}EcN&j9X<S2Y0D}^K(TC1OV<xJ5R<Gq{wLv3F0$Gz)x}q?l9Dec@ z<zJZ1pH+963ckkiZc4JCyz&oME8gd%Jh@WHTe_CnwyzU<=u)V^NETbO>ht2&<L_W) z>Gc$Ym;2oH<j;xAlLkmU2}BC}8WMO>*)+CQ2A$L70{rIsoSG^!)72tWM`J}w25np` zmGT-nVl)pXtm<h(PEXq%p3yP6AZD}CovfG6oq6)pd}Vj#-;3gb8;MVTy<{5WcJ`W6 ztLwz`*Xu4lT?s9~c;wf)EWcCj&&>+V!`QJO&YCwI>Aq=aJBBdIf4Y-z=pBXn@IO!J zI&!en%X+N0ujHs3(;2EDkshUc;Ct_oIzEWqb|bvU5l=u(b9nAq=u9_keFMhdL-8!c zigP*mPInD=(hg0!STGCXBn(|#iD2<Sg2TaB6EvQTzpH-)vafq!2d%|-s1@Wm>|DO& zHdS3#MEfdi(-J&!ERJQT5?$S?ipY|A&Y(BSj1RDJ!utBCZ+6~hiG$B0cDP}KpJ39Z zvtGs0Zk3@U)=k;uv1CZf{{BmlAVS4xV0zmt3~ie;l1nrxslOc|YI9BmmVQ|vd3UF4 zvKG3TRe~{qDV3!daS>u~gbYuh>_yKH4Fb@is@;c^e(?%*mB>LFV>~(d-Fiyq*Q$}> zmg=#r;9V-44O79mqgqu)vgfW&iEBffMM5KhUrC1vTFk`G&_9a!Z>$)>_^hA|-)8yh z7tU^|RvH|41dO~37d|0~STXfoz(>n6oFD5-u%YrZy?9oZRwq<K@sa?$1nsn?#kHvv zQKV(pRdZQZt=coZ(ndEraywOWJ{cSS^eL|!iUZOCckAC`P`vUx^(GA9u<bTKO!jo} zY~7lwB$@o;%44r!DNPMkZ|aXc{DNWAxqo;ntS~OmYQVbybH;|X4!!r3PmvhleAyE- zbM#|vGfoa1%&$}R1W}cdY8qfnZ{Bs8v70ZAbh47#kZ3$OC=z(TXGie_yKpdXT*{pH z_u(mmoA|r3<|Q(WA`u@UUr8EFANuI+KfrWx^jdG3-8J!r)PYK9oVy9R*)S|G)pFg4 zF!%}>^3tui4Rc<4OWEJn2iv4AEz*b8pzk{#v?wYU`MQ8HKd%#qOm+=;g%hdwstx|W zY7$!S=mkpwQ;HIG+&~&DgX*SCjO9{MWZ}yKwiYR=AhP8GMe>nSBc;M%<2w1fUz#ZW zkYO50%S4+GeA_33G()@VbxFc1ACS=+BZDYRs915TjbxIt37~Y<vOJW4gC>`;b;1vr zks)E@XwLx-(GJ#YqS=)Ky-l7XwO+06AddGro&J>C(}KsS`Beag3iQ(p*jz3N2R4ln zHv{>C2`)uwX`C3>lZB~CxsUm$xt%XTU;hE#9~z&1a~}G@q^lZ)Og;M;EPgk~{iDKQ zVoH1;VbBpp(l_Djt{HJ)w{2hu$IHXH60VpHbj-<kIgvthCBibtD(IZ>(uN=P{j(X_ z3{#f0W7>x7_{2$C<wMC-F4J;QS660`+l?v%iK}MAXU1YG&Vl<i{Nm54PQhNEa?5Wn zCwJBMbfUBK!<FN|%UKx>k7yyLbxiOJ+yO@X{@I}^I$2G*?4L~coyLf(8W`vDYm|vC zthA;6IOb<RM$GNK5&vbvD$O8}@{Kp_&(wVNASIHYOtwrd;vYb-T2|XsD(*MpDT9(@ zF=eu-vhV@iMTN<}%W_0Y(J0Z>E}@7m?=1e$45nqz{jz+Vv5#0kxpoN0>$0-y)hTz= zX6%u2keneLrL@K7Z6*4{uqA8zZKb;o`jVmiZ&qpl8^|ah##`Fy4drl7eD>ygeqGbu z%XNT+GJD6+xu#d`5@(M90&(Ld;^8Bi7Di5$(|W|6T_gC`w4PI@$f?o++9mVUDtcmp zg)snOp3n?}7#6*HoaZt~`0-1b+PwC=Vl3JN{{^|?c&DG8K)UU)+W2}%qOZu80zscG zKq<f$H^S%Y-Z2hzvhd2<AiR-(&Dd4ZD-P#OXyCiC4|fQp$q>!>O>J*exuwb0Kb%p8 zo-A$a{9Z(9=i4!%CKmGB!r@D!Rl3sF?_YKlIHuD1@r0%;mtH={yG%D89_V=l*v0&% zdS$dOO<!7igD8s7`<vgP=AHt7>Ee3eA()%;V&DsRNTTV_zaH}7qxm;ki&1K-7^e1P zlb<!*w3^CqdG>y`M9w`71#AlA{(&ZrQZRq9O?2V!N3D21*Olp0`RQSlH@;nP(4L~^ zaho(~AtQVqrdPWR17Zzdi_DF*(F|yn>4floW2iTL(iF24u)zH;V5}k$G!yNyuAazh z+A}rSz_q$G>MbJiBqm+jVA-#1NEmZe`Lg=W2iw%|mS`7S2|d3I^Ee6|8$$O`EjdGW zWnNIqISPigQ%2skdy7Cg)s5*&f)(5`kg~I3S}G21BT`w(fSw8({wJ|K5mBjdg2gSj z#lz@kq_5O{vH$yTte#@U%`6sMEohB~$ff9rL0X0{Ce|hHCmc{rhCWBJENE7DR&bQ0 zmFWKYgM2tPQ`4_<emCA7v~;L_T=A4L5<i7dK#Unp>L4^B#+bz!O>gDptn(g+lwi;y zixz4(7u)x+zy1LvXH5wc!7wR!*#ifL<P_PDJhyrGYv~)!=V5v|hyzaR&CsQbgn?gE z*HpED%J85WVi20JYehBGJ&4rQ?$|x0n4#oc{K&G{9F-fBYCa8T&ZAk`LpeO+DFaD2 zJ~@v46E2zhZR8!dV6foy2O)`+`}{53?RvB}b;zkfe}#rCbOVqOPg}owr+51{LF#Jz zy`#VYb$cKeoUMY3{YvN+tRw+_RdMy0<n2kVq+4)d{CF^O0)D98)|5DJ1vz;Br2DlR zniaI%RRG49M0C!F&AAwbV%wUR1cOyKFN!ia@uq-}X=rWCAb&k=HRSmz;|T!SO71F3 zRx&K;&nS?VYmxFY+mXStkwxY=K2_HSjYM%2Sm;*2q&{;5c4Iw2@A6X`@wO47dcKJh z&pF-Gt|&@xxV=iV%OOd&ufGoSBb>Fvjz1Dbdq^g!;l?c%uTRwf+71?zZWV^J)gs&d z(keq#SFzYrGTmMQ#ExTA1aTO8V^`_O@#60zwWcHNQCvFuhF~UE4%*G-0<x^d0r!1_ zRC0Raj@W2rlWclboI$9PVHrmVVp+D4i<3D%xB5gtipSh|Nu-UIML;E;cmmns)pI5C z__w)Ci}rL-U<5$ACpS^mh25Ur%Uh;T)A5=2mgD1s9iuzD5Oo8=8}rMcA2KnDMC4m_ zH)y$u(_O?9yYGvGg6-BJ=tP-69($YJ5YN&&#h0~HqSUJf4MGV8las%qN0wIx@IX~B z^(~6V2;l2H@PRAQ;$u|uNAPPr%-Cq{yS!MT;722YTu^tOiUzw!cdWEUL>Pl8+PXf! zB(m+*Pnon=TY=mXAAE|f*wROWka1(&qA@D0Ao$_&3zt!x?;}yz+3(TQbtd^UuBxPh z+Tm&pH-{@{r8LbJCa%KnqWi22KCF$(J{o<W?ez3F0t%uHXJ?Yf*ZqihzlfALn)4si z$+0MJ6UPsx4j&)tB`_*2mc!v2?j~1sRxZXIVz1i$Ge#<Bsa9&MIN|M37z3TRVtkp3 zs*I3F6~4mbJp|?C7nH;5%*fA3;!I11cEWJWX!wXSb9|7G$0rIhw7Y?nnwTevqQ)TG zXPsF8S%ma?OAVpe%5+}a?8kAtlvwIehYSa4-H$<8geglH&rdQ2C!VOJ$v{`YO1zf) zqCVH@&-RoMP_ejy)OksoiINycI77J1i`E$a__6RjoPeD5D!5a%1dI78beCwt&*qcK z(A`hpel2fT=OC|h<FdwJQo^J}sXqs%f#RGLr{r1)yB&j8l5fvbO~YFaNLmvj9$48N zTVd$3!r3ZpmzKeikf^{lnBHwdMRImHU=#%n#yYpgqpiNyI6zzJ+f7U?Dt9Ks;>X*= zl3u`q-S9}WRrjP0!OOqK@<MRa<u)6gOkev(PYs2<x2b+ctGIfMP!C>_9a9@VXYy+$ zWF4#t)kFMAfodxdVYbNTtNY4-1q_FZ&$xqiVL#SH8Q!_UWGfrrKbXpFM(5FcHnq6k zdC-ur2Ik?*7V(-Abjw0*Ldhab^l3)oDExtG?va-&UAO^Q!^JnuN@_pfCLemf7K|8U zDzYt*vxzKjTP8q^DYFHaz5P1w@Wy79#)`F(cYeHfrR00`Cs%;p6XPYf7hL;FsYJE7 zfBNug-$)1!O(<_>q+c4RT&aXASS-5#)^{wGd&jD@ZtRq-dpr9Kn+eKItsDE|AK<cl zI_AWdCw%<4qRF~`wICE3HaJ}}lhmuLDZSt>srqNSKuW^ESfLxSL3|nGH!F|b3~x@E zjaOldvM?>bWX*TlNuiN45n0fhdWHD9mabchXb+OU7<Li%hl}C^ZU6c`(<;)Boz@oU zO7!9NVO`IBoO33SPL+l>Cq#UbuB4*jOK=~Z`ZU$`oTzj{`yW89#63?H@C|GmiGDA4 z|A%YT;!2<K1rIG2afu9{**8yXJ!PJ&8<c}pH0HGjd2i2)dI4e%-<K^{g^7}!H$D)X zwusbe<liKxbr)%SYQmt~OC=u<ZB?O{5HA4oX2A>@Z?~KJ*lw(G`s9;U;tQV)#mF~9 zN8J5IWzn?c=A`vjJFk?a4#qoY$v&l&46`qY1@`W+-sr1luTCHwo6y)OKxsuJ!XT<j z9MV>o(qHq8MN3#k+|9jtI<;q2x{;h~(LlC8<al<@zx{*7XL=i3loEYzm5xi3K?N7i z>X)@abHj{X9p{zSf<)EN11`l1A5rk3)xN);*+ZkDdNHeUNP`{At@>16Kbw4ef+#Ee z0!MP1N16LMYL`yF3q0BI&Ha6?hrhKfd|8tge&!pYU1Pf6Uw_Oi)YVHMiB!Zw`B1S> z4{3r%XJ@A-DZNmA^ZTsBF?En_!3BoaiW=O?9Z{65jkywyt?*O}spcaYk6A*m8mS<< zW}r~65-l*V>Phvx7aGca1aOwhgoFXvB9(~q8uHdnDF=100r!_k17+c&GV0WBUmWj! zb@K=TQGguW)#P*KzS9(T(QDiYIL&n_fkrzWY-@vyL6PJo&YLob``GkAZKXwu8gcGv z_Lm%!Pd;&uJS#(h1Tc6S|9-!UM`^Ng2`m`$Z8=M7GK<)hZ(fk@*hc%U)qw_T*uhiT zGBbWeOrIORn_Bv9)Lax#cjASp@>z+frW-empmLehkIJI?q;}J7GkWGFU69a-qGMgT zia^$o*iiRvw&I)e8irs=_m|4y9ftn^_!lwTrqK4;6I*Q=UPOIUSnGtAt1uJqffZ|h zO?UC<?Z9yw`ELRMt9?_tlQP>f2g|bw2K1sm`5Oe0_q}xE`>+fzY(-XA;iaaSli+Y# zW(tg697T_p7+`}D?1!F3#H}`o$NSH?%9^Id_9)vrJ!rrJciPGv^B)gi!4FR&Haod@ z-O4O|ri@^Zhc*{)XFz<IA1NbSY7?6(*OYq`!&D)Aas@cVw|8F)ctK^w>3r1Hc}>*8 z<AVBb_?uOBvhzgbm3%Z73)vbr4l9zg=v~x+xZgj(ZTY)MoOi7ExmhJNL;nSWKz+Z> zc6(J$Z$r;<bB^axBIgW70UTg;sTK^|nS`i~9tcu-ZhKcPE$z&W7?O67LN=yJzyr6^ zm-|NTR1Y+eJ!@#<)vVE*qppnTg!3trY_7g&#G6hx4!A#+OXfubu!IL!j05H<Y!U`> z=yRIqVbx~`_kmbo`&FoQQ7bAKzGgVUHKZ%kZp2EQlDV&`--#fOR*%bAVh8{vgO9Cp zGRS6?q;9NpTAJ0-!rF#ALEKk8{{YCWl~Tk3$vp*Oim7>Wu7%Qzwfl)(HiV;0Xs%ue zre^uPxdv2@m?E(>+e3A90sE`VS6>uxTZLktWP|uvaaV?<-@ZjzrJ+rme3>I|eJZxO zgQuen#g&IWfUB$&<8E_~L8QO7w{0FqcYilI3IN7Fwb@b^qa<_R-c0190EW+A)up2n zFFJ5n6-5_0;}vGX+AFxgW3;y;JR0%n&z7owXGHZ(>J<FFsm=-<g($8vqdllV2yCxC zayxz$+;N=qUq>Z$a3`r1-LzB20ybnB=NuZxWoX=~7$b_?LGyH`T-tfdz{7gtynIdz z+9x<~`I~!7XlFoUjyX(`?_#)5Kz(XkOQwl}Hg=!VohgxFTXKpO4u0s#KIWrT-q~Vu z2N|ypm1)tRGSP!+s~rkY16!i`KQ<0rH{Lyu;ZQP?cp0eTx1Q3{DW(8JE_NNmw_3Yz zaV4awbqc0O-7KMoN3pM`!eZ&-Y4byV$26ki^&mvZ$pB)eLGm{^`cg>kER8FXmSRrP zkA9RZj1WIs>2c;Ko0XAEE8EH>hF3$58BPs0PbN!t7LLfOiqfQ{W!QIIeQHaFPbV8b zeoo<>k4nx1ab`n|V<6xXeZ8t0anRl}QdcCF;iXhf@3l$7XXRg|O>PjQgS&n{Tn;_+ zRpX3q>zcK-5<(+l%h-{M)+<9fvB3rj&(f6b^2aB3dSkUbg~!XE#+!<}7~G6G@A}dX zTBO3T3I;Kpob{zd=9)m+V$E&L$@Z=57x5GsKdl!6*hs?MIbFvEx{=$8ad&8=jey#@ z#sJMQAZG(1M?9K3+|K<7`kvemrAxTGnOi3(f_bRO>zY&<G{Nj?T$>Yb2ib&zP`|z3 z(4T5`g``(aC!KJx?NY$Deq-rS%W7b^hGQgbB?skJ$y|E+Q=w)G$_W7DBi5nqqb2C> z(8*AyOnE8?&(B_JT{`;a$mRwso}^O<!wmHATR+;GbXIE>rI7QCWnJAt<o6zxoZm}a zxNUpbt0<2B8Rjf5oPwpBgX>h@(rB4g(2q)$BX@3uX1c2=Erpz52bqaEM;XBOHI+)9 z$!Kpz9@XoilcHI<xXA>9hk`3`X&PwK%d>$tbF+7P+0(R$n0b+80x^Tys_Is7+9$~Y zk;h@sn&kS=G>-L#QHOJvXeMIGpDqB|+IV07y+<|7UukEzjZuikRA6-NQ(jGQ>Q-p@ zBx8@dJq1)-c4-MkAa)0>buD#goh==rP?^gD4=wBKRNZ}RO76~UatzV31IYKPn^dqp zMtK#qTDFE(Y3fwL9M*=HdvT{r=Ubu{Ab?nB+M*B*#2$SyO02<fr)SfOQg>D~jnlZL zmwP*M&B;~iQAs1naCjbrrC5y^0zZYg`qNAYIRc{St1={yJ*ieOBpDoLu0a7Qf}H2C z^rt)+KVIIHoQqIpVGs?9)Y3e-r{64TBB&&*oCE&=*Q&`5eW}4t+zjHfma4|^T(0G> zv_O}le<fNy`SQ<7b@jqr$2-QMRItG5#Z~efZa~dSA%C-wRPuc)U6qYh-OT)a+*H8} zeQHr|ImyO98gN1eD(*)q6qfQt0CZ*CGBey#THCC$?T|ju2|GtMeHcrhv~PSS7YC=M zRr1JkqvclqA~^z+WvGyweUg+oY<CADnqp;Rv%Orlgt6P)_p2!kag&dky=$JOWev`X zbe#4hvbIP-l5|}51F@@9;7UX+NaK<^{{Z!=fEGN0Na!lSfdVUrV%R%@=suO=;%m8{ zohoVzLXG66DE17O>P<lj%ugf8QU3sieQ9QMbvE6^^Urc>!`c|b799ppdh?#zokkX^ zBEuL+&Rxz}ip#jUWE)k9IO~eFcO178G->jT@=tnfI%{M1pbT`!dfhaZrCFIa_A}m0 zM1o!0h8y^C-}+YkI$Fkq0|a-dUi8_o36i~P1=ePA8v|)L_o2B<VJM_(tm|sScLP07 z6>+9Ui+PiACjbM|uyq@AdKHz3Vmj3Nf7%w*Lfn|mPcD}Rud&1?=05eIX9-|H0F&Pp zQWC#5SdKX3IW@JXAluV|IW_A|*&cl;-H%2Vfm?z|t8wazk?wDo9Y=FnlSrV2WyT4~ z2dxUeVEK>AKIr2nv2agwsY$Jlj>}es*d672X0{UIH&2n2u^Gp6T#c4cW6K*!$3C^X zvd07|o~`IPu4&Ur=x-S|wKd~Qi4+)7ih+~HaY$l<T$x|XWd!9{sq{3<EoSP@HxNj; zae@fRBAX<pMh%Q)aw^}micM<6S9C&yhE`vt2_9D|k&d-K!q{dcpIp?@h1t2k{dJ3x zRx@RLmyn|{+B;O1@FRfAr*Pvm>B@QGy*V6Hn&Ze)<#JCvRW{nPCzq(%?cA=?2LR*d zsAY{7*haw%9(ft7an7^HoE1KVb5$-ld|;k`I&i)0$db^e_MxQ2O@ML17!|pscy`9% z$t~QgZsBmFJ%0+yVIwl6M{5(3#B{4s!!5cQWo^ZQ3Q5WLtyzSjb)g2O3frkv0PQ#j zJ!-9~c>xZKfym;mGCN_L=T+#e0TjriXxum?1~>$JRq}hJU8kubg;i9s8=JB1P~2NH z9s9B9YDrn=oU!C6{e9`~0gX!@fMn*O)7YgelmLoJL{hUB$0a>G^HgpYIAxJqAi#_% zJet*!8zGkf_s=y9=2;}%BO6asik?euJN7ZkOALZ2puu1cRN+VKP|syE#$<hxbI#B+ zSFUi(6-#7vRp3!?14>E{-M9CT%Y*Mim4xGc%rvo4AXD<OH~{|uUrOKAnS8}NahTVS zPBB^QZ*e90W>7#UI6tju>j(wNj0^-tTz(bXht{Xa<gTqx=3>jWxC{8xA(5b&T>|c2 zo0Jjx8nrS+sJnL;KYKg@>?)~VO?p;1Zb2u^*&I>?skW~}(w(p|8&?B?*S%UqHbb+F z(iqsLbHe-7&V_IfahiO#-y=-`b8Z`GcNjUvUns6r3Q4UyRV1hYVLE)H_4WK}nk8## z@oterXK%G@PAhXNv$8Ki4Z0)wt0BsKyKpex{?%W~UUAm6q9Dn)%vgp9EZsj!skKY& zR!~{7xSRo79Eweq%ZQZV5ZvVU#b-}33>*@?@JC}(-A+L(S??e%$l{`I$mypZtXAAZ zF&nerJ?JK6x4<kTlc?-Ss~T&n+^aqUj-`(uh{rY8>i2#dn?{8!A=!7do$R>p&s^fT zr#7C)WKqH*kd8}iIO)z$wI`5GxwzjRH|^QDZuQPRDoK=?SdoHGc&Oxzqm*?j!-5Y{ zRbgBnQ6eG~P**u|oVI;wJjZfN9mg2S_7x?(D>UFdffEFlAan!M)`j_7Dh5Hw$jvl_ z*%1Vuokal{ZsQ?(kZR-!5sP^)(y1qI(YGJ|zSR`R&6VWXtGtu71_1gBZXt3Wd7uso z@N?}?Dse*5V7Z5P0fKTn9zmkoA3i{vfX{PVS2l@r4%XqjA4<oX+G|$BsmEsRUS1-M zpxav>wi3J~*ErcD5X@D+V5hO`QDd4?Nj%c$Byn7)W94r_m=$|WfK4OrMJpKIS&lJ- z+t#DDv6kuZi}Lql&{UU`#cvncZH|BEqmK34hQms%lWRkcy=6^WJA~Gg+}uewm-4a7 zxaW$k<j#_Z@`+=dhL3^xbgNocq-@+IgqVrv+Pb)wDb-kE(DxkXy6WIHz4tulUB^ot z6tI-ZJbM~rE)h?tuS&VnbnA&QAtC^IVxx9H3Z*}XEF^{yw&6%t%VhJ{6_3=aTIqts z$Em@>V_8?t4YMP5-nj3I)v%5jg!jQnhBADhz;5=<Yf0f)gQ*PI9YOC|n(HOH$6)}% zAj{*{v-VP?`RCBpRaI9kOi83OO42u0Ii_>d)||`SR)&dSZ!a>#_i-s>pI*YVigT5h zP?xy1I{yF;Xc}7ha(OSW(%SAt42ipvKc#Y)7gx~C$sEK58N(8I9_F7d%#&(v%FLm7 zTpVButmkr&>KSqlbMp_SV>!+>pDexJh{-k8YDl`>!nXtw>cXcQ@hP@w0|pp4HJP-z zR4;`cGI&}^Jij0elO}V=VeiM%x+99Jw78rhC$YM>x?Sy-*R?S%vi;-=q~!6Q=Aecx zJ){j4*4}zBtWcp`1^|J{0lL$GP^1<4yBzeSszq-U{{R6xOQSn~It_ruFeK+Zj31>+ zLd_OcRY+cO(BOYM;#OBNDtVFxQ<YG78S7SJy_VhBMLWqDBq?q(KAo$zW-8W{PG>=_ znbe|y0R!gGagkP`SpgDCg_Mi}!?3Py3;jtW5`f-W84SyiNcRG@VexJA*d?vRDDXgc zY|aSD{Od^O6dvr(bf;rqTYFtg%aY#7Eg4fECUE}s&6Q+w2*C!lE%i}+%p-w-MJz_{ z6nE=UO?P8*2}cUUkC+jf^RaZW^?m9xT-|~k_xF(-neHHuhA9x+lE(z+I3Jy8#WV?O zR^m)NapE*Y9Gv$*jc2p{o&{bDH#r@%Q7%~Wd9Db{>YoqC`G3JOtvl$8a$n6L$p9Xi z#YY|N+lFvJ_Nifs-9V8+QNZn86g~_`(VG7N?HK+bxEaPiwaHU9sY%{*YUey0rrL_V zj5NJbAd*N#naJAt!6)fZY*&z#P`~W0GXDVNMU50HuU>Lb)|sWv7n)<ZcT^zYpvlfS zuXh2Mx~)d8{TZbxw;Prrh_f1*lq;R1j^5Nkaq}v&t12Ah0B7oI>P$hNSgqsO<7o^t zvnPyaoblGafoKwL<Fxw;H3`z*BB9*i7GMQQcc(R^%@crG2|~c+5-KJ0ZP`fO8>s|# zBA3i<<)mW8vT{#<TFvuwZ=pQV<=aw6(e9$Mj`B$H42Np5?rJEYQxShL0|pDQ^~bMD zkX%V8?wVo{XYUiYIR3Pe$fiA>QtsWI{O2B(ZsayKl$8LVr7}p061faP$I5e7TjvbS z*<;T=%|Hg#-W)5b7#!r%Oq4;igM;}~;EcSXMlw!0I29@sl#wg#Je=*xCYu-mj%nPY zTq-jxxg=x_q+>tSQ{z3xO)+B<WM>Qq%D5+S^rywh#yP24lPwUkXBi`}N<$V7LEJrh zW~5~tXP>1#A;AqP+P|rxy9z0?TV7>V+RnNAwYOrh+5q=bat{cnCbE9g5S6xFihGlm z{OO9%oRWF2dBxAj=%*zIea`z%))dBeI;J{CI{j*$#;X;}5jYsn-}J6~PIgJTJy6nx zc{&~5)yS~%QfG6;NyTVwUnP^-NA_`<06gQ0##Qo;@w?3jIVXyhjP~!5lne%PFeyyY z$(;PGM^Vt$kc*18=2L2J`!hdMytuvEZX_%eU}v>ad?^4X!Y~g9^Q(7Ius=6L-l0o5 zSdyw+j@7#5NW#)=u8iTgs}*lhaZU(XMoA=e`c#4zQ}YZTO0yI>p~($FjkMa5eCVtS zkT+)oBd-+ofEFOQ0~rSguccbHv`3IDzQO(CD%2Wt&B7*ddiJbkB(-NuAl`)=TWMyM zQZw^sj&aRQ)>4PdDahkEt$ST8!!UPYf!I{iTux_Y+5(Q`^{z^oxJBuy*-r~5wa~^( z88>Ik+&%cF{f1z_>K{GMGh1Tw%9v&l{@tkzhEPZ>qdDTT`qSRV-&R{(%(fCNW<MwR zfhTXwKOWVsc@oWM5(uM+?dm(zhUQ)vk8@E=3$pVeZ^ohGIiF(VM#!i%%WZ_bgg3C_ zn!0_mle%KV*i^;`bBthm3UApqo?Dt~w7-}=jC&K>=)Y(TU|_*lG{|frfXHrvVS)xd zezfSXZY)E2Ew?Ijj&oE^-<n91A(-_Y58+MKmA3^+Ut&RL8fAk58-M}EDNHLGfTVTj zJ?f)*oBs9y_oR6pdSv3f`t@Zlr)4@xY+eCQS+GdtnxlDk&-=7psoeV1jP2x&+ylv~ z(%eK}J;pm%n<+NVn80<U1~%QaDE{>~QN8`yQ0HhInt`taAx+FU;~uq_sGPzh%VoVO zMlHQdwzngaNWtB_R+gO--AoWVs6XFe2j*)E7<Nc}(yU0p$j(3d^`jCXSo1!`Io*ZH z6||vspf)pAwt`7mH_MI=)0%<{dq`D6!@0dpPS8y+-TR)kJ-xC=hLM49dKQY;0P@sD zkf0vIpo&?eBo*Y<(qbe5$>$*SqzZ+@ZQOg&a7P7YY$g~CGw)k(HNB;=gfQF(TE`wm zq_Qo$`N|Fz@r}dR2CGYO&5&1;e=7B*7bbb}nu7B#J=4u1#xU67Nj*9JDXJM5<aO&* z(ru(E1B%d!RJbT6mjMO<K9t(9MqI|0m|c{Txkc~k?^>|~EBTVP{0s~X3eJW-(T0vi z5tha=$R4#}FJnmrV0@#D*DUV#I^&|$(^9}GBLla+TY>kSvt~6M)@is5gK6znPUN*s zppxBjT=H5PqeeMYbHN9tPa25{0~o9%cIZw{dU{r^w1ff29WzklVeV)RD9iv+&s<e` z^tpV)owx(1HKT54L6Im?*p9fVW-M0>#j-JzPBM3~i<`O5$gO7p1x|D8QOP<=iX@L~ zcJ=&gLi!e!cAi4?thPdmOO3cZ=dEuQa)+#uL^nTAPg+m430S%LK<QN-e$wO;RCdi+ zip@sp41tP_VE+I?RFYehE89X~#lC#~F-Xc4eo^xuYHB(uICIBrRGUr1EO8u`>&GM5 zRr6TMrPPTK5>$-fWSVS|pkXF6fsQ*;NdrN+Ns)ud?rEYmao&X|xSUqVtoJ!%@@-u9 z<eGehx?%8%>M10Uz^CQf2YRRHeW8m;_&|DNIW$XAEeKgl%e5CPoC0e|MYb&CCB*_Y zSomK50C*a62-YIoxF4k?mg3i9y^0{d+En3=-VS=xHC&BCLxGWj^9=T;!y?BxxXU0{ z7zA|(-mUAAe)VopW;xUl-r!)0>cX_Dzch1V6ZUEOm~#a3)EM@V56nM`skjBQD$Ky= zrB^x5F<z<X5y~Uu%PpL9yVj!wjw$7eIA!b9dm3zrVlI*qy-o-m{<TphjU<u93Q6N9 z9+b_;kPip7O9=?!hzA{wQq)@#N0HEX>T6oX_C~`bXZ5I@t<~DxTtVbVD`ycd20QH) zF7yt@F@@|aqA2I6?mkI9>a&tYY4-#x?N<-(I#UT~#zs}K`c>S@F)GXz&jSPb)mMmx zE-*kKbs5jnt-F%D82qCo4|=cj#tewL#{`wg8UFw#u$k8aH_DKQa4V3?Pebibl6RIk z)!m4UVL?3xbHzdrtx2$+gCJHWqt*##l_897cfbJg$*37QIqO!V-xI96d*w?EgZ?xW zSsbw#&o~uHT$b!t3b^3o1HY|H3}N^@d(_EqkWP8@sbYs~4Dt9?q)U-%(?q<SJHY{! z0uzujDzvsfN-|0c$`9Smbh<Bz?sS`JVz!BPmBTX(l4~03;9bhnkPxxSP&lh;_9vMc z!U-A^m`)Evj+F<N0}TE+u8Li9;%zcLD8mxOr-s@A{OcM>SRCVn(~89>)V^UOwhtmA zuzkk>4nLhwa}BK0IJS+vmE;KsEsyi*O^O_;B;y@D>cm##Z_K265IWUZT*p1AMPp_Z z$!<>KdK?O?9qykWDP&y#0JLjY#IS>>qin%f9Q$C3=M{MX0ywOd2)S%`(Q=$qZJKt{ zOR9O$DG_m%3&mzl1dvK%nM$y&Z3JUeRmL)<eznnRIsnyS!Y<j6e65ety69B)PnGOt zRdP<p3+0?-ay_eGMAaV7WsX2v2IKwOSoCSE=PP)v5g)^jO<zy5ApO*82=9#7q}>^N ztEuTw%BNZ!(|oAytt`IV3}z4=SbU{NTInq`J7lp{yNqum*QYhccyq)OX^gN;f6-j@ zAH(h|(LxKGSfz!-M(do8_2XipQk%BO!nRv1H2v*U*yOeNw9P9^xu0(5RKk)@b6!7k zZYSLAScY=g><O<(@uMM_T5rlmOGsPzo6rj7yyOshSQtG=V_!du#kW3Ht&eXn$=|W| zl6G?Zj%#D=^2s}MoO{=EqUh^sqyp>~SHUTczmIHGIuC}1rFyf*3qcRfBA&;!bvJge z9AqwbWM_^u{&QW~eWm-u#?7MW&)A&dvV@im5}c1pisMMLXp#vn(mjXoB8}KSr@d>- zlZD3%!tu>RC;>ScuT|58{wSlsa%*ODa`<u*a|^IO<270QI93t^119W-JaOrY>+C1H zv@*|a7<?fPN^S}d6;daQ%`G~TFh~G(KjBdDlx5TIEmfN8aZ+eksCbMw`=+D&72>PB zmaahHu?OWp<Qmu3X1IdsJh@yh-T*ubrkbVXfAZ5mQC?+O(2U$2)sBTyZCtnE{{RnM zYuBO_jIc<_agd|{I`hHDUwl@5&A*X6vAN8M+i(y8f!~j%bvg#ObUemFBYlNQ1E?bg ziFE5(veHDmk9FYG!!MlQw1n>$w?clflCxTv_8uUX%ED_{V~mNwR}C2GI$+f`3eHa6 z4`Ib`Cx;M6=fmbCYU3xW=cwyQo*isuCj|S9Ruao<({08(gsa7*n=@j8LWcyd!Sm-F z^VoN*AK24JJ+!h$!U^)o%m6G0x71b1bUT>i1~R09laADuR`-8t26ZYCPgWTG1#{A& zS~a80w7$9t)Q=;vQg5Dj<Y08ALEPsZsbt);u)y!yoQGirmvHno$5u{KZJunIc{M4G zq;{ugmW)dLqbg20&*4%XM&dM<6}o8`f8GRu-u%@J4Y?d2N^~)oR&IcGHOT41v4e`- ziuP|bWxD#+I9XJml$JQ!LFraxP2`M><X|54Qw$#_y6Nb&I;o}0V`9>C9^wMF<=cX} z9QXRwh6Pzk>PC9hT4}e4gE|QVE(S>e5<2neQ%M;{0N~_gVCKH=i{^rCBwChPE`NC> zjPJnti6<ZZY*I8*q$??0Ba?&cicjHOAzT5Ro~Dcp4oN-5S%}pejZYeo*xQqiDdr|= z19?F=41hWs+0kxn?4`}+xSU|&bJDV$?5?#ORo$M3WLC3H6SQ%bSjJd^&{QsiaN2}$ zI6U^P8>!Yw9NXn1f8ptmYJnSKZXH4VYd>i1a-&UN#RZJ-;2NDHKuMDzW1#9yPX(m+ z6Qab7%*TKST1lam9IL4e4hZz2%Iv#Y6^=vX=ZdijaD^0&r>Vf_@%$-;G1O+9GH@!< zlP1c6g<ZrBxam=V(m335ed<__#UQ9``u3}bPhYUD$dPhe8#B+=p~)iS2P9Ka45T3> zXM#pES7nA+Ezu;m3%u?U9;8)mqB%IhAl0dEZY7O;*$XOwqbH?9X0eJc+FQo}Mrj0v z(BLWMezhj(1;}f3V!7ZRaa1ka=lOjq)s4V{;T^HZbI?{U_qov<StCyR-s@4B6o}o~ zK^t+$9V-#xXk;qfo}D<W_ga%pa%BJ^&mnjfOfi-IZcnW!^DWAnjGmj3oL~iP@yH{; zrC-zJn$=yQh<w8ba)X@Gu9Ym7=6KMATx8azq>3#X-Pi=j18B}`I+Zlg+Lb4LOqev~ zxt+@ZgQ?@CX+x)5M9Qjxi1n*hX&hGamR#g;NyaN0ZAwY5+6a!q2L`<Q_=!1k#hvtU z@lm@*uE>)iRTl%C0Zp3nIDkNT>w(^&w6<xE;W$4b+zH1@f$)q~SQcZ+J*$z=o2k;0 zTOxJ1c9h^@Pv=gMXCx8sO;VQXIAbjGfETS|UF%Nn%WuB`a7Q1`sU>X&?#__UZ3-Ro zmm{bZ0KHaIv<x1A8svQ0U!~60&)k0h0EnxWx6@m=5+FJ2n$B)TMkwf#;%PwKb`Pyd z_Q#D6%e&vTW45A1d;F8MpS{|kI;Wix!8{%m3d-|aqWKNqx0e8J#(MiwdEt)_yn9zP zUP&81aUR39FQ0Q5$R+XCsZEdBodLK!;g3oYm6V;EN#M2xW!hdl$Iif8k9xNekgMYu zQ_0;*Ran(FSy*=RNF>svN)F@t)M8&K1#Gi_Ds=MfgckWp8SB=#r6$>@Erhz12y#Xg zcg0}MKKVXD^s9H*e`p6dP;tQGs>cV*k<`<Q?r5|`ae{=ibw6}e4#rvhxbn_=nzJM_ zHyi+ansUJ$Ff%J;oB~IB(?lejWp#!)+b%}zbnQ{gIw{}`)E6vWz+RcD79ij=t`DtJ zUCOYc=5`0>!1SSJcVW-envP6#RlxewP@Hxds<IV}@lL`fP>KOL+($o!G)?6V#N^c( zZi1&LAbM44rj6LLyKUo!>rF=CqB+d8K*uVwvYr9$P_&!4Jt<OF5j<GPd=s4Y9sdAR zPgqGA8Lv}g$kmKkx;6_gdBNut_4~z%$2~DpC=q}`VEO5eD^Akd-u7gL$wxRMWQ>&u z(2s9gnNG^=r2@{GcN}&@asE6E{VKeZZ@MLLd*qM>b${@$Z&yVZ4Kzvwh0K}xcH^yb z`kPzXN?^2Cmw~!hQ^ChL1P=MEBI4xiY^q)+rL5s2Qy~hh4hipCHj}iG;Ryvk>GiHw z86IQ-pOMB6d9D2_M~PKP_RVEd7CNcQ=AzoHjAxBVko8X0e%jo;o17J5dSa`jo>aeH zL9G;%?w;nk-Pxn^EyDv2+*Pv{<rN$gp+Gy;xY<Yp1D^DvwK-(n%)7YNGwV^k#hYo( z3tOq2xBA~t!nCgKgB{>@tf#i*oule2rW0`3sM<?Y4BNDFJh&`>hX<uP$~S1)iRsrh zp*%rU;9&Qv>%IieG7T%-+1Ss2HKiLt3!b%p3z2KJp*vh-4e3f%P70{pds3Lw<WPe> z&#hFXnlt4iyz{T7Gf3IVIVbwnSy?gVhuS@RnzuWQYy$(nJJm)_-@rY{J!)eu0mUtf z?u#n$;DN#CG>hfNprm1d??>4rYk)unNAPsbO4id9LLziIJt&jA+?y6-FwbtS8w_JR zeJX|06+ndXyDTx*n>w2*7FJvbIV`Qv_u{Tg61t3@FfhaET0te~XDhU4$bwf$r`{oB zob?Ir1xsmr0eLjb@XUh+TN_CCAB9?IMZ1J~RgjLk;O47dTBXBAP_pg*Fg>eBrp8NM z%<V?TOG);&NFyr4p&hF3foY^qa7M8)g*Kg}bu}?{xVKw7vKD3HC&n^;KN`hZ7Si}M z@Cj8L=8cIN_Q<bFjbCdIGta9}*~`d>R*u>$hZe3H0K_gjk?UDZ-0@bf4)%EwHX%I+ zLG4vY&U0M|#e$A{)XB-kEv#|M!Z{>JRBk)Ulb$#neLq@!NI@7Q=HruE#Lbo?X21oG z2Ty99cMwhvJ!%D9jyqL_a<LGsM(!8`!L8FUV-7*2B#?S>Pg0xL%mko3g*Z5>^A+B9 zXC1RcVH7p;O)^$_4p`@>=~r!IwQ%2PoS^c_1yesaV1LG;k|Ys^4hbZUyySb<Z&YfX zh*HW~83HEef4ZZRXlr>PkjE;NWjHE&in$h}bp)`wO2MEQjkC%O=Zb9C65U-j%*<X_ zV#SEgXtJ?xMQ~Vvq?`(V&A2^}y*p(nS~elE$lF^Z^{WU~m=Y-(7|;N&B+7%3F@x#v zR$AC1M0T()n~rgV$?5r1xtkRWEKdqK5xZoL#~nYJsGi(;A%g<hIb3x2spCe)SXfvt zSx8pzjtxFybuv7e9hE@fouHluezh=!hEFhtQZg{zv-(x{u-t^I=B(TJe)W-M@>r?w zP~?{E(Ov9Uc&%l)KW2fVh=GN6$p`CF3qo<%9fzfDoety@83z9VbJnd#p}33|l{21I zdBtGy6yv)!R4PkUjx%1<)@>ebszE`MlbrLK;p4Y*M%69biuSvmHr6{kgq1@(#@OBT z^sh6-QAof5Fi4^p+A8;F(PcSwt3~rWScgNhl{IT=2;1|HroDCx3wt~?Ws&y$<eY+Q z%B}7(cNkNToE-i&={MKUrz~%C8QCg^RtF)o>FZoroNQ`*I~{qBUkXkRCTEB=b=KlL z2w7AT9~jTIaJLaQpCN*HjBGutw{H<Z@)*$>*mO`UKg1Vyy1XcE7B!j`#A_JnJqhnd z9<<Y4yvK#E>3gz&@C=PDV{52OGKk9!{%76Cdi783?+@u(ObKUm6OF$r2G1GfjQ%y^ zcRGvOlvz<#TOebT`BNm+n`|t+=R9YveMLn_5e3aBX#OUcsZp%bZ*GX(@m-|Le=YBt z^20N35*7Zn&i$h-0({-NRqJ09OBebD;(emo_#mEB+*J13P)p^wg#Dt_eB;!8Yvgg5 zC`O}nozbm4#ih$GolgG%!OU#z77~E7fMhu5*jA<HmmSydBEpl^NyjzJSYDW%No^ov zyfTKxbe5O@0B*M22hO}4n!=SwMd*0AsC{BiaxgCJUMY$d!4*p47ErD*4{UW6*|bpH zDM=yP!EjxxGEEXT1s35NLO4;}*R4wz2DN94R|_=sM<C`%_aH1cec(IPEQ18+r$LUj zuQr)7+!S;wM_h`nC7YuWf(>`ZN$hd7(ah`de(Dwk921^8Rxn8Xwk+6iMi(7xsMl?e z*hvGB!ntNb2?qxUwRl+dYTl-hdRW!a8_d7*%LNReWb_r$%?hN=8p^VTI1arJ(z!hv zR)bNEkmGPFe-Vo6)sh&?O27aQB;vgszIUZ=#8g`7ITh1%Wbh9l9EzP@IG1#+5q(Ll zJFRv&K}%)x8~gd-RzqG~T{h{YE$BN}sHsX?y$Iye?CCFc*rVK*%e;<^dR7Z+6aBI| zrI3&hPQrw6IWg`85y?G$YOK64J3|0-gV5JRX~sJW8=F%^ziC{sSmfk682}on{2jfs z)~soT?(KYukf~qwZh9YTS*;{j*ieE!tKstuE5p`r?6Voil3qh?W8D7$GZ4AzeJW7F z3vB3k=hCd(S>`6rcZ^|i)}k;KI5p$BrrF5mq}f_4gKKn?h|)rbJ6vQRtyM9Z<{MX% zdJ4Ms@;OkdShoNUO<%Qu>2kqzj~tVI?S*r&gV5)#dUzZg&Vb!SyJo}?=Xj4tJD z4!AWvv=UD$M;Oa7zy#x(vvo9=61CK*pvj!=Pz6bKa<_XKVv0SnsKjfu91i~V_Nm!e zwpZJR!N5HYJcSAdFnxV!*uGjYZ<w(Jam6{;BvErFiQ+Bt=PUr}p4B)_stF+EcI{Eb zhh};aR#sO_c8lfO#1oYn<KD55A~aFk^`*E}M#OKtU~`O9kOs&s7q2wJ#YRPD(X4JI zwZxXP`H`_!9SA&%e3uP2OSa}Glj~6OGNfa<7^P4N>CGB$R=X3EzA%ARS0L~^;}n7n zC}4TdN}4E(Em}gN7LUsXi61fQDtWE3N*vpi)i63#>mSR4y+<6?yIUr>Vxt3$@^M-b zXwt9+fKPU;r&clDo5GBq$ini5?4CIEp_3{;Twr$ZTK8IWz`KYAM;nJVS))b+U^xTk z&vQbkq^^ePIJ+_k6Uzbj41@P^+t!6r=Z>{_#}nIzXJatq1aXR{6|=M{B=p54E0@b* zLb!HJbN5KaNoxUlcBspKm7`^*u~lif?nP(_;D~&IS3N)+*DXv`W1`gRh89xQ=tmJS zS@|XMTb2W$qwJ8QhK<7x4oJr}BAC}CuqV*dX1YlnEOCXv9V>=a-luY+m4@7~C{#)b zKb3RWHv-YwR&*z;5-USexG=@Jcs{t!E0ql;#Nv04bZFTdi5vc)S0q!DZJjzLV$AxZ zvE6LM$QuNX!@X3y)vnSOaQ^@?2X7q*tu5We(!Rg~Gi0&r*0ZIG>uXBU$YDP#IUgwF zrD~GuiM6&NhgW%K3v)S<LC)ZWfl~hfY6)%(amM9A%A9QmvXz3}s8NLj91it%HuIzs z9-Rkj*F!x^q;GIR0G@l(!JSJoeCybH)6z)FY}f(Xeqs(!wO_TuTc%W<=hLNODcIE_ zjFR8U3Pg%_XCZn4Q`%a~8WwlKKf(=8<QZ@<0X$&yS6HNRgbFt|Us}p_8_?1ys<FAp z&A{pa#%ZD^knG=$#;&w7xC#QI9+@1_VDeM<eY(~>#)zyf4VNx9?io^hk7~JWOERuD z=e;&TH13ZyrTnk}+<JRbiIhr9a^01BR7tjIjmFX0ZQ9{vSrB0E8OKV)zLbmv=N;<I z+U3kPrr9LIvE?zwD;8V-06BzRHss>7j9VruT}GYKO`Y3)20GO4>`)+VU~__bsFARG z4afAUm`5B+=2UINB}Y;9tx9ECQb*$i=dDcWS5Hige8!m9kd;3&f+%?jv&#?S$oHY# z5m2dIkOuD66HdWGvt*8fqPV_9BmtA?4N*7Xu~OJ$)7rIBY;B^<vP{1=MmyAI^Kc<o zf!>;AK3~o<4|;57BBXMd;;zCPWFV4c7(TRst78lYsiE}QWqs%i1L@kXTWLgq9Q5ys zZc$xG_pfUhmpVPxp0PdLEfAGMrbpffy%FtLiv~bJ0|fGO{{ZTzPc6i#zH769Frkic zDw#|ln~z~#itTD}{5uk?Z8U^#1KggKa@Ke>=2_es<y;V(h){j~YLJkTv|&X?a>JTA zZ=(}ua{mAlH6x>l$CSXn(u{yE+;qiqcXPvgD@hSCI~<fPmHabQNIz!-pS@0oJ^9aJ z#W>T9bw)|_EL+MWawJy-4lsMx{+D*L1y(%%qOb&}A+)GD@7z<ZCNNxi(a2Pem^{*) zIg!0OoQ}tI((WpA$QY|pvlQ=v+*dhodh#Ot-E*ERe#Ytsw+kR_`ikLkaXkd@v2xy5 zCkk_l*0qvTE*VY$$OKkJvqY-F8-eRvnr5kOXb5!@9jC8q>7xkE>P1~6bgo`m11>h6 zdl6OTfd@J3+M_q?EQUnj9^RDpV9VE^YRarR9g)q-(VcY?WRuUeRcL|vjx$%JjPu^9 zu))Vl$uneD*bDsRE>1J)O_j1YC;)+uI#cIz&$+)rii$@ecMdbyQ+6GQHhkcd$5ZQ0 z2$|sKl*CR;pQklZrVy6-u~B>IirBS<2XhgCeKT59>Th?aM`$64BIo7`GyeeBtVFqm z)MPeE<mZpdrj9?EcCi5R4NR_yag4QPc@jmAL@2De$S3?MT*(w*I0qQ%=~iZlhb6~e zgjGpj&72-~ir$;K6OD@UjnZ#mJgj2|lus;(u%ICn?o~X2^r?;|%z06sl?BXSW|Q|1 zCd0@sdK`25*GhL*FmbcFM^(64A&eitxZwJGQcnwNR_5v${{VcW5~h0Kec}CSXCmVR z?B&>>m6UX;pp7*7qPxtDon4oos6T~VB<VY&DZx}$W(2Sm8D%3q4`Wc6^Uf=&)NFp- zp{*zLRxnSKoZ}}yFZfnWF+&vKT}2}&bW^pzQC_Vokf^T~d6gk3J2Nq3Ip(GaIKj`a zwOWM2vxbr%GB7^oahhO{1YlQ6Mh%F7^s5+;3ys}AZ2tgCL`2%evCm<Sw7msrjF?<` zUUPk%x0j!kw_JPGVoH;PQ+%CCC)9NPX@Lvm2H{5lnu!+?s0J_rENJ?S)QFhiijcxd z!knCRpm!n%Esda(G18u?lhUU)6T}tdiIgzNBx0nFK5<C{WFjMs?c$U{oDq+wrD|Hn zs>93$qudK7dg85{19vOQYi8mt+$insno^ouf{S|?=?M%#=LfZ4g4!bqCPTa)7aeNk z8XfF}5eQIwvBoQE(?f>c5Xx2MUP%X!%DJlI>A`MoPYY6SV*xE>j!mx<u6q$zpwpzA zDv`4uoDM5=$plA|Ki<Y_8@)~_QwcUtwR!W**3n07a_7~MMQdqc7VDpx^U&}r#lE)` z$+i)+gMbfu=CAJNypVvzfzWoSZDx21nOhj_I-20CUZnMG^r>O#!$gkM-YZ4s7~77x zsx7KS^LcT<mPzF1vFGt-%NMppQl#_8HOt&;a+!-l_#T9FSV2{t`Ls3Vgiii@#470{ zs}aWG#d$`hD#Ld&gOVK9lj^rqDNWl?cCKeoV%N>Ni6rMWaiG`4&a5^o*xg5|DZU|w z2*~eUPxk%Rp{78W5_zc_1Xb=a#}&ivC5Q(-_^tg2$@X2Ury%-tu877l)SC6GRbKI` z_z@IM$(~5>_?o7&0WLhUM{;W1cWnV5Ye6EPy1{uLTCpdT>I@-pdx2Uyl6#zdtD%{F zVQ+I9uwUMfx>~aDBHQFe5`Om`2=}RVyY~A?iYEU6SKNBkvA6cUyg?mexrKOU<99XH zLlB~+8SMW6%^eZ<Rg%BxQoYkI>|_gd13@8B!+PN0^x~{(cefVv2%X4)_s`umQvUw# zYo}Z1XPI~<&!@Sjqh>xB^WV~@tl`f6p2o@)s_1$YR?)O7!PVJ@cSqOp#Xi>JNF*jX zia0!s*B_(nji<^jnV7)GmOWOwm$5Q5cSv24{^W;+VOUA?e1Cb#I)2VpM$&2$`H0fW zP6yo`>wRsK<4hBzin3=5gUxZPZzEuNr;gsWe$LkIt#^6<05b3fPCqKcms_T1Q7ak} z>yX<`95)Ju+o>n6D$|WOP$d;gJ~NSyYnHf6p*fHUUAi6r0C;+Jt1WW&=q?-tRUa|V z59?dPQ;)*VS;7zEL_Q(WSuCbyA)_jAd*|t1e6hr`;$>o;!kilQD=mLb@j6^-*3u8O zB4mab8TA#yTxd6maPc&INNfV!Zu)xGc-r^n=h2=nCLYdS?##utU6*mN=o}x`w6&=R z+8PNJn6}nNEO4XK6)ajU<6MMzS~9&$CIGGdW5WVfwz=~egT@9?eLZvauKb@FPBWBS zF-^%gZH_T*q)(Le>OJb!y^NOuV}=GVlae{jcG`D_tmfDn38WG5OPmHZy%nyRV2*~- zKwev5<MB1<Vl#?Vosw;x6mWIxYq7&x_%~3wh%{z1>NkI!)`ho%ni&`E5WKECZQ{4b zh|E_%EwB&+fwXp|)x2K?rJRx~v}|}x^OIg|vzpIFj`x<roOztKIPGpJ9{gLy5k!li z1EpEhbq9gc3)?|FP4bpy$y$aTWgMiJ3eH)+XN+@<^NiH5eYwO?Zg`oARB_IFXNu*P zVHro>Tl79^bt-dR9c_+_rrky*v~!KWGLgvk=9cfmmiI2Kjupq=1Nf@WiwT0oAw~V> zH#z=weIX`6DzPLUeJhR9pry{C`JY2e15MIOtX2A)&HbWAQU<n;CWUr~RKah@y->HZ zhHJ%JqE;-7x21PCmQY;3&ysV&H9>ScXyj*=nSkVW;=SxXDwHW&D&B@O!O2VA*yc66 zD@ZO1SV&}#`^T+jd3zTauDb6<isLg_y0`a}c1Wx#?51mm-i2GK;}zLQ6$!`PcRA|e z=NVb68OVg3)ySdUf_MY3H7T|cqV2;obAi}Yk*6G*)z!Jr?5t{8CZF~xR%HG5+^g;w zABTF*k$E9OJ?dqQ5^{EoWM-oC9SI1;1J@Ov+LdeBSXkg=5G1OGI2(u+S%Wd!qbJaF zQ#n$&3dDji3F95<qB2`>1#{CKs&4w1%DNDeTP(zqdy`T`fw7Oqm7>Q3tzFYBCAxe@ zI2}ppLz;@YQKsbVNpBjd8Oa#*tpjYc%B^i1AOL44zpYz~PKph_d+)~qb5~c(LBI++ zbH#bJvDD$z^eJH^)}(f}F-BFFB#&N{lTREVpnsTk?@YVZ650||Yh$4m$xAKO)$52E znNKX=(!9B19cf<rBhsfuQ%7SAt8*U7K3t3yG_qS*#HAfncEIW@7Q<1wi}x352Emxh zkACK+n&v1NOK~Yfj+i8hpRCk^v_|MgPVE|7Y^~6^jDk9EJW{3Qi9qbTJu*L)bMxwP zI3ZlP$I3E6`qc?9rkZk~BB(+^cE?Xjl~%Of<jPd3#cXwR>aeK9cpp<$4x<@6w+z=Y z9MUrea!30(>ryn*F~hHF(#>@$$mm7vObc%n3*U(Hv9T@aD;E;1VU9&jr>1u^WRh|- z)}`6*Qb@6JaBd@Hc^P{gRdurnrD8b;n!OFF48)A&=bE3%0Ox4tsx2VoGZw*?L}IF= z9FxhWU0M0^HNCw26w3)10n^^L4jf_0Bn%41zK0SMw32-&=8Jj<E3wWEFbz@GL$oFb zEu0_1tV3e|0BZqLF@c=psieM&dwfc&*vQGnY3Y}OO`=5ship|jJ6#cEv?aBLt=2@6 z-CN86D-p=&wK?r)DBrr=y?`~Sh_Xw#4snmdt(cU>_qOBLy>mJBV@T)Wwv~WMA}V_B zttf5P5EGVvUbQ5u1B`LSIZo8)t!F9R)kJF`Pnph1s0y)Txo|xy%%VdPnNSt!*Ep&T zG=$}ku;!9wAtsfOkXM1z6%;@-Z_P-<C5t%e`P3xt$c;`-GLsuB#y6bho1djpOIC97 z1AsZ?<3CSYl4#{J@Z5Ja;>-%}KvjDl^-DqAt3APuNKv@eRgvan=E|r5Ck>y<tWR(Y zF$$`+oiiC6w?I8A;)Ka<RL?p9G6Bh}m$zA6ibe+<RU2mV<J`NlM?px^F3+DMpH7t8 zy9Dft7aMns5(z(@S2$KB!9Px-tXxOV@W77MOUz{q3S^VP9+lM{j(IyW&z@OTL!LcH zCZ$;tA@ZD&&s^4Hv&IV^3GYh;uIDN^JxvZEs%v9%Jyvj|X3TmKPF;R>a)FUT_4#pG zkuK<qob6MBeJKK|Vq#H`RwtUvl0A(%q$G?<!jXaAks;i&WNvZO2mI!k1Ipq!_JVt} z06#NLhUQq<lyao02L~KiZL~OCwbWKZgCt;QtqQ8cu4x$y!W=iuTNuw2#B4J&b@T$N z*B3RI^B3;;IT@)U^5X%rSgU->Mgbgm_3KYik8hP@yLST|R7G~TJxw$XbwMT>iz?uH zXE>#b10XC90);~4s9-oJCahSa5=hV2(vx}(MK)j4;g$1{cpMD#Td)we<2}z$O3Sig z9p=U$so|I&nXC6Xj?seT9o!#LT$9#Ebv+_V_az%>Y-Xi`^@cJ*;EuJ78*t~J#;#fb zyp_oGs!x|<`I|Z`Ny{%<(~fK|NzGx}7{qK@!Y~;ebv~7P-bP`Paf-@vxiVKT@6ROl zs_vxr!95A@O<5S63M7A+lhpUDTd@fg<p+5T58*?u5EG6nX94-oCYf>*VyduX-Eq>Q z_t4QIwo9SsuS(6nf>4;+bDl6OR2`B4rvy}2C}eVXoRgD|^{gG3q^@)DNjegw9(W@a zdfnzpMni2G;}xZDvd1txa#Ua(cBYt1$kG5ut!XJI(9SWi=<iZU#^Ht)R(SmEh{iL> zt1;W)45=CCnrol4l5vnua7AMqC!woXF)nVTwMNRRbw4R!b5^wb<h<PkfHMTh&l#!j zJd4PfvV+GJffV0n)HiXAU}L9B>x5L-naeid{EN3@K`)S!`D1X}tKZh3mhNjXs2KTf zyo1huqJ{Him`Q>|1GT;LPM+E2U?e$E0OPf9$hw$wK7%bTp5Atv+aq(0@uH8+R_b0_ zT&C-o3C0wb<+1Br;%|Y9M-eAKdl{=@NyK?(#^ao0nvPbT;!=`o(k$v)Fth@Da?;z7 zK6BXn)_;|r)wf})$`#?bhs;8}<B^YXQp==8a*HjLh^P3XbBuirchJTCnxA>YTMPE7 z>~qZ-PR5$-N`=NSdivJn`aS!o3<HE1Uzl|C=Ch=-k|I__D#NH@gI&?78Eno8Q<Qf_ zB~TB}q^b1ckSSKm{{Skv<N~ARA+yQtPVxX1cO<HVo<ZlYJ!*Kf6NU;H`VqxUAq+rJ zOL`9Vqi>>JO&DPbQ|jy&kD;lRNX2T)j3p<c3$0S`Qi2$#Roe>fQlkV?S!r_JKkmi{ zb|Z?`hQsXEeof?&EMd2mToxzmP+se{_R)Dz4S;X}>TAxcjf{QTdb7Tk3RBj4BSI@% z3s}`meq#=<-RUIN;zP0)z#WD#E0DR@<(<j~+P&L6R!rKorHaPnFJq3i=1bbt_?hX( zG-)jn=&7s*1o?@9)Mo~&PvSU(lz7{Y_`$9ZPrG!w1>1770K+_r>f*Vum<DL1xnMEK z$N9x$Dm<@UOH~tBiXU^Rw5p{S<!|<?NT!N)Rh2O0<96<~7VCd3EH?PhUF(c~wNm8* z#u$(vumh1xk}pEJ<X*g<J9x@P7zeu^YZh6-Vl(%-%{8tiWhBeAbf|6&Xf|Y){P9{w z32sL_dll|vjZ28wk(}i5P_aghM0~e7sAiBVoch&scnKj?0D1viD3ax8scU!4SB!yK zx};Af+8EVF<-sGpT8`4@=!R5$djnQAYhh<+3qC`Wj%p_>XpQjkQkv$`80iFXa!F># zIIRsPNSMeZc0dkxlZwc5xtX^fyj0q7KWf^|!5O6$)w8a>M4`(V*&TsM<+e?L6wVGs zSG~JS8y5%x&&s5Z^>0sDzRc0DJcG|##PJQ{++B-!kPj@K#~oUwJ7{y$gQ+!R4WV~q zBXWA2_cZkL10g~|2ajs7u`_iBwDdh0uP#ilpDr$brk6eUJsOl%C^;pdx7s^umdHpe zaI4oC$*y@}n$vtUBP#|t&3Yu3dmS9R9B_Hh6-QIiEww1O#zIcH!(+F-XsRubCZD@L zV~;{WFSK#fHLs$0id$I)y~7u`&j6pf^sLu{NNzsQB9XM>w4w0B%_}=ds{sE1mZyMz zfYWVjeUD0{Z%+5n?QQNLkSoT1QZtdz(k`tXtG?y|M^a8JoBrCd(QLlWWg)qjp)JCS z<8?hs_foqeS$7v81WuXs$E{RoOLei~%M(pE6{*|m-ZInK*jqW0QNTSH>zd~8HTm^c zDRnVW++j`tJ&r4!IUF7_Kys%b;MZIfV!X~Oj#GQ+cK#2C?3&s;-L7O`FXa3ysJ)7L zFQgJ&pDkM`sD5MhK9#}vPTKP4QiIA2(e5nl2O}Lh_chS?&srK)$Jt;&(#V5!g#F*8 zc^LY2D@`S<H}-V>joLPD_0`j1{ru6E?YQo5%e83Oc#6*RNl7J=J^=u4AIiL1OSz_U z(z$YdO?2KDdv~@murf%DPD%Md$E7Mb2+;Shs8XqUTG}3kbK-SNHICeZdJVbevQtr- z_C|R(Y#+i82kTYRdsz_3AW;$?2m~Ddboj4sopy^w2ss#9(~(DGy*rn0E*?13%ZxbB zBOKzm{{Rtc;_Fn}<zt2{jez6>TUxfXY^+{Jz?6-s2<J7!GnPB0a!dB>nyPWS*z@tz zcI3Y1zxJ%M!jOrBMHu-u@>f2UvEhXCuFb@|o;dm(_pUw!d9GF@O}RJ$JDT+U3q%&y zam0nPc_-eYtYZ_C1%r&L^F5KPYb>n$U}h`z&TFBym&*fkorkXOD<r`@2$9>U2fG2B zpGwlxt#u2RVRarrA1Ox2{{ZV!hrGE@YNAV4SiHVPUCWFp>z*qb^HuwOv)RFuAso84 zD$b>+Fqg_%Fd1{Obq27bMzy%ZfPf!PwUye7N$Ol_#U#xO2;|aHRkJ2fBphP4*G#pZ zIUVKNt};KuvTWp2AP&WWJd@J2=GkK+MzXAm<FUvUR4P=Y@7(9D6+Ib&ePS(}Df1vb zaaEyTGb}(H^cB_51am?Y0irzPuQ;rSu=1Ta0ZV+!IO4v7o+c8F?s*k3@=ruT1)S1> zwl+C9&N!<h!?z4~J0h<c!O5wl*8a^7*y96l0YL5Avt-ro?wDW_hrW7OomVob+vHju zwD1vM6ExFH(`^RnS*C8|BLb#NT{iALshD}_4;7OHl1m^26YhFdiSEUsjih98yVAVr zV=)}p=G5(2N>;UpTxd?R{_Va`?;6mywfiI(1OU1~MZagMAY&%0>6)Z6hDoQ-2Lzmx zQ@zAbAPT{O^*92$KD}0=QIV3u!kn&!E{fZv1fIZF9;vUrxN{o?0P&O7tlr*|j1Y6k z&2l=*JjoiMVqQ!!1GRI;3Ul|4%W}r((zBg!?f02Tk=XD~RDYgpLeo!Z<6yS|Ll2ph z^H{bzN?XQQGd|vr(;rIE{?NCG93-yekDag$T(x$AFGcSb=DApqrLhJ70KDA(H4VXz zYiT^sHd%?ueEhid0<!1St|d80{ISytY8dB|MA<ZsM^L<s{c4pbxeljd>LM8fJY;!% zWc4*(;_*Jx!Pg)Ulx^araO-SYBp^2m4{utE-QW=_NZEb7maU@|xr?7chV6z<-Z6ns z(&kwwEh}$h&>q!J_46l}3ZIwStZ8a8-9sonM_+oWTa>8oYt3~OxP)?h?d?`=ArSn- zE>BNt&9$=s07z+fU=x$?TM)=meqMO4cV(hCNwU&73(X@*k9^f;XDhglwF=D2*v4ub zR?yKR*_4iP_*8EyN%FD`ijCyRIO|ZkBalXW)+Jbc=^ID2fXC9Jj@k|3)c`)!p@fQ7 zM!-EOP_lfTy=v6j6N+WH+%5{5n|}knRao*k{ApN}8P7q|p}Uh}M#HvP^rlF|9eAqm zIcD^wS0o+z!0CZX%wtW=u?8`@8@k~2rXm&rhbPjcDZ2m@%@1;x=MfSJJ$utk1~RcE zvXM(H%3)MU)e7}t{8Yhsv%HNw%o_x+8Qgv9tkWv<Bjeb2s<xsg+*{^iFb7&>(j<zY zMys@7k^ElfsZBX6pSXh<^`Op500HKoD9rn{XL5kyYP@j2nacd2RriaM&w=ZTb{8CR zT60+iwJHl-VDn75D2Hot#aWz?pCe$_bdkKSOpH2JM^U{tE6CxxepLgbU=hIY=~fm6 zLU41MNg|MpAuI^#irq687R=cXnI_(&rfS8!LNp`;ijq5jDE$1B`c;$V1Ph#+ro{?< zSyDK|gSe0nrA(+(h3VRz!i?tvjpHEnsAh^O8J=c(^Y2NVwgv~ktxF!&EM6fgJOWsN zKPr4880UqWRs$fpQG&eouH(zIAVwvEu_1HLDcdq?)}d=1rlBl$<@~UIQy?3NJu{DL zXUxi>n4O~v4`EK@<rE{tgDOC7S3Sis@?7T`&u&FJMRg%b2LKU+nvx`DZbm9w>S+~y z2+?tZN$b|N?G_?7p*cN)sz%;X0c9T{Y#w@^wV`OMYZ8#a=bFZH(CMcOGE{<Cr#~kL z)0)tMjFEYB4a!e`)g_9(^zp?4d6G-O9m%H{o(W1w2H;2__O5w0)!I5zOGHtM+@#VY z4u=5yRk&kez#Mj~kV3P_0V5}j=M?md%YC&DW3oa+5#X_{7?Hf4%YZYCXPP6mfLi&Y zY{*;vUOEq4)J8zO)XPRK%VD++tIHosr1Lw-R19;DYByr}%VMRCQ9#@?>r(U@jfue` zEyUwBR!LO|EV%&lj`ZoIatJC%IKiZc%Zw{rf2z+T)}w97dlBzk1HS~GMmkgvb>%ix z)y-<^#^!LkdKkbQu6ouaae0n+F-#m_*3n6;vJ-7=ZP+c&p*o~Hna}Xj-bFQxjI*7r z58VQ(K{dvgG*a70yPWk?mIL3?oju(5cLqzO%bfF6;~Nm1xx9zG?8&$gJMe0a?6?XL z<oZ&Zh}Kex${gp9x@rko)x((CvFX}~t1|C(p-kR|VmRxMtyR2@);)=mtiX|;pXW5} zEYh)Iu#@;z(-3$zkQk0LT`Ed0<`RpVu~^$lqslz#P`Qja2*HOu^GGkGy9*Mi!C*-P zlaAG1_T8djncNN!%5pzCg3I@J05g;y#s1Lrt*)i1g`9LZ(kNPE7~I5g<J12DuTWjX zFmREsa(E}VwQIWB&80_qWfXSbX8~me^3Hv6R2NgXWGMdtAqP8wqNF8CO4^z(S;t)p z5xvEvfXf>w>4V<3?XMt6w-Q(|8%X{hd(|Ykf_aJygDNn_&AF+3k10%R9@CuU=bBef zbZ5%e%+oh0(lWUW=r}u%PpwF^%FzI`V;qi8BhskBXCDu+53f(wq$z6|0h{j}bv&9) z#Rn|eERx2jZOnG>&l|e_VxpGwOolQ|q#?1}EI(RmJ()O0C0mS|j^ftHVdPdI^bB~Z za%*PBps%V$yIoD*A>_pz2uI$G0BOysENDS|IqpX$vSxLae7KlKqo&%8BU^H^NJBrN z=Z|{Fl22A`&lRF2xzt`)!XAA|teej^RvWXsJ#$(k5^YoprH^4!Pim>P*;tHn3e}{b zOOu|)8e47(s)U9=H#CxHtYrCD$_FQN=M|xGe%8P0BHYKRVaTj2%}(Oxc01h@Ju{qA zO}C&llCuDpHj*r=2xK`2s1>nitCJqfiEzZ{f&FV9DSX5(WPR)RKpD^DP4gJbmIFTZ za!Om7MYwz?PSZ4~Su#i-wL(onv!9ri>7Mmg+fX64mBOA06x);L{{X814CCIp+-&U5 zweKsH?=K{F$U)DgSB<59Ip?seDG$wtU`MB|YTT?^d@uuOVwIC1w>$YffmG&}h@M?_ zWjO33+C;H72d_WMoU3OOe1Q~>!D<%1X^+fK-1jvd$wisgIRi!x74ePU_^DBodX(oC zv35;aVO&NDZi6R*SlXk>aSO`QZy<)jIpUSnGYz2Q)YP(BOxkqwroxCekVwu*JqLc3 zq+uAX3|&^`sm;8*j!EDiF<Raq2{x&0C3Q&4?JV81?O4DQleGR7V$@F^#7v67h8*MG zu2H(OH-$}GmbX0*P`Haqwvj`t=OQu}9QxN2G^~%f<nI0~^H+5{u{@z3LUxSud-tr1 zsrq2<<E?Y3`_?@Qa#U#ZJsU1Y=0;Gma>oFB*L|eg#Ri)kBZnZ8+3IV7(BS(`$YaVN z{LOZ@cS{5dyx}&So|U(<v|Bi<<6TQZZPb$IP>vNb5KDZ(b~&hRZ$l`JzGodzwPK~p zYMP5dWYN6jGkoq9Mgcuf(z%U8P`+sy9!w)-e7plkv0EN{#H8)i>UED1Y1XotE#XU< zmyOuq8s}!$@9(AaBz6&xmta3GYblp(J$v)-S9H5uTe&t}UVV*xwjs)v3_##<T1J#s z+L=zg=B(Y3Vl@IR6eYb4RJyg2SqmunhXqK%&0V&#)F&n@b!i4ayTBh>+O@IM?KZZl zF6jXO08<$1ef?^sTFX<OmL8<%`?PX)dTrhGn=Rrmj;+{!HPvZe42vrFMWt-=tI$>W zHHZY>T0pT|^Z*V;bTCU45iF&F1C_^o*Bx9$wnwzEE{jg0Bf7cMyftjzOhoSCKmZZN za9$_5I*gIsE;hbZl>Yz;`qxFQSxu?xD3G@8<OK(&eznZ%mc}S{HhxFLVycQu-g~nQ zOq)$Dk%i^9?YQQ;ZwP6xHRCL-5f}`U&<e$h-bR-wyNNjj@rt>o>UTCbuO2`wG4!qF zCoLj*l<GH8Sng#OHZmk~zwYzGsL1;LX=cA3X?taFAfMfaJb~^#YnzD-;ZdGK+2g%m zy;ajR!qX`dKMG5A&2q{qXwP4tmM%|ZbKW7pi&4B`8*UMB6!DYX)@7_aq}==ra6Kwn zUMO<PGJWc8GTux1!sIDt0Y|B>i}J(B@hVi5?=I&{;O#0qtEReq1c!n3uS2wrP;L@r zXB>5`%{Iy%D$Xl)iCBgCk8GZ%uUg8nxG}C&p1rHillGE5%sn4tNiMxklTNpUxM?Kg zuN7|JREEvvROAej#<Qfjwn!o{N=&Wyl=Kxz_X*uwuQ?rSM+woNy2WKX^AD3!5?vdG zKpo#0HD6tgBoW;0#~WK7wOVIJV4#&G^)+N78!{)9`AXmy9R8IGElEl4IZ14c{{XgG zh@y@Jbz%3*Hg|u8OB)v~LC(>W?Nta!<RU+vNzMr5)Q<y@&L3j~jf8S*&|kcFlCg~6 zD$vxnyC_6>EWcW`Swog(4m)nFC?%Q3IV?_2J!;%fE4d6CrvOyCR$4Mtu3c#&X$TQ6 z0l_%MH|&<`Ndp<|J!!F9ySjz>r6(BgOt>=JyCl1n!9Op0;&8LFH&$XX7QmDlZ&E9i z*Kco~hyhhcsjj---JLwyc*ky})^+;Ykj86OWF6V@S;Z*I_PMH)wT>>r?&<CUK;(|& zIIgnFOQ|GLGbl`SUi8~X7wW3E-c`PMQIHL3g}1d<kOBx81GQCJm(tc86}4{VN$svY zvgaUwvskycl0Xq74sv-t#cN9KCoHG^m(NPhn$C8Z6Ee2rlZF1Y>819EDL#a7&peCe z4c?^tRKxdWx8?VAB=bn|vXF`~$0Tx1S5;ubHIr~XbK15^GZ{#+<zVyk4{BtPw1n_L z?nhd(F&t#^j=<CHaU*@*!mV9uV%^HO3bLlvR#Z`p9!_ZzIOB*&@v#T*W36e*B21}_ zliZ4UwvFxnKzidRp`)A>PJTE<(>r4s^{pke#?{(7a0O1bNhI8+)1GnZS5^>TIO)*$ zqEZ=FC1hQPKD9I<n1Cu{ZdyUPa=ELK!oTv(a@{MMa!BZl(276-z+SzFYO5q3SuH0X zg04v-!<9V0dda)G+}xgf3duIj5iE{@K^>~B^8$WG&(u{jJ2MatNN$xGXE!UxRE|Yz zpe|!g3`Py+QRZ&PmyX`Kr4u&b0Q@SXKyB(XQmf3w?2rBgI|?UfvM%PD$Q1`58e`oq z+>{5lYKt?j(YvKJOP9wTd)7)QRwgXUcMfyjrG|ay1mdf^0CtmrJ?cov3&5*uK^B<f zq2nHvoqH<FHb4v83((b<l)4oQ->p?~vmuv}Qx#?fS73mJ`^UNMQSHn8rzfc<r<sE% z-Q-jX4st70CM=8QFkFtkYFoI)vw3REBQG0}<QlIms=O1LV_X0-2kV-4Vj*`UEJyzU zUYKqJj^KLJC7d>XQ;y&oNMkbNaKew)uas%(JxP#Y4={S3)g-p?AY2{9s3#*BH5J5x zM$ot(f~mCo@-z2&;;JaOWKArv!lM9FP0U+CBz(gon$4O*`;Jc?{VKaLI0|=GstU$V zt)7MXWkO9LJun76Dvz3Y%~_4}9#qveU{kvs?lX)UPyk?Ykxz_Ev1DZ7v$US{vn$5s zS#U>ci<fSuT00I%Bh!ww@4gFwa1IHml)5lrNMX>57zF_GLGNAmJcQY9-{)<Qg$?{? zwkc0M=aErv1}KpwXD1|~7z%y4`cjDpwkm9DoypOHu6iF#RLElqmh0N88BnPiY~zmk z{{RYDitb(GaL*$>YFagntY{>I01lOMIHkJJl^#MaSSaW#GB^2xXPVNDCXNW@D9Vlw z(s&F#y=y6Gbj94YZz{s6<(3ixbI%y<R+O~EC9+Lq8BdrnrzG)Cj_H6KO=l$8qG=nj zDU5ac)s5q5Ao4p_I$vdW=LGes#o|Q>P1~5ZPBFm8t#i1$mvn5!Gcxm!r>$6yKQ=&% zkC@}0g0P^xA;Hc?T8{HA@}4u&qETsv`x?-}YLhzMF#$o_v!9xxp5hS}-MM0V{{TwF zyVW)yy^l_M)kyUNG@~Haj`D(5*fdX8Z*NfvVT|?Xty7icx?%`BSFol$jT~ZT8$r$w zt!7WFNfNUw?DQ27jHR%pB)2q-u|ptc#y*ugi+Nlyl}YZNquRNvi@AQy_Jbx>+XX@E z?@?M`Igq~MiJT1cTYDF4+{@a=_Bwlrqw`6H9aOO@q~!i}Rp)kI4nm&&X%c5(w+Q%M zxgc~TcdYllBH_yrS8*T;BN;JDNf+XkUR{oJo`)4QfS8z<+Ek6BA9}Oa;R)Z82T_W- zYdE|fTCPdrl#^PNtn?cs0f?Na$m^c;*buD5!x>?MdS?}C>KU!G9LQ9!1x;8>o0PR_ zZQWuA<z+wtAb=0y#R^NV!EVMS%v(z~{h<E<3H7YfxR7)l_0LM#oi`!Mg2t--gwEio zDm(7=t>G(fXHpH3-!-a;e#7P=3IxT-Iez%|sVpH`=gx71%VUA~cc;Z+95SoF%ts)0 ztFm1%4DJ4~l2{+}?td!T%KIGZ7Wjro3R<_z7tfBOn?AK8l|)rc3>IUOPpvV@y27(K z$-o1(Gwg9h_zDPa<mA%P?hgL|WUF(jT)PF1M`QHB{HoM2TwF*z>05B?o}#Q<zz3Nc zkTx&nPqk-E?fH-Qh^KpOiL-mMc<p}9hi)_29`#s~&Ubvx+>_F-#|_2K-KYZ-jIrXC ztVO%B%`z5T<OANJ%G$B0-$YdeEPJ-?41Qj7nm)$&1s&T1Jr7J%W}Z8J#3*z9<Iq-Z z-SyS=%Gz5t^<ouq#_ANC*iwvE=Rs<gjXGPb=^jW1LU<L4u06$;qj3$q;&_n%0IgC; z$E{^DI!x&)<xU9nBBg?Bh`i*D-6E6#>JJT$nf0MkeAjGV*4iSoPb}y6k~4dr^&3Xm z`GF(aw1uLyM<08xDIVFlZJANUQh=P>DOs$KCkgU}+v$(5tw}U)+jl4ftzV56Ig&XY zB2%6SKZmt%U+P+I)r?kl_NWAT240NcUti9!o0M9zG>cZT$GXWQ3?Nio{<Qe+S{r#_ zRYu-H+*gtGJ*vg&A2cd9jNnyNk7QXn>(tVEtxG})8GdKL$4ZT-mU$JPV#Rn~e(0$r zixK6I2B3=>lVc)bdN9uKVaHmi#`_T|cPGqfxKImwo&^%`xnk}WSSSD@fDSmQf*e(p zF0lcSF`jYHH2F#91c5f-<Qhgc_UL4|eW{#!lTDIEx3_s5;3y{<u6A8Ud#l59A<4+v zF~IyQs|`Wamajq_mC`mZHS2R_9j%6$4Y)=>zaug~)~Pp$E|Y4;S8yYoRXd3qP|}=k zW0S@zt^+s#U>pkeBZZ|EXrWfAB`aR$>>8M6b=2)vNXnD)fE)0t`h}D;!Y*t+XqezB zVYxBwRNm;u6;N^yaZ3!3Zpm{Q$YOUbVLTKitW}wFs?z0yzjH<{PTNVejwnx?Fd1xg z2CLlP-0I0Jmp2ZBZ^;@Dl=IO3wH@_>myYfq^)qsPk9sD%^HXy=ro;<?pl$<!z^odK z7TTVCr7e*Vw6|MRi5t!Cr=?IXzy!xCc&Q+Y;_6Z&1e0A>kKp8JzSDPbjNtzOsZ;Ho zn&Fg`ekN-ga+gD!wXwU@B?)f>Nsj#o=Us-6;Mjx_z4W4HT;e4sYS#P-Z3VDcQZ-(f zPzN<r?JpFp8L@-UVO&)z&RR!9(4~ijb(W>u%Wo@97S;?Pa=*ecgXvrp_OiotQgv@P zJnpYXf_Pa|c`OL|ff&K|syf|-T8um3iBe=7Fz@xQSX6O#XQ_vjBJC}XH6ms0pK4oO zYI|G31kT@QJb$~IfJr<PG;)?#QbsDZ((aJw878|S8@n^J6)4rBxeo5q$*vT}z&T7h z5zgUR*ZN|Wm0CT#XM<VVM!!9rD+R-50yu8#_}4=eUuliz1nt^zNzQn#k7Uw!K5G>h z8^^iH-`u&kL?DqGg+u<x2a3mp8LlIC`BcaUzAF9mNoqs+!P|B*w}1~?qvm;zdmM}p zLs(H<t3$@1+Ov9|iKba4w0rU~jt94`W9#~ro!^-rBxi+!#e<dq0BE1av~Ta0%Sl-V zOH83-$?NZ2ag!vO1|#k>$*dGyo!RJS6|WUaKCI5YKp%TIC!*HhgX8}IO7oxY#&Uz) z)lE@!>+8s)(jk^G>Z;2lZY8^%`c~X}Z}wynC*CD_z^<-tYH2+i9uhbAn%M1aW19ID z6L8$zFR821!Q`$SfJX&=D<{L+jDi-1RW75U&q~*jM>2+tfP0GOakhu4&e*8yydI!- zt5*(OyT=KP0n<6fP({a6fm@b(#8Bz7!XgcTK4v_hrF7D#7X9XBQcY}($eP`hM=;qS zInFXjqWr~gY_{mdjE$YW4k^;v`Dqp8WH@FyRv+gz5VALSu^4wQ;Bd!~4Gs}nnMzLO z1OUzQf`lH2lUK%krBZSaR`jMzZRcvz$8GbnoM3UB3K~tQ2Rw2`U9OV|yN`u@oQT`M zB#hMYNbJRk7(K-{-PDCG(4KjvcErr8HjcRTtfwbt&0`gN5)V2!+Ttb)wZ8UwsIBH} zyOSj3vuCNQ_cNjZyz+XANM{j-!Os<wi)g(Q9j{)$k}WN|zXbYLY(5#9(GuqMibm_X zFmsyHhB)3|IrF<29)g*xw6``!DA=eY9QUG2l02w|cPp9gsebZ95pAeGQd^}lB)O76 z<d;2(;8j>GadEYdN)DB=Yig?BGi~`u$Q<;nTvFKIn@f~tTa{OTJFijcRid~mpX*8I zsqa?J#8TioV2&~mHJv(?xnvQj$3yE{CDD<4y$uDpEfXEvK<iRl!X%6X7X*Faf2C5j zOM*)?7AL4RWgp3HyYcDIN?f|=OL`K@lgA<tB}`esY}B@G3QGA#a7O?(25HN93|m}z zi;NI^(nSu%cZt4II2h$?U$bUm*5k_nNe4Xi?kW>83z7=vvtYQB&cl)j^{qHpaSp?; z08^AXH!2UDu^HSxOzu6&=~_1S?6}FvJt`<;1c0CpF~I9qF7IK}t(n`GJPP8J-RzEz zUW26x20Y`2Jrs2{nRlxnC8D<Z9k|>&iqE*!gow@*pM2)4$1*zxKQlKtH8y**Xu)+S zj%$TR61ie|$*NZ@UlR9Fc=f9jP7v)Q9@R>DN16_L{*`dv;Uc2lNTj$KC)%b0TaI}Y z?<u7U8ePi00p}GYW>DT#drk@DFHv1e*3jm6xTy@F4Xw!Snz;n`HptswXmN(Y>+Muz zHzHl$VG2Dssn+40x#SM!qET%cM3CIGH_SRy%%!ok)Lvw4a0MiPGwlu(dz=c*q-?e= zK`+gQRemweUylG~xxlIx@s>NWQ^>~zC^_}4<=9ONJcYU)qu5m`Wn=gGslhBTdWwa| z_k}p2Y(!ge-GTX4N!Y4j3copxLWCu_86;x|(zE7Z2^c5dw1~GM-aNCs5^={k!KGAI zfVh=&yB=SEtvvY+4^q-+`=AU|YC<?T+yUv+HKG-PAq?4WN%yIpLPlyW<udrjPXd`N zrML%*H#Am67Z`Da*VePHRZ$oz%Mn*6d~u#?jH3i8{wC{Mz{;eGyCiY)^*mO`hqO_u zU&RZ&aR9?}Il__eRnjy^A1OVm%tV(QU=Ed1ZLJJS+P#3V)a8Xjx`!Y*KQ1%cmK!FC zKX||~=Wc3q9?AB%Oy>vIp311qFgL$HN{1(F8o@2d1Y$Pkk+Hk2Kg%7<6H&I&k&IF` zOvfE~q&O#@)b;Y%pjkj9bG&dWEPTXd93G>guTIB{aOik6;gmgd$2AzvO-Nati!&Bx zIVAO=piFs`d0}yma!;*F8a3EsW;}eshA@A^tB|`o^PZTc3fUx{gVv_Ssacmx1vuca z>cHew@m{cuE4g65bQ993Ze<-o$n8xe=a514spPq`t7A%QlQAqdsPq)Xl1OA-jzbI( zRP_96yk~%Vp5WD#UBN~G$Drn;md1*1MVL{goP<^Yw?cXR>p`@}^BP1Bpq#3cyN`2K z?TR46i~-b|z2^}aZQB#3Nv>(RUqh-9R@AW_r^pL@xF5q#SkME8+m1P`(|9)$vv9tK zqPf)>ZNVq!&T@IIy`0%x@kNWs(m531w%$%p6(^YjjoXwqI&`c_^;0;>AxY{7fAFeF zeyby3V3CZTYiLoE+~=MmD`R=CW_AeDf`ssZ<PW81-^h%Glo9h_t~zn+RPAPxNzydQ z=Yg~kezoX#nh%F;{5_fGPwfl`ShwYJMnLQRYtg5L(&r?x7tr&jE<xPP6?+<g?$<9E zB>){xc9ZxDW$U}n!c2k>O}NEE6p(hQI2kw{1xt!Xe9q@jqUwtnWZ$?R0-lH3s@x`S z<p6xD=V+)PnPGxIGho}$DCtr~bT<={3FqFqc~X;T>*l;w%hsr}>@K4!bB=)3i%7&1 zv#0|-y*`yrE7<pe8usL7u0=dj9m+;j@(pD)&EaNTxWC;I4!e+(oSYi1Wj6bH32q0z zX_rbG3>O@X@!RV~uvnqt#u#&1IIdeGRP`G>kVLL<qoz94LsHHH5X6p^PWFAyKqQJ= zSS6W*Yzh~?E21z~yE*4k^H~~p*pb6NcX}Fa)xFVh5RHU&0<T)z?f|eE_p9xdO}{A= zbMn0b!<lMfLFQVFGdT=FU^(57TD1xZ*fPXacPu*7=YgbgfB^1k>319~6tEz07Zpvn zu?Z-W0URhx@(<uCTJa%`T~z>LKs*v_GXD5GZ3r?tRY;xP^7slmao(@lU0s<vwsuB~ zUo?_pNkGp4wm=`1N0)RVm4-$^$6v;-X|PzdjCCm<71&B`QIdOPRVf(HcoaV52MSp6 zimzj($@Y%qY>Ke#Z<)HCryvT3+RbhqNuDSbxD5Hgsjsc}mscZxa6s)qg*>>DX?6g- z9C6&$!U-8pO|l(3MUwYX7Dd(>GC?w(pnYkw*fq8L!p@^(V7E|ym9?Z>+T30sy_6UU z<=Axk9M$g=Sm~DYlcqRvkDP!QujY8G=1JJgm7L_Tx&XkCuh9Ebh15P-h9m)0WVzw9 z?N5d&8*U}SC?f=Q%|6mSAS~wc;gP(uQ)=gPdK#9mp`v!w$hku#nE;=2(x$YuI}0%f z9fePMa3X++O1eLFUIkOPzru)|e21<&=CPMIE``NKOHr3G#g~+`h9m_YkFWHn#c$>! zv*T##=}s}naObZFAbM0+mu&+Ga!v+1@GFy7qB`_ij=IFEBftO-+!IsSczS!1Jhcox zb5tx@t}eO3$>%lQXcvj6PO`G2u{>}9{{ZXO(1S?IQ%u4B#FEu!Y2!sz?%W^3s*7;P zYzg<cIqoaaudOB5+F7HG4j1@9Ab*8%cM%Ofa)E=e&k8scOHENJr=vN&eLl?s#U@7c zlAr_A-nr(QHB%k{{{VDWuZpCd?qYYw-J}EQ?OgFJa6cnno)$0Jra4yRT(L#>VLW(9 zl?DLoocq-<guVx@TeLz{gVvbvypnvmAbVG<2cb2f>LojBHh8?T8?oJy%{~-qA9e=T zImb>Z^IJ%}BMMk@dUU0?F6v`cD~=0xts^ZiQl)CPYTxE=z$3ZP?=6uP3Lh~5Jvpp+ zbhvP@aWcrnXKJ1WUej(;IB(U5CI(Q|%#uOi*OOWt^P9bl@eV4b(mN|vwt_H`#tVBM zD@MxgcKpq>gV3A|R{<T}#3$sHhJEV9TD{sjxp3t=ZcuB9;oH#=s@U(|-_D4ed^2?* z8fMcZBr+9$x_Rqd&YR;K%L{=hj4=l}2Lx5$_)OuFV<eEtl6&H_mJ+3}Ynv+3^fjEi zlA=$T0ggE0v}|s6<+qIVK9$c$;te)dXD`cV<>g2{xy4zE=Go&RZsR@pBDq}#)ufHR zwYFicY4-Yo%uTXja5{DLu4-r{hG&h}4u_Cyr}LIgg9^+!%8XPu_8-~{mHB4IL-zU_ z-iuLw_QsH{%cC%&8?Dr_3P~ejAFXWYI`sBd$4!~HT03M7xhi^RHI5;cDFj3oeB)`! z{Hs#p81!gSm<ev1k~<*xuSvy8a;1BlVrtTjH0lM`iu0LY2(cF@bDU&$tU2_k1L8~g z)w7Ha)iur4&Cn&}X+aqyu&lWt+qn17<yq6fa{Z&`=}MeivN}CV*5>}&7Pg)_<F||= z0NjD}u5R_FM)I5$$52HGWVghT$W@O*r=?wr_B-|aKB37!c5HGhDPbKgR;cJo6L;!u z_%BIG3BH|9z%Zo#wZEvmFx#nREwt?;Ju1GDDnX+QaK~y5qaK;fS-JiFtHz;oD&+25 zo-vFcTJojM?Jmzwj8rMvZW>0S^W2Exi()A5cr~_1l`FR6lh_=Jz_xi7G(+XXxA;_G z{Y`4YG?IYC5QC0uW|ru2ZLLeg4gt;$MKu0dD!q8%cc{|lIVAGA8C-%rYCIDm+kt`J zgqn9`xnD$GhUJP4@;1c;;Pk0Rs+x6@wX+!-UB%JI$`5Q*R%;xpcb+qXpkoH5n@0}c zyN_VUJc{UxhuS&jr1mp}%^4Dcu4Fl3jB`?(vnzRGGCo}9rAsG-lq{;JIV5qKNUY?M zhVWF6UiGA$Ic`i8l&o8}RtlpXs!OSM0uLGMPk?aDa02(N{Yv@TXw{W=sN2HhKU&~V zo>n`yR~b7EtBy%EAD93D90co8nRiaZBa^`FDN5{Iwj0=1%S{M(EhNnDHvFo4dsLSO zcU_jMUQN9eXEmP*kdl7rJpL6myw@>Y8IpEP3=A9)D&-X3rYXA(2|m!JL1sL#;*ms& zcjbeU22S32$7)G+5FFrxilmn}FwP{mmDWbi?l4Et=hB>M-=Pwfku0!9D<7DGy*8e; z470}+K}<lZpS;|fotOYONEwRcl^o~L)HhKmOvc<EK4DI!CCVsNY26EFs>a{Cbac-E z=QUzu5n=}|>MJ+^tO{~_`x?0u379E3VO*T5Ea`G`MDg4RkY}E8v<^j1_c9(9J)rjP zXpRxpvBg`5?BJ0i79<>F)`uweCzeKex7_&y@jdF~AY^B?IK~v@ckM_*j+xFmtmiwU zYH+cB2?T$<C#P!XwfSVYTzQ=H$E9l|nT3hY0IZ@G>P>|?&nCH+lDW{4&RWjsyJTki z9+ja5#?>qr<~=>CYs)1~;Rqh16hjC^R0A!JO={$&s6{cc8Du-;878DK`H~WH2Vsu2 zVNm0dkxm^5Rr$T>Od7EejbUGy5=}^qBPZp-J?Z;`;4m5fRQD0cTgpwUdHL98sWL2x zyw#L#bw5!}o;BODBluJ8B#H@lN~OMG@{WXh8n>%o+TKnY+5v9318DAOces<*)-#eF zsyB7?sQ^ISj!#NMB9;RHU}B`-9^tfO^{JK36D&rfU?kuQWRjIUbg0>#jsf|7DnRHL zYjSHlYEb2w2<HRqOnDUW7p*j@C$&c5fj*wKNf1XefHQ(kR+S8k#}#$%iGd>8pe}Gi z@^k8Y)LWFVBL=BlW@u8Md#9<X<3(lQ<aMcDAVC{Lat=>wHsME3ods!ok#X>8ml~0E zw@`K|atX!-Qfo(2Nd$!;6WX*a<ZnGd#z@<a)jq4Ie`m;|ON5xZgOogUq_?q@r)OgZ zYc**OT}TIwy$|O>uop5aMx%Qib^|qS<3f0U%e5d<p#0UP#e0>!sUn4r*2)|f9V!J< z#~lS<hzVGu=Wco9G<kkkC`iv3qV@utMhW9Nr$_+<CoR)8Wl*~X9sMd9Z5%K?n~~4+ z_oDYHT@)pfLBKi3aY$q)5b|vSc<s$h(KPZZAvgzt?@hS1vbUK9!^+AJJAcBOwd_{5 zxz1s5xF<cvD#`>TdFpro4VWM2ij7xvgDuHDO-!m><8RWvM$aNBj3Mh%MH5N8XwCsW zaZ)|FLZKKx0GwoF+nSy@5z4ORT=ge76%Ct444_vXY3iho0X1!*-G##aYFkN-jPcH~ z#O#MVWI)P(qrEjG_Xka)iUt5=aheKpagV~UMiuTd$b`4d6tD~H&$cQSP0|t<0P+Cn zD7p?pIEho!HFg`vgFadz%H!rxaqso0;z-d>_5kCjb5Xe?q2i_4nxx{1{@DAAF$KPq zOK|d#UQFO%WYti>9D#}psUoM951p26RUO@A7%V_mEr6#z>TPZdOG%a+d!MuwU*0gr z-QD({<KC$x*lg_w9N_e-?;y#@1QGdC<<{bE$YbqkKXeanr@awEW@Q-UZ~z>dS5zv# zQD(yB^0>kO01lKy(kIM^X$Oo}so3Uf?6o`+S<KKnNduty)t3wp`NcIZq*P6<xU1)D z42=H(T4l`g-8r6l+G$+;#mO!8B-0}*2;5mmJgCXdYNpo2*s&{1E6URCB(cZ?7(T<b zGAIjf+C7eYQ{c6^y`7dNX=LS?j!EuKY1u#(e6k0abGfse`&JbycQ>a`n9Xob2cW5K z;hD+Ug^3yC(;2Hb7R4WGD>{y+8Ks6Pj}b2es5Oh8njH$0xX5iM#^AUQpP9HEd;b8Q zwD=}yH*G-21Rd0~Z{86di3it#^s5O0V6Odh$i+*Q)~1n-wiS0ykwnfFnXq>p55(2W zEjcc&?p{mC(c#9_EzF$%01Z(ozEG&WJJjl7j|vD34<?i(qV-oQNxq{EpoZauqiI~{ zJo8p9<wQTlgZWiiq%Y6|j^xu8X4{RWx#!ZUCefUvlQoR8n3;s3QBUxmwCL}bXYU)I zb68I_p|+qap46`QGshfqG1`L*fzWlWRW)r)T~~b#d!0%>n2FE1BY{~m+#UOY$rS{y zQ~(dL!K)By*D|^Q5Qaec-Y^06J-(HsV4|+fXE!HgOZKFh7tLG|(2BpOB2BtbxQz$} zk8IToiyN3!E2^|$WISUd8TI<o+Fwfqa$CmI1dw6XPY3H%l4|IiwCv4|Uf#_lh+18F z<&!POFvqo15q+GXk}ox#hSgKeRUTlGTWRBwS5j#txmOSzj9?G*)|L7(*l~mju0PR? zPNabo@>F~K)oZv5w0Oz+au&L4T{W)dEx7sea?2xRx8qtD{v2rIifN-*QDeh4agS=H zEgw<)JK0{x6{gzUUtdLU4jN4G9Pv`!EY{Z#9J^LUY!VMz*h%!OIefTaXD6%l{HbrW zdrP>?*77#uImzT#G_f?(vn%TJNawuy44{?(FHobkRJe#Vq=p1^1JG2L7V_H2QPl1J z@f~T%h}NXwZV!|6`qrHNO!+UM+h`dr*_;BWkgdoyR74T5Prns%OO-3JI-cH@Sg}Ur zfJX!lwVaz~i6lBHRu*CbJa7rD>)94r6o5g;&CYUaOPL$*1K*`PPO^PQRf;q$?br&z zr5|~lUz<crr6^eeW3{uu#}&~>=EfF9-a7Q|J*tc8vFY*!JB#tSZQxb*zC?@36ERij z39V_(INcb^I-3?AA-l7;c;aB7t})c--`23NuKel5(lacC<b^*iMsC86G0(j+WQ@iM z!t+s4^E)Ep8)|d@B(jogQ!WT8&JR*6m5s`f2VB>nJYrL{{KFXM(z%UiMSD5Sw&1j9 zoOfF9!PQImaw2KpnGVy;ag}M%u<kRHPLpSt#duP9UYM$}N&B(cz3NnL-+Kh+y&K6Z z9_2cba8N|$W8t5icBn2c&~GXLW6*R0pRr`$B#u>6fB_lL(z*``ctR~+U$$y8rM;r( z8~*_1q4dQSD*GBd)0UlxuTiVnTg>H^E)z<25xYq{WMFg^kl~kxQV+d)2BxuET$^YB z2)r&i+&gnwR}iF_8%FcgV!Wv0oUZM;;!2;H$x?tYa!<8&(dm{lz)L`cuO)|Cf&4iG zsbvhf?YpPpT1OEMq&iIIM_N+7>v|6i8KwyxzyzL*y(qo#<?Ky`^2iy$$raa1ttPD5 z4i48aI#ZW9;Nq{zq3RKU#@X3Vb>^!*w9vL5CsXb#qMTyh`Wd^TK=%-{t4}0SNBj&= zT;m^Jy?rXeYkG`fLAr9Q&~Qai<Q{2jsp08OYY<au=yuu`qHf@uQ@gi|{TOXW$1K&2 zsY@-}v&iI@B%gY_XP7)O3Um{>bMAPo>A+K+=Wn-a;inY`CvPvf=EYT%szxpBim1-< zGO5@OM+Y2JKFY&#?#hwIPc+*p14_sNY`4pfrnIAs3=%j$rCKtaoi}3<mCx?mr)*Qc z#~{WlT382~q!2<K!EwhuYH7!qOPF?sJg8h^wn;Gh#?~%)a_OYCXdDvJp1#%7i*p<( z$sm(>B&q|H=e=`Y8;|}c2pMpNc>}$AG7EN<W{xP(06s+=ab5;tNk*f$Q`*7TbAiVs zb42n)5%-_sBehzQ-C~Ty?0^8II{J=ls?`a;kX$viaTVIC;NTB@cly;C?SgFR`8ecP zDtfD%-PxITHlZXeTsU5=GlDB#bb=dIXlC<Rrbr*d?M{xw?b*VE=}puu<gx@t%J~`G zhc%r_oX<^y5w_%3CN;GrmRI&Qd9F4f1Lnx!p4EpFN`n$9BhYbLR?V^n4}wU@1azf6 zRmzT<7vqjOz~1DM)MBN0qm6fDp2DEFL`B}EyY45YMK#Egf-X;d*DR+i@~5GyO7|t6 zbXY`r1Nzn_*fL9<+;t|Vl3zYRbMywHJ;Pv=TT%B}Qdd?YlaSIzLn6N2!;I5{$+Rmg z0K+)xk?JZL0-*$q_o>-Wm?TLzC?6<%o;@q6voH#+BQm21$>CYK$JVRd8F)>>6T2Rs zxT}`IV|~&B;~<fqqL^)jvomb@NhcZTDx)=hOywOkGvi&^J4OfhM@qQX;mRD3N|Zp0 z^8f%I)owDLPaLp39CrHEx|-b?dp!t##*s#*Y@D9PnJ18-?Tj3B-OXBgCNOzHLnu4B z9qJk5i)?;eh1jlND~+eq-izHgaOJl{J<5;aU%+CcNEwFpKQi~LMgkioj0%EBA&3MO zHOo0!*&9L^)t7DeADNHK^{Y$sWPmE2vX3MT{syk#Du64RQ@OlhVeiUdo|O?fT+-y@ zngnde7{)qO+`Cwi97K8QJ!+H)BMiiVPa>`uwyx)DrzgsX6+5x5ivIv4u0}>l%{pZX zC}hR}=qfnGVCN(fc&TOuQy}D?^>!7?%X02MUZmg(Q1UZiiiI7MC6^<$I8Ipc(DtiQ z2P>B*YjG%BV(hpXG69_9pVpdN+lqlgo|(_3SvyLAs#Ig4=bCo0D`9{~u~|cI&&{5n zg+}8Cb9L=g1qv_$KD2>1Hd%P>ng*4M>aOHqaaLA8D-5~aQe<EN2NaFSJ$R(`Eg=B~ zNi|fK^GV%-RyRZkT>64~)PK9~PJ0TJtWcrA;2u5c{FU_vn!5?W#&MoV6&Koi;9`ps zN#t)l98_|^7x>L6pB*x3S;14gocdE&C6Tt&ja;}PvNnUrs0_d{CqIQbqb<(^nikhM z%W>SAw2_;*urQiWEE1)=gI9H3HeD^FX=O+ABLoF(j-BeMwDM+eB21_}J}^x>c;#gq zixoH?+*KzM99uKXGxs14gEXwWfIFCa)aC$-yQi_H5FFuo#XE(EMq`Z*a!n>fWal2n znUa$Ov@jh<I5i+D%vdN;PIivo)i&x<9ILQyBOvlVl?0Ci0!)mmP7Vf0sl-gf0DuQv z)H<YyV2T!4)s$@>Qe!;zC%LIxnsh6}Hq<gI;IRQcfUJE$%OtD`J$u%o$e{v`qp%fP z>tH*WZYH#jj8fHD!&U^~b5}w_utnv}UPj50O5i7_J?a}vS#H_f6dP2#Gq4%_`k!i* zRY~E2<I=q*&oU7eGR>9)udO(^PME0J@y#)&Qi`T92+z%vlT&M&^H`lE+&WTRLh(pZ z@sZaI59%s7$vi7@*P4<Wg0hJoF(5(-4bb}<0_pBBpjfhZ2PcnARfz7=*<+H|D=<PO zGGT*fBY}=MrpY+CY_>ropgaz9!0bJ#5;(!*3~1)=3Kx12hisFQ7>YB2%~+B(MBZ6* z=m#}iusq`c(!I)YumTAqz9|uRuuu+3#XjfkpvU%OA^8WHybrzK9@PkQ%~Mt;=$ck< zEg~vDQh5Mp@v6)dp*0{^l$>@1^~V(qoSdIpNfRb6RDIJ(t&@spmiWjSA6m5?l<#Qw zVn5x+;TY~2$?3;l)cpuo8qn<s!PU2n;AboKsa7CP<{L*~DVUHCPQYfRjb$ZOr2%u% zxy45_HBeVAL`WdUO7Y2BkzdPTRfc`4EHa@8Hy>k65W27>3X#+r#`ijQFAIi|$Zo@e z4h>n3K!9PopS*h3Y?lRHNWsYG9jah_!IV}5kGylvIjC_oQ|w&Z6JV&v^{4%&KO=53 z`8?DSB&<RrZezlMRPLH+Rgu$f4>Xi+$0_on!M_TuhzHjk)fui>NPhPi7;d@mP%ME* zCm8B;)|h2h$yGgh&2&Zy9CN7JEv%+c8*o#&fBNcJ?wB3913l`3w;8G9xCnA%Rs>__ z&mQ%ytYgh{MemhiMr8TA1Kd?-zGvVJj8#^U%5$87#tm4vw36~~-62p;4nL5ll3KAj zNxLFjD^q`RBUbX`&&=d-qPiPl1Xhw+#T;o9k-A42ZaocEj@ZK=l^jJddB;k&BY!PJ zMp?amYm&Wd=#IKHZL2KV>K5q{xAKh9DbMc|aD9bLx^<=W5=m=lkw~B2Jw;LxA`<T? z59m5o{W4D}$wQTXb6$V7lpW&EsZxxiW{i)sKI7&cfO~RlO2wl9h=wuTp8o(^v8Z`# z9_CT*2PU&j;nam-iaQRK+wFPcV5#!6PTy5qDTJ~~z1N}!`F|7Mt!th(dF`RM5Q!2< z^2J+eQ|(;6<;-1J=Zq4oiqDr)jS2w@I0@9`*0k!i7i3J~7Sm<<g~h`Lg^P^$I3w__ zJ9*yTJ+A)%z34#fYnuMnn|S*>D)Y*P82swwcdtHWk}(h-ozJ~<REwWW8Yx8=yhS`R z*@3u;0|UVv*Eo|9PSz)mN2N=3a?)dTrI#m)sG>ETum^$p*7VmTY|eQuXLLX9GDNPU zfa4AC-k))P_j_H^G}wVYMG6i+o&D;pvNW=sk?qe~tl{!h<a<`vFy+*B#mW1qH+r7c z)Oa(*dS;Cj{{U-+o_PQW;C;&Euy!)weN8^y00o+{t4=i|%FQ7w9lg(qp>}Z`3RY2u zW?Y(~a**6xtg!~jKQ}dj9m_1AF6CT<xOEk;9n@w694bQX&Pn9dD0?)LFG&%zyqMg- zDC0QASy*J2H5uJimBvO!K;(+H*J_LsJ;et?cs09PXlA^|q^j=wm&-niI27e*<YB+H zQIbY$h9F=XS7sSiIpe6PaV;^II%S2!GYG=AMhYBMw%!-E@(jOdagIp9sAJ!da7YKO zZrMy4GZ_Jtj+L{-RE#X76x&j|GGozgp|~unPaRvF)uASGt1-z0U{%LW(*Rp)^vE3I zs0%|K!3Y_n8R~hiZg)5DJDW=VN`}T!Hu)PUqdNsbEGpYrsZtIweJi53Rgj;Mx66!? zRVRrc`AG%3{KBryBRv_I*72e$Msis5p4E2B!|d_ooT=j;^*y>o$2&3aTFQ}_RA68p zC|YhSUt=0OVHAbO-aeH)&@|E@ARm{|3cf7jBO@S|&fIZ|l-lPF#~$3)od{9Xhfaxh z;DeRxNq21<&(F*W;5hA8Y#<GB<d*XHkP9B3#;x92ExgSin6m{xc}E7W5q}XiEVMA6 z!}@g6Y<oz-?}Y-Qm%zGQq1gdUb`EP{h!c)J>VR=hX*Oktdev5|4W!9XjFHc3`ash( z7-Eggiwopuur<tFTq@hJOKtAmaBIE1PqbRe6Ba8V!5QN<z|9<%x3XKxyI62N>%R>? zcr_=f=3?mDeD=`HfdWcN`5d0j$Q7q-cH=p9?oCwKrf15Gjw-|~V;~HDI#%u{Jy*<$ z?js<EPq=!H^?&WG_A6&3Y1em|)z9Nq9HERbW7D9bGz1PlZi9-rO~+%3QBq3%4ety< zlIpLqiAaGtBLw<!+PfIG#^95TayZERs|P~U8phwvZ}qbM?{7-l$vhK}P(^r{s*0sn z*2mFc={i)Bd$BLP=_47CvZ%mQ+M~3JM_>-`QV(jC*lpnF)Ks?Ykf9O%<IW9n&Rntc zI}&nbotRL>j=0)7ijiWC+z0tk{p<{yqXe=^GZ``fILD<}d3K@NYt3z`9UQs`+2TOs zVzQp>IUh=o?2-9{o(F1;S=i$lK7+kHNHe!-4UW{4njMho<V70*zyq~smw2M{FhemQ z6WXjwgB&@}p*<?3y+#geNJl}YG9t^IARvrnj+E)6z~ErwuEk?3g$k-&hd{$8@TL0< z@?<<)aon1vG@j$Ri?EeB2RZ#I`H>VA<FNIufnjM5)s^H{Jy>!F)}y$w5S{=a{{R+v zHMh2l(4JD9Mn5cvVk86Q7|!GVb5bb*dJs>gFxtG5C;$+9=B`GnA`zSdzTDGtNnBRc zgn-y`h^jDl_NcSj0rtf`gO@4*1J<R9KvR;u_wFh4X?8AA&me1cPb?`>$sNzVR3WqT z4r<Yn3EDZuM(9a7I24rog^c^s=@`d5_~WRmu)@G)vs$+i<yDuc<B?7BcLK)<r?9N# z>}ef{AYtZh9OJcJEJt23P^4)I%JZLE5xm#OAb&c=>T6<ft+iMXLv$JbbuMr@$rP!v zK#vC*{He|X2X8<s8xd0OQpe>d1F)*nIhgHL;EI)`+aLk3eMhB46_JTk#yVBS1fN1C zk7*d~PiccfBmU_pp#F5BNj}uzu?29*S%~0+(zQ;+Zf7xPV2PI8a1?hnVJuz#X+et| zW4>xsiDFSArT}aP9=_EpTuZxl-N*f*oYgnjNnMc-E-n>veNS2piU=+Xb>JKyYKNWN zxChWwm<6{02fZTfEvrn5;E+|ij8%>Z<2m-Im(XVf^)#M)1|fJw>r&ZjB)fJlNI9rX zgsJBlroHA)8#wJy$#SG%Fcg)_u=8%X$$Xzo)GnkClpOtPKRE##n<wj1EyO(wb5(Xb z5HXXkO#)BOq?Sb}0+E63P^*I63TT#zgvWPIy@fqy8?rz+>}oc31MtA87?IwDOGSp5 z9tUn|$#Mq=ty25Pf<+9WfE_W^)3G)*Mbh*m6z976SLIv-o;sS%Qi{KLlkG~faxhIR z38GiHF2pb+9gQ$c#uoyUYPZf`lh@XzjZ^;suS`}VUE@DK0pRAGt0T76>HXtYmL*pt zVTU7;PYS9%G5HEkLs2VCvIGgenZ0w+RBsv}4$ZlU@7kX%(Z`$;>}ss8smqcW^Ni4w z9f%|Z5+hO1zgnRzfMr+}_2#TeI&-tFRcR7$l0`nowu&N5&4r4LK1%i5n%0|Bw)=9; zr&uMj?Al|H`HFbPdHhXfTitz{Mw7}(7!Q+wAx?VZq4ek0nH%nJb6%C&Je13rU<m~B zImI$)T_TQBcSgX4Jm4PV_5Eq~mtSR_B=Xiky;Zs}?hQvH<Po$CoYbRNsu-<-ij)$Y zg0~JZarxq)4p$%n&$UXA$QYr7NuvQ+7AF94k)C}iT1K8$k%ER}leIt}kl<2zfP;~q z!laFq1!0iky*Q{fNK1gBLoZ6K#{eDK&u>beSqp-s4!O-%Z%PnN>N+(tI1AKs$;VD< z#1cuzB<7+VQ<ch`kJgz9jyWFw)ite!#-VVKTgFV1FjZW2C*G?Gdf;O<VjJgyGaluW zJUBF(eE~GdwGATkNxge}xXe<i<$wC)iegHtHoD{<r!^JEqdn`ExOR~GvB~`EdkA8g z%DVL&9Q3T(X?w=B-Sk2hj{$N(QN}sR{*>s7INEXv_N@&|OkFy5w>V}1Wruu#f2~nw z5sU$j{8nl6Ee);8^(?~!LVj7)dW`j}VNA)gVmf@A0PF8raWQud*j3Xhfk9sNn@;Ab zriqfmIGZwK=~6qzlN?|v6-GJam7APnKJ^~YDNC~wPo+Lq-mI52mWaA$Ff$-wmEe)j z>s2L~TpWGkDi1VBM!-~KocE|VlPCk_=e2DZSi#h|`<VC5yh5?3A1afMp7g8?(y@XM zEm#0ibGQ8WtCrw6!2prm_oqF_mxWcw(yN*DBiXIlS!^Xg>la|BEDIE$G6%>YbI|rR zp!WOinq*=bMo2t^Q6y?)2cYA3bMHc%WjbjIZKvCVx^uaYI2E;TExb{Hk%a(pfr_JR z0C3<Oa9ch2rI!##yOWNUjQ!_k&0%P*5qjfRSYt9sPdypACa6BNO}@y1VjCsBzt8im zYm3*CUG4L8z&$DyosfdPeQCyodYQ_*zJ~M{YjKiE$sH?KOpW9lQHa1eu6s=)^5G#r zyOFvw^!!D2I!qErcd^+?RXmTSbJmKD>}yV^G8)QoQc=4j9eP%6&8)o<Ngkt$=oCD; ze5eRAc+Dc+CE_$*Pyi06sjOpF$DypF%yHKX9j;8TgZ;pAe;Uq|z1x;W0TFi)IKa+7 zt#sO^g>FGBl{n8_*EaT>0apg7`EHc~01h~=%5sdA(aku?79oNkwEpQ>pgkY1J@H#U zPWW<2RqO|9qiqW3jOV_4nz<{qDij_nWWp%Sp4DR{D;ysFwMJ5pAyj7ER~*&rhbrPh z^8k5M(A5<SG_1e{Jf13(eMfG^HV&Qn&nBma-RHp>`kIzF1cU}WRm;1Cw}3?o6=1xR zR@se=nImP~3F+3Y*g~wbw4({P0I(fug~ij(*>jQr9WlVC{h`(kfbdN=n?&_AMd<#| zlFm3I%#1fm7v>;)(%7TMK<ki34N<l{ocHNkut-FE`;IF%xpp*8;s;>mh^uhGCzVSO z0OZvamD!m_03({cX8DkN3e_@fOFRi07E}P|jEc-MpF48n(2UlV#KeuKk<S&0ET6vE zgJ~xjqzxB*$z(ziwxB%+O1Bi!T3albQeC$0&qMU6-IMGJs}NG71&3BXrm1W@K_nka zgt>=z6IbSat-P5W<ma_rhTX#QGrF^F31R^`#ckQk=DNl@o(^k88zAPm1bby6NeaUx z4@#qX^TuBsw|rKFgPi7~k`Q4y@9S2OKO&j~8YmslHFg;?0AfHDP^y&yaz3>(g3PK8 zIHJN#)K$uc#xgjks`jezPvwBSbCXtEsQ0I%VRn$mx65(HMJyzvI*@bRRLzx(ApF2} zs`m13a_6Z#O*`smB<x2p+r5VYx#>_dXQK2yYSq>i^U3<v19gXG$6rdhJM21ZO-WmY z$UmKC>N;hm_}mK#K>PUUf5NP8W?`1k){u|l9s5+p$}Z`eN->hNS{$wBiFaywh{!tb zUW8Qx9D#^<*bbP*dIH?M3JT+qgOQp?5nKh3r#S9wsbi&Yc^p#9<9~IWMWuz^+XRXS z+I!b$qxf|#(Pg<|B%_c!ElC`OK>AjNlNo{c8RxZg*2T_h%S3BS0ZuQO>d>Gz@G>dD z`Hi%k6Wr7?9j-d^YE}!CWi9K?bKO|!Y1~waoc08N6-rbh?SH+Vqn;`8vmhiMt5qkP zWQQ3f^ITPGIm*WL;bboMUNT3$OBDWLUHv;%c^vd4?jx-v3QK@aMP+Rnt2D|fUz0zT zM6o*ZNhI{*pAExWvbtchoQ#Z$m1mHG*&O!8O0tO!6&~JKf0cO0BvB2MAriRU6mSh% z^BKqo9MqFasRjy?ahjJ=rDO>Z2&R?y#UA;6M{0p?rO86XNt_IGN|$rSUPz=dw$cF= zR@@mI%#)M+%_RkEveS1hG2NA7OOB+9dd<iMcP2TiKWHfBRCPExsnnSxX3qrTrAEcF zb$fn%vcq@bRpo+s=5|oRFmsk8`P6Ko2FSn+-Ooy$WtKQZOu@kGk=C}0Xw9OGQW?3< z)!mcoYSQdr03(Cb6(U+gG)(HIG6)${>+Ml_K1{`Plj~Z_Nv#Q6j}ZmtGCq{#jo+yR z{*@q)c*r>7r9}$9!>_$#&N~&F*@!#3imfzlmD|*Htsx;iV*}Ed2}dlydmJB1iAj|g zV=rqH&tuZ9Ll>4o>T^g@OY_tkxXtCq@`1UB9@MUA*#kBhfyOEeyU!p1s;+yft1|!* zaG`e$k_}W#Wmah$mIF0OE~IW!h8bAy<Y(WdTu8!<6O)dV@q#x2jx&mCWA7fdZbPtO z0gQfCT4*I%Sw{>G4i0Mh+TSkTDl)+i6k?oYOA8x&WQC-^NdlE3Hc`Q9r85#Xg#mNH z_N#9(;x;6Y(0&xz6eYNFPU$iL9WW~HLeZJQa7)yP3%5cAAz%(R{W+&DN)w)FY}F1e z*l|_lCz^X43aakGw*o;O2&H3GG0S)6pnSKkDstKRk0koiU=fp5YYeJm80cxfQyz_q zu;YR6OSA>eJBq|eN-h}F!*h|%K`!D$XTB+`AznLB1+<U`JJWc<z|JszX{4U@7n|4$ zX^_y6iL#+jQhvNtF8uOo44)~$s^!TwR=Ew>vAk2a5;zqKKg)~`y?fM%-!?HrLfn}{ zky9ijwoY^CDVZ^VPdOQ>W4Q@}S2Ygfv0^lQbU#XYftY;k6n$!(x{Qj1fyHKAUClo% z=N^=lWXg6%g!5WL#bZ0zckC-Bc^TZ2**VQDQYyY>QtRoQRcndz%*deu>^ch8F|#w1 j7v^AcI#dNqA5uC|<}m<nJoTrfV|Ga=HLk{dw?F^c3Es^I diff --git a/packages/client/assets/label-red.svg b/packages/client/assets/label-red.svg index 45996aa9ce..4b95a931a3 100644 --- a/packages/client/assets/label-red.svg +++ b/packages/client/assets/label-red.svg @@ -1,6 +1 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" - y="0px" width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve"> -<polygon fill="#ea2412" points="0,45.255 45.254,0 84.854,0 0,84.854 "/> -</svg> +<svg width="96" height="96" xmlns="http://www.w3.org/2000/svg"><path fill="#eb6f92" d="M0 45.255L45.254 0h39.6L0 84.854z"/></svg> diff --git a/packages/client/assets/label.svg b/packages/client/assets/label.svg index b1f85f3c07..e076c6baf8 100644 --- a/packages/client/assets/label.svg +++ b/packages/client/assets/label.svg @@ -1,6 +1 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" - y="0px" width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve"> -<polygon fill="#0B8AEA" points="0,45.255 45.254,0 84.854,0 0,84.854 "/> -</svg> +<svg width="96" height="96" xmlns="http://www.w3.org/2000/svg"><path fill="#31748f" d="M0 45.255L45.254 0h39.6L0 84.854z"/></svg> diff --git a/packages/client/assets/remove.png b/packages/client/assets/remove.png deleted file mode 100644 index c2e222a0fc7b983c77bc87fe36b1f90a848dfba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pWm85kOx85n;42huMY7)lKo7+xhXFj&oCU=Yur6o1qWsFo?o+ueoXe|!I#{XiaP zfk$L90|U1(2s1Lwnj--eWH0gbb!C6V&c`Pr@#*(XW}wh)PZ!4!jq|+|9l4qf1YFZa zUxZ#cymxYjSl3?fm$ES)m#a+{h^6l8SjlyC%Kj4{?w?ng$+1am@exC#PYYDK>mqne zxp!SYG}W6&B9C37^mvQIXJKuxUJgs+uCiNoj;mu=q!lgfS{APy-5SK1cl-HP+oYqM z!n?0E^Hs0$S$ROa)MfszC8AxI)5V@QXZ@2Y{j|BMNXP$PMU{^07yGSoPDj`OXBGlF zQ?<l3q9i4;B-JXpC>2OC7#SE^=o*;o8k&R{nphbbSQ(jU8yHv_7-TA^@S|wR%}>cp XtHiBAqVCRSpaup{S3j3^P6<r_1|^C~ diff --git a/packages/client/assets/unread.svg b/packages/client/assets/unread.svg deleted file mode 100644 index 8c3cc9f475..0000000000 --- a/packages/client/assets/unread.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" - y="0px" width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve"> -<circle fill="#3AA2DC" cx="16.5" cy="16.5" r="6"/> -</svg> diff --git a/packages/client/src/components/MkChatPreview.vue b/packages/client/src/components/MkChatPreview.vue index 13e0d92317..4d694f2dc6 100644 --- a/packages/client/src/components/MkChatPreview.vue +++ b/packages/client/src/components/MkChatPreview.vue @@ -103,11 +103,7 @@ function isMe(message): boolean { } &:not(.isMe):not(.isRead) { - > div { - background-image: url("/client-assets/unread.svg"); - background-repeat: no-repeat; - background-position: 0 center; - } + background-color: var(--accentedBg); } &:after { diff --git a/packages/client/src/pages/messaging/messaging-room.message.vue b/packages/client/src/pages/messaging/messaging-room.message.vue index e8cffc061e..f97e708fe7 100644 --- a/packages/client/src/pages/messaging/messaging-room.message.vue +++ b/packages/client/src/pages/messaging/messaging-room.message.vue @@ -14,7 +14,7 @@ :title="i18n.ts.delete" @click="del" > - <img src="/client-assets/remove.png" alt="Delete" /> + <i style="color: var(--accentLighten)" class="ph-x-circle ph-fill ph-lg"></i> </button> <div v-if="!message.isDeleted" class="content"> <Mfm From 11c00946b54038d5fe7d0a44a415c8a4ce6fff35 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Sat, 17 Jun 2023 13:18:19 -0400 Subject: [PATCH 047/309] fix --- packages/client/src/pages/antenna-timeline.vue | 1 - packages/client/src/pages/user-list-timeline.vue | 1 - packages/client/src/style.scss | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/client/src/pages/antenna-timeline.vue b/packages/client/src/pages/antenna-timeline.vue index 3bfa972085..2100be8bff 100644 --- a/packages/client/src/pages/antenna-timeline.vue +++ b/packages/client/src/pages/antenna-timeline.vue @@ -160,7 +160,6 @@ definePageMetadata( > .tl { background: none; border-radius: var(--radius); - overflow: clip; } &.min-width_800px { diff --git a/packages/client/src/pages/user-list-timeline.vue b/packages/client/src/pages/user-list-timeline.vue index 352e5d6838..7b33e8c282 100644 --- a/packages/client/src/pages/user-list-timeline.vue +++ b/packages/client/src/pages/user-list-timeline.vue @@ -127,7 +127,6 @@ definePageMetadata( > .tl { background: none; border-radius: var(--radius); - overflow: clip; } &.min-width_800px { diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 6855d6f9b3..db677f2447 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -634,7 +634,7 @@ hr { } :not(.noGap):not(._block) > { - .note-container, .cmuxhskf > section, ._gap > ._block, .noGap, .profile, .card { + .note-container, .cmuxhskf > section, ._gap > ._block, ._panel, .noGap, .profile, .card { &:not(.caution) { box-shadow: 0 4px 25px rgba(0,0,0,0.04); From e0c7c8f49d597e792847bce30993c4b198ad950b Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Sat, 17 Jun 2023 14:59:19 -0400 Subject: [PATCH 048/309] dot inside renote button when renoted --- packages/client/src/components/MkRenoteButton.vue | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/client/src/components/MkRenoteButton.vue b/packages/client/src/components/MkRenoteButton.vue index c990e84e73..0862ede3cc 100644 --- a/packages/client/src/components/MkRenoteButton.vue +++ b/packages/client/src/components/MkRenoteButton.vue @@ -266,6 +266,17 @@ const renote = (viaKeyboard = false, ev?: MouseEvent) => { color: var(--accent) !important; opacity: 1 !important; font-weight: 700; + i { + position: relative; + &::after { + content: ""; + position: absolute; + inset: 42% 35%; + margin-top: 1px; + background: currentColor; + border-radius: 1em; + } + } } } </style> From 24390f1d99616c92589e324a317c48fe383689b0 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Sat, 17 Jun 2023 16:35:11 -0400 Subject: [PATCH 049/309] reply line fixes --- packages/client/src/components/MkNote.vue | 5 +++-- packages/client/src/components/MkNoteSub.vue | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 8bf8fae62a..faca815291 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -619,10 +619,11 @@ defineExpose({ .line::before { content: ""; display: block; - margin-bottom: -10px; + margin-bottom: -4px; margin-top: 16px; - border-left: 2px solid var(--X13); + border-left: 2px solid currentColor; margin-left: calc((var(--avatarSize) / 2) - 1px); + opacity: .25; } } } diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue index 62fcf7b349..e4f3f4d094 100644 --- a/packages/client/src/components/MkNoteSub.vue +++ b/packages/client/src/components/MkNoteSub.vue @@ -431,6 +431,7 @@ function noteClick(e) { > .avatar-container { margin-right: 8px; + z-index: 2; > .avatar { flex-shrink: 0; display: block; @@ -651,10 +652,11 @@ function noteClick(e) { flex-grow: 1; margin-bottom: -10px; pointer-events: none; + opacity: .25; &::before { content: ""; position: absolute; - border-left: 2px solid var(--X13); + border-left: 2px solid currentColor; margin-left: calc((var(--avatarSize) / 2) - 1px); width: calc(var(--indent) / 2); inset-block: 0; @@ -692,11 +694,12 @@ function noteClick(e) { z-index: 2; left: 0; top: 0; + opacity: .25; &::after { content: ""; position: absolute; - border-left: 2px solid var(--X13); - border-bottom: 2px solid var(--X13); + border-left: 2px solid currentColor; + border-bottom: 2px solid currentColor; margin-left: calc((var(--avatarSize) / 2) - 1px); width: calc(var(--indent) / 2); height: calc((var(--avatarSize) / 2)); From ad4c43b3f4f480e5b972e0dcc78315cec82e50af Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Sat, 17 Jun 2023 21:21:58 -0400 Subject: [PATCH 050/309] fix overflow --- 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 db677f2447..32975920ab 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -53,6 +53,7 @@ html { text-size-adjust: 100%; tab-size: 2; scroll-padding: 60px; + overflow-x: clip; &.useSystemFont { font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; From f53d8b7e1da796675b1b779d56340548b8c8f517 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Sat, 17 Jun 2023 21:41:41 -0400 Subject: [PATCH 051/309] fix user preview menu color --- packages/client/src/components/MkUserPreview.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkUserPreview.vue b/packages/client/src/components/MkUserPreview.vue index 77f0f4ad68..bea0268615 100644 --- a/packages/client/src/components/MkUserPreview.vue +++ b/packages/client/src/components/MkUserPreview.vue @@ -42,7 +42,7 @@ /> <div class="title"> <MkA class="name" :to="userPage(user)" - ><MkUserName :user="user" :nowrap="false" + ><MkUserName :user="user" :nowrap="true" /></MkA> <p class="username"><MkAcct :user="user" /></p> </div> @@ -241,7 +241,7 @@ onMounted(() => { > .avatar { display: block; position: absolute; - top: 62px; + top: 70px; left: 13px; z-index: 2; width: 58px; @@ -388,6 +388,7 @@ onMounted(() => { top: 8px; right: 8px; z-index: 3; + color: white; } } } From 020c4f578827e2391b35cd102ee197cc037c0382 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Sat, 17 Jun 2023 22:22:35 -0400 Subject: [PATCH 052/309] Prevent white flash during loading screen no longer have to deal with getting flashbanged every time! :D --- packages/backend/src/server/web/style.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/backend/src/server/web/style.css b/packages/backend/src/server/web/style.css index 5072e0ad4e..6b5f267727 100644 --- a/packages/backend/src/server/web/style.css +++ b/packages/backend/src/server/web/style.css @@ -2,6 +2,11 @@ html { background-color: var(--bg); color: var(--fg); } +@media (prefers-color-scheme: dark) { + html { + --bg: rgb(17, 17, 27); + } +} #splash { position: fixed; From 68cc264f5f25353fbd5df3ccb23cfe5a93c49564 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Sun, 18 Jun 2023 12:51:51 -0400 Subject: [PATCH 053/309] don't broadcast poll updates --- .../src/queue/processors/ended-poll-notification.ts | 7 +++++-- packages/backend/src/remote/activitypub/models/note.ts | 4 ---- .../backend/src/server/api/endpoints/notes/polls/vote.ts | 4 ---- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/packages/backend/src/queue/processors/ended-poll-notification.ts b/packages/backend/src/queue/processors/ended-poll-notification.ts index 9fe57d8da3..e3d860ac82 100644 --- a/packages/backend/src/queue/processors/ended-poll-notification.ts +++ b/packages/backend/src/queue/processors/ended-poll-notification.ts @@ -1,9 +1,9 @@ import type Bull from "bull"; -import { In } from "typeorm"; -import { Notes, Polls, PollVotes } from "@/models/index.js"; +import { Notes, PollVotes } from "@/models/index.js"; import { queueLogger } from "../logger.js"; import type { EndedPollNotificationJobData } from "@/queue/types.js"; import { createNotification } from "@/services/create-notification.js"; +import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; const logger = queueLogger.createSubLogger("ended-poll-notification"); @@ -32,5 +32,8 @@ export async function endedPollNotification( }); } + // Broadcast the poll result once it ends + await deliverQuestionUpdate(note.id); + done(); } diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 73589125b4..3d2ec0b07b 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -17,7 +17,6 @@ import { extractPollFromQuestion, updateQuestion } from "./question.js"; import vote from "@/services/note/polls/vote.js"; import { apLogger } from "../logger.js"; import { DriveFile } from "@/models/entities/drive-file.js"; -import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { extractDbHost, toPuny } from "@/misc/convert-host.js"; import { Emojis, @@ -334,9 +333,6 @@ export async function createNote( `vote from AP: actor=${actor.username}@${actor.host}, note=${note.id}, choice=${name}`, ); await vote(actor, reply, index); - - // リモートフォロワーにUpdate配信 - deliverQuestionUpdate(reply.id); } return null; }; diff --git a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts index 0558aa1b8f..40535d3401 100644 --- a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts +++ b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts @@ -4,7 +4,6 @@ import { createNotification } from "@/services/create-notification.js"; import { deliver } from "@/queue/index.js"; import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import renderVote from "@/remote/activitypub/renderer/vote.js"; -import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { PollVotes, NoteWatchings, @@ -178,7 +177,4 @@ export default define(meta, paramDef, async (ps, user) => { pollOwner.inbox, ); } - - // リモートフォロワーにUpdate配信 - deliverQuestionUpdate(note.id); }); From 4c9153fd1459201775ba490cda3a000859d6149c Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Sun, 18 Jun 2023 17:14:38 -0400 Subject: [PATCH 054/309] add refresh button to poll --- .../backend/src/models/repositories/note.ts | 2 +- .../src/remote/activitypub/models/note.ts | 2 +- .../src/remote/activitypub/models/question.ts | 22 ++++++----- .../src/server/api/endpoints/ap/show.ts | 38 ++++++++++++------- packages/client/src/components/MkPoll.vue | 31 ++++++++++----- 5 files changed, 61 insertions(+), 34 deletions(-) diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts index 3be4524933..453179bd6f 100644 --- a/packages/backend/src/models/repositories/note.ts +++ b/packages/backend/src/models/repositories/note.ts @@ -28,7 +28,7 @@ import { import { db } from "@/db/postgre.js"; import { IdentifiableError } from "@/misc/identifiable-error.js"; -async function populatePoll(note: Note, meId: User["id"] | null) { +export async function populatePoll(note: Note, meId: User["id"] | null) { const poll = await Polls.findOneByOrFail({ noteId: note.id }); const choices = poll.choices.map((c) => ({ text: c, diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 3d2ec0b07b..26aa5bf544 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -13,7 +13,7 @@ import type { import { htmlToMfm } from "../misc/html-to-mfm.js"; import { extractApHashtags } from "./tag.js"; import { unique, toArray, toSingle } from "@/prelude/array.js"; -import { extractPollFromQuestion, updateQuestion } from "./question.js"; +import { extractPollFromQuestion } from "./question.js"; import vote from "@/services/note/polls/vote.js"; import { apLogger } from "../logger.js"; import { DriveFile } from "@/models/entities/drive-file.js"; diff --git a/packages/backend/src/remote/activitypub/models/question.ts b/packages/backend/src/remote/activitypub/models/question.ts index 520b9fee94..f5855c3e7c 100644 --- a/packages/backend/src/remote/activitypub/models/question.ts +++ b/packages/backend/src/remote/activitypub/models/question.ts @@ -1,7 +1,7 @@ import config from "@/config/index.js"; import Resolver from "../resolver.js"; import type { IObject, IQuestion } from "../type.js"; -import { isQuestion } from "../type.js"; +import { getApId, isQuestion } from "../type.js"; import { apLogger } from "../logger.js"; import { Notes, Polls } from "@/models/index.js"; import type { IPoll } from "@/models/entities/poll.js"; @@ -47,11 +47,14 @@ export async function extractPollFromQuestion( /** * Update votes of Question - * @param uri URI of AP Question object + * @param value URI of AP Question object or object itself * @returns true if updated */ -export async function updateQuestion(value: any, resolver?: Resolver) { - const uri = typeof value === "string" ? value : value.id; +export async function updateQuestion( + value: string | IQuestion, + resolver?: Resolver, +): Promise<boolean> { + const uri = typeof value === "string" ? value : getApId(value); // Skip if URI points to this server if (uri.startsWith(`${config.url}/`)) throw new Error("uri points local"); @@ -65,22 +68,23 @@ export async function updateQuestion(value: any, resolver?: Resolver) { //#endregion // resolve new Question object - if (resolver == null) resolver = new Resolver(); - const question = (await resolver.resolve(value)) as IQuestion; + const _resolver = resolver ?? new Resolver(); + const question = (await _resolver.resolve(value)) as IQuestion; apLogger.debug(`fetched question: ${JSON.stringify(question, null, 2)}`); if (question.type !== "Question") throw new Error("object is not a Question"); const apChoices = question.oneOf || question.anyOf; + if (!apChoices) return false; let changed = false; for (const choice of poll.choices) { const oldCount = poll.votes[poll.choices.indexOf(choice)]; - const newCount = apChoices!.filter((ap) => ap.name === choice)[0].replies! - .totalItems; + const newCount = apChoices.filter((ap) => ap.name === choice)[0].replies + ?.totalItems; - if (oldCount !== newCount) { + if (newCount !== undefined && oldCount !== newCount) { changed = true; poll.votes[poll.choices.indexOf(choice)] = newCount; } diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts index fa804802eb..5db775edc1 100644 --- a/packages/backend/src/server/api/endpoints/ap/show.ts +++ b/packages/backend/src/server/api/endpoints/ap/show.ts @@ -1,5 +1,4 @@ import define from "../../define.js"; -import config from "@/config/index.js"; import { createPerson } from "@/remote/activitypub/models/person.js"; import { createNote } from "@/remote/activitypub/models/note.js"; import DbResolver from "@/remote/activitypub/db-resolver.js"; @@ -9,11 +8,13 @@ import { extractDbHost } from "@/misc/convert-host.js"; import { Users, Notes } from "@/models/index.js"; import type { Note } from "@/models/entities/note.js"; import type { CacheableLocalUser, User } from "@/models/entities/user.js"; -import { fetchMeta } from "@/misc/fetch-meta.js"; import { isActor, isPost, getApId } from "@/remote/activitypub/type.js"; import type { SchemaType } from "@/misc/schema.js"; import { HOUR } from "@/const.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js"; +import { updateQuestion } from "@/remote/activitypub/models/question.js"; +import { populatePoll } from "@/models/repositories/note.js"; +import { redisClient } from "@/db/redis.js"; export const meta = { tags: ["federation"], @@ -104,18 +105,29 @@ async function fetchAny( const dbResolver = new DbResolver(); - let local = await mergePack( - me, - ...(await Promise.all([ - dbResolver.getUserFromApId(uri), - dbResolver.getNoteFromApId(uri), - ])), - ); - if (local != null) return local; + const [user, note] = await Promise.all([ + dbResolver.getUserFromApId(uri), + dbResolver.getNoteFromApId(uri), + ]); + let local = await mergePack(me, user, note); + if (local) { + if (local.type === "Note" && note?.uri && note.hasPoll) { + // Update questions if the stored (remote) note contains the poll + const key = `pollFetched:${note.uri}`; + if ((await redisClient.exists(key)) === 0) { + if (await updateQuestion(note.uri)) { + local.object.poll = await populatePoll(note, me?.id ?? null); + } + // Allow refetching the poll after 2 minutes + await redisClient.set(key, 1, "EX", 60 * 2); + } + } + return local; + } // fetching Object once from remote const resolver = new Resolver(); - const object = (await resolver.resolve(uri)) as any; + const object = await resolver.resolve(uri); // /@user If a URI other than the id is specified, // the URI is determined here @@ -123,8 +135,8 @@ async function fetchAny( local = await mergePack( me, ...(await Promise.all([ - dbResolver.getUserFromApId(object.id), - dbResolver.getNoteFromApId(object.id), + dbResolver.getUserFromApId(getApId(object)), + dbResolver.getNoteFromApId(getApId(object)), ])), ); if (local != null) return local; diff --git a/packages/client/src/components/MkPoll.vue b/packages/client/src/components/MkPoll.vue index db4c3350ff..1fdbc7a422 100644 --- a/packages/client/src/components/MkPoll.vue +++ b/packages/client/src/components/MkPoll.vue @@ -34,23 +34,25 @@ </ul> <p v-if="!readOnly"> <span>{{ i18n.t("_poll.totalVotes", { n: total }) }}</span> - <span> · </span> - <a - v-if="!closed && !isVoted" - @click.stop="showResult = !showResult" - >{{ + <span v-if="!closed && !isVoted"> + <span> · </span> + <a @click.stop="showResult = !showResult">{{ showResult ? i18n.ts._poll.vote : i18n.ts._poll.showResult - }}</a - > - <span v-if="isVoted">{{ i18n.ts._poll.voted }}</span> - <span v-else-if="closed">{{ i18n.ts._poll.closed }}</span> + }}</a> + </span> + <span v-if="!isLocal"> + <span> · </span> + <a @click.stop="refresh">{{ i18n.ts.reload }}</a> + </span> + <span v-if="isVoted"> · {{ i18n.ts._poll.voted }}</span> + <span v-else-if="closed"> · {{ i18n.ts._poll.closed }}</span> <span v-if="remaining > 0"> · {{ timer }}</span> </p> </div> </template> <script lang="ts" setup> -import { computed, onUnmounted, ref, toRef } from "vue"; +import { computed, ref } from "vue"; import * as misskey from "calckey-js"; import { sum } from "@/scripts/array"; import { pleaseLogin } from "@/scripts/please-login"; @@ -67,6 +69,7 @@ const remaining = ref(-1); const total = computed(() => sum(props.note.poll.choices.map((x) => x.votes))); const closed = computed(() => remaining.value === 0); +const isLocal = computed(() => !props.note.uri); const isVoted = computed( () => !props.note.poll.multiple && @@ -112,6 +115,14 @@ if (props.note.poll.expiresAt) { }); } +async function refresh() { + if (!props.note.uri) return; + const obj = await os.apiWithDialog("ap/show", { uri: props.note.uri }); + if (obj.type === "Note" && obj.object.poll) { + props.note.poll = obj.object.poll; + } +} + const vote = async (id) => { pleaseLogin(); From 739a80a94e6822e625e1960a028d00245d24acac Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Sun, 18 Jun 2023 18:04:26 -0400 Subject: [PATCH 055/309] shorten cache expire --- packages/backend/src/server/api/endpoints/ap/show.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts index 5db775edc1..0bd3414ee3 100644 --- a/packages/backend/src/server/api/endpoints/ap/show.ts +++ b/packages/backend/src/server/api/endpoints/ap/show.ts @@ -118,8 +118,8 @@ async function fetchAny( if (await updateQuestion(note.uri)) { local.object.poll = await populatePoll(note, me?.id ?? null); } - // Allow refetching the poll after 2 minutes - await redisClient.set(key, 1, "EX", 60 * 2); + // Allow fetching the poll again after 1 minute + await redisClient.set(key, 1, "EX", 60); } } return local; From 6c6be5af78a5f47ddfce4ecd6faf646b65df830e Mon Sep 17 00:00:00 2001 From: PrivateGER <privateger@noreply.codeberg.org> Date: Sun, 18 Jun 2023 22:20:02 +0000 Subject: [PATCH 056/309] Fix missing recursive exclusion --- .dockerignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.dockerignore b/.dockerignore index 34bbaac39b..8aa17c3a89 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,6 +10,7 @@ packages/backend/.idea/vcs.xml # Node.js node_modules +**/node_modules report.*.json # Cypress From f978c9200d787804fe0c7cb43c0a3837a652c99b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 15:54:45 -0700 Subject: [PATCH 057/309] Revert "dot inside renote button when renoted" This reverts commit e0c7c8f49d597e792847bce30993c4b198ad950b. --- packages/client/src/components/MkRenoteButton.vue | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/packages/client/src/components/MkRenoteButton.vue b/packages/client/src/components/MkRenoteButton.vue index 0862ede3cc..c990e84e73 100644 --- a/packages/client/src/components/MkRenoteButton.vue +++ b/packages/client/src/components/MkRenoteButton.vue @@ -266,17 +266,6 @@ const renote = (viaKeyboard = false, ev?: MouseEvent) => { color: var(--accent) !important; opacity: 1 !important; font-weight: 700; - i { - position: relative; - &::after { - content: ""; - position: absolute; - inset: 42% 35%; - margin-top: 1px; - background: currentColor; - border-radius: 1em; - } - } } } </style> From 37be74681266dcf0917e09972c33714417d505bd Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 16:37:46 -0700 Subject: [PATCH 058/309] fix: :lipstick: white foreground on forced black background Remedies the problem introduced by 020c4f578827e2391b35cd102ee197cc037c0382 causing black text to appear over a black-ish background --- packages/backend/src/server/web/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend/src/server/web/style.css b/packages/backend/src/server/web/style.css index 6b5f267727..9b2ee2d9cc 100644 --- a/packages/backend/src/server/web/style.css +++ b/packages/backend/src/server/web/style.css @@ -5,6 +5,7 @@ html { @media (prefers-color-scheme: dark) { html { --bg: rgb(17, 17, 27); + --fg: rgb(224, 222, 244); } } From 8a98888595e8eb6ab8fa9f0b28fa0d959660c14a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 16:55:11 -0700 Subject: [PATCH 059/309] fix: :globe_with_meridians: correct "clear" --- locales/en-US.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index c0fa8465b0..8d2d5e323b 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -830,7 +830,7 @@ useReactionPickerForContextMenu: "Open reaction picker on right-click" typingUsers: "{users} is typing" jumpToSpecifiedDate: "Jump to specific date" showingPastTimeline: "Currently displaying an old timeline" -clear: "Return" +clear: "Clear" markAllAsRead: "Mark all as read" goBack: "Back" unlikeConfirm: "Really remove your like?" From 5f39e4c5752c8b71b16bdab2ffd7e5a892488884 Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Sat, 17 Jun 2023 06:46:05 +0000 Subject: [PATCH 060/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1804 of 1804 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index da20643540..2cba104ac1 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -136,7 +136,7 @@ smtpUser: "Nom d'usuari" smtpPass: "Contrasenya" user: "Usuari" searchByGoogle: "Cercar" -file: "Fitxers" +file: "Fitxer" _email: _follow: title: "Tens un nou seguidor" @@ -2130,3 +2130,4 @@ _dialog: charactersExceeded: "S'han superat el màxim de caràcters! Actual: {current}/Límit: {max}" charactersBelow: 'No hi ha caràcters suficients! Corrent: {current}/Limit: {min}' +removeReaction: Elimina la teva reacció From 24f69de9183a77799c361c87a0d18391f6f0a110 Mon Sep 17 00:00:00 2001 From: NISZOgen <maciekdan06@gmail.com> Date: Sun, 18 Jun 2023 01:40:05 +0000 Subject: [PATCH 061/309] chore: Translated using Weblate (Polish) Currently translated at 95.1% (1716 of 1804 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ --- locales/pl-PL.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index fa5ec88d8c..e82d8532e1 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -2029,3 +2029,4 @@ channelFederationWarn: Kanały nie są jeszcze federowane z innymi serwerami newer: nowsze older: starsze cw: Ostrzeżenie zawartości +removeReaction: Usuń reakcję From 10b90303682e7ea5ab26981a334cf7dfd457062d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 17:46:39 -0700 Subject: [PATCH 062/309] =?UTF-8?q?fix:=20=F0=9F=90=9B=20don't=20allow=20e?= =?UTF-8?q?diting=20a=20post=20on=20another=20account?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/components/MkPostForm.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/client/src/components/MkPostForm.vue b/packages/client/src/components/MkPostForm.vue index 107ef8cdbe..16acfcc1c9 100644 --- a/packages/client/src/components/MkPostForm.vue +++ b/packages/client/src/components/MkPostForm.vue @@ -14,6 +14,7 @@ <i class="ph-x ph-bold ph-lg"></i> </button> <button + v-if="$props.editId == null" v-click-anime v-tooltip="i18n.ts.switchAccount" class="account _button" From 6fd240a76410258b3fabe4040740a6929bf70489 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 18:36:26 -0700 Subject: [PATCH 063/309] =?UTF-8?q?fix:=20=F0=9F=90=9B=20when=20editing=20?= =?UTF-8?q?polls,=20keep=20votes=20for=20unmodified=20choices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/server/api/endpoints/notes/edit.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 28cfff6020..06424907bf 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -33,6 +33,7 @@ import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import renderNote from "@/remote/activitypub/renderer/note.js"; import renderUpdate from "@/remote/activitypub/renderer/update.js"; import { deliverToRelays } from "@/services/relay.js"; +import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { @@ -476,14 +477,19 @@ export default define(meta, paramDef, async (ps, user) => { if (poll.noteVisibility !== ps.visibility) { pollUpdate.noteVisibility = ps.visibility; } - // We can't do an unordered equal check because the order of choices - // is important and if it changes, we need to reset the votes. - if (JSON.stringify(poll.choices) !== JSON.stringify(pp.choices)) { - pollUpdate.choices = pp.choices; - pollUpdate.votes = new Array(pp.choices.length).fill(0); + // Keep votes for unmodified choices, reset votes if choice is modified or new + const oldVoteCounts = new Map<string, number>(); + for (let i = 0; i < poll.choices.length; i++) { + oldVoteCounts.set(poll.choices[i], poll.votes[i]); } + const newVotes = pp.choices.map( + (choice) => oldVoteCounts.get(choice) || 0, + ); + pollUpdate.choices = pp.choices; + pollUpdate.votes = newVotes; if (notEmpty(pollUpdate)) { await Polls.update(note.id, pollUpdate); + await deliverQuestionUpdate(note.id); } publishing = true; } From fe0ceb98c5eaa8bfc03aa87167d7310b0eea2b9f Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 18:36:34 -0700 Subject: [PATCH 064/309] chore: formatting --- packages/client/src/components/MkFollowButton.vue | 4 +--- packages/client/src/components/MkNote.vue | 2 +- packages/client/src/components/MkNoteSub.vue | 4 ++-- packages/client/src/components/MkUserInfo.vue | 5 +---- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/packages/client/src/components/MkFollowButton.vue b/packages/client/src/components/MkFollowButton.vue index 9dc5af4f63..a1c2317e63 100644 --- a/packages/client/src/components/MkFollowButton.vue +++ b/packages/client/src/components/MkFollowButton.vue @@ -30,9 +30,7 @@ <template v-else-if="hasPendingFollowRequestFromYou && user.isLocked" > - <span>{{ - (state = i18n.ts.followRequestPending) - }}</span + <span>{{ (state = i18n.ts.followRequestPending) }}</span ><i class="ph-hourglass-medium ph-bold ph-lg"></i> </template> <template diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index faca815291..7f69117cb2 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -623,7 +623,7 @@ defineExpose({ margin-top: 16px; border-left: 2px solid currentColor; margin-left: calc((var(--avatarSize) / 2) - 1px); - opacity: .25; + opacity: 0.25; } } } diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue index e4f3f4d094..12b8ac4847 100644 --- a/packages/client/src/components/MkNoteSub.vue +++ b/packages/client/src/components/MkNoteSub.vue @@ -652,7 +652,7 @@ function noteClick(e) { flex-grow: 1; margin-bottom: -10px; pointer-events: none; - opacity: .25; + opacity: 0.25; &::before { content: ""; position: absolute; @@ -694,7 +694,7 @@ function noteClick(e) { z-index: 2; left: 0; top: 0; - opacity: .25; + opacity: 0.25; &::after { content: ""; position: absolute; diff --git a/packages/client/src/components/MkUserInfo.vue b/packages/client/src/components/MkUserInfo.vue index dc81b2643c..9c2763e533 100644 --- a/packages/client/src/components/MkUserInfo.vue +++ b/packages/client/src/components/MkUserInfo.vue @@ -46,10 +46,7 @@ </div> </div> <div class="koudoku-button"> - <MkFollowButton - v-if="$i && user.id != $i.id" - :user="user" - /> + <MkFollowButton v-if="$i && user.id != $i.id" :user="user" /> </div> </div> </template> From b179970f15ad95bf3e322c4c857b0edb863ae302 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 19:04:04 -0700 Subject: [PATCH 065/309] fix: :bug: properly index edited post --- packages/backend/src/server/api/endpoints/notes/edit.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 06424907bf..2e1e624025 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -599,7 +599,7 @@ export default define(meta, paramDef, async (ps, user) => { } if (publishing) { - index(note); + index(note, true); // Publish update event for the updated note details publishNoteStream(note.id, "updated", { From 2339c63fcb1f581244043a3df0221718d1350ac6 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 19:38:32 -0700 Subject: [PATCH 066/309] fix: :adhesive_bandage: duplicate update --- packages/backend/src/server/api/endpoints/notes/edit.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 2e1e624025..90a4f4ded1 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -33,7 +33,7 @@ import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import renderNote from "@/remote/activitypub/renderer/note.js"; import renderUpdate from "@/remote/activitypub/renderer/update.js"; import { deliverToRelays } from "@/services/relay.js"; -import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; +// import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { @@ -489,7 +489,8 @@ export default define(meta, paramDef, async (ps, user) => { pollUpdate.votes = newVotes; if (notEmpty(pollUpdate)) { await Polls.update(note.id, pollUpdate); - await deliverQuestionUpdate(note.id); + // Seemingly already handled by by the rendered update activity + // await deliverQuestionUpdate(note.id); } publishing = true; } From cc9e5cada44674e3f698c81113c8e708822d80d2 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 20:11:30 -0700 Subject: [PATCH 067/309] fix: :lipstick: badge style on mobile --- packages/client/src/pages/user/home.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index 4fe2966ce5..ab39ac63f2 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -174,8 +174,8 @@ <span v-if="!user.isAdmin && user.isModerator" v-tooltip.noDelay="i18n.ts.isModerator" - style="color: var(--badge)" - ><i class="ph-bookmark-simple ph-bold"></i + style="color: var(--badge); margin-left: 0.5rem;" + ><i class="ph-bookmark-simple ph-bold ph-lg"></i ></span> <span v-if="user.isLocked" From e2ce197938eafe1abb0077b853f5071789be4de9 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 18 Jun 2023 20:34:57 -0700 Subject: [PATCH 068/309] refactor: :recycle: better edited timestamp display --- locales/ca-ES.yml | 2 +- locales/cs-CZ.yml | 2 +- locales/da-DK.yml | 2 +- locales/de-DE.yml | 2 +- locales/en-US.yml | 2 +- locales/es-ES.yml | 2 +- locales/fi.yml | 2 +- locales/fr-FR.yml | 2 +- locales/ja-JP.yml | 4 ++-- locales/nl-NL.yml | 2 +- locales/pl-PL.yml | 2 +- locales/pt_BR.yml | 2 +- locales/ru-RU.yml | 2 +- locales/zh-TW.yml | 2 +- .../client/src/components/MkNoteHeader.vue | 24 +++++++++++-------- .../client/src/components/global/MkTime.vue | 2 +- packages/client/src/pages/user/home.vue | 9 +++++-- 17 files changed, 37 insertions(+), 28 deletions(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 2cba104ac1..54de37d8be 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -2060,7 +2060,7 @@ _relayStatus: rejected: Rebutjat deleted: Eliminat editNote: Edita la nota -edited: Editat +edited: 'Editat a {date} {time}' findOtherInstance: Cercar un altre servidor signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactivades, però sempre podeu registrar-vos en un altre servidor. Si teniu un codi d'invitació diff --git a/locales/cs-CZ.yml b/locales/cs-CZ.yml index 1fe16135e6..e6394f3ee6 100644 --- a/locales/cs-CZ.yml +++ b/locales/cs-CZ.yml @@ -963,7 +963,7 @@ disablingTimelinesInfo: Administrátoři a moderátoři budou vždy mít příst časovým osám, i pokud jsou vypnuté. deleted: Vymazáno editNote: Upravit poznámku -edited: Upraveno +edited: 'Upraveno dne {date} {time}' silencedInstancesDescription: Vypište hostnames instancí, které chcete ztlumit. Účty v uvedených instancích jsou považovány za "ztlumené", mohou pouze zadávat požadavky na sledování a nemohou zmiňovat místní účty, pokud nejsou sledovány. Na blokované diff --git a/locales/da-DK.yml b/locales/da-DK.yml index 6e83808914..f0e6523ebb 100644 --- a/locales/da-DK.yml +++ b/locales/da-DK.yml @@ -83,7 +83,7 @@ deleteAndEditConfirm: Er du sikker på at du vil slet denne opslag og ændre det vil tabe alle reaktioner, forstærkninger og svarer indenfor denne opslag. editNote: Ændre note deleted: Slettet -edited: Ændret +edited: 'Ændret den {date} {time}' sendMessage: Send en besked youShouldUpgradeClient: Til at vise denne side, vær sød at refresh til at opdatere din brugerenhed. diff --git a/locales/de-DE.yml b/locales/de-DE.yml index e8615b6f58..ba525cf6cb 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -1972,7 +1972,7 @@ silencedInstancesDescription: Liste die Hostnamen der Server auf, die du stummsc wenn sie nicht gefolgt werden. Dies wirkt sich nicht auf die blockierten Server aus. editNote: Beitrag bearbeiten -edited: Bearbeitet +edited: 'Bearbeitet um {date} {time}' silenceThisInstance: Diesen Server stummschalten silencedInstances: Stummgeschaltete Server silenced: Stummgeschaltet diff --git a/locales/en-US.yml b/locales/en-US.yml index 8d2d5e323b..cd29cebda6 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -52,7 +52,7 @@ deleteAndEdit: "Delete and edit" deleteAndEditConfirm: "Are you sure you want to delete this post and edit it? You will lose all reactions, boosts and replies to it." editNote: "Edit note" -edited: "Edited" +edited: "Edited at {date} {time}" addToList: "Add to list" sendMessage: "Send a message" copyUsername: "Copy username" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index a4016b7bb7..6d1d88ffe2 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -1922,7 +1922,7 @@ apps: Aplicaciones migration: Migración silenced: Silenciado deleted: Eliminado -edited: Editado +edited: 'Editado a las {date} {time}' editNote: Editar nota silenceThisInstance: Silenciar esta instancia findOtherInstance: Buscar otro servidor diff --git a/locales/fi.yml b/locales/fi.yml index aa9699cca8..9646231f47 100644 --- a/locales/fi.yml +++ b/locales/fi.yml @@ -831,7 +831,7 @@ makeReactionsPublic: Aseta reaktiohistoria julkiseksi unread: Lukematon deleted: Poistettu editNote: Muokkaa viestiä -edited: Muokattu +edited: 'Muokattu klo {date} {time}' avoidMultiCaptchaConfirm: Useiden Captcha-järjestelmien käyttö voi aiheuttaa häiriöitä niiden välillä. Haluatko poistaa käytöstä muut tällä hetkellä käytössä olevat Captcha-järjestelmät? Jos haluat, että ne pysyvät käytössä, paina peruutusnäppäintä. diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 2e6b1400f9..5a61870c4e 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -2022,7 +2022,7 @@ silencedInstances: Instances silencieuses silenced: Silencieux deleted: Effacé editNote: Modifier note -edited: Modifié +edited: 'Modifié à {date} {time}' flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des personnes aux publications des autres. _experiments: diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index afd290b8cf..617930db17 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1889,13 +1889,13 @@ _experiments: enablePostEditing: 投稿の編集機能を有効にする title: 試験的な機能 postEditingCaption: 投稿のメニューに既存の投稿を編集するボタンを表示し、他サーバーの編集も受信できるようにします。 - postImportsCaption: + postImportsCaption: ユーザーが過去の投稿をCalckey・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。 enablePostImports: 投稿のインポートを有効にする sendModMail: モデレーション通知を送る deleted: 削除済み editNote: 投稿を編集 -edited: 編集済み +edited: '編集済み: {date} {time}' signupsDisabled: 現在、このサーバーでは新規登録が一般開放されていません。招待コードをお持ちの場合には、以下の欄に入力してください。招待コードをお持ちでない場合にも、新規登録を開放している他のサーバーには入れますよ! findOtherInstance: 他のサーバーを探す diff --git a/locales/nl-NL.yml b/locales/nl-NL.yml index 32cd0b730b..45bc36278a 100644 --- a/locales/nl-NL.yml +++ b/locales/nl-NL.yml @@ -413,7 +413,7 @@ selectList: Selecteer een lijst selectAntenna: Selecteer een antenne deleted: Verwijderd editNote: Bewerk notitie -edited: Bewerkt +edited: 'Bewerkt om {date} {time}' emojis: Emojis emojiName: Emoji naam emojiUrl: Emoji URL diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index e82d8532e1..571f6af951 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -1998,7 +1998,7 @@ silenceThisInstance: Wycisz ten serwer silencedInstances: Wyciszone serwery deleted: Usunięte editNote: Edytuj wpis -edited: Edytowany +edited: 'Edytowano o {date} {time}' silenced: Wyciszony findOtherInstance: Znajdź inny serwer userSaysSomethingReasonReply: '{name} odpowiedział na wpis zawierający {reason}' diff --git a/locales/pt_BR.yml b/locales/pt_BR.yml index a02b7069e4..2cc22c86ab 100644 --- a/locales/pt_BR.yml +++ b/locales/pt_BR.yml @@ -30,7 +30,7 @@ showLess: Fechar importRequested: Você requisitou uma importação. Isso pode demorar um pouco. listsDesc: Listas deixam você criar linhas do tempo com usuários específicos. Elas podem ser acessadas pela página de linhas do tempo. -edited: Editado +edited: 'Editado às {date} {time}' sendMessage: Enviar uma mensagem older: antigo createList: Criar lista diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index fe90f23d9b..8b3e05a17e 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -1987,5 +1987,5 @@ apps: Приложения silenceThisInstance: Заглушить инстанс silencedInstances: Заглушенные инстансы editNote: Редактировать заметку -edited: Редактировано +edited: 'Редактировано в {date} {time}' deleted: Удалённое diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index b4a9fea967..d373daf5d9 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -1829,7 +1829,7 @@ indexPosts: 索引帖子 indexNotice: 現在開始索引。 這可能需要一段時間,請不要在一個小時內重啟你的伺服器。 deleted: 已刪除 editNote: 編輯筆記 -edited: 已修改 +edited: '於 {date} {time} 編輯' userSaysSomethingReason: '{name} 說了 {reason}' allowedInstancesDescription: 要加入聯邦白名單的服務器,每台伺服器用新行分隔(僅適用於私有模式)。 defaultReaction: 默認的表情符號反應 diff --git a/packages/client/src/components/MkNoteHeader.vue b/packages/client/src/components/MkNoteHeader.vue index dc8b71d935..b25ffa3292 100644 --- a/packages/client/src/components/MkNoteHeader.vue +++ b/packages/client/src/components/MkNoteHeader.vue @@ -18,17 +18,21 @@ <div class="info"> <MkA class="created-at" :to="notePage(note)"> <MkTime :time="note.createdAt" /> - <MkTime + <i v-if="note.updatedAt" - :time="note.updatedAt" - mode="none" - > - <i - v-tooltip.noDelay="i18n.ts.edited" - class="ph-pencil ph-bold" - style="margin-left: 0.4rem" - ></i> - </MkTime> + v-tooltip.noDelay=" + i18n.t('edited', { + date: new Date( + note.updatedAt + ).toLocaleDateString(), + time: new Date( + note.updatedAt + ).toLocaleTimeString(), + }) + " + class="ph-pencil ph-bold" + style="margin-left: 0.4rem" + ></i> </MkA> <MkVisibility :note="note" /> </div> diff --git a/packages/client/src/components/global/MkTime.vue b/packages/client/src/components/global/MkTime.vue index db53248bb4..5d9295433f 100644 --- a/packages/client/src/components/global/MkTime.vue +++ b/packages/client/src/components/global/MkTime.vue @@ -16,7 +16,7 @@ import { i18n } from "@/i18n"; const props = withDefaults( defineProps<{ time: Date | string; - mode?: "relative" | "absolute" | "detail" | "none"; + mode?: "relative" | "absolute" | "detail"; }>(), { mode: "relative", diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index ab39ac63f2..9e9dfcc7c7 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -174,8 +174,13 @@ <span v-if="!user.isAdmin && user.isModerator" v-tooltip.noDelay="i18n.ts.isModerator" - style="color: var(--badge); margin-left: 0.5rem;" - ><i class="ph-bookmark-simple ph-bold ph-lg"></i + style=" + color: var(--badge); + margin-left: 0.5rem; + " + ><i + class="ph-bookmark-simple ph-bold ph-lg" + ></i ></span> <span v-if="user.isLocked" From a3d26eaf3113e5736326bc743474ab81c1c5af6a Mon Sep 17 00:00:00 2001 From: daikei <daikei@noreply.codeberg.org> Date: Mon, 19 Jun 2023 14:08:34 +0000 Subject: [PATCH 069/309] Allow moderators to see moderation notes --- packages/backend/src/server/api/endpoints/admin/show-user.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index e91f07f838..6eb7d59b90 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -42,6 +42,7 @@ export default define(meta, paramDef, async (ps, me) => { isModerator: user.isModerator, isSilenced: user.isSilenced, isSuspended: user.isSuspended, + moderationNote: profile.moderationNote, }; } From 0bc68a4b6fca9372ff34de858a10d9e5d6276f7d Mon Sep 17 00:00:00 2001 From: daikei <daikei@noreply.codeberg.org> Date: Mon, 19 Jun 2023 14:14:15 +0000 Subject: [PATCH 070/309] Fix formatting --- packages/backend/src/server/api/endpoints/admin/show-user.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index 6eb7d59b90..aa784f264b 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -42,7 +42,7 @@ export default define(meta, paramDef, async (ps, me) => { isModerator: user.isModerator, isSilenced: user.isSilenced, isSuspended: user.isSuspended, - moderationNote: profile.moderationNote, + moderationNote: profile.moderationNote, }; } From 8281817c0f94e02e14b915f0630ef20fadc910f6 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Mon, 19 Jun 2023 12:21:46 -0400 Subject: [PATCH 071/309] fix UI sometimes being offset on mobile --- packages/client/src/ui/universal.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue index cd91c01d92..c9e66cf345 100644 --- a/packages/client/src/ui/universal.vue +++ b/packages/client/src/ui/universal.vue @@ -575,6 +575,7 @@ console.log(mainRouter.currentRoute.value.name); width: 100%; min-width: 0; $widgets-hide-threshold: 1090px; + overflow-x: clip; @media (max-width: $widgets-hide-threshold) { padding-bottom: calc(env(safe-area-inset-bottom, 0px) + 96px); } From d830a6dad320b0ab2be6677c104728f5987e6741 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Mon, 19 Jun 2023 16:50:51 -0400 Subject: [PATCH 072/309] Share dropdown w/ remote copy --- packages/client/src/scripts/get-note-menu.ts | 100 ++++++++++++------- 1 file changed, 64 insertions(+), 36 deletions(-) diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts index 2bffc52461..433291c9cc 100644 --- a/packages/client/src/scripts/get-note-menu.ts +++ b/packages/client/src/scripts/get-note-menu.ts @@ -108,6 +108,11 @@ export function getNoteMenu(props: { os.success(); } + function copyOriginal(): void { + copyToClipboard(appearNote.url ?? appearNote.uri); + os.success(); + } + function togglePin(pin: boolean): void { os.apiWithDialog( pin ? "i/pin" : "i/unpin", @@ -263,32 +268,6 @@ export function getNoteMenu(props: { null, ] : []), - { - icon: "ph-clipboard-text ph-bold ph-lg", - text: i18n.ts.copyContent, - action: copyContent, - }, - { - icon: "ph-link-simple ph-bold ph-lg", - text: i18n.ts.copyLink, - action: copyLink, - }, - appearNote.url || appearNote.uri - ? { - icon: "ph-arrow-square-out ph-bold ph-lg", - text: i18n.ts.showOnRemote, - action: () => { - window.open(appearNote.url || appearNote.uri, "_blank"); - }, - } - : undefined, - shareAvailable() - ? { - icon: "ph-share-network ph-bold ph-lg", - text: i18n.ts.share, - action: share, - } - : undefined, instance.translatorAvailable ? { icon: "ph-translate ph-bold ph-lg", @@ -296,7 +275,6 @@ export function getNoteMenu(props: { action: translate, } : undefined, - null, statePromise.then((state) => state?.isFavorited ? { @@ -356,6 +334,44 @@ export function getNoteMenu(props: { action: () => togglePin(true), } : undefined, + appearNote.url || appearNote.uri + ? { + icon: "ph-arrow-square-out ph-bold ph-lg", + text: i18n.ts.showOnRemote, + action: () => { + window.open(appearNote.url || appearNote.uri, "_blank"); + }, + } + : undefined, + { + type: "parent", + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + children: [ + { + icon: "ph-clipboard-text ph-bold ph-lg", + text: i18n.ts.copyContent, + action: copyContent, + }, + { + icon: "ph-link-simple ph-bold ph-lg", + text: i18n.ts.copyLink, + action: copyLink, + }, + appearNote.url || appearNote.uri ? { + icon: "ph-link-simple ph-bold ph-lg", + text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, + action: copyOriginal, + } : undefined, + shareAvailable() + ? { + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + action: share, + } + : undefined, + ] + }, /* ...($i.isModerator || $i.isAdmin ? [ null, @@ -424,6 +440,15 @@ export function getNoteMenu(props: { ].filter((x) => x !== undefined); } else { menu = [ + appearNote.url || appearNote.uri + ? { + icon: "ph-arrow-square-out ph-bold ph-lg", + text: i18n.ts.showOnRemote, + action: () => { + window.open(appearNote.url || appearNote.uri, "_blank"); + }, + } + : undefined, { icon: "ph-clipboard-text ph-bold ph-lg", text: i18n.ts.copyContent, @@ -434,15 +459,18 @@ export function getNoteMenu(props: { text: i18n.ts.copyLink, action: copyLink, }, - appearNote.url || appearNote.uri - ? { - icon: "ph-arrow-square-out ph-bold ph-lg", - text: i18n.ts.showOnRemote, - action: () => { - window.open(appearNote.url || appearNote.uri, "_blank"); - }, - } - : undefined, + appearNote.url || appearNote.uri ? { + icon: "ph-link-simple ph-bold ph-lg", + text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, + action: copyOriginal, + } : undefined, + shareAvailable() + ? { + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + action: share, + } + : undefined, ].filter((x) => x !== undefined); } From be6a640edbe4079e5584a204a378c066ede378a8 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Tue, 20 Jun 2023 10:30:13 -0400 Subject: [PATCH 073/309] remove gaps ? --- packages/client/src/components/MkReactedUsers.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkReactedUsers.vue b/packages/client/src/components/MkReactedUsers.vue index 97bade8461..23d3aaa7a1 100644 --- a/packages/client/src/components/MkReactedUsers.vue +++ b/packages/client/src/components/MkReactedUsers.vue @@ -1,5 +1,5 @@ <template> - <div v-if="note" class="_gaps reacted-users"> + <div v-if="note" class="reacted-users"> <div :class="$style.tabs"> <button v-for="reaction in reactions" From c05f151b1a77cb5f2e438e5ed65a5ebd9c8686a6 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Tue, 20 Jun 2023 14:13:05 -0400 Subject: [PATCH 074/309] Proper use of focus trap --- packages/client/src/components/MkMenu.vue | 24 ++--- packages/client/src/components/MkModal.vue | 23 ++--- .../client/src/components/MkModalWindow.vue | 99 +++++++++---------- .../client/src/components/MkPopupMenu.vue | 1 - 4 files changed, 63 insertions(+), 84 deletions(-) diff --git a/packages/client/src/components/MkMenu.vue b/packages/client/src/components/MkMenu.vue index dcc6efe7d0..5f0210c1f6 100644 --- a/packages/client/src/components/MkMenu.vue +++ b/packages/client/src/components/MkMenu.vue @@ -1,10 +1,12 @@ <template> <FocusTrap - :active="false" ref="focusTrap" + v-model:active="isActive" :return-focus-on-deactivate="!noReturnFocus" + :initial-focus="() => itemsEl.children[0]" + @deactivate="emit('close')" > - <div tabindex="-1"> + <div> <div ref="itemsEl" class="rrevdjwt _popup _shadow" @@ -14,6 +16,7 @@ maxHeight: maxHeight ? maxHeight + 'px' : '', }" @contextmenu.self="(e) => e.preventDefault()" + tabindex="-1" > <template v-for="(item, i) in items2"> <div v-if="item === null" class="divider"></div> @@ -173,6 +176,7 @@ :root-element="itemsEl" showing @actioned="childActioned" + @closed="closeChild" /> </div> </div> @@ -303,23 +307,7 @@ function close(actioned = false) { emit("close", actioned); } -function focusUp() { - focusPrev(document.activeElement); -} - -function focusDown() { - focusNext(document.activeElement); -} - onMounted(() => { - focusTrap.value.activate(); - - if (props.viaKeyboard) { - nextTick(() => { - focusNext(itemsEl.children[0], true, false); - }); - } - document.addEventListener("mousedown", onGlobalMousedown, { passive: true, }); diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue index 6a66c1787e..0351cdd0fd 100644 --- a/packages/client/src/components/MkModal.vue +++ b/packages/client/src/components/MkModal.vue @@ -14,17 +14,17 @@ :duration="transitionDuration" appear @after-leave="emit('closed')" - @keyup.esc="emit('click')" @enter="emit('opening')" @after-enter="onOpened" > <FocusTrap v-model:active="isActive" + :initial-focus="() => $refs.content" :return-focus-on-deactivate="!noReturnFocus" + @deactivate="close" > <div v-show="manualShowing != null ? manualShowing : showing" - v-hotkey.global="keymap" :class="[ $style.root, { @@ -44,7 +44,6 @@ '--transformOrigin': transformOrigin, }" tabindex="-1" - v-focus > <div class="_modalBg data-cy-bg" @@ -180,7 +179,7 @@ let transitionDuration = $computed(() => let contentClicking = false; -const focusedElement = document.activeElement; +// const focusedElement = document.activeElement; function close(ev, opts: { useSendAnimation?: boolean } = {}) { // removeEventListener("popstate", close); // if (props.preferType == "dialog") { @@ -194,16 +193,16 @@ function close(ev, opts: { useSendAnimation?: boolean } = {}) { if (props.src) props.src.style.pointerEvents = "auto"; showing = false; emit("close"); - if (!props.noReturnFocus) { - focusedElement.focus(); - } + // if (!props.noReturnFocus) { + // focusedElement.focus(); + // } } function onBgClick() { if (contentClicking) return; - if (!props.noReturnFocus) { - focusedElement.focus(); - } + // if (!props.noReturnFocus) { + // focusedElement.focus(); + // } emit("click"); } @@ -211,10 +210,6 @@ if (type === "drawer") { maxHeight = window.innerHeight / 1.5; } -const keymap = { - esc: () => emit("esc"), -}; - const MARGIN = 16; const align = () => { diff --git a/packages/client/src/components/MkModalWindow.vue b/packages/client/src/components/MkModalWindow.vue index 9406d8d4dd..55f9427503 100644 --- a/packages/client/src/components/MkModalWindow.vue +++ b/packages/client/src/components/MkModalWindow.vue @@ -6,58 +6,55 @@ @keyup.esc="$emit('close')" @closed="$emit('closed')" > - <FocusTrap v-model:active="isActive"> - <div - ref="rootEl" - class="ebkgoccj" - :style="{ - width: `${width}px`, - height: scroll - ? height - ? `${height}px` - : null - : height - ? `min(${height}px, 100%)` - : '100%', - }" - @keydown="onKeydown" - tabindex="-1" - > - <div ref="headerEl" class="header"> - <button - v-if="withOkButton" - :aria-label="i18n.t('close')" - class="_button" - @click="$emit('close')" - > - <i class="ph-x ph-bold ph-lg"></i> - </button> - <span class="title"> - <slot name="header"></slot> - </span> - <button - v-if="!withOkButton" - :aria-label="i18n.t('close')" - class="_button" - @click="$emit('close')" - > - <i class="ph-x ph-bold ph-lg"></i> - </button> - <button - v-if="withOkButton" - :aria-label="i18n.t('ok')" - class="_button" - :disabled="okButtonDisabled" - @click="$emit('ok')" - > - <i class="ph-check ph-bold ph-lg"></i> - </button> - </div> - <div class="body"> - <slot></slot> - </div> + <div + ref="rootEl" + class="ebkgoccj" + :style="{ + width: `${width}px`, + height: scroll + ? height + ? `${height}px` + : null + : height + ? `min(${height}px, 100%)` + : '100%', + }" + tabindex="-1" + > + <div ref="headerEl" class="header"> + <button + v-if="withOkButton" + :aria-label="i18n.t('close')" + class="_button" + @click="$emit('close')" + > + <i class="ph-x ph-bold ph-lg"></i> + </button> + <span class="title"> + <slot name="header"></slot> + </span> + <button + v-if="!withOkButton" + :aria-label="i18n.t('close')" + class="_button" + @click="$emit('close')" + > + <i class="ph-x ph-bold ph-lg"></i> + </button> + <button + v-if="withOkButton" + :aria-label="i18n.t('ok')" + class="_button" + :disabled="okButtonDisabled" + @click="$emit('ok')" + > + <i class="ph-check ph-bold ph-lg"></i> + </button> </div> - </FocusTrap> + <div class="body"> + <slot></slot> + </div> + </div> </MkModal> </template> diff --git a/packages/client/src/components/MkPopupMenu.vue b/packages/client/src/components/MkPopupMenu.vue index f2afcecf24..a478007271 100644 --- a/packages/client/src/components/MkPopupMenu.vue +++ b/packages/client/src/components/MkPopupMenu.vue @@ -8,7 +8,6 @@ @click="modal.close()" @closed="emit('closed')" tabindex="-1" - v-focus > <MkMenu :items="items" From 19874ef231c1b677791723600169e1aa45571169 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Tue, 20 Jun 2023 14:41:51 -0400 Subject: [PATCH 075/309] label to close button --- packages/client/src/components/MkModal.vue | 7 ------- packages/client/src/components/MkModalWindow.vue | 1 + 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue index 0351cdd0fd..9f25f9cc40 100644 --- a/packages/client/src/components/MkModal.vue +++ b/packages/client/src/components/MkModal.vue @@ -179,7 +179,6 @@ let transitionDuration = $computed(() => let contentClicking = false; -// const focusedElement = document.activeElement; function close(ev, opts: { useSendAnimation?: boolean } = {}) { // removeEventListener("popstate", close); // if (props.preferType == "dialog") { @@ -193,16 +192,10 @@ function close(ev, opts: { useSendAnimation?: boolean } = {}) { if (props.src) props.src.style.pointerEvents = "auto"; showing = false; emit("close"); - // if (!props.noReturnFocus) { - // focusedElement.focus(); - // } } function onBgClick() { if (contentClicking) return; - // if (!props.noReturnFocus) { - // focusedElement.focus(); - // } emit("click"); } diff --git a/packages/client/src/components/MkModalWindow.vue b/packages/client/src/components/MkModalWindow.vue index 55f9427503..a3dccb7644 100644 --- a/packages/client/src/components/MkModalWindow.vue +++ b/packages/client/src/components/MkModalWindow.vue @@ -27,6 +27,7 @@ :aria-label="i18n.t('close')" class="_button" @click="$emit('close')" + v-tooltip="i18n.ts.close" > <i class="ph-x ph-bold ph-lg"></i> </button> From 526260260c7222dc85d59894dfecfd4623f9a8a0 Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Mon, 19 Jun 2023 05:36:22 +0000 Subject: [PATCH 076/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1804 of 1804 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 54de37d8be..2462cda2cf 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -1786,7 +1786,7 @@ createNew: Crear una nova optional: Opcional jumpToSpecifiedDate: Vés a una data concreta showingPastTimeline: Ara es mostra un línea de temps antiga -clear: Tornar +clear: Netejar markAllAsRead: Marcar tot com a llegit recentPosts: Pàgines recents noMaintainerInformationWarning: La informació de l'administrador no està configurada. From a15e5753b08f97523d7e0117064f01335350045e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Byron=20Fr=C3=B6hlich?= <hallo@byronfroehlich.de> Date: Mon, 19 Jun 2023 18:48:59 +0000 Subject: [PATCH 077/309] chore: Translated using Weblate (German) Currently translated at 99.2% (1791 of 1804 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ --- locales/de-DE.yml | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/locales/de-DE.yml b/locales/de-DE.yml index ba525cf6cb..4a1bcdf565 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -812,7 +812,7 @@ useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen" typingUsers: "{users} ist/sind am schreiben" jumpToSpecifiedDate: "Zu bestimmtem Datum springen" showingPastTimeline: "Es wird eine alte Timeline angezeigt" -clear: "Zurückkehren" +clear: "Leeren" markAllAsRead: "Alle als gelesen markieren" goBack: "Zurück" unlikeConfirm: "\"Gefällt mir\" wirklich entfernen?" @@ -1189,6 +1189,8 @@ _mfm: stop: MFM anhalten warn: MFM können schnell bewegte oder anderweitig auffallende Animationen enthalten alwaysPlay: Alle animierten MFM immer automatisch abspielen + advancedDescription: Wenn diese Funktion deaktiviert ist, können nur einfache Formatierungen + vorgenommen werden, es sei denn, animiertes MFM ist aktiviert _instanceTicker: none: "Nie anzeigen" remote: "Für Nutzer eines anderen Servers anzeigen" @@ -1356,8 +1358,8 @@ _tutorial: der/die auf diesem Server registriert ist." step5_5: "Die Social-Timeline {icon} ist eine Kombination aus der Home-Timeline und der Local-Timeline." - step5_6: "In der {icon} \"Favoriten\"-Timeline können sie Beiträge von Servern sehen, - die von den Server-Administratoren vorgeschlagen werden." + step5_6: "In der Empfohlen-Timeline {icon} kannst du Posts sehen, die von den Admins + vorgeschlagen wurden." step5_7: "In der {icon} Global-Timeline können Sie Beiträge von allen verknüpften Servern aus dem Fediverse sehen." step6_1: "Also, was ist das hier?" @@ -1383,6 +1385,25 @@ _2fa: securityKeyInfo: "Du kannst neben Fingerabdruck- oder PIN-Authentifizierung auf deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels einrichten." + step3Title: Gib deinen Authentifizierungscode ein + renewTOTPOk: Neu konfigurieren + securityKeyNotSupported: Dein Browser unterstützt Hardware-Security-Keys nicht. + chromePasskeyNotSupported: Chrome Passkeys werden momentan nicht unterstützt. + renewTOTP: Konfiguriere deine Authenticator App neu + renewTOTPCancel: Abbrechen + tapSecurityKey: Bitte folge den Anweisungen deines Browsers, um einen Hardware-Security-Key + oder einen Passkey zu registrieren + removeKey: Entferne deinen Hardware-Security-Key + removeKeyConfirm: Möchtest du wirklich deinen Key mit der Bezeichnung {name} löschen? + renewTOTPConfirm: Das wird dazu führen, dass du Verifizierungscodes deiner vorherigen + Authenticator App nicht mehr nutzen kannst + whyTOTPOnlyRenew: Die Authentificator App kann nicht entfernt werden, solange ein + Hardware-Security-Key registriert ist. + step2Click: Ein Klick auf diesen QR-Code erlaubt es dir eine 2FA-Methode zu deinem + Security Key oder deiner Authenticator App hinzuzufügen. + registerTOTPBeforeKey: Bitte registriere eine Authentificator App, um einen Hardware-Security-Key + oder einen Passkey zu nutzen. + securityKeyName: Gib einen Namen für den Key ein _permissions: "read:account": "Deine Nutzerkontoinformationen lesen" "write:account": "Deine Nutzerkontoinformationen bearbeiten" @@ -1451,7 +1472,7 @@ _widgets: trends: "Trends" clock: "Uhr" rss: "RSS-Reader" - rssTicker: "RSS-Laufschrift (Ticker)" + rssTicker: "RSS Ticker" activity: "Aktivität" photos: "Fotos" digitalClock: "Digitaluhr" @@ -2079,6 +2100,9 @@ _experiments: postEditingCaption: Zeigt die Option für Nutzer an, ihre bestehenden Beiträge über das Menü "Beitragsoptionen" zu bearbeiten enablePostImports: Beitragsimporte aktivieren + postImportsCaption: Erlaubt es Nutzer:innen ihre Posts von alten Calckey, Misskey, + Mastodon, Akkoma und Pleroma Accounts zu importieren. Bei Engpässen in der Warteschlange + kann es zu Verlangsamungen beim Laden während des Imports kommen. noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie die Funktion von Calckey stört. indexFrom: Indexieren ab Beitragskennung aufwärts @@ -2109,6 +2133,21 @@ _filters: withFile: Mit Datei fromDomain: Von Domain notesBefore: Beiträge vor + followingOnly: Nur Folgende isBot: Dieses Konto ist ein Bot isModerator: Moderator isAdmin: Administrator +_dialog: + charactersExceeded: 'Maximale Anzahl an Zeichen aufgebraucht! Limit: {current} / + {max}' + charactersBelow: Nicht genug Zeichen! Du hast aktuell {current} von {min} Zeichen +searchPlaceholder: Calckey durchsuchen +antennasDesc: "Antennen zeigen neue Posts an, die deinen definierten Kriterien entsprechen!\n + Sie können von der Timeline-Seite aufgerufen werden." +isPatron: Calckey Patron +removeReaction: Entferne deine Reaktion +listsDesc: Listen lassen dich Timelines mit bestimmten Nutzer:innen erstellen. Sie + können von der Timeline-Seite erreicht werden. +clipsDesc: Clips sind wie teilbare, kategorisierte Lesezeichen. Du kannst Clips vom + Menü individueller Posts aus erstellen. +channelFederationWarn: Kanäle föderieren noch nicht zu anderen Servern From 49142df177cfb337850513d5d5d4602386d65769 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Wed, 21 Jun 2023 12:51:36 -0400 Subject: [PATCH 078/309] Fix show more button being shown when more than 4 images inside CW --- .../src/components/MkSubNoteContent.vue | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index ea1142e13e..ab9c0a366a 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -209,13 +209,19 @@ const emit = defineEmits<{ const cwButton = ref<HTMLElement>(); const showMoreButton = ref<HTMLElement>(); -const isLong = - !props.detailedView && - ((props.note.cw == null && - props.note.text != null && - (props.note.text.split("\n").length > 10 || - props.note.text.length > 800)) || - props.note.files.length > 4); + +const isLong = !props.detailedView && props.note.cw == null && + ( + ( + props.note.text != null && + ( + props.note.text.split("\n").length > 10 || + props.note.text.length > 800 + ) + ) || + props.note.files.length > 4 + ) +; const collapsed = $ref(props.note.cw == null && isLong); From 7ed1cc1ff78b82e8c07fcb4f7be15d38d20e34e2 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Wed, 21 Jun 2023 14:22:04 -0400 Subject: [PATCH 079/309] i apologize to all the cats that may have been harmed before this commit (#10342) --- packages/client/src/components/MkNote.vue | 8 ++++++-- .../src/components/MkSubNoteContent.vue | 20 +++++++------------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 7f69117cb2..fbcb1a0998 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -630,9 +630,10 @@ defineExpose({ .note-context { position: relative; - z-index: 2; padding: 0 32px 0 32px; display: flex; + background: var(--panel); + z-index: 1; &:first-child { margin-top: 20px; } @@ -716,7 +717,8 @@ defineExpose({ > .article { position: relative; overflow: clip; - padding: 4px 32px 10px; + padding: 20px 32px 10px; + margin-top: -16px; &:first-child, &:nth-child(2) { @@ -730,6 +732,8 @@ defineExpose({ .header-container { display: flex; + position: relative; + z-index: 2; > .avatar { flex-shrink: 0; display: block; diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index ab9c0a366a..4065ba8dd8 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -210,19 +210,13 @@ const emit = defineEmits<{ const cwButton = ref<HTMLElement>(); const showMoreButton = ref<HTMLElement>(); -const isLong = !props.detailedView && props.note.cw == null && - ( - ( - props.note.text != null && - ( - props.note.text.split("\n").length > 10 || - props.note.text.length > 800 - ) - ) || - props.note.files.length > 4 - ) -; - +const isLong = + !props.detailedView && + props.note.cw == null && + ((props.note.text != null && + (props.note.text.split("\n").length > 10 || + props.note.text.length > 800)) || + props.note.files.length > 4); const collapsed = $ref(props.note.cw == null && isLong); const urls = props.note.text From 29d1970f5979e61ffc54659af557f4dd478fbc47 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Wed, 21 Jun 2023 17:13:46 -0400 Subject: [PATCH 080/309] Fix missing deviceKind imports for swipers --- packages/client/src/pages/search.vue | 1 + packages/client/src/pages/tag.vue | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/client/src/pages/search.vue b/packages/client/src/pages/search.vue index e03956cc75..be09daebcf 100644 --- a/packages/client/src/pages/search.vue +++ b/packages/client/src/pages/search.vue @@ -49,6 +49,7 @@ import XUserList from "@/components/MkUserList.vue"; import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; import { defaultStore } from "@/store"; +import { deviceKind } from "@/scripts/device-kind"; import "swiper/scss"; import "swiper/scss/virtual"; diff --git a/packages/client/src/pages/tag.vue b/packages/client/src/pages/tag.vue index 18561d9648..e5d8c674b1 100644 --- a/packages/client/src/pages/tag.vue +++ b/packages/client/src/pages/tag.vue @@ -49,6 +49,7 @@ import XUserList from "@/components/MkUserList.vue"; import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; import { defaultStore } from "@/store"; +import { deviceKind } from "@/scripts/device-kind"; import "swiper/scss"; import "swiper/scss/virtual"; From 4bd0838f292f5e106186416cc682cc191a7268db Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Wed, 21 Jun 2023 16:26:43 -0700 Subject: [PATCH 081/309] =?UTF-8?q?fix:=20=F0=9F=90=9B=20empty=20fs=20stat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/server/api/endpoints/server-info.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts index cc9aa91b2a..81bb053db4 100644 --- a/packages/backend/src/server/api/endpoints/server-info.ts +++ b/packages/backend/src/server/api/endpoints/server-info.ts @@ -1,7 +1,7 @@ import * as os from "node:os"; import si from "systeminformation"; import define from "../define.js"; -import meilisearch from "../../../db/meilisearch.js"; +import meilisearch from "@/db/meilisearch.js"; export const meta = { requireCredential: false, @@ -19,7 +19,15 @@ export const paramDef = { export default define(meta, paramDef, async () => { const memStats = await si.mem(); const fsStats = await si.fsSize(); - const meilisearchStats = await meilisearchStatus(); + + let fsIndex = 0; + // Get the first index of fs sizes that are actualy used. + for (const [i, stat] of fsStats.entries()) { + if (stat.rw === true && stat.used > 0) { + fsIndex = i; + break; + } + } return { machine: os.hostname(), @@ -31,8 +39,8 @@ export default define(meta, paramDef, async () => { total: memStats.total, }, fs: { - total: fsStats[0].size, - used: fsStats[0].used, + total: fsStats[fsIndex].size, + used: fsStats[fsIndex].used, }, }; }); From 94a8f64b3bdaafb29887a692ad11f5280b482805 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Wed, 21 Jun 2023 23:38:26 -0400 Subject: [PATCH 082/309] Minimize reply context in notifications --- packages/client/src/components/MkNote.vue | 60 ++++++++++++++++++- .../client/src/components/MkNotifications.vue | 1 + 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index fbcb1a0998..58d7e18166 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -12,11 +12,11 @@ :id="appearNote.id" > <MkNoteSub - v-if="appearNote.reply && !detailedView" + v-if="appearNote.reply && !detailedView && !collapsedReply" :note="appearNote.reply" class="reply-to" /> - <div v-if="!detailedView" class="note-context" @click="noteClick"> + <div v-if="!detailedView" class="note-context" @click="noteClick" :class="{ collapsedReply }"> <div class="line"></div> <div v-if="appearNote._prId_" class="info"> <i class="ph-megaphone-simple-bold ph-lg"></i> @@ -63,6 +63,17 @@ <MkVisibility :note="note" /> </div> </div> + <div v-if="collapsedReply && appearNote.reply" class="info"> + <MkAvatar class="avatar" :user="appearNote.reply.user" /> + <MkUserName class="username" :user="appearNote.reply.user"></MkUserName> + <Mfm + class="summary" + :text="getNoteSummary(appearNote.reply)" + :plain="true" + :nowrap="true" + :custom-emojis="note.emojis" + /> + </div> </div> <article class="article" @@ -78,7 +89,6 @@ <XNoteHeader class="header" :note="appearNote" - :mini="true" /> </div> <div class="body"> @@ -260,6 +270,7 @@ import { getNoteMenu } from "@/scripts/get-note-menu"; import { useNoteCapture } from "@/scripts/use-note-capture"; import { notePage } from "@/filters/note"; import { deepClone } from "@/scripts/clone"; +import { getNoteSummary } from "@/scripts/get-note-summary"; const router = useRouter(); @@ -267,6 +278,7 @@ const props = defineProps<{ note: misskey.entities.Note; pinned?: boolean; detailedView?: boolean; + collapsedReply?: boolean; }>(); const inChannel = inject("inChannel", null); @@ -712,6 +724,48 @@ defineExpose({ } } } + + &.collapsedReply { + .line { + opacity: 0.25; + &::after { + content: ""; + position: absolute; + border-left: 2px solid currentColor; + border-top: 2px solid currentColor; + margin-left: calc(var(--avatarSize) / 2 - 1px); + width: calc(var(--avatarSize) / 2 + 14px); + border-top-left-radius: calc(var(--avatarSize) / 4); + top: calc(50% - 1px); + height: calc(50% + 5px); + } + } + .info { + color: var(--fgTransparentWeak); + transition: color .2s; + } + .avatar { + width: 1.2em; + height: 1.2em; + border-radius: 2em; + overflow: hidden; + margin-right: .4em; + background: var(--panelHighlight); + } + .username { + font-weight: 700; + flex-shrink: 0; + max-width: 30%; + &::after { + content: ": "; + } + } + &:hover, &:focus-within { + .info { + color: var(--fg); + } + } + } } > .article { diff --git a/packages/client/src/components/MkNotifications.vue b/packages/client/src/components/MkNotifications.vue index 61b16b16e2..7607e41b9a 100644 --- a/packages/client/src/components/MkNotifications.vue +++ b/packages/client/src/components/MkNotifications.vue @@ -26,6 +26,7 @@ " :key="notification.id" :note="notification.note" + :collapsedReply="true" /> <XNotification v-else From d3425394503b48fc8ea820ce1641bb22e0f1789f Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Wed, 21 Jun 2023 22:13:57 -0700 Subject: [PATCH 083/309] docs: :memo: min rust ver --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 796632be2d..d1dfbf088e 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ If you have access to a server that supports one of the sources below, I recomme ### 🏗️ Build dependencies -- 🦀 At least [Rust](https://www.rust-lang.org/) v1.65.0 +- 🦀 At least [Rust](https://www.rust-lang.org/) v1.68.0 - 🦬 C/C++ compiler & build tools - `build-essential` on Debian/Ubuntu Linux - `base-devel` on Arch Linux From eb52e67398447306b34e879ecff9bfd35c10bf89 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Thu, 22 Jun 2023 15:35:56 -0400 Subject: [PATCH 084/309] fix --- packages/client/src/components/MkNote.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 58d7e18166..bffdd485f5 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -644,7 +644,6 @@ defineExpose({ position: relative; padding: 0 32px 0 32px; display: flex; - background: var(--panel); z-index: 1; &:first-child { margin-top: 20px; From 90c7ecf92fd9d96e9ddf88f662fc083908d25bb6 Mon Sep 17 00:00:00 2001 From: Lily Cohen <lilithmooncohen@gmail.com> Date: Wed, 7 Jun 2023 11:34:23 -0600 Subject: [PATCH 085/309] update to node 20 --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index d8671911e4..2227d57a33 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Install dev and compilation dependencies, build files -FROM node:19-alpine as build +FROM node:20-alpine as build WORKDIR /calckey # Install compilation dependencies @@ -32,7 +32,7 @@ RUN pnpm i --prod --frozen-lockfile ## Runtime container -FROM node:19-alpine +FROM node:20-alpine WORKDIR /calckey # Install runtime dependencies From 90ad37c3a32293a1d089ebbe263b1a3d11f7cdd3 Mon Sep 17 00:00:00 2001 From: Lily Cohen <lilithmooncohen@gmail.com> Date: Wed, 7 Jun 2023 11:37:42 -0600 Subject: [PATCH 086/309] remove apk update as 'no-cache' already updates --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2227d57a33..29922af4f4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,6 @@ FROM node:20-alpine as build WORKDIR /calckey # Install compilation dependencies -RUN apk update RUN apk add --no-cache --no-progress git alpine-sdk python3 rust cargo vips # Copy only the dependency-related files first, to cache efficiently From 48f58feae634a60057e43537686c47391edbd288 Mon Sep 17 00:00:00 2001 From: Lily Cohen <lilithmooncohen@gmail.com> Date: Wed, 7 Jun 2023 11:43:32 -0600 Subject: [PATCH 087/309] precompile rust components --- .dockerignore | 3 +++ Dockerfile | 27 +++++++++++++++++++++++++-- docker-compose.yml | 2 -- package.json | 4 +++- packages/backend/package.json | 4 ++-- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/.dockerignore b/.dockerignore index 8aa17c3a89..4a75603f77 100644 --- a/.dockerignore +++ b/.dockerignore @@ -13,6 +13,9 @@ node_modules **/node_modules report.*.json +# Rust +packages/backend/native-utils/target/* + # Cypress cypress/screenshots cypress/videos diff --git a/Dockerfile b/Dockerfile index 29922af4f4..cbdf7407e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,16 @@ WORKDIR /calckey # Install compilation dependencies RUN apk add --no-cache --no-progress git alpine-sdk python3 rust cargo vips +# Copy only the cargo dependency-related files first, to cache efficiently +COPY packages/backend/native-utils/Cargo.toml packages/backend/native-utils/Cargo.toml +COPY packages/backend/native-utils/Cargo.lock packages/backend/native-utils/Cargo.lock +COPY packages/backend/native-utils/migration/Cargo.toml packages/backend/native-utils/migration/Cargo.toml +COPY packages/backend/native-utils/src/*.rs packages/backend/native-utils/src/ + +# Install cargo dependencies +RUN cd packages/backend && \ + cargo fetch --locked --manifest-path ./native-utils/migration/Cargo.toml + # Copy only the dependency-related files first, to cache efficiently COPY package.json pnpm*.yaml ./ COPY packages/backend/package.json packages/backend/package.json @@ -22,13 +32,26 @@ RUN corepack prepare pnpm@latest --activate # Install dev mode dependencies for compilation RUN pnpm i --frozen-lockfile +# Copy in the rest of the native-utils rust files +COPY packages/backend/native-utils/.cargo packages/backend/native-utils/.cargo +COPY packages/backend/native-utils/src packages/backend/native-utils/src +COPY packages/backend/native-utils/migration packages/backend/native-utils/migration +COPY packages/backend/native-utils/tests packages/backend/native-utils/tests +COPY packages/backend/native-utils/*.rs packages/backend/native-utils/ + +# native-utils cargo build +RUN pnpm run build:cargo + # Copy in the rest of the files, to compile from TS to JS COPY . ./ -RUN pnpm run build +RUN pnpm run build:recursive +RUN pnpm run gulp # Trim down the dependencies to only the prod deps RUN pnpm i --prod --frozen-lockfile +# Clean up the cargo deps +RUN rm -rf /calckey/packages/backend/native-utils/target/release/deps ## Runtime container FROM node:20-alpine @@ -51,7 +74,7 @@ COPY --from=build /calckey/built /calckey/built COPY --from=build /calckey/packages/backend/built /calckey/packages/backend/built COPY --from=build /calckey/packages/backend/assets/instance.css /calckey/packages/backend/assets/instance.css COPY --from=build /calckey/packages/backend/native-utils/built /calckey/packages/backend/native-utils/built -COPY --from=build /calckey/packages/backend/native-utils/target /calckey/packages/backend/native-utils/target +COPY --from=build /calckey/packages/backend/native-utils/target/release /calckey/packages/backend/native-utils/target/release RUN corepack enable ENTRYPOINT [ "/sbin/tini", "--" ] diff --git a/docker-compose.yml b/docker-compose.yml index d6ad26a059..abb1882ea5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,8 +19,6 @@ services: environment: NODE_ENV: production volumes: - - ./.cargo-cache:/root/.cargo - - ./.cargo-target:/calckey/packages/backend/native-utils/target - ./files:/calckey/files - ./.config:/calckey/.config:ro diff --git a/package.json b/package.json index 42a18a33c1..a6de546fff 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,9 @@ "private": true, "scripts": { "rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp", - "build": "pnpm -r run build && pnpm run gulp", + "build": "pnpm -r run build:cargo && pnpm -r run build:recursive && pnpm run gulp", + "build:recursive": "pnpm -r run build", + "build:cargo": "pnpm --filter backend run build:cargo", "start": "pnpm --filter backend run start", "start:test": "pnpm --filter backend run start:test", "init": "pnpm run migrate", diff --git a/packages/backend/package.json b/packages/backend/package.json index 2a19b916cf..90b1e1e41b 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -8,10 +8,10 @@ "start:test": "NODE_ENV=test pnpm node ./built/index.js", "migrate": "pnpm run migrate:typeorm && pnpm run migrate:cargo", "migrate:typeorm": "typeorm migration:run -d ormconfig.js", - "migrate:cargo": "cargo run --manifest-path ./native-utils/migration/Cargo.toml -- up", + "migrate:cargo": "./native-utils/target/release/migration up", "revertmigration": "pnpm run revertmigration:cargo && pnpm run revertmigration:typeorm", "revertmigration:typeorm": "typeorm migration:revert -d ormconfig.js", - "revertmigration:cargo": "cargo run --manifest-path ./native-utils/migration/Cargo.toml -- down", + "revertmigration:cargo": "./native-utils/target/release/migration down", "check:connect": "node ./check_connect.js", "build": "pnpm swc src -d built -D", "watch": "pnpm swc src -d built -D -w", From e232332a469718b5f567fbf75224f987df2415e4 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Wed, 21 Jun 2023 21:25:25 -0400 Subject: [PATCH 088/309] fix build and clean scripts --- package.json | 4 +--- packages/backend/native-utils/package.json | 4 ++-- scripts/clean-all.js | 26 +++++++++++++--------- scripts/clean.js | 12 +++++----- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index a6de546fff..42a18a33c1 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,7 @@ "private": true, "scripts": { "rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp", - "build": "pnpm -r run build:cargo && pnpm -r run build:recursive && pnpm run gulp", - "build:recursive": "pnpm -r run build", - "build:cargo": "pnpm --filter backend run build:cargo", + "build": "pnpm -r run build && pnpm run gulp", "start": "pnpm --filter backend run start", "start:test": "pnpm --filter backend run start:test", "init": "pnpm run migrate", diff --git a/packages/backend/native-utils/package.json b/packages/backend/native-utils/package.json index 2e6a721f4c..e326a2d3fa 100644 --- a/packages/backend/native-utils/package.json +++ b/packages/backend/native-utils/package.json @@ -34,8 +34,8 @@ }, "scripts": { "artifacts": "napi artifacts", - "build": "napi build --features napi --platform --release ./built/", - "build:debug": "napi build --platform", + "build": "napi build --features napi --platform --release ./built/ && cargo build --locked --release --manifest-path ./migration/Cargo.toml", + "build:debug": "napi build --platform ./built/ && cargo build --manifest-path ./migration/Cargo.toml", "prepublishOnly": "napi prepublish -t npm", "test": "pnpm run cargo:test && pnpm run build && ava", "universal": "napi universal", diff --git a/scripts/clean-all.js b/scripts/clean-all.js index c3d85bf3a5..c5f6829886 100644 --- a/scripts/clean-all.js +++ b/scripts/clean-all.js @@ -1,26 +1,30 @@ -const fs = require('fs'); +const fs = require('node:fs'); const execa = require('execa'); +const { join } = require('node:path'); (async () => { - fs.rmSync(__dirname + '/../packages/backend/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/backend/node_modules', { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/backend/built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/backend/node_modules'), { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/client/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/client/node_modules', { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/backend/native-utils/built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/backend/native-utils/node_modules'), { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/sw/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/sw/node_modules', { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/client/built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/client/node_modules'), { recursive: true, force: true }); - fs.rmSync(__dirname + '/../built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../node_modules', { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/sw/built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/sw/node_modules'), { recursive: true, force: true }); + + fs.rmSync(join(__dirname, '/../built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../node_modules'), { recursive: true, force: true }); execa('pnpm', ['store', 'prune'], { - cwd: __dirname + '/../', + cwd: join(__dirname, '/../'), stdio: 'inherit' }); execa('cargo', ['clean'], { - cwd: __dirname + '/../packages/backend/native-utils', + cwd: join(__dirname, '/../packages/backend/native-utils'), stdio: 'inherit' }); })(); diff --git a/scripts/clean.js b/scripts/clean.js index 70b9d882b5..cf8ee9bc56 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -1,8 +1,10 @@ -const fs = require('fs'); +const fs = require('node:fs'); +const { join } = require('node:path'); (async () => { - fs.rmSync(__dirname + '/../packages/backend/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/client/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/sw/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../built', { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/backend/built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/backend/native-utils/built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/client/built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../packages/sw/built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, '/../built'), { recursive: true, force: true }); })(); From 3780be57c052ca231cc876c9889cc69f56f1207d Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Wed, 21 Jun 2023 22:58:02 -0400 Subject: [PATCH 089/309] clean unnecessary artifacts --- Dockerfile | 41 ++++++---------------- packages/backend/native-utils/package.json | 6 ++-- packages/backend/package.json | 7 ++-- 3 files changed, 17 insertions(+), 37 deletions(-) diff --git a/Dockerfile b/Dockerfile index cbdf7407e0..c126855544 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ ## Install dev and compilation dependencies, build files -FROM node:20-alpine as build +FROM alpine:3.18 as build WORKDIR /calckey # Install compilation dependencies -RUN apk add --no-cache --no-progress git alpine-sdk python3 rust cargo vips +RUN apk add --no-cache --no-progress git alpine-sdk python3 nodejs-current npm rust cargo vips # Copy only the cargo dependency-related files first, to cache efficiently COPY packages/backend/native-utils/Cargo.toml packages/backend/native-utils/Cargo.toml @@ -25,40 +25,22 @@ COPY packages/backend/native-utils/package.json packages/backend/native-utils/pa COPY packages/backend/native-utils/npm/linux-x64-musl/package.json packages/backend/native-utils/npm/linux-x64-musl/package.json COPY packages/backend/native-utils/npm/linux-arm64-musl/package.json packages/backend/native-utils/npm/linux-arm64-musl/package.json -# Configure corepack and pnpm -RUN corepack enable -RUN corepack prepare pnpm@latest --activate +# Configure corepack and pnpm, and install dev mode dependencies for compilation +RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm i --frozen-lockfile -# Install dev mode dependencies for compilation -RUN pnpm i --frozen-lockfile - -# Copy in the rest of the native-utils rust files -COPY packages/backend/native-utils/.cargo packages/backend/native-utils/.cargo -COPY packages/backend/native-utils/src packages/backend/native-utils/src -COPY packages/backend/native-utils/migration packages/backend/native-utils/migration -COPY packages/backend/native-utils/tests packages/backend/native-utils/tests -COPY packages/backend/native-utils/*.rs packages/backend/native-utils/ - -# native-utils cargo build -RUN pnpm run build:cargo - -# Copy in the rest of the files, to compile from TS to JS +# Copy in the rest of the files to compile COPY . ./ -RUN pnpm run build:recursive -RUN pnpm run gulp +RUN pnpm run build -# Trim down the dependencies to only the prod deps -RUN pnpm i --prod --frozen-lockfile - -# Clean up the cargo deps -RUN rm -rf /calckey/packages/backend/native-utils/target/release/deps +# Trim down the artifacts and dependencies to only the prod deps +RUN cargo clean --manifest-path /calckey/packages/backend/native-utils/Cargo.toml && pnpm i --prod --frozen-lockfile ## Runtime container -FROM node:20-alpine +FROM alpine:3.18 WORKDIR /calckey # Install runtime dependencies -RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip rust cargo +RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip nodejs-current COPY . ./ @@ -74,8 +56,7 @@ COPY --from=build /calckey/built /calckey/built COPY --from=build /calckey/packages/backend/built /calckey/packages/backend/built COPY --from=build /calckey/packages/backend/assets/instance.css /calckey/packages/backend/assets/instance.css COPY --from=build /calckey/packages/backend/native-utils/built /calckey/packages/backend/native-utils/built -COPY --from=build /calckey/packages/backend/native-utils/target/release /calckey/packages/backend/native-utils/target/release -RUN corepack enable +RUN corepack enable && corepack prepare pnpm@latest --activate ENTRYPOINT [ "/sbin/tini", "--" ] CMD [ "pnpm", "run", "migrateandstart" ] diff --git a/packages/backend/native-utils/package.json b/packages/backend/native-utils/package.json index e326a2d3fa..faf678e2d2 100644 --- a/packages/backend/native-utils/package.json +++ b/packages/backend/native-utils/package.json @@ -34,10 +34,12 @@ }, "scripts": { "artifacts": "napi artifacts", - "build": "napi build --features napi --platform --release ./built/ && cargo build --locked --release --manifest-path ./migration/Cargo.toml", + "build": "pnpm run build:napi && pnpm run build:migration", + "build:napi": "napi build --features napi --platform --release ./built/", + "build:migration": "cargo build --locked --release --manifest-path ./migration/Cargo.toml && cp -v ./target/release/migration ./built/migration", "build:debug": "napi build --platform ./built/ && cargo build --manifest-path ./migration/Cargo.toml", "prepublishOnly": "napi prepublish -t npm", - "test": "pnpm run cargo:test && pnpm run build && ava", + "test": "pnpm run cargo:test && pnpm run build:napi && ava", "universal": "napi universal", "version": "napi version", "format": "cargo fmt --all", diff --git a/packages/backend/package.json b/packages/backend/package.json index 90b1e1e41b..f7d19d85b2 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -8,10 +8,10 @@ "start:test": "NODE_ENV=test pnpm node ./built/index.js", "migrate": "pnpm run migrate:typeorm && pnpm run migrate:cargo", "migrate:typeorm": "typeorm migration:run -d ormconfig.js", - "migrate:cargo": "./native-utils/target/release/migration up", + "migrate:cargo": "./native-utils/built/migration up", "revertmigration": "pnpm run revertmigration:cargo && pnpm run revertmigration:typeorm", "revertmigration:typeorm": "typeorm migration:revert -d ormconfig.js", - "revertmigration:cargo": "./native-utils/target/release/migration down", + "revertmigration:cargo": "./native-utils/built/migration down", "check:connect": "node ./check_connect.js", "build": "pnpm swc src -d built -D", "watch": "pnpm swc src -d built -D -w", @@ -20,9 +20,6 @@ "test": "pnpm run mocha", "format": "pnpm rome format * --write" }, - "resolutions": { - "chokidar": "^3.3.1" - }, "optionalDependencies": { "@swc/core-android-arm64": "1.3.11", "@tensorflow/tfjs-node": "3.21.1" From 9b009918acbebab5b5fbf6f01dda9478714111e0 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Thu, 22 Jun 2023 02:00:28 -0400 Subject: [PATCH 090/309] add environment variable --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c126855544..08aedaf7c6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,7 +30,7 @@ RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm i --froze # Copy in the rest of the files to compile COPY . ./ -RUN pnpm run build +RUN env NODE_ENV=production pnpm run build # Trim down the artifacts and dependencies to only the prod deps RUN cargo clean --manifest-path /calckey/packages/backend/native-utils/Cargo.toml && pnpm i --prod --frozen-lockfile @@ -58,5 +58,6 @@ COPY --from=build /calckey/packages/backend/assets/instance.css /calckey/package COPY --from=build /calckey/packages/backend/native-utils/built /calckey/packages/backend/native-utils/built RUN corepack enable && corepack prepare pnpm@latest --activate +ENV NODE_ENV=production ENTRYPOINT [ "/sbin/tini", "--" ] CMD [ "pnpm", "run", "migrateandstart" ] From 80f21df0e072d29bcc9fb12c1ff9a3ec9f7e1234 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Thu, 22 Jun 2023 11:56:33 -0400 Subject: [PATCH 091/309] mount files directory --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 08aedaf7c6..47452be3fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -59,5 +59,6 @@ COPY --from=build /calckey/packages/backend/native-utils/built /calckey/packages RUN corepack enable && corepack prepare pnpm@latest --activate ENV NODE_ENV=production +VOLUME [ "/calckey/files" ] ENTRYPOINT [ "/sbin/tini", "--" ] CMD [ "pnpm", "run", "migrateandstart" ] From 99e1f1ad84a908c15af4edf7300a68b2c5ed2aa1 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Thu, 22 Jun 2023 12:28:36 -0400 Subject: [PATCH 092/309] chore: format --- packages/backend/native-utils/package.json | 86 +++++++++++----------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/packages/backend/native-utils/package.json b/packages/backend/native-utils/package.json index faf678e2d2..432074f251 100644 --- a/packages/backend/native-utils/package.json +++ b/packages/backend/native-utils/package.json @@ -1,50 +1,50 @@ { - "name": "native-utils", - "version": "0.0.0", - "main": "built/index.js", - "types": "built/index.d.ts", - "napi": { - "name": "native-utils", - "triples": { - "additional": [ - "aarch64-apple-darwin", - "aarch64-linux-android", - "aarch64-unknown-linux-gnu", - "aarch64-unknown-linux-musl", - "aarch64-pc-windows-msvc", - "armv7-unknown-linux-gnueabihf", - "x86_64-unknown-linux-musl", - "x86_64-unknown-freebsd", - "i686-pc-windows-msvc", - "armv7-linux-androideabi", - "universal-apple-darwin" - ] - } - }, - "license": "MIT", - "devDependencies": { - "@napi-rs/cli": "2.16.1", - "ava": "5.1.1" - }, - "ava": { - "timeout": "3m" - }, - "engines": { - "node": ">= 10" - }, - "scripts": { - "artifacts": "napi artifacts", + "name": "native-utils", + "version": "0.0.0", + "main": "built/index.js", + "types": "built/index.d.ts", + "napi": { + "name": "native-utils", + "triples": { + "additional": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "aarch64-pc-windows-msvc", + "armv7-unknown-linux-gnueabihf", + "x86_64-unknown-linux-musl", + "x86_64-unknown-freebsd", + "i686-pc-windows-msvc", + "armv7-linux-androideabi", + "universal-apple-darwin" + ] + } + }, + "license": "MIT", + "devDependencies": { + "@napi-rs/cli": "2.16.1", + "ava": "5.1.1" + }, + "ava": { + "timeout": "3m" + }, + "engines": { + "node": ">= 10" + }, + "scripts": { + "artifacts": "napi artifacts", "build": "pnpm run build:napi && pnpm run build:migration", "build:napi": "napi build --features napi --platform --release ./built/", "build:migration": "cargo build --locked --release --manifest-path ./migration/Cargo.toml && cp -v ./target/release/migration ./built/migration", - "build:debug": "napi build --platform ./built/ && cargo build --manifest-path ./migration/Cargo.toml", - "prepublishOnly": "napi prepublish -t npm", - "test": "pnpm run cargo:test && pnpm run build:napi && ava", - "universal": "napi universal", - "version": "napi version", + "build:debug": "napi build --platform ./built/ && cargo build --manifest-path ./migration/Cargo.toml", + "prepublishOnly": "napi prepublish -t npm", + "test": "pnpm run cargo:test && pnpm run build:napi && ava", + "universal": "napi universal", + "version": "napi version", "format": "cargo fmt --all", "cargo:test": "pnpm run cargo:unit && pnpm run cargo:integration", - "cargo:unit": "cargo test unit_test && cargo test -F napi unit_test", - "cargo:integration": "cargo test -F noarray int_test -- --test-threads=1" - } + "cargo:unit": "cargo test unit_test && cargo test -F napi unit_test", + "cargo:integration": "cargo test -F noarray int_test -- --test-threads=1" + } } From f7631772a3bfffbc2d4102d67c4212b9f9c07f62 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@wahh.foo> Date: Thu, 22 Jun 2023 13:16:59 -0400 Subject: [PATCH 093/309] cache native-utils --- .dockerignore | 4 +--- Dockerfile | 23 +++++++++++++------ .../backend/native-utils/migration/Cargo.toml | 6 ++--- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/.dockerignore b/.dockerignore index 4a75603f77..90d15ddd90 100644 --- a/.dockerignore +++ b/.dockerignore @@ -28,9 +28,6 @@ coverage !/.config/example.yml !/.config/docker_example.env -#docker dev config -/dev/docker-compose.yml - # misskey built db @@ -50,3 +47,4 @@ packages/backend/assets/instance.css # dockerignore custom .git Dockerfile +docker-compose.yml diff --git a/Dockerfile b/Dockerfile index 47452be3fa..e11cb2bf44 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,12 +8,12 @@ RUN apk add --no-cache --no-progress git alpine-sdk python3 nodejs-current npm r # Copy only the cargo dependency-related files first, to cache efficiently COPY packages/backend/native-utils/Cargo.toml packages/backend/native-utils/Cargo.toml COPY packages/backend/native-utils/Cargo.lock packages/backend/native-utils/Cargo.lock +COPY packages/backend/native-utils/src/lib.rs packages/backend/native-utils/src/ COPY packages/backend/native-utils/migration/Cargo.toml packages/backend/native-utils/migration/Cargo.toml -COPY packages/backend/native-utils/src/*.rs packages/backend/native-utils/src/ +COPY packages/backend/native-utils/migration/src/lib.rs packages/backend/native-utils/migration/src/ # Install cargo dependencies -RUN cd packages/backend && \ - cargo fetch --locked --manifest-path ./native-utils/migration/Cargo.toml +RUN cargo fetch --locked --manifest-path /calckey/packages/backend/native-utils/Cargo.toml # Copy only the dependency-related files first, to cache efficiently COPY package.json pnpm*.yaml ./ @@ -28,12 +28,21 @@ COPY packages/backend/native-utils/npm/linux-arm64-musl/package.json packages/ba # Configure corepack and pnpm, and install dev mode dependencies for compilation RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm i --frozen-lockfile +# Copy in the rest of the native-utils rust files +COPY packages/backend/native-utils/.cargo packages/backend/native-utils/.cargo +COPY packages/backend/native-utils/build.rs packages/backend/native-utils/ +COPY packages/backend/native-utils/src packages/backend/native-utils/src/ +COPY packages/backend/native-utils/migration/src packages/backend/native-utils/migration/src/ + +# Compile native-utils +RUN pnpm run --filter native-utils build + # Copy in the rest of the files to compile COPY . ./ -RUN env NODE_ENV=production pnpm run build +RUN env NODE_ENV=production sh -c "pnpm run --filter '!native-utils' build && pnpm run gulp" -# Trim down the artifacts and dependencies to only the prod deps -RUN cargo clean --manifest-path /calckey/packages/backend/native-utils/Cargo.toml && pnpm i --prod --frozen-lockfile +# Trim down the dependencies to only those for production +RUN pnpm i --prod --frozen-lockfile ## Runtime container FROM alpine:3.18 @@ -59,6 +68,6 @@ COPY --from=build /calckey/packages/backend/native-utils/built /calckey/packages RUN corepack enable && corepack prepare pnpm@latest --activate ENV NODE_ENV=production -VOLUME [ "/calckey/files" ] +VOLUME "/calckey/files" ENTRYPOINT [ "/sbin/tini", "--" ] CMD [ "pnpm", "run", "migrateandstart" ] diff --git a/packages/backend/native-utils/migration/Cargo.toml b/packages/backend/native-utils/migration/Cargo.toml index 4dee156ef3..7ed9fd5f03 100644 --- a/packages/backend/native-utils/migration/Cargo.toml +++ b/packages/backend/native-utils/migration/Cargo.toml @@ -10,14 +10,14 @@ path = "src/lib.rs" [features] default = [] -convert = ["dep:native-utils"] +convert = ["dep:native-utils", "dep:indicatif", "dep:futures"] [dependencies] serde_json = "1.0.96" native-utils = { path = "../", optional = true } -indicatif = { version = "0.17.4", features = ["tokio"] } +indicatif = { version = "0.17.4", features = ["tokio"], optional = true } tokio = { version = "1.28.2", features = ["full"] } -futures = "0.3.28" +futures = { version = "0.3.28", optional = true } serde_yaml = "0.9.21" serde = { version = "1.0.163", features = ["derive"] } urlencoding = "2.1.2" From e91389b1af25946f884f199fb2748caa1a484426 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Thu, 22 Jun 2023 17:04:57 -0400 Subject: [PATCH 094/309] fix --- packages/client/src/components/MkNote.vue | 8 +++++++- packages/client/src/components/MkPopupMenu.vue | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index bffdd485f5..495021ea88 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -16,7 +16,13 @@ :note="appearNote.reply" class="reply-to" /> - <div v-if="!detailedView" class="note-context" @click="noteClick" :class="{ collapsedReply }"> + <div v-if="!detailedView" + class="note-context" + @click="noteClick" + :class="{ + collapsedReply: collapsedReply && appearNote.reply + }" + > <div class="line"></div> <div v-if="appearNote._prId_" class="info"> <i class="ph-megaphone-simple-bold ph-lg"></i> diff --git a/packages/client/src/components/MkPopupMenu.vue b/packages/client/src/components/MkPopupMenu.vue index a478007271..12a18221cd 100644 --- a/packages/client/src/components/MkPopupMenu.vue +++ b/packages/client/src/components/MkPopupMenu.vue @@ -5,7 +5,7 @@ :z-priority="'high'" :src="src" :transparent-bg="true" - @click="modal.close()" + @click="modal?.close()" @closed="emit('closed')" tabindex="-1" > @@ -18,7 +18,7 @@ class="sfhdhdhq" :class="{ drawer: type === 'drawer' }" :no-return-focus="noReturnFocus" - @close="modal.close()" + @close="modal?.close()" /> </MkModal> </template> From a0a4423f4525b92a8197b9be197bcc914eca83c4 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 16:18:59 -0700 Subject: [PATCH 095/309] fix: :bug: only collapsed reply if notification is reply --- packages/client/src/components/MkNotifications.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNotifications.vue b/packages/client/src/components/MkNotifications.vue index 7607e41b9a..36493e2d5c 100644 --- a/packages/client/src/components/MkNotifications.vue +++ b/packages/client/src/components/MkNotifications.vue @@ -26,7 +26,7 @@ " :key="notification.id" :note="notification.note" - :collapsedReply="true" + :collapsedReply="notification.type === 'reply'" /> <XNotification v-else From d5854c2324651c68c3d90314c95426cf38407bc7 Mon Sep 17 00:00:00 2001 From: naskya <m@naskya.net> Date: Thu, 22 Jun 2023 16:25:27 -0700 Subject: [PATCH 096/309] =?UTF-8?q?fix:=20=F0=9F=90=9B=20proper=20isDuplic?= =?UTF-8?q?ateKeyValueError=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #10340 Co-authored-by: Kainoa Kanter <kainoa@t1c.dev> --- packages/backend/src/misc/is-duplicate-key-value-error.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/misc/is-duplicate-key-value-error.ts b/packages/backend/src/misc/is-duplicate-key-value-error.ts index 18d22bb77c..670277fe1a 100644 --- a/packages/backend/src/misc/is-duplicate-key-value-error.ts +++ b/packages/backend/src/misc/is-duplicate-key-value-error.ts @@ -1,3 +1,4 @@ export function isDuplicateKeyValueError(e: unknown | Error): boolean { - return (e as Error).message?.startsWith("duplicate key value"); + const nodeError = e as NodeJS.ErrnoException; + return nodeError.code === "23505"; } From 278f42a720189ed0e7308ad5466d2ecec118105e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 16:46:18 -0700 Subject: [PATCH 097/309] fix: :bug: collapse reply if type is a mention and it has a reply --- packages/client/src/components/MkNote.vue | 24 ++++++++++--------- .../client/src/components/MkNotifications.vue | 6 ++++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 495021ea88..d5f361b047 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -16,11 +16,12 @@ :note="appearNote.reply" class="reply-to" /> - <div v-if="!detailedView" + <div + v-if="!detailedView" class="note-context" @click="noteClick" - :class="{ - collapsedReply: collapsedReply && appearNote.reply + :class="{ + collapsedReply: collapsedReply && appearNote.reply, }" > <div class="line"></div> @@ -71,7 +72,10 @@ </div> <div v-if="collapsedReply && appearNote.reply" class="info"> <MkAvatar class="avatar" :user="appearNote.reply.user" /> - <MkUserName class="username" :user="appearNote.reply.user"></MkUserName> + <MkUserName + class="username" + :user="appearNote.reply.user" + ></MkUserName> <Mfm class="summary" :text="getNoteSummary(appearNote.reply)" @@ -92,10 +96,7 @@ <div class="main"> <div class="header-container"> <MkAvatar class="avatar" :user="appearNote.user" /> - <XNoteHeader - class="header" - :note="appearNote" - /> + <XNoteHeader class="header" :note="appearNote" /> </div> <div class="body"> <MkSubNoteContent @@ -747,14 +748,14 @@ defineExpose({ } .info { color: var(--fgTransparentWeak); - transition: color .2s; + transition: color 0.2s; } .avatar { width: 1.2em; height: 1.2em; border-radius: 2em; overflow: hidden; - margin-right: .4em; + margin-right: 0.4em; background: var(--panelHighlight); } .username { @@ -765,7 +766,8 @@ defineExpose({ content: ": "; } } - &:hover, &:focus-within { + &:hover, + &:focus-within { .info { color: var(--fg); } diff --git a/packages/client/src/components/MkNotifications.vue b/packages/client/src/components/MkNotifications.vue index 36493e2d5c..439a1d41e9 100644 --- a/packages/client/src/components/MkNotifications.vue +++ b/packages/client/src/components/MkNotifications.vue @@ -26,7 +26,11 @@ " :key="notification.id" :note="notification.note" - :collapsedReply="notification.type === 'reply'" + :collapsedReply=" + notification.type === 'reply' || + (notification.type === 'mention' && + notification.note.replyId != null) + " /> <XNotification v-else From 8a45d25912f806dacf19d7514422a53e6dd103db Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 16:53:56 -0700 Subject: [PATCH 098/309] fix: :pencil2: typo in API docs + errors Co-authored-by: naskya <m@naskya.net> --- packages/backend/src/remote/activitypub/models/image.ts | 4 ++-- packages/backend/src/server/api/openapi/gen-spec.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/remote/activitypub/models/image.ts b/packages/backend/src/remote/activitypub/models/image.ts index 211aa3931e..b5eece0f6e 100644 --- a/packages/backend/src/remote/activitypub/models/image.ts +++ b/packages/backend/src/remote/activitypub/models/image.ts @@ -26,11 +26,11 @@ export async function createImage( const image = (await new Resolver().resolve(value)) as any; if (image.url == null) { - throw new Error("invalid image: url not privided"); + throw new Error("Invalid image, URL not provided"); } if (!image.url.startsWith("https://") && !image.url.startsWith("http://")) { - throw new Error("invalid image: unexpected shcema of url: " + image.url); + throw new Error(`Invalid image, unexpected schema: ${image.url}`); } logger.info(`Creating the Image: ${image.url}`); diff --git a/packages/backend/src/server/api/openapi/gen-spec.ts b/packages/backend/src/server/api/openapi/gen-spec.ts index dfaacf9e50..683ffc6223 100644 --- a/packages/backend/src/server/api/openapi/gen-spec.ts +++ b/packages/backend/src/server/api/openapi/gen-spec.ts @@ -182,7 +182,7 @@ export function genOpenapiSpec() { ...(endpoint.meta.limit ? { "429": { - description: "To many requests", + description: "Too many requests", content: { "application/json": { schema: { From 260afcd6e80f7eeae312e276337ded981524019d Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Thu, 22 Jun 2023 19:35:30 -0400 Subject: [PATCH 099/309] fix: hide tooltip on page change --- packages/client/src/directives/tooltip.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/client/src/directives/tooltip.ts b/packages/client/src/directives/tooltip.ts index 9dabd0756b..e9668f28fe 100644 --- a/packages/client/src/directives/tooltip.ts +++ b/packages/client/src/directives/tooltip.ts @@ -4,6 +4,8 @@ import { defineAsyncComponent, Directive, ref } from "vue"; import { isTouchUsing } from "@/scripts/touch"; import { popup, alert } from "@/os"; +import { mainRouter } from "@/router"; + const start = isTouchUsing ? "touchstart" : "mouseover"; const end = isTouchUsing ? "touchend" : "mouseleave"; @@ -99,6 +101,8 @@ export default { el.addEventListener(end, hideTooltip, { passive: true }); el.addEventListener("focusout", hideTooltip, { passive: true }); + mainRouter.on("change", hideTooltip); + el.addEventListener("click", () => { window.clearTimeout(self.showTimer); self.close(); From 7ca519560f1b902101286a88990e682b01940572 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 17:14:27 -0700 Subject: [PATCH 100/309] feat: :sparkles: display remaining time on ratelimits --- .../backend/src/misc/convert-milliseconds.ts | 17 +++++++++++++++++ packages/backend/src/server/api/call.ts | 7 +++++-- packages/backend/src/server/api/limiter.ts | 6 +++++- .../backend/src/server/api/openapi/errors.ts | 7 +++---- 4 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 packages/backend/src/misc/convert-milliseconds.ts diff --git a/packages/backend/src/misc/convert-milliseconds.ts b/packages/backend/src/misc/convert-milliseconds.ts new file mode 100644 index 0000000000..d8c163ffda --- /dev/null +++ b/packages/backend/src/misc/convert-milliseconds.ts @@ -0,0 +1,17 @@ +export function convertMilliseconds(ms: number) { + let seconds = Math.round(ms / 1000); + let minutes = Math.round(seconds / 60); + let hours = Math.round(minutes / 60); + const days = Math.round(hours / 24); + seconds %= 60; + minutes %= 60; + hours %= 24; + + const result = []; + if (days > 0) result.push(`${days} day(s)`); + if (hours > 0) result.push(`${hours} hour(s)`); + if (minutes > 0) result.push(`${minutes} minute(s)`); + if (seconds > 0) result.push(`${seconds} second(s)`); + + return result.join(", "); +} diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts index 45471ed564..0a1027b835 100644 --- a/packages/backend/src/server/api/call.ts +++ b/packages/backend/src/server/api/call.ts @@ -66,8 +66,11 @@ export default async ( limit as IEndpointMeta["limit"] & { key: NonNullable<string> }, limitActor, ).catch((e) => { + const remainingTime = e.remainingTime + ? `Please try again in ${e.remainingTime}.` + : "Please try again later."; throw new ApiError({ - message: "Rate limit exceeded. Please try again later.", + message: `Rate limit exceeded. ${remainingTime}`, code: "RATE_LIMIT_EXCEEDED", id: "d5826d14-3982-4d2e-8011-b9e9f02499ef", httpStatusCode: 429, @@ -94,7 +97,7 @@ export default async ( } if (ep.meta.requireAdmin && !user!.isAdmin) { - throw new ApiError(accessDenied, { reason: "You are not the admin." }); + throw new ApiError(accessDenied, { reason: "You are not an admin." }); } if (ep.meta.requireModerator && !isModerator) { diff --git a/packages/backend/src/server/api/limiter.ts b/packages/backend/src/server/api/limiter.ts index dd005ad136..a661ed0e95 100644 --- a/packages/backend/src/server/api/limiter.ts +++ b/packages/backend/src/server/api/limiter.ts @@ -3,6 +3,7 @@ import { CacheableLocalUser, User } from "@/models/entities/user.js"; import Logger from "@/services/logger.js"; import { redisClient } from "../../db/redis.js"; import type { IEndpointMeta } from "./endpoints.js"; +import { convertMilliseconds } from "@/misc/convert-milliseconds.js"; const logger = new Logger("limiter"); @@ -76,7 +77,10 @@ export const limiter = ( ); if (info.remaining === 0) { - reject("RATE_LIMIT_EXCEEDED"); + reject({ + message: "RATE_LIMIT_EXCEEDED", + remainingTime: convertMilliseconds(info.resetMs), + }); } else { ok(); } diff --git a/packages/backend/src/server/api/openapi/errors.ts b/packages/backend/src/server/api/openapi/errors.ts index 0fe229d88e..9e7c77c0f2 100644 --- a/packages/backend/src/server/api/openapi/errors.ts +++ b/packages/backend/src/server/api/openapi/errors.ts @@ -3,7 +3,7 @@ export const errors = { INVALID_PARAM: { value: { error: { - message: "Invalid param.", + message: "Invalid parameter.", code: "INVALID_PARAM", id: "3d81ceae-475f-4600-b2a8-2bc116157532", }, @@ -25,8 +25,7 @@ export const errors = { AUTHENTICATION_FAILED: { value: { error: { - message: - "Authentication failed. Please ensure your token is correct.", + message: "Authentication failed.", code: "AUTHENTICATION_FAILED", id: "b0a7f5f8-dc2f-4171-b91f-de88ad238e14", }, @@ -38,7 +37,7 @@ export const errors = { value: { error: { message: - "You sent a request to Calc, Calckey's resident stoner furry, instead of the server.", + "You sent a request to Calc instead of the server. How did this happen?", code: "I_AM_CALC", id: "60c46cd1-f23a-46b1-bebe-5d2b73951a84", }, From 6c72806e31b5fb9b5659afb01760018dbf84ca0c Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 17:25:50 -0700 Subject: [PATCH 101/309] refactor: :recycle: reorganize note menu translate just above view remote --- packages/client/src/scripts/get-note-menu.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts index 433291c9cc..1eeaf29a5d 100644 --- a/packages/client/src/scripts/get-note-menu.ts +++ b/packages/client/src/scripts/get-note-menu.ts @@ -268,13 +268,6 @@ export function getNoteMenu(props: { null, ] : []), - instance.translatorAvailable - ? { - icon: "ph-translate ph-bold ph-lg", - text: i18n.ts.translate, - action: translate, - } - : undefined, statePromise.then((state) => state?.isFavorited ? { @@ -334,6 +327,13 @@ export function getNoteMenu(props: { action: () => togglePin(true), } : undefined, + instance.translatorAvailable + ? { + icon: "ph-translate ph-bold ph-lg", + text: i18n.ts.translate, + action: translate, + } + : undefined, appearNote.url || appearNote.uri ? { icon: "ph-arrow-square-out ph-bold ph-lg", From 1a971efa689323d54eebb4d3646e102fb4d1d95a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 17:41:34 -0700 Subject: [PATCH 102/309] feat: :sparkles: $[small ] and $[center ] MFM syntax --- packages/client/src/components/mfm.ts | 22 +++++++++++++++++-- packages/client/src/pages/mfm-cheat-sheet.vue | 8 +++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 5282bffdef..37e454fcfd 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -110,7 +110,7 @@ export default defineComponent({ case "fn": { // TODO: CSSを文字列で組み立てていくと token.props.args.~~~ 経由でCSSインジェクションできるのでよしなにやる - let style; + let style: string; switch (token.props.name) { case "tada": { const speed = validTime(token.props.args.speed) || "1s"; @@ -300,6 +300,24 @@ export default defineComponent({ style = `background-color: #${color};`; break; } + case "small": { + return h( + "small", + { + style: "opacity: 0.7;", + }, + genEl(token.children), + ); + } + case "center": { + return h( + "div", + { + style: "text-align: center;", + }, + genEl(token.children), + ); + } } if (style == null) { return h("span", {}, [ @@ -337,7 +355,7 @@ export default defineComponent({ h( "div", { - style: "text-align:center;", + style: "text-align: center;", }, genEl(token.children), ), diff --git a/packages/client/src/pages/mfm-cheat-sheet.vue b/packages/client/src/pages/mfm-cheat-sheet.vue index c17ac08043..bf85af4302 100644 --- a/packages/client/src/pages/mfm-cheat-sheet.vue +++ b/packages/client/src/pages/mfm-cheat-sheet.vue @@ -460,8 +460,12 @@ let preview_emoji = $ref( instance.emojis.length ? `:${instance.emojis[0].name}:` : ":emojiname:" ); let preview_bold = $ref(`**${i18n.ts._mfm.dummy}**`); -let preview_small = $ref(`<small>${i18n.ts._mfm.dummy}</small>`); -let preview_center = $ref(`<center>${i18n.ts._mfm.dummy}</center>`); +let preview_small = $ref( + `<small>${i18n.ts._mfm.dummy}</small> $[small ${i18n.ts._mfm.dummy}]` +); +let preview_center = $ref( + `<center>${i18n.ts._mfm.dummy}</center> $[center ${i18n.ts._mfm.dummy}]` +); let preview_inlineCode = $ref('`<: "Hello, world!"`'); let preview_blockCode = $ref( '```\n~ (#i, 100) {\n\t<: ? ((i % 15) = 0) "FizzBuzz"\n\t\t.? ((i % 3) = 0) "Fizz"\n\t\t.? ((i % 5) = 0) "Buzz"\n\t\t. i\n}\n```' From 5e0a0df262761246bb845e030f78c46f96d3e841 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 18:11:25 -0700 Subject: [PATCH 103/309] feat: :sparkles: clickable domains on job queue https://post.naskya.net/notes/9gbfos2mv5iz6g63 --- packages/client/src/pages/admin/index.vue | 2 +- packages/client/src/pages/admin/queue.chart.vue | 4 +++- packages/client/src/pages/admin/queue.vue | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/client/src/pages/admin/index.vue b/packages/client/src/pages/admin/index.vue index ddc5fc6800..e6932fb86b 100644 --- a/packages/client/src/pages/admin/index.vue +++ b/packages/client/src/pages/admin/index.vue @@ -201,7 +201,7 @@ const menuDef = $computed(() => [ active: currentPage?.route.name === "federation", }, { - icon: "ph-clipboard-text ph-bold ph-lg", + icon: "ph-queue ph-bold ph-lg", text: i18n.ts.jobQueue, to: "/admin/queue", active: currentPage?.route.name === "queue", diff --git a/packages/client/src/pages/admin/queue.chart.vue b/packages/client/src/pages/admin/queue.chart.vue index e9d0f0655e..a7f15843d9 100644 --- a/packages/client/src/pages/admin/queue.chart.vue +++ b/packages/client/src/pages/admin/queue.chart.vue @@ -41,7 +41,9 @@ <div class="jobs"> <div v-if="jobs.length > 0"> <div v-for="job in jobs" :key="job[0]"> - <span>{{ job[0] }}</span> + <a :href="`https://${job[0]}`" class="_link" + ><span>{{ job[0] }}</span></a + > <span style="margin-left: 8px; opacity: 0.7" >({{ number(job[1]) }} jobs)</span > diff --git a/packages/client/src/pages/admin/queue.vue b/packages/client/src/pages/admin/queue.vue index b43da1f0a7..b8920f332a 100644 --- a/packages/client/src/pages/admin/queue.vue +++ b/packages/client/src/pages/admin/queue.vue @@ -63,6 +63,6 @@ const headerTabs = $computed(() => [ definePageMetadata({ title: i18n.ts.jobQueue, - icon: "ph-clipboard-text ph-bold ph-lg", + icon: "ph-queue ph-bold ph-lg", }); </script> From 4fda6e6b6b4c9067a9dafdbc2a4b18d9a4a08155 Mon Sep 17 00:00:00 2001 From: Daniele Tricoli <eriol@mornie.org> Date: Wed, 21 Jun 2023 20:10:57 +0000 Subject: [PATCH 104/309] chore: Translated using Weblate (Italian) Currently translated at 69.9% (1262 of 1804 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/it/ --- locales/it-IT.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/locales/it-IT.yml b/locales/it-IT.yml index 7e39e7746c..bdf7cab541 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -33,9 +33,9 @@ logout: "Esci" signup: "Iscriviti" uploading: "Caricamento..." save: "Salva" -users: "Utente" +users: "Utenti" addUser: "Aggiungi utente" -favorite: "Preferiti" +favorite: "Aggiungi ai preferiti" favorites: "Preferiti" unfavorite: "Rimuovi nota dai preferiti" favorited: "Aggiunta ai tuoi preferiti." @@ -58,7 +58,7 @@ loadMore: "Mostra di più" showMore: "Mostra di più" showLess: "Chiudi" youGotNewFollower: "Ha iniziato a seguirti" -receiveFollowRequest: "Hai ricevuto una richiesta di follow." +receiveFollowRequest: "Hai ricevuto una richiesta di follow" followRequestAccepted: "Richiesta di follow accettata" mention: "Menzioni" mentions: "Menzioni" @@ -1559,3 +1559,5 @@ _deck: mentions: "Menzioni" direct: "Diretta" noThankYou: No grazie +addInstance: Aggiungi un'istanza +deleted: Eliminato From 1db5beb41bee82139b594b443e4be6a70db9d934 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 02:02:27 +0000 Subject: [PATCH 105/309] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20open?= =?UTF-8?q?=20instance=20as=20lookup=20window?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/pages/admin/queue.chart.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/client/src/pages/admin/queue.chart.vue b/packages/client/src/pages/admin/queue.chart.vue index a7f15843d9..bf507c2f02 100644 --- a/packages/client/src/pages/admin/queue.chart.vue +++ b/packages/client/src/pages/admin/queue.chart.vue @@ -41,9 +41,9 @@ <div class="jobs"> <div v-if="jobs.length > 0"> <div v-for="job in jobs" :key="job[0]"> - <a :href="`https://${job[0]}`" class="_link" - ><span>{{ job[0] }}</span></a - > + <a @click.stop="lookupInstance(job[0])" class="_link"> + {{ job[0] }} + </a> <span style="margin-left: 8px; opacity: 0.7" >({{ number(job[1]) }} jobs)</span > @@ -59,6 +59,7 @@ import { markRaw, onMounted, onUnmounted, ref } from "vue"; import XChart from "./queue.chart.chart.vue"; import number from "@/filters/number"; import * as os from "@/os"; +import { lookupInstance } from "@/scripts/lookup-instance"; import { stream } from "@/stream"; import { i18n } from "@/i18n"; From d296fee10a2277c9418048ffaf579054f6894239 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 19:34:52 -0700 Subject: [PATCH 106/309] =?UTF-8?q?perf:=20=E2=9A=A1=20update=20emojis,=20?= =?UTF-8?q?cache=20in=20IndexedDb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #9959 May fix #9724 --- package.json | 2 +- packages/client/package.json | 2 + .../client/src/components/MkAutocomplete.vue | 15 +- .../client/src/components/MkEmojiPicker.vue | 36 +- packages/client/src/emojilist.json | 1785 ----------------- packages/client/src/scripts/emojilist.ts | 129 +- pnpm-lock.yaml | 14 + rome.json | 1 - 8 files changed, 167 insertions(+), 1817 deletions(-) delete mode 100644 packages/client/src/emojilist.json diff --git a/package.json b/package.json index 42a18a33c1..fbdd888edc 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "git", "url": "https://codeberg.org/calckey/calckey.git" }, - "packageManager": "pnpm@8.6.2", + "packageManager": "pnpm@8.6.3", "private": true, "scripts": { "rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp", diff --git a/packages/client/package.json b/packages/client/package.json index 9816f69631..b8ba93b903 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -44,6 +44,7 @@ "cross-env": "7.0.3", "cypress": "10.11.0", "date-fns": "2.30.0", + "emojilib": "^3.0.10", "escape-regexp": "0.0.1", "eventemitter3": "4.0.7", "focus-trap": "^7.4.3", @@ -79,6 +80,7 @@ "tsconfig-paths": "4.2.0", "twemoji-parser": "14.0.0", "typescript": "5.1.3", + "unicode-emoji-json": "^0.4.0", "uuid": "9.0.0", "vanilla-tilt": "1.8.0", "vite": "4.3.9", diff --git a/packages/client/src/components/MkAutocomplete.vue b/packages/client/src/components/MkAutocomplete.vue index 0455bd9d54..62556833c3 100644 --- a/packages/client/src/components/MkAutocomplete.vue +++ b/packages/client/src/components/MkAutocomplete.vue @@ -99,7 +99,7 @@ import { acct } from "@/filters/user"; import * as os from "@/os"; import { MFM_TAGS } from "@/scripts/mfm-tags"; import { defaultStore } from "@/store"; -import { emojilist } from "@/scripts/emojilist"; +import { getEmojiData } from "@/scripts/emojilist"; import { instance } from "@/instance"; import { i18n } from "@/i18n"; @@ -111,22 +111,23 @@ type EmojiDef = { isCustomEmoji?: boolean; }; +const emojilist = await getEmojiData(); const lib = emojilist.filter((x) => x.category !== "flags"); const emjdb: EmojiDef[] = lib.map((x) => ({ - emoji: x.char, - name: x.name, - url: char2filePath(x.char), + emoji: x.emoji, + name: x.slug, + url: char2filePath(x.emoji), })); for (const x of lib) { if (x.keywords) { for (const k of x.keywords) { emjdb.push({ - emoji: x.char, + emoji: x.emoji, name: k, - aliasOf: x.name, - url: char2filePath(x.char), + aliasOf: x.slug, + url: char2filePath(x.emoji), }); } } diff --git a/packages/client/src/components/MkEmojiPicker.vue b/packages/client/src/components/MkEmojiPicker.vue index 3dd54ed840..9cff6b910b 100644 --- a/packages/client/src/components/MkEmojiPicker.vue +++ b/packages/client/src/components/MkEmojiPicker.vue @@ -42,13 +42,13 @@ <div v-if="searchResultUnicode.length > 0" class="body"> <button v-for="emoji in searchResultUnicode" - :key="emoji.name" + :key="emoji.slug" class="_button item" - :title="emoji.name" + :title="emoji.slug" tabindex="0" @click="chosen(emoji, $event)" > - <MkEmoji class="emoji" :emoji="emoji.char" /> + <MkEmoji class="emoji" :emoji="emoji.emoji" /> </button> </div> </section> @@ -116,10 +116,12 @@ :emojis=" emojilist .filter((e) => e.category === category) - .map((e) => e.char) + .map((e) => e.emoji) " @chosen="chosen" - >{{ category }}</XSection + >{{ + getNicelyLabeledCategory(category) || category + }}</XSection > </div> </div> @@ -162,9 +164,10 @@ import { ref, computed, watch, onMounted } from "vue"; import * as Misskey from "calckey-js"; import XSection from "@/components/MkEmojiPicker.section.vue"; import { - emojilist, + getEmojiData, UnicodeEmojiDef, unicodeEmojiCategories as categories, + getNicelyLabeledCategory, } from "@/scripts/emojilist"; import { getStaticImageUrl } from "@/scripts/get-static-image-url"; import Ripple from "@/components/MkRipple.vue"; @@ -216,6 +219,7 @@ const height = computed(() => const customEmojiCategories = emojiCategories; const customEmojis = instance.emojis; const q = ref<string | null>(null); +const emojilist = await getEmojiData(); const searchResultCustom = ref<Misskey.entities.CustomEmoji[]>([]); const searchResultUnicode = ref<UnicodeEmojiDef[]>([]); const tab = ref<"index" | "custom" | "unicode" | "tags">("index"); @@ -232,7 +236,7 @@ watch(q, () => { const newQ = q.value.replace(/:/g, "").toLowerCase(); const searchCustom = () => { - const max = 8; + const max = 16; const emojis = customEmojis; const matches = new Set<Misskey.entities.CustomEmoji>(); @@ -304,11 +308,11 @@ watch(q, () => { }; const searchUnicode = () => { - const max = 8; + const max = 32; const emojis = emojilist; const matches = new Set<UnicodeEmojiDef>(); - const exactMatch = emojis.find((emoji) => emoji.name === newQ); + const exactMatch = emojis.find((emoji) => emoji.slug === newQ); if (exactMatch) matches.add(exactMatch); if (newQ.includes(" ")) { @@ -329,8 +333,8 @@ watch(q, () => { if ( keywords.every( (keyword) => - emoji.name.includes(keyword) || - emoji.keywords.some((alias) => + emoji.slug.includes(keyword) || + emoji.keywords?.some((alias) => alias.includes(keyword) ) ) @@ -341,7 +345,7 @@ watch(q, () => { } } else { for (const emoji of emojis) { - if (emoji.name.startsWith(newQ)) { + if (emoji.slug.startsWith(newQ)) { matches.add(emoji); if (matches.size >= max) break; } @@ -350,7 +354,7 @@ watch(q, () => { for (const emoji of emojis) { if ( - emoji.keywords.some((keyword) => keyword.startsWith(newQ)) + emoji.keywords?.some((keyword) => keyword.startsWith(newQ)) ) { matches.add(emoji); if (matches.size >= max) break; @@ -359,7 +363,7 @@ watch(q, () => { if (matches.size >= max) return matches; for (const emoji of emojis) { - if (emoji.name.includes(newQ)) { + if (emoji.slug.includes(newQ)) { matches.add(emoji); if (matches.size >= max) break; } @@ -367,7 +371,7 @@ watch(q, () => { if (matches.size >= max) return matches; for (const emoji of emojis) { - if (emoji.keywords.some((keyword) => keyword.includes(newQ))) { + if (emoji.keywords?.some((keyword) => keyword.includes(newQ))) { matches.add(emoji); if (matches.size >= max) break; } @@ -441,7 +445,7 @@ function done(query?: any): boolean | void { return true; } const exactMatchUnicode = emojilist.find( - (emoji) => emoji.char === q2 || emoji.name === q2 + (emoji) => emoji.emoji === q2 || emoji.slug === q2 ); if (exactMatchUnicode) { chosen(exactMatchUnicode); diff --git a/packages/client/src/emojilist.json b/packages/client/src/emojilist.json deleted file mode 100644 index 37a9765a5f..0000000000 --- a/packages/client/src/emojilist.json +++ /dev/null @@ -1,1785 +0,0 @@ -[ - { "category": "face", "char": "😀", "name": "grinning", "keywords": ["face", "smile", "happy", "joy", ": D", "grin"] }, - { "category": "face", "char": "😬", "name": "grimacing", "keywords": ["face", "grimace", "teeth"] }, - { "category": "face", "char": "😁", "name": "grin", "keywords": ["face", "happy", "smile", "joy", "kawaii"] }, - { "category": "face", "char": "😂", "name": "joy", "keywords": ["face", "cry", "tears", "weep", "happy", "happytears", "haha"] }, - { "category": "face", "char": "🤣", "name": "rofl", "keywords": ["face", "rolling", "floor", "laughing", "lol", "haha"] }, - { "category": "face", "char": "🥳", "name": "partying", "keywords": ["face", "celebration", "woohoo"] }, - { "category": "face", "char": "😃", "name": "smiley", "keywords": ["face", "happy", "joy", "haha", ": D", ": )", "smile", "funny"] }, - { "category": "face", "char": "😄", "name": "smile", "keywords": ["face", "happy", "joy", "funny", "haha", "laugh", "like", ": D", ": )"] }, - { "category": "face", "char": "😅", "name": "sweat_smile", "keywords": ["face", "hot", "happy", "laugh", "sweat", "smile", "relief"] }, - { "category": "face", "char": "🥲", "name": "smiling_face_with_tear", "keywords": ["face"] }, - { "category": "face", "char": "😆", "name": "laughing", "keywords": ["happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh"] }, - { "category": "face", "char": "😇", "name": "innocent", "keywords": ["face", "angel", "heaven", "halo"] }, - { "category": "face", "char": "😉", "name": "wink", "keywords": ["face", "happy", "mischievous", "secret", ";)", "smile", "eye"] }, - { "category": "face", "char": "😊", "name": "blush", "keywords": ["face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy"] }, - { "category": "face", "char": "🙂", "name": "slightly_smiling_face", "keywords": ["face", "smile"] }, - { "category": "face", "char": "🙃", "name": "upside_down_face", "keywords": ["face", "flipped", "silly", "smile"] }, - { "category": "face", "char": "☺️", "name": "relaxed", "keywords": ["face", "blush", "massage", "happiness"] }, - { "category": "face", "char": "😋", "name": "yum", "keywords": ["happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring"] }, - { "category": "face", "char": "😌", "name": "relieved", "keywords": ["face", "relaxed", "phew", "massage", "happiness"] }, - { "category": "face", "char": "😍", "name": "heart_eyes", "keywords": ["face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart"] }, - { "category": "face", "char": "🥰", "name": "smiling_face_with_three_hearts", "keywords": ["face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore"] }, - { "category": "face", "char": "😘", "name": "kissing_heart", "keywords": ["face", "love", "like", "affection", "valentines", "infatuation", "kiss"] }, - { "category": "face", "char": "😗", "name": "kissing", "keywords": ["love", "like", "face", "3", "valentines", "infatuation", "kiss"] }, - { "category": "face", "char": "😙", "name": "kissing_smiling_eyes", "keywords": ["face", "affection", "valentines", "infatuation", "kiss"] }, - { "category": "face", "char": "😚", "name": "kissing_closed_eyes", "keywords": ["face", "love", "like", "affection", "valentines", "infatuation", "kiss"] }, - { "category": "face", "char": "😜", "name": "stuck_out_tongue_winking_eye", "keywords": ["face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue"] }, - { "category": "face", "char": "🤪", "name": "zany", "keywords": ["face", "goofy", "crazy"] }, - { "category": "face", "char": "🤨", "name": "raised_eyebrow", "keywords": ["face", "distrust", "scepticism", "disapproval", "disbelief", "surprise"] }, - { "category": "face", "char": "🧐", "name": "monocle", "keywords": ["face", "stuffy", "wealthy"] }, - { "category": "face", "char": "😝", "name": "stuck_out_tongue_closed_eyes", "keywords": ["face", "prank", "playful", "mischievous", "smile", "tongue"] }, - { "category": "face", "char": "😛", "name": "stuck_out_tongue", "keywords": ["face", "prank", "childish", "playful", "mischievous", "smile", "tongue"] }, - { "category": "face", "char": "🤑", "name": "money_mouth_face", "keywords": ["face", "rich", "dollar", "money"] }, - { "category": "face", "char": "🤓", "name": "nerd_face", "keywords": ["face", "nerdy", "geek", "dork"] }, - { "category": "face", "char": "🥸", "name": "disguised_face", "keywords": ["face", "nose", "glasses", "incognito"] }, - { "category": "face", "char": "😎", "name": "sunglasses", "keywords": ["face", "cool", "smile", "summer", "beach", "sunglass"] }, - { "category": "face", "char": "🤩", "name": "star_struck", "keywords": ["face", "smile", "starry", "eyes", "grinning"] }, - { "category": "face", "char": "🤡", "name": "clown_face", "keywords": ["face"] }, - { "category": "face", "char": "🤠", "name": "cowboy_hat_face", "keywords": ["face", "cowgirl", "hat"] }, - { "category": "face", "char": "🤗", "name": "hugs", "keywords": ["face", "smile", "hug"] }, - { "category": "face", "char": "😏", "name": "smirk", "keywords": ["face", "smile", "mean", "prank", "smug", "sarcasm"] }, - { "category": "face", "char": "😶", "name": "no_mouth", "keywords": ["face", "hellokitty"] }, - { "category": "face", "char": "😐", "name": "neutral_face", "keywords": ["indifference", "meh", ": |", "neutral"] }, - { "category": "face", "char": "😑", "name": "expressionless", "keywords": ["face", "indifferent", "-_-", "meh", "deadpan"] }, - { "category": "face", "char": "😒", "name": "unamused", "keywords": ["indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye"] }, - { "category": "face", "char": "🙄", "name": "roll_eyes", "keywords": ["face", "eyeroll", "frustrated"] }, - { "category": "face", "char": "🤔", "name": "thinking", "keywords": ["face", "hmmm", "think", "consider"] }, - { "category": "face", "char": "🤥", "name": "lying_face", "keywords": ["face", "lie", "pinocchio"] }, - { "category": "face", "char": "🤭", "name": "hand_over_mouth", "keywords": ["face", "whoops", "shock", "surprise"] }, - { "category": "face", "char": "🤫", "name": "shushing", "keywords": ["face", "quiet", "shhh"] }, - { "category": "face", "char": "🤬", "name": "symbols_over_mouth", "keywords": ["face", "swearing", "cursing", "cussing", "profanity", "expletive"] }, - { "category": "face", "char": "🤯", "name": "exploding_head", "keywords": ["face", "shocked", "mind", "blown"] }, - { "category": "face", "char": "😳", "name": "flushed", "keywords": ["face", "blush", "shy", "flattered"] }, - { "category": "face", "char": "😞", "name": "disappointed", "keywords": ["face", "sad", "upset", "depressed", ": ("] }, - { "category": "face", "char": "😟", "name": "worried", "keywords": ["face", "concern", "nervous", ": ("] }, - { "category": "face", "char": "😠", "name": "angry", "keywords": ["mad", "face", "annoyed", "frustrated"] }, - { "category": "face", "char": "😡", "name": "rage", "keywords": ["angry", "mad", "hate", "despise"] }, - { "category": "face", "char": "😔", "name": "pensive", "keywords": ["face", "sad", "depressed", "upset"] }, - { "category": "face", "char": "😕", "name": "confused", "keywords": ["face", "indifference", "huh", "weird", "hmmm", ": /"] }, - { "category": "face", "char": "🙁", "name": "slightly_frowning_face", "keywords": ["face", "frowning", "disappointed", "sad", "upset"] }, - { "category": "face", "char": "☹", "name": "frowning_face", "keywords": ["face", "sad", "upset", "frown"] }, - { "category": "face", "char": "😣", "name": "persevere", "keywords": ["face", "sick", "no", "upset", "oops"] }, - { "category": "face", "char": "😖", "name": "confounded", "keywords": ["face", "confused", "sick", "unwell", "oops", ": S"] }, - { "category": "face", "char": "😫", "name": "tired_face", "keywords": ["sick", "whine", "upset", "frustrated"] }, - { "category": "face", "char": "😩", "name": "weary", "keywords": ["face", "tired", "sleepy", "sad", "frustrated", "upset"] }, - { "category": "face", "char": "🥺", "name": "pleading", "keywords": ["face", "begging", "mercy"] }, - { "category": "face", "char": "😤", "name": "triumph", "keywords": ["face", "gas", "phew", "proud", "pride"] }, - { "category": "face", "char": "😮", "name": "open_mouth", "keywords": ["face", "surprise", "impressed", "wow", "whoa", ": O"] }, - { "category": "face", "char": "😱", "name": "scream", "keywords": ["face", "munch", "scared", "omg"] }, - { "category": "face", "char": "😨", "name": "fearful", "keywords": ["face", "scared", "terrified", "nervous", "oops", "huh"] }, - { "category": "face", "char": "😰", "name": "cold_sweat", "keywords": ["face", "nervous", "sweat"] }, - { "category": "face", "char": "😯", "name": "hushed", "keywords": ["face", "woo", "shh"] }, - { "category": "face", "char": "😦", "name": "frowning", "keywords": ["face", "aw", "what"] }, - { "category": "face", "char": "😧", "name": "anguished", "keywords": ["face", "stunned", "nervous"] }, - { "category": "face", "char": "😢", "name": "cry", "keywords": ["face", "tears", "sad", "depressed", "upset", ": '("] }, - { "category": "face", "char": "😥", "name": "disappointed_relieved", "keywords": ["face", "phew", "sweat", "nervous"] }, - { "category": "face", "char": "🤤", "name": "drooling_face", "keywords": ["face"] }, - { "category": "face", "char": "😪", "name": "sleepy", "keywords": ["face", "tired", "rest", "nap"] }, - { "category": "face", "char": "😓", "name": "sweat", "keywords": ["face", "hot", "sad", "tired", "exercise"] }, - { "category": "face", "char": "🥵", "name": "hot", "keywords": ["face", "feverish", "heat", "red", "sweating"] }, - { "category": "face", "char": "🥶", "name": "cold", "keywords": ["face", "blue", "freezing", "frozen", "frostbite", "icicles"] }, - { "category": "face", "char": "😭", "name": "sob", "keywords": ["face", "cry", "tears", "sad", "upset", "depressed"] }, - { "category": "face", "char": "😵", "name": "dizzy_face", "keywords": ["spent", "unconscious", "xox", "dizzy"] }, - { "category": "face", "char": "😲", "name": "astonished", "keywords": ["face", "xox", "surprised", "poisoned"] }, - { "category": "face", "char": "🤐", "name": "zipper_mouth_face", "keywords": ["face", "sealed", "zipper", "secret"] }, - { "category": "face", "char": "🤢", "name": "nauseated_face", "keywords": ["face", "vomit", "gross", "green", "sick", "throw up", "ill"] }, - { "category": "face", "char": "🤧", "name": "sneezing_face", "keywords": ["face", "gesundheit", "sneeze", "sick", "allergy"] }, - { "category": "face", "char": "🤮", "name": "vomiting", "keywords": ["face", "sick"] }, - { "category": "face", "char": "😷", "name": "mask", "keywords": ["face", "sick", "ill", "disease"] }, - { "category": "face", "char": "🤒", "name": "face_with_thermometer", "keywords": ["sick", "temperature", "thermometer", "cold", "fever"] }, - { "category": "face", "char": "🤕", "name": "face_with_head_bandage", "keywords": ["injured", "clumsy", "bandage", "hurt"] }, - { "category": "face", "char": "🥴", "name": "woozy", "keywords": ["face", "dizzy", "intoxicated", "tipsy", "wavy"] }, - { "category": "face", "char": "🥱", "name": "yawning", "keywords": ["face", "tired", "yawning"] }, - { "category": "face", "char": "😴", "name": "sleeping", "keywords": ["face", "tired", "sleepy", "night", "zzz"] }, - { "category": "face", "char": "💤", "name": "zzz", "keywords": ["sleepy", "tired", "dream"] }, - { "category": "face", "char": "\uD83D\uDE36\u200D\uD83C\uDF2B\uFE0F", "name": "face_in_clouds", "keywords": [] }, - { "category": "face", "char": "\uD83D\uDE2E\u200D\uD83D\uDCA8", "name": "face_exhaling", "keywords": [] }, - { "category": "face", "char": "\uD83D\uDE35\u200D\uD83D\uDCAB", "name": "face_with_spiral_eyes", "keywords": [] }, - { "category": "face", "char": "\uD83E\uDEE0", "name": "melting_face", "keywords": ["disappear", "dissolve", "liquid", "melt", "toketa"] }, - { "category": "face", "char": "\uD83E\uDEE2", "name": "face_with_open_eyes_and_hand_over_mouth", "keywords": ["amazement", "awe", "disbelief", "embarrass", "scared", "surprise", "ohoho"] }, - { "category": "face", "char": "\uD83E\uDEE3", "name": "face_with_peeking_eye", "keywords": ["captivated", "peep", "stare", "chunibyo"] }, - { "category": "face", "char": "\uD83E\uDEE1", "name": "saluting_face", "keywords": ["ok", "salute", "sunny", "troops", "yes", "raja"] }, - { "category": "face", "char": "\uD83E\uDEE5", "name": "dotted_line_face", "keywords": ["depressed", "disappear", "hide", "introvert", "invisible", "tensen"] }, - { "category": "face", "char": "\uD83E\uDEE4", "name": "face_with_diagonal_mouth", "keywords": ["disappointed", "meh", "skeptical", "unsure"] }, - { "category": "face", "char": "\uD83E\uDD79", "name": "face_holding_back_tears", "keywords": ["angry", "cry", "proud", "resist", "sad"] }, - { "category": "face", "char": "💩", "name": "poop", "keywords": ["hankey", "shitface", "fail", "turd", "shit"] }, - { "category": "face", "char": "😈", "name": "smiling_imp", "keywords": ["devil", "horns"] }, - { "category": "face", "char": "👿", "name": "imp", "keywords": ["devil", "angry", "horns"] }, - { "category": "face", "char": "👹", "name": "japanese_ogre", "keywords": ["monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre"] }, - { "category": "face", "char": "👺", "name": "japanese_goblin", "keywords": ["red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin"] }, - { "category": "face", "char": "💀", "name": "skull", "keywords": ["dead", "skeleton", "creepy", "death"] }, - { "category": "face", "char": "👻", "name": "ghost", "keywords": ["halloween", "spooky", "scary"] }, - { "category": "face", "char": "👽", "name": "alien", "keywords": ["UFO", "paul", "weird", "outer_space"] }, - { "category": "face", "char": "🤖", "name": "robot", "keywords": ["computer", "machine", "bot"] }, - { "category": "face", "char": "😺", "name": "smiley_cat", "keywords": ["animal", "cats", "happy", "smile"] }, - { "category": "face", "char": "😸", "name": "smile_cat", "keywords": ["animal", "cats", "smile"] }, - { "category": "face", "char": "😹", "name": "joy_cat", "keywords": ["animal", "cats", "haha", "happy", "tears"] }, - { "category": "face", "char": "😻", "name": "heart_eyes_cat", "keywords": ["animal", "love", "like", "affection", "cats", "valentines", "heart"] }, - { "category": "face", "char": "😼", "name": "smirk_cat", "keywords": ["animal", "cats", "smirk"] }, - { "category": "face", "char": "😽", "name": "kissing_cat", "keywords": ["animal", "cats", "kiss"] }, - { "category": "face", "char": "🙀", "name": "scream_cat", "keywords": ["animal", "cats", "munch", "scared", "scream"] }, - { "category": "face", "char": "😿", "name": "crying_cat_face", "keywords": ["animal", "tears", "weep", "sad", "cats", "upset", "cry"] }, - { "category": "face", "char": "😾", "name": "pouting_cat", "keywords": ["animal", "cats"] }, - { "category": "people", "char": "🤲", "name": "palms_up", "keywords": ["hands", "gesture", "cupped", "prayer"] }, - { "category": "people", "char": "🙌", "name": "raised_hands", "keywords": ["gesture", "hooray", "yea", "celebration", "hands"] }, - { "category": "people", "char": "👏", "name": "clap", "keywords": ["hands", "praise", "applause", "congrats", "yay"] }, - { "category": "people", "char": "👋", "name": "wave", "keywords": ["hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm"] }, - { "category": "people", "char": "🤙", "name": "call_me_hand", "keywords": ["hands", "gesture"] }, - { "category": "people", "char": "👍", "name": "+1", "keywords": ["thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like"] }, - { "category": "people", "char": "👎", "name": "-1", "keywords": ["thumbsdown", "no", "dislike", "hand"] }, - { "category": "people", "char": "👊", "name": "facepunch", "keywords": ["angry", "violence", "fist", "hit", "attack", "hand"] }, - { "category": "people", "char": "✊", "name": "fist", "keywords": ["fingers", "hand", "grasp"] }, - { "category": "people", "char": "🤛", "name": "fist_left", "keywords": ["hand", "fistbump"] }, - { "category": "people", "char": "🤜", "name": "fist_right", "keywords": ["hand", "fistbump"] }, - { "category": "people", "char": "✌", "name": "v", "keywords": ["fingers", "ohyeah", "hand", "peace", "victory", "two"] }, - { "category": "people", "char": "👌", "name": "ok_hand", "keywords": ["fingers", "limbs", "perfect", "ok", "okay"] }, - { "category": "people", "char": "✋", "name": "raised_hand", "keywords": ["fingers", "stop", "highfive", "palm", "ban"] }, - { "category": "people", "char": "🤚", "name": "raised_back_of_hand", "keywords": ["fingers", "raised", "backhand"] }, - { "category": "people", "char": "👐", "name": "open_hands", "keywords": ["fingers", "butterfly", "hands", "open"] }, - { "category": "people", "char": "💪", "name": "muscle", "keywords": ["arm", "flex", "hand", "summer", "strong", "biceps"] }, - { "category": "people", "char": "🦾", "name": "mechanical_arm", "keywords": ["flex", "hand", "strong", "biceps"] }, - { "category": "people", "char": "🙏", "name": "pray", "keywords": ["please", "hope", "wish", "namaste", "highfive"] }, - { "category": "people", "char": "🦶", "name": "foot", "keywords": ["kick", "stomp"] }, - { "category": "people", "char": "🦵", "name": "leg", "keywords": ["kick", "limb"] }, - { "category": "people", "char": "🦿", "name": "mechanical_leg", "keywords": ["kick", "limb"] }, - { "category": "people", "char": "🤝", "name": "handshake", "keywords": ["agreement", "shake"] }, - { "category": "people", "char": "☝", "name": "point_up", "keywords": ["hand", "fingers", "direction", "up"] }, - { "category": "people", "char": "👆", "name": "point_up_2", "keywords": ["fingers", "hand", "direction", "up"] }, - { "category": "people", "char": "👇", "name": "point_down", "keywords": ["fingers", "hand", "direction", "down"] }, - { "category": "people", "char": "👈", "name": "point_left", "keywords": ["direction", "fingers", "hand", "left"] }, - { "category": "people", "char": "👉", "name": "point_right", "keywords": ["fingers", "hand", "direction", "right"] }, - { "category": "people", "char": "🖕", "name": "fu", "keywords": ["hand", "fingers", "rude", "middle", "flipping"] }, - { "category": "people", "char": "🖐", "name": "raised_hand_with_fingers_splayed", "keywords": ["hand", "fingers", "palm"] }, - { "category": "people", "char": "🤟", "name": "love_you", "keywords": ["hand", "fingers", "gesture"] }, - { "category": "people", "char": "🤘", "name": "metal", "keywords": ["hand", "fingers", "evil_eye", "sign_of_horns", "rock_on"] }, - { "category": "people", "char": "🤞", "name": "crossed_fingers", "keywords": ["good", "lucky"] }, - { "category": "people", "char": "🖖", "name": "vulcan_salute", "keywords": ["hand", "fingers", "spock", "star trek"] }, - { "category": "people", "char": "✍", "name": "writing_hand", "keywords": ["lower_left_ballpoint_pen", "stationery", "write", "compose"] }, - { "category": "people", "char": "\uD83E\uDEF0", "name": "hand_with_index_finger_and_thumb_crossed", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF1", "name": "rightwards_hand", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF2", "name": "leftwards_hand", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF3", "name": "palm_down_hand", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF4", "name": "palm_up_hand", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF5", "name": "index_pointing_at_the_viewer", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF6", "name": "heart_hands", "keywords": ["moemoekyun"] }, - { "category": "people", "char": "🤏", "name": "pinching_hand", "keywords": ["hand", "fingers"] }, - { "category": "people", "char": "🤌", "name": "pinched_fingers", "keywords": ["hand", "fingers"] }, - { "category": "people", "char": "🤳", "name": "selfie", "keywords": ["camera", "phone"] }, - { "category": "people", "char": "💅", "name": "nail_care", "keywords": ["beauty", "manicure", "finger", "fashion", "nail", "slay"] }, - { "category": "people", "char": "👄", "name": "lips", "keywords": ["mouth", "kiss"] }, - { "category": "people", "char": "\uD83E\uDEE6", "name": "biting_lip", "keywords": ["sheesh"] }, - { "category": "people", "char": "🦷", "name": "tooth", "keywords": ["teeth", "dentist"] }, - { "category": "people", "char": "👅", "name": "tongue", "keywords": ["mouth", "playful"] }, - { "category": "people", "char": "👂", "name": "ear", "keywords": ["face", "hear", "sound", "listen"] }, - { "category": "people", "char": "🦻", "name": "ear_with_hearing_aid", "keywords": ["face", "hear", "sound", "listen"] }, - { "category": "people", "char": "👃", "name": "nose", "keywords": ["smell", "sniff"] }, - { "category": "people", "char": "👁", "name": "eye", "keywords": ["face", "look", "see", "watch", "stare"] }, - { "category": "people", "char": "👀", "name": "eyes", "keywords": ["look", "watch", "stalk", "peek", "see"] }, - { "category": "people", "char": "🧠", "name": "brain", "keywords": ["smart", "intelligent"] }, - { "category": "people", "char": "🫀", "name": "anatomical_heart", "keywords": [] }, - { "category": "people", "char": "🫁", "name": "lungs", "keywords": [] }, - { "category": "people", "char": "👤", "name": "bust_in_silhouette", "keywords": ["user", "person", "human"] }, - { "category": "people", "char": "👥", "name": "busts_in_silhouette", "keywords": ["user", "person", "human", "group", "team"] }, - { "category": "people", "char": "🗣", "name": "speaking_head", "keywords": ["user", "person", "human", "sing", "say", "talk"] }, - { "category": "people", "char": "👶", "name": "baby", "keywords": ["child", "boy", "girl", "toddler"] }, - { "category": "people", "char": "🧒", "name": "child", "keywords": ["gender-neutral", "young"] }, - { "category": "people", "char": "👦", "name": "boy", "keywords": ["man", "male", "guy", "teenager"] }, - { "category": "people", "char": "👧", "name": "girl", "keywords": ["female", "woman", "teenager"] }, - { "category": "people", "char": "🧑", "name": "adult", "keywords": ["gender-neutral", "person"] }, - { "category": "people", "char": "👨", "name": "man", "keywords": ["mustache", "father", "dad", "guy", "classy", "sir", "moustache"] }, - { "category": "people", "char": "👩", "name": "woman", "keywords": ["female", "girls", "lady"] }, - { "category": "people", "char": "🧑🦱", "name": "curly_hair", "keywords": ["curly", "afro", "braids", "ringlets"] }, - { "category": "people", "char": "👩🦱", "name": "curly_hair_woman", "keywords": ["woman", "female", "girl", "curly", "afro", "braids", "ringlets"] }, - { "category": "people", "char": "👨🦱", "name": "curly_hair_man", "keywords": ["man", "male", "boy", "guy", "curly", "afro", "braids", "ringlets"] }, - { "category": "people", "char": "🧑🦰", "name": "red_hair", "keywords": ["redhead"] }, - { "category": "people", "char": "👩🦰", "name": "red_hair_woman", "keywords": ["woman", "female", "girl", "ginger", "redhead"] }, - { "category": "people", "char": "👨🦰", "name": "red_hair_man", "keywords": ["man", "male", "boy", "guy", "ginger", "redhead"] }, - { "category": "people", "char": "👱♀️", "name": "blonde_woman", "keywords": ["woman", "female", "girl", "blonde", "person"] }, - { "category": "people", "char": "👱", "name": "blonde_man", "keywords": ["man", "male", "boy", "blonde", "guy", "person"] }, - { "category": "people", "char": "🧑🦳", "name": "white_hair", "keywords": ["gray", "old", "white"] }, - { "category": "people", "char": "👩🦳", "name": "white_hair_woman", "keywords": ["woman", "female", "girl", "gray", "old", "white"] }, - { "category": "people", "char": "👨🦳", "name": "white_hair_man", "keywords": ["man", "male", "boy", "guy", "gray", "old", "white"] }, - { "category": "people", "char": "🧑🦲", "name": "bald", "keywords": ["bald", "chemotherapy", "hairless", "shaven"] }, - { "category": "people", "char": "👩🦲", "name": "bald_woman", "keywords": ["woman", "female", "girl", "bald", "chemotherapy", "hairless", "shaven"] }, - { "category": "people", "char": "👨🦲", "name": "bald_man", "keywords": ["man", "male", "boy", "guy", "bald", "chemotherapy", "hairless", "shaven"] }, - { "category": "people", "char": "🧔", "name": "bearded_person", "keywords": ["person", "bewhiskered"] }, - { "category": "people", "char": "🧓", "name": "older_adult", "keywords": ["human", "elder", "senior", "gender-neutral"] }, - { "category": "people", "char": "👴", "name": "older_man", "keywords": ["human", "male", "men", "old", "elder", "senior"] }, - { "category": "people", "char": "👵", "name": "older_woman", "keywords": ["human", "female", "women", "lady", "old", "elder", "senior"] }, - { "category": "people", "char": "👲", "name": "man_with_gua_pi_mao", "keywords": ["male", "boy", "chinese"] }, - { "category": "people", "char": "🧕", "name": "woman_with_headscarf", "keywords": ["female", "hijab", "mantilla", "tichel"] }, - { "category": "people", "char": "👳♀️", "name": "woman_with_turban", "keywords": ["female", "indian", "hinduism", "arabs", "woman"] }, - { "category": "people", "char": "👳", "name": "man_with_turban", "keywords": ["male", "indian", "hinduism", "arabs"] }, - { "category": "people", "char": "👮♀️", "name": "policewoman", "keywords": ["woman", "police", "law", "legal", "enforcement", "arrest", "911", "female"] }, - { "category": "people", "char": "👮", "name": "policeman", "keywords": ["man", "police", "law", "legal", "enforcement", "arrest", "911"] }, - { "category": "people", "char": "👷♀️", "name": "construction_worker_woman", "keywords": ["female", "human", "wip", "build", "construction", "worker", "labor", "woman"] }, - { "category": "people", "char": "👷", "name": "construction_worker_man", "keywords": ["male", "human", "wip", "guy", "build", "construction", "worker", "labor"] }, - { "category": "people", "char": "💂♀️", "name": "guardswoman", "keywords": ["uk", "gb", "british", "female", "royal", "woman"] }, - { "category": "people", "char": "💂", "name": "guardsman", "keywords": ["uk", "gb", "british", "male", "guy", "royal"] }, - { "category": "people", "char": "🕵️♀️", "name": "female_detective", "keywords": ["human", "spy", "detective", "female", "woman"] }, - { "category": "people", "char": "🕵", "name": "male_detective", "keywords": ["human", "spy", "detective"] }, - { "category": "people", "char": "🧑⚕️", "name": "health_worker", "keywords": ["doctor", "nurse", "therapist", "healthcare", "human"] }, - { "category": "people", "char": "👩⚕️", "name": "woman_health_worker", "keywords": ["doctor", "nurse", "therapist", "healthcare", "woman", "human"] }, - { "category": "people", "char": "👨⚕️", "name": "man_health_worker", "keywords": ["doctor", "nurse", "therapist", "healthcare", "man", "human"] }, - { "category": "people", "char": "🧑🌾", "name": "farmer", "keywords": ["rancher", "gardener", "human"] }, - { "category": "people", "char": "👩🌾", "name": "woman_farmer", "keywords": ["rancher", "gardener", "woman", "human"] }, - { "category": "people", "char": "👨🌾", "name": "man_farmer", "keywords": ["rancher", "gardener", "man", "human"] }, - { "category": "people", "char": "🧑🍳", "name": "cook", "keywords": ["chef", "human"] }, - { "category": "people", "char": "👩🍳", "name": "woman_cook", "keywords": ["chef", "woman", "human"] }, - { "category": "people", "char": "👨🍳", "name": "man_cook", "keywords": ["chef", "man", "human"] }, - { "category": "people", "char": "🧑🎓", "name": "student", "keywords": ["graduate", "human"] }, - { "category": "people", "char": "👩🎓", "name": "woman_student", "keywords": ["graduate", "woman", "human"] }, - { "category": "people", "char": "👨🎓", "name": "man_student", "keywords": ["graduate", "man", "human"] }, - { "category": "people", "char": "🧑🎤", "name": "singer", "keywords": ["rockstar", "entertainer", "human"] }, - { "category": "people", "char": "👩🎤", "name": "woman_singer", "keywords": ["rockstar", "entertainer", "woman", "human"] }, - { "category": "people", "char": "👨🎤", "name": "man_singer", "keywords": ["rockstar", "entertainer", "man", "human"] }, - { "category": "people", "char": "🧑🏫", "name": "teacher", "keywords": ["instructor", "professor", "human"] }, - { "category": "people", "char": "👩🏫", "name": "woman_teacher", "keywords": ["instructor", "professor", "woman", "human"] }, - { "category": "people", "char": "👨🏫", "name": "man_teacher", "keywords": ["instructor", "professor", "man", "human"] }, - { "category": "people", "char": "🧑🏭", "name": "factory_worker", "keywords": ["assembly", "industrial", "human"] }, - { "category": "people", "char": "👩🏭", "name": "woman_factory_worker", "keywords": ["assembly", "industrial", "woman", "human"] }, - { "category": "people", "char": "👨🏭", "name": "man_factory_worker", "keywords": ["assembly", "industrial", "man", "human"] }, - { "category": "people", "char": "🧑💻", "name": "technologist", "keywords": ["coder", "developer", "engineer", "programmer", "software", "human", "laptop", "computer"] }, - { "category": "people", "char": "👩💻", "name": "woman_technologist", "keywords": ["coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer"] }, - { "category": "people", "char": "👨💻", "name": "man_technologist", "keywords": ["coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer"] }, - { "category": "people", "char": "🧑💼", "name": "office_worker", "keywords": ["business", "manager", "human"] }, - { "category": "people", "char": "👩💼", "name": "woman_office_worker", "keywords": ["business", "manager", "woman", "human"] }, - { "category": "people", "char": "👨💼", "name": "man_office_worker", "keywords": ["business", "manager", "man", "human"] }, - { "category": "people", "char": "🧑🔧", "name": "mechanic", "keywords": ["plumber", "human", "wrench"] }, - { "category": "people", "char": "👩🔧", "name": "woman_mechanic", "keywords": ["plumber", "woman", "human", "wrench"] }, - { "category": "people", "char": "👨🔧", "name": "man_mechanic", "keywords": ["plumber", "man", "human", "wrench"] }, - { "category": "people", "char": "🧑🔬", "name": "scientist", "keywords": ["biologist", "chemist", "engineer", "physicist", "human"] }, - { "category": "people", "char": "👩🔬", "name": "woman_scientist", "keywords": ["biologist", "chemist", "engineer", "physicist", "woman", "human"] }, - { "category": "people", "char": "👨🔬", "name": "man_scientist", "keywords": ["biologist", "chemist", "engineer", "physicist", "man", "human"] }, - { "category": "people", "char": "🧑🎨", "name": "artist", "keywords": ["painter", "human"] }, - { "category": "people", "char": "👩🎨", "name": "woman_artist", "keywords": ["painter", "woman", "human"] }, - { "category": "people", "char": "👨🎨", "name": "man_artist", "keywords": ["painter", "man", "human"] }, - { "category": "people", "char": "🧑🚒", "name": "firefighter", "keywords": ["fireman", "human"] }, - { "category": "people", "char": "👩🚒", "name": "woman_firefighter", "keywords": ["fireman", "woman", "human"] }, - { "category": "people", "char": "👨🚒", "name": "man_firefighter", "keywords": ["fireman", "man", "human"] }, - { "category": "people", "char": "🧑✈️", "name": "pilot", "keywords": ["aviator", "plane", "human"] }, - { "category": "people", "char": "👩✈️", "name": "woman_pilot", "keywords": ["aviator", "plane", "woman", "human"] }, - { "category": "people", "char": "👨✈️", "name": "man_pilot", "keywords": ["aviator", "plane", "man", "human"] }, - { "category": "people", "char": "🧑🚀", "name": "astronaut", "keywords": ["space", "rocket", "human"] }, - { "category": "people", "char": "👩🚀", "name": "woman_astronaut", "keywords": ["space", "rocket", "woman", "human"] }, - { "category": "people", "char": "👨🚀", "name": "man_astronaut", "keywords": ["space", "rocket", "man", "human"] }, - { "category": "people", "char": "🧑⚖️", "name": "judge", "keywords": ["justice", "court", "human"] }, - { "category": "people", "char": "👩⚖️", "name": "woman_judge", "keywords": ["justice", "court", "woman", "human"] }, - { "category": "people", "char": "👨⚖️", "name": "man_judge", "keywords": ["justice", "court", "man", "human"] }, - { "category": "people", "char": "🦸♀️", "name": "woman_superhero", "keywords": ["woman", "female", "good", "heroine", "superpowers"] }, - { "category": "people", "char": "🦸♂️", "name": "man_superhero", "keywords": ["man", "male", "good", "hero", "superpowers"] }, - { "category": "people", "char": "🦹♀️", "name": "woman_supervillain", "keywords": ["woman", "female", "evil", "bad", "criminal", "heroine", "superpowers"] }, - { "category": "people", "char": "🦹♂️", "name": "man_supervillain", "keywords": ["man", "male", "evil", "bad", "criminal", "hero", "superpowers"] }, - { "category": "people", "char": "🤶", "name": "mrs_claus", "keywords": ["woman", "female", "xmas", "mother christmas"] }, - { "category": "people", "char": "\uD83E\uDDD1\u200D\uD83C\uDF84", "name": "mx_claus", "keywords": ["xmas", "christmas"] }, - { "category": "people", "char": "🎅", "name": "santa", "keywords": ["festival", "man", "male", "xmas", "father christmas"] }, - { "category": "people", "char": "🥷", "name": "ninja", "keywords": [] }, - { "category": "people", "char": "🧙♀️", "name": "sorceress", "keywords": ["woman", "female", "mage", "witch"] }, - { "category": "people", "char": "🧙♂️", "name": "wizard", "keywords": ["man", "male", "mage", "sorcerer"] }, - { "category": "people", "char": "🧝♀️", "name": "woman_elf", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧝♂️", "name": "man_elf", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧛♀️", "name": "woman_vampire", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧛♂️", "name": "man_vampire", "keywords": ["man", "male", "dracula"] }, - { "category": "people", "char": "🧟♀️", "name": "woman_zombie", "keywords": ["woman", "female", "undead", "walking dead"] }, - { "category": "people", "char": "🧟♂️", "name": "man_zombie", "keywords": ["man", "male", "dracula", "undead", "walking dead"] }, - { "category": "people", "char": "🧞♀️", "name": "woman_genie", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧞♂️", "name": "man_genie", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧜♀️", "name": "mermaid", "keywords": ["woman", "female", "merwoman", "ariel"] }, - { "category": "people", "char": "🧜♂️", "name": "merman", "keywords": ["man", "male", "triton"] }, - { "category": "people", "char": "🧚♀️", "name": "woman_fairy", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧚♂️", "name": "man_fairy", "keywords": ["man", "male"] }, - { "category": "people", "char": "👼", "name": "angel", "keywords": ["heaven", "wings", "halo"] }, - { "category": "people", "char": "\uD83E\uDDCC", "name": "troll", "keywords": [] }, - { "category": "people", "char": "🤰", "name": "pregnant_woman", "keywords": ["baby"] }, - { "category": "people", "char": "\uD83E\uDEC3", "name": "pregnant_man", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEC4", "name": "pregnant_person", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEC5", "name": "person_with_crown", "keywords": [] }, - { "category": "people", "char": "🤱", "name": "breastfeeding", "keywords": ["nursing", "baby"] }, - { "category": "people", "char": "\uD83D\uDC69\u200D\uD83C\uDF7C", "name": "woman_feeding_baby", "keywords": [] }, - { "category": "people", "char": "\uD83D\uDC68\u200D\uD83C\uDF7C", "name": "man_feeding_baby", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDDD1\u200D\uD83C\uDF7C", "name": "person_feeding_baby", "keywords": [] }, - { "category": "people", "char": "👸", "name": "princess", "keywords": ["girl", "woman", "female", "blond", "crown", "royal", "queen"] }, - { "category": "people", "char": "🤴", "name": "prince", "keywords": ["boy", "man", "male", "crown", "royal", "king"] }, - { "category": "people", "char": "👰", "name": "person_with_veil", "keywords": ["couple", "marriage", "wedding", "woman", "bride"] }, - { "category": "people", "char": "👰", "name": "bride_with_veil", "keywords": ["couple", "marriage", "wedding", "woman", "bride"] }, - { "category": "people", "char": "🤵", "name": "person_in_tuxedo", "keywords": ["couple", "marriage", "wedding", "groom"] }, - { "category": "people", "char": "🤵", "name": "man_in_tuxedo", "keywords": ["couple", "marriage", "wedding", "groom"] }, - { "category": "people", "char": "🏃♀️", "name": "running_woman", "keywords": ["woman", "walking", "exercise", "race", "running", "female"] }, - { "category": "people", "char": "🏃", "name": "running_man", "keywords": ["man", "walking", "exercise", "race", "running"] }, - { "category": "people", "char": "🚶♀️", "name": "walking_woman", "keywords": ["human", "feet", "steps", "woman", "female"] }, - { "category": "people", "char": "🚶", "name": "walking_man", "keywords": ["human", "feet", "steps"] }, - { "category": "people", "char": "💃", "name": "dancer", "keywords": ["female", "girl", "woman", "fun"] }, - { "category": "people", "char": "🕺", "name": "man_dancing", "keywords": ["male", "boy", "fun", "dancer"] }, - { "category": "people", "char": "👯", "name": "dancing_women", "keywords": ["female", "bunny", "women", "girls"] }, - { "category": "people", "char": "👯♂️", "name": "dancing_men", "keywords": ["male", "bunny", "men", "boys"] }, - { "category": "people", "char": "👫", "name": "couple", "keywords": ["pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage"] }, - { "category": "people", "char": "\uD83E\uDDD1\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1", "name": "people_holding_hands", "keywords": ["pair", "couple", "love", "like", "bromance", "friendship", "people", "human"] }, - { "category": "people", "char": "👬", "name": "two_men_holding_hands", "keywords": ["pair", "couple", "love", "like", "bromance", "friendship", "people", "man", "human"] }, - { "category": "people", "char": "👭", "name": "two_women_holding_hands", "keywords": ["pair", "couple", "love", "like", "bromance", "friendship", "people", "female", "human"] }, - { "category": "people", "char": "🫂", "name": "people_hugging", "keywords": [] }, - { "category": "people", "char": "🙇♀️", "name": "bowing_woman", "keywords": ["woman", "female", "girl"] }, - { "category": "people", "char": "🙇", "name": "bowing_man", "keywords": ["man", "male", "boy"] }, - { "category": "people", "char": "🤦♂️", "name": "man_facepalming", "keywords": ["man", "male", "boy", "disbelief"] }, - { "category": "people", "char": "🤦♀️", "name": "woman_facepalming", "keywords": ["woman", "female", "girl", "disbelief"] }, - { "category": "people", "char": "🤷", "name": "woman_shrugging", "keywords": ["woman", "female", "girl", "confused", "indifferent", "doubt"] }, - { "category": "people", "char": "🤷♂️", "name": "man_shrugging", "keywords": ["man", "male", "boy", "confused", "indifferent", "doubt"] }, - { "category": "people", "char": "💁", "name": "tipping_hand_woman", "keywords": ["female", "girl", "woman", "human", "information"] }, - { "category": "people", "char": "💁♂️", "name": "tipping_hand_man", "keywords": ["male", "boy", "man", "human", "information"] }, - { "category": "people", "char": "🙅", "name": "no_good_woman", "keywords": ["female", "girl", "woman", "nope"] }, - { "category": "people", "char": "🙅♂️", "name": "no_good_man", "keywords": ["male", "boy", "man", "nope"] }, - { "category": "people", "char": "🙆", "name": "ok_woman", "keywords": ["women", "girl", "female", "pink", "human", "woman"] }, - { "category": "people", "char": "🙆♂️", "name": "ok_man", "keywords": ["men", "boy", "male", "blue", "human", "man"] }, - { "category": "people", "char": "🙋", "name": "raising_hand_woman", "keywords": ["female", "girl", "woman"] }, - { "category": "people", "char": "🙋♂️", "name": "raising_hand_man", "keywords": ["male", "boy", "man"] }, - { "category": "people", "char": "🙎", "name": "pouting_woman", "keywords": ["female", "girl", "woman"] }, - { "category": "people", "char": "🙎♂️", "name": "pouting_man", "keywords": ["male", "boy", "man"] }, - { "category": "people", "char": "🙍", "name": "frowning_woman", "keywords": ["female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy"] }, - { "category": "people", "char": "🙍♂️", "name": "frowning_man", "keywords": ["male", "boy", "man", "sad", "depressed", "discouraged", "unhappy"] }, - { "category": "people", "char": "💇", "name": "haircut_woman", "keywords": ["female", "girl", "woman"] }, - { "category": "people", "char": "💇♂️", "name": "haircut_man", "keywords": ["male", "boy", "man"] }, - { "category": "people", "char": "💆", "name": "massage_woman", "keywords": ["female", "girl", "woman", "head"] }, - { "category": "people", "char": "💆♂️", "name": "massage_man", "keywords": ["male", "boy", "man", "head"] }, - { "category": "people", "char": "🧖♀️", "name": "woman_in_steamy_room", "keywords": ["female", "woman", "spa", "steamroom", "sauna"] }, - { "category": "people", "char": "🧖♂️", "name": "man_in_steamy_room", "keywords": ["male", "man", "spa", "steamroom", "sauna"] }, - { "category": "people", "char": "🧏♀️", "name": "woman_deaf", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧏♂️", "name": "man_deaf", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧍♀️", "name": "woman_standing", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧍♂️", "name": "man_standing", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧎♀️", "name": "woman_kneeling", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧎♂️", "name": "man_kneeling", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧑🦯", "name": "person_with_probing_cane", "keywords": ["accessibility", "blind"] }, - { "category": "people", "char": "👩🦯", "name": "woman_with_probing_cane", "keywords": ["woman", "female", "accessibility", "blind"] }, - { "category": "people", "char": "👨🦯", "name": "man_with_probing_cane", "keywords": ["man", "male", "accessibility", "blind"] }, - { "category": "people", "char": "🧑🦼", "name": "person_in_motorized_wheelchair", "keywords": ["accessibility"] }, - { "category": "people", "char": "👩🦼", "name": "woman_in_motorized_wheelchair", "keywords": ["woman", "female", "accessibility"] }, - { "category": "people", "char": "👨🦼", "name": "man_in_motorized_wheelchair", "keywords": ["man", "male", "accessibility"] }, - { "category": "people", "char": "🧑🦽", "name": "person_in_manual_wheelchair", "keywords": ["accessibility"] }, - { "category": "people", "char": "👩🦽", "name": "woman_in_manual_wheelchair", "keywords": ["woman", "female", "accessibility"] }, - { "category": "people", "char": "👨🦽", "name": "man_in_manual_wheelchair", "keywords": ["man", "male", "accessibility"] }, - { "category": "people", "char": "💑", "name": "couple_with_heart_woman_man", "keywords": ["pair", "love", "like", "affection", "human", "dating", "valentines", "marriage"] }, - { "category": "people", "char": "👩❤️👩", "name": "couple_with_heart_woman_woman", "keywords": ["pair", "love", "like", "affection", "human", "dating", "valentines", "marriage"] }, - { "category": "people", "char": "👨❤️👨", "name": "couple_with_heart_man_man", "keywords": ["pair", "love", "like", "affection", "human", "dating", "valentines", "marriage"] }, - { "category": "people", "char": "💏", "name": "couplekiss_man_woman", "keywords": ["pair", "valentines", "love", "like", "dating", "marriage"] }, - { "category": "people", "char": "👩❤️💋👩", "name": "couplekiss_woman_woman", "keywords": ["pair", "valentines", "love", "like", "dating", "marriage"] }, - { "category": "people", "char": "👨❤️💋👨", "name": "couplekiss_man_man", "keywords": ["pair", "valentines", "love", "like", "dating", "marriage"] }, - { "category": "people", "char": "👪", "name": "family_man_woman_boy", "keywords": ["home", "parents", "child", "mom", "dad", "father", "mother", "people", "human"] }, - { "category": "people", "char": "👨👩👧", "name": "family_man_woman_girl", "keywords": ["home", "parents", "people", "human", "child"] }, - { "category": "people", "char": "👨👩👧👦", "name": "family_man_woman_girl_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👩👦👦", "name": "family_man_woman_boy_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👩👧👧", "name": "family_man_woman_girl_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👦", "name": "family_woman_woman_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👧", "name": "family_woman_woman_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👧👦", "name": "family_woman_woman_girl_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👦👦", "name": "family_woman_woman_boy_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👧👧", "name": "family_woman_woman_girl_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👦", "name": "family_man_man_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👧", "name": "family_man_man_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👧👦", "name": "family_man_man_girl_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👦👦", "name": "family_man_man_boy_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👧👧", "name": "family_man_man_girl_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👦", "name": "family_woman_boy", "keywords": ["home", "parent", "people", "human", "child"] }, - { "category": "people", "char": "👩👧", "name": "family_woman_girl", "keywords": ["home", "parent", "people", "human", "child"] }, - { "category": "people", "char": "👩👧👦", "name": "family_woman_girl_boy", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👩👦👦", "name": "family_woman_boy_boy", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👩👧👧", "name": "family_woman_girl_girl", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👨👦", "name": "family_man_boy", "keywords": ["home", "parent", "people", "human", "child"] }, - { "category": "people", "char": "👨👧", "name": "family_man_girl", "keywords": ["home", "parent", "people", "human", "child"] }, - { "category": "people", "char": "👨👧👦", "name": "family_man_girl_boy", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👨👦👦", "name": "family_man_boy_boy", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👨👧👧", "name": "family_man_girl_girl", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "🧶", "name": "yarn", "keywords": ["ball", "crochet", "knit"] }, - { "category": "people", "char": "🧵", "name": "thread", "keywords": ["needle", "sewing", "spool", "string"] }, - { "category": "people", "char": "🧥", "name": "coat", "keywords": ["jacket"] }, - { "category": "people", "char": "🥼", "name": "labcoat", "keywords": ["doctor", "experiment", "scientist", "chemist"] }, - { "category": "people", "char": "👚", "name": "womans_clothes", "keywords": ["fashion", "shopping_bags", "female"] }, - { "category": "people", "char": "👕", "name": "tshirt", "keywords": ["fashion", "cloth", "casual", "shirt", "tee"] }, - { "category": "people", "char": "👖", "name": "jeans", "keywords": ["fashion", "shopping"] }, - { "category": "people", "char": "👔", "name": "necktie", "keywords": ["shirt", "suitup", "formal", "fashion", "cloth", "business"] }, - { "category": "people", "char": "👗", "name": "dress", "keywords": ["clothes", "fashion", "shopping"] }, - { "category": "people", "char": "👙", "name": "bikini", "keywords": ["swimming", "female", "woman", "girl", "fashion", "beach", "summer"] }, - { "category": "people", "char": "🩱", "name": "one_piece_swimsuit", "keywords": ["swimming", "female", "woman", "girl", "fashion", "beach", "summer"] }, - { "category": "people", "char": "👘", "name": "kimono", "keywords": ["dress", "fashion", "women", "female", "japanese"] }, - { "category": "people", "char": "🥻", "name": "sari", "keywords": ["dress", "fashion", "women", "female"] }, - { "category": "people", "char": "🩲", "name": "briefs", "keywords": ["dress", "fashion"] }, - { "category": "people", "char": "🩳", "name": "shorts", "keywords": ["dress", "fashion"] }, - { "category": "people", "char": "💄", "name": "lipstick", "keywords": ["female", "girl", "fashion", "woman"] }, - { "category": "people", "char": "💋", "name": "kiss", "keywords": ["face", "lips", "love", "like", "affection", "valentines"] }, - { "category": "people", "char": "👣", "name": "footprints", "keywords": ["feet", "tracking", "walking", "beach"] }, - { "category": "people", "char": "🥿", "name": "flat_shoe", "keywords": ["ballet", "slip-on", "slipper"] }, - { "category": "people", "char": "👠", "name": "high_heel", "keywords": ["fashion", "shoes", "female", "pumps", "stiletto"] }, - { "category": "people", "char": "👡", "name": "sandal", "keywords": ["shoes", "fashion", "flip flops"] }, - { "category": "people", "char": "👢", "name": "boot", "keywords": ["shoes", "fashion"] }, - { "category": "people", "char": "👞", "name": "mans_shoe", "keywords": ["fashion", "male"] }, - { "category": "people", "char": "👟", "name": "athletic_shoe", "keywords": ["shoes", "sports", "sneakers"] }, - { "category": "people", "char": "🩴", "name": "thong_sandal", "keywords": [] }, - { "category": "people", "char": "🩰", "name": "ballet_shoes", "keywords": ["shoes", "sports"] }, - { "category": "people", "char": "🧦", "name": "socks", "keywords": ["stockings", "clothes"] }, - { "category": "people", "char": "🧤", "name": "gloves", "keywords": ["hands", "winter", "clothes"] }, - { "category": "people", "char": "🧣", "name": "scarf", "keywords": ["neck", "winter", "clothes"] }, - { "category": "people", "char": "👒", "name": "womans_hat", "keywords": ["fashion", "accessories", "female", "lady", "spring"] }, - { "category": "people", "char": "🎩", "name": "tophat", "keywords": ["magic", "gentleman", "classy", "circus"] }, - { "category": "people", "char": "🧢", "name": "billed_hat", "keywords": ["cap", "baseball"] }, - { "category": "people", "char": "⛑", "name": "rescue_worker_helmet", "keywords": ["construction", "build"] }, - { "category": "people", "char": "🪖", "name": "military_helmet", "keywords": [] }, - { "category": "people", "char": "🎓", "name": "mortar_board", "keywords": ["school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education"] }, - { "category": "people", "char": "👑", "name": "crown", "keywords": ["king", "kod", "leader", "royalty", "lord"] }, - { "category": "people", "char": "🎒", "name": "school_satchel", "keywords": ["student", "education", "bag", "backpack"] }, - { "category": "people", "char": "🧳", "name": "luggage", "keywords": ["packing", "travel"] }, - { "category": "people", "char": "👝", "name": "pouch", "keywords": ["bag", "accessories", "shopping"] }, - { "category": "people", "char": "👛", "name": "purse", "keywords": ["fashion", "accessories", "money", "sales", "shopping"] }, - { "category": "people", "char": "👜", "name": "handbag", "keywords": ["fashion", "accessory", "accessories", "shopping"] }, - { "category": "people", "char": "💼", "name": "briefcase", "keywords": ["business", "documents", "work", "law", "legal", "job", "career"] }, - { "category": "people", "char": "👓", "name": "eyeglasses", "keywords": ["fashion", "accessories", "eyesight", "nerdy", "dork", "geek"] }, - { "category": "people", "char": "🕶", "name": "dark_sunglasses", "keywords": ["face", "cool", "accessories"] }, - { "category": "people", "char": "🥽", "name": "goggles", "keywords": ["eyes", "protection", "safety"] }, - { "category": "people", "char": "💍", "name": "ring", "keywords": ["wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement"] }, - { "category": "people", "char": "🌂", "name": "closed_umbrella", "keywords": ["weather", "rain", "drizzle"] }, - { "category": "animals_and_nature", "char": "🐶", "name": "dog", "keywords": ["animal", "friend", "nature", "woof", "puppy", "pet", "faithful"] }, - { "category": "animals_and_nature", "char": "🐱", "name": "cat", "keywords": ["animal", "meow", "nature", "pet", "kitten"] }, - { "category": "animals_and_nature", "char": "🐈⬛", "name": "black_cat", "keywords": ["animal", "meow", "nature", "pet", "kitten"] }, - { "category": "animals_and_nature", "char": "🐭", "name": "mouse", "keywords": ["animal", "nature", "cheese_wedge", "rodent"] }, - { "category": "animals_and_nature", "char": "🐹", "name": "hamster", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐰", "name": "rabbit", "keywords": ["animal", "nature", "pet", "spring", "magic", "bunny"] }, - { "category": "animals_and_nature", "char": "🦊", "name": "fox_face", "keywords": ["animal", "nature", "face"] }, - { "category": "animals_and_nature", "char": "🐻", "name": "bear", "keywords": ["animal", "nature", "wild"] }, - { "category": "animals_and_nature", "char": "🐼", "name": "panda_face", "keywords": ["animal", "nature", "panda"] }, - { "category": "animals_and_nature", "char": "🐨", "name": "koala", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐯", "name": "tiger", "keywords": ["animal", "cat", "danger", "wild", "nature", "roar"] }, - { "category": "animals_and_nature", "char": "🦁", "name": "lion", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐮", "name": "cow", "keywords": ["beef", "ox", "animal", "nature", "moo", "milk"] }, - { "category": "animals_and_nature", "char": "🐷", "name": "pig", "keywords": ["animal", "oink", "nature"] }, - { "category": "animals_and_nature", "char": "🐽", "name": "pig_nose", "keywords": ["animal", "oink"] }, - { "category": "animals_and_nature", "char": "🐸", "name": "frog", "keywords": ["animal", "nature", "croak", "toad"] }, - { "category": "animals_and_nature", "char": "🦑", "name": "squid", "keywords": ["animal", "nature", "ocean", "sea"] }, - { "category": "animals_and_nature", "char": "🐙", "name": "octopus", "keywords": ["animal", "creature", "ocean", "sea", "nature", "beach"] }, - { "category": "animals_and_nature", "char": "🦐", "name": "shrimp", "keywords": ["animal", "ocean", "nature", "seafood"] }, - { "category": "animals_and_nature", "char": "🐵", "name": "monkey_face", "keywords": ["animal", "nature", "circus"] }, - { "category": "animals_and_nature", "char": "🦍", "name": "gorilla", "keywords": ["animal", "nature", "circus"] }, - { "category": "animals_and_nature", "char": "🙈", "name": "see_no_evil", "keywords": ["monkey", "animal", "nature", "haha"] }, - { "category": "animals_and_nature", "char": "🙉", "name": "hear_no_evil", "keywords": ["animal", "monkey", "nature"] }, - { "category": "animals_and_nature", "char": "🙊", "name": "speak_no_evil", "keywords": ["monkey", "animal", "nature", "omg"] }, - { "category": "animals_and_nature", "char": "🐒", "name": "monkey", "keywords": ["animal", "nature", "banana", "circus"] }, - { "category": "animals_and_nature", "char": "🐔", "name": "chicken", "keywords": ["animal", "cluck", "nature", "bird"] }, - { "category": "animals_and_nature", "char": "🐧", "name": "penguin", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐦", "name": "bird", "keywords": ["animal", "nature", "fly", "tweet", "spring"] }, - { "category": "animals_and_nature", "char": "🐤", "name": "baby_chick", "keywords": ["animal", "chicken", "bird"] }, - { "category": "animals_and_nature", "char": "🐣", "name": "hatching_chick", "keywords": ["animal", "chicken", "egg", "born", "baby", "bird"] }, - { "category": "animals_and_nature", "char": "🐥", "name": "hatched_chick", "keywords": ["animal", "chicken", "baby", "bird"] }, - { "category": "animals_and_nature", "char": "🦆", "name": "duck", "keywords": ["animal", "nature", "bird", "mallard"] }, - { "category": "animals_and_nature", "char": "🦅", "name": "eagle", "keywords": ["animal", "nature", "bird"] }, - { "category": "animals_and_nature", "char": "🦉", "name": "owl", "keywords": ["animal", "nature", "bird", "hoot"] }, - { "category": "animals_and_nature", "char": "🦇", "name": "bat", "keywords": ["animal", "nature", "blind", "vampire"] }, - { "category": "animals_and_nature", "char": "🐺", "name": "wolf", "keywords": ["animal", "nature", "wild"] }, - { "category": "animals_and_nature", "char": "🐗", "name": "boar", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐴", "name": "horse", "keywords": ["animal", "brown", "nature"] }, - { "category": "animals_and_nature", "char": "🦄", "name": "unicorn", "keywords": ["animal", "nature", "mystical"] }, - { "category": "animals_and_nature", "char": "🐝", "name": "honeybee", "keywords": ["animal", "insect", "nature", "bug", "spring", "honey"] }, - { "category": "animals_and_nature", "char": "🐛", "name": "bug", "keywords": ["animal", "insect", "nature", "worm"] }, - { "category": "animals_and_nature", "char": "🦋", "name": "butterfly", "keywords": ["animal", "insect", "nature", "caterpillar"] }, - { "category": "animals_and_nature", "char": "🐌", "name": "snail", "keywords": ["slow", "animal", "shell"] }, - { "category": "animals_and_nature", "char": "🐞", "name": "lady_beetle", "keywords": ["animal", "insect", "nature", "ladybug"] }, - { "category": "animals_and_nature", "char": "🐜", "name": "ant", "keywords": ["animal", "insect", "nature", "bug"] }, - { "category": "animals_and_nature", "char": "🦗", "name": "grasshopper", "keywords": ["animal", "cricket", "chirp"] }, - { "category": "animals_and_nature", "char": "🕷", "name": "spider", "keywords": ["animal", "arachnid"] }, - { "category": "animals_and_nature", "char": "🪲", "name": "beetle", "keywords": ["animal"] }, - { "category": "animals_and_nature", "char": "🪳", "name": "cockroach", "keywords": ["animal"] }, - { "category": "animals_and_nature", "char": "🪰", "name": "fly", "keywords": ["animal"] }, - { "category": "animals_and_nature", "char": "🪱", "name": "worm", "keywords": ["animal"] }, - { "category": "animals_and_nature", "char": "🦂", "name": "scorpion", "keywords": ["animal", "arachnid"] }, - { "category": "animals_and_nature", "char": "🦀", "name": "crab", "keywords": ["animal", "crustacean"] }, - { "category": "animals_and_nature", "char": "🐍", "name": "snake", "keywords": ["animal", "evil", "nature", "hiss", "python"] }, - { "category": "animals_and_nature", "char": "🦎", "name": "lizard", "keywords": ["animal", "nature", "reptile"] }, - { "category": "animals_and_nature", "char": "🦖", "name": "t-rex", "keywords": ["animal", "nature", "dinosaur", "tyrannosaurus", "extinct"] }, - { "category": "animals_and_nature", "char": "🦕", "name": "sauropod", "keywords": ["animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct"] }, - { "category": "animals_and_nature", "char": "🐢", "name": "turtle", "keywords": ["animal", "slow", "nature", "tortoise"] }, - { "category": "animals_and_nature", "char": "🐠", "name": "tropical_fish", "keywords": ["animal", "swim", "ocean", "beach", "nemo"] }, - { "category": "animals_and_nature", "char": "🐟", "name": "fish", "keywords": ["animal", "food", "nature"] }, - { "category": "animals_and_nature", "char": "🐡", "name": "blowfish", "keywords": ["animal", "nature", "food", "sea", "ocean"] }, - { "category": "animals_and_nature", "char": "🐬", "name": "dolphin", "keywords": ["animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach"] }, - { "category": "animals_and_nature", "char": "🦈", "name": "shark", "keywords": ["animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach"] }, - { "category": "animals_and_nature", "char": "🐳", "name": "whale", "keywords": ["animal", "nature", "sea", "ocean"] }, - { "category": "animals_and_nature", "char": "🐋", "name": "whale2", "keywords": ["animal", "nature", "sea", "ocean"] }, - { "category": "animals_and_nature", "char": "🐊", "name": "crocodile", "keywords": ["animal", "nature", "reptile", "lizard", "alligator"] }, - { "category": "animals_and_nature", "char": "🐆", "name": "leopard", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦓", "name": "zebra", "keywords": ["animal", "nature", "stripes", "safari"] }, - { "category": "animals_and_nature", "char": "🐅", "name": "tiger2", "keywords": ["animal", "nature", "roar"] }, - { "category": "animals_and_nature", "char": "🐃", "name": "water_buffalo", "keywords": ["animal", "nature", "ox", "cow"] }, - { "category": "animals_and_nature", "char": "🐂", "name": "ox", "keywords": ["animal", "cow", "beef"] }, - { "category": "animals_and_nature", "char": "🐄", "name": "cow2", "keywords": ["beef", "ox", "animal", "nature", "moo", "milk"] }, - { "category": "animals_and_nature", "char": "🦌", "name": "deer", "keywords": ["animal", "nature", "horns", "venison"] }, - { "category": "animals_and_nature", "char": "🐪", "name": "dromedary_camel", "keywords": ["animal", "hot", "desert", "hump"] }, - { "category": "animals_and_nature", "char": "🐫", "name": "camel", "keywords": ["animal", "nature", "hot", "desert", "hump"] }, - { "category": "animals_and_nature", "char": "🦒", "name": "giraffe", "keywords": ["animal", "nature", "spots", "safari"] }, - { "category": "animals_and_nature", "char": "🐘", "name": "elephant", "keywords": ["animal", "nature", "nose", "th", "circus"] }, - { "category": "animals_and_nature", "char": "🦏", "name": "rhinoceros", "keywords": ["animal", "nature", "horn"] }, - { "category": "animals_and_nature", "char": "🐐", "name": "goat", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐏", "name": "ram", "keywords": ["animal", "sheep", "nature"] }, - { "category": "animals_and_nature", "char": "🐑", "name": "sheep", "keywords": ["animal", "nature", "wool", "shipit"] }, - { "category": "animals_and_nature", "char": "🐎", "name": "racehorse", "keywords": ["animal", "gamble", "luck"] }, - { "category": "animals_and_nature", "char": "🐖", "name": "pig2", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐀", "name": "rat", "keywords": ["animal", "mouse", "rodent"] }, - { "category": "animals_and_nature", "char": "🐁", "name": "mouse2", "keywords": ["animal", "nature", "rodent"] }, - { "category": "animals_and_nature", "char": "🐓", "name": "rooster", "keywords": ["animal", "nature", "chicken"] }, - { "category": "animals_and_nature", "char": "🦃", "name": "turkey", "keywords": ["animal", "bird"] }, - { "category": "animals_and_nature", "char": "🕊", "name": "dove", "keywords": ["animal", "bird"] }, - { "category": "animals_and_nature", "char": "🐕", "name": "dog2", "keywords": ["animal", "nature", "friend", "doge", "pet", "faithful"] }, - { "category": "animals_and_nature", "char": "🐩", "name": "poodle", "keywords": ["dog", "animal", "101", "nature", "pet"] }, - { "category": "animals_and_nature", "char": "🐈", "name": "cat2", "keywords": ["animal", "meow", "pet", "cats"] }, - { "category": "animals_and_nature", "char": "🐇", "name": "rabbit2", "keywords": ["animal", "nature", "pet", "magic", "spring"] }, - { "category": "animals_and_nature", "char": "🐿", "name": "chipmunk", "keywords": ["animal", "nature", "rodent", "squirrel"] }, - { "category": "animals_and_nature", "char": "🦔", "name": "hedgehog", "keywords": ["animal", "nature", "spiny"] }, - { "category": "animals_and_nature", "char": "🦝", "name": "raccoon", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦙", "name": "llama", "keywords": ["animal", "nature", "alpaca"] }, - { "category": "animals_and_nature", "char": "🦛", "name": "hippopotamus", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦘", "name": "kangaroo", "keywords": ["animal", "nature", "australia", "joey", "hop", "marsupial"] }, - { "category": "animals_and_nature", "char": "🦡", "name": "badger", "keywords": ["animal", "nature", "honey"] }, - { "category": "animals_and_nature", "char": "🦢", "name": "swan", "keywords": ["animal", "nature", "bird"] }, - { "category": "animals_and_nature", "char": "🦚", "name": "peacock", "keywords": ["animal", "nature", "peahen", "bird"] }, - { "category": "animals_and_nature", "char": "🦜", "name": "parrot", "keywords": ["animal", "nature", "bird", "pirate", "talk"] }, - { "category": "animals_and_nature", "char": "🦞", "name": "lobster", "keywords": ["animal", "nature", "bisque", "claws", "seafood"] }, - { "category": "animals_and_nature", "char": "🦠", "name": "microbe", "keywords": ["amoeba", "bacteria", "germs"] }, - { "category": "animals_and_nature", "char": "🦟", "name": "mosquito", "keywords": ["animal", "nature", "insect", "malaria"] }, - { "category": "animals_and_nature", "char": "🦬", "name": "bison", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦣", "name": "mammoth", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦫", "name": "beaver", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐻❄️", "name": "polar_bear", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦤", "name": "dodo", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🪶", "name": "feather", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦭", "name": "seal", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐾", "name": "paw_prints", "keywords": ["animal", "tracking", "footprints", "dog", "cat", "pet", "feet", "paws", "kitty"] }, - { "category": "animals_and_nature", "char": "🐉", "name": "dragon", "keywords": ["animal", "myth", "nature", "chinese", "green"] }, - { "category": "animals_and_nature", "char": "🐲", "name": "dragon_face", "keywords": ["animal", "myth", "nature", "chinese", "green"] }, - { "category": "animals_and_nature", "char": "🦧", "name": "orangutan", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦮", "name": "guide_dog", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐕🦺", "name": "service_dog", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦥", "name": "sloth", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦦", "name": "otter", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦨", "name": "skunk", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦩", "name": "flamingo", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🌵", "name": "cactus", "keywords": ["vegetable", "plant", "nature"] }, - { "category": "animals_and_nature", "char": "🎄", "name": "christmas_tree", "keywords": ["festival", "vacation", "december", "xmas", "celebration"] }, - { "category": "animals_and_nature", "char": "🌲", "name": "evergreen_tree", "keywords": ["plant", "nature"] }, - { "category": "animals_and_nature", "char": "🌳", "name": "deciduous_tree", "keywords": ["plant", "nature"] }, - { "category": "animals_and_nature", "char": "🌴", "name": "palm_tree", "keywords": ["plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical"] }, - { "category": "animals_and_nature", "char": "🌱", "name": "seedling", "keywords": ["plant", "nature", "grass", "lawn", "spring"] }, - { "category": "animals_and_nature", "char": "🌿", "name": "herb", "keywords": ["vegetable", "plant", "medicine", "weed", "grass", "lawn"] }, - { "category": "animals_and_nature", "char": "☘", "name": "shamrock", "keywords": ["vegetable", "plant", "nature", "irish", "clover"] }, - { "category": "animals_and_nature", "char": "🍀", "name": "four_leaf_clover", "keywords": ["vegetable", "plant", "nature", "lucky", "irish"] }, - { "category": "animals_and_nature", "char": "🎍", "name": "bamboo", "keywords": ["plant", "nature", "vegetable", "panda", "pine_decoration"] }, - { "category": "animals_and_nature", "char": "🎋", "name": "tanabata_tree", "keywords": ["plant", "nature", "branch", "summer"] }, - { "category": "animals_and_nature", "char": "🍃", "name": "leaves", "keywords": ["nature", "plant", "tree", "vegetable", "grass", "lawn", "spring"] }, - { "category": "animals_and_nature", "char": "🍂", "name": "fallen_leaf", "keywords": ["nature", "plant", "vegetable", "leaves"] }, - { "category": "animals_and_nature", "char": "🍁", "name": "maple_leaf", "keywords": ["nature", "plant", "vegetable", "ca", "fall"] }, - { "category": "animals_and_nature", "char": "🌾", "name": "ear_of_rice", "keywords": ["nature", "plant"] }, - { "category": "animals_and_nature", "char": "🌺", "name": "hibiscus", "keywords": ["plant", "vegetable", "flowers", "beach"] }, - { "category": "animals_and_nature", "char": "🌻", "name": "sunflower", "keywords": ["nature", "plant", "fall"] }, - { "category": "animals_and_nature", "char": "🌹", "name": "rose", "keywords": ["flowers", "valentines", "love", "spring"] }, - { "category": "animals_and_nature", "char": "🥀", "name": "wilted_flower", "keywords": ["plant", "nature", "flower"] }, - { "category": "animals_and_nature", "char": "🌷", "name": "tulip", "keywords": ["flowers", "plant", "nature", "summer", "spring"] }, - { "category": "animals_and_nature", "char": "🌼", "name": "blossom", "keywords": ["nature", "flowers", "yellow"] }, - { "category": "animals_and_nature", "char": "🌸", "name": "cherry_blossom", "keywords": ["nature", "plant", "spring", "flower"] }, - { "category": "animals_and_nature", "char": "💐", "name": "bouquet", "keywords": ["flowers", "nature", "spring"] }, - { "category": "animals_and_nature", "char": "🍄", "name": "mushroom", "keywords": ["plant", "vegetable"] }, - { "category": "animals_and_nature", "char": "🪴", "name": "potted_plant", "keywords": ["plant"] }, - { "category": "animals_and_nature", "char": "🌰", "name": "chestnut", "keywords": ["food", "squirrel"] }, - { "category": "animals_and_nature", "char": "🎃", "name": "jack_o_lantern", "keywords": ["halloween", "light", "pumpkin", "creepy", "fall"] }, - { "category": "animals_and_nature", "char": "🐚", "name": "shell", "keywords": ["nature", "sea", "beach"] }, - { "category": "animals_and_nature", "char": "🕸", "name": "spider_web", "keywords": ["animal", "insect", "arachnid", "silk"] }, - { "category": "animals_and_nature", "char": "🌎", "name": "earth_americas", "keywords": ["globe", "world", "USA", "international"] }, - { "category": "animals_and_nature", "char": "🌍", "name": "earth_africa", "keywords": ["globe", "world", "international"] }, - { "category": "animals_and_nature", "char": "🌏", "name": "earth_asia", "keywords": ["globe", "world", "east", "international"] }, - { "category": "animals_and_nature", "char": "🪐", "name": "ringed_planet", "keywords": ["saturn"] }, - { "category": "animals_and_nature", "char": "🌕", "name": "full_moon", "keywords": ["nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌖", "name": "waning_gibbous_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon"] }, - { "category": "animals_and_nature", "char": "🌗", "name": "last_quarter_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌘", "name": "waning_crescent_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌑", "name": "new_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌒", "name": "waxing_crescent_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌓", "name": "first_quarter_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌔", "name": "waxing_gibbous_moon", "keywords": ["nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌚", "name": "new_moon_with_face", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌝", "name": "full_moon_with_face", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌛", "name": "first_quarter_moon_with_face", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌜", "name": "last_quarter_moon_with_face", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌞", "name": "sun_with_face", "keywords": ["nature", "morning", "sky"] }, - { "category": "animals_and_nature", "char": "🌙", "name": "crescent_moon", "keywords": ["night", "sleep", "sky", "evening", "magic"] }, - { "category": "animals_and_nature", "char": "⭐", "name": "star", "keywords": ["night", "yellow"] }, - { "category": "animals_and_nature", "char": "🌟", "name": "star2", "keywords": ["night", "sparkle", "awesome", "good", "magic"] }, - { "category": "animals_and_nature", "char": "💫", "name": "dizzy", "keywords": ["star", "sparkle", "shoot", "magic"] }, - { "category": "animals_and_nature", "char": "✨", "name": "sparkles", "keywords": ["stars", "shine", "shiny", "cool", "awesome", "good", "magic"] }, - { "category": "animals_and_nature", "char": "☄", "name": "comet", "keywords": ["space"] }, - { "category": "animals_and_nature", "char": "☀️", "name": "sunny", "keywords": ["weather", "nature", "brightness", "summer", "beach", "spring"] }, - { "category": "animals_and_nature", "char": "🌤", "name": "sun_behind_small_cloud", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "⛅", "name": "partly_sunny", "keywords": ["weather", "nature", "cloudy", "morning", "fall", "spring"] }, - { "category": "animals_and_nature", "char": "🌥", "name": "sun_behind_large_cloud", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "🌦", "name": "sun_behind_rain_cloud", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "☁️", "name": "cloud", "keywords": ["weather", "sky"] }, - { "category": "animals_and_nature", "char": "🌧", "name": "cloud_with_rain", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "⛈", "name": "cloud_with_lightning_and_rain", "keywords": ["weather", "lightning"] }, - { "category": "animals_and_nature", "char": "🌩", "name": "cloud_with_lightning", "keywords": ["weather", "thunder"] }, - { "category": "animals_and_nature", "char": "⚡", "name": "zap", "keywords": ["thunder", "weather", "lightning bolt", "fast"] }, - { "category": "animals_and_nature", "char": "🔥", "name": "fire", "keywords": ["hot", "cook", "flame"] }, - { "category": "animals_and_nature", "char": "💥", "name": "boom", "keywords": ["bomb", "explode", "explosion", "collision", "blown"] }, - { "category": "animals_and_nature", "char": "❄️", "name": "snowflake", "keywords": ["winter", "season", "cold", "weather", "christmas", "xmas"] }, - { "category": "animals_and_nature", "char": "🌨", "name": "cloud_with_snow", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "⛄", "name": "snowman", "keywords": ["winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow"] }, - { "category": "animals_and_nature", "char": "☃", "name": "snowman_with_snow", "keywords": ["winter", "season", "cold", "weather", "christmas", "xmas", "frozen"] }, - { "category": "animals_and_nature", "char": "🌬", "name": "wind_face", "keywords": ["gust", "air"] }, - { "category": "animals_and_nature", "char": "💨", "name": "dash", "keywords": ["wind", "air", "fast", "shoo", "fart", "smoke", "puff"] }, - { "category": "animals_and_nature", "char": "🌪", "name": "tornado", "keywords": ["weather", "cyclone", "twister"] }, - { "category": "animals_and_nature", "char": "🌫", "name": "fog", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "☂", "name": "open_umbrella", "keywords": ["weather", "spring"] }, - { "category": "animals_and_nature", "char": "☔", "name": "umbrella", "keywords": ["rainy", "weather", "spring"] }, - { "category": "animals_and_nature", "char": "💧", "name": "droplet", "keywords": ["water", "drip", "faucet", "spring"] }, - { "category": "animals_and_nature", "char": "💦", "name": "sweat_drops", "keywords": ["water", "drip", "oops"] }, - { "category": "animals_and_nature", "char": "🌊", "name": "ocean", "keywords": ["sea", "water", "wave", "nature", "tsunami", "disaster"] }, - { "category": "animals_and_nature", "char": "\uD83E\uDEB7", "name": "lotus", "keywords": [] }, - { "category": "animals_and_nature", "char": "\uD83E\uDEB8", "name": "coral", "keywords": [] }, - { "category": "animals_and_nature", "char": "\uD83E\uDEB9", "name": "empty_nest", "keywords": [] }, - { "category": "animals_and_nature", "char": "\uD83E\uDEBA", "name": "nest_with_eggs", "keywords": [] }, - { "category": "food_and_drink", "char": "🍏", "name": "green_apple", "keywords": ["fruit", "nature"] }, - { "category": "food_and_drink", "char": "🍎", "name": "apple", "keywords": ["fruit", "mac", "school"] }, - { "category": "food_and_drink", "char": "🍐", "name": "pear", "keywords": ["fruit", "nature", "food"] }, - { "category": "food_and_drink", "char": "🍊", "name": "tangerine", "keywords": ["food", "fruit", "nature", "orange"] }, - { "category": "food_and_drink", "char": "🍋", "name": "lemon", "keywords": ["fruit", "nature"] }, - { "category": "food_and_drink", "char": "🍌", "name": "banana", "keywords": ["fruit", "food", "monkey"] }, - { "category": "food_and_drink", "char": "🍉", "name": "watermelon", "keywords": ["fruit", "food", "picnic", "summer"] }, - { "category": "food_and_drink", "char": "🍇", "name": "grapes", "keywords": ["fruit", "food", "wine"] }, - { "category": "food_and_drink", "char": "🍓", "name": "strawberry", "keywords": ["fruit", "food", "nature"] }, - { "category": "food_and_drink", "char": "🍈", "name": "melon", "keywords": ["fruit", "nature", "food"] }, - { "category": "food_and_drink", "char": "🍒", "name": "cherries", "keywords": ["food", "fruit"] }, - { "category": "food_and_drink", "char": "🍑", "name": "peach", "keywords": ["fruit", "nature", "food"] }, - { "category": "food_and_drink", "char": "🍍", "name": "pineapple", "keywords": ["fruit", "nature", "food"] }, - { "category": "food_and_drink", "char": "🥥", "name": "coconut", "keywords": ["fruit", "nature", "food", "palm"] }, - { "category": "food_and_drink", "char": "🥝", "name": "kiwi_fruit", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🥭", "name": "mango", "keywords": ["fruit", "food", "tropical"] }, - { "category": "food_and_drink", "char": "🥑", "name": "avocado", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🥦", "name": "broccoli", "keywords": ["fruit", "food", "vegetable"] }, - { "category": "food_and_drink", "char": "🍅", "name": "tomato", "keywords": ["fruit", "vegetable", "nature", "food"] }, - { "category": "food_and_drink", "char": "🍆", "name": "eggplant", "keywords": ["vegetable", "nature", "food", "aubergine"] }, - { "category": "food_and_drink", "char": "🥒", "name": "cucumber", "keywords": ["fruit", "food", "pickle"] }, - { "category": "food_and_drink", "char": "🫐", "name": "blueberries", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🫒", "name": "olive", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🫑", "name": "bell_pepper", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🥕", "name": "carrot", "keywords": ["vegetable", "food", "orange"] }, - { "category": "food_and_drink", "char": "🌶", "name": "hot_pepper", "keywords": ["food", "spicy", "chilli", "chili"] }, - { "category": "food_and_drink", "char": "🥔", "name": "potato", "keywords": ["food", "tuber", "vegatable", "starch"] }, - { "category": "food_and_drink", "char": "🌽", "name": "corn", "keywords": ["food", "vegetable", "plant"] }, - { "category": "food_and_drink", "char": "🥬", "name": "leafy_greens", "keywords": ["food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce"] }, - { "category": "food_and_drink", "char": "🍠", "name": "sweet_potato", "keywords": ["food", "nature"] }, - { "category": "food_and_drink", "char": "🥜", "name": "peanuts", "keywords": ["food", "nut"] }, - { "category": "food_and_drink", "char": "🧄", "name": "garlic", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🧅", "name": "onion", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🍯", "name": "honey_pot", "keywords": ["bees", "sweet", "kitchen"] }, - { "category": "food_and_drink", "char": "🥐", "name": "croissant", "keywords": ["food", "bread", "french"] }, - { "category": "food_and_drink", "char": "🍞", "name": "bread", "keywords": ["food", "wheat", "breakfast", "toast", "mame"] }, - { "category": "food_and_drink", "char": "🥖", "name": "baguette_bread", "keywords": ["food", "bread", "french"] }, - { "category": "food_and_drink", "char": "🥯", "name": "bagel", "keywords": ["food", "bread", "bakery", "schmear"] }, - { "category": "food_and_drink", "char": "🥨", "name": "pretzel", "keywords": ["food", "bread", "twisted"] }, - { "category": "food_and_drink", "char": "🧀", "name": "cheese", "keywords": ["food", "cheddar"] }, - { "category": "food_and_drink", "char": "🥚", "name": "egg", "keywords": ["food", "chicken", "breakfast"] }, - { "category": "food_and_drink", "char": "🥓", "name": "bacon", "keywords": ["food", "breakfast", "pork", "pig", "meat"] }, - { "category": "food_and_drink", "char": "🥩", "name": "steak", "keywords": ["food", "cow", "meat", "cut", "chop", "lambchop", "porkchop"] }, - { "category": "food_and_drink", "char": "🥞", "name": "pancakes", "keywords": ["food", "breakfast", "flapjacks", "hotcakes"] }, - { "category": "food_and_drink", "char": "🍗", "name": "poultry_leg", "keywords": ["food", "meat", "drumstick", "bird", "chicken", "turkey"] }, - { "category": "food_and_drink", "char": "🍖", "name": "meat_on_bone", "keywords": ["good", "food", "drumstick"] }, - { "category": "food_and_drink", "char": "🦴", "name": "bone", "keywords": ["skeleton"] }, - { "category": "food_and_drink", "char": "🍤", "name": "fried_shrimp", "keywords": ["food", "animal", "appetizer", "summer"] }, - { "category": "food_and_drink", "char": "🍳", "name": "fried_egg", "keywords": ["food", "breakfast", "kitchen", "egg"] }, - { "category": "food_and_drink", "char": "🍔", "name": "hamburger", "keywords": ["meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king"] }, - { "category": "food_and_drink", "char": "🍟", "name": "fries", "keywords": ["chips", "snack", "fast food"] }, - { "category": "food_and_drink", "char": "🥙", "name": "stuffed_flatbread", "keywords": ["food", "flatbread", "stuffed", "gyro"] }, - { "category": "food_and_drink", "char": "🌭", "name": "hotdog", "keywords": ["food", "frankfurter"] }, - { "category": "food_and_drink", "char": "🍕", "name": "pizza", "keywords": ["food", "party"] }, - { "category": "food_and_drink", "char": "🥪", "name": "sandwich", "keywords": ["food", "lunch", "bread"] }, - { "category": "food_and_drink", "char": "🥫", "name": "canned_food", "keywords": ["food", "soup"] }, - { "category": "food_and_drink", "char": "🍝", "name": "spaghetti", "keywords": ["food", "italian", "noodle"] }, - { "category": "food_and_drink", "char": "🌮", "name": "taco", "keywords": ["food", "mexican"] }, - { "category": "food_and_drink", "char": "🌯", "name": "burrito", "keywords": ["food", "mexican"] }, - { "category": "food_and_drink", "char": "🥗", "name": "green_salad", "keywords": ["food", "healthy", "lettuce"] }, - { "category": "food_and_drink", "char": "🥘", "name": "shallow_pan_of_food", "keywords": ["food", "cooking", "casserole", "paella"] }, - { "category": "food_and_drink", "char": "🍜", "name": "ramen", "keywords": ["food", "japanese", "noodle", "chopsticks"] }, - { "category": "food_and_drink", "char": "🍲", "name": "stew", "keywords": ["food", "meat", "soup"] }, - { "category": "food_and_drink", "char": "🍥", "name": "fish_cake", "keywords": ["food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen"] }, - { "category": "food_and_drink", "char": "🥠", "name": "fortune_cookie", "keywords": ["food", "prophecy"] }, - { "category": "food_and_drink", "char": "🍣", "name": "sushi", "keywords": ["food", "fish", "japanese", "rice"] }, - { "category": "food_and_drink", "char": "🍱", "name": "bento", "keywords": ["food", "japanese", "box"] }, - { "category": "food_and_drink", "char": "🍛", "name": "curry", "keywords": ["food", "spicy", "hot", "indian"] }, - { "category": "food_and_drink", "char": "🍙", "name": "rice_ball", "keywords": ["food", "japanese"] }, - { "category": "food_and_drink", "char": "🍚", "name": "rice", "keywords": ["food", "china", "asian"] }, - { "category": "food_and_drink", "char": "🍘", "name": "rice_cracker", "keywords": ["food", "japanese"] }, - { "category": "food_and_drink", "char": "🍢", "name": "oden", "keywords": ["food", "japanese"] }, - { "category": "food_and_drink", "char": "🍡", "name": "dango", "keywords": ["food", "dessert", "sweet", "japanese", "barbecue", "meat"] }, - { "category": "food_and_drink", "char": "🍧", "name": "shaved_ice", "keywords": ["hot", "dessert", "summer"] }, - { "category": "food_and_drink", "char": "🍨", "name": "ice_cream", "keywords": ["food", "hot", "dessert"] }, - { "category": "food_and_drink", "char": "🍦", "name": "icecream", "keywords": ["food", "hot", "dessert", "summer"] }, - { "category": "food_and_drink", "char": "🥧", "name": "pie", "keywords": ["food", "dessert", "pastry"] }, - { "category": "food_and_drink", "char": "🍰", "name": "cake", "keywords": ["food", "dessert"] }, - { "category": "food_and_drink", "char": "🧁", "name": "cupcake", "keywords": ["food", "dessert", "bakery", "sweet"] }, - { "category": "food_and_drink", "char": "🥮", "name": "moon_cake", "keywords": ["food", "autumn"] }, - { "category": "food_and_drink", "char": "🎂", "name": "birthday", "keywords": ["food", "dessert", "cake"] }, - { "category": "food_and_drink", "char": "🍮", "name": "pudding", "keywords": ["dessert", "food", "custard"] }, - { "category": "food_and_drink", "char": "🍬", "name": "candy", "keywords": ["snack", "dessert", "sweet", "lolly"] }, - { "category": "food_and_drink", "char": "🍭", "name": "lollipop", "keywords": ["food", "snack", "candy", "sweet"] }, - { "category": "food_and_drink", "char": "🍫", "name": "chocolate_bar", "keywords": ["food", "snack", "dessert", "sweet"] }, - { "category": "food_and_drink", "char": "🍿", "name": "popcorn", "keywords": ["food", "movie theater", "films", "snack"] }, - { "category": "food_and_drink", "char": "🥟", "name": "dumpling", "keywords": ["food", "empanada", "pierogi", "potsticker"] }, - { "category": "food_and_drink", "char": "🍩", "name": "doughnut", "keywords": ["food", "dessert", "snack", "sweet", "donut"] }, - { "category": "food_and_drink", "char": "🍪", "name": "cookie", "keywords": ["food", "snack", "oreo", "chocolate", "sweet", "dessert"] }, - { "category": "food_and_drink", "char": "🧇", "name": "waffle", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🧆", "name": "falafel", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🧈", "name": "butter", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🦪", "name": "oyster", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🫓", "name": "flatbread", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🫔", "name": "tamale", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🫕", "name": "fondue", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🥛", "name": "milk_glass", "keywords": ["beverage", "drink", "cow"] }, - { "category": "food_and_drink", "char": "🍺", "name": "beer", "keywords": ["relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze"] }, - { "category": "food_and_drink", "char": "🍻", "name": "beers", "keywords": ["relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze"] }, - { "category": "food_and_drink", "char": "🥂", "name": "clinking_glasses", "keywords": ["beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast"] }, - { "category": "food_and_drink", "char": "🍷", "name": "wine_glass", "keywords": ["drink", "beverage", "drunk", "alcohol", "booze"] }, - { "category": "food_and_drink", "char": "🥃", "name": "tumbler_glass", "keywords": ["drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot"] }, - { "category": "food_and_drink", "char": "🍸", "name": "cocktail", "keywords": ["drink", "drunk", "alcohol", "beverage", "booze", "mojito"] }, - { "category": "food_and_drink", "char": "🍹", "name": "tropical_drink", "keywords": ["beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito"] }, - { "category": "food_and_drink", "char": "🍾", "name": "champagne", "keywords": ["drink", "wine", "bottle", "celebration"] }, - { "category": "food_and_drink", "char": "🍶", "name": "sake", "keywords": ["wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze"] }, - { "category": "food_and_drink", "char": "🍵", "name": "tea", "keywords": ["drink", "bowl", "breakfast", "green", "british"] }, - { "category": "food_and_drink", "char": "🥤", "name": "cup_with_straw", "keywords": ["drink", "soda"] }, - { "category": "food_and_drink", "char": "☕", "name": "coffee", "keywords": ["beverage", "caffeine", "latte", "espresso"] }, - { "category": "food_and_drink", "char": "🫖", "name": "teapot", "keywords": ["leafs"] }, - { "category": "food_and_drink", "char": "🧋", "name": "bubble_tea", "keywords": ["tapioca"] }, - { "category": "food_and_drink", "char": "🍼", "name": "baby_bottle", "keywords": ["food", "container", "milk"] }, - { "category": "food_and_drink", "char": "🧃", "name": "beverage_box", "keywords": ["food", "drink"] }, - { "category": "food_and_drink", "char": "🧉", "name": "mate", "keywords": ["food", "drink"] }, - { "category": "food_and_drink", "char": "🧊", "name": "ice_cube", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🧂", "name": "salt", "keywords": ["condiment", "shaker"] }, - { "category": "food_and_drink", "char": "🥄", "name": "spoon", "keywords": ["cutlery", "kitchen", "tableware"] }, - { "category": "food_and_drink", "char": "🍴", "name": "fork_and_knife", "keywords": ["cutlery", "kitchen"] }, - { "category": "food_and_drink", "char": "🍽", "name": "plate_with_cutlery", "keywords": ["food", "eat", "meal", "lunch", "dinner", "restaurant"] }, - { "category": "food_and_drink", "char": "🥣", "name": "bowl_with_spoon", "keywords": ["food", "breakfast", "cereal", "oatmeal", "porridge"] }, - { "category": "food_and_drink", "char": "🥡", "name": "takeout_box", "keywords": ["food", "leftovers"] }, - { "category": "food_and_drink", "char": "🥢", "name": "chopsticks", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "\uD83E\uDED7", "name": "pouring_liquid", "keywords": [] }, - { "category": "food_and_drink", "char": "\uD83E\uDED8", "name": "beans", "keywords": [] }, - { "category": "food_and_drink", "char": "\uD83E\uDED9", "name": "jar", "keywords": ["cookies"] }, - { "category": "activity", "char": "⚽", "name": "soccer", "keywords": ["sports", "football"] }, - { "category": "activity", "char": "🏀", "name": "basketball", "keywords": ["sports", "balls", "NBA"] }, - { "category": "activity", "char": "🏈", "name": "football", "keywords": ["sports", "balls", "NFL"] }, - { "category": "activity", "char": "⚾", "name": "baseball", "keywords": ["sports", "balls"] }, - { "category": "activity", "char": "🥎", "name": "softball", "keywords": ["sports", "balls"] }, - { "category": "activity", "char": "🎾", "name": "tennis", "keywords": ["sports", "balls", "green"] }, - { "category": "activity", "char": "🏐", "name": "volleyball", "keywords": ["sports", "balls"] }, - { "category": "activity", "char": "🏉", "name": "rugby_football", "keywords": ["sports", "team"] }, - { "category": "activity", "char": "🥏", "name": "flying_disc", "keywords": ["sports", "frisbee", "ultimate"] }, - { "category": "activity", "char": "🎱", "name": "8ball", "keywords": ["pool", "hobby", "game", "luck", "magic"] }, - { "category": "activity", "char": "⛳", "name": "golf", "keywords": ["sports", "business", "flag", "hole", "summer"] }, - { "category": "activity", "char": "🏌️♀️", "name": "golfing_woman", "keywords": ["sports", "business", "woman", "female"] }, - { "category": "activity", "char": "🏌", "name": "golfing_man", "keywords": ["sports", "business"] }, - { "category": "activity", "char": "🏓", "name": "ping_pong", "keywords": ["sports", "pingpong"] }, - { "category": "activity", "char": "🏸", "name": "badminton", "keywords": ["sports"] }, - { "category": "activity", "char": "🥅", "name": "goal_net", "keywords": ["sports"] }, - { "category": "activity", "char": "🏒", "name": "ice_hockey", "keywords": ["sports"] }, - { "category": "activity", "char": "🏑", "name": "field_hockey", "keywords": ["sports"] }, - { "category": "activity", "char": "🥍", "name": "lacrosse", "keywords": ["sports", "ball", "stick"] }, - { "category": "activity", "char": "🏏", "name": "cricket", "keywords": ["sports"] }, - { "category": "activity", "char": "🎿", "name": "ski", "keywords": ["sports", "winter", "cold", "snow"] }, - { "category": "activity", "char": "⛷", "name": "skier", "keywords": ["sports", "winter", "snow"] }, - { "category": "activity", "char": "🏂", "name": "snowboarder", "keywords": ["sports", "winter"] }, - { "category": "activity", "char": "🤺", "name": "person_fencing", "keywords": ["sports", "fencing", "sword"] }, - { "category": "activity", "char": "🤼♀️", "name": "women_wrestling", "keywords": ["sports", "wrestlers"] }, - { "category": "activity", "char": "🤼♂️", "name": "men_wrestling", "keywords": ["sports", "wrestlers"] }, - { "category": "activity", "char": "🤸♀️", "name": "woman_cartwheeling", "keywords": ["gymnastics"] }, - { "category": "activity", "char": "🤸♂️", "name": "man_cartwheeling", "keywords": ["gymnastics"] }, - { "category": "activity", "char": "🤾♀️", "name": "woman_playing_handball", "keywords": ["sports"] }, - { "category": "activity", "char": "🤾♂️", "name": "man_playing_handball", "keywords": ["sports"] }, - { "category": "activity", "char": "⛸", "name": "ice_skate", "keywords": ["sports"] }, - { "category": "activity", "char": "🥌", "name": "curling_stone", "keywords": ["sports"] }, - { "category": "activity", "char": "🛹", "name": "skateboard", "keywords": ["board"] }, - { "category": "activity", "char": "🛷", "name": "sled", "keywords": ["sleigh", "luge", "toboggan"] }, - { "category": "activity", "char": "🏹", "name": "bow_and_arrow", "keywords": ["sports"] }, - { "category": "activity", "char": "🎣", "name": "fishing_pole_and_fish", "keywords": ["food", "hobby", "summer"] }, - { "category": "activity", "char": "🥊", "name": "boxing_glove", "keywords": ["sports", "fighting"] }, - { "category": "activity", "char": "🥋", "name": "martial_arts_uniform", "keywords": ["judo", "karate", "taekwondo"] }, - { "category": "activity", "char": "🚣♀️", "name": "rowing_woman", "keywords": ["sports", "hobby", "water", "ship", "woman", "female"] }, - { "category": "activity", "char": "🚣", "name": "rowing_man", "keywords": ["sports", "hobby", "water", "ship"] }, - { "category": "activity", "char": "🧗♀️", "name": "climbing_woman", "keywords": ["sports", "hobby", "woman", "female", "rock"] }, - { "category": "activity", "char": "🧗♂️", "name": "climbing_man", "keywords": ["sports", "hobby", "man", "male", "rock"] }, - { "category": "activity", "char": "🏊♀️", "name": "swimming_woman", "keywords": ["sports", "exercise", "human", "athlete", "water", "summer", "woman", "female"] }, - { "category": "activity", "char": "🏊", "name": "swimming_man", "keywords": ["sports", "exercise", "human", "athlete", "water", "summer"] }, - { "category": "activity", "char": "🤽♀️", "name": "woman_playing_water_polo", "keywords": ["sports", "pool"] }, - { "category": "activity", "char": "🤽♂️", "name": "man_playing_water_polo", "keywords": ["sports", "pool"] }, - { "category": "activity", "char": "🧘♀️", "name": "woman_in_lotus_position", "keywords": ["woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness"] }, - { "category": "activity", "char": "🧘♂️", "name": "man_in_lotus_position", "keywords": ["man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness"] }, - { "category": "activity", "char": "🏄♀️", "name": "surfing_woman", "keywords": ["sports", "ocean", "sea", "summer", "beach", "woman", "female"] }, - { "category": "activity", "char": "🏄", "name": "surfing_man", "keywords": ["sports", "ocean", "sea", "summer", "beach"] }, - { "category": "activity", "char": "🛀", "name": "bath", "keywords": ["clean", "shower", "bathroom"] }, - { "category": "activity", "char": "⛹️♀️", "name": "basketball_woman", "keywords": ["sports", "human", "woman", "female"] }, - { "category": "activity", "char": "⛹", "name": "basketball_man", "keywords": ["sports", "human"] }, - { "category": "activity", "char": "🏋️♀️", "name": "weight_lifting_woman", "keywords": ["sports", "training", "exercise", "woman", "female"] }, - { "category": "activity", "char": "🏋", "name": "weight_lifting_man", "keywords": ["sports", "training", "exercise"] }, - { "category": "activity", "char": "🚴♀️", "name": "biking_woman", "keywords": ["sports", "bike", "exercise", "hipster", "woman", "female"] }, - { "category": "activity", "char": "🚴", "name": "biking_man", "keywords": ["sports", "bike", "exercise", "hipster"] }, - { "category": "activity", "char": "🚵♀️", "name": "mountain_biking_woman", "keywords": ["transportation", "sports", "human", "race", "bike", "woman", "female"] }, - { "category": "activity", "char": "🚵", "name": "mountain_biking_man", "keywords": ["transportation", "sports", "human", "race", "bike"] }, - { "category": "activity", "char": "🏇", "name": "horse_racing", "keywords": ["animal", "betting", "competition", "gambling", "luck"] }, - { "category": "activity", "char": "🤿", "name": "diving_mask", "keywords": ["sports"] }, - { "category": "activity", "char": "🪀", "name": "yo_yo", "keywords": ["sports"] }, - { "category": "activity", "char": "🪁", "name": "kite", "keywords": ["sports"] }, - { "category": "activity", "char": "🦺", "name": "safety_vest", "keywords": ["sports"] }, - { "category": "activity", "char": "🪡", "name": "sewing_needle", "keywords": ["fixing", "handmade", "handwork"] }, - { "category": "activity", "char": "🪢", "name": "knot", "keywords": [] }, - { "category": "activity", "char": "🕴", "name": "business_suit_levitating", "keywords": ["suit", "business", "levitate", "hover", "jump"] }, - { "category": "activity", "char": "🏆", "name": "trophy", "keywords": ["win", "award", "contest", "place", "ftw", "ceremony"] }, - { "category": "activity", "char": "🎽", "name": "running_shirt_with_sash", "keywords": ["play", "pageant"] }, - { "category": "activity", "char": "🏅", "name": "medal_sports", "keywords": ["award", "winning"] }, - { "category": "activity", "char": "🎖", "name": "medal_military", "keywords": ["award", "winning", "army"] }, - { "category": "activity", "char": "🥇", "name": "1st_place_medal", "keywords": ["award", "winning", "first"] }, - { "category": "activity", "char": "🥈", "name": "2nd_place_medal", "keywords": ["award", "second"] }, - { "category": "activity", "char": "🥉", "name": "3rd_place_medal", "keywords": ["award", "third"] }, - { "category": "activity", "char": "🎗", "name": "reminder_ribbon", "keywords": ["sports", "cause", "support", "awareness"] }, - { "category": "activity", "char": "🏵", "name": "rosette", "keywords": ["flower", "decoration", "military"] }, - { "category": "activity", "char": "🎫", "name": "ticket", "keywords": ["event", "concert", "pass"] }, - { "category": "activity", "char": "🎟", "name": "tickets", "keywords": ["sports", "concert", "entrance"] }, - { "category": "activity", "char": "🎭", "name": "performing_arts", "keywords": ["acting", "theater", "drama"] }, - { "category": "activity", "char": "🎨", "name": "art", "keywords": ["design", "paint", "draw", "colors"] }, - { "category": "activity", "char": "🎪", "name": "circus_tent", "keywords": ["festival", "carnival", "party"] }, - { "category": "activity", "char": "🤹♀️", "name": "woman_juggling", "keywords": ["juggle", "balance", "skill", "multitask"] }, - { "category": "activity", "char": "🤹♂️", "name": "man_juggling", "keywords": ["juggle", "balance", "skill", "multitask"] }, - { "category": "activity", "char": "🎤", "name": "microphone", "keywords": ["sound", "music", "PA", "sing", "talkshow"] }, - { "category": "activity", "char": "🎧", "name": "headphones", "keywords": ["music", "score", "gadgets"] }, - { "category": "activity", "char": "🎼", "name": "musical_score", "keywords": ["treble", "clef", "compose"] }, - { "category": "activity", "char": "🎹", "name": "musical_keyboard", "keywords": ["piano", "instrument", "compose"] }, - { "category": "activity", "char": "🥁", "name": "drum", "keywords": ["music", "instrument", "drumsticks", "snare"] }, - { "category": "activity", "char": "🎷", "name": "saxophone", "keywords": ["music", "instrument", "jazz", "blues"] }, - { "category": "activity", "char": "🎺", "name": "trumpet", "keywords": ["music", "brass"] }, - { "category": "activity", "char": "🎸", "name": "guitar", "keywords": ["music", "instrument"] }, - { "category": "activity", "char": "🎻", "name": "violin", "keywords": ["music", "instrument", "orchestra", "symphony"] }, - { "category": "activity", "char": "🪕", "name": "banjo", "keywords": ["music", "instrument"] }, - { "category": "activity", "char": "🪗", "name": "accordion", "keywords": ["music", "instrument"] }, - { "category": "activity", "char": "🪘", "name": "long_drum", "keywords": ["music", "instrument"] }, - { "category": "activity", "char": "🎬", "name": "clapper", "keywords": ["movie", "film", "record"] }, - { "category": "activity", "char": "🎮", "name": "video_game", "keywords": ["play", "console", "PS4", "controller"] }, - { "category": "activity", "char": "👾", "name": "space_invader", "keywords": ["game", "arcade", "play"] }, - { "category": "activity", "char": "🎯", "name": "dart", "keywords": ["game", "play", "bar", "target", "bullseye"] }, - { "category": "activity", "char": "🎲", "name": "game_die", "keywords": ["dice", "random", "tabletop", "play", "luck"] }, - { "category": "activity", "char": "♟️", "name": "chess_pawn", "keywords": ["expendable", "strategy"] }, - { "category": "activity", "char": "🎰", "name": "slot_machine", "keywords": ["bet", "gamble", "vegas", "fruit machine", "luck", "casino"] }, - { "category": "activity", "char": "🧩", "name": "jigsaw", "keywords": ["interlocking", "puzzle", "piece"] }, - { "category": "activity", "char": "🎳", "name": "bowling", "keywords": ["sports", "fun", "play"] }, - { "category": "activity", "char": "🪄", "name": "magic_wand", "keywords": ["spell", "horny", "wizardry"] }, - { "category": "activity", "char": "🪅", "name": "pinata", "keywords": ["birthday", "celebration", "fortnite", "fun"] }, - { "category": "activity", "char": "🪆", "name": "nesting_dolls", "keywords": ["russian", "handmade", "doll"] }, - { "category": "activity", "char": "\uD83E\uDEAC", "name": "hamsa", "keywords": [] }, - { "category": "activity", "char": "\uD83E\uDEA9", "name": "mirror_ball", "keywords": [] }, - { "category": "travel_and_places", "char": "🚗", "name": "red_car", "keywords": ["red", "transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚕", "name": "taxi", "keywords": ["uber", "vehicle", "cars", "transportation"] }, - { "category": "travel_and_places", "char": "🚙", "name": "blue_car", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚌", "name": "bus", "keywords": ["car", "vehicle", "transportation"] }, - { "category": "travel_and_places", "char": "🚎", "name": "trolleybus", "keywords": ["bart", "transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🏎", "name": "racing_car", "keywords": ["sports", "race", "fast", "formula", "f1"] }, - { "category": "travel_and_places", "char": "🚓", "name": "police_car", "keywords": ["vehicle", "cars", "transportation", "law", "legal", "enforcement"] }, - { "category": "travel_and_places", "char": "🚑", "name": "ambulance", "keywords": ["health", "911", "hospital"] }, - { "category": "travel_and_places", "char": "🚒", "name": "fire_engine", "keywords": ["transportation", "cars", "vehicle"] }, - { "category": "travel_and_places", "char": "🚐", "name": "minibus", "keywords": ["vehicle", "car", "transportation"] }, - { "category": "travel_and_places", "char": "🚚", "name": "truck", "keywords": ["cars", "transportation"] }, - { "category": "travel_and_places", "char": "🚛", "name": "articulated_lorry", "keywords": ["vehicle", "cars", "transportation", "express"] }, - { "category": "travel_and_places", "char": "🚜", "name": "tractor", "keywords": ["vehicle", "car", "farming", "agriculture"] }, - { "category": "travel_and_places", "char": "🛴", "name": "kick_scooter", "keywords": ["vehicle", "kick", "razor"] }, - { "category": "travel_and_places", "char": "🏍", "name": "motorcycle", "keywords": ["race", "sports", "fast"] }, - { "category": "travel_and_places", "char": "🚲", "name": "bike", "keywords": ["sports", "bicycle", "exercise", "hipster"] }, - { "category": "travel_and_places", "char": "🛵", "name": "motor_scooter", "keywords": ["vehicle", "vespa", "sasha"] }, - { "category": "travel_and_places", "char": "🦽", "name": "manual_wheelchair", "keywords": ["vehicle"] }, - { "category": "travel_and_places", "char": "🦼", "name": "motorized_wheelchair", "keywords": ["vehicle"] }, - { "category": "travel_and_places", "char": "🛺", "name": "auto_rickshaw", "keywords": ["vehicle"] }, - { "category": "travel_and_places", "char": "🪂", "name": "parachute", "keywords": ["vehicle"] }, - { "category": "travel_and_places", "char": "🚨", "name": "rotating_light", "keywords": ["police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal"] }, - { "category": "travel_and_places", "char": "🚔", "name": "oncoming_police_car", "keywords": ["vehicle", "law", "legal", "enforcement", "911"] }, - { "category": "travel_and_places", "char": "🚍", "name": "oncoming_bus", "keywords": ["vehicle", "transportation"] }, - { "category": "travel_and_places", "char": "🚘", "name": "oncoming_automobile", "keywords": ["car", "vehicle", "transportation"] }, - { "category": "travel_and_places", "char": "🚖", "name": "oncoming_taxi", "keywords": ["vehicle", "cars", "uber"] }, - { "category": "travel_and_places", "char": "🚡", "name": "aerial_tramway", "keywords": ["transportation", "vehicle", "ski"] }, - { "category": "travel_and_places", "char": "🚠", "name": "mountain_cableway", "keywords": ["transportation", "vehicle", "ski"] }, - { "category": "travel_and_places", "char": "🚟", "name": "suspension_railway", "keywords": ["vehicle", "transportation"] }, - { "category": "travel_and_places", "char": "🚃", "name": "railway_car", "keywords": ["transportation", "vehicle", "train"] }, - { "category": "travel_and_places", "char": "🚋", "name": "train", "keywords": ["transportation", "vehicle", "carriage", "public", "travel"] }, - { "category": "travel_and_places", "char": "🚝", "name": "monorail", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚄", "name": "bullettrain_side", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚅", "name": "bullettrain_front", "keywords": ["transportation", "vehicle", "speed", "fast", "public", "travel"] }, - { "category": "travel_and_places", "char": "🚈", "name": "light_rail", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚞", "name": "mountain_railway", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚂", "name": "steam_locomotive", "keywords": ["transportation", "vehicle", "train"] }, - { "category": "travel_and_places", "char": "🚆", "name": "train2", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚇", "name": "metro", "keywords": ["transportation", "blue-square", "mrt", "underground", "tube"] }, - { "category": "travel_and_places", "char": "🚊", "name": "tram", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚉", "name": "station", "keywords": ["transportation", "vehicle", "public"] }, - { "category": "travel_and_places", "char": "🛸", "name": "flying_saucer", "keywords": ["transportation", "vehicle", "ufo"] }, - { "category": "travel_and_places", "char": "🚁", "name": "helicopter", "keywords": ["transportation", "vehicle", "fly"] }, - { "category": "travel_and_places", "char": "🛩", "name": "small_airplane", "keywords": ["flight", "transportation", "fly", "vehicle"] }, - { "category": "travel_and_places", "char": "✈️", "name": "airplane", "keywords": ["vehicle", "transportation", "flight", "fly"] }, - { "category": "travel_and_places", "char": "🛫", "name": "flight_departure", "keywords": ["airport", "flight", "landing"] }, - { "category": "travel_and_places", "char": "🛬", "name": "flight_arrival", "keywords": ["airport", "flight", "boarding"] }, - { "category": "travel_and_places", "char": "⛵", "name": "sailboat", "keywords": ["ship", "summer", "transportation", "water", "sailing"] }, - { "category": "travel_and_places", "char": "🛥", "name": "motor_boat", "keywords": ["ship"] }, - { "category": "travel_and_places", "char": "🚤", "name": "speedboat", "keywords": ["ship", "transportation", "vehicle", "summer"] }, - { "category": "travel_and_places", "char": "⛴", "name": "ferry", "keywords": ["boat", "ship", "yacht"] }, - { "category": "travel_and_places", "char": "🛳", "name": "passenger_ship", "keywords": ["yacht", "cruise", "ferry"] }, - { "category": "travel_and_places", "char": "🚀", "name": "rocket", "keywords": ["launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly"] }, - { "category": "travel_and_places", "char": "🛰", "name": "artificial_satellite", "keywords": ["communication", "gps", "orbit", "spaceflight", "NASA", "ISS"] }, - { "category": "travel_and_places", "char": "🛻", "name": "pickup_truck", "keywords": ["car"] }, - { "category": "travel_and_places", "char": "🛼", "name": "roller_skate", "keywords": [] }, - { "category": "travel_and_places", "char": "💺", "name": "seat", "keywords": ["sit", "airplane", "transport", "bus", "flight", "fly"] }, - { "category": "travel_and_places", "char": "🛶", "name": "canoe", "keywords": ["boat", "paddle", "water", "ship"] }, - { "category": "travel_and_places", "char": "⚓", "name": "anchor", "keywords": ["ship", "ferry", "sea", "boat"] }, - { "category": "travel_and_places", "char": "🚧", "name": "construction", "keywords": ["wip", "progress", "caution", "warning"] }, - { "category": "travel_and_places", "char": "⛽", "name": "fuelpump", "keywords": ["gas station", "petroleum"] }, - { "category": "travel_and_places", "char": "🚏", "name": "busstop", "keywords": ["transportation", "wait"] }, - { "category": "travel_and_places", "char": "🚦", "name": "vertical_traffic_light", "keywords": ["transportation", "driving"] }, - { "category": "travel_and_places", "char": "🚥", "name": "traffic_light", "keywords": ["transportation", "signal"] }, - { "category": "travel_and_places", "char": "🏁", "name": "checkered_flag", "keywords": ["contest", "finishline", "race", "gokart"] }, - { "category": "travel_and_places", "char": "🚢", "name": "ship", "keywords": ["transportation", "titanic", "deploy"] }, - { "category": "travel_and_places", "char": "🎡", "name": "ferris_wheel", "keywords": ["photo", "carnival", "londoneye"] }, - { "category": "travel_and_places", "char": "🎢", "name": "roller_coaster", "keywords": ["carnival", "playground", "photo", "fun"] }, - { "category": "travel_and_places", "char": "🎠", "name": "carousel_horse", "keywords": ["photo", "carnival"] }, - { "category": "travel_and_places", "char": "🏗", "name": "building_construction", "keywords": ["wip", "working", "progress"] }, - { "category": "travel_and_places", "char": "🌁", "name": "foggy", "keywords": ["photo", "mountain"] }, - { "category": "travel_and_places", "char": "🏭", "name": "factory", "keywords": ["building", "industry", "pollution", "smoke"] }, - { "category": "travel_and_places", "char": "⛲", "name": "fountain", "keywords": ["photo", "summer", "water", "fresh"] }, - { "category": "travel_and_places", "char": "🎑", "name": "rice_scene", "keywords": ["photo", "japan", "asia", "tsukimi"] }, - { "category": "travel_and_places", "char": "⛰", "name": "mountain", "keywords": ["photo", "nature", "environment"] }, - { "category": "travel_and_places", "char": "🏔", "name": "mountain_snow", "keywords": ["photo", "nature", "environment", "winter", "cold"] }, - { "category": "travel_and_places", "char": "🗻", "name": "mount_fuji", "keywords": ["photo", "mountain", "nature", "japanese"] }, - { "category": "travel_and_places", "char": "🌋", "name": "volcano", "keywords": ["photo", "nature", "disaster"] }, - { "category": "travel_and_places", "char": "🗾", "name": "japan", "keywords": ["nation", "country", "japanese", "asia"] }, - { "category": "travel_and_places", "char": "🏕", "name": "camping", "keywords": ["photo", "outdoors", "tent"] }, - { "category": "travel_and_places", "char": "⛺", "name": "tent", "keywords": ["photo", "camping", "outdoors"] }, - { "category": "travel_and_places", "char": "🏞", "name": "national_park", "keywords": ["photo", "environment", "nature"] }, - { "category": "travel_and_places", "char": "🛣", "name": "motorway", "keywords": ["road", "cupertino", "interstate", "highway"] }, - { "category": "travel_and_places", "char": "🛤", "name": "railway_track", "keywords": ["train", "transportation"] }, - { "category": "travel_and_places", "char": "🌅", "name": "sunrise", "keywords": ["morning", "view", "vacation", "photo"] }, - { "category": "travel_and_places", "char": "🌄", "name": "sunrise_over_mountains", "keywords": ["view", "vacation", "photo"] }, - { "category": "travel_and_places", "char": "🏜", "name": "desert", "keywords": ["photo", "warm", "saharah"] }, - { "category": "travel_and_places", "char": "🏖", "name": "beach_umbrella", "keywords": ["weather", "summer", "sunny", "sand", "mojito"] }, - { "category": "travel_and_places", "char": "🏝", "name": "desert_island", "keywords": ["photo", "tropical", "mojito"] }, - { "category": "travel_and_places", "char": "🌇", "name": "city_sunrise", "keywords": ["photo", "good morning", "dawn"] }, - { "category": "travel_and_places", "char": "🌆", "name": "city_sunset", "keywords": ["photo", "evening", "sky", "buildings"] }, - { "category": "travel_and_places", "char": "🏙", "name": "cityscape", "keywords": ["photo", "night life", "urban"] }, - { "category": "travel_and_places", "char": "🌃", "name": "night_with_stars", "keywords": ["evening", "city", "downtown"] }, - { "category": "travel_and_places", "char": "🌉", "name": "bridge_at_night", "keywords": ["photo", "sanfrancisco"] }, - { "category": "travel_and_places", "char": "🌌", "name": "milky_way", "keywords": ["photo", "space", "stars"] }, - { "category": "travel_and_places", "char": "🌠", "name": "stars", "keywords": ["night", "photo"] }, - { "category": "travel_and_places", "char": "🎇", "name": "sparkler", "keywords": ["stars", "night", "shine"] }, - { "category": "travel_and_places", "char": "🎆", "name": "fireworks", "keywords": ["photo", "festival", "carnival", "congratulations"] }, - { "category": "travel_and_places", "char": "🌈", "name": "rainbow", "keywords": ["nature", "happy", "unicorn_face", "photo", "sky", "spring"] }, - { "category": "travel_and_places", "char": "🏘", "name": "houses", "keywords": ["buildings", "photo"] }, - { "category": "travel_and_places", "char": "🏰", "name": "european_castle", "keywords": ["building", "royalty", "history"] }, - { "category": "travel_and_places", "char": "🏯", "name": "japanese_castle", "keywords": ["photo", "building"] }, - { "category": "travel_and_places", "char": "🗼", "name": "tokyo_tower", "keywords": ["photo", "japanese"] }, - { "category": "travel_and_places", "char": "", "name": "shibuya_109", "keywords": ["photo", "japanese"] }, - { "category": "travel_and_places", "char": "🏟", "name": "stadium", "keywords": ["photo", "place", "sports", "concert", "venue"] }, - { "category": "travel_and_places", "char": "🗽", "name": "statue_of_liberty", "keywords": ["american", "newyork"] }, - { "category": "travel_and_places", "char": "🏠", "name": "house", "keywords": ["building", "home"] }, - { "category": "travel_and_places", "char": "🏡", "name": "house_with_garden", "keywords": ["home", "plant", "nature"] }, - { "category": "travel_and_places", "char": "🏚", "name": "derelict_house", "keywords": ["abandon", "evict", "broken", "building"] }, - { "category": "travel_and_places", "char": "🏢", "name": "office", "keywords": ["building", "bureau", "work"] }, - { "category": "travel_and_places", "char": "🏬", "name": "department_store", "keywords": ["building", "shopping", "mall"] }, - { "category": "travel_and_places", "char": "🏣", "name": "post_office", "keywords": ["building", "envelope", "communication"] }, - { "category": "travel_and_places", "char": "🏤", "name": "european_post_office", "keywords": ["building", "email"] }, - { "category": "travel_and_places", "char": "🏥", "name": "hospital", "keywords": ["building", "health", "surgery", "doctor"] }, - { "category": "travel_and_places", "char": "🏦", "name": "bank", "keywords": ["building", "money", "sales", "cash", "business", "enterprise"] }, - { "category": "travel_and_places", "char": "🏨", "name": "hotel", "keywords": ["building", "accomodation", "checkin"] }, - { "category": "travel_and_places", "char": "🏪", "name": "convenience_store", "keywords": ["building", "shopping", "groceries"] }, - { "category": "travel_and_places", "char": "🏫", "name": "school", "keywords": ["building", "student", "education", "learn", "teach"] }, - { "category": "travel_and_places", "char": "🏩", "name": "love_hotel", "keywords": ["like", "affection", "dating"] }, - { "category": "travel_and_places", "char": "💒", "name": "wedding", "keywords": ["love", "like", "affection", "couple", "marriage", "bride", "groom"] }, - { "category": "travel_and_places", "char": "🏛", "name": "classical_building", "keywords": ["art", "culture", "history"] }, - { "category": "travel_and_places", "char": "⛪", "name": "church", "keywords": ["building", "religion", "christ"] }, - { "category": "travel_and_places", "char": "🕌", "name": "mosque", "keywords": ["islam", "worship", "minaret"] }, - { "category": "travel_and_places", "char": "🕍", "name": "synagogue", "keywords": ["judaism", "worship", "temple", "jewish"] }, - { "category": "travel_and_places", "char": "🕋", "name": "kaaba", "keywords": ["mecca", "mosque", "islam"] }, - { "category": "travel_and_places", "char": "⛩", "name": "shinto_shrine", "keywords": ["temple", "japan", "kyoto"] }, - { "category": "travel_and_places", "char": "🛕", "name": "hindu_temple", "keywords": ["temple"] }, - { "category": "travel_and_places", "char": "🪨", "name": "rock", "keywords": ["ressource"] }, - { "category": "travel_and_places", "char": "🪵", "name": "wood", "keywords": ["ressource"] }, - { "category": "travel_and_places", "char": "🛖", "name": "hut", "keywords": ["forest", "woods"] }, - { "category": "travel_and_places", "char": "\uD83D\uDEDD", "name": "playground_slide", "keywords": [] }, - { "category": "travel_and_places", "char": "\uD83D\uDEDE", "name": "wheel", "keywords": [] }, - { "category": "travel_and_places", "char": "\uD83D\uDEDF", "name": "ring_buoy", "keywords": ["ocean"] }, - { "category": "objects", "char": "⌚", "name": "watch", "keywords": ["time", "accessories"] }, - { "category": "objects", "char": "📱", "name": "iphone", "keywords": ["technology", "apple", "gadgets", "dial"] }, - { "category": "objects", "char": "📲", "name": "calling", "keywords": ["iphone", "incoming"] }, - { "category": "objects", "char": "💻", "name": "computer", "keywords": ["technology", "laptop", "screen", "display", "monitor"] }, - { "category": "objects", "char": "⌨", "name": "keyboard", "keywords": ["technology", "computer", "type", "input", "text"] }, - { "category": "objects", "char": "🖥", "name": "desktop_computer", "keywords": ["technology", "computing", "screen"] }, - { "category": "objects", "char": "🖨", "name": "printer", "keywords": ["paper", "ink"] }, - { "category": "objects", "char": "🖱", "name": "computer_mouse", "keywords": ["click"] }, - { "category": "objects", "char": "🖲", "name": "trackball", "keywords": ["technology", "trackpad"] }, - { "category": "objects", "char": "🕹", "name": "joystick", "keywords": ["game", "play"] }, - { "category": "objects", "char": "🗜", "name": "clamp", "keywords": ["tool"] }, - { "category": "objects", "char": "💽", "name": "minidisc", "keywords": ["technology", "record", "data", "disk", "90s"] }, - { "category": "objects", "char": "💾", "name": "floppy_disk", "keywords": ["oldschool", "technology", "save", "90s", "80s"] }, - { "category": "objects", "char": "💿", "name": "cd", "keywords": ["technology", "dvd", "disk", "disc", "90s"] }, - { "category": "objects", "char": "📀", "name": "dvd", "keywords": ["cd", "disk", "disc"] }, - { "category": "objects", "char": "📼", "name": "vhs", "keywords": ["record", "video", "oldschool", "90s", "80s"] }, - { "category": "objects", "char": "📷", "name": "camera", "keywords": ["gadgets", "photography"] }, - { "category": "objects", "char": "📸", "name": "camera_flash", "keywords": ["photography", "gadgets"] }, - { "category": "objects", "char": "📹", "name": "video_camera", "keywords": ["film", "record"] }, - { "category": "objects", "char": "🎥", "name": "movie_camera", "keywords": ["film", "record"] }, - { "category": "objects", "char": "📽", "name": "film_projector", "keywords": ["video", "tape", "record", "movie"] }, - { "category": "objects", "char": "🎞", "name": "film_strip", "keywords": ["movie"] }, - { "category": "objects", "char": "📞", "name": "telephone_receiver", "keywords": ["technology", "communication", "dial"] }, - { "category": "objects", "char": "☎️", "name": "phone", "keywords": ["technology", "communication", "dial", "telephone"] }, - { "category": "objects", "char": "📟", "name": "pager", "keywords": ["bbcall", "oldschool", "90s"] }, - { "category": "objects", "char": "📠", "name": "fax", "keywords": ["communication", "technology"] }, - { "category": "objects", "char": "📺", "name": "tv", "keywords": ["technology", "program", "oldschool", "show", "television"] }, - { "category": "objects", "char": "📻", "name": "radio", "keywords": ["communication", "music", "podcast", "program"] }, - { "category": "objects", "char": "🎙", "name": "studio_microphone", "keywords": ["sing", "recording", "artist", "talkshow"] }, - { "category": "objects", "char": "🎚", "name": "level_slider", "keywords": ["scale"] }, - { "category": "objects", "char": "🎛", "name": "control_knobs", "keywords": ["dial"] }, - { "category": "objects", "char": "🧭", "name": "compass", "keywords": ["magnetic", "navigation", "orienteering"] }, - { "category": "objects", "char": "⏱", "name": "stopwatch", "keywords": ["time", "deadline"] }, - { "category": "objects", "char": "⏲", "name": "timer_clock", "keywords": ["alarm", "time"] }, - { "category": "objects", "char": "⏰", "name": "alarm_clock", "keywords": ["time", "wake"] }, - { "category": "objects", "char": "🕰", "name": "mantelpiece_clock", "keywords": ["time"] }, - { "category": "objects", "char": "⏳", "name": "hourglass_flowing_sand", "keywords": ["time", "clock", "oldschool", "limit", "exam", "quiz", "test", "countdown"] }, - { "category": "objects", "char": "⌛", "name": "hourglass", "keywords": ["time", "clock", "oldschool", "limit", "exam", "quiz", "test", "countdown"] }, - { "category": "objects", "char": "📡", "name": "satellite", "keywords": ["communication", "future", "radio", "space"] }, - { "category": "objects", "char": "🔋", "name": "battery", "keywords": ["power", "energy", "sustain"] }, - { "category": "objects", "char": "\uD83E\uDEAB", "name": "battery", "keywords": ["power", "energy", "sustain"] }, - { "category": "objects", "char": "🔌", "name": "electric_plug", "keywords": ["charger", "power"] }, - { "category": "objects", "char": "💡", "name": "bulb", "keywords": ["light", "electricity", "idea"] }, - { "category": "objects", "char": "🔦", "name": "flashlight", "keywords": ["dark", "camping", "sight", "night"] }, - { "category": "objects", "char": "🕯", "name": "candle", "keywords": ["fire", "wax"] }, - { "category": "objects", "char": "🧯", "name": "fire_extinguisher", "keywords": ["quench"] }, - { "category": "objects", "char": "🗑", "name": "wastebasket", "keywords": ["bin", "trash", "rubbish", "garbage", "toss"] }, - { "category": "objects", "char": "🛢", "name": "oil_drum", "keywords": ["barrell"] }, - { "category": "objects", "char": "💸", "name": "money_with_wings", "keywords": ["dollar", "bills", "payment", "sale"] }, - { "category": "objects", "char": "💵", "name": "dollar", "keywords": ["money", "sales", "bill", "currency"] }, - { "category": "objects", "char": "💴", "name": "yen", "keywords": ["money", "sales", "japanese", "dollar", "currency"] }, - { "category": "objects", "char": "💶", "name": "euro", "keywords": ["money", "sales", "dollar", "currency"] }, - { "category": "objects", "char": "💷", "name": "pound", "keywords": ["british", "sterling", "money", "sales", "bills", "uk", "england", "currency"] }, - { "category": "objects", "char": "💰", "name": "moneybag", "keywords": ["dollar", "payment", "coins", "sale"] }, - { "category": "objects", "char": "🪙", "name": "coin", "keywords": ["dollar", "payment", "coins", "sale"] }, - { "category": "objects", "char": "💳", "name": "credit_card", "keywords": ["money", "sales", "dollar", "bill", "payment", "shopping"] }, - { "category": "objects", "char": "\uD83E\uDEAB", "name": "identification_card", "keywords": ["id", "license", "drivers"] }, - { "category": "objects", "char": "💎", "name": "gem", "keywords": ["blue", "ruby", "diamond", "jewelry"] }, - { "category": "objects", "char": "⚖", "name": "balance_scale", "keywords": ["law", "fairness", "weight"] }, - { "category": "objects", "char": "🧰", "name": "toolbox", "keywords": ["tools", "diy", "fix", "maintainer", "mechanic"] }, - { "category": "objects", "char": "🔧", "name": "wrench", "keywords": ["tools", "diy", "ikea", "fix", "maintainer"] }, - { "category": "objects", "char": "🔨", "name": "hammer", "keywords": ["tools", "build", "create"] }, - { "category": "objects", "char": "⚒", "name": "hammer_and_pick", "keywords": ["tools", "build", "create"] }, - { "category": "objects", "char": "🛠", "name": "hammer_and_wrench", "keywords": ["tools", "build", "create"] }, - { "category": "objects", "char": "⛏", "name": "pick", "keywords": ["tools", "dig"] }, - { "category": "objects", "char": "🪓", "name": "axe", "keywords": ["tools"] }, - { "category": "objects", "char": "🦯", "name": "probing_cane", "keywords": ["tools"] }, - { "category": "objects", "char": "🔩", "name": "nut_and_bolt", "keywords": ["handy", "tools", "fix"] }, - { "category": "objects", "char": "⚙", "name": "gear", "keywords": ["cog"] }, - { "category": "objects", "char": "🪃", "name": "boomerang", "keywords": ["tool"] }, - { "category": "objects", "char": "🪚", "name": "carpentry_saw", "keywords": ["tool"] }, - { "category": "objects", "char": "🪛", "name": "screwdriver", "keywords": ["tool"] }, - { "category": "objects", "char": "🪝", "name": "hook", "keywords": ["tool"] }, - { "category": "objects", "char": "🪜", "name": "ladder", "keywords": ["tool"] }, - { "category": "objects", "char": "🧱", "name": "brick", "keywords": ["bricks"] }, - { "category": "objects", "char": "⛓", "name": "chains", "keywords": ["lock", "arrest"] }, - { "category": "objects", "char": "🧲", "name": "magnet", "keywords": ["attraction", "magnetic"] }, - { "category": "objects", "char": "🔫", "name": "gun", "keywords": ["violence", "weapon", "pistol", "revolver"] }, - { "category": "objects", "char": "💣", "name": "bomb", "keywords": ["boom", "explode", "explosion", "terrorism"] }, - { "category": "objects", "char": "🧨", "name": "firecracker", "keywords": ["dynamite", "boom", "explode", "explosion", "explosive"] }, - { "category": "objects", "char": "🔪", "name": "hocho", "keywords": ["knife", "blade", "cutlery", "kitchen", "weapon"] }, - { "category": "objects", "char": "🗡", "name": "dagger", "keywords": ["weapon"] }, - { "category": "objects", "char": "⚔", "name": "crossed_swords", "keywords": ["weapon"] }, - { "category": "objects", "char": "🛡", "name": "shield", "keywords": ["protection", "security"] }, - { "category": "objects", "char": "🚬", "name": "smoking", "keywords": ["kills", "tobacco", "cigarette", "joint", "smoke"] }, - { "category": "objects", "char": "☠", "name": "skull_and_crossbones", "keywords": ["poison", "danger", "deadly", "scary", "death", "pirate", "evil"] }, - { "category": "objects", "char": "⚰", "name": "coffin", "keywords": ["vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box"] }, - { "category": "objects", "char": "⚱", "name": "funeral_urn", "keywords": ["dead", "die", "death", "rip", "ashes"] }, - { "category": "objects", "char": "🏺", "name": "amphora", "keywords": ["vase", "jar"] }, - { "category": "objects", "char": "🔮", "name": "crystal_ball", "keywords": ["disco", "party", "magic", "circus", "fortune_teller"] }, - { "category": "objects", "char": "📿", "name": "prayer_beads", "keywords": ["dhikr", "religious"] }, - { "category": "objects", "char": "🧿", "name": "nazar_amulet", "keywords": ["bead", "charm"] }, - { "category": "objects", "char": "💈", "name": "barber", "keywords": ["hair", "salon", "style"] }, - { "category": "objects", "char": "⚗", "name": "alembic", "keywords": ["distilling", "science", "experiment", "chemistry"] }, - { "category": "objects", "char": "🔭", "name": "telescope", "keywords": ["stars", "space", "zoom", "science", "astronomy"] }, - { "category": "objects", "char": "🔬", "name": "microscope", "keywords": ["laboratory", "experiment", "zoomin", "science", "study"] }, - { "category": "objects", "char": "🕳", "name": "hole", "keywords": ["embarrassing"] }, - { "category": "objects", "char": "💊", "name": "pill", "keywords": ["health", "medicine", "doctor", "pharmacy", "drug"] }, - { "category": "objects", "char": "💉", "name": "syringe", "keywords": ["health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse"] }, - { "category": "objects", "char": "🩸", "name": "drop_of_blood", "keywords": ["health", "hospital", "medicine", "needle", "doctor", "nurse"] }, - { "category": "objects", "char": "🩹", "name": "adhesive_bandage", "keywords": ["health", "hospital", "medicine", "needle", "doctor", "nurse"] }, - { "category": "objects", "char": "🩺", "name": "stethoscope", "keywords": ["health", "hospital", "medicine", "needle", "doctor", "nurse"] }, - { "category": "objects", "char": "🪒", "name": "razor", "keywords": ["health"] }, - { "category": "objects", "char": "\uD83E\uDE7B", "name": "xray", "keywords": [] }, - { "category": "objects", "char": "\uD83E\uDE7C", "name": "crutch", "keywords": [] }, - { "category": "objects", "char": "🧬", "name": "dna", "keywords": ["biologist", "genetics", "life"] }, - { "category": "objects", "char": "🧫", "name": "petri_dish", "keywords": ["bacteria", "biology", "culture", "lab"] }, - { "category": "objects", "char": "🧪", "name": "test_tube", "keywords": ["chemistry", "experiment", "lab", "science"] }, - { "category": "objects", "char": "🌡", "name": "thermometer", "keywords": ["weather", "temperature", "hot", "cold"] }, - { "category": "objects", "char": "🧹", "name": "broom", "keywords": ["cleaning", "sweeping", "witch"] }, - { "category": "objects", "char": "🧺", "name": "basket", "keywords": ["laundry"] }, - { "category": "objects", "char": "🧻", "name": "toilet_paper", "keywords": ["roll", "paper"] }, - { "category": "objects", "char": "🏷", "name": "label", "keywords": ["sale", "tag"] }, - { "category": "objects", "char": "🔖", "name": "bookmark", "keywords": ["favorite", "label", "save"] }, - { "category": "objects", "char": "🚽", "name": "toilet", "keywords": ["restroom", "wc", "washroom", "bathroom", "potty"] }, - { "category": "objects", "char": "🚿", "name": "shower", "keywords": ["clean", "water", "bathroom"] }, - { "category": "objects", "char": "🛁", "name": "bathtub", "keywords": ["clean", "shower", "bathroom"] }, - { "category": "objects", "char": "🧼", "name": "soap", "keywords": ["bar", "bathing", "cleaning", "lather"] }, - { "category": "objects", "char": "🧽", "name": "sponge", "keywords": ["absorbing", "cleaning", "porous"] }, - { "category": "objects", "char": "🧴", "name": "lotion_bottle", "keywords": ["moisturizer", "sunscreen"] }, - { "category": "objects", "char": "🔑", "name": "key", "keywords": ["lock", "door", "password"] }, - { "category": "objects", "char": "🗝", "name": "old_key", "keywords": ["lock", "door", "password"] }, - { "category": "objects", "char": "🛋", "name": "couch_and_lamp", "keywords": ["read", "chill"] }, - { "category": "objects", "char": "🪔", "name": "diya_Lamp", "keywords": ["light", "oil"] }, - { "category": "objects", "char": "🛌", "name": "sleeping_bed", "keywords": ["bed", "rest"] }, - { "category": "objects", "char": "🛏", "name": "bed", "keywords": ["sleep", "rest"] }, - { "category": "objects", "char": "🚪", "name": "door", "keywords": ["house", "entry", "exit"] }, - { "category": "objects", "char": "🪑", "name": "chair", "keywords": ["house", "desk"] }, - { "category": "objects", "char": "🛎", "name": "bellhop_bell", "keywords": ["service"] }, - { "category": "objects", "char": "🧸", "name": "teddy_bear", "keywords": ["plush", "stuffed"] }, - { "category": "objects", "char": "🖼", "name": "framed_picture", "keywords": ["photography"] }, - { "category": "objects", "char": "🗺", "name": "world_map", "keywords": ["location", "direction"] }, - { "category": "objects", "char": "🛗", "name": "elevator", "keywords": ["household"] }, - { "category": "objects", "char": "🪞", "name": "mirror", "keywords": ["household"] }, - { "category": "objects", "char": "🪟", "name": "window", "keywords": ["household"] }, - { "category": "objects", "char": "🪠", "name": "plunger", "keywords": ["household"] }, - { "category": "objects", "char": "🪤", "name": "mouse_trap", "keywords": ["household"] }, - { "category": "objects", "char": "🪣", "name": "bucket", "keywords": ["household"] }, - { "category": "objects", "char": "🪥", "name": "toothbrush", "keywords": ["household"] }, - { "category": "objects", "char": "\uD83E\uDEE7", "name": "bubbles", "keywords": ["ocean", "underwater"] }, - { "category": "objects", "char": "⛱", "name": "parasol_on_ground", "keywords": ["weather", "summer"] }, - { "category": "objects", "char": "🗿", "name": "moyai", "keywords": ["rock", "easter island", "moai"] }, - { "category": "objects", "char": "🛍", "name": "shopping", "keywords": ["mall", "buy", "purchase"] }, - { "category": "objects", "char": "🛒", "name": "shopping_cart", "keywords": ["trolley"] }, - { "category": "objects", "char": "🎈", "name": "balloon", "keywords": ["party", "celebration", "birthday", "circus"] }, - { "category": "objects", "char": "🎏", "name": "flags", "keywords": ["fish", "japanese", "koinobori", "carp", "banner"] }, - { "category": "objects", "char": "🎀", "name": "ribbon", "keywords": ["decoration", "pink", "girl", "bowtie"] }, - { "category": "objects", "char": "🎁", "name": "gift", "keywords": ["present", "birthday", "christmas", "xmas"] }, - { "category": "objects", "char": "🎊", "name": "confetti_ball", "keywords": ["festival", "party", "birthday", "circus"] }, - { "category": "objects", "char": "🎉", "name": "tada", "keywords": ["party", "congratulations", "birthday", "magic", "circus", "celebration"] }, - { "category": "objects", "char": "🎎", "name": "dolls", "keywords": ["japanese", "toy", "kimono"] }, - { "category": "objects", "char": "🎐", "name": "wind_chime", "keywords": ["nature", "ding", "spring", "bell"] }, - { "category": "objects", "char": "🎌", "name": "crossed_flags", "keywords": ["japanese", "nation", "country", "border"] }, - { "category": "objects", "char": "🏮", "name": "izakaya_lantern", "keywords": ["light", "paper", "halloween", "spooky"] }, - { "category": "objects", "char": "🧧", "name": "red_envelope", "keywords": ["gift"] }, - { "category": "objects", "char": "✉️", "name": "email", "keywords": ["letter", "postal", "inbox", "communication"] }, - { "category": "objects", "char": "📩", "name": "envelope_with_arrow", "keywords": ["email", "communication"] }, - { "category": "objects", "char": "📨", "name": "incoming_envelope", "keywords": ["email", "inbox"] }, - { "category": "objects", "char": "📧", "name": "e-mail", "keywords": ["communication", "inbox"] }, - { "category": "objects", "char": "💌", "name": "love_letter", "keywords": ["email", "like", "affection", "envelope", "valentines"] }, - { "category": "objects", "char": "📮", "name": "postbox", "keywords": ["email", "letter", "envelope"] }, - { "category": "objects", "char": "📪", "name": "mailbox_closed", "keywords": ["email", "communication", "inbox"] }, - { "category": "objects", "char": "📫", "name": "mailbox", "keywords": ["email", "inbox", "communication"] }, - { "category": "objects", "char": "📬", "name": "mailbox_with_mail", "keywords": ["email", "inbox", "communication"] }, - { "category": "objects", "char": "📭", "name": "mailbox_with_no_mail", "keywords": ["email", "inbox"] }, - { "category": "objects", "char": "📦", "name": "package", "keywords": ["mail", "gift", "cardboard", "box", "moving"] }, - { "category": "objects", "char": "📯", "name": "postal_horn", "keywords": ["instrument", "music"] }, - { "category": "objects", "char": "📥", "name": "inbox_tray", "keywords": ["email", "documents"] }, - { "category": "objects", "char": "📤", "name": "outbox_tray", "keywords": ["inbox", "email"] }, - { "category": "objects", "char": "📜", "name": "scroll", "keywords": ["documents", "ancient", "history", "paper"] }, - { "category": "objects", "char": "📃", "name": "page_with_curl", "keywords": ["documents", "office", "paper"] }, - { "category": "objects", "char": "📑", "name": "bookmark_tabs", "keywords": ["favorite", "save", "order", "tidy"] }, - { "category": "objects", "char": "🧾", "name": "receipt", "keywords": ["accounting", "expenses"] }, - { "category": "objects", "char": "📊", "name": "bar_chart", "keywords": ["graph", "presentation", "stats"] }, - { "category": "objects", "char": "📈", "name": "chart_with_upwards_trend", "keywords": ["graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success"] }, - { "category": "objects", "char": "📉", "name": "chart_with_downwards_trend", "keywords": ["graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure"] }, - { "category": "objects", "char": "📄", "name": "page_facing_up", "keywords": ["documents", "office", "paper", "information"] }, - { "category": "objects", "char": "📅", "name": "date", "keywords": ["calendar", "schedule"] }, - { "category": "objects", "char": "📆", "name": "calendar", "keywords": ["schedule", "date", "planning"] }, - { "category": "objects", "char": "🗓", "name": "spiral_calendar", "keywords": ["date", "schedule", "planning"] }, - { "category": "objects", "char": "📇", "name": "card_index", "keywords": ["business", "stationery"] }, - { "category": "objects", "char": "🗃", "name": "card_file_box", "keywords": ["business", "stationery"] }, - { "category": "objects", "char": "🗳", "name": "ballot_box", "keywords": ["election", "vote"] }, - { "category": "objects", "char": "🗄", "name": "file_cabinet", "keywords": ["filing", "organizing"] }, - { "category": "objects", "char": "📋", "name": "clipboard", "keywords": ["stationery", "documents"] }, - { "category": "objects", "char": "🗒", "name": "spiral_notepad", "keywords": ["memo", "stationery"] }, - { "category": "objects", "char": "📁", "name": "file_folder", "keywords": ["documents", "business", "office"] }, - { "category": "objects", "char": "📂", "name": "open_file_folder", "keywords": ["documents", "load"] }, - { "category": "objects", "char": "🗂", "name": "card_index_dividers", "keywords": ["organizing", "business", "stationery"] }, - { "category": "objects", "char": "🗞", "name": "newspaper_roll", "keywords": ["press", "headline"] }, - { "category": "objects", "char": "📰", "name": "newspaper", "keywords": ["press", "headline"] }, - { "category": "objects", "char": "📓", "name": "notebook", "keywords": ["stationery", "record", "notes", "paper", "study"] }, - { "category": "objects", "char": "📕", "name": "closed_book", "keywords": ["read", "library", "knowledge", "textbook", "learn"] }, - { "category": "objects", "char": "📗", "name": "green_book", "keywords": ["read", "library", "knowledge", "study"] }, - { "category": "objects", "char": "📘", "name": "blue_book", "keywords": ["read", "library", "knowledge", "learn", "study"] }, - { "category": "objects", "char": "📙", "name": "orange_book", "keywords": ["read", "library", "knowledge", "textbook", "study"] }, - { "category": "objects", "char": "📔", "name": "notebook_with_decorative_cover", "keywords": ["classroom", "notes", "record", "paper", "study"] }, - { "category": "objects", "char": "📒", "name": "ledger", "keywords": ["notes", "paper"] }, - { "category": "objects", "char": "📚", "name": "books", "keywords": ["literature", "library", "study"] }, - { "category": "objects", "char": "📖", "name": "open_book", "keywords": ["book", "read", "library", "knowledge", "literature", "learn", "study"] }, - { "category": "objects", "char": "🧷", "name": "safety_pin", "keywords": ["diaper"] }, - { "category": "objects", "char": "🔗", "name": "link", "keywords": ["rings", "url"] }, - { "category": "objects", "char": "📎", "name": "paperclip", "keywords": ["documents", "stationery"] }, - { "category": "objects", "char": "🖇", "name": "paperclips", "keywords": ["documents", "stationery"] }, - { "category": "objects", "char": "✂️", "name": "scissors", "keywords": ["stationery", "cut"] }, - { "category": "objects", "char": "📐", "name": "triangular_ruler", "keywords": ["stationery", "math", "architect", "sketch"] }, - { "category": "objects", "char": "📏", "name": "straight_ruler", "keywords": ["stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch"] }, - { "category": "objects", "char": "🧮", "name": "abacus", "keywords": ["calculation"] }, - { "category": "objects", "char": "📌", "name": "pushpin", "keywords": ["stationery", "mark", "here"] }, - { "category": "objects", "char": "📍", "name": "round_pushpin", "keywords": ["stationery", "location", "map", "here"] }, - { "category": "objects", "char": "🚩", "name": "triangular_flag_on_post", "keywords": ["mark", "milestone", "place"] }, - { "category": "objects", "char": "🏳", "name": "white_flag", "keywords": ["losing", "loser", "lost", "surrender", "give up", "fail"] }, - { "category": "objects", "char": "🏴", "name": "black_flag", "keywords": ["pirate"] }, - { "category": "objects", "char": "🏳️🌈", "name": "rainbow_flag", "keywords": ["flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual"] }, - { "category": "objects", "char": "🏳️⚧️", "name": "transgender_flag", "keywords": ["flag", "transgender", "pride"] }, - { "category": "objects", "char": "🔐", "name": "closed_lock_with_key", "keywords": ["security", "privacy"] }, - { "category": "objects", "char": "🔒", "name": "lock", "keywords": ["security", "password", "padlock"] }, - { "category": "objects", "char": "🔓", "name": "unlock", "keywords": ["privacy", "security"] }, - { "category": "objects", "char": "🔏", "name": "lock_with_ink_pen", "keywords": ["security", "secret"] }, - { "category": "objects", "char": "🖊", "name": "pen", "keywords": ["stationery", "writing", "write"] }, - { "category": "objects", "char": "🖋", "name": "fountain_pen", "keywords": ["stationery", "writing", "write"] }, - { "category": "objects", "char": "✒️", "name": "black_nib", "keywords": ["pen", "stationery", "writing", "write"] }, - { "category": "objects", "char": "📝", "name": "memo", "keywords": ["write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose"] }, - { "category": "objects", "char": "✏️", "name": "pencil2", "keywords": ["stationery", "write", "paper", "writing", "school", "study"] }, - { "category": "objects", "char": "🖍", "name": "crayon", "keywords": ["drawing", "creativity"] }, - { "category": "objects", "char": "🖌", "name": "paintbrush", "keywords": ["drawing", "creativity", "art"] }, - { "category": "objects", "char": "🔍", "name": "mag", "keywords": ["search", "zoom", "find", "detective"] }, - { "category": "objects", "char": "🔎", "name": "mag_right", "keywords": ["search", "zoom", "find", "detective"] }, - { "category": "objects", "char": "🪦", "name": "headstone", "keywords": ["tombstone", "death"] }, - { "category": "objects", "char": "🪧", "name": "placard", "keywords": ["sign", "description"] }, - { "category": "symbols", "char": "💯", "name": "100", "keywords": ["score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred"] }, - { "category": "symbols", "char": "🔢", "name": "1234", "keywords": ["numbers", "blue-square"] }, - { "category": "symbols", "char": "❤️", "name": "heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "🧡", "name": "orange_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💛", "name": "yellow_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💚", "name": "green_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💙", "name": "blue_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💜", "name": "purple_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "🤎", "name": "brown_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "🖤", "name": "black_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "🤍", "name": "white_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💔", "name": "broken_heart", "keywords": ["sad", "sorry", "break", "heart", "heartbreak"] }, - { "category": "symbols", "char": "❣", "name": "heavy_heart_exclamation", "keywords": ["decoration", "love"] }, - { "category": "symbols", "char": "💕", "name": "two_hearts", "keywords": ["love", "like", "affection", "valentines", "heart"] }, - { "category": "symbols", "char": "💞", "name": "revolving_hearts", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💓", "name": "heartbeat", "keywords": ["love", "like", "affection", "valentines", "pink", "heart"] }, - { "category": "symbols", "char": "💗", "name": "heartpulse", "keywords": ["like", "love", "affection", "valentines", "pink"] }, - { "category": "symbols", "char": "💖", "name": "sparkling_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💘", "name": "cupid", "keywords": ["love", "like", "heart", "affection", "valentines"] }, - { "category": "symbols", "char": "💝", "name": "gift_heart", "keywords": ["love", "valentines"] }, - { "category": "symbols", "char": "💟", "name": "heart_decoration", "keywords": ["purple-square", "love", "like"] }, - { "category": "symbols", "char": "\u2764\uFE0F\u200D\uD83D\uDD25", "name": "heart_on_fire", "keywords": [] }, - { "category": "symbols", "char": "\u2764\uFE0F\u200D\uD83E\uDE79", "name": "mending_heart", "keywords": [] }, - { "category": "symbols", "char": "☮", "name": "peace_symbol", "keywords": ["hippie"] }, - { "category": "symbols", "char": "✝", "name": "latin_cross", "keywords": ["christianity"] }, - { "category": "symbols", "char": "☪", "name": "star_and_crescent", "keywords": ["islam"] }, - { "category": "symbols", "char": "🕉", "name": "om", "keywords": ["hinduism", "buddhism", "sikhism", "jainism"] }, - { "category": "symbols", "char": "☸", "name": "wheel_of_dharma", "keywords": ["hinduism", "buddhism", "sikhism", "jainism"] }, - { "category": "symbols", "char": "✡", "name": "star_of_david", "keywords": ["judaism"] }, - { "category": "symbols", "char": "🔯", "name": "six_pointed_star", "keywords": ["purple-square", "religion", "jewish", "hexagram"] }, - { "category": "symbols", "char": "🕎", "name": "menorah", "keywords": ["purple-square", "hanukkah", "candles", "jewish"] }, - { "category": "symbols", "char": "☯", "name": "yin_yang", "keywords": ["balance"] }, - { "category": "symbols", "char": "☦", "name": "orthodox_cross", "keywords": ["suppedaneum", "religion"] }, - { "category": "symbols", "char": "🛐", "name": "place_of_worship", "keywords": ["religion", "church", "temple", "prayer"] }, - { "category": "symbols", "char": "⛎", "name": "ophiuchus", "keywords": ["sign", "purple-square", "constellation", "astrology"] }, - { "category": "symbols", "char": "♈", "name": "aries", "keywords": ["sign", "purple-square", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♉", "name": "taurus", "keywords": ["purple-square", "sign", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♊", "name": "gemini", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♋", "name": "cancer", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♌", "name": "leo", "keywords": ["sign", "purple-square", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♍", "name": "virgo", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♎", "name": "libra", "keywords": ["sign", "purple-square", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♏", "name": "scorpius", "keywords": ["sign", "zodiac", "purple-square", "astrology", "scorpio"] }, - { "category": "symbols", "char": "♐", "name": "sagittarius", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♑", "name": "capricorn", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♒", "name": "aquarius", "keywords": ["sign", "purple-square", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♓", "name": "pisces", "keywords": ["purple-square", "sign", "zodiac", "astrology"] }, - { "category": "symbols", "char": "🆔", "name": "id", "keywords": ["purple-square", "words"] }, - { "category": "symbols", "char": "⚛", "name": "atom_symbol", "keywords": ["science", "physics", "chemistry"] }, - { "category": "symbols", "char": "⚧️", "name": "transgender_symbol", "keywords": ["purple-square", "woman", "female", "toilet", "loo", "restroom", "gender"] }, - { "category": "symbols", "char": "🈳", "name": "u7a7a", "keywords": ["kanji", "japanese", "chinese", "empty", "sky", "blue-square", "aki"] }, - { "category": "symbols", "char": "🈹", "name": "u5272", "keywords": ["cut", "divide", "chinese", "kanji", "pink-square", "waribiki"] }, - { "category": "symbols", "char": "☢", "name": "radioactive", "keywords": ["nuclear", "danger"] }, - { "category": "symbols", "char": "☣", "name": "biohazard", "keywords": ["danger"] }, - { "category": "symbols", "char": "📴", "name": "mobile_phone_off", "keywords": ["mute", "orange-square", "silence", "quiet"] }, - { "category": "symbols", "char": "📳", "name": "vibration_mode", "keywords": ["orange-square", "phone"] }, - { "category": "symbols", "char": "🈶", "name": "u6709", "keywords": ["orange-square", "chinese", "have", "kanji", "ari"] }, - { "category": "symbols", "char": "🈚", "name": "u7121", "keywords": ["nothing", "chinese", "kanji", "japanese", "orange-square", "nashi"] }, - { "category": "symbols", "char": "🈸", "name": "u7533", "keywords": ["chinese", "japanese", "kanji", "orange-square", "moushikomi"] }, - { "category": "symbols", "char": "🈺", "name": "u55b6", "keywords": ["japanese", "opening hours", "orange-square", "eigyo"] }, - { "category": "symbols", "char": "🈷️", "name": "u6708", "keywords": ["chinese", "month", "moon", "japanese", "orange-square", "kanji", "tsuki", "tsukigime", "getsugaku"] }, - { "category": "symbols", "char": "✴️", "name": "eight_pointed_black_star", "keywords": ["orange-square", "shape", "polygon"] }, - { "category": "symbols", "char": "🆚", "name": "vs", "keywords": ["words", "orange-square"] }, - { "category": "symbols", "char": "🉑", "name": "accept", "keywords": ["ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle"] }, - { "category": "symbols", "char": "💮", "name": "white_flower", "keywords": ["japanese", "spring"] }, - { "category": "symbols", "char": "🉐", "name": "ideograph_advantage", "keywords": ["chinese", "kanji", "obtain", "get", "circle"] }, - { "category": "symbols", "char": "㊙️", "name": "secret", "keywords": ["privacy", "chinese", "sshh", "kanji", "red-circle"] }, - { "category": "symbols", "char": "㊗️", "name": "congratulations", "keywords": ["chinese", "kanji", "japanese", "red-circle"] }, - { "category": "symbols", "char": "🈴", "name": "u5408", "keywords": ["japanese", "chinese", "join", "kanji", "red-square", "goukaku", "pass"] }, - { "category": "symbols", "char": "🈵", "name": "u6e80", "keywords": ["full", "chinese", "japanese", "red-square", "kanji", "man"] }, - { "category": "symbols", "char": "🈲", "name": "u7981", "keywords": ["kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square", "kinshi"] }, - { "category": "symbols", "char": "🅰️", "name": "a", "keywords": ["red-square", "alphabet", "letter"] }, - { "category": "symbols", "char": "🅱️", "name": "b", "keywords": ["red-square", "alphabet", "letter"] }, - { "category": "symbols", "char": "🆎", "name": "ab", "keywords": ["red-square", "alphabet"] }, - { "category": "symbols", "char": "🆑", "name": "cl", "keywords": ["alphabet", "words", "red-square"] }, - { "category": "symbols", "char": "🅾️", "name": "o2", "keywords": ["alphabet", "red-square", "letter"] }, - { "category": "symbols", "char": "🆘", "name": "sos", "keywords": ["help", "red-square", "words", "emergency", "911"] }, - { "category": "symbols", "char": "⛔", "name": "no_entry", "keywords": ["limit", "security", "privacy", "bad", "denied", "stop", "circle"] }, - { "category": "symbols", "char": "📛", "name": "name_badge", "keywords": ["fire", "forbid"] }, - { "category": "symbols", "char": "🚫", "name": "no_entry_sign", "keywords": ["forbid", "stop", "limit", "denied", "disallow", "circle"] }, - { "category": "symbols", "char": "❌", "name": "x", "keywords": ["no", "delete", "remove", "cancel", "red"] }, - { "category": "symbols", "char": "⭕", "name": "o", "keywords": ["circle", "round"] }, - { "category": "symbols", "char": "🛑", "name": "stop_sign", "keywords": ["stop"] }, - { "category": "symbols", "char": "💢", "name": "anger", "keywords": ["angry", "mad"] }, - { "category": "symbols", "char": "♨️", "name": "hotsprings", "keywords": ["bath", "warm", "relax"] }, - { "category": "symbols", "char": "🚷", "name": "no_pedestrians", "keywords": ["rules", "crossing", "walking", "circle"] }, - { "category": "symbols", "char": "🚯", "name": "do_not_litter", "keywords": ["trash", "bin", "garbage", "circle"] }, - { "category": "symbols", "char": "🚳", "name": "no_bicycles", "keywords": ["cyclist", "prohibited", "circle"] }, - { "category": "symbols", "char": "🚱", "name": "non-potable_water", "keywords": ["drink", "faucet", "tap", "circle"] }, - { "category": "symbols", "char": "🔞", "name": "underage", "keywords": ["18", "drink", "pub", "night", "minor", "circle"] }, - { "category": "symbols", "char": "📵", "name": "no_mobile_phones", "keywords": ["iphone", "mute", "circle"] }, - { "category": "symbols", "char": "❗", "name": "exclamation", "keywords": ["heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning"] }, - { "category": "symbols", "char": "❕", "name": "grey_exclamation", "keywords": ["surprise", "punctuation", "gray", "wow", "warning"] }, - { "category": "symbols", "char": "❓", "name": "question", "keywords": ["doubt", "confused"] }, - { "category": "symbols", "char": "❔", "name": "grey_question", "keywords": ["doubts", "gray", "huh", "confused"] }, - { "category": "symbols", "char": "‼️", "name": "bangbang", "keywords": ["exclamation", "surprise"] }, - { "category": "symbols", "char": "⁉️", "name": "interrobang", "keywords": ["wat", "punctuation", "surprise"] }, - { "category": "symbols", "char": "🔅", "name": "low_brightness", "keywords": ["sun", "afternoon", "warm", "summer"] }, - { "category": "symbols", "char": "🔆", "name": "high_brightness", "keywords": ["sun", "light"] }, - { "category": "symbols", "char": "🔱", "name": "trident", "keywords": ["weapon", "spear"] }, - { "category": "symbols", "char": "⚜", "name": "fleur_de_lis", "keywords": ["decorative", "scout"] }, - { "category": "symbols", "char": "〽️", "name": "part_alternation_mark", "keywords": ["graph", "presentation", "stats", "business", "economics", "bad"] }, - { "category": "symbols", "char": "⚠️", "name": "warning", "keywords": ["exclamation", "wip", "alert", "error", "problem", "issue"] }, - { "category": "symbols", "char": "🚸", "name": "children_crossing", "keywords": ["school", "warning", "danger", "sign", "driving", "yellow-diamond"] }, - { "category": "symbols", "char": "🔰", "name": "beginner", "keywords": ["badge", "shield"] }, - { "category": "symbols", "char": "♻️", "name": "recycle", "keywords": ["arrow", "environment", "garbage", "trash"] }, - { "category": "symbols", "char": "🈯", "name": "u6307", "keywords": ["chinese", "point", "green-square", "kanji", "reserved", "shiteiseki"] }, - { "category": "symbols", "char": "💹", "name": "chart", "keywords": ["green-square", "graph", "presentation", "stats"] }, - { "category": "symbols", "char": "❇️", "name": "sparkle", "keywords": ["stars", "green-square", "awesome", "good", "fireworks"] }, - { "category": "symbols", "char": "✳️", "name": "eight_spoked_asterisk", "keywords": ["star", "sparkle", "green-square"] }, - { "category": "symbols", "char": "❎", "name": "negative_squared_cross_mark", "keywords": ["x", "green-square", "no", "deny"] }, - { "category": "symbols", "char": "✅", "name": "white_check_mark", "keywords": ["green-square", "ok", "agree", "vote", "election", "answer", "tick"] }, - { "category": "symbols", "char": "💠", "name": "diamond_shape_with_a_dot_inside", "keywords": ["jewel", "blue", "gem", "crystal", "fancy"] }, - { "category": "symbols", "char": "🌀", "name": "cyclone", "keywords": ["weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon"] }, - { "category": "symbols", "char": "➿", "name": "loop", "keywords": ["tape", "cassette"] }, - { "category": "symbols", "char": "🌐", "name": "globe_with_meridians", "keywords": ["earth", "international", "world", "internet", "interweb", "i18n"] }, - { "category": "symbols", "char": "Ⓜ️", "name": "m", "keywords": ["alphabet", "blue-circle", "letter"] }, - { "category": "symbols", "char": "🏧", "name": "atm", "keywords": ["money", "sales", "cash", "blue-square", "payment", "bank"] }, - { "category": "symbols", "char": "🈂️", "name": "sa", "keywords": ["japanese", "blue-square", "katakana"] }, - { "category": "symbols", "char": "🛂", "name": "passport_control", "keywords": ["custom", "blue-square"] }, - { "category": "symbols", "char": "🛃", "name": "customs", "keywords": ["passport", "border", "blue-square"] }, - { "category": "symbols", "char": "🛄", "name": "baggage_claim", "keywords": ["blue-square", "airport", "transport"] }, - { "category": "symbols", "char": "🛅", "name": "left_luggage", "keywords": ["blue-square", "travel"] }, - { "category": "symbols", "char": "♿", "name": "wheelchair", "keywords": ["blue-square", "disabled", "a11y", "accessibility"] }, - { "category": "symbols", "char": "🚭", "name": "no_smoking", "keywords": ["cigarette", "blue-square", "smell", "smoke"] }, - { "category": "symbols", "char": "🚾", "name": "wc", "keywords": ["toilet", "restroom", "blue-square"] }, - { "category": "symbols", "char": "🅿️", "name": "parking", "keywords": ["cars", "blue-square", "alphabet", "letter"] }, - { "category": "symbols", "char": "🚰", "name": "potable_water", "keywords": ["blue-square", "liquid", "restroom", "cleaning", "faucet"] }, - { "category": "symbols", "char": "🚹", "name": "mens", "keywords": ["toilet", "restroom", "wc", "blue-square", "gender", "male"] }, - { "category": "symbols", "char": "🚺", "name": "womens", "keywords": ["purple-square", "woman", "female", "toilet", "loo", "restroom", "gender"] }, - { "category": "symbols", "char": "🚼", "name": "baby_symbol", "keywords": ["orange-square", "child"] }, - { "category": "symbols", "char": "🚻", "name": "restroom", "keywords": ["blue-square", "toilet", "refresh", "wc", "gender"] }, - { "category": "symbols", "char": "🚮", "name": "put_litter_in_its_place", "keywords": ["blue-square", "sign", "human", "info"] }, - { "category": "symbols", "char": "🎦", "name": "cinema", "keywords": ["blue-square", "record", "film", "movie", "curtain", "stage", "theater"] }, - { "category": "symbols", "char": "📶", "name": "signal_strength", "keywords": ["blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars"] }, - { "category": "symbols", "char": "🈁", "name": "koko", "keywords": ["blue-square", "here", "katakana", "japanese", "destination"] }, - { "category": "symbols", "char": "🆖", "name": "ng", "keywords": ["blue-square", "words", "shape", "icon"] }, - { "category": "symbols", "char": "🆗", "name": "ok", "keywords": ["good", "agree", "yes", "blue-square"] }, - { "category": "symbols", "char": "🆙", "name": "up", "keywords": ["blue-square", "above", "high"] }, - { "category": "symbols", "char": "🆒", "name": "cool", "keywords": ["words", "blue-square"] }, - { "category": "symbols", "char": "🆕", "name": "new", "keywords": ["blue-square", "words", "start"] }, - { "category": "symbols", "char": "🆓", "name": "free", "keywords": ["blue-square", "words"] }, - { "category": "symbols", "char": "0️⃣", "name": "zero", "keywords": ["0", "numbers", "blue-square", "null"] }, - { "category": "symbols", "char": "1️⃣", "name": "one", "keywords": ["blue-square", "numbers", "1"] }, - { "category": "symbols", "char": "2️⃣", "name": "two", "keywords": ["numbers", "2", "prime", "blue-square"] }, - { "category": "symbols", "char": "3️⃣", "name": "three", "keywords": ["3", "numbers", "prime", "blue-square"] }, - { "category": "symbols", "char": "4️⃣", "name": "four", "keywords": ["4", "numbers", "blue-square"] }, - { "category": "symbols", "char": "5️⃣", "name": "five", "keywords": ["5", "numbers", "blue-square", "prime"] }, - { "category": "symbols", "char": "6️⃣", "name": "six", "keywords": ["6", "numbers", "blue-square"] }, - { "category": "symbols", "char": "7️⃣", "name": "seven", "keywords": ["7", "numbers", "blue-square", "prime"] }, - { "category": "symbols", "char": "8️⃣", "name": "eight", "keywords": ["8", "blue-square", "numbers"] }, - { "category": "symbols", "char": "9️⃣", "name": "nine", "keywords": ["blue-square", "numbers", "9"] }, - { "category": "symbols", "char": "🔟", "name": "keycap_ten", "keywords": ["numbers", "10", "blue-square"] }, - { "category": "symbols", "char": "*⃣", "name": "asterisk", "keywords": ["star", "keycap"] }, - { "category": "symbols", "char": "⏏️", "name": "eject_button", "keywords": ["blue-square"] }, - { "category": "symbols", "char": "▶️", "name": "arrow_forward", "keywords": ["blue-square", "right", "direction", "play"] }, - { "category": "symbols", "char": "⏸", "name": "pause_button", "keywords": ["pause", "blue-square"] }, - { "category": "symbols", "char": "⏭", "name": "next_track_button", "keywords": ["forward", "next", "blue-square"] }, - { "category": "symbols", "char": "⏹", "name": "stop_button", "keywords": ["blue-square"] }, - { "category": "symbols", "char": "⏺", "name": "record_button", "keywords": ["blue-square"] }, - { "category": "symbols", "char": "⏯", "name": "play_or_pause_button", "keywords": ["blue-square", "play", "pause"] }, - { "category": "symbols", "char": "⏮", "name": "previous_track_button", "keywords": ["backward"] }, - { "category": "symbols", "char": "⏩", "name": "fast_forward", "keywords": ["blue-square", "play", "speed", "continue"] }, - { "category": "symbols", "char": "⏪", "name": "rewind", "keywords": ["play", "blue-square"] }, - { "category": "symbols", "char": "🔀", "name": "twisted_rightwards_arrows", "keywords": ["blue-square", "shuffle", "music", "random"] }, - { "category": "symbols", "char": "🔁", "name": "repeat", "keywords": ["loop", "record"] }, - { "category": "symbols", "char": "🔂", "name": "repeat_one", "keywords": ["blue-square", "loop"] }, - { "category": "symbols", "char": "◀️", "name": "arrow_backward", "keywords": ["blue-square", "left", "direction"] }, - { "category": "symbols", "char": "🔼", "name": "arrow_up_small", "keywords": ["blue-square", "triangle", "direction", "point", "forward", "top"] }, - { "category": "symbols", "char": "🔽", "name": "arrow_down_small", "keywords": ["blue-square", "direction", "bottom"] }, - { "category": "symbols", "char": "⏫", "name": "arrow_double_up", "keywords": ["blue-square", "direction", "top"] }, - { "category": "symbols", "char": "⏬", "name": "arrow_double_down", "keywords": ["blue-square", "direction", "bottom"] }, - { "category": "symbols", "char": "➡️", "name": "arrow_right", "keywords": ["blue-square", "next"] }, - { "category": "symbols", "char": "⬅️", "name": "arrow_left", "keywords": ["blue-square", "previous", "back"] }, - { "category": "symbols", "char": "⬆️", "name": "arrow_up", "keywords": ["blue-square", "continue", "top", "direction"] }, - { "category": "symbols", "char": "⬇️", "name": "arrow_down", "keywords": ["blue-square", "direction", "bottom"] }, - { "category": "symbols", "char": "↗️", "name": "arrow_upper_right", "keywords": ["blue-square", "point", "direction", "diagonal", "northeast"] }, - { "category": "symbols", "char": "↘️", "name": "arrow_lower_right", "keywords": ["blue-square", "direction", "diagonal", "southeast"] }, - { "category": "symbols", "char": "↙️", "name": "arrow_lower_left", "keywords": ["blue-square", "direction", "diagonal", "southwest"] }, - { "category": "symbols", "char": "↖️", "name": "arrow_upper_left", "keywords": ["blue-square", "point", "direction", "diagonal", "northwest"] }, - { "category": "symbols", "char": "↕️", "name": "arrow_up_down", "keywords": ["blue-square", "direction", "way", "vertical"] }, - { "category": "symbols", "char": "↔️", "name": "left_right_arrow", "keywords": ["shape", "direction", "horizontal", "sideways"] }, - { "category": "symbols", "char": "🔄", "name": "arrows_counterclockwise", "keywords": ["blue-square", "sync", "cycle"] }, - { "category": "symbols", "char": "↪️", "name": "arrow_right_hook", "keywords": ["blue-square", "return", "rotate", "direction"] }, - { "category": "symbols", "char": "↩️", "name": "leftwards_arrow_with_hook", "keywords": ["back", "return", "blue-square", "undo", "enter"] }, - { "category": "symbols", "char": "⤴️", "name": "arrow_heading_up", "keywords": ["blue-square", "direction", "top"] }, - { "category": "symbols", "char": "⤵️", "name": "arrow_heading_down", "keywords": ["blue-square", "direction", "bottom"] }, - { "category": "symbols", "char": "#️⃣", "name": "hash", "keywords": ["symbol", "blue-square", "twitter"] }, - { "category": "symbols", "char": "ℹ️", "name": "information_source", "keywords": ["blue-square", "alphabet", "letter"] }, - { "category": "symbols", "char": "🔤", "name": "abc", "keywords": ["blue-square", "alphabet"] }, - { "category": "symbols", "char": "🔡", "name": "abcd", "keywords": ["blue-square", "alphabet"] }, - { "category": "symbols", "char": "🔠", "name": "capital_abcd", "keywords": ["alphabet", "words", "blue-square"] }, - { "category": "symbols", "char": "🔣", "name": "symbols", "keywords": ["blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters"] }, - { "category": "symbols", "char": "🎵", "name": "musical_note", "keywords": ["score", "tone", "sound"] }, - { "category": "symbols", "char": "🎶", "name": "notes", "keywords": ["music", "score"] }, - { "category": "symbols", "char": "〰️", "name": "wavy_dash", "keywords": ["draw", "line", "moustache", "mustache", "squiggle", "scribble"] }, - { "category": "symbols", "char": "➰", "name": "curly_loop", "keywords": ["scribble", "draw", "shape", "squiggle"] }, - { "category": "symbols", "char": "✔️", "name": "heavy_check_mark", "keywords": ["ok", "nike", "answer", "yes", "tick"] }, - { "category": "symbols", "char": "🔃", "name": "arrows_clockwise", "keywords": ["sync", "cycle", "round", "repeat"] }, - { "category": "symbols", "char": "➕", "name": "heavy_plus_sign", "keywords": ["math", "calculation", "addition", "more", "increase"] }, - { "category": "symbols", "char": "➖", "name": "heavy_minus_sign", "keywords": ["math", "calculation", "subtract", "less"] }, - { "category": "symbols", "char": "➗", "name": "heavy_division_sign", "keywords": ["divide", "math", "calculation"] }, - { "category": "symbols", "char": "✖️", "name": "heavy_multiplication_x", "keywords": ["math", "calculation"] }, - { "category": "symbols", "char": "\uD83D\uDFF0", "name": "heavy_equals_sign", "keywords": [] }, - { "category": "symbols", "char": "♾", "name": "infinity", "keywords": ["forever"] }, - { "category": "symbols", "char": "💲", "name": "heavy_dollar_sign", "keywords": ["money", "sales", "payment", "currency", "buck"] }, - { "category": "symbols", "char": "💱", "name": "currency_exchange", "keywords": ["money", "sales", "dollar", "travel"] }, - { "category": "symbols", "char": "©️", "name": "copyright", "keywords": ["ip", "license", "circle", "law", "legal"] }, - { "category": "symbols", "char": "®️", "name": "registered", "keywords": ["alphabet", "circle"] }, - { "category": "symbols", "char": "™️", "name": "tm", "keywords": ["trademark", "brand", "law", "legal"] }, - { "category": "symbols", "char": "🔚", "name": "end", "keywords": ["words", "arrow"] }, - { "category": "symbols", "char": "🔙", "name": "back", "keywords": ["arrow", "words", "return"] }, - { "category": "symbols", "char": "🔛", "name": "on", "keywords": ["arrow", "words"] }, - { "category": "symbols", "char": "🔝", "name": "top", "keywords": ["words", "blue-square"] }, - { "category": "symbols", "char": "🔜", "name": "soon", "keywords": ["arrow", "words"] }, - { "category": "symbols", "char": "☑️", "name": "ballot_box_with_check", "keywords": ["ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick"] }, - { "category": "symbols", "char": "🔘", "name": "radio_button", "keywords": ["input", "old", "music", "circle"] }, - { "category": "symbols", "char": "⚫", "name": "black_circle", "keywords": ["shape", "button", "round"] }, - { "category": "symbols", "char": "⚪", "name": "white_circle", "keywords": ["shape", "round"] }, - { "category": "symbols", "char": "🔴", "name": "red_circle", "keywords": ["shape", "error", "danger"] }, - { "category": "symbols", "char": "🟠", "name": "orange_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟡", "name": "yellow_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟢", "name": "green_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🔵", "name": "large_blue_circle", "keywords": ["shape", "icon", "button"] }, - { "category": "symbols", "char": "🟣", "name": "purple_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟤", "name": "brown_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🔸", "name": "small_orange_diamond", "keywords": ["shape", "jewel", "gem"] }, - { "category": "symbols", "char": "🔹", "name": "small_blue_diamond", "keywords": ["shape", "jewel", "gem"] }, - { "category": "symbols", "char": "🔶", "name": "large_orange_diamond", "keywords": ["shape", "jewel", "gem"] }, - { "category": "symbols", "char": "🔷", "name": "large_blue_diamond", "keywords": ["shape", "jewel", "gem"] }, - { "category": "symbols", "char": "🔺", "name": "small_red_triangle", "keywords": ["shape", "direction", "up", "top"] }, - { "category": "symbols", "char": "▪️", "name": "black_small_square", "keywords": ["shape", "icon"] }, - { "category": "symbols", "char": "▫️", "name": "white_small_square", "keywords": ["shape", "icon"] }, - { "category": "symbols", "char": "⬛", "name": "black_large_square", "keywords": ["shape", "icon", "button"] }, - { "category": "symbols", "char": "⬜", "name": "white_large_square", "keywords": ["shape", "icon", "stone", "button"] }, - { "category": "symbols", "char": "🟥", "name": "red_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟧", "name": "orange_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟨", "name": "yellow_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟩", "name": "green_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟦", "name": "blue_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟪", "name": "purple_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟫", "name": "brown_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🔻", "name": "small_red_triangle_down", "keywords": ["shape", "direction", "bottom"] }, - { "category": "symbols", "char": "◼️", "name": "black_medium_square", "keywords": ["shape", "button", "icon"] }, - { "category": "symbols", "char": "◻️", "name": "white_medium_square", "keywords": ["shape", "stone", "icon"] }, - { "category": "symbols", "char": "◾", "name": "black_medium_small_square", "keywords": ["icon", "shape", "button"] }, - { "category": "symbols", "char": "◽", "name": "white_medium_small_square", "keywords": ["shape", "stone", "icon", "button"] }, - { "category": "symbols", "char": "🔲", "name": "black_square_button", "keywords": ["shape", "input", "frame"] }, - { "category": "symbols", "char": "🔳", "name": "white_square_button", "keywords": ["shape", "input"] }, - { "category": "symbols", "char": "🔈", "name": "speaker", "keywords": ["sound", "volume", "silence", "broadcast"] }, - { "category": "symbols", "char": "🔉", "name": "sound", "keywords": ["volume", "speaker", "broadcast"] }, - { "category": "symbols", "char": "🔊", "name": "loud_sound", "keywords": ["volume", "noise", "noisy", "speaker", "broadcast"] }, - { "category": "symbols", "char": "🔇", "name": "mute", "keywords": ["sound", "volume", "silence", "quiet"] }, - { "category": "symbols", "char": "📣", "name": "mega", "keywords": ["sound", "speaker", "volume"] }, - { "category": "symbols", "char": "📢", "name": "loudspeaker", "keywords": ["volume", "sound"] }, - { "category": "symbols", "char": "🔔", "name": "bell", "keywords": ["sound", "notification", "christmas", "xmas", "chime"] }, - { "category": "symbols", "char": "🔕", "name": "no_bell", "keywords": ["sound", "volume", "mute", "quiet", "silent"] }, - { "category": "symbols", "char": "🃏", "name": "black_joker", "keywords": ["poker", "cards", "game", "play", "magic"] }, - { "category": "symbols", "char": "🀄", "name": "mahjong", "keywords": ["game", "play", "chinese", "kanji"] }, - { "category": "symbols", "char": "♠️", "name": "spades", "keywords": ["poker", "cards", "suits", "magic"] }, - { "category": "symbols", "char": "♣️", "name": "clubs", "keywords": ["poker", "cards", "magic", "suits"] }, - { "category": "symbols", "char": "❤️", "name": "hearts", "keywords": ["poker", "cards", "magic", "suits"] }, - { "category": "symbols", "char": "♦️", "name": "diamonds", "keywords": ["poker", "cards", "magic", "suits"] }, - { "category": "symbols", "char": "🎴", "name": "flower_playing_cards", "keywords": ["game", "sunset", "red"] }, - { "category": "symbols", "char": "💭", "name": "thought_balloon", "keywords": ["bubble", "cloud", "speech", "thinking", "dream"] }, - { "category": "symbols", "char": "🗯", "name": "right_anger_bubble", "keywords": ["caption", "speech", "thinking", "mad"] }, - { "category": "symbols", "char": "💬", "name": "speech_balloon", "keywords": ["bubble", "words", "message", "talk", "chatting"] }, - { "category": "symbols", "char": "🗨", "name": "left_speech_bubble", "keywords": ["words", "message", "talk", "chatting"] }, - { "category": "symbols", "char": "🕐", "name": "clock1", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕑", "name": "clock2", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕒", "name": "clock3", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕓", "name": "clock4", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕔", "name": "clock5", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕕", "name": "clock6", "keywords": ["time", "late", "early", "schedule", "dawn", "dusk"] }, - { "category": "symbols", "char": "🕖", "name": "clock7", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕗", "name": "clock8", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕘", "name": "clock9", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕙", "name": "clock10", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕚", "name": "clock11", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕛", "name": "clock12", "keywords": ["time", "noon", "midnight", "midday", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕜", "name": "clock130", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕝", "name": "clock230", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕞", "name": "clock330", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕟", "name": "clock430", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕠", "name": "clock530", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕡", "name": "clock630", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕢", "name": "clock730", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕣", "name": "clock830", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕤", "name": "clock930", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕥", "name": "clock1030", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕦", "name": "clock1130", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕧", "name": "clock1230", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "flags", "char": "🇦🇫", "name": "afghanistan", "keywords": ["af", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇽", "name": "aland_islands", "keywords": ["Åland", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇱", "name": "albania", "keywords": ["al", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇿", "name": "algeria", "keywords": ["dz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇸", "name": "american_samoa", "keywords": ["american", "ws", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇩", "name": "andorra", "keywords": ["ad", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇴", "name": "angola", "keywords": ["ao", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇮", "name": "anguilla", "keywords": ["ai", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇶", "name": "antarctica", "keywords": ["aq", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇬", "name": "antigua_barbuda", "keywords": ["antigua", "barbuda", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇷", "name": "argentina", "keywords": ["ar", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇲", "name": "armenia", "keywords": ["am", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇼", "name": "aruba", "keywords": ["aw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇨", "name": "ascension_island", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇺", "name": "australia", "keywords": ["au", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇹", "name": "austria", "keywords": ["at", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇿", "name": "azerbaijan", "keywords": ["az", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇸", "name": "bahamas", "keywords": ["bs", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇭", "name": "bahrain", "keywords": ["bh", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇩", "name": "bangladesh", "keywords": ["bd", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇧", "name": "barbados", "keywords": ["bb", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇾", "name": "belarus", "keywords": ["by", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇪", "name": "belgium", "keywords": ["be", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇿", "name": "belize", "keywords": ["bz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇯", "name": "benin", "keywords": ["bj", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇲", "name": "bermuda", "keywords": ["bm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇹", "name": "bhutan", "keywords": ["bt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇴", "name": "bolivia", "keywords": ["bo", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇶", "name": "caribbean_netherlands", "keywords": ["bonaire", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇦", "name": "bosnia_herzegovina", "keywords": ["bosnia", "herzegovina", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇼", "name": "botswana", "keywords": ["bw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇷", "name": "brazil", "keywords": ["br", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇴", "name": "british_indian_ocean_territory", "keywords": ["british", "indian", "ocean", "territory", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇬", "name": "british_virgin_islands", "keywords": ["british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇳", "name": "brunei", "keywords": ["bn", "darussalam", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇬", "name": "bulgaria", "keywords": ["bg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇫", "name": "burkina_faso", "keywords": ["burkina", "faso", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇮", "name": "burundi", "keywords": ["bi", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇻", "name": "cape_verde", "keywords": ["cabo", "verde", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇭", "name": "cambodia", "keywords": ["kh", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇲", "name": "cameroon", "keywords": ["cm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇦", "name": "canada", "keywords": ["ca", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇨", "name": "canary_islands", "keywords": ["canary", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇾", "name": "cayman_islands", "keywords": ["cayman", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇫", "name": "central_african_republic", "keywords": ["central", "african", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇩", "name": "chad", "keywords": ["td", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇱", "name": "chile", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇳", "name": "cn", "keywords": ["china", "chinese", "prc", "flag", "country", "nation", "banner"] }, - { "category": "flags", "char": "🇨🇽", "name": "christmas_island", "keywords": ["christmas", "island", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇨", "name": "cocos_islands", "keywords": ["cocos", "keeling", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇴", "name": "colombia", "keywords": ["co", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇲", "name": "comoros", "keywords": ["km", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇬", "name": "congo_brazzaville", "keywords": ["congo", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇩", "name": "congo_kinshasa", "keywords": ["congo", "democratic", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇰", "name": "cook_islands", "keywords": ["cook", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇷", "name": "costa_rica", "keywords": ["costa", "rica", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇷", "name": "croatia", "keywords": ["hr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇺", "name": "cuba", "keywords": ["cu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇼", "name": "curacao", "keywords": ["curaçao", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇾", "name": "cyprus", "keywords": ["cy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇿", "name": "czech_republic", "keywords": ["cz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇰", "name": "denmark", "keywords": ["dk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇯", "name": "djibouti", "keywords": ["dj", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇲", "name": "dominica", "keywords": ["dm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇴", "name": "dominican_republic", "keywords": ["dominican", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇨", "name": "ecuador", "keywords": ["ec", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇬", "name": "egypt", "keywords": ["eg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇻", "name": "el_salvador", "keywords": ["el", "salvador", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇶", "name": "equatorial_guinea", "keywords": ["equatorial", "gn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇷", "name": "eritrea", "keywords": ["er", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇪", "name": "estonia", "keywords": ["ee", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇹", "name": "ethiopia", "keywords": ["et", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇺", "name": "eu", "keywords": ["european", "union", "flag", "banner"] }, - { "category": "flags", "char": "🇫🇰", "name": "falkland_islands", "keywords": ["falkland", "islands", "malvinas", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇴", "name": "faroe_islands", "keywords": ["faroe", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇯", "name": "fiji", "keywords": ["fj", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇮", "name": "finland", "keywords": ["fi", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇷", "name": "fr", "keywords": ["banner", "flag", "nation", "france", "french", "country"] }, - { "category": "flags", "char": "🇬🇫", "name": "french_guiana", "keywords": ["french", "guiana", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇫", "name": "french_polynesia", "keywords": ["french", "polynesia", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇫", "name": "french_southern_territories", "keywords": ["french", "southern", "territories", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇦", "name": "gabon", "keywords": ["ga", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇲", "name": "gambia", "keywords": ["gm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇪", "name": "georgia", "keywords": ["ge", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇪", "name": "de", "keywords": ["german", "nation", "flag", "country", "banner"] }, - { "category": "flags", "char": "🇬🇭", "name": "ghana", "keywords": ["gh", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇮", "name": "gibraltar", "keywords": ["gi", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇷", "name": "greece", "keywords": ["gr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇱", "name": "greenland", "keywords": ["gl", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇩", "name": "grenada", "keywords": ["gd", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇵", "name": "guadeloupe", "keywords": ["gp", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇺", "name": "guam", "keywords": ["gu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇹", "name": "guatemala", "keywords": ["gt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇬", "name": "guernsey", "keywords": ["gg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇳", "name": "guinea", "keywords": ["gn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇼", "name": "guinea_bissau", "keywords": ["gw", "bissau", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇾", "name": "guyana", "keywords": ["gy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇹", "name": "haiti", "keywords": ["ht", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇳", "name": "honduras", "keywords": ["hn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇰", "name": "hong_kong", "keywords": ["hong", "kong", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇺", "name": "hungary", "keywords": ["hu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇸", "name": "iceland", "keywords": ["is", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇳", "name": "india", "keywords": ["in", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇩", "name": "indonesia", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇷", "name": "iran", "keywords": ["iran, ", "islamic", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇶", "name": "iraq", "keywords": ["iq", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇪", "name": "ireland", "keywords": ["ie", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇲", "name": "isle_of_man", "keywords": ["isle", "man", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇱", "name": "israel", "keywords": ["il", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇹", "name": "it", "keywords": ["italy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇮", "name": "cote_divoire", "keywords": ["ivory", "coast", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇯🇲", "name": "jamaica", "keywords": ["jm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇯🇵", "name": "jp", "keywords": ["japanese", "nation", "flag", "country", "banner"] }, - { "category": "flags", "char": "🇯🇪", "name": "jersey", "keywords": ["je", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇯🇴", "name": "jordan", "keywords": ["jo", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇿", "name": "kazakhstan", "keywords": ["kz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇪", "name": "kenya", "keywords": ["ke", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇮", "name": "kiribati", "keywords": ["ki", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇽🇰", "name": "kosovo", "keywords": ["xk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇼", "name": "kuwait", "keywords": ["kw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇬", "name": "kyrgyzstan", "keywords": ["kg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇦", "name": "laos", "keywords": ["lao", "democratic", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇻", "name": "latvia", "keywords": ["lv", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇧", "name": "lebanon", "keywords": ["lb", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇸", "name": "lesotho", "keywords": ["ls", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇷", "name": "liberia", "keywords": ["lr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇾", "name": "libya", "keywords": ["ly", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇮", "name": "liechtenstein", "keywords": ["li", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇹", "name": "lithuania", "keywords": ["lt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇺", "name": "luxembourg", "keywords": ["lu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇴", "name": "macau", "keywords": ["macao", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇰", "name": "macedonia", "keywords": ["macedonia, ", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇬", "name": "madagascar", "keywords": ["mg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇼", "name": "malawi", "keywords": ["mw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇾", "name": "malaysia", "keywords": ["my", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇻", "name": "maldives", "keywords": ["mv", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇱", "name": "mali", "keywords": ["ml", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇹", "name": "malta", "keywords": ["mt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇭", "name": "marshall_islands", "keywords": ["marshall", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇶", "name": "martinique", "keywords": ["mq", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇷", "name": "mauritania", "keywords": ["mr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇺", "name": "mauritius", "keywords": ["mu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇾🇹", "name": "mayotte", "keywords": ["yt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇽", "name": "mexico", "keywords": ["mx", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇲", "name": "micronesia", "keywords": ["micronesia, ", "federated", "states", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇩", "name": "moldova", "keywords": ["moldova, ", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇨", "name": "monaco", "keywords": ["mc", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇳", "name": "mongolia", "keywords": ["mn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇪", "name": "montenegro", "keywords": ["me", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇸", "name": "montserrat", "keywords": ["ms", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇦", "name": "morocco", "keywords": ["ma", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇿", "name": "mozambique", "keywords": ["mz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇲", "name": "myanmar", "keywords": ["mm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇦", "name": "namibia", "keywords": ["na", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇷", "name": "nauru", "keywords": ["nr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇵", "name": "nepal", "keywords": ["np", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇱", "name": "netherlands", "keywords": ["nl", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇨", "name": "new_caledonia", "keywords": ["new", "caledonia", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇿", "name": "new_zealand", "keywords": ["new", "zealand", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇮", "name": "nicaragua", "keywords": ["ni", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇪", "name": "niger", "keywords": ["ne", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇬", "name": "nigeria", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇺", "name": "niue", "keywords": ["nu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇫", "name": "norfolk_island", "keywords": ["norfolk", "island", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇵", "name": "northern_mariana_islands", "keywords": ["northern", "mariana", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇵", "name": "north_korea", "keywords": ["north", "korea", "nation", "flag", "country", "banner"] }, - { "category": "flags", "char": "🇳🇴", "name": "norway", "keywords": ["no", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇴🇲", "name": "oman", "keywords": ["om_symbol", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇰", "name": "pakistan", "keywords": ["pk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇼", "name": "palau", "keywords": ["pw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇸", "name": "palestinian_territories", "keywords": ["palestine", "palestinian", "territories", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇦", "name": "panama", "keywords": ["pa", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇬", "name": "papua_new_guinea", "keywords": ["papua", "new", "guinea", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇾", "name": "paraguay", "keywords": ["py", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇪", "name": "peru", "keywords": ["pe", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇭", "name": "philippines", "keywords": ["ph", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇳", "name": "pitcairn_islands", "keywords": ["pitcairn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇱", "name": "poland", "keywords": ["pl", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇹", "name": "portugal", "keywords": ["pt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇷", "name": "puerto_rico", "keywords": ["puerto", "rico", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇶🇦", "name": "qatar", "keywords": ["qa", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇪", "name": "reunion", "keywords": ["réunion", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇴", "name": "romania", "keywords": ["ro", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇺", "name": "ru", "keywords": ["russian", "federation", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇼", "name": "rwanda", "keywords": ["rw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇱", "name": "st_barthelemy", "keywords": ["saint", "barthélemy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇭", "name": "st_helena", "keywords": ["saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇳", "name": "st_kitts_nevis", "keywords": ["saint", "kitts", "nevis", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇨", "name": "st_lucia", "keywords": ["saint", "lucia", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇲", "name": "st_pierre_miquelon", "keywords": ["saint", "pierre", "miquelon", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇨", "name": "st_vincent_grenadines", "keywords": ["saint", "vincent", "grenadines", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇼🇸", "name": "samoa", "keywords": ["ws", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇲", "name": "san_marino", "keywords": ["san", "marino", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇹", "name": "sao_tome_principe", "keywords": ["sao", "tome", "principe", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇦", "name": "saudi_arabia", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇳", "name": "senegal", "keywords": ["sn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇸", "name": "serbia", "keywords": ["rs", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇨", "name": "seychelles", "keywords": ["sc", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇱", "name": "sierra_leone", "keywords": ["sierra", "leone", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇬", "name": "singapore", "keywords": ["sg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇽", "name": "sint_maarten", "keywords": ["sint", "maarten", "dutch", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇰", "name": "slovakia", "keywords": ["sk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇮", "name": "slovenia", "keywords": ["si", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇧", "name": "solomon_islands", "keywords": ["solomon", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇴", "name": "somalia", "keywords": ["so", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇿🇦", "name": "south_africa", "keywords": ["south", "africa", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇸", "name": "south_georgia_south_sandwich_islands", "keywords": ["south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇷", "name": "kr", "keywords": ["south", "korea", "nation", "flag", "country", "banner"] }, - { "category": "flags", "char": "🇸🇸", "name": "south_sudan", "keywords": ["south", "sd", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇸", "name": "es", "keywords": ["spain", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇰", "name": "sri_lanka", "keywords": ["sri", "lanka", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇩", "name": "sudan", "keywords": ["sd", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇷", "name": "suriname", "keywords": ["sr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇿", "name": "swaziland", "keywords": ["sz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇪", "name": "sweden", "keywords": ["se", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇭", "name": "switzerland", "keywords": ["ch", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇾", "name": "syria", "keywords": ["syrian", "arab", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇼", "name": "taiwan", "keywords": ["tw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇯", "name": "tajikistan", "keywords": ["tj", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇿", "name": "tanzania", "keywords": ["tanzania, ", "united", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇭", "name": "thailand", "keywords": ["th", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇱", "name": "timor_leste", "keywords": ["timor", "leste", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇬", "name": "togo", "keywords": ["tg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇰", "name": "tokelau", "keywords": ["tk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇴", "name": "tonga", "keywords": ["to", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇹", "name": "trinidad_tobago", "keywords": ["trinidad", "tobago", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇦", "name": "tristan_da_cunha", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇳", "name": "tunisia", "keywords": ["tn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇷", "name": "tr", "keywords": ["turkey", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇲", "name": "turkmenistan", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇨", "name": "turks_caicos_islands", "keywords": ["turks", "caicos", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇻", "name": "tuvalu", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇬", "name": "uganda", "keywords": ["ug", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇦", "name": "ukraine", "keywords": ["ua", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇪", "name": "united_arab_emirates", "keywords": ["united", "arab", "emirates", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇧", "name": "uk", "keywords": ["united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack"] }, - { "category": "flags", "char": "🏴", "name": "england", "keywords": ["flag", "english"] }, - { "category": "flags", "char": "🏴", "name": "scotland", "keywords": ["flag", "scottish"] }, - { "category": "flags", "char": "🏴", "name": "wales", "keywords": ["flag", "welsh"] }, - { "category": "flags", "char": "🇺🇸", "name": "us", "keywords": ["united", "states", "america", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇮", "name": "us_virgin_islands", "keywords": ["virgin", "islands", "us", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇾", "name": "uruguay", "keywords": ["uy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇿", "name": "uzbekistan", "keywords": ["uz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇺", "name": "vanuatu", "keywords": ["vu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇦", "name": "vatican_city", "keywords": ["vatican", "city", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇪", "name": "venezuela", "keywords": ["ve", "bolivarian", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇳", "name": "vietnam", "keywords": ["viet", "nam", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇼🇫", "name": "wallis_futuna", "keywords": ["wallis", "futuna", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇭", "name": "western_sahara", "keywords": ["western", "sahara", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇾🇪", "name": "yemen", "keywords": ["ye", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇿🇲", "name": "zambia", "keywords": ["zm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇿🇼", "name": "zimbabwe", "keywords": ["zw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇳", "name": "united_nations", "keywords": ["un", "flag", "banner"] }, - { "category": "flags", "char": "🏴☠️", "name": "pirate_flag", "keywords": ["skull", "crossbones", "flag", "banner"] } -] - diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 0c4dbe234b..ad5f0abeb1 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -1,5 +1,9 @@ +import data from "unicode-emoji-json/data-by-group.json"; +import components from "unicode-emoji-json/data-emoji-components.json"; +import keywordSet from "emojilib"; + export const unicodeEmojiCategories = [ - "face", + "emotion", "people", "animals_and_nature", "food_and_drink", @@ -10,14 +14,125 @@ export const unicodeEmojiCategories = [ "flags", ] as const; +export const categoryMapping = { + "Smileys & Emotion": "emotion", + "People & Body": "people", + "Animals & Nature": "animals_and_nature", + "Food & Drink": "food_and_drink", + "Activities": "activity", + "Travel & Places": "travel_and_places", + "Objects": "objects", + "Symbols": "symbols", + "Flags": "flags", +} as const; + +const skinToneModifiers = [ + "light_skin_tone", + "medium_light_skin_tone", + "medium_skin_tone", + "medium_dark_skin_tone", + "dark_skin_tone", +]; + +const newData = {}; + +Object.keys(data).forEach((originalCategory) => { + const newCategory = categoryMapping[originalCategory]; + if (newCategory) { + newData[newCategory] = newData[newCategory] || []; + Object.keys(data[originalCategory]).forEach((emojiIndex) => { + const emojiObj = { ...data[originalCategory][emojiIndex] }; + emojiObj.keywords = keywordSet[emojiObj.emoji]; + newData[newCategory].push(emojiObj); + + if (emojiObj.skin_tone_support) { + skinToneModifiers.forEach((modifier) => { + const modifiedEmojiObj = { ...emojiObj }; + modifiedEmojiObj.emoji += components[modifier]; + modifiedEmojiObj.skin_tone = modifier; + newData[newCategory].push(modifiedEmojiObj); + }); + } + }); + } +}); + export type UnicodeEmojiDef = { - name: string; - keywords: string[]; - char: string; + emoji: string; category: typeof unicodeEmojiCategories[number]; + skin_tone_support: boolean; + name: string; + slug: string; + emoji_version: string; + skin_tone?: string; + keywords?: string[]; }; -// initial converted from https://github.com/muan/emojilib/commit/242fe68be86ed6536843b83f7e32f376468b38fb -import _emojilist from "../emojilist.json"; +export const emojilist = newData as UnicodeEmojiDef[]; -export const emojilist = _emojilist as UnicodeEmojiDef[]; +const storeName = "emojiList"; + +function openDatabase() { + return new Promise<IDBDatabase>((resolve, reject) => { + const openRequest = indexedDB.open("emojiDatabase", 1); + + openRequest.onupgradeneeded = () => { + const db = openRequest.result; + if (!db.objectStoreNames.contains(storeName)) { + db.createObjectStore(storeName); + } + }; + openRequest.onsuccess = () => { + resolve(openRequest.result); + }; + openRequest.onerror = () => { + reject(openRequest.error); + }; + }); +} + +function storeData(db: IDBDatabase, data) { + return new Promise((resolve, reject) => { + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + store.put(data, "emojiListKey"); + + transaction.oncomplete = resolve; + transaction.onerror = reject; + }); +} + +function getData(db: IDBDatabase): Promise<UnicodeEmojiDef[]> { + return new Promise((resolve, reject) => { + const transaction = db.transaction(storeName, "readonly"); + const store = transaction.objectStore(storeName); + const getRequest = store.get("emojiListKey"); + + getRequest.onsuccess = () => resolve(getRequest.result); + getRequest.onerror = reject; + }); +} + +export async function getEmojiData(): Promise<UnicodeEmojiDef[]> { + try { + const db = await openDatabase(); + const cachedData = await getData(db); + + if (cachedData) { + return cachedData; + } else { + await storeData(db, emojilist); + console.log("Emoji data stored in IndexedDB"); + return emojilist; + } + } catch (err) { + console.error("Error accessing IndexedDB:", err); + return emojilist; + } +} + +export function getNicelyLabeledCategory(internalName) { + return Object.keys(categoryMapping).find( + (key) => categoryMapping[key] === internalName + ) || internalName; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1c51be057..19609845bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -777,6 +777,9 @@ importers: date-fns: specifier: 2.30.0 version: 2.30.0 + emojilib: + specifier: ^3.0.10 + version: 3.0.10 escape-regexp: specifier: 0.0.1 version: 0.0.1 @@ -882,6 +885,9 @@ importers: typescript: specifier: 5.1.3 version: 5.1.3 + unicode-emoji-json: + specifier: ^0.4.0 + version: 0.4.0 uuid: specifier: 9.0.0 version: 9.0.0 @@ -6777,6 +6783,10 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + /emojilib@3.0.10: + resolution: {integrity: sha512-VQtCRroFykPTJaoEBEGFg5tI+rEluabjuaVDDbSftDtiRJ5GuqRG/LGV1mmDzkJP4bh5rzuEBOafMN68/YXQcQ==} + dev: true + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} @@ -14866,6 +14876,10 @@ packages: busboy: 1.6.0 dev: false + /unicode-emoji-json@0.4.0: + resolution: {integrity: sha512-lVNOwh2AnmbwqtSrEVjAWKQoVzWgyWmXVqPuPkPfKb0tnA0+uYN/4ILCTdy9IRj/+3drAVhmjwjNJQr2dhCwnA==} + dev: true + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} diff --git a/rome.json b/rome.json index 37d738b553..9b463ea411 100644 --- a/rome.json +++ b/rome.json @@ -14,7 +14,6 @@ "packages/backend/src/server/web/manifest.ts", "packages/backend/built/", "*/model.json", - "packages/client/src/emojilist.json", "*.md", "**/tsconfig.json", "*/.yml" From 738b111a4c0ba815f138f0244c05d087f5fe9cbd Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 19:56:42 -0700 Subject: [PATCH 107/309] fix: don't use cache on autocomplete for now --- packages/client/src/components/MkAutocomplete.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/client/src/components/MkAutocomplete.vue b/packages/client/src/components/MkAutocomplete.vue index 62556833c3..8c3cd78db0 100644 --- a/packages/client/src/components/MkAutocomplete.vue +++ b/packages/client/src/components/MkAutocomplete.vue @@ -99,7 +99,7 @@ import { acct } from "@/filters/user"; import * as os from "@/os"; import { MFM_TAGS } from "@/scripts/mfm-tags"; import { defaultStore } from "@/store"; -import { getEmojiData } from "@/scripts/emojilist"; +import { emojilist } from "@/scripts/emojilist"; import { instance } from "@/instance"; import { i18n } from "@/i18n"; @@ -111,7 +111,6 @@ type EmojiDef = { isCustomEmoji?: boolean; }; -const emojilist = await getEmojiData(); const lib = emojilist.filter((x) => x.category !== "flags"); const emjdb: EmojiDef[] = lib.map((x) => ({ From a5fe0ac8b5b19294298f5daf73859ff39a271e02 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 20:58:44 -0700 Subject: [PATCH 108/309] feat: :sparkles: emoji skin tone Closes #9959 --- locales/en-US.yml | 1 + .../client/src/components/MkEmojiPicker.vue | 11 +- .../client/src/pages/settings/reaction.vue | 24 ++++ packages/client/src/scripts/emojilist.ts | 107 +++++------------- packages/client/src/store.ts | 4 + 5 files changed, 60 insertions(+), 87 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index cd29cebda6..c619c26086 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1109,6 +1109,7 @@ isLocked: "This account has follow approvals" isModerator: "Moderator" isAdmin: "Administrator" isPatron: "Calckey Patron" +reactionPickerSkinTone: "Preferred emoji skin tone" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing diff --git a/packages/client/src/components/MkEmojiPicker.vue b/packages/client/src/components/MkEmojiPicker.vue index 9cff6b910b..2f6ba21686 100644 --- a/packages/client/src/components/MkEmojiPicker.vue +++ b/packages/client/src/components/MkEmojiPicker.vue @@ -111,7 +111,7 @@ <div v-once class="group"> <header>{{ i18n.ts.emoji }}</header> <XSection - v-for="category in categories" + v-for="category in unicodeEmojiCategories" :key="category" :emojis=" emojilist @@ -164,9 +164,9 @@ import { ref, computed, watch, onMounted } from "vue"; import * as Misskey from "calckey-js"; import XSection from "@/components/MkEmojiPicker.section.vue"; import { - getEmojiData, + emojilist, + unicodeEmojiCategories, UnicodeEmojiDef, - unicodeEmojiCategories as categories, getNicelyLabeledCategory, } from "@/scripts/emojilist"; import { getStaticImageUrl } from "@/scripts/get-static-image-url"; @@ -219,7 +219,6 @@ const height = computed(() => const customEmojiCategories = emojiCategories; const customEmojis = instance.emojis; const q = ref<string | null>(null); -const emojilist = await getEmojiData(); const searchResultCustom = ref<Misskey.entities.CustomEmoji[]>([]); const searchResultUnicode = ref<UnicodeEmojiDef[]>([]); const tab = ref<"index" | "custom" | "unicode" | "tags">("index"); @@ -321,7 +320,7 @@ watch(q, () => { // 名前にキーワードが含まれている for (const emoji of emojis) { - if (keywords.every((keyword) => emoji.name.includes(keyword))) { + if (keywords.every((keyword) => emoji.slug.includes(keyword))) { matches.add(emoji); if (matches.size >= max) break; } @@ -401,7 +400,7 @@ function reset() { function getKey( emoji: string | Misskey.entities.CustomEmoji | UnicodeEmojiDef ): string { - return typeof emoji === "string" ? emoji : emoji.char || `:${emoji.name}:`; + return typeof emoji === "string" ? emoji : emoji.emoji || `:${emoji.name}:`; } function chosen(emoji: any, ev?: MouseEvent) { diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue index d8578a6f7f..929c71e957 100644 --- a/packages/client/src/pages/settings/reaction.vue +++ b/packages/client/src/pages/settings/reaction.vue @@ -41,6 +41,27 @@ > </FromSlot> + <FormRadios v-model="reactionPickerSkinTone" class="_formBlock"> + <template #label>{{ i18n.ts.reactionPickerSkinTone }}</template> + <option :value="1"> + <MkEmoji :normal="true" emoji="✌️" /> + </option> + <option :value="6"> + <MkEmoji :normal="true" emoji="✌🏿" /> + </option> + <option :value="5"> + <MkEmoji :normal="true" emoji="✌🏾" /> + </option> + <option :value="4"> + <MkEmoji :normal="true" emoji="✌🏽" /> + </option> + <option :value="3"> + <MkEmoji :normal="true" emoji="✌🏼" /> + </option> + <option :value="2"> + <MkEmoji :normal="true" emoji="✌🏻" /> + </option> + </FormRadios> <FormRadios v-model="reactionPickerSize" class="_formBlock"> <template #label>{{ i18n.ts.size }}</template> <option :value="1">{{ i18n.ts.small }}</option> @@ -125,6 +146,9 @@ async function reloadAsk() { let reactions = $ref(deepClone(defaultStore.state.reactions)); +const reactionPickerSkinTone = $computed( + defaultStore.makeGetterSetter("reactionPickerSkinTone") +); const reactionPickerSize = $computed( defaultStore.makeGetterSetter("reactionPickerSize") ); diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index ad5f0abeb1..6f0e222a90 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -1,6 +1,7 @@ import data from "unicode-emoji-json/data-by-group.json"; -import components from "unicode-emoji-json/data-emoji-components.json"; +import emojiComponents from "unicode-emoji-json/data-emoji-components.json"; import keywordSet from "emojilib"; +import { defaultStore } from "@/store"; export const unicodeEmojiCategories = [ "emotion", @@ -26,13 +27,16 @@ export const categoryMapping = { "Flags": "flags", } as const; -const skinToneModifiers = [ - "light_skin_tone", - "medium_light_skin_tone", - "medium_skin_tone", - "medium_dark_skin_tone", - "dark_skin_tone", -]; +function addSkinTone(emoji: string) { + const skinTone = defaultStore.state.reactionPickerSkinTone; + if (skinTone === 1) return emoji; + if (skinTone === 2) return emoji + emojiComponents.light_skin_tone; + if (skinTone === 3) return emoji + emojiComponents.medium_light_skin_tone; + if (skinTone === 4) return emoji + emojiComponents.medium_skin_tone; + if (skinTone === 5) return emoji + emojiComponents.medium_dark_skin_tone; + if (skinTone === 6) return emoji + emojiComponents.dark_skin_tone; + return emoji; +} const newData = {}; @@ -42,17 +46,12 @@ Object.keys(data).forEach((originalCategory) => { newData[newCategory] = newData[newCategory] || []; Object.keys(data[originalCategory]).forEach((emojiIndex) => { const emojiObj = { ...data[originalCategory][emojiIndex] }; + if (emojiObj.skin_tone_support) { + emojiObj.emoji = addSkinTone(emojiObj.emoji); + } + emojiObj.category = newCategory; emojiObj.keywords = keywordSet[emojiObj.emoji]; newData[newCategory].push(emojiObj); - - if (emojiObj.skin_tone_support) { - skinToneModifiers.forEach((modifier) => { - const modifiedEmojiObj = { ...emojiObj }; - modifiedEmojiObj.emoji += components[modifier]; - modifiedEmojiObj.skin_tone = modifier; - newData[newCategory].push(modifiedEmojiObj); - }); - } }); } }); @@ -60,76 +59,22 @@ Object.keys(data).forEach((originalCategory) => { export type UnicodeEmojiDef = { emoji: string; category: typeof unicodeEmojiCategories[number]; - skin_tone_support: boolean; - name: string; slug: string; - emoji_version: string; - skin_tone?: string; keywords?: string[]; }; -export const emojilist = newData as UnicodeEmojiDef[]; - -const storeName = "emojiList"; - -function openDatabase() { - return new Promise<IDBDatabase>((resolve, reject) => { - const openRequest = indexedDB.open("emojiDatabase", 1); - - openRequest.onupgradeneeded = () => { - const db = openRequest.result; - if (!db.objectStoreNames.contains(storeName)) { - db.createObjectStore(storeName); - } - }; - openRequest.onsuccess = () => { - resolve(openRequest.result); - }; - openRequest.onerror = () => { - reject(openRequest.error); - }; +export const emojilist: UnicodeEmojiDef[] = Object.keys(newData).reduce((acc, category) => { + const categoryItems = newData[category].map((item) => { + return { + emoji: item.emoji, + slug: item.slug, + category: item.category, + keywords: item.keywords || [], + }; }); -} + return acc.concat(categoryItems); +}, []); -function storeData(db: IDBDatabase, data) { - return new Promise((resolve, reject) => { - const transaction = db.transaction(storeName, "readwrite"); - const store = transaction.objectStore(storeName); - store.put(data, "emojiListKey"); - - transaction.oncomplete = resolve; - transaction.onerror = reject; - }); -} - -function getData(db: IDBDatabase): Promise<UnicodeEmojiDef[]> { - return new Promise((resolve, reject) => { - const transaction = db.transaction(storeName, "readonly"); - const store = transaction.objectStore(storeName); - const getRequest = store.get("emojiListKey"); - - getRequest.onsuccess = () => resolve(getRequest.result); - getRequest.onerror = reject; - }); -} - -export async function getEmojiData(): Promise<UnicodeEmojiDef[]> { - try { - const db = await openDatabase(); - const cachedData = await getData(db); - - if (cachedData) { - return cachedData; - } else { - await storeData(db, emojilist); - console.log("Emoji data stored in IndexedDB"); - return emojilist; - } - } catch (err) { - console.error("Error accessing IndexedDB:", err); - return emojilist; - } -} export function getNicelyLabeledCategory(internalName) { return Object.keys(categoryMapping).find( diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index c8ce96b0ee..74ee6e7555 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -242,6 +242,10 @@ export const defaultStore = markRaw( where: "device", default: "remote" as "none" | "remote" | "always", }, + reactionPickerSkinTone: { + where: "account", + default: 1, + }, reactionPickerSize: { where: "device", default: 3, From 77734cf69bcaa0bfed21578c552caa6625e7b94e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 21:08:04 -0700 Subject: [PATCH 109/309] fix: :lipstick: consistent emoji styling --- packages/client/src/pages/admin/settings.vue | 3 --- .../client/src/pages/settings/reaction.vue | 18 +++++++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index feedaff6d5..3f26d63b7c 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -131,21 +131,18 @@ }}</template> <option value="⭐"> <MkEmoji - class="emoji" emoji="⭐" style="height: 1.7em" /> </option> <option value="👍"> <MkEmoji - class="emoji" emoji="👍" style="height: 1.7em" /> </option> <option value="❤️"> <MkEmoji - class="emoji" emoji="❤️" style="height: 1.7em" /> diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue index 929c71e957..8d8bca8930 100644 --- a/packages/client/src/pages/settings/reaction.vue +++ b/packages/client/src/pages/settings/reaction.vue @@ -23,7 +23,11 @@ class="_button item" @click="remove(element, $event)" > - <MkEmoji :emoji="element" :normal="true" /> + <MkEmoji + :emoji="element" + style="height: 1.7em" + class="emoji" + /> </button> </template> <template #footer> @@ -44,22 +48,22 @@ <FormRadios v-model="reactionPickerSkinTone" class="_formBlock"> <template #label>{{ i18n.ts.reactionPickerSkinTone }}</template> <option :value="1"> - <MkEmoji :normal="true" emoji="✌️" /> + <MkEmoji style="height: 1.7em" emoji="✌️" /> </option> <option :value="6"> - <MkEmoji :normal="true" emoji="✌🏿" /> + <MkEmoji style="height: 1.7em" emoji="✌🏿" /> </option> <option :value="5"> - <MkEmoji :normal="true" emoji="✌🏾" /> + <MkEmoji style="height: 1.7em" emoji="✌🏾" /> </option> <option :value="4"> - <MkEmoji :normal="true" emoji="✌🏽" /> + <MkEmoji style="height: 1.7em" emoji="✌🏽" /> </option> <option :value="3"> - <MkEmoji :normal="true" emoji="✌🏼" /> + <MkEmoji style="height: 1.7em" emoji="✌🏼" /> </option> <option :value="2"> - <MkEmoji :normal="true" emoji="✌🏻" /> + <MkEmoji style="height: 1.7em" emoji="✌🏻" /> </option> </FormRadios> <FormRadios v-model="reactionPickerSize" class="_formBlock"> From 11dbe898d92ab8fc707ff896cc756b42bf1819e0 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 22:11:06 -0700 Subject: [PATCH 110/309] docs: :memo: changelog --- CALCKEY.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CALCKEY.md b/CALCKEY.md index b44b8bbf74..9770162110 100644 --- a/CALCKEY.md +++ b/CALCKEY.md @@ -125,6 +125,11 @@ - Focus trapping and button labels - Meilisearch with filters - Post editing +- Display remaining time on rate-limits +- Proper 2FA input dialog +- Let moderators see moderation nodes +- Non-mangled unicode emojis + - Skin tone selection support ## Implemented (remote) From a7dd8bffe57cfc2a7d354e058607db6d5f933834 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 22 Jun 2023 22:39:52 -0700 Subject: [PATCH 111/309] fix: :adhesive_bandage: disable Unicode 15 emojis https://github.com/jdecked/twemoji/pull/43 --- packages/client/src/pages/admin/settings.vue | 15 +++--------- packages/client/src/scripts/emojilist.ts | 24 +++++++++++++++----- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index 3f26d63b7c..e67c44b0a4 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -130,22 +130,13 @@ i18n.ts.defaultReaction }}</template> <option value="⭐"> - <MkEmoji - emoji="⭐" - style="height: 1.7em" - /> + <MkEmoji emoji="⭐" style="height: 1.7em" /> </option> <option value="👍"> - <MkEmoji - emoji="👍" - style="height: 1.7em" - /> + <MkEmoji emoji="👍" style="height: 1.7em" /> </option> <option value="❤️"> - <MkEmoji - emoji="❤️" - style="height: 1.7em" - /> + <MkEmoji emoji="❤️" style="height: 1.7em" /> </option> <option value="custom"> <FormInput diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 6f0e222a90..03e9452394 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -38,6 +38,15 @@ function addSkinTone(emoji: string) { return emoji; } +const unicodeFifteenEmojis = [ + '🫨', '🩷', '🩵', '🩶', + '🫷', '🫸', '🫎', '🫏', + '🪽', '🐦⬛', '🪿', '🪼', + '🪻', '🫚', '🫛', '🪭', + '🪮', '🪇', '🪈', '🪯', + '🛜' +] + const newData = {}; Object.keys(data).forEach((originalCategory) => { @@ -46,6 +55,9 @@ Object.keys(data).forEach((originalCategory) => { newData[newCategory] = newData[newCategory] || []; Object.keys(data[originalCategory]).forEach((emojiIndex) => { const emojiObj = { ...data[originalCategory][emojiIndex] }; + if (unicodeFifteenEmojis.includes(emojiObj.emoji)) { + return; + } if (emojiObj.skin_tone_support) { emojiObj.emoji = addSkinTone(emojiObj.emoji); } @@ -65,12 +77,12 @@ export type UnicodeEmojiDef = { export const emojilist: UnicodeEmojiDef[] = Object.keys(newData).reduce((acc, category) => { const categoryItems = newData[category].map((item) => { - return { - emoji: item.emoji, - slug: item.slug, - category: item.category, - keywords: item.keywords || [], - }; + return { + emoji: item.emoji, + slug: item.slug, + category: item.category, + keywords: item.keywords || [], + }; }); return acc.concat(categoryItems); }, []); From 7c5e7d7d85c1143623261554626de9a9738d6147 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 00:21:48 -0700 Subject: [PATCH 112/309] fix: :bug: pull up instance window instead of search field --- packages/client/src/pages/admin/queue.chart.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/client/src/pages/admin/queue.chart.vue b/packages/client/src/pages/admin/queue.chart.vue index bf507c2f02..2ab187a51d 100644 --- a/packages/client/src/pages/admin/queue.chart.vue +++ b/packages/client/src/pages/admin/queue.chart.vue @@ -41,7 +41,7 @@ <div class="jobs"> <div v-if="jobs.length > 0"> <div v-for="job in jobs" :key="job[0]"> - <a @click.stop="lookupInstance(job[0])" class="_link"> + <a @click.stop="os.pageWindow(`/instance-info/${job[0]}`)" class="_link"> {{ job[0] }} </a> <span style="margin-left: 8px; opacity: 0.7" @@ -59,7 +59,6 @@ import { markRaw, onMounted, onUnmounted, ref } from "vue"; import XChart from "./queue.chart.chart.vue"; import number from "@/filters/number"; import * as os from "@/os"; -import { lookupInstance } from "@/scripts/lookup-instance"; import { stream } from "@/stream"; import { i18n } from "@/i18n"; From d7ffffa8ab31d1c371a9e266e4501ae590f72c29 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 00:22:55 -0700 Subject: [PATCH 113/309] chore: :art: format --- packages/client/src/pages/admin/queue.chart.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/client/src/pages/admin/queue.chart.vue b/packages/client/src/pages/admin/queue.chart.vue index 2ab187a51d..ee4f3724cb 100644 --- a/packages/client/src/pages/admin/queue.chart.vue +++ b/packages/client/src/pages/admin/queue.chart.vue @@ -41,7 +41,10 @@ <div class="jobs"> <div v-if="jobs.length > 0"> <div v-for="job in jobs" :key="job[0]"> - <a @click.stop="os.pageWindow(`/instance-info/${job[0]}`)" class="_link"> + <a + @click.stop="os.pageWindow(`/instance-info/${job[0]}`)" + class="_link" + > {{ job[0] }} </a> <span style="margin-left: 8px; opacity: 0.7" From f101317f3cc0aa291f6b9035844699fbbd3f5fcb Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 00:27:26 -0700 Subject: [PATCH 114/309] refactor: :pushpin: use own emoji descriptions --- packages/client/package.json | 2 +- pnpm-lock.yaml | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/client/package.json b/packages/client/package.json index b8ba93b903..4cb60bbc4f 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -44,7 +44,7 @@ "cross-env": "7.0.3", "cypress": "10.11.0", "date-fns": "2.30.0", - "emojilib": "^3.0.10", + "emojilib": "github:thatonecalculator/emojilib", "escape-regexp": "0.0.1", "eventemitter3": "4.0.7", "focus-trap": "^7.4.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19609845bf..bf3a32979c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -778,8 +778,8 @@ importers: specifier: 2.30.0 version: 2.30.0 emojilib: - specifier: ^3.0.10 - version: 3.0.10 + specifier: github:thatonecalculator/emojilib + version: github.com/thatonecalculator/emojilib/34528ca3b7acd27da0d3fb38296ea244a7e86dd0 escape-regexp: specifier: 0.0.1 version: 0.0.1 @@ -6783,10 +6783,6 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - /emojilib@3.0.10: - resolution: {integrity: sha512-VQtCRroFykPTJaoEBEGFg5tI+rEluabjuaVDDbSftDtiRJ5GuqRG/LGV1mmDzkJP4bh5rzuEBOafMN68/YXQcQ==} - dev: true - /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} @@ -15920,3 +15916,9 @@ packages: rangetouch: 2.0.1 url-polyfill: 1.1.12 dev: true + + github.com/thatonecalculator/emojilib/34528ca3b7acd27da0d3fb38296ea244a7e86dd0: + resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/34528ca3b7acd27da0d3fb38296ea244a7e86dd0} + name: emojilib + version: 3.0.10 + dev: true From 56cd2ea888546444cfa9a96e7e82b2adb1686958 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Fri, 23 Jun 2023 17:30:50 -0400 Subject: [PATCH 115/309] fix: autocomplete not being focused properly --- packages/client/src/components/MkModal.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue index 9f25f9cc40..890ab9076c 100644 --- a/packages/client/src/components/MkModal.vue +++ b/packages/client/src/components/MkModal.vue @@ -19,8 +19,7 @@ > <FocusTrap v-model:active="isActive" - :initial-focus="() => $refs.content" - :return-focus-on-deactivate="!noReturnFocus" + :return-focus-on-deactivate="false" @deactivate="close" > <div @@ -67,6 +66,8 @@ ]" :style="{ zIndex }" @click.self="onBgClick" + v-focus + tabindex="-1" > <slot :max-height="maxHeight" :type="type"></slot> </div> @@ -179,6 +180,7 @@ let transitionDuration = $computed(() => let contentClicking = false; +const focusedElement = document.activeElement; function close(ev, opts: { useSendAnimation?: boolean } = {}) { // removeEventListener("popstate", close); // if (props.preferType == "dialog") { @@ -192,6 +194,9 @@ function close(ev, opts: { useSendAnimation?: boolean } = {}) { if (props.src) props.src.style.pointerEvents = "auto"; showing = false; emit("close"); + if (!props.noReturnFocus) { + focusedElement.focus(); + } } function onBgClick() { From cf923e57addcff099727040712b9342731c546b4 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Fri, 23 Jun 2023 17:41:39 -0400 Subject: [PATCH 116/309] fix: mobile note spacing --- packages/client/src/components/MkNote.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index d5f361b047..9de87704da 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -928,7 +928,7 @@ defineExpose({ } } > .article { - padding: 4px 16px 8px; + padding: 18px 16px 8px; &:first-child, &:nth-child(2) { padding-top: 104px; From 66ef6a8da81e32dff549917885e8aed9a6eddfb6 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 15:36:28 -0700 Subject: [PATCH 117/309] refactor: :recycle: refactor MkModalWindow for TS safety --- .../client/src/components/MkModalWindow.vue | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/client/src/components/MkModalWindow.vue b/packages/client/src/components/MkModalWindow.vue index a3dccb7644..31943d1f3e 100644 --- a/packages/client/src/components/MkModalWindow.vue +++ b/packages/client/src/components/MkModalWindow.vue @@ -10,20 +10,20 @@ ref="rootEl" class="ebkgoccj" :style="{ - width: `${width}px`, + width: `${props.width}px`, height: scroll ? height - ? `${height}px` + ? `${props.height}px` : null : height - ? `min(${height}px, 100%)` + ? `min(${props.height}px, 100%)` : '100%', }" tabindex="-1" > <div ref="headerEl" class="header"> <button - v-if="withOkButton" + v-if="props.withOkButton" :aria-label="i18n.t('close')" class="_button" @click="$emit('close')" @@ -35,7 +35,7 @@ <slot name="header"></slot> </span> <button - v-if="!withOkButton" + v-if="!props.withOkButton" :aria-label="i18n.t('close')" class="_button" @click="$emit('close')" @@ -43,10 +43,10 @@ <i class="ph-x ph-bold ph-lg"></i> </button> <button - v-if="withOkButton" + v-if="props.withOkButton" :aria-label="i18n.t('ok')" class="_button" - :disabled="okButtonDisabled" + :disabled="props.okButtonDisabled" @click="$emit('ok')" > <i class="ph-check ph-bold ph-lg"></i> @@ -92,8 +92,10 @@ let modal = $shallowRef<InstanceType<typeof MkModal>>(); let rootEl = $shallowRef<HTMLElement>(); let headerEl = $shallowRef<HTMLElement>(); -const close = () => { - modal.close(); +const close = (ev) => { + if (modal != null) { + modal.close(ev); + } }; const onBgClick = () => { From 087591e62dce08f1bccb4e450757c9ba8c7a98d3 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 15:36:43 -0700 Subject: [PATCH 118/309] chore: :bookmark: dev52 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fbdd888edc..e4b70094d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "14.0.0-dev51", + "version": "14.0.0-dev52", "codename": "aqua", "repository": { "type": "git", From 9e1fbed9b97282f5124e28a19be9a8bfd403e40a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 15:40:38 -0700 Subject: [PATCH 119/309] refactor: :recycle: simplify null check --- packages/client/src/components/MkModalWindow.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/client/src/components/MkModalWindow.vue b/packages/client/src/components/MkModalWindow.vue index 31943d1f3e..d947803dd6 100644 --- a/packages/client/src/components/MkModalWindow.vue +++ b/packages/client/src/components/MkModalWindow.vue @@ -93,9 +93,7 @@ let rootEl = $shallowRef<HTMLElement>(); let headerEl = $shallowRef<HTMLElement>(); const close = (ev) => { - if (modal != null) { - modal.close(ev); - } + modal?.close(ev); }; const onBgClick = () => { From 3a17ef6d4263a4b7067caf76be7013d3a4e33549 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 16:51:13 -0700 Subject: [PATCH 120/309] feat: :sparkles: skin tone selector in category --- .../client/src/components/MkAutocomplete.vue | 8 ++- .../src/components/MkEmojiPicker.section.vue | 51 +++++++++++++++++-- .../client/src/components/MkEmojiPicker.vue | 1 + packages/client/src/scripts/emojilist.ts | 39 +++++++------- 4 files changed, 75 insertions(+), 24 deletions(-) diff --git a/packages/client/src/components/MkAutocomplete.vue b/packages/client/src/components/MkAutocomplete.vue index 8c3cd78db0..37207a14f7 100644 --- a/packages/client/src/components/MkAutocomplete.vue +++ b/packages/client/src/components/MkAutocomplete.vue @@ -99,7 +99,7 @@ import { acct } from "@/filters/user"; import * as os from "@/os"; import { MFM_TAGS } from "@/scripts/mfm-tags"; import { defaultStore } from "@/store"; -import { emojilist } from "@/scripts/emojilist"; +import { emojilist, addSkinTone } from "@/scripts/emojilist"; import { instance } from "@/instance"; import { i18n } from "@/i18n"; @@ -113,6 +113,12 @@ type EmojiDef = { const lib = emojilist.filter((x) => x.category !== "flags"); +for (const emoji of lib) { + if (emoji.skin_tone_support) { + emoji.emoji = addSkinTone(emoji.emoji); + } +} + const emjdb: EmojiDef[] = lib.map((x) => ({ emoji: x.emoji, name: x.slug, diff --git a/packages/client/src/components/MkEmojiPicker.section.vue b/packages/client/src/components/MkEmojiPicker.section.vue index 12e869e04c..cf5307dfde 100644 --- a/packages/client/src/components/MkEmojiPicker.section.vue +++ b/packages/client/src/components/MkEmojiPicker.section.vue @@ -1,20 +1,31 @@ <template> - <!-- このコンポーネントの要素のclassは親から利用されるのでむやみに弄らないこと --> <section> <header class="_acrylic" @click="shown = !shown"> <i class="toggle ph-fw ph-lg" :class=" shown - ? 'ph-caret-down-bold ph-lg' + ? 'ph-caret-down ph-bold ph-lg' : 'ph-caret-up ph-bold ph-lg' " ></i> <slot></slot> ({{ emojis.length }}) + <span v-if="props.skinToneSelector"> + <button + v-for="skinTone in skinTones" + class="_button" + @click="applySkinTone(skinTones.indexOf(skinTone))" + > + <i + class="ph-circle ph-fill ph-fw ph-lg" + :style="{ color: skinTone + '!important' }" + ></i> + </button> + </span> </header> <div v-if="shown" class="body"> <button - v-for="emoji in emojis" + v-for="emoji in localEmojis" :key="emoji" class="_button item" @click="emit('chosen', emoji, $event)" @@ -26,18 +37,50 @@ </template> <script lang="ts" setup> -import { ref } from "vue"; +import { ref, watch, onMounted } from "vue"; +import { addSkinTone } from "@/scripts/emojilist"; const props = defineProps<{ emojis: string[]; initialShown?: boolean; + skinToneSelector?: boolean; }>(); +const skinTones = [ + "#FFDC5E", + "#F7DFCF", + "#F3D3A3", + "#D6AE89", + "#B17F56", + "#7D523C", +]; + +const localEmojis = ref([...props.emojis]); + +function applySkinTone(custom?: number) { + for (let i = 0; i < localEmojis.value.length; i++) { + localEmojis.value[i] = addSkinTone(localEmojis.value[i], custom); + } +} + const emit = defineEmits<{ (ev: "chosen", v: string, event: MouseEvent): void; }>(); const shown = ref(!!props.initialShown); + +onMounted(() => { + if (props.skinToneSelector) { + applySkinTone(); + } +}); + +watch( + () => props.emojis, + (newVal) => { + localEmojis.value = [...newVal]; + } +); </script> <style lang="scss" scoped></style> diff --git a/packages/client/src/components/MkEmojiPicker.vue b/packages/client/src/components/MkEmojiPicker.vue index 2f6ba21686..9e84f28722 100644 --- a/packages/client/src/components/MkEmojiPicker.vue +++ b/packages/client/src/components/MkEmojiPicker.vue @@ -113,6 +113,7 @@ <XSection v-for="category in unicodeEmojiCategories" :key="category" + :skin-tone-selector="category === 'people'" :emojis=" emojilist .filter((e) => e.category === category) diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 03e9452394..90e5f56edb 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -3,6 +3,14 @@ import emojiComponents from "unicode-emoji-json/data-emoji-components.json"; import keywordSet from "emojilib"; import { defaultStore } from "@/store"; +export type UnicodeEmojiDef = { + emoji: string; + category: typeof unicodeEmojiCategories[number]; + skin_tone_support: boolean; + slug: string; + keywords?: string[]; +}; + export const unicodeEmojiCategories = [ "emotion", "people", @@ -27,15 +35,17 @@ export const categoryMapping = { "Flags": "flags", } as const; -function addSkinTone(emoji: string) { - const skinTone = defaultStore.state.reactionPickerSkinTone; - if (skinTone === 1) return emoji; - if (skinTone === 2) return emoji + emojiComponents.light_skin_tone; - if (skinTone === 3) return emoji + emojiComponents.medium_light_skin_tone; - if (skinTone === 4) return emoji + emojiComponents.medium_skin_tone; - if (skinTone === 5) return emoji + emojiComponents.medium_dark_skin_tone; - if (skinTone === 6) return emoji + emojiComponents.dark_skin_tone; - return emoji; +export function addSkinTone(emoji: string, skinTone?: number) { + const chosenSkinTone = skinTone || defaultStore.state.reactionPickerSkinTone; + const skinToneModifiers = [ + "", + emojiComponents.light_skin_tone, + emojiComponents.medium_light_skin_tone, + emojiComponents.medium_skin_tone, + emojiComponents.medium_dark_skin_tone, + emojiComponents.dark_skin_tone + ]; + return emoji + (skinToneModifiers[chosenSkinTone - 1] || ""); } const unicodeFifteenEmojis = [ @@ -58,9 +68,6 @@ Object.keys(data).forEach((originalCategory) => { if (unicodeFifteenEmojis.includes(emojiObj.emoji)) { return; } - if (emojiObj.skin_tone_support) { - emojiObj.emoji = addSkinTone(emojiObj.emoji); - } emojiObj.category = newCategory; emojiObj.keywords = keywordSet[emojiObj.emoji]; newData[newCategory].push(emojiObj); @@ -68,19 +75,13 @@ Object.keys(data).forEach((originalCategory) => { } }); -export type UnicodeEmojiDef = { - emoji: string; - category: typeof unicodeEmojiCategories[number]; - slug: string; - keywords?: string[]; -}; - export const emojilist: UnicodeEmojiDef[] = Object.keys(newData).reduce((acc, category) => { const categoryItems = newData[category].map((item) => { return { emoji: item.emoji, slug: item.slug, category: item.category, + skin_tone_support: item.skin_tone_support || false, keywords: item.keywords || [], }; }); From 7640f4d3f8d6c65c5ac0357ae2d4ff49c9630fee Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:19:26 -0700 Subject: [PATCH 121/309] refactor: :recycle: make skin tones modular Could possibly be for future custom emoji sets that support custom skin tones? (i.e. Mutant Standard) --- .../src/components/MkEmojiPicker.section.vue | 16 ++++------------ packages/client/src/components/MkEmojiPicker.vue | 2 ++ packages/client/src/scripts/emojilist.ts | 9 +++++++++ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/client/src/components/MkEmojiPicker.section.vue b/packages/client/src/components/MkEmojiPicker.section.vue index cf5307dfde..95e7613731 100644 --- a/packages/client/src/components/MkEmojiPicker.section.vue +++ b/packages/client/src/components/MkEmojiPicker.section.vue @@ -10,11 +10,11 @@ " ></i> <slot></slot> ({{ emojis.length }}) - <span v-if="props.skinToneSelector"> + <span v-if="props.skinToneSelector && props.skinTones"> <button - v-for="skinTone in skinTones" + v-for="skinTone in props.skinTones" class="_button" - @click="applySkinTone(skinTones.indexOf(skinTone))" + @click="applySkinTone(props.skinTones.indexOf(skinTone) + 1)" > <i class="ph-circle ph-fill ph-fw ph-lg" @@ -44,17 +44,9 @@ const props = defineProps<{ emojis: string[]; initialShown?: boolean; skinToneSelector?: boolean; + skinTones?: string[]; }>(); -const skinTones = [ - "#FFDC5E", - "#F7DFCF", - "#F3D3A3", - "#D6AE89", - "#B17F56", - "#7D523C", -]; - const localEmojis = ref([...props.emojis]); function applySkinTone(custom?: number) { diff --git a/packages/client/src/components/MkEmojiPicker.vue b/packages/client/src/components/MkEmojiPicker.vue index 9e84f28722..260898e6e6 100644 --- a/packages/client/src/components/MkEmojiPicker.vue +++ b/packages/client/src/components/MkEmojiPicker.vue @@ -114,6 +114,7 @@ v-for="category in unicodeEmojiCategories" :key="category" :skin-tone-selector="category === 'people'" + :skin-tones="unicodeEmojiSkinTones" :emojis=" emojilist .filter((e) => e.category === category) @@ -167,6 +168,7 @@ import XSection from "@/components/MkEmojiPicker.section.vue"; import { emojilist, unicodeEmojiCategories, + unicodeEmojiSkinTones, UnicodeEmojiDef, getNicelyLabeledCategory, } from "@/scripts/emojilist"; diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 90e5f56edb..0609600f6f 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -35,6 +35,15 @@ export const categoryMapping = { "Flags": "flags", } as const; +export const unicodeEmojiSkinTones = [ + "#FFDC5E", + "#F7DFCF", + "#F3D3A3", + "#D6AE89", + "#B17F56", + "#7D523C", +]; + export function addSkinTone(emoji: string, skinTone?: number) { const chosenSkinTone = skinTone || defaultStore.state.reactionPickerSkinTone; const skinToneModifiers = [ From c0f6a53223bdf25baee8754c7e76fba295f216e9 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:27:25 -0700 Subject: [PATCH 122/309] =?UTF-8?q?fix:=20=F0=9F=90=9B=20race=20condition?= =?UTF-8?q?=20between=20workers=20when=20creating=20note?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #10345 Discovered here: https://codeberg.org/calckey/calckey/issues/10345#issuecomment-950475 --- packages/backend/src/services/note/create.ts | 54 ++++++++++++-------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 9696c3ccaa..3a545b4872 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -465,26 +465,40 @@ export default async ( if (!note.uri) { // Publish if the post is local publishNotesStream(note); - } else if ( - boostedByRelay && - data.renote?.uri && - (await redisClient.exists(`publishedNote:${data.renote.uri}`)) === 0 - ) { - // Publish if the post was boosted by a relay and not yet published. - publishNotesStream(data.renote); - const key = `publishedNote:${data.renote.uri}`; - await redisClient.set(key, 1, "EX", 30); - } else if ( - !boostedByRelay && - note.uri && - (await redisClient.exists(`publishedNote:${note.uri}`)) === 0 - ) { - // Publish if the post came directly from a remote server, or from a - // relay that doesn't boost the post (e.g, YUKIMOCHI Activity-Relay), - // and not yet published. - const key = `publishedNote:${note.uri}`; - publishNotesStream(note); - await redisClient.set(key, 1, "EX", 30); + } else if (boostedByRelay && data.renote?.uri) { + // Use Redis transaction for atomicity + await redisClient.watch(`publishedNote:${data.renote.uri}`); + const exists = await redisClient.exists( + `publishedNote:${data.renote.uri}`, + ); + if (exists === 0) { + // Start the transaction + redisClient.multi(); + publishNotesStream(data.renote); + const key = `publishedNote:${data.renote.uri}`; + await redisClient.set(key, 1, "EX", 30); + // Execute the transaction + redisClient.exec(); + } else { + // Abort the transaction + redisClient.unwatch(); + } + } else if (!boostedByRelay && note.uri) { + // Use Redis transaction for atomicity + await redisClient.watch(`publishedNote:${note.uri}`); + const exists = await redisClient.exists(`publishedNote:${note.uri}`); + if (exists === 0) { + // Start the transaction + redisClient.multi(); + publishNotesStream(note); + const key = `publishedNote:${note.uri}`; + await redisClient.set(key, 1, "EX", 30); + // Execute the transaction + redisClient.exec(); + } else { + // Abort the transaction + redisClient.unwatch(); + } } } if (note.replyId != null) { From 25aab24861d57d7341b731ef7f39716b9a943c4d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:35:52 -0700 Subject: [PATCH 123/309] build: :zap: use vite 4.4 beta with lightningcss --- packages/client/package.json | 3 +- packages/client/vite.config.ts | 17 ++- pnpm-lock.yaml | 259 +++++++++++++++++++++++---------- 3 files changed, 193 insertions(+), 86 deletions(-) diff --git a/packages/client/package.json b/packages/client/package.json index 4cb60bbc4f..2044cef088 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -54,6 +54,7 @@ "insert-text-at-cursor": "0.3.0", "json5": "2.2.3", "katex": "0.16.7", + "lightningcss": "^1.21.0", "matter-js": "0.18.0", "mfm-js": "0.23.3", "photoswipe": "5.3.7", @@ -83,7 +84,7 @@ "unicode-emoji-json": "^0.4.0", "uuid": "9.0.0", "vanilla-tilt": "1.8.0", - "vite": "4.3.9", + "vite": "4.4.0-beta.2", "vite-plugin-compression": "^0.5.1", "vue": "3.3.4", "vue-isyourpasswordsafe": "^2.0.0", diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index 6c644660e6..72746b7a03 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -23,9 +23,9 @@ const extensions = [ ]; export default defineConfig(({ command, mode }) => { - fs.mkdirSync(__dirname + "/../../built", { recursive: true }); + fs.mkdirSync(`${__dirname}/../../built`, { recursive: true }); fs.writeFileSync( - __dirname + "/../../built/meta.json", + `${__dirname}/../../built/meta.json`, JSON.stringify({ version: meta.version }), "utf-8", ); @@ -43,12 +43,16 @@ export default defineConfig(({ command, mode }) => { }), ], + css: { + transformer: "lightningcss", + }, + resolve: { extensions, alias: { - "@/": __dirname + "/src/", - "/client-assets/": __dirname + "/assets/", - "/static-assets/": __dirname + "/../backend/assets/", + "@/": `${__dirname}/src/`, + "/client-assets/": `${__dirname}/assets/`, + "/static-assets/": `${__dirname}/../backend/assets/`, }, }, @@ -80,9 +84,10 @@ export default defineConfig(({ command, mode }) => { }, }, }, + cssMinify: "lightningcss", cssCodeSplit: true, assetsInlineLimit: 0, - outDir: __dirname + "/../../built/_client_dist_", + outDir: `${__dirname}/../../built/_client_dist_`, assetsDir: ".", emptyOutDir: false, sourcemap: process.env.NODE_ENV === "development", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf3a32979c..e86ba9145c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -722,7 +722,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.0-beta.2)(vue@3.3.4) '@vue/compiler-sfc': specifier: 3.3.4 version: 3.3.4 @@ -807,6 +807,9 @@ importers: katex: specifier: 0.16.7 version: 0.16.7 + lightningcss: + specifier: ^1.21.0 + version: 1.21.0 matter-js: specifier: 0.18.0 version: 0.18.0 @@ -895,11 +898,11 @@ importers: specifier: 1.8.0 version: 1.8.0 vite: - specifier: 4.3.9 - version: 4.3.9(sass@1.62.1) + specifier: 4.4.0-beta.2 + version: 4.4.0-beta.2(lightningcss@1.21.0)(sass@1.62.1) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@4.3.9) + version: 0.5.1(vite@4.4.0-beta.2) vue: specifier: 3.3.4 version: 3.3.4 @@ -1592,8 +1595,8 @@ packages: - supports-color dev: false - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + /@esbuild/android-arm64@0.18.6: + resolution: {integrity: sha512-pL0Ci8P9q1sWbtPx8CXbc8JvPvvYdJJQ+LO09PLFsbz3aYNdFBGWJjiHU+CaObO4Ames+GOFpXRAJZS2L3ZK/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1601,8 +1604,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + /@esbuild/android-arm@0.18.6: + resolution: {integrity: sha512-J3lwhDSXBBppSzm/LC1uZ8yKSIpExc+5T8MxrYD9KNVZG81FOAu2VF2gXi/6A/LwDDQQ+b6DpQbYlo3VwxFepQ==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1610,8 +1613,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + /@esbuild/android-x64@0.18.6: + resolution: {integrity: sha512-hE2vZxOlJ05aY28lUpB0y0RokngtZtcUB+TVl9vnLEnY0z/8BicSvrkThg5/iI1rbf8TwXrbr2heEjl9fLf+EA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1619,8 +1622,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + /@esbuild/darwin-arm64@0.18.6: + resolution: {integrity: sha512-/tuyl4R+QhhoROQtuQj9E/yfJtZNdv2HKaHwYhhHGQDN1Teziem2Kh7BWQMumfiY7Lu9g5rO7scWdGE4OsQ6MQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1628,8 +1631,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + /@esbuild/darwin-x64@0.18.6: + resolution: {integrity: sha512-L7IQga2pDT+14Ti8HZwsVfbCjuKP4U213T3tuPggOzyK/p4KaUJxQFXJgfUFHKzU0zOXx8QcYRYZf0hSQtppkw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1637,8 +1640,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + /@esbuild/freebsd-arm64@0.18.6: + resolution: {integrity: sha512-bq10jFv42V20Kk77NvmO+WEZaLHBKuXcvEowixnBOMkaBgS7kQaqTc77ZJDbsUpXU3KKNLQFZctfaeINmeTsZA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1646,8 +1649,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + /@esbuild/freebsd-x64@0.18.6: + resolution: {integrity: sha512-HbDLlkDZqUMBQaiday0pJzB6/8Xx/10dI3xRebJBReOEeDSeS+7GzTtW9h8ZnfB7/wBCqvtAjGtWQLTNPbR2+g==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1655,8 +1658,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + /@esbuild/linux-arm64@0.18.6: + resolution: {integrity: sha512-NMY9yg/88MskEZH2s4i6biz/3av+M8xY5ua4HE7CCz5DBz542cr7REe317+v7oKjnYBCijHpkzo5vU85bkXQmQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1664,8 +1667,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + /@esbuild/linux-arm@0.18.6: + resolution: {integrity: sha512-C+5kb6rgsGMmvIdUI7v1PPgC98A6BMv233e97aXZ5AE03iMdlILFD/20HlHrOi0x2CzbspXn9HOnlE4/Ijn5Kw==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1673,8 +1676,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + /@esbuild/linux-ia32@0.18.6: + resolution: {integrity: sha512-AXazA0ljvQEp7cA9jscABNXsjodKbEcqPcAE3rDzKN82Vb3lYOq6INd+HOCA7hk8IegEyHW4T72Z7QGIhyCQEA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1682,8 +1685,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.6: + resolution: {integrity: sha512-JjBf7TwY7ldcPgHYt9UcrjZB03+WZqg/jSwMAfzOzM5ZG+tu5umUqzy5ugH/crGI4eoDIhSOTDp1NL3Uo/05Fw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1691,8 +1694,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + /@esbuild/linux-mips64el@0.18.6: + resolution: {integrity: sha512-kATNsslryVxcH1sO3KP2nnyUWtZZVkgyhAUnyTVVa0OQQ9pmDRjTpHaE+2EQHoCM5wt/uav2edrAUqbwn3tkKQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1700,8 +1703,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + /@esbuild/linux-ppc64@0.18.6: + resolution: {integrity: sha512-B+wTKz+8pi7mcWXFQV0LA79dJ+qhiut5uK9q0omoKnq8yRIwQJwfg3/vclXoqqcX89Ri5Y5538V0Se2v5qlcLA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1709,8 +1712,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + /@esbuild/linux-riscv64@0.18.6: + resolution: {integrity: sha512-h44RBLVXFUSjvhOfseE+5UxQ/r9LVeqK2S8JziJKOm9W7SePYRPDyn7MhzhNCCFPkcjIy+soCxfhlJXHXXCR0A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1718,8 +1721,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + /@esbuild/linux-s390x@0.18.6: + resolution: {integrity: sha512-FlYpyr2Xc2AUePoAbc84NRV+mj7xpsISeQ36HGf9etrY5rTBEA+IU9HzWVmw5mDFtC62EQxzkLRj8h5Hq85yOQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1727,8 +1730,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + /@esbuild/linux-x64@0.18.6: + resolution: {integrity: sha512-Mc4EUSYwzLci77u0Kao6ajB2WbTe5fNc7+lHwS3a+vJISC/oprwURezUYu1SdWAYoczbsyOvKAJwuNftoAdjjg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1736,8 +1739,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + /@esbuild/netbsd-x64@0.18.6: + resolution: {integrity: sha512-3hgZlp7NqIM5lNG3fpdhBI5rUnPmdahraSmwAi+YX/bp7iZ7mpTv2NkypGs/XngdMtpzljICxnUG3uPfqLFd3w==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1745,8 +1748,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + /@esbuild/openbsd-x64@0.18.6: + resolution: {integrity: sha512-aEWTdZQHtSRROlDYn7ygB8yAqtnall/UnmoVIJVqccKitkAWVVSYocQUWrBOxLEFk8XdlRouVrLZe6WXszyviA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1754,8 +1757,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + /@esbuild/sunos-x64@0.18.6: + resolution: {integrity: sha512-uxk/5yAGpjKZUHOECtI9W+9IcLjKj+2m0qf+RG7f7eRBHr8wP6wsr3XbNbgtOD1qSpPapd6R2ZfSeXTkCcAo5g==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1763,8 +1766,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + /@esbuild/win32-arm64@0.18.6: + resolution: {integrity: sha512-oXlXGS9zvNCGoAT/tLHAsFKrIKye1JaIIP0anCdpaI+Dc10ftaNZcqfLzEwyhdzFAYInXYH4V7kEdH4hPyo9GA==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1772,8 +1775,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.6: + resolution: {integrity: sha512-qh7IcAHUvvmMBmoIG+V+BbE9ZWSR0ohF51e5g8JZvU08kZF58uDFL5tHs0eoYz31H6Finv17te3W3QB042GqVA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1781,8 +1784,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + /@esbuild/win32-x64@0.18.6: + resolution: {integrity: sha512-9UDwkz7Wlm4N9jnv+4NL7F8vxLhSZfEkRArz2gD33HesAFfMLGIGNVXRoIHtWNw8feKsnGly9Hq1EUuRkWl0zA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -3855,14 +3858,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.0-beta.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(sass@1.62.1) + vite: 4.4.0-beta.2(lightningcss@1.21.0)(sass@1.62.1) vue: 3.3.4 dev: true @@ -6581,6 +6584,12 @@ packages: engines: {node: '>=0.10.0'} dev: true + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} @@ -6905,34 +6914,34 @@ packages: es6-symbol: 3.1.3 dev: true - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + /esbuild@0.18.6: + resolution: {integrity: sha512-5QgxWaAhU/tPBpvkxUmnFv2YINHuZzjbk0LeUUnC2i3aJHjfi5yR49lgKgF7cb98bclOp/kans8M5TGbGFfJlQ==} 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.6 + '@esbuild/android-arm64': 0.18.6 + '@esbuild/android-x64': 0.18.6 + '@esbuild/darwin-arm64': 0.18.6 + '@esbuild/darwin-x64': 0.18.6 + '@esbuild/freebsd-arm64': 0.18.6 + '@esbuild/freebsd-x64': 0.18.6 + '@esbuild/linux-arm': 0.18.6 + '@esbuild/linux-arm64': 0.18.6 + '@esbuild/linux-ia32': 0.18.6 + '@esbuild/linux-loong64': 0.18.6 + '@esbuild/linux-mips64el': 0.18.6 + '@esbuild/linux-ppc64': 0.18.6 + '@esbuild/linux-riscv64': 0.18.6 + '@esbuild/linux-s390x': 0.18.6 + '@esbuild/linux-x64': 0.18.6 + '@esbuild/netbsd-x64': 0.18.6 + '@esbuild/openbsd-x64': 0.18.6 + '@esbuild/sunos-x64': 0.18.6 + '@esbuild/win32-arm64': 0.18.6 + '@esbuild/win32-ia32': 0.18.6 + '@esbuild/win32-x64': 0.18.6 dev: true /escalade@3.1.1: @@ -10435,6 +10444,94 @@ packages: - supports-color dev: true + /lightningcss-darwin-arm64@1.21.0: + resolution: {integrity: sha512-WcJmVmbNUnCbUqqXV46ZsriFtWJujcPkn+w2cu4R+EgpXuibyTP/gzahmX0gc4RYQxTz2zXIeGx4cF2gr8fLwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-darwin-x64@1.21.0: + resolution: {integrity: sha512-xHwMHfcTIHX6fY4YQimI1V/KcbozoNVeKMncZzrp/3NAj0sp3ktxobCj1e0sGqVJMUMaHu/SWvt0mS8jAIhkYw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm-gnueabihf@1.21.0: + resolution: {integrity: sha512-rk1cr+C2IA1QHvh0QJAPXsQ2vrwCksms7fgfaw43RIERBWa6EEM5p0/1CWhdZ5zrl9veUdY6NRaNGRJjJL0iLw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-gnu@1.21.0: + resolution: {integrity: sha512-JkOG8K2Y4m5MeP3DlaHOgGDDtHbhbJcN8JcizFN0snUIIru1qxYNWPhAQsEwysuTRY9aANP0nScZJkALpcYmgA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-musl@1.21.0: + resolution: {integrity: sha512-4Zx51DbR41neTFMs28CI9cZpX/mF5Urc6pChTio5nZhrz6FC1pRGiwxNJ+G15a/YPvRmPmvQd3Mz1N4WEgbj2A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-gnu@1.21.0: + resolution: {integrity: sha512-PN33pPK/O3b4qMfWcJ2eis7NLqEkyW2NEh9X4rWfJrBtOnSbgafuYUuEtO5Ylu+dL3oUKc5usB07FGeil3RzeA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-musl@1.21.0: + resolution: {integrity: sha512-S51OT7TRfS5x8aN/8frv/JSXCGm+11VuhM4WCiTqDPjhHUDWd8nwiN/7s5juiwrlrpOxb5UKq21EKDrISoGQpw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-win32-x64-msvc@1.21.0: + resolution: {integrity: sha512-yW6/ZDJAHrSWtRltH1tr2I+2sn374gK2yclc44HMfpxfjIYgXMUkzqstalloMUQpZFR6M0ltXo5/tuLWoBydGQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lightningcss@1.21.0: + resolution: {integrity: sha512-HDznZexdDMvC98c79vRE+oW5vFncTlLjJopzK4azReOilq6n4XIscCMhvgiXkstYMM/dCe6FJw0oed06ck8AtA==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.21.0 + lightningcss-darwin-x64: 1.21.0 + lightningcss-linux-arm-gnueabihf: 1.21.0 + lightningcss-linux-arm64-gnu: 1.21.0 + lightningcss-linux-arm64-musl: 1.21.0 + lightningcss-linux-x64-gnu: 1.21.0 + lightningcss-linux-x64-musl: 1.21.0 + lightningcss-win32-x64-msvc: 1.21.0 + dev: true + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -15154,7 +15251,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.0-beta.2): resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} peerDependencies: vite: '>=2.0.0' @@ -15162,18 +15259,19 @@ packages: chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) fs-extra: 10.1.0 - vite: 4.3.9(sass@1.62.1) + vite: 4.4.0-beta.2(lightningcss@1.21.0)(sass@1.62.1) transitivePeerDependencies: - supports-color dev: true - /vite@4.3.9(sass@1.62.1): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + /vite@4.4.0-beta.2(lightningcss@1.21.0)(sass@1.62.1): + resolution: {integrity: sha512-wDISz2ET2q0QhmnKgkw9LGmjV3roie30ryb83b9r/UJ2JnXEXkaiCoWam5KzZning+7y5/W5XQ/VjHG5C50wtA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: '@types/node': '>= 14' less: '*' + lightningcss: ^1.21.0 sass: '*' stylus: '*' sugarss: '*' @@ -15183,6 +15281,8 @@ packages: optional: true less: optional: true + lightningcss: + optional: true sass: optional: true stylus: @@ -15192,7 +15292,8 @@ packages: terser: optional: true dependencies: - esbuild: 0.17.19 + esbuild: 0.18.6 + lightningcss: 1.21.0 postcss: 8.4.24 rollup: 3.23.1 sass: 1.62.1 From b6dd48a3759ffa98e84da884cad2f7f5e8e82437 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:40:01 -0700 Subject: [PATCH 124/309] refactor: :recycle: url preview --- packages/client/src/components/MkUrlPreview.vue | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 3706f78858..599ba16bef 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -44,12 +44,12 @@ height: `${tweetHeight}px`, }" :src="`https://platform.twitter.com/embed/index.html?embedId=${embedId}&hideCard=false&hideThread=false&lang=en&theme=${ - $store.state.darkMode ? 'dark' : 'light' + defaultStore.state.darkMode ? 'dark' : 'light' }&id=${tweetId}`" ></iframe> </div> <div v-else v-size="{ max: [400, 350] }" class="mk-url-preview" @click.stop> - <transition :name="$store.state.animation ? 'zoom' : ''" mode="out-in"> + <transition :name="defaultStore.state.animation ? 'zoom' : ''" mode="out-in"> <component :is="self ? 'MkA' : 'a'" v-if="!fetching" @@ -76,7 +76,7 @@ </div> <article> <header> - <h1 :title="title">{{ title }}</h1> + <h1 :title="title || undefined">{{ title }}</h1> </header> <p v-if="description" :title="description"> {{ @@ -87,7 +87,7 @@ </p> <footer> <img v-if="icon" class="icon" :src="icon" /> - <p :title="sitename">{{ sitename }}</p> + <p :title="sitename || undefined">{{ sitename }}</p> </footer> </article> </component> @@ -106,6 +106,7 @@ import { onMounted, onUnmounted } from "vue"; import { url as local, lang } from "@/config"; import { i18n } from "@/i18n"; import MkButton from "@/components/MkButton.vue"; +import { defaultStore } from "@/store"; const props = withDefaults( defineProps<{ From 2f38f228d61453bf4e46a0fcfbc2d54507b03d16 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:47:07 -0700 Subject: [PATCH 125/309] fix: :bug: non-duplicate skin tone selection --- .../src/components/MkEmojiPicker.section.vue | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/MkEmojiPicker.section.vue b/packages/client/src/components/MkEmojiPicker.section.vue index 95e7613731..ffe891a0b9 100644 --- a/packages/client/src/components/MkEmojiPicker.section.vue +++ b/packages/client/src/components/MkEmojiPicker.section.vue @@ -14,7 +14,11 @@ <button v-for="skinTone in props.skinTones" class="_button" - @click="applySkinTone(props.skinTones.indexOf(skinTone) + 1)" + @click.prevent=" + applyUnicodeSkinTone( + props.skinTones.indexOf(skinTone) + 1 + ) + " > <i class="ph-circle ph-fill ph-fw ph-lg" @@ -39,6 +43,7 @@ <script lang="ts" setup> import { ref, watch, onMounted } from "vue"; import { addSkinTone } from "@/scripts/emojilist"; +import emojiComponents from "unicode-emoji-json/data-emoji-components.json"; const props = defineProps<{ emojis: string[]; @@ -49,8 +54,19 @@ const props = defineProps<{ const localEmojis = ref([...props.emojis]); -function applySkinTone(custom?: number) { +function applyUnicodeSkinTone(custom?: number) { for (let i = 0; i < localEmojis.value.length; i++) { + if ( + [ + emojiComponents.light_skin_tone, + emojiComponents.medium_light_skin_tone, + emojiComponents.medium_skin_tone, + emojiComponents.medium_dark_skin_tone, + emojiComponents.dark_skin_tone, + ].some((v) => localEmojis.value[i].endsWith(v)) + ) { + localEmojis.value[i] = localEmojis.value[i].slice(0, -1); + } localEmojis.value[i] = addSkinTone(localEmojis.value[i], custom); } } @@ -63,7 +79,7 @@ const shown = ref(!!props.initialShown); onMounted(() => { if (props.skinToneSelector) { - applySkinTone(); + applyUnicodeSkinTone(); } }); From 9d161d9021cacb0cb97773b2c488d1b8211a68e9 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:47:14 -0700 Subject: [PATCH 126/309] chore: :art: format --- packages/client/src/components/MkModal.vue | 2 +- packages/client/src/components/MkUrlPreview.vue | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue index 890ab9076c..2fba0ef4a1 100644 --- a/packages/client/src/components/MkModal.vue +++ b/packages/client/src/components/MkModal.vue @@ -180,7 +180,7 @@ let transitionDuration = $computed(() => let contentClicking = false; -const focusedElement = document.activeElement; +const focusedElement = document.activeElement; function close(ev, opts: { useSendAnimation?: boolean } = {}) { // removeEventListener("popstate", close); // if (props.preferType == "dialog") { diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 599ba16bef..65befbb99c 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -49,7 +49,10 @@ ></iframe> </div> <div v-else v-size="{ max: [400, 350] }" class="mk-url-preview" @click.stop> - <transition :name="defaultStore.state.animation ? 'zoom' : ''" mode="out-in"> + <transition + :name="defaultStore.state.animation ? 'zoom' : ''" + mode="out-in" + > <component :is="self ? 'MkA' : 'a'" v-if="!fetching" From 3ea701afdc2039e1a9b3afadb11b2ad794834572 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:54:58 -0700 Subject: [PATCH 127/309] build: build greeting --- package.json | 3 ++- pnpm-lock.yaml | 3 +++ scripts/build-greet.js | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 scripts/build-greet.js diff --git a/package.json b/package.json index e4b70094d0..d07cf5eb51 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "private": true, "scripts": { "rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp", - "build": "pnpm -r run build && pnpm run gulp", + "build": "pnpm node ./scripts/build-greet.js && pnpm -r run build && pnpm run gulp", "start": "pnpm --filter backend run start", "start:test": "pnpm --filter backend run start:test", "init": "pnpm run migrate", @@ -46,6 +46,7 @@ "devDependencies": { "@types/gulp": "4.0.10", "@types/gulp-rename": "2.0.1", + "chalk": "5.2.0", "cross-env": "7.0.3", "cypress": "10.11.0", "execa": "5.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e86ba9145c..93fa1740b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,6 +36,9 @@ importers: '@types/gulp-rename': specifier: 2.0.1 version: 2.0.1 + chalk: + specifier: 5.2.0 + version: 5.2.0 cross-env: specifier: 7.0.3 version: 7.0.3 diff --git a/scripts/build-greet.js b/scripts/build-greet.js new file mode 100644 index 0000000000..c66c8a5af3 --- /dev/null +++ b/scripts/build-greet.js @@ -0,0 +1,23 @@ +import chalk from "chalk"; + +const themeColor = chalk.hex("#31748f"); +console.log(themeColor(" ___ _ _ ")); +console.log(themeColor(" / __\\__ _| | ___| | _____ _ _ ")); +console.log(themeColor(" / / / _` | |/ __| |/ / _ | | |")); +console.log(themeColor("/ /__| (_| | | (__| < __/ |_| |")); +console.log(themeColor("\\____/\\__,_|_|\\___|_|\\_\\___|\\__, |")); +console.log(themeColor(" (___/ ")); + +console.log( + " Currently building Calckey!", +); +console.log( + chalk.rgb( + 255, + 136, + 0, + )( + " Hang on for a moment, as this may take a while", + ), +); +console.log(""); From d0fd6a7de864e5b6859970bca8889bef840da2d7 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:55:42 -0700 Subject: [PATCH 128/309] fix: :ambulance: disable lightningcss transformer for now --- packages/client/vite.config.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index 72746b7a03..87e5f079f4 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -43,10 +43,6 @@ export default defineConfig(({ command, mode }) => { }), ], - css: { - transformer: "lightningcss", - }, - resolve: { extensions, alias: { @@ -63,7 +59,7 @@ export default defineConfig(({ command, mode }) => { ), _ENV_: JSON.stringify(process.env.NODE_ENV), _DEV_: process.env.NODE_ENV !== "production", - _PERF_PREFIX_: JSON.stringify("Misskey:"), + _PERF_PREFIX_: JSON.stringify("Calckey:"), _DATA_TRANSFER_DRIVE_FILE_: JSON.stringify("mk_drive_file"), _DATA_TRANSFER_DRIVE_FOLDER_: JSON.stringify("mk_drive_folder"), _DATA_TRANSFER_DECK_COLUMN_: JSON.stringify("mk_deck_column"), From 9e14daecbf311d8d1f97644a71dbb2db154810a2 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:57:05 -0700 Subject: [PATCH 129/309] fix: typo --- scripts/build-greet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-greet.js b/scripts/build-greet.js index c66c8a5af3..514a653971 100644 --- a/scripts/build-greet.js +++ b/scripts/build-greet.js @@ -1,4 +1,4 @@ -import chalk from "chalk"; +const chalk = require("chalk"); const themeColor = chalk.hex("#31748f"); console.log(themeColor(" ___ _ _ ")); From 089abadc31488d9e7381783dd961a8f8daa3efe5 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 17:59:27 -0700 Subject: [PATCH 130/309] fix: :arrow_down: downgrade chalk --- package.json | 2 +- pnpm-lock.yaml | 4 ++-- scripts/build-greet.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d07cf5eb51..60b92182d1 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "devDependencies": { "@types/gulp": "4.0.10", "@types/gulp-rename": "2.0.1", - "chalk": "5.2.0", + "chalk": "4.1.2", "cross-env": "7.0.3", "cypress": "10.11.0", "execa": "5.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93fa1740b6..59adccd90c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,8 +37,8 @@ importers: specifier: 2.0.1 version: 2.0.1 chalk: - specifier: 5.2.0 - version: 5.2.0 + specifier: 4.1.2 + version: 4.1.2 cross-env: specifier: 7.0.3 version: 7.0.3 diff --git a/scripts/build-greet.js b/scripts/build-greet.js index 514a653971..bbcc2aec7b 100644 --- a/scripts/build-greet.js +++ b/scripts/build-greet.js @@ -17,7 +17,7 @@ console.log( 136, 0, )( - " Hang on for a moment, as this may take a while", + " Hang on for a moment, as this may take a while.", ), ); console.log(""); From c567f4f14b7447e1163799be913fc1c76ca12b15 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 18:03:49 -0700 Subject: [PATCH 131/309] Revert "fix: :ambulance: disable lightningcss transformer for now" This reverts commit d0fd6a7de864e5b6859970bca8889bef840da2d7. --- packages/client/vite.config.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index 87e5f079f4..72746b7a03 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -43,6 +43,10 @@ export default defineConfig(({ command, mode }) => { }), ], + css: { + transformer: "lightningcss", + }, + resolve: { extensions, alias: { @@ -59,7 +63,7 @@ export default defineConfig(({ command, mode }) => { ), _ENV_: JSON.stringify(process.env.NODE_ENV), _DEV_: process.env.NODE_ENV !== "production", - _PERF_PREFIX_: JSON.stringify("Calckey:"), + _PERF_PREFIX_: JSON.stringify("Misskey:"), _DATA_TRANSFER_DRIVE_FILE_: JSON.stringify("mk_drive_file"), _DATA_TRANSFER_DRIVE_FOLDER_: JSON.stringify("mk_drive_folder"), _DATA_TRANSFER_DECK_COLUMN_: JSON.stringify("mk_deck_column"), From 0d6256113d04eaa7a3b61c5b7c7b0074413e6cb0 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 18:04:02 -0700 Subject: [PATCH 132/309] Revert "build: :zap: use vite 4.4 beta with lightningcss" This reverts commit 25aab24861d57d7341b731ef7f39716b9a943c4d. --- packages/client/package.json | 3 +- packages/client/vite.config.ts | 17 +-- pnpm-lock.yaml | 259 ++++++++++----------------------- 3 files changed, 86 insertions(+), 193 deletions(-) diff --git a/packages/client/package.json b/packages/client/package.json index 2044cef088..4cb60bbc4f 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -54,7 +54,6 @@ "insert-text-at-cursor": "0.3.0", "json5": "2.2.3", "katex": "0.16.7", - "lightningcss": "^1.21.0", "matter-js": "0.18.0", "mfm-js": "0.23.3", "photoswipe": "5.3.7", @@ -84,7 +83,7 @@ "unicode-emoji-json": "^0.4.0", "uuid": "9.0.0", "vanilla-tilt": "1.8.0", - "vite": "4.4.0-beta.2", + "vite": "4.3.9", "vite-plugin-compression": "^0.5.1", "vue": "3.3.4", "vue-isyourpasswordsafe": "^2.0.0", diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index 72746b7a03..6c644660e6 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -23,9 +23,9 @@ const extensions = [ ]; export default defineConfig(({ command, mode }) => { - fs.mkdirSync(`${__dirname}/../../built`, { recursive: true }); + fs.mkdirSync(__dirname + "/../../built", { recursive: true }); fs.writeFileSync( - `${__dirname}/../../built/meta.json`, + __dirname + "/../../built/meta.json", JSON.stringify({ version: meta.version }), "utf-8", ); @@ -43,16 +43,12 @@ export default defineConfig(({ command, mode }) => { }), ], - css: { - transformer: "lightningcss", - }, - resolve: { extensions, alias: { - "@/": `${__dirname}/src/`, - "/client-assets/": `${__dirname}/assets/`, - "/static-assets/": `${__dirname}/../backend/assets/`, + "@/": __dirname + "/src/", + "/client-assets/": __dirname + "/assets/", + "/static-assets/": __dirname + "/../backend/assets/", }, }, @@ -84,10 +80,9 @@ export default defineConfig(({ command, mode }) => { }, }, }, - cssMinify: "lightningcss", cssCodeSplit: true, assetsInlineLimit: 0, - outDir: `${__dirname}/../../built/_client_dist_`, + outDir: __dirname + "/../../built/_client_dist_", assetsDir: ".", emptyOutDir: false, sourcemap: process.env.NODE_ENV === "development", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 59adccd90c..0b0612c4a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -725,7 +725,7 @@ importers: version: 8.3.4 '@vitejs/plugin-vue': specifier: 4.2.3 - version: 4.2.3(vite@4.4.0-beta.2)(vue@3.3.4) + version: 4.2.3(vite@4.3.9)(vue@3.3.4) '@vue/compiler-sfc': specifier: 3.3.4 version: 3.3.4 @@ -810,9 +810,6 @@ importers: katex: specifier: 0.16.7 version: 0.16.7 - lightningcss: - specifier: ^1.21.0 - version: 1.21.0 matter-js: specifier: 0.18.0 version: 0.18.0 @@ -901,11 +898,11 @@ importers: specifier: 1.8.0 version: 1.8.0 vite: - specifier: 4.4.0-beta.2 - version: 4.4.0-beta.2(lightningcss@1.21.0)(sass@1.62.1) + specifier: 4.3.9 + version: 4.3.9(sass@1.62.1) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@4.4.0-beta.2) + version: 0.5.1(vite@4.3.9) vue: specifier: 3.3.4 version: 3.3.4 @@ -1598,8 +1595,8 @@ packages: - supports-color dev: false - /@esbuild/android-arm64@0.18.6: - resolution: {integrity: sha512-pL0Ci8P9q1sWbtPx8CXbc8JvPvvYdJJQ+LO09PLFsbz3aYNdFBGWJjiHU+CaObO4Ames+GOFpXRAJZS2L3ZK/A==} + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1607,8 +1604,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.18.6: - resolution: {integrity: sha512-J3lwhDSXBBppSzm/LC1uZ8yKSIpExc+5T8MxrYD9KNVZG81FOAu2VF2gXi/6A/LwDDQQ+b6DpQbYlo3VwxFepQ==} + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1616,8 +1613,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.18.6: - resolution: {integrity: sha512-hE2vZxOlJ05aY28lUpB0y0RokngtZtcUB+TVl9vnLEnY0z/8BicSvrkThg5/iI1rbf8TwXrbr2heEjl9fLf+EA==} + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1625,8 +1622,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.18.6: - resolution: {integrity: sha512-/tuyl4R+QhhoROQtuQj9E/yfJtZNdv2HKaHwYhhHGQDN1Teziem2Kh7BWQMumfiY7Lu9g5rO7scWdGE4OsQ6MQ==} + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1634,8 +1631,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.18.6: - resolution: {integrity: sha512-L7IQga2pDT+14Ti8HZwsVfbCjuKP4U213T3tuPggOzyK/p4KaUJxQFXJgfUFHKzU0zOXx8QcYRYZf0hSQtppkw==} + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1643,8 +1640,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.18.6: - resolution: {integrity: sha512-bq10jFv42V20Kk77NvmO+WEZaLHBKuXcvEowixnBOMkaBgS7kQaqTc77ZJDbsUpXU3KKNLQFZctfaeINmeTsZA==} + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1652,8 +1649,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.18.6: - resolution: {integrity: sha512-HbDLlkDZqUMBQaiday0pJzB6/8Xx/10dI3xRebJBReOEeDSeS+7GzTtW9h8ZnfB7/wBCqvtAjGtWQLTNPbR2+g==} + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1661,8 +1658,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.18.6: - resolution: {integrity: sha512-NMY9yg/88MskEZH2s4i6biz/3av+M8xY5ua4HE7CCz5DBz542cr7REe317+v7oKjnYBCijHpkzo5vU85bkXQmQ==} + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1670,8 +1667,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.18.6: - resolution: {integrity: sha512-C+5kb6rgsGMmvIdUI7v1PPgC98A6BMv233e97aXZ5AE03iMdlILFD/20HlHrOi0x2CzbspXn9HOnlE4/Ijn5Kw==} + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1679,8 +1676,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.18.6: - resolution: {integrity: sha512-AXazA0ljvQEp7cA9jscABNXsjodKbEcqPcAE3rDzKN82Vb3lYOq6INd+HOCA7hk8IegEyHW4T72Z7QGIhyCQEA==} + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1688,8 +1685,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.18.6: - resolution: {integrity: sha512-JjBf7TwY7ldcPgHYt9UcrjZB03+WZqg/jSwMAfzOzM5ZG+tu5umUqzy5ugH/crGI4eoDIhSOTDp1NL3Uo/05Fw==} + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1697,8 +1694,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.18.6: - resolution: {integrity: sha512-kATNsslryVxcH1sO3KP2nnyUWtZZVkgyhAUnyTVVa0OQQ9pmDRjTpHaE+2EQHoCM5wt/uav2edrAUqbwn3tkKQ==} + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1706,8 +1703,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.18.6: - resolution: {integrity: sha512-B+wTKz+8pi7mcWXFQV0LA79dJ+qhiut5uK9q0omoKnq8yRIwQJwfg3/vclXoqqcX89Ri5Y5538V0Se2v5qlcLA==} + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1715,8 +1712,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.18.6: - resolution: {integrity: sha512-h44RBLVXFUSjvhOfseE+5UxQ/r9LVeqK2S8JziJKOm9W7SePYRPDyn7MhzhNCCFPkcjIy+soCxfhlJXHXXCR0A==} + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1724,8 +1721,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.18.6: - resolution: {integrity: sha512-FlYpyr2Xc2AUePoAbc84NRV+mj7xpsISeQ36HGf9etrY5rTBEA+IU9HzWVmw5mDFtC62EQxzkLRj8h5Hq85yOQ==} + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1733,8 +1730,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.18.6: - resolution: {integrity: sha512-Mc4EUSYwzLci77u0Kao6ajB2WbTe5fNc7+lHwS3a+vJISC/oprwURezUYu1SdWAYoczbsyOvKAJwuNftoAdjjg==} + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1742,8 +1739,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.18.6: - resolution: {integrity: sha512-3hgZlp7NqIM5lNG3fpdhBI5rUnPmdahraSmwAi+YX/bp7iZ7mpTv2NkypGs/XngdMtpzljICxnUG3uPfqLFd3w==} + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1751,8 +1748,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.18.6: - resolution: {integrity: sha512-aEWTdZQHtSRROlDYn7ygB8yAqtnall/UnmoVIJVqccKitkAWVVSYocQUWrBOxLEFk8XdlRouVrLZe6WXszyviA==} + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1760,8 +1757,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.18.6: - resolution: {integrity: sha512-uxk/5yAGpjKZUHOECtI9W+9IcLjKj+2m0qf+RG7f7eRBHr8wP6wsr3XbNbgtOD1qSpPapd6R2ZfSeXTkCcAo5g==} + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1769,8 +1766,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.18.6: - resolution: {integrity: sha512-oXlXGS9zvNCGoAT/tLHAsFKrIKye1JaIIP0anCdpaI+Dc10ftaNZcqfLzEwyhdzFAYInXYH4V7kEdH4hPyo9GA==} + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1778,8 +1775,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.18.6: - resolution: {integrity: sha512-qh7IcAHUvvmMBmoIG+V+BbE9ZWSR0ohF51e5g8JZvU08kZF58uDFL5tHs0eoYz31H6Finv17te3W3QB042GqVA==} + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1787,8 +1784,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.18.6: - resolution: {integrity: sha512-9UDwkz7Wlm4N9jnv+4NL7F8vxLhSZfEkRArz2gD33HesAFfMLGIGNVXRoIHtWNw8feKsnGly9Hq1EUuRkWl0zA==} + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -3861,14 +3858,14 @@ packages: eslint-visitor-keys: 3.4.1 dev: true - /@vitejs/plugin-vue@4.2.3(vite@4.4.0-beta.2)(vue@3.3.4): + /@vitejs/plugin-vue@4.2.3(vite@4.3.9)(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.4.0-beta.2(lightningcss@1.21.0)(sass@1.62.1) + vite: 4.3.9(sass@1.62.1) vue: 3.3.4 dev: true @@ -6587,12 +6584,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - dev: true - /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} @@ -6917,34 +6908,34 @@ packages: es6-symbol: 3.1.3 dev: true - /esbuild@0.18.6: - resolution: {integrity: sha512-5QgxWaAhU/tPBpvkxUmnFv2YINHuZzjbk0LeUUnC2i3aJHjfi5yR49lgKgF7cb98bclOp/kans8M5TGbGFfJlQ==} + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.6 - '@esbuild/android-arm64': 0.18.6 - '@esbuild/android-x64': 0.18.6 - '@esbuild/darwin-arm64': 0.18.6 - '@esbuild/darwin-x64': 0.18.6 - '@esbuild/freebsd-arm64': 0.18.6 - '@esbuild/freebsd-x64': 0.18.6 - '@esbuild/linux-arm': 0.18.6 - '@esbuild/linux-arm64': 0.18.6 - '@esbuild/linux-ia32': 0.18.6 - '@esbuild/linux-loong64': 0.18.6 - '@esbuild/linux-mips64el': 0.18.6 - '@esbuild/linux-ppc64': 0.18.6 - '@esbuild/linux-riscv64': 0.18.6 - '@esbuild/linux-s390x': 0.18.6 - '@esbuild/linux-x64': 0.18.6 - '@esbuild/netbsd-x64': 0.18.6 - '@esbuild/openbsd-x64': 0.18.6 - '@esbuild/sunos-x64': 0.18.6 - '@esbuild/win32-arm64': 0.18.6 - '@esbuild/win32-ia32': 0.18.6 - '@esbuild/win32-x64': 0.18.6 + '@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 dev: true /escalade@3.1.1: @@ -10447,94 +10438,6 @@ packages: - supports-color dev: true - /lightningcss-darwin-arm64@1.21.0: - resolution: {integrity: sha512-WcJmVmbNUnCbUqqXV46ZsriFtWJujcPkn+w2cu4R+EgpXuibyTP/gzahmX0gc4RYQxTz2zXIeGx4cF2gr8fLwA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /lightningcss-darwin-x64@1.21.0: - resolution: {integrity: sha512-xHwMHfcTIHX6fY4YQimI1V/KcbozoNVeKMncZzrp/3NAj0sp3ktxobCj1e0sGqVJMUMaHu/SWvt0mS8jAIhkYw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-arm-gnueabihf@1.21.0: - resolution: {integrity: sha512-rk1cr+C2IA1QHvh0QJAPXsQ2vrwCksms7fgfaw43RIERBWa6EEM5p0/1CWhdZ5zrl9veUdY6NRaNGRJjJL0iLw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-arm64-gnu@1.21.0: - resolution: {integrity: sha512-JkOG8K2Y4m5MeP3DlaHOgGDDtHbhbJcN8JcizFN0snUIIru1qxYNWPhAQsEwysuTRY9aANP0nScZJkALpcYmgA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-arm64-musl@1.21.0: - resolution: {integrity: sha512-4Zx51DbR41neTFMs28CI9cZpX/mF5Urc6pChTio5nZhrz6FC1pRGiwxNJ+G15a/YPvRmPmvQd3Mz1N4WEgbj2A==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-x64-gnu@1.21.0: - resolution: {integrity: sha512-PN33pPK/O3b4qMfWcJ2eis7NLqEkyW2NEh9X4rWfJrBtOnSbgafuYUuEtO5Ylu+dL3oUKc5usB07FGeil3RzeA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-linux-x64-musl@1.21.0: - resolution: {integrity: sha512-S51OT7TRfS5x8aN/8frv/JSXCGm+11VuhM4WCiTqDPjhHUDWd8nwiN/7s5juiwrlrpOxb5UKq21EKDrISoGQpw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /lightningcss-win32-x64-msvc@1.21.0: - resolution: {integrity: sha512-yW6/ZDJAHrSWtRltH1tr2I+2sn374gK2yclc44HMfpxfjIYgXMUkzqstalloMUQpZFR6M0ltXo5/tuLWoBydGQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /lightningcss@1.21.0: - resolution: {integrity: sha512-HDznZexdDMvC98c79vRE+oW5vFncTlLjJopzK4azReOilq6n4XIscCMhvgiXkstYMM/dCe6FJw0oed06ck8AtA==} - engines: {node: '>= 12.0.0'} - dependencies: - detect-libc: 1.0.3 - optionalDependencies: - lightningcss-darwin-arm64: 1.21.0 - lightningcss-darwin-x64: 1.21.0 - lightningcss-linux-arm-gnueabihf: 1.21.0 - lightningcss-linux-arm64-gnu: 1.21.0 - lightningcss-linux-arm64-musl: 1.21.0 - lightningcss-linux-x64-gnu: 1.21.0 - lightningcss-linux-x64-musl: 1.21.0 - lightningcss-win32-x64-msvc: 1.21.0 - dev: true - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -15254,7 +15157,7 @@ packages: replace-ext: 1.0.1 dev: true - /vite-plugin-compression@0.5.1(vite@4.4.0-beta.2): + /vite-plugin-compression@0.5.1(vite@4.3.9): resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} peerDependencies: vite: '>=2.0.0' @@ -15262,19 +15165,18 @@ packages: chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) fs-extra: 10.1.0 - vite: 4.4.0-beta.2(lightningcss@1.21.0)(sass@1.62.1) + vite: 4.3.9(sass@1.62.1) transitivePeerDependencies: - supports-color dev: true - /vite@4.4.0-beta.2(lightningcss@1.21.0)(sass@1.62.1): - resolution: {integrity: sha512-wDISz2ET2q0QhmnKgkw9LGmjV3roie30ryb83b9r/UJ2JnXEXkaiCoWam5KzZning+7y5/W5XQ/VjHG5C50wtA==} + /vite@4.3.9(sass@1.62.1): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: '@types/node': '>= 14' less: '*' - lightningcss: ^1.21.0 sass: '*' stylus: '*' sugarss: '*' @@ -15284,8 +15186,6 @@ packages: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true stylus: @@ -15295,8 +15195,7 @@ packages: terser: optional: true dependencies: - esbuild: 0.18.6 - lightningcss: 1.21.0 + esbuild: 0.17.19 postcss: 8.4.24 rollup: 3.23.1 sass: 1.62.1 From 8bb5844febe395d7aeaf884e553419a7a659c310 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 18:04:13 -0700 Subject: [PATCH 133/309] show greeter on rebuild --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60b92182d1..22d33e1af5 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "packageManager": "pnpm@8.6.3", "private": true, "scripts": { - "rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp", + "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", "start": "pnpm --filter backend run start", "start:test": "pnpm --filter backend run start:test", From be83ac8f433fd07eb5ef0f06cf0efc775885d10b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 18:21:00 -0700 Subject: [PATCH 134/309] fix: :bug: start transaction with multi --- packages/backend/src/services/note/create.ts | 44 +++++++++++--------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 3a545b4872..d765ff7aab 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -468,17 +468,19 @@ export default async ( } else if (boostedByRelay && data.renote?.uri) { // Use Redis transaction for atomicity await redisClient.watch(`publishedNote:${data.renote.uri}`); - const exists = await redisClient.exists( - `publishedNote:${data.renote.uri}`, - ); + const exists = await redisClient.exists(`publishedNote:${data.renote.uri}`); if (exists === 0) { // Start the transaction - redisClient.multi(); - publishNotesStream(data.renote); + const transaction = redisClient.multi(); const key = `publishedNote:${data.renote.uri}`; - await redisClient.set(key, 1, "EX", 30); + transaction.set(key, 1, "EX", 30); // Execute the transaction - redisClient.exec(); + transaction.exec((err, replies) => { + // Publish after setting the key in Redis + if (!err && data.renote) { + publishNotesStream(data.renote); + } + }); } else { // Abort the transaction redisClient.unwatch(); @@ -489,12 +491,16 @@ export default async ( const exists = await redisClient.exists(`publishedNote:${note.uri}`); if (exists === 0) { // Start the transaction - redisClient.multi(); - publishNotesStream(note); + const transaction = redisClient.multi(); const key = `publishedNote:${note.uri}`; - await redisClient.set(key, 1, "EX", 30); + transaction.set(key, 1, "EX", 30); // Execute the transaction - redisClient.exec(); + transaction.exec((err, replies) => { + // Publish after setting the key in Redis + if (!err) { + publishNotesStream(note); + } + }); } else { // Abort the transaction redisClient.unwatch(); @@ -663,15 +669,15 @@ async function renderNoteOrRenoteActivity(data: Option, note: Note) { const content = data.renote && - data.text == null && - data.poll == null && - (data.files == null || data.files.length === 0) + data.text == null && + data.poll == null && + (data.files == null || data.files.length === 0) ? renderAnnounce( - data.renote.uri - ? data.renote.uri - : `${config.url}/notes/${data.renote.id}`, - note, - ) + data.renote.uri + ? data.renote.uri + : `${config.url}/notes/${data.renote.id}`, + note, + ) : renderCreate(await renderNote(note, false), note); return renderActivity(content); From c462d48bdbcf81aef376464c17b367f0d61a9958 Mon Sep 17 00:00:00 2001 From: tamania <tamaina@hotmail.co.jp> Date: Fri, 23 Jun 2023 18:33:37 -0700 Subject: [PATCH 135/309] =?UTF-8?q?perf:=20=E2=9A=A1=20use=20setInterval?= =?UTF-8?q?=20instead=20of=20setTimeout=20chain=20in=20MkTime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/src/components/global/MkTime.vue | 69 +++++++++++++------ packages/client/src/scripts/intl-const.ts | 12 ++++ 2 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 packages/client/src/scripts/intl-const.ts diff --git a/packages/client/src/components/global/MkTime.vue b/packages/client/src/components/global/MkTime.vue index 5d9295433f..72a51f10d6 100644 --- a/packages/client/src/components/global/MkTime.vue +++ b/packages/client/src/components/global/MkTime.vue @@ -1,21 +1,23 @@ <template> <time :title="absolute"> - <template v-if="mode === 'relative'">{{ relative }}</template> + <template v-if="invalid">{{ i18n.ts._ago.invalid }}</template> + <template v-else-if="mode === 'relative'">{{ relative }}</template> <template v-else-if="mode === 'absolute'">{{ absolute }}</template> <template v-else-if="mode === 'detail'" >{{ absolute }} ({{ relative }})</template > - <slot></slot> </time> </template> <script lang="ts" setup> -import { onUnmounted } from "vue"; +import { onMounted, onUnmounted } from "vue"; import { i18n } from "@/i18n"; +import { dateTimeFormat } from "@/scripts/intl-const"; const props = withDefaults( defineProps<{ - time: Date | string; + time: Date | string | number | null; + origin?: Date | null; mode?: "relative" | "absolute" | "detail"; }>(), { @@ -24,12 +26,23 @@ const props = withDefaults( ); const _time = - typeof props.time === "string" ? new Date(props.time) : props.time; -const absolute = _time.toLocaleString(); + props.time == null + ? NaN + : typeof props.time === "number" + ? props.time + : (props.time instanceof Date + ? props.time + : new Date(props.time) + ).getTime(); +const invalid = Number.isNaN(_time); +const absolute = !invalid ? dateTimeFormat.format(_time) : i18n.ts._ago.invalid; -let now = $shallowRef(new Date()); -const relative = $computed(() => { - const ago = (now.getTime() - _time.getTime()) / 1000; /*ms*/ +let now = $ref((props.origin ?? new Date()).getTime()); +const relative = $computed<string>(() => { + if (props.mode === "absolute") return ""; // absoluteではrelativeを使わないので計算しない + if (invalid) return i18n.ts._ago.invalid; + + const ago = (now - _time) / 1000; /*ms*/ return ago >= 31536000 ? i18n.t("_ago.yearsAgo", { n: Math.round(ago / 31536000).toString() }) : ago >= 2592000 @@ -49,22 +62,36 @@ const relative = $computed(() => { : i18n.ts._ago.future; }); -function tick() { - // TODO: パフォーマンス向上のため、このコンポーネントが画面内に表示されている場合のみ更新する - now = new Date(); - - tickId = window.setTimeout(() => { - window.requestAnimationFrame(tick); - }, 10000); -} - let tickId: number; -if (props.mode === "relative" || props.mode === "detail") { - tickId = window.requestAnimationFrame(tick); +function tick() { + const _now = new Date().getTime(); + const agoPrev = (now - _time) / 1000; /*ms*/ // 現状のinterval + now = _now; + + const ago = (now - _time) / 1000; /*ms*/ // 次のinterval + const prev = agoPrev < 60 ? 10000 : agoPrev < 3600 ? 60000 : 180000; + const next = ago < 60 ? 10000 : ago < 3600 ? 60000 : 180000; + + if (!tickId) { + tickId = window.setInterval(tick, next); + } else if (prev < next) { + window.clearInterval(tickId); + tickId = window.setInterval(tick, next); + } +} + +if ( + !invalid && + props.origin === null && + (props.mode === "relative" || props.mode === "detail") +) { + onMounted(() => { + tick(); + }); onUnmounted(() => { - window.cancelAnimationFrame(tickId); + if (tickId) window.clearInterval(tickId); }); } </script> diff --git a/packages/client/src/scripts/intl-const.ts b/packages/client/src/scripts/intl-const.ts new file mode 100644 index 0000000000..ac73723717 --- /dev/null +++ b/packages/client/src/scripts/intl-const.ts @@ -0,0 +1,12 @@ +import { lang } from "@/config"; + +export const versatileLang = (lang ?? "ja-JP").replace("ja-KS", "ja-JP"); +export const dateTimeFormat = new Intl.DateTimeFormat(versatileLang, { + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", +}); +export const numberFormat = new Intl.NumberFormat(versatileLang); From 38e1c4c0fd3735a56ceccc345ee205df95e1a3ea Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 18:51:25 -0700 Subject: [PATCH 136/309] chore: update bug report template --- issue_template/bug.yaml | 51 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index c7e2f6b788..52b769f517 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -1,6 +1,14 @@ name: Bug Report about: File a bug report title: "[Bug]: " +blank_issues_enabled: true +contact_links: + - name: Support Matrix + url: https://matrix.to/#/%23calckey:matrix.fedibird.com + about: Having trouble with deployment? Ask the support chat! + - name: Resposible Disclosure + url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md + about: Found a security vulnerability? Please report it here! body: - type: markdown attributes: @@ -29,7 +37,7 @@ body: attributes: label: Version description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. - placeholder: Calckey Version 13.0.4 + placeholder: v13.1.4.1 validations: required: true - type: input @@ -37,13 +45,23 @@ body: attributes: label: Instance description: What instance of calckey are you using? - placeholder: stop.voring.me + placeholder: calckey.social validations: required: false + - type: dropdown + id: issue-type + attributes: + label: What type of issue is this? + description: If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. + multiple: false + options: + - Client-side + - Server-side + - Other (Please Specify) - type: dropdown id: browsers attributes: - label: What browser are you using? + label: What browser are you using? (Client-side issues only) multiple: false options: - Firefox @@ -54,6 +72,33 @@ body: - Safari - Microsoft Edge - Other (Please Specify) + - type: dropdown + id: device + attributes: + label: What operating system are you using? (Client-side issues only) + multiple: false + options: + - Windows + - MacOS + - Linux + - Android + - iOS + - Other (Please Specify) + - type: dropdown + id: operating-system + attributes: + label: What operating system are you using? (Server-side issues only) + multiple: false + options: + - Ubuntu >= 22.04 + - Ubuntu < 22.04 + - Debian + - Arch + - RHEL (CentOS/AlmaLinux/Rocky Linux) + - FreeBSD + - OpenBSD + - Android + - Other (Please Specify) - type: textarea id: logs attributes: From 796d1a171d242f2a404ceecc055714144ea51dc3 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 18:52:51 -0700 Subject: [PATCH 137/309] fix: :pencil2: fix tab characters thanks, yaml. ugh. --- issue_template/bug.yaml | 80 ++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index 52b769f517..1a5a3d2da5 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -6,9 +6,9 @@ contact_links: - name: Support Matrix url: https://matrix.to/#/%23calckey:matrix.fedibird.com about: Having trouble with deployment? Ask the support chat! - - name: Resposible Disclosure - url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md - about: Found a security vulnerability? Please report it here! + - name: Resposible Disclosure + url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md + about: Found a security vulnerability? Please report it here! body: - type: markdown attributes: @@ -48,16 +48,16 @@ body: placeholder: calckey.social validations: required: false - - type: dropdown - id: issue-type - attributes: - label: What type of issue is this? - description: If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. - multiple: false - options: - - Client-side - - Server-side - - Other (Please Specify) + - type: dropdown + id: issue-type + attributes: + label: What type of issue is this? + description: If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. + multiple: false + options: + - Client-side + - Server-side + - Other (Please Specify) - type: dropdown id: browsers attributes: @@ -72,33 +72,33 @@ body: - Safari - Microsoft Edge - Other (Please Specify) - - type: dropdown - id: device - attributes: - label: What operating system are you using? (Client-side issues only) - multiple: false - options: - - Windows - - MacOS - - Linux - - Android - - iOS - - Other (Please Specify) - - type: dropdown - id: operating-system - attributes: - label: What operating system are you using? (Server-side issues only) - multiple: false - options: - - Ubuntu >= 22.04 - - Ubuntu < 22.04 - - Debian - - Arch - - RHEL (CentOS/AlmaLinux/Rocky Linux) - - FreeBSD - - OpenBSD - - Android - - Other (Please Specify) + - type: dropdown + id: device + attributes: + label: What operating system are you using? (Client-side issues only) + multiple: false + options: + - Windows + - MacOS + - Linux + - Android + - iOS + - Other (Please Specify) + - type: dropdown + id: operating-system + attributes: + label: What operating system are you using? (Server-side issues only) + multiple: false + options: + - Ubuntu >= 22.04 + - Ubuntu < 22.04 + - Debian + - Arch + - RHEL (CentOS/AlmaLinux/Rocky Linux) + - FreeBSD + - OpenBSD + - Android + - Other (Please Specify) - type: textarea id: logs attributes: From 873cc0ae51c3e54e2af05a369f42e2f969f2b323 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 18:57:00 -0700 Subject: [PATCH 138/309] chore: :memo: links in bug template --- issue_template/bug.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index 1a5a3d2da5..79b68c9b5b 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -5,22 +5,24 @@ blank_issues_enabled: true contact_links: - name: Support Matrix url: https://matrix.to/#/%23calckey:matrix.fedibird.com - about: Having trouble with deployment? Ask the support chat! + about: Having trouble with deployment? Ask the support chat. - name: Resposible Disclosure url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md - about: Found a security vulnerability? Please report it here! + about: Found a security vulnerability? Please disclose it responsibly. body: - type: markdown attributes: value: | Thanks for taking the time to fill out this bug report! + Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com) + Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md) + By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) - type: textarea id: what-happened attributes: label: What happened? description: Please give us a brief description of what happened. placeholder: Tell us what you see! - value: "A bug happened!" validations: required: true - type: textarea @@ -29,7 +31,6 @@ body: label: What did you expect to happen? description: Please give us a brief description of what you expected to happen. placeholder: Tell us what you wish happened! - value: "Instead of x, y should happen instead!" validations: required: true - type: input From 3e5886883ae628e42740008e9c49678fcf34618a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 19:01:10 -0700 Subject: [PATCH 139/309] chore: :memo: bring bug template changes to feature template --- issue_template/bug.yaml | 3 +++ issue_template/feature.yaml | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index 79b68c9b5b..e5edebbd9d 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -65,6 +65,7 @@ body: label: What browser are you using? (Client-side issues only) multiple: false options: + - N/A - Firefox - Chrome - Brave @@ -79,6 +80,7 @@ body: label: What operating system are you using? (Client-side issues only) multiple: false options: + - N/A - Windows - MacOS - Linux @@ -91,6 +93,7 @@ body: label: What operating system are you using? (Server-side issues only) multiple: false options: + - N/A - Ubuntu >= 22.04 - Ubuntu < 22.04 - Debian diff --git a/issue_template/feature.yaml b/issue_template/feature.yaml index 455125ea7c..072027c762 100644 --- a/issue_template/feature.yaml +++ b/issue_template/feature.yaml @@ -1,18 +1,28 @@ name: Feature Request about: Request a Feature title: "[Feature]: " +blank_issues_enabled: true +contact_links: + - name: Support Matrix + url: https://matrix.to/#/%23calckey:matrix.fedibird.com + about: Having trouble with deployment? Ask the support chat. + - name: Resposible Disclosure + url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md + about: Found a security vulnerability? Please disclose it responsibly. body: - type: markdown attributes: value: | Thanks for taking the time to fill out this feature request! + Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com) + Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md) + By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) - type: textarea id: what-feature attributes: label: What feature would you like implemented? description: Please give us a brief description of what you'd like. placeholder: Tell us what you want! - value: "x feature would be great!" validations: required: true - type: textarea @@ -21,7 +31,6 @@ body: label: Why should we add this feature? description: Please give us a brief description of why your feature is important. placeholder: Tell us why you want this feature! - value: "x feature is super useful because y!" validations: required: true - type: input @@ -29,7 +38,7 @@ body: attributes: label: Version description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. - placeholder: Calckey Version 13.0.4 + placeholder: Calckey Version 13.1.4.1 validations: required: true - type: input @@ -37,7 +46,7 @@ body: attributes: label: Instance description: What instance of calckey are you using? - placeholder: stop.voring.me + placeholder: calckey.social validations: required: false - type: checkboxes From efd96621b47f1a2291c66ecbe99ca2a5cdf02d2d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 19:06:19 -0700 Subject: [PATCH 140/309] chore: :memo: deployment method in bug report --- issue_template/bug.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index e5edebbd9d..83d71e76d5 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -87,6 +87,22 @@ body: - Android - iOS - Other (Please Specify) + - type: dropdown + id: deplotment-method + attributes: + label: How do you deploy Calckey on your server? (Server-side issues only) + multiple: false + options: + - N/A + - Manual + - Ubuntu Install Script + - Docker Compose + - Docker Prebuilt Image + - Helm Chart + - YunoHost + - AUR Package + - Other (Please Specify) + attributes: - type: dropdown id: operating-system attributes: From 8113c77df77f43836611e65d5e5cbec61ed1b493 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 19:09:14 -0700 Subject: [PATCH 141/309] chore: :memo: fix duplicate, add emojis --- issue_template/bug.yaml | 13 ++++++------- issue_template/feature.yaml | 12 ++++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index 83d71e76d5..9bdcd8b277 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -3,20 +3,20 @@ about: File a bug report title: "[Bug]: " blank_issues_enabled: true contact_links: - - name: Support Matrix + - name: 💁 Support Matrix url: https://matrix.to/#/%23calckey:matrix.fedibird.com about: Having trouble with deployment? Ask the support chat. - - name: Resposible Disclosure + - name: 🔒 Resposible Disclosure url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md about: Found a security vulnerability? Please disclose it responsibly. body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this bug report! - Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com) - Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md) - By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) + 💖 Thanks for taking the time to fill out this bug report! + 💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com) + 🔒 Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md) + 🤝 By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) - type: textarea id: what-happened attributes: @@ -102,7 +102,6 @@ body: - YunoHost - AUR Package - Other (Please Specify) - attributes: - type: dropdown id: operating-system attributes: diff --git a/issue_template/feature.yaml b/issue_template/feature.yaml index 072027c762..0d44577979 100644 --- a/issue_template/feature.yaml +++ b/issue_template/feature.yaml @@ -3,20 +3,20 @@ about: Request a Feature title: "[Feature]: " blank_issues_enabled: true contact_links: - - name: Support Matrix + - name: 💁 Support Matrix url: https://matrix.to/#/%23calckey:matrix.fedibird.com about: Having trouble with deployment? Ask the support chat. - - name: Resposible Disclosure + - name: 🔒 Resposible Disclosure url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md about: Found a security vulnerability? Please disclose it responsibly. body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this feature request! - Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com) - Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md) - By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) + 💖 Thanks for taking the time to fill out this feature request! + 💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com) + 🔒 Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md) + 🤝 By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) - type: textarea id: what-feature attributes: From ebe86c7bedf08a2c40c509072dab7a0a314a6ee7 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 19:14:35 -0700 Subject: [PATCH 142/309] chore: :memo: add emojis to issue templates Because everything's better with emojis! --- issue_template/bug.yaml | 22 +++++++++++----------- issue_template/feature.yaml | 10 +++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index 9bdcd8b277..52b2a31703 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -20,7 +20,7 @@ body: - type: textarea id: what-happened attributes: - label: What happened? + label: 👀 What happened? description: Please give us a brief description of what happened. placeholder: Tell us what you see! validations: @@ -28,7 +28,7 @@ body: - type: textarea id: what-is-expected attributes: - label: What did you expect to happen? + label: 🤔 What did you expect to happen? description: Please give us a brief description of what you expected to happen. placeholder: Tell us what you wish happened! validations: @@ -36,7 +36,7 @@ body: - type: input id: version attributes: - label: Version + label: 📦 Version description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. placeholder: v13.1.4.1 validations: @@ -44,7 +44,7 @@ body: - type: input id: instance attributes: - label: Instance + label: 🌐 Instance description: What instance of calckey are you using? placeholder: calckey.social validations: @@ -52,7 +52,7 @@ body: - type: dropdown id: issue-type attributes: - label: What type of issue is this? + label: 📲 What type of issue is this? description: If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. multiple: false options: @@ -62,7 +62,7 @@ body: - type: dropdown id: browsers attributes: - label: What browser are you using? (Client-side issues only) + label: 🕸️ What browser are you using? (Client-side issues only) multiple: false options: - N/A @@ -77,7 +77,7 @@ body: - type: dropdown id: device attributes: - label: What operating system are you using? (Client-side issues only) + label: 🖥️ What operating system are you using? (Client-side issues only) multiple: false options: - N/A @@ -90,7 +90,7 @@ body: - type: dropdown id: deplotment-method attributes: - label: How do you deploy Calckey on your server? (Server-side issues only) + label: 🚀 How do you deploy Calckey on your server? (Server-side issues only) multiple: false options: - N/A @@ -105,7 +105,7 @@ body: - type: dropdown id: operating-system attributes: - label: What operating system are you using? (Server-side issues only) + label: 🐧 What operating system are you using? (Server-side issues only) multiple: false options: - N/A @@ -121,13 +121,13 @@ body: - type: textarea id: logs attributes: - label: Relevant log output + label: 📜 Relevant log output description: Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks. render: shell - type: checkboxes id: terms attributes: - label: Contribution Guidelines + label: 🤝 Contribution Guidelines description: By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) options: - label: I agree to follow this project's Contribution Guidelines diff --git a/issue_template/feature.yaml b/issue_template/feature.yaml index 0d44577979..5b64313d6c 100644 --- a/issue_template/feature.yaml +++ b/issue_template/feature.yaml @@ -20,7 +20,7 @@ body: - type: textarea id: what-feature attributes: - label: What feature would you like implemented? + label: 🙋 What feature would you like implemented? description: Please give us a brief description of what you'd like. placeholder: Tell us what you want! validations: @@ -28,7 +28,7 @@ body: - type: textarea id: why-add-feature attributes: - label: Why should we add this feature? + label: 🤔 Why should we add this feature? description: Please give us a brief description of why your feature is important. placeholder: Tell us why you want this feature! validations: @@ -36,7 +36,7 @@ body: - type: input id: version attributes: - label: Version + label: 📦 Version description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. placeholder: Calckey Version 13.1.4.1 validations: @@ -44,7 +44,7 @@ body: - type: input id: instance attributes: - label: Instance + label: 🌐 Instance description: What instance of calckey are you using? placeholder: calckey.social validations: @@ -52,7 +52,7 @@ body: - type: checkboxes id: terms attributes: - label: Contribution Guidelines + label: 🤝 Contribution Guidelines description: By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) options: - label: I agree to follow this project's Contribution Guidelines From f91b8019e9576f5bcda8717f991ee903d552dcb7 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 19:17:53 -0700 Subject: [PATCH 143/309] chore: :memo: emojis in issue label --- issue_template/bug.yaml | 2 +- issue_template/feature.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index 52b2a31703..e6aa388223 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -1,4 +1,4 @@ -name: Bug Report +name: 🐛 Bug Report about: File a bug report title: "[Bug]: " blank_issues_enabled: true diff --git a/issue_template/feature.yaml b/issue_template/feature.yaml index 5b64313d6c..2cdcd4d81b 100644 --- a/issue_template/feature.yaml +++ b/issue_template/feature.yaml @@ -1,4 +1,4 @@ -name: Feature Request +name: ✨ Feature Request about: Request a Feature title: "[Feature]: " blank_issues_enabled: true From cbd781b5b98c1b5cafdde671e495c365beafbbfd Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 20:10:12 -0700 Subject: [PATCH 144/309] docs: :memo: update links --- README.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d1dfbf088e..04010e89a8 100644 --- a/README.md +++ b/README.md @@ -49,17 +49,26 @@ # 🥂 Links -- 💸 OpenCollective: <https://opencollective.com/Calckey> -- 💸 Liberapay: <https://liberapay.com/ThatOneCalculator> +### Want to get involved? Great! + +- If you have the means to, [donations](https://opencollective.com/Calckey) are a great way to keep us going. +- If you know how to program in TypeScript, Vue, or Rust, read the [contributing](./CONTRIBUTING.md) document. +- If you know a non-English language, translating Calckey on [Weblate](https://hosted.weblate.org/engage/calckey/) help bring Calckey to more people. No technical experience needed! +- Want to write/report about us, have any professional inquiries, or just have questions to ask? Contact us [here!](https://calckey.org/contact/) + +### All links + +- 🌐 Homepage: <https://calckey.org> +- 💸 Donations: + - OpenCollective: <https://opencollective.com/Calckey> + - Liberapay: <https://liberapay.com/ThatOneCalculator> - Donate publicly to get your name on the Patron list! - 🚢 Flagship server: <https://calckey.social> -- 📣 Official account: <https://i.calckey.cloud/@calckey> - 💁 Matrix support room: <https://matrix.to/#/#calckey:matrix.fedibird.com> -- 📜 Server list: <https://calckey.fediverse.observer/list> -- 📖 JoinFediverse Wiki: <https://joinfediverse.wiki/What_is_Calckey%3F> -- 🐋 Docker Hub: <https://hub.docker.com/r/thatonecalculator/calckey> +- 📣 Official account: <https://i.calckey.cloud/@calckey> +- 📜 Server list: <https://calckey.org/join> - ✍️ Weblate: <https://hosted.weblate.org/engage/calckey/> -- 📦 Yunohost: <https://github.com/YunoHost-Apps/calckey_ynh> +- ️️📬 Contact: <https://calckey.org/contact/> # 🌠 Getting started From fea10ab6db08880823138b5d0c4f5ece5590ffd4 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 20:19:25 -0700 Subject: [PATCH 145/309] docs: :memo: changelog --- CALCKEY.md | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/CALCKEY.md b/CALCKEY.md index 9770162110..5a8bbd8ff7 100644 --- a/CALCKEY.md +++ b/CALCKEY.md @@ -1,5 +1,8 @@ # All the changes to Calckey from stock Misskey +> **Warning** +> This list is incomplete. Please check the [Releases](https://codeberg.org/calckey/calckey/releases) and [Changelog](https://codeberg.org/calckey/calckey/src/branch/develop/CHANGELOG.md) for a more complete list of changes. There have been [>4000 commits (laggy link)](https://codeberg.org/calckey/calckey/compare/700a7110f7e34f314b070987aa761c451ec34efc...develop) since we forked Misskey! + ## Planned - Stucture @@ -8,31 +11,25 @@ - Rewrite backend in Rust and [Rocket](https://rocket.rs/) - Use [Magic RegExP](https://regexp.dev/) for RegEx 🦄 - Function - - User "choices" (recommended users) like Mastodon and Soapbox + - User "choices" (recommended users) and featured hashtags like Mastodon and Soapbox - Join Reason system like Mastodon/Pleroma - Option to publicize server blocks - - Build flag to remove NSFW/AI stuff - - Filter notifications by user - - Exclude self from antenna + - More antenna options + - Groups - Form - - MFM button - - Personal notes for all accounts - - Fully revamp non-logged-in screen - Lookup/details for post/file/server - [Rat mode?](https://stop.voring.me/notes/933fx97bmd) ## Work in progress -- Weblate project -- Customizable max note length - Link verification - Better Messaging UI - Better API Documentation - Remote follow button -- Admin custom CSS -- Add back time machine (jump to date) - Improve accesibility - Timeline filters +- Events +- Fully revamp non-logged-in screen ## Implemented @@ -73,7 +70,6 @@ - Raw server info only for moderators - New spinner animation - Spinner instead of "Loading..." -- SearchX instead of Google - Always signToActivityPubGet - Spacing on group items - Quotes have solid border @@ -108,10 +104,6 @@ - More antenna options - New dashboard - Backfill follower counts -- Improved emoji licensing - - This feature was ported from Misskey. - - https://github.com/misskey-dev/misskey/commit/8ae9d2eaa8b0842671558370f787902e94b7f5a3: enhance: カスタム絵文字にライセンス情報を付与できるように - - https://github.com/misskey-dev/misskey/commit/ed51209172441927d24339f0759a5badbee3c9b6: 絵文字のライセンスを表示できるように - Compile time compression - Sonic search - Popular color schemes, including Nord, Gruvbox, and Catppuccin @@ -133,7 +125,6 @@ ## Implemented (remote) - - MissV: [fix Misskey Forkbomb](https://code.vtopia.live/Vtopia/MissV/commit/40b23c070bd4adbb3188c73546c6c625138fb3c1) - [Make showing ads optional](https://github.com/misskey-dev/misskey/pull/8996) - [Tapping avatar in mobile opens account modal](https://github.com/misskey-dev/misskey/pull/9056) From 0625bcbec3161db957e48a1339d11de9c06615fc Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 20:37:24 -0700 Subject: [PATCH 146/309] refactor: :label: add antenna type to streaming types --- packages/calckey-js/src/streaming.types.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/calckey-js/src/streaming.types.ts b/packages/calckey-js/src/streaming.types.ts index 7f1edc87d6..0eb3ce407d 100644 --- a/packages/calckey-js/src/streaming.types.ts +++ b/packages/calckey-js/src/streaming.types.ts @@ -90,6 +90,15 @@ export type Channels = { }; receives: null; }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + } messaging: { params: { otherparty?: User["id"] | null; From 0e4a4b09c91b0547b78b68b65dc970a14aaf9480 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 21:13:03 -0700 Subject: [PATCH 147/309] docs: :memo: API documentation generation --- packages/calckey-js/README.md | 4 +- packages/calckey-js/etc/calckey-js.api.json | 9814 ++++++++++++++ packages/calckey-js/etc/calckey-js.api.md | 4961 +++---- .../calckey-js/markdown/calckey-js.acct.md | 14 + .../calckey-js.api.apiclient._constructor_.md | 24 + .../calckey-js.api.apiclient.credential.md | 11 + .../calckey-js.api.apiclient.fetch.md | 11 + .../markdown/calckey-js.api.apiclient.md | 32 + .../calckey-js.api.apiclient.origin.md | 11 + .../calckey-js.api.apiclient.request.md | 57 + .../markdown/calckey-js.api.apierror.md | 17 + .../markdown/calckey-js.api.fetchlike.md | 22 + .../markdown/calckey-js.api.isapierror.md | 22 + .../calckey-js/markdown/calckey-js.api.md | 25 + ...ckey-js.channelconnection._constructor_.md | 22 + .../calckey-js.channelconnection.channel.md | 11 + .../calckey-js.channelconnection.dispose.md | 15 + .../calckey-js.channelconnection.id.md | 11 + .../calckey-js.channelconnection.incount.md | 11 + .../markdown/calckey-js.channelconnection.md | 39 + .../calckey-js.channelconnection.name.md | 11 + .../calckey-js.channelconnection.outcount.md | 11 + .../calckey-js.channelconnection.send.md | 26 + .../calckey-js.channelconnection.stream.md | 11 + .../markdown/calckey-js.channels.md | 143 + .../markdown/calckey-js.endpoints.md | 1911 +++ .../markdown/calckey-js.entities.ad.md | 11 + .../calckey-js.entities.announcement.md | 21 + .../markdown/calckey-js.entities.antenna.md | 29 + .../markdown/calckey-js.entities.app.md | 11 + .../calckey-js.entities.authsession.md | 17 + .../markdown/calckey-js.entities.blocking.md | 18 + .../markdown/calckey-js.entities.channel.md | 15 + .../markdown/calckey-js.entities.clip.md | 11 + .../calckey-js.entities.customemoji.md | 17 + .../calckey-js.entities.datestring.md | 11 + ...ey-js.entities.detailedinstancemetadata.md | 15 + .../markdown/calckey-js.entities.drivefile.md | 26 + .../calckey-js.entities.drivefolder.md | 11 + .../markdown/calckey-js.entities.following.md | 18 + ...-js.entities.followingfolloweepopulated.md | 15 + ...-js.entities.followingfollowerpopulated.md | 15 + .../calckey-js.entities.followrequest.md | 17 + .../calckey-js.entities.gallerypost.md | 11 + .../markdown/calckey-js.entities.id.md | 11 + .../markdown/calckey-js.entities.instance.md | 40 + .../calckey-js.entities.instancemetadata.md | 15 + ...alckey-js.entities.liteinstancemetadata.md | 46 + .../markdown/calckey-js.entities.md | 51 + .../calckey-js.entities.medetailed.md | 40 + .../calckey-js.entities.messagingmessage.md | 27 + .../markdown/calckey-js.entities.note.md | 51 + .../calckey-js.entities.notefavorite.md | 18 + .../calckey-js.entities.notereaction.md | 18 + .../calckey-js.entities.notification.md | 82 + .../calckey-js.entities.origintype.md | 11 + .../markdown/calckey-js.entities.page.md | 33 + .../markdown/calckey-js.entities.pageevent.md | 19 + .../calckey-js.entities.serverinfo.md | 24 + .../markdown/calckey-js.entities.signin.md | 19 + .../markdown/calckey-js.entities.stats.md | 19 + .../markdown/calckey-js.entities.user.md | 13 + .../calckey-js.entities.userdetailed.md | 56 + .../markdown/calckey-js.entities.usergroup.md | 11 + .../markdown/calckey-js.entities.userlist.md | 18 + .../markdown/calckey-js.entities.userlite.md | 35 + .../calckey-js.entities.usersorting.md | 17 + .../markdown/calckey-js.ffvisibility.md | 11 + packages/calckey-js/markdown/calckey-js.md | 43 + .../markdown/calckey-js.mutednotereasons.md | 16 + .../markdown/calckey-js.notevisibilities.md | 16 + .../markdown/calckey-js.notificationtypes.md | 24 + .../markdown/calckey-js.permissions.md | 11 + .../calckey-js.stream._constructor_.md | 30 + .../markdown/calckey-js.stream.close.md | 15 + .../calckey-js.stream.disconnecttochannel.md | 22 + .../calckey-js/markdown/calckey-js.stream.md | 36 + ...alckey-js.stream.removesharedconnection.md | 22 + ...ey-js.stream.removesharedconnectionpool.md | 22 + .../markdown/calckey-js.stream.send.md | 23 + .../markdown/calckey-js.stream.state.md | 11 + .../markdown/calckey-js.stream.usechannel.md | 28 + packages/calckey-js/markdown/index.md | 12 + packages/calckey-js/package-lock.json | 10662 ---------------- packages/calckey-js/package.json | 32 +- packages/calckey-js/src/streaming.ts | 42 +- packages/calckey-js/src/streaming.types.ts | 2 +- packages/calckey-js/test-d/api.ts | 6 +- packages/calckey-js/test-d/streaming.ts | 4 +- packages/calckey-js/test/api.ts | 34 +- packages/calckey-js/test/streaming.ts | 20 +- pnpm-lock.yaml | 569 +- 92 files changed, 16417 insertions(+), 13506 deletions(-) create mode 100644 packages/calckey-js/etc/calckey-js.api.json create mode 100644 packages/calckey-js/markdown/calckey-js.acct.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.apiclient.credential.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.apiclient.fetch.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.apiclient.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.apiclient.origin.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.apiclient.request.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.apierror.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.fetchlike.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.isapierror.md create mode 100644 packages/calckey-js/markdown/calckey-js.api.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection._constructor_.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.channel.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.dispose.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.id.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.incount.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.name.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.outcount.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.send.md create mode 100644 packages/calckey-js/markdown/calckey-js.channelconnection.stream.md create mode 100644 packages/calckey-js/markdown/calckey-js.channels.md create mode 100644 packages/calckey-js/markdown/calckey-js.endpoints.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.ad.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.announcement.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.antenna.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.app.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.authsession.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.blocking.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.channel.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.clip.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.customemoji.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.datestring.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.drivefile.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.drivefolder.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.following.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.followrequest.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.gallerypost.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.id.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.instance.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.instancemetadata.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.medetailed.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.messagingmessage.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.note.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.notefavorite.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.notereaction.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.notification.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.origintype.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.page.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.pageevent.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.serverinfo.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.signin.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.stats.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.user.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.userdetailed.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.usergroup.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.userlist.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.userlite.md create mode 100644 packages/calckey-js/markdown/calckey-js.entities.usersorting.md create mode 100644 packages/calckey-js/markdown/calckey-js.ffvisibility.md create mode 100644 packages/calckey-js/markdown/calckey-js.md create mode 100644 packages/calckey-js/markdown/calckey-js.mutednotereasons.md create mode 100644 packages/calckey-js/markdown/calckey-js.notevisibilities.md create mode 100644 packages/calckey-js/markdown/calckey-js.notificationtypes.md create mode 100644 packages/calckey-js/markdown/calckey-js.permissions.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream._constructor_.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream.close.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream.removesharedconnection.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream.send.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream.state.md create mode 100644 packages/calckey-js/markdown/calckey-js.stream.usechannel.md create mode 100644 packages/calckey-js/markdown/index.md delete mode 100644 packages/calckey-js/package-lock.json diff --git a/packages/calckey-js/README.md b/packages/calckey-js/README.md index b7a699285b..0aef8d6b0d 100644 --- a/packages/calckey-js/README.md +++ b/packages/calckey-js/README.md @@ -4,4 +4,6 @@ Fork of Misskey.js for Calckey https://www.npmjs.com/package/calckey-js - \ No newline at end of file +To fully build, run `pnpm i && pnpm run render`. + + diff --git a/packages/calckey-js/etc/calckey-js.api.json b/packages/calckey-js/etc/calckey-js.api.json new file mode 100644 index 0000000000..524ae3b2eb --- /dev/null +++ b/packages/calckey-js/etc/calckey-js.api.json @@ -0,0 +1,9814 @@ +{ + "metadata": { + "toolPackage": "@microsoft/api-extractor", + "toolVersion": "7.36.0", + "schemaVersion": 1011, + "oldestForwardsCompatibleVersion": 1001, + "tsdocConfig": { + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "noStandardTags": true, + "tagDefinitions": [ + { + "tagName": "@alpha", + "syntaxKind": "modifier" + }, + { + "tagName": "@beta", + "syntaxKind": "modifier" + }, + { + "tagName": "@defaultValue", + "syntaxKind": "block" + }, + { + "tagName": "@decorator", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@deprecated", + "syntaxKind": "block" + }, + { + "tagName": "@eventProperty", + "syntaxKind": "modifier" + }, + { + "tagName": "@example", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@experimental", + "syntaxKind": "modifier" + }, + { + "tagName": "@inheritDoc", + "syntaxKind": "inline" + }, + { + "tagName": "@internal", + "syntaxKind": "modifier" + }, + { + "tagName": "@label", + "syntaxKind": "inline" + }, + { + "tagName": "@link", + "syntaxKind": "inline", + "allowMultiple": true + }, + { + "tagName": "@override", + "syntaxKind": "modifier" + }, + { + "tagName": "@packageDocumentation", + "syntaxKind": "modifier" + }, + { + "tagName": "@param", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@privateRemarks", + "syntaxKind": "block" + }, + { + "tagName": "@public", + "syntaxKind": "modifier" + }, + { + "tagName": "@readonly", + "syntaxKind": "modifier" + }, + { + "tagName": "@remarks", + "syntaxKind": "block" + }, + { + "tagName": "@returns", + "syntaxKind": "block" + }, + { + "tagName": "@sealed", + "syntaxKind": "modifier" + }, + { + "tagName": "@see", + "syntaxKind": "block" + }, + { + "tagName": "@throws", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@typeParam", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@virtual", + "syntaxKind": "modifier" + }, + { + "tagName": "@betaDocumentation", + "syntaxKind": "modifier" + }, + { + "tagName": "@internalRemarks", + "syntaxKind": "block" + }, + { + "tagName": "@preapproved", + "syntaxKind": "modifier" + } + ], + "supportForTags": { + "@alpha": true, + "@beta": true, + "@defaultValue": true, + "@decorator": true, + "@deprecated": true, + "@eventProperty": true, + "@example": true, + "@experimental": true, + "@inheritDoc": true, + "@internal": true, + "@label": true, + "@link": true, + "@override": true, + "@packageDocumentation": true, + "@param": true, + "@privateRemarks": true, + "@public": true, + "@readonly": true, + "@remarks": true, + "@returns": true, + "@sealed": true, + "@see": true, + "@throws": true, + "@typeParam": true, + "@virtual": true, + "@betaDocumentation": true, + "@internalRemarks": true, + "@preapproved": true + }, + "reportUnsupportedHtmlElements": false + } + }, + "kind": "Package", + "canonicalReference": "calckey-js!", + "docComment": "", + "name": "calckey-js", + "preserveMemberOrder": false, + "members": [ + { + "kind": "EntryPoint", + "canonicalReference": "calckey-js!", + "name": "", + "preserveMemberOrder": false, + "members": [ + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Acct:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Acct = " + }, + { + "kind": "Content", + "text": "{\n\tusername: string;\n\thost: string | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/acct.ts", + "releaseTag": "Public", + "name": "Acct", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Namespace", + "canonicalReference": "calckey-js!api:namespace", + "docComment": "", + "excerptTokens": [], + "fileUrlPath": "src/index.ts", + "releaseTag": "None", + "name": "api", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Class", + "canonicalReference": "calckey-js!api.APIClient:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare class APIClient " + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "isAbstract": false, + "name": "APIClient", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!api.APIClient:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `APIClient` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(opts: " + }, + { + "kind": "Content", + "text": "{\n\t\torigin: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"origin\"];\n\t\tcredential?: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"credential\"];\n\t\tfetch?: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"fetch\"] | null | undefined;\n\t}" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "opts", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 8 + }, + "isOptional": false + } + ] + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#credential:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "credential: " + }, + { + "kind": "Content", + "text": "string | null | undefined" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "credential", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#fetch:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "fetch: " + }, + { + "kind": "Reference", + "text": "FetchLike", + "canonicalReference": "calckey-js!api.FetchLike:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "fetch", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#origin:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "origin: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "origin", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!api.APIClient#request:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "request<E extends " + }, + { + "kind": "Content", + "text": "keyof " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": ", P extends " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"req\"]" + }, + { + "kind": "Content", + "text": ">(\n\t\tendpoint: " + }, + { + "kind": "Content", + "text": "E" + }, + { + "kind": "Content", + "text": ",\n\t\tparams?: " + }, + { + "kind": "Content", + "text": "P" + }, + { + "kind": "Content", + "text": ",\n\t\tcredential?: " + }, + { + "kind": "Content", + "text": "string | null | undefined" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<\n\t\t" + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"] extends {\n\t\t\t$switch: {\n\t\t\t\t$cases: [any, any][];\n\t\t\t\t$default: any;\n\t\t\t};\n\t\t}\n\t\t\t? " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 0> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 0>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 1> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 1>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 2> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 2>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 3> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 3>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 4> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 4>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 5> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 5>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 6> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 6>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 7> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 7>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 8> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 8>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 9> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 9>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"][\"$switch\"][\"$default\"]\n\t\t\t: " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"]\n\t>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "E", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + }, + { + "typeParameterName": "P", + "constraintTokenRange": { + "startIndex": 4, + "endIndex": 6 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 13, + "endIndex": 61 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "endpoint", + "parameterTypeTokenRange": { + "startIndex": 7, + "endIndex": 8 + }, + "isOptional": false + }, + { + "parameterName": "params", + "parameterTypeTokenRange": { + "startIndex": 9, + "endIndex": 10 + }, + "isOptional": true + }, + { + "parameterName": "credential", + "parameterTypeTokenRange": { + "startIndex": 11, + "endIndex": 12 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "request" + } + ], + "implementsTokenRanges": [] + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!api.APIError:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type APIError = " + }, + { + "kind": "Content", + "text": "{\n\tid: string;\n\tcode: string;\n\tmessage: string;\n\tkind: \"client\" | \"server\";\n\tinfo: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "name": "APIError", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!api.FetchLike:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FetchLike = " + }, + { + "kind": "Content", + "text": "(\n\tinput: string,\n\tinit?: {\n\t\tmethod?: string;\n\t\tbody?: string;\n\t\tcredentials?: " + }, + { + "kind": "Reference", + "text": "RequestCredentials", + "canonicalReference": "!RequestCredentials:type" + }, + { + "kind": "Content", + "text": ";\n\t\tcache?: " + }, + { + "kind": "Reference", + "text": "RequestCache", + "canonicalReference": "!RequestCache:type" + }, + { + "kind": "Content", + "text": ";\n\t},\n) => " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<{\n\tstatus: number;\n\tjson(): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<any>;\n}>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "name": "FetchLike", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "Function", + "canonicalReference": "calckey-js!api.isAPIError:function(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare function isAPIError(reason: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "reason", + "canonicalReference": "calckey-js!~reason" + }, + { + "kind": "Content", + "text": " is " + }, + { + "kind": "Reference", + "text": "APIError", + "canonicalReference": "calckey-js!api.APIError:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 6 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "reason", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "name": "isAPIError" + } + ] + }, + { + "kind": "Class", + "canonicalReference": "calckey-js!ChannelConnection:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare abstract class Connection<\n\tChannel extends " + }, + { + "kind": "Reference", + "text": "AnyOf", + "canonicalReference": "calckey-js!~AnyOf:type" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": ">" + }, + { + "kind": "Content", + "text": " = " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ",\n> extends " + }, + { + "kind": "Reference", + "text": "EventEmitter", + "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" + }, + { + "kind": "Content", + "text": "<Channel[\"events\"]>" + }, + { + "kind": "Content", + "text": " " + } + ], + "fileUrlPath": "src/streaming.ts", + "releaseTag": "Public", + "typeParameters": [ + { + "typeParameterName": "Channel", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "defaultTypeTokenRange": { + "startIndex": 6, + "endIndex": 7 + } + } + ], + "isAbstract": true, + "name": "ChannelConnection", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!ChannelConnection:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `Connection` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(stream: " + }, + { + "kind": "Reference", + "text": "Stream", + "canonicalReference": "calckey-js!Stream:class" + }, + { + "kind": "Content", + "text": ", channel: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ", name?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "stream", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "channel", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": true + } + ] + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#channel:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "channel: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "channel", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!ChannelConnection#dispose:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract dispose(): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [], + "isOptional": false, + "isAbstract": true, + "name": "dispose" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#id:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract id: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "id", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": true + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#inCount:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "inCount: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "inCount", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#name:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "name?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "name", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#outCount:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "outCount: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "outCount", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!ChannelConnection#send:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "send<T extends " + }, + { + "kind": "Content", + "text": "keyof Channel[\"receives\"]" + }, + { + "kind": "Content", + "text": ">(\n\t\ttype: " + }, + { + "kind": "Content", + "text": "T" + }, + { + "kind": "Content", + "text": ",\n\t\tbody: " + }, + { + "kind": "Content", + "text": "Channel[\"receives\"][T]" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "T", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 7, + "endIndex": 8 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "type", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "body", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#stream:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "protected stream: " + }, + { + "kind": "Reference", + "text": "Stream", + "canonicalReference": "calckey-js!Stream:class" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "stream", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": true, + "isAbstract": false + } + ], + "extendsTokenRange": { + "startIndex": 8, + "endIndex": 10 + }, + "implementsTokenRanges": [] + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Channels:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Channels = " + }, + { + "kind": "Content", + "text": "{\n\tmain: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnotification: (payload: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tmention: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treply: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\trenote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tfollow: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tfollowed: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunfollow: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tmeUpdated: (payload: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tpageEvent: (payload: " + }, + { + "kind": "Reference", + "text": "PageEvent", + "canonicalReference": "calckey-js!entities.PageEvent:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\turlUploadFinished: (payload: {\n\t\t\t\tmarker: string;\n\t\t\t\tfile: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t}) => void;\n\t\t\treadAllNotifications: () => void;\n\t\t\tunreadNotification: (payload: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunreadMention: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadMentions: () => void;\n\t\t\tunreadSpecifiedNote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadSpecifiedNotes: () => void;\n\t\t\treadAllMessagingMessages: () => void;\n\t\t\tmessagingMessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunreadMessagingMessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAllAntennas: () => void;\n\t\t\tunreadAntenna: (payload: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAllAnnouncements: () => void;\n\t\t\treadAllChannels: () => void;\n\t\t\tunreadChannel: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\tmyTokenRegenerated: () => void;\n\t\t\treversiNoInvites: () => void;\n\t\t\treversiInvited: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tsignin: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tregistryUpdated: (payload: {\n\t\t\t\tscope?: string[];\n\t\t\t\tkey: string;\n\t\t\t\tvalue: any | null;\n\t\t\t}) => void;\n\t\t\tdriveFileCreated: (payload: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAntenna: (payload: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thomeTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tlocalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thybridTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\trecommendedTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tglobalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tantenna: {\n\t\tparams: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tmessaging: {\n\t\tparams: {\n\t\t\totherparty?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tgroup?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tevents: {\n\t\t\tmessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tdeleted: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\tread: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"][]) => void;\n\t\t\ttypers: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[]) => void;\n\t\t};\n\t\treceives: {\n\t\t\tread: {\n\t\t\t\tid: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\t};\n\t\t};\n\t};\n\tserverStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n\tqueueStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/streaming.types.ts", + "releaseTag": "Public", + "name": "Channels", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 76 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Endpoints:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Endpoints = " + }, + { + "kind": "Content", + "text": "{\n\t\"admin/abuse-user-reports\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/delete-all-files-of-a-user\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/delete-logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\t\"admin/get-index-stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/get-table-stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/invite\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/meta\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/reset-password\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/resolve-abuse-user-report\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/resync-chart\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/send-email\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/server-info\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-moderation-logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/silence-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/suspend-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/unsilence-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/unsuspend-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/update-meta\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/vacuum\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/accounts/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/delete\": {\n\t\treq: {\n\t\t\tid: " + }, + { + "kind": "Reference", + "text": "Ad", + "canonicalReference": "calckey-js!entities.Ad:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/ad/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/delete\": {\n\t\treq: {\n\t\t\tid: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/announcements/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/clean-remote-files\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/cleanup\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/files\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/show-file\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/copy\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/list-remote\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/delete-all-files\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/federation/refresh-remote-instance-metadata\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/remove-all-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/update-instance\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/moderators/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/moderators/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/promo/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/clear\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/deliver-delayed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/inbox-delayed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/jobs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tannouncements: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\twithUnreads?: boolean;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/delete\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"antennas/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/notes\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/show\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/mark-read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"ap/get\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\t};\n\t\"ap/show\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres:\n\t\t\t| {\n\t\t\t\t\ttype: \"Note\";\n\t\t\t\t\tobject: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\ttype: \"User\";\n\t\t\t\t\tobject: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t };\n\t};\n\t\"app/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"app/show\": {\n\t\treq: {\n\t\t\tappId: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"auth/accept\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"auth/session/generate\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t};\n\t\tres: {\n\t\t\ttoken: string;\n\t\t\turl: string;\n\t\t};\n\t};\n\t\"auth/session/show\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "AuthSession", + "canonicalReference": "calckey-js!entities.AuthSession:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"auth/session/userkey\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t\ttoken: string;\n\t\t};\n\t\tres: {\n\t\t\taccessToken: string;\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"blocking/create\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"blocking/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"blocking/list\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"channels/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/follow\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/followed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/owned\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/pin-note\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/timeline\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/unfollow\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/active-users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/federation\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tinstance: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/hashtag\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/instance\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\tdrive: {\n\t\t\t\tdecFiles: number[];\n\t\t\t\tdecUsage: number[];\n\t\t\t\tincFiles: number[];\n\t\t\t\tincUsage: number[];\n\t\t\t\ttotalFiles: number[];\n\t\t\t\ttotalUsage: number[];\n\t\t\t};\n\t\t\tfollowers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tfollowing: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tnotes: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\trequests: {\n\t\t\t\tfailed: number[];\n\t\t\t\treceived: number[];\n\t\t\t\tsucceeded: number[];\n\t\t\t};\n\t\t\tusers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/network\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdecCount: number[];\n\t\t\tdecSize: number[];\n\t\t\tincCount: number[];\n\t\t\tincSize: number[];\n\t\t\ttotalCount: number[];\n\t\t\ttotalSize: number[];\n\t\t};\n\t};\n\t\"charts/user/following\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/user/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdec: number[];\n\t\t\tinc: number[];\n\t\t\ttotal: number[];\n\t\t\tdiffs: {\n\t\t\t\tnormal: number[];\n\t\t\t\trenote: number[];\n\t\t\t\treply: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/reactions\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"clips/add-note\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/delete\": {\n\t\treq: {\n\t\t\tclipId: " + }, + { + "kind": "Reference", + "text": "Clip", + "canonicalReference": "calckey-js!entities.Clip:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"clips/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tdrive: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcapacity: number;\n\t\t\tusage: number;\n\t\t};\n\t};\n\t\"drive/files\": {\n\t\treq: {\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\ttype?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/files/attached-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/check-existence\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/delete\": {\n\t\treq: {\n\t\t\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/files/find-by-hash\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/files/show\": {\n\t\treq: {\n\t\t\tfileId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\turl?: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/update\": {\n\t\treq: {\n\t\t\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tname?: string;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/upload-from-url\": {\n\t\treq: {\n\t\t\turl: string;\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t\tmarker?: string | null;\n\t\t\tforce?: boolean;\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders\": {\n\t\treq: {\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/folders/create\": {\n\t\treq: {\n\t\t\tname?: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/folders/delete\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/folders/show\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/folders/update\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/stream\": {\n\t\treq: {\n\t\t\ttype?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\tendpoint: {\n\t\treq: {\n\t\t\tendpoint: string;\n\t\t};\n\t\tres: {\n\t\t\tparams: {\n\t\t\t\tname: string;\n\t\t\t\ttype: string;\n\t\t\t}[];\n\t\t};\n\t};\n\tendpoints: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: string[];\n\t};\n\t\"federation/dns\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\ta: string[];\n\t\t\taaaa: string[];\n\t\t\tcname: string[];\n\t\t\ttxt: string[];\n\t\t};\n\t};\n\t\"federation/followers\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/following\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/instances\": {\n\t\treq: {\n\t\t\thost?: string | null;\n\t\t\tblocked?: boolean | null;\n\t\t\tnotResponding?: boolean | null;\n\t\t\tsuspended?: boolean | null;\n\t\t\tfederating?: boolean | null;\n\t\t\tsubscribing?: boolean | null;\n\t\t\tpublishing?: boolean | null;\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?:\n\t\t\t\t| \"+pubSub\"\n\t\t\t\t| \"-pubSub\"\n\t\t\t\t| \"+notes\"\n\t\t\t\t| \"-notes\"\n\t\t\t\t| \"+users\"\n\t\t\t\t| \"-users\"\n\t\t\t\t| \"+following\"\n\t\t\t\t| \"-following\"\n\t\t\t\t| \"+followers\"\n\t\t\t\t| \"-followers\"\n\t\t\t\t| \"+caughtAt\"\n\t\t\t\t| \"-caughtAt\"\n\t\t\t\t| \"+lastCommunicatedAt\"\n\t\t\t\t| \"-lastCommunicatedAt\"\n\t\t\t\t| \"+driveUsage\"\n\t\t\t\t| \"-driveUsage\"\n\t\t\t\t| \"+driveFiles\"\n\t\t\t\t| \"-driveFiles\";\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/show-instance\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"federation/update-remote-user\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"federation/users\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"following/create\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/requests/accept\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"following/requests/cancel\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/requests/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowRequest", + "canonicalReference": "calckey-js!entities.FollowRequest:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"following/requests/reject\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/popular\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/delete\": {\n\t\treq: {\n\t\t\tpostId: " + }, + { + "kind": "Reference", + "text": "GalleryPost", + "canonicalReference": "calckey-js!entities.GalleryPost:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/posts/like\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/unlike\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games/surrender\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/invitations\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/match\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/match/cancel\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"get-online-users-count\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcount: number;\n\t\t};\n\t};\n\t\"hashtags/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/trend\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\ti: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/authorized-apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/change-password\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/delete-account\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/export-blocking\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-mute\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-user-lists\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/favorites\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/gallery/likes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/get-word-muted-notes-count\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/import-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/import-user-lists\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/move\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/known-as\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/notifications\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tfollowing?: boolean;\n\t\t\tmarkAsRead?: boolean;\n\t\t\tincludeTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t\texcludeTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/page-likes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/pages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/pin\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-all-messaging-messages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-all-unread-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-announcement\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/regenerate-token\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/get-all\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\t};\n\t\"i/registry/get-detail\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: {\n\t\t\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tvalue: any;\n\t\t};\n\t};\n\t\"i/registry/get\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: any;\n\t};\n\t\"i/registry/keys-with-type\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<\n\t\t\tstring,\n\t\t\t\"null\" | \"array\" | \"number\" | \"string\" | \"boolean\" | \"object\"\n\t\t>;\n\t};\n\t\"i/registry/keys\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: string[];\n\t};\n\t\"i/registry/remove\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/scopes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: string[][];\n\t};\n\t\"i/registry/set\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tvalue: any;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/revoke-token\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/signin-history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/unpin\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/update-email\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t\temail?: string | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/update\": {\n\t\treq: {\n\t\t\tname?: string | null;\n\t\t\tdescription?: string | null;\n\t\t\tlang?: string | null;\n\t\t\tlocation?: string | null;\n\t\t\tbirthday?: string | null;\n\t\t\tavatarId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tbannerId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tfields?: {\n\t\t\t\tname: string;\n\t\t\t\tvalue: string;\n\t\t\t}[];\n\t\t\tisLocked?: boolean;\n\t\t\tisExplorable?: boolean;\n\t\t\thideOnlineStatus?: boolean;\n\t\t\tcarefulBot?: boolean;\n\t\t\tautoAcceptFollowed?: boolean;\n\t\t\tnoCrawle?: boolean;\n\t\t\tpreventAiLearning?: boolean;\n\t\t\tisBot?: boolean;\n\t\t\tisCat?: boolean;\n\t\t\tinjectFeaturedNote?: boolean;\n\t\t\treceiveAnnouncementEmail?: boolean;\n\t\t\talwaysMarkNsfw?: boolean;\n\t\t\tmutedWords?: string[][];\n\t\t\tmutingNotificationTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t\temailNotificationTypes?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/user-group-invites\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/done\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/key-done\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/password-less\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/register-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/register\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/update-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/remove-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/unregister\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"messaging/history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tgroup?: boolean;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"messaging/messages\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tgroupId?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tmarkAsRead?: boolean;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"messaging/messages/create\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tgroupId?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\ttext?: string;\n\t\t\tfileId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"messaging/messages/delete\": {\n\t\treq: {\n\t\t\tmessageId: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"messaging/messages/read\": {\n\t\treq: {\n\t\t\tmessageId: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\tmeta: {\n\t\treq: {\n\t\t\tdetail?: boolean;\n\t\t};\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: boolean;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": " | " + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"miauth/gen-token\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"mute/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"mute/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"renote-mute/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"renote-mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"renote-mute/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"my/apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tnotes: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/children\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/clips\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/conversation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoteSubmitReq", + "canonicalReference": "calckey-js!~NoteSubmitReq:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"notes/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/edit\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoteSubmitReq", + "canonicalReference": "calckey-js!~NoteSubmitReq:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"notes/favorites/create\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/favorites/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/global-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/recommended-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/hybrid-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/local-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/mentions\": {\n\t\treq: {\n\t\t\tfollowing?: boolean;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/polls/recommendation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/polls/vote\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tchoice: number;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\ttype?: string | null;\n\t\t\tlimit?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "NoteReaction", + "canonicalReference": "calckey-js!entities.NoteReaction:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/reactions/create\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\treaction: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/renotes\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/replies\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/search-by-tag\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/show\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/state\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/unrenote\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/user-list-timeline\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/watching/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/watching/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/create\": {\n\t\treq: {\n\t\t\tbody: string;\n\t\t\theader?: string | null;\n\t\t\ticon?: string | null;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/mark-all-as-read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\t\"notifications/read\": {\n\t\treq: {\n\t\t\tnotificationId: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"page-push\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tevent: string;\n\t\t\tvar?: any;\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"pages/delete\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"pages/like\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/show\": {\n\t\treq: {\n\t\t\tpageId?: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tusername?: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"pages/unlike\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\tping: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tpong: number;\n\t\t};\n\t};\n\t\"pinned-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"promo/read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"request-reset-password\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t\temail: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"reset-password\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"room/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"room/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tstats: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Stats", + "canonicalReference": "calckey-js!entities.Stats:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"server-info\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "ServerInfo", + "canonicalReference": "calckey-js!entities.ServerInfo:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"latest-version\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"sw/register\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"username/available\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t};\n\t\tres: {\n\t\t\tavailable: boolean;\n\t\t};\n\t};\n\tusers: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?: " + }, + { + "kind": "Reference", + "text": "UserSorting", + "canonicalReference": "calckey-js!entities.UserSorting:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\torigin?: " + }, + { + "kind": "Reference", + "text": "OriginType", + "canonicalReference": "calckey-js!entities.OriginType:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/clips\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/followers\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tusername?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"username\"];\n\t\t\thost?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFollowerPopulated", + "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/following\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tusername?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"username\"];\n\t\t\thost?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/get-frequently-replied-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/delete\": {\n\t\treq: {\n\t\t\tgroupId: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/groups/invitations/accept\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/invitations/reject\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/invite\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/joined\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/owned\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/pull\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/transfer\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/create\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/delete\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/lists/pull\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/push\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/show\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/update\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/notes\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/pages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/recommendation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/relation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/report-abuse\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/search-by-username-and-host\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/show\": {\n\t\treq:\n\t\t\t| " + }, + { + "kind": "Reference", + "text": "ShowUserReq", + "canonicalReference": "calckey-js!~ShowUserReq:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t| {\n\t\t\t\t\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\t\t\t };\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": "[],\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"users/stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.types.ts", + "releaseTag": "Public", + "name": "Endpoints", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 1158 + } + }, + { + "kind": "Namespace", + "canonicalReference": "calckey-js!entities:namespace", + "docComment": "", + "excerptTokens": [], + "fileUrlPath": "src/index.ts", + "releaseTag": "None", + "name": "entities", + "preserveMemberOrder": false, + "members": [ + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Ad:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Ad = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Ad", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Announcement:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Announcement = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\ttext: string;\n\ttitle: string;\n\timageUrl: string | null;\n\tisRead?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Announcement", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Antenna:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Antenna = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tname: string;\n\tkeywords: string[][];\n\texcludeKeywords: string[][];\n\tsrc: \"home\" | \"all\" | \"users\" | \"list\" | \"group\" | \"instances\";\n\tuserListId: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": " | null;\n\tuserGroupId: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": " | null;\n\tusers: string[];\n\tinstances: string[];\n\tcaseSensitive: boolean;\n\tnotify: boolean;\n\twithReplies: boolean;\n\twithFile: boolean;\n\thasUnreadNote: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Antenna", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.App:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type App = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "App", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.AuthSession:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type AuthSession = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tapp: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\ttoken: string;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "AuthSession", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 6 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Blocking:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Blocking = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tblockeeId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tblockee: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Blocking", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Channel:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Channel = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Channel", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Clip:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Clip = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Clip", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.CustomEmoji:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type CustomEmoji = " + }, + { + "kind": "Content", + "text": "{\n\tid: string;\n\tname: string;\n\turl: string;\n\tcategory: string;\n\taliases: string[];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "CustomEmoji", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DateString:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DateString = " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DateString", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DetailedInstanceMetadata = " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": " & {\n\tfeatures: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DetailedInstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DriveFile:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DriveFile = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisSensitive: boolean;\n\tname: string;\n\tthumbnailUrl: string;\n\turl: string;\n\ttype: string;\n\tsize: number;\n\tmd5: string;\n\tblurhash: string;\n\tcomment: string | null;\n\tproperties: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DriveFile", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DriveFolder:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DriveFolder = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DriveFolder", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Following:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Following = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tfollowerId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tfolloweeId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Following", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowingFolloweePopulated = " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": " & {\n\tfollowee: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowingFolloweePopulated", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowingFollowerPopulated = " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": " & {\n\tfollower: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowingFollowerPopulated", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowRequest:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowRequest = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tfollower: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tfollowee: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowRequest", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.GalleryPost:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type GalleryPost = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "GalleryPost", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.ID:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type ID = " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "ID", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Instance:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Instance = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcaughtAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\thost: string;\n\tusersCount: number;\n\tnotesCount: number;\n\tfollowingCount: number;\n\tfollowersCount: number;\n\tdriveUsage: number;\n\tdriveFiles: number;\n\tlatestRequestSentAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\tlatestStatus: number | null;\n\tlatestRequestReceivedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\tlastCommunicatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisNotResponding: boolean;\n\tisSuspended: boolean;\n\tsoftwareName: string | null;\n\tsoftwareVersion: string | null;\n\topenRegistrations: boolean | null;\n\tname: string | null;\n\tdescription: string | null;\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\ticonUrl: string | null;\n\tfaviconUrl: string | null;\n\tthemeColor: string | null;\n\tinfoUpdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Instance", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 14 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.InstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type InstanceMetadata =\n\t" + }, + { + "kind": "Content", + "text": "| " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": "\n\t| " + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "InstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type LiteInstanceMetadata = " + }, + { + "kind": "Content", + "text": "{\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\tversion: string;\n\tname: string | null;\n\turi: string;\n\tdescription: string | null;\n\ttosUrl: string | null;\n\tdisableRegistration: boolean;\n\tdisableLocalTimeline: boolean;\n\tdisableRecommendedTimeline: boolean;\n\tdisableGlobalTimeline: boolean;\n\tdriveCapacityPerLocalUserMb: number;\n\tdriveCapacityPerRemoteUserMb: number;\n\tenableHcaptcha: boolean;\n\thcaptchaSiteKey: string | null;\n\tenableRecaptcha: boolean;\n\trecaptchaSiteKey: string | null;\n\tswPublickey: string | null;\n\tmaxNoteTextLength: number;\n\tenableEmail: boolean;\n\tenableTwitterIntegration: boolean;\n\tenableGithubIntegration: boolean;\n\tenableDiscordIntegration: boolean;\n\tenableServiceWorker: boolean;\n\temojis: " + }, + { + "kind": "Reference", + "text": "CustomEmoji", + "canonicalReference": "calckey-js!entities.CustomEmoji:type" + }, + { + "kind": "Content", + "text": "[];\n\tads: {\n\t\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\t\tratio: number;\n\t\tplace: string;\n\t\turl: string;\n\t\timageUrl: string;\n\t}[];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "LiteInstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 6 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.MeDetailed:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type MeDetailed = " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": " & {\n\tavatarId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tbannerId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tautoAcceptFollowed: boolean;\n\talwaysMarkNsfw: boolean;\n\tcarefulBot: boolean;\n\temailNotificationTypes: string[];\n\thasPendingReceivedFollowRequest: boolean;\n\thasUnreadAnnouncement: boolean;\n\thasUnreadAntenna: boolean;\n\thasUnreadChannel: boolean;\n\thasUnreadMentions: boolean;\n\thasUnreadMessagingMessage: boolean;\n\thasUnreadNotification: boolean;\n\thasUnreadSpecifiedNotes: boolean;\n\thideOnlineStatus: boolean;\n\tinjectFeaturedNote: boolean;\n\tintegrations: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\tisDeleted: boolean;\n\tisExplorable: boolean;\n\tmutedWords: string[][];\n\tmutingNotificationTypes: string[];\n\tnoCrawle: boolean;\n\tpreventAiLearning: boolean;\n\treceiveAnnouncementEmail: boolean;\n\tusePasswordLessLogin: boolean;\n\t[other: string]: any;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "MeDetailed", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 9 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.MessagingMessage:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type MessagingMessage = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tfile: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": " | null;\n\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\tisRead: boolean;\n\treads: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\ttext: string | null;\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\trecipient?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": " | null;\n\trecipientId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\tgroup?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": " | null;\n\tgroupId: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "MessagingMessage", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 24 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Note:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Note = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\ttext: string | null;\n\tcw: string | null;\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\treply?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\treplyId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\trenote?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\trenoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tfiles: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\tfileIds: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\tvisibility: \"public\" | \"home\" | \"followers\" | \"specified\";\n\tvisibleUserIds?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\tlocalOnly?: boolean;\n\tchannel?: " + }, + { + "kind": "Reference", + "text": "Channel", + "canonicalReference": "calckey-js!entities.Channel:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tmyReaction?: string;\n\treactions: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, number>;\n\trenoteCount: number;\n\trepliesCount: number;\n\tpoll?: {\n\t\texpiresAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\t\tmultiple: boolean;\n\t\tchoices: {\n\t\t\tisVoted: boolean;\n\t\t\ttext: string;\n\t\t\tvotes: number;\n\t\t}[];\n\t};\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\turi?: string;\n\turl?: string;\n\tupdatedAt?: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisHidden?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Note", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 32 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.NoteFavorite:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type NoteFavorite = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "NoteFavorite", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.NoteReaction:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type NoteReaction = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tuser: " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": ";\n\ttype: string;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "NoteReaction", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Notification:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Notification = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisRead: boolean;\n} & (\n\t| {\n\t\t\ttype: \"reaction\";\n\t\t\treaction: string;\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"reply\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"renote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"quote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"mention\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"pollVote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"follow\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"followRequestAccepted\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"receiveFollowRequest\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"groupInvited\";\n\t\t\tinvitation: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"app\";\n\t\t\theader?: string | null;\n\t\t\tbody: string;\n\t\t\ticon?: string | null;\n\t }\n)" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Notification", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 60 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.OriginType:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type OriginType = " + }, + { + "kind": "Content", + "text": "\"combined\" | \"local\" | \"remote\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "OriginType", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Page:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Page = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tcontent: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>[];\n\tvariables: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>[];\n\ttitle: string;\n\tname: string;\n\tsummary: string | null;\n\thideTitleWhenPinned: boolean;\n\talignCenter: boolean;\n\tfont: string;\n\tscript: string;\n\teyeCatchingImageId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\teyeCatchingImage: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": " | null;\n\tattachedFiles: any;\n\tlikedCount: number;\n\tisLiked?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Page", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 20 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.PageEvent:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type PageEvent = " + }, + { + "kind": "Content", + "text": "{\n\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tevent: string;\n\tvar: any;\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "PageEvent", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.ServerInfo:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type ServerInfo = " + }, + { + "kind": "Content", + "text": "{\n\tmachine: string;\n\tcpu: {\n\t\tmodel: string;\n\t\tcores: number;\n\t};\n\tmem: {\n\t\ttotal: number;\n\t};\n\tfs: {\n\t\ttotal: number;\n\t\tused: number;\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "ServerInfo", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Signin:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Signin = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tip: string;\n\theaders: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\tsuccess: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Signin", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Stats:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Stats = " + }, + { + "kind": "Content", + "text": "{\n\tnotesCount: number;\n\toriginalNotesCount: number;\n\tusersCount: number;\n\toriginalUsersCount: number;\n\tinstances: number;\n\tdriveUsageLocal: number;\n\tdriveUsageRemote: number;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Stats", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.User:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type User = " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": " | " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "User", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserDetailed:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserDetailed = " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": " & {\n\tbannerBlurhash: string | null;\n\tbannerColor: string | null;\n\tbannerUrl: string | null;\n\tbirthday: string | null;\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tdescription: string | null;\n\tffVisibility: \"public\" | \"followers\" | \"private\";\n\tfields: {\n\t\tname: string;\n\t\tvalue: string;\n\t}[];\n\tfollowersCount: number;\n\tfollowingCount: number;\n\thasPendingFollowRequestFromYou: boolean;\n\thasPendingFollowRequestToYou: boolean;\n\tisAdmin: boolean;\n\tisBlocked: boolean;\n\tisBlocking: boolean;\n\tisBot: boolean;\n\tisCat: boolean;\n\tisFollowed: boolean;\n\tisFollowing: boolean;\n\tisLocked: boolean;\n\tisModerator: boolean;\n\tisMuted: boolean;\n\tisRenoteMuted: boolean;\n\tisSilenced: boolean;\n\tisSuspended: boolean;\n\tlang: string | null;\n\tlastFetchedAt?: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tlocation: string | null;\n\tnotesCount: number;\n\tpinnedNoteIds: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": "[];\n\tpinnedNotes: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\tpinnedPage: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": " | null;\n\tpinnedPageId: string | null;\n\tpublicReactions: boolean;\n\tsecurityKeys: boolean;\n\ttwoFactorEnabled: boolean;\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\turi: string | null;\n\turl: string | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserDetailed", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 15 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserGroup:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserGroup = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserGroup", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserList:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserList = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tname: string;\n\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserList", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserLite:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserLite = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tusername: string;\n\thost: string | null;\n\tname: string;\n\tonlineStatus: \"online\" | \"active\" | \"offline\" | \"unknown\";\n\tavatarUrl: string;\n\tavatarBlurhash: string;\n\talsoKnownAs: string[];\n\tmovedToUri: any;\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\tinstance?: {\n\t\tname: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"name\"];\n\t\tsoftwareName: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"softwareName\"];\n\t\tsoftwareVersion: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"softwareVersion\"];\n\t\ticonUrl: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"iconUrl\"];\n\t\tfaviconUrl: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"faviconUrl\"];\n\t\tthemeColor: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"themeColor\"];\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserLite", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 16 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserSorting:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserSorting =\n\t" + }, + { + "kind": "Content", + "text": "| \"+follower\"\n\t| \"-follower\"\n\t| \"+createdAt\"\n\t| \"-createdAt\"\n\t| \"+updatedAt\"\n\t| \"-updatedAt\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserSorting", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ] + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!ffVisibility:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "ffVisibility: " + }, + { + "kind": "Content", + "text": "readonly [\"public\", \"followers\", \"private\"]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "ffVisibility", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!mutedNoteReasons:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "mutedNoteReasons: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"word\",\n\t\"manual\",\n\t\"spam\",\n\t\"other\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "mutedNoteReasons", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!noteVisibilities:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "noteVisibilities: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"public\",\n\t\"home\",\n\t\"followers\",\n\t\"specified\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "noteVisibilities", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!notificationTypes:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "notificationTypes: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"follow\",\n\t\"mention\",\n\t\"reply\",\n\t\"renote\",\n\t\"quote\",\n\t\"reaction\",\n\t\"pollVote\",\n\t\"pollEnded\",\n\t\"receiveFollowRequest\",\n\t\"followRequestAccepted\",\n\t\"groupInvited\",\n\t\"app\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "notificationTypes", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!permissions:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "permissions: " + }, + { + "kind": "Content", + "text": "string[]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "permissions", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Class", + "canonicalReference": "calckey-js!Stream:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export default class Stream extends " + }, + { + "kind": "Reference", + "text": "EventEmitter", + "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "StreamEvents", + "canonicalReference": "calckey-js!~StreamEvents:type" + }, + { + "kind": "Content", + "text": ">" + }, + { + "kind": "Content", + "text": " " + } + ], + "fileUrlPath": "src/streaming.ts", + "releaseTag": "Public", + "isAbstract": false, + "name": "Stream", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!Stream:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `Stream` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(\n\t\torigin: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ",\n\t\tuser: " + }, + { + "kind": "Content", + "text": "{\n\t\t\ttoken: string;\n\t\t} | null" + }, + { + "kind": "Content", + "text": ",\n\t\toptions?: " + }, + { + "kind": "Content", + "text": "{\n\t\t\tWebSocket?: any;\n\t\t}" + }, + { + "kind": "Content", + "text": ",\n\t);" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "origin", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "user", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "options", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": true + } + ] + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#close:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "close(): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [], + "isOptional": false, + "isAbstract": false, + "name": "close" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#disconnectToChannel:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "disconnectToChannel(connection: " + }, + { + "kind": "Reference", + "text": "NonSharedConnection", + "canonicalReference": "calckey-js!~NonSharedConnection:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "connection", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "disconnectToChannel" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#removeSharedConnection:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "removeSharedConnection(connection: " + }, + { + "kind": "Reference", + "text": "SharedConnection", + "canonicalReference": "calckey-js!~SharedConnection:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "connection", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "removeSharedConnection" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#removeSharedConnectionPool:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "removeSharedConnectionPool(pool: " + }, + { + "kind": "Reference", + "text": "Pool", + "canonicalReference": "calckey-js!~Pool:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "pool", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "removeSharedConnectionPool" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#send:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "send(typeOrPayload: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ", payload?: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "typeOrPayload", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "payload", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!Stream#state:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "state: " + }, + { + "kind": "Content", + "text": "\"initializing\" | \"reconnecting\" | \"connected\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "state", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#useChannel:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "useChannel<C extends " + }, + { + "kind": "Content", + "text": "keyof " + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": ">(\n\t\tchannel: " + }, + { + "kind": "Content", + "text": "C" + }, + { + "kind": "Content", + "text": ",\n\t\tparams?: " + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": "[C][\"params\"]" + }, + { + "kind": "Content", + "text": ",\n\t\tname?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Reference", + "text": "Connection", + "canonicalReference": "calckey-js!ChannelConnection:class" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": "[C]>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "C", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 11, + "endIndex": 15 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "channel", + "parameterTypeTokenRange": { + "startIndex": 4, + "endIndex": 5 + }, + "isOptional": false + }, + { + "parameterName": "params", + "parameterTypeTokenRange": { + "startIndex": 6, + "endIndex": 8 + }, + "isOptional": true + }, + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 9, + "endIndex": 10 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "useChannel" + } + ], + "extendsTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "implementsTokenRanges": [] + } + ] + } + ] +} diff --git a/packages/calckey-js/etc/calckey-js.api.md b/packages/calckey-js/etc/calckey-js.api.md index 9e19852d4a..bb441fef87 100644 --- a/packages/calckey-js/etc/calckey-js.api.md +++ b/packages/calckey-js/etc/calckey-js.api.md @@ -8,42 +8,43 @@ import { EventEmitter } from 'eventemitter3'; // @public (undocumented) export type Acct = { - username: string; - host: string | null; + username: string; + host: string | null; }; -// Warning: (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "TODO_2" needs to be exported by the entry point index.d.ts // // @public (undocumented) type Ad = TODO_2; // @public (undocumented) type Announcement = { - id: ID; - createdAt: DateString; - updatedAt: DateString | null; - text: string; - title: string; - imageUrl: string | null; - isRead?: boolean; + id: ID; + createdAt: DateString; + updatedAt: DateString | null; + text: string; + title: string; + imageUrl: string | null; + isRead?: boolean; }; // @public (undocumented) type Antenna = { - id: ID; - createdAt: DateString; - name: string; - keywords: string[][]; - excludeKeywords: string[][]; - src: 'home' | 'all' | 'users' | 'list' | 'group'; - userListId: ID | null; - userGroupId: ID | null; - users: string[]; - caseSensitive: boolean; - notify: boolean; - withReplies: boolean; - withFile: boolean; - hasUnreadNote: boolean; + id: ID; + createdAt: DateString; + name: string; + keywords: string[][]; + excludeKeywords: string[][]; + src: "home" | "all" | "users" | "list" | "group" | "instances"; + userListId: ID | null; + userGroupId: ID | null; + users: string[]; + instances: string[]; + caseSensitive: boolean; + notify: boolean; + withReplies: boolean; + withFile: boolean; + hasUnreadNote: boolean; }; declare namespace api { @@ -58,36 +59,64 @@ export { api } // @public (undocumented) class APIClient { - constructor(opts: { - origin: APIClient['origin']; - credential?: APIClient['credential']; - fetch?: APIClient['fetch'] | null | undefined; - }); - // (undocumented) + constructor(opts: { + origin: APIClient["origin"]; + credential?: APIClient["credential"]; + fetch?: APIClient["fetch"] | null | undefined; + }); + // (undocumented) credential: string | null | undefined; - // (undocumented) + // (undocumented) fetch: FetchLike; - // (undocumented) + // (undocumented) origin: string; - // Warning: (ae-forgotten-export) The symbol "IsCaseMatched" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "IsCaseMatched" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "GetCaseResult" needs to be exported by the entry point index.d.ts // // (undocumented) - request<E extends keyof Endpoints, P extends Endpoints[E]['req']>(endpoint: E, params?: P, credential?: string | null | undefined): Promise<Endpoints[E]['res'] extends { - $switch: { - $cases: [any, any][]; - $default: any; - }; - } ? IsCaseMatched<E, P, 0> extends true ? GetCaseResult<E, P, 0> : IsCaseMatched<E, P, 1> extends true ? GetCaseResult<E, P, 1> : IsCaseMatched<E, P, 2> extends true ? GetCaseResult<E, P, 2> : IsCaseMatched<E, P, 3> extends true ? GetCaseResult<E, P, 3> : IsCaseMatched<E, P, 4> extends true ? GetCaseResult<E, P, 4> : IsCaseMatched<E, P, 5> extends true ? GetCaseResult<E, P, 5> : IsCaseMatched<E, P, 6> extends true ? GetCaseResult<E, P, 6> : IsCaseMatched<E, P, 7> extends true ? GetCaseResult<E, P, 7> : IsCaseMatched<E, P, 8> extends true ? GetCaseResult<E, P, 8> : IsCaseMatched<E, P, 9> extends true ? GetCaseResult<E, P, 9> : Endpoints[E]['res']['$switch']['$default'] : Endpoints[E]['res']>; + request<E extends keyof Endpoints, P extends Endpoints[E]["req"]>( + endpoint: E, + params?: P, + credential?: string | null | undefined, + ): Promise< + Endpoints[E]["res"] extends { + $switch: { + $cases: [any, any][]; + $default: any; + }; + } + ? IsCaseMatched<E, P, 0> extends true + ? GetCaseResult<E, P, 0> + : IsCaseMatched<E, P, 1> extends true + ? GetCaseResult<E, P, 1> + : IsCaseMatched<E, P, 2> extends true + ? GetCaseResult<E, P, 2> + : IsCaseMatched<E, P, 3> extends true + ? GetCaseResult<E, P, 3> + : IsCaseMatched<E, P, 4> extends true + ? GetCaseResult<E, P, 4> + : IsCaseMatched<E, P, 5> extends true + ? GetCaseResult<E, P, 5> + : IsCaseMatched<E, P, 6> extends true + ? GetCaseResult<E, P, 6> + : IsCaseMatched<E, P, 7> extends true + ? GetCaseResult<E, P, 7> + : IsCaseMatched<E, P, 8> extends true + ? GetCaseResult<E, P, 8> + : IsCaseMatched<E, P, 9> extends true + ? GetCaseResult<E, P, 9> + : Endpoints[E]["res"]["$switch"]["$default"] + : Endpoints[E]["res"] + >; } // @public (undocumented) type APIError = { - id: string; - code: string; - message: string; - kind: 'client' | 'server'; - info: Record<string, any>; + id: string; + code: string; + message: string; + kind: "client" | "server"; + info: Record<string, any>; }; // @public (undocumented) @@ -95,169 +124,183 @@ type App = TODO_2; // @public (undocumented) type AuthSession = { - id: ID; - app: App; - token: string; + id: ID; + app: App; + token: string; }; // @public (undocumented) type Blocking = { - id: ID; - createdAt: DateString; - blockeeId: User['id']; - blockee: UserDetailed; + id: ID; + createdAt: DateString; + blockeeId: User["id"]; + blockee: UserDetailed; }; // @public (undocumented) type Channel = { - id: ID; + id: ID; }; // Warning: (ae-forgotten-export) The symbol "AnyOf" needs to be exported by the entry point index.d.ts // // @public (undocumented) -export abstract class ChannelConnection<Channel extends AnyOf<Channels> = any> extends EventEmitter<Channel['events']> { - constructor(stream: Stream, channel: string, name?: string); - // (undocumented) +export abstract class ChannelConnection< + Channel extends AnyOf<Channels> = any, +> extends EventEmitter<Channel["events"]> { + constructor(stream: Stream, channel: string, name?: string); + // (undocumented) channel: string; - // (undocumented) + // (undocumented) abstract dispose(): void; - // (undocumented) + // (undocumented) abstract id: string; - // (undocumented) + // (undocumented) inCount: number; - // (undocumented) + // (undocumented) name?: string; - // (undocumented) + // (undocumented) outCount: number; - // (undocumented) - send<T extends keyof Channel['receives']>(type: T, body: Channel['receives'][T]): void; - // (undocumented) + // (undocumented) + send<T extends keyof Channel["receives"]>( + type: T, + body: Channel["receives"][T], + ): void; + // (undocumented) protected stream: Stream; } // @public (undocumented) export type Channels = { - main: { - params: null; - events: { - notification: (payload: Notification_2) => void; - mention: (payload: Note) => void; - reply: (payload: Note) => void; - renote: (payload: Note) => void; - follow: (payload: User) => void; - followed: (payload: User) => void; - unfollow: (payload: User) => void; - meUpdated: (payload: MeDetailed) => void; - pageEvent: (payload: PageEvent) => void; - urlUploadFinished: (payload: { - marker: string; - file: DriveFile; - }) => void; - readAllNotifications: () => void; - unreadNotification: (payload: Notification_2) => void; - unreadMention: (payload: Note['id']) => void; - readAllUnreadMentions: () => void; - unreadSpecifiedNote: (payload: Note['id']) => void; - readAllUnreadSpecifiedNotes: () => void; - readAllMessagingMessages: () => void; - messagingMessage: (payload: MessagingMessage) => void; - unreadMessagingMessage: (payload: MessagingMessage) => void; - readAllAntennas: () => void; - unreadAntenna: (payload: Antenna) => void; - readAllAnnouncements: () => void; - readAllChannels: () => void; - unreadChannel: (payload: Note['id']) => void; - myTokenRegenerated: () => void; - reversiNoInvites: () => void; - reversiInvited: (payload: FIXME) => void; - signin: (payload: FIXME) => void; - registryUpdated: (payload: { - scope?: string[]; - key: string; - value: any | null; - }) => void; - driveFileCreated: (payload: DriveFile) => void; - readAntenna: (payload: Antenna) => void; - }; - receives: null; - }; - homeTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - localTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - hybridTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - recommendedTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - globalTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - messaging: { - params: { - otherparty?: User['id'] | null; - group?: UserGroup['id'] | null; - }; - events: { - message: (payload: MessagingMessage) => void; - deleted: (payload: MessagingMessage['id']) => void; - read: (payload: MessagingMessage['id'][]) => void; - typers: (payload: User[]) => void; - }; - receives: { - read: { - id: MessagingMessage['id']; - }; - }; - }; - serverStats: { - params: null; - events: { - stats: (payload: FIXME) => void; - }; - receives: { - requestLog: { - id: string | number; - length: number; - }; - }; - }; - queueStats: { - params: null; - events: { - stats: (payload: FIXME) => void; - }; - receives: { - requestLog: { - id: string | number; - length: number; - }; - }; - }; + main: { + params: null; + events: { + notification: (payload: Notification_2) => void; + mention: (payload: Note) => void; + reply: (payload: Note) => void; + renote: (payload: Note) => void; + follow: (payload: User) => void; + followed: (payload: User) => void; + unfollow: (payload: User) => void; + meUpdated: (payload: MeDetailed) => void; + pageEvent: (payload: PageEvent) => void; + urlUploadFinished: (payload: { + marker: string; + file: DriveFile; + }) => void; + readAllNotifications: () => void; + unreadNotification: (payload: Notification_2) => void; + unreadMention: (payload: Note["id"]) => void; + readAllUnreadMentions: () => void; + unreadSpecifiedNote: (payload: Note["id"]) => void; + readAllUnreadSpecifiedNotes: () => void; + readAllMessagingMessages: () => void; + messagingMessage: (payload: MessagingMessage) => void; + unreadMessagingMessage: (payload: MessagingMessage) => void; + readAllAntennas: () => void; + unreadAntenna: (payload: Antenna) => void; + readAllAnnouncements: () => void; + readAllChannels: () => void; + unreadChannel: (payload: Note["id"]) => void; + myTokenRegenerated: () => void; + reversiNoInvites: () => void; + reversiInvited: (payload: FIXME) => void; + signin: (payload: FIXME) => void; + registryUpdated: (payload: { + scope?: string[]; + key: string; + value: any | null; + }) => void; + driveFileCreated: (payload: DriveFile) => void; + readAntenna: (payload: Antenna) => void; + }; + receives: null; + }; + homeTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + localTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + hybridTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + recommendedTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + globalTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + messaging: { + params: { + otherparty?: User["id"] | null; + group?: UserGroup["id"] | null; + }; + events: { + message: (payload: MessagingMessage) => void; + deleted: (payload: MessagingMessage["id"]) => void; + read: (payload: MessagingMessage["id"][]) => void; + typers: (payload: User[]) => void; + }; + receives: { + read: { + id: MessagingMessage["id"]; + }; + }; + }; + serverStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; + queueStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; }; // @public (undocumented) @@ -265,11 +308,11 @@ type Clip = TODO_2; // @public (undocumented) type CustomEmoji = { - id: string; - name: string; - url: string; - category: string; - aliases: string[]; + id: string; + name: string; + url: string; + category: string; + aliases: string[]; }; // @public (undocumented) @@ -277,23 +320,23 @@ type DateString = string; // @public (undocumented) type DetailedInstanceMetadata = LiteInstanceMetadata & { - features: Record<string, any>; + features: Record<string, any>; }; // @public (undocumented) type DriveFile = { - id: ID; - createdAt: DateString; - isSensitive: boolean; - name: string; - thumbnailUrl: string; - url: string; - type: string; - size: number; - md5: string; - blurhash: string; - comment: string | null; - properties: Record<string, any>; + id: ID; + createdAt: DateString; + isSensitive: boolean; + name: string; + thumbnailUrl: string; + url: string; + type: string; + size: number; + md5: string; + blurhash: string; + comment: string | null; + properties: Record<string, any>; }; // @public (undocumented) @@ -301,1862 +344,1903 @@ type DriveFolder = TODO_2; // @public (undocumented) export type Endpoints = { - 'admin/abuse-user-reports': { - req: TODO; - res: TODO; - }; - 'admin/delete-all-files-of-a-user': { - req: { - userId: User['id']; - }; - res: null; - }; - 'admin/delete-logs': { - req: NoParams; - res: null; - }; - 'admin/get-index-stats': { - req: TODO; - res: TODO; - }; - 'admin/get-table-stats': { - req: TODO; - res: TODO; - }; - 'admin/invite': { - req: TODO; - res: TODO; - }; - 'admin/logs': { - req: TODO; - res: TODO; - }; - 'admin/reset-password': { - req: TODO; - res: TODO; - }; - 'admin/resolve-abuse-user-report': { - req: TODO; - res: TODO; - }; - 'admin/resync-chart': { - req: TODO; - res: TODO; - }; - 'admin/send-email': { - req: TODO; - res: TODO; - }; - 'admin/server-info': { - req: TODO; - res: TODO; - }; - 'admin/show-moderation-logs': { - req: TODO; - res: TODO; - }; - 'admin/show-user': { - req: TODO; - res: TODO; - }; - 'admin/show-users': { - req: TODO; - res: TODO; - }; - 'admin/silence-user': { - req: TODO; - res: TODO; - }; - 'admin/suspend-user': { - req: TODO; - res: TODO; - }; - 'admin/unsilence-user': { - req: TODO; - res: TODO; - }; - 'admin/unsuspend-user': { - req: TODO; - res: TODO; - }; - 'admin/update-meta': { - req: TODO; - res: TODO; - }; - 'admin/vacuum': { - req: TODO; - res: TODO; - }; - 'admin/accounts/create': { - req: TODO; - res: TODO; - }; - 'admin/ad/create': { - req: TODO; - res: TODO; - }; - 'admin/ad/delete': { - req: { - id: Ad['id']; - }; - res: null; - }; - 'admin/ad/list': { - req: TODO; - res: TODO; - }; - 'admin/ad/update': { - req: TODO; - res: TODO; - }; - 'admin/announcements/create': { - req: TODO; - res: TODO; - }; - 'admin/announcements/delete': { - req: { - id: Announcement['id']; - }; - res: null; - }; - 'admin/announcements/list': { - req: TODO; - res: TODO; - }; - 'admin/announcements/update': { - req: TODO; - res: TODO; - }; - 'admin/drive/clean-remote-files': { - req: TODO; - res: TODO; - }; - 'admin/drive/cleanup': { - req: TODO; - res: TODO; - }; - 'admin/drive/files': { - req: TODO; - res: TODO; - }; - 'admin/drive/show-file': { - req: TODO; - res: TODO; - }; - 'admin/emoji/add': { - req: TODO; - res: TODO; - }; - 'admin/emoji/copy': { - req: TODO; - res: TODO; - }; - 'admin/emoji/list-remote': { - req: TODO; - res: TODO; - }; - 'admin/emoji/list': { - req: TODO; - res: TODO; - }; - 'admin/emoji/remove': { - req: TODO; - res: TODO; - }; - 'admin/emoji/update': { - req: TODO; - res: TODO; - }; - 'admin/federation/delete-all-files': { - req: { - host: string; - }; - res: null; - }; - 'admin/federation/refresh-remote-instance-metadata': { - req: TODO; - res: TODO; - }; - 'admin/federation/remove-all-following': { - req: TODO; - res: TODO; - }; - 'admin/federation/update-instance': { - req: TODO; - res: TODO; - }; - 'admin/moderators/add': { - req: TODO; - res: TODO; - }; - 'admin/moderators/remove': { - req: TODO; - res: TODO; - }; - 'admin/promo/create': { - req: TODO; - res: TODO; - }; - 'admin/queue/clear': { - req: TODO; - res: TODO; - }; - 'admin/queue/deliver-delayed': { - req: TODO; - res: TODO; - }; - 'admin/queue/inbox-delayed': { - req: TODO; - res: TODO; - }; - 'admin/queue/jobs': { - req: TODO; - res: TODO; - }; - 'admin/queue/stats': { - req: TODO; - res: TODO; - }; - 'admin/relays/add': { - req: TODO; - res: TODO; - }; - 'admin/relays/list': { - req: TODO; - res: TODO; - }; - 'admin/relays/remove': { - req: TODO; - res: TODO; - }; - 'announcements': { - req: { - limit?: number; - withUnreads?: boolean; - sinceId?: Announcement['id']; - untilId?: Announcement['id']; - }; - res: Announcement[]; - }; - 'antennas/create': { - req: TODO; - res: Antenna; - }; - 'antennas/delete': { - req: { - antennaId: Antenna['id']; - }; - res: null; - }; - 'antennas/list': { - req: NoParams; - res: Antenna[]; - }; - 'antennas/notes': { - req: { - antennaId: Antenna['id']; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - }; - res: Note[]; - }; - 'antennas/show': { - req: { - antennaId: Antenna['id']; - }; - res: Antenna; - }; - 'antennas/update': { - req: TODO; - res: Antenna; - }; - 'ap/get': { - req: { - uri: string; - }; - res: Record<string, any>; - }; - 'ap/show': { - req: { - uri: string; - }; - res: { - type: 'Note'; - object: Note; - } | { - type: 'User'; - object: UserDetailed; - }; - }; - 'app/create': { - req: TODO; - res: App; - }; - 'app/show': { - req: { - appId: App['id']; - }; - res: App; - }; - 'auth/accept': { - req: { - token: string; - }; - res: null; - }; - 'auth/session/generate': { - req: { - appSecret: string; - }; - res: { - token: string; - url: string; - }; - }; - 'auth/session/show': { - req: { - token: string; - }; - res: AuthSession; - }; - 'auth/session/userkey': { - req: { - appSecret: string; - token: string; - }; - res: { - accessToken: string; - user: User; - }; - }; - 'blocking/create': { - req: { - userId: User['id']; - }; - res: UserDetailed; - }; - 'blocking/delete': { - req: { - userId: User['id']; - }; - res: UserDetailed; - }; - 'blocking/list': { - req: { - limit?: number; - sinceId?: Blocking['id']; - untilId?: Blocking['id']; - }; - res: Blocking[]; - }; - 'channels/create': { - req: TODO; - res: TODO; - }; - 'channels/featured': { - req: TODO; - res: TODO; - }; - 'channels/follow': { - req: TODO; - res: TODO; - }; - 'channels/followed': { - req: TODO; - res: TODO; - }; - 'channels/owned': { - req: TODO; - res: TODO; - }; - 'channels/pin-note': { - req: TODO; - res: TODO; - }; - 'channels/show': { - req: TODO; - res: TODO; - }; - 'channels/timeline': { - req: TODO; - res: TODO; - }; - 'channels/unfollow': { - req: TODO; - res: TODO; - }; - 'channels/update': { - req: TODO; - res: TODO; - }; - 'charts/active-users': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - local: { - users: number[]; - }; - remote: { - users: number[]; - }; - }; - }; - 'charts/drive': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - local: { - decCount: number[]; - decSize: number[]; - incCount: number[]; - incSize: number[]; - totalCount: number[]; - totalSize: number[]; - }; - remote: { - decCount: number[]; - decSize: number[]; - incCount: number[]; - incSize: number[]; - totalCount: number[]; - totalSize: number[]; - }; - }; - }; - 'charts/federation': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - instance: { - dec: number[]; - inc: number[]; - total: number[]; - }; - }; - }; - 'charts/hashtag': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: TODO; - }; - 'charts/instance': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - host: string; - }; - res: { - drive: { - decFiles: number[]; - decUsage: number[]; - incFiles: number[]; - incUsage: number[]; - totalFiles: number[]; - totalUsage: number[]; - }; - followers: { - dec: number[]; - inc: number[]; - total: number[]; - }; - following: { - dec: number[]; - inc: number[]; - total: number[]; - }; - notes: { - dec: number[]; - inc: number[]; - total: number[]; - diffs: { - normal: number[]; - renote: number[]; - reply: number[]; - }; - }; - requests: { - failed: number[]; - received: number[]; - succeeded: number[]; - }; - users: { - dec: number[]; - inc: number[]; - total: number[]; - }; - }; - }; - 'charts/network': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: TODO; - }; - 'charts/notes': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - local: { - dec: number[]; - inc: number[]; - total: number[]; - diffs: { - normal: number[]; - renote: number[]; - reply: number[]; - }; - }; - remote: { - dec: number[]; - inc: number[]; - total: number[]; - diffs: { - normal: number[]; - renote: number[]; - reply: number[]; - }; - }; - }; - }; - 'charts/user/drive': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - userId: User['id']; - }; - res: { - decCount: number[]; - decSize: number[]; - incCount: number[]; - incSize: number[]; - totalCount: number[]; - totalSize: number[]; - }; - }; - 'charts/user/following': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - userId: User['id']; - }; - res: TODO; - }; - 'charts/user/notes': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - userId: User['id']; - }; - res: { - dec: number[]; - inc: number[]; - total: number[]; - diffs: { - normal: number[]; - renote: number[]; - reply: number[]; - }; - }; - }; - 'charts/user/reactions': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - userId: User['id']; - }; - res: TODO; - }; - 'charts/users': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - local: { - dec: number[]; - inc: number[]; - total: number[]; - }; - remote: { - dec: number[]; - inc: number[]; - total: number[]; - }; - }; - }; - 'clips/add-note': { - req: TODO; - res: TODO; - }; - 'clips/create': { - req: TODO; - res: TODO; - }; - 'clips/delete': { - req: { - clipId: Clip['id']; - }; - res: null; - }; - 'clips/list': { - req: TODO; - res: TODO; - }; - 'clips/notes': { - req: TODO; - res: TODO; - }; - 'clips/show': { - req: TODO; - res: TODO; - }; - 'clips/update': { - req: TODO; - res: TODO; - }; - 'drive': { - req: NoParams; - res: { - capacity: number; - usage: number; - }; - }; - 'drive/files': { - req: { - folderId?: DriveFolder['id'] | null; - type?: DriveFile['type'] | null; - limit?: number; - sinceId?: DriveFile['id']; - untilId?: DriveFile['id']; - }; - res: DriveFile[]; - }; - 'drive/files/attached-notes': { - req: TODO; - res: TODO; - }; - 'drive/files/check-existence': { - req: TODO; - res: TODO; - }; - 'drive/files/create': { - req: TODO; - res: TODO; - }; - 'drive/files/delete': { - req: { - fileId: DriveFile['id']; - }; - res: null; - }; - 'drive/files/find-by-hash': { - req: TODO; - res: TODO; - }; - 'drive/files/find': { - req: { - name: string; - folderId?: DriveFolder['id'] | null; - }; - res: DriveFile[]; - }; - 'drive/files/show': { - req: { - fileId?: DriveFile['id']; - url?: string; - }; - res: DriveFile; - }; - 'drive/files/update': { - req: { - fileId: DriveFile['id']; - folderId?: DriveFolder['id'] | null; - name?: string; - isSensitive?: boolean; - comment?: string | null; - }; - res: DriveFile; - }; - 'drive/files/upload-from-url': { - req: { - url: string; - folderId?: DriveFolder['id'] | null; - isSensitive?: boolean; - comment?: string | null; - marker?: string | null; - force?: boolean; - }; - res: null; - }; - 'drive/folders': { - req: { - folderId?: DriveFolder['id'] | null; - limit?: number; - sinceId?: DriveFile['id']; - untilId?: DriveFile['id']; - }; - res: DriveFolder[]; - }; - 'drive/folders/create': { - req: { - name?: string; - parentId?: DriveFolder['id'] | null; - }; - res: DriveFolder; - }; - 'drive/folders/delete': { - req: { - folderId: DriveFolder['id']; - }; - res: null; - }; - 'drive/folders/find': { - req: { - name: string; - parentId?: DriveFolder['id'] | null; - }; - res: DriveFolder[]; - }; - 'drive/folders/show': { - req: { - folderId: DriveFolder['id']; - }; - res: DriveFolder; - }; - 'drive/folders/update': { - req: { - folderId: DriveFolder['id']; - name?: string; - parentId?: DriveFolder['id'] | null; - }; - res: DriveFolder; - }; - 'drive/stream': { - req: { - type?: DriveFile['type'] | null; - limit?: number; - sinceId?: DriveFile['id']; - untilId?: DriveFile['id']; - }; - res: DriveFile[]; - }; - 'endpoint': { - req: { - endpoint: string; - }; - res: { - params: { - name: string; - type: string; - }[]; - }; - }; - 'endpoints': { - req: NoParams; - res: string[]; - }; - 'federation/dns': { - req: { - host: string; - }; - res: { - a: string[]; - aaaa: string[]; - cname: string[]; - txt: string[]; - }; - }; - 'federation/followers': { - req: { - host: string; - limit?: number; - sinceId?: Following['id']; - untilId?: Following['id']; - }; - res: FollowingFolloweePopulated[]; - }; - 'federation/following': { - req: { - host: string; - limit?: number; - sinceId?: Following['id']; - untilId?: Following['id']; - }; - res: FollowingFolloweePopulated[]; - }; - 'federation/instances': { - req: { - host?: string | null; - blocked?: boolean | null; - notResponding?: boolean | null; - suspended?: boolean | null; - federating?: boolean | null; - subscribing?: boolean | null; - publishing?: boolean | null; - limit?: number; - offset?: number; - sort?: '+pubSub' | '-pubSub' | '+notes' | '-notes' | '+users' | '-users' | '+following' | '-following' | '+followers' | '-followers' | '+caughtAt' | '-caughtAt' | '+lastCommunicatedAt' | '-lastCommunicatedAt' | '+driveUsage' | '-driveUsage' | '+driveFiles' | '-driveFiles'; - }; - res: Instance[]; - }; - 'federation/show-instance': { - req: { - host: string; - }; - res: Instance; - }; - 'federation/update-remote-user': { - req: { - userId: User['id']; - }; - res: null; - }; - 'federation/users': { - req: { - host: string; - limit?: number; - sinceId?: User['id']; - untilId?: User['id']; - }; - res: UserDetailed[]; - }; - 'following/create': { - req: { - userId: User['id']; - }; - res: User; - }; - 'following/delete': { - req: { - userId: User['id']; - }; - res: User; - }; - 'following/requests/accept': { - req: { - userId: User['id']; - }; - res: null; - }; - 'following/requests/cancel': { - req: { - userId: User['id']; - }; - res: User; - }; - 'following/requests/list': { - req: NoParams; - res: FollowRequest[]; - }; - 'following/requests/reject': { - req: { - userId: User['id']; - }; - res: null; - }; - 'gallery/featured': { - req: TODO; - res: TODO; - }; - 'gallery/popular': { - req: TODO; - res: TODO; - }; - 'gallery/posts': { - req: TODO; - res: TODO; - }; - 'gallery/posts/create': { - req: TODO; - res: TODO; - }; - 'gallery/posts/delete': { - req: { - postId: GalleryPost['id']; - }; - res: null; - }; - 'gallery/posts/like': { - req: TODO; - res: TODO; - }; - 'gallery/posts/show': { - req: TODO; - res: TODO; - }; - 'gallery/posts/unlike': { - req: TODO; - res: TODO; - }; - 'gallery/posts/update': { - req: TODO; - res: TODO; - }; - 'games/reversi/games': { - req: TODO; - res: TODO; - }; - 'games/reversi/games/show': { - req: TODO; - res: TODO; - }; - 'games/reversi/games/surrender': { - req: TODO; - res: TODO; - }; - 'games/reversi/invitations': { - req: TODO; - res: TODO; - }; - 'games/reversi/match': { - req: TODO; - res: TODO; - }; - 'games/reversi/match/cancel': { - req: TODO; - res: TODO; - }; - 'get-online-users-count': { - req: NoParams; - res: { - count: number; - }; - }; - 'hashtags/list': { - req: TODO; - res: TODO; - }; - 'hashtags/search': { - req: TODO; - res: TODO; - }; - 'hashtags/show': { - req: TODO; - res: TODO; - }; - 'hashtags/trend': { - req: TODO; - res: TODO; - }; - 'hashtags/users': { - req: TODO; - res: TODO; - }; - 'i': { - req: NoParams; - res: User; - }; - 'i/apps': { - req: TODO; - res: TODO; - }; - 'i/authorized-apps': { - req: TODO; - res: TODO; - }; - 'i/change-password': { - req: TODO; - res: TODO; - }; - 'i/delete-account': { - req: { - password: string; - }; - res: null; - }; - 'i/export-blocking': { - req: TODO; - res: TODO; - }; - 'i/export-following': { - req: TODO; - res: TODO; - }; - 'i/export-mute': { - req: TODO; - res: TODO; - }; - 'i/export-notes': { - req: TODO; - res: TODO; - }; - 'i/export-user-lists': { - req: TODO; - res: TODO; - }; - 'i/favorites': { - req: { - limit?: number; - sinceId?: NoteFavorite['id']; - untilId?: NoteFavorite['id']; - }; - res: NoteFavorite[]; - }; - 'i/gallery/likes': { - req: TODO; - res: TODO; - }; - 'i/gallery/posts': { - req: TODO; - res: TODO; - }; - 'i/get-word-muted-notes-count': { - req: TODO; - res: TODO; - }; - 'i/import-following': { - req: TODO; - res: TODO; - }; - 'i/import-user-lists': { - req: TODO; - res: TODO; - }; - 'i/move': { - req: TODO; - res: TODO; - }; - 'i/known-as': { - req: TODO; - res: TODO; - }; - 'i/notifications': { - req: { - limit?: number; - sinceId?: Notification_2['id']; - untilId?: Notification_2['id']; - following?: boolean; - markAsRead?: boolean; - includeTypes?: Notification_2['type'][]; - excludeTypes?: Notification_2['type'][]; - }; - res: Notification_2[]; - }; - 'i/page-likes': { - req: TODO; - res: TODO; - }; - 'i/pages': { - req: TODO; - res: TODO; - }; - 'i/pin': { - req: { - noteId: Note['id']; - }; - res: MeDetailed; - }; - 'i/read-all-messaging-messages': { - req: TODO; - res: TODO; - }; - 'i/read-all-unread-notes': { - req: TODO; - res: TODO; - }; - 'i/read-announcement': { - req: TODO; - res: TODO; - }; - 'i/regenerate-token': { - req: { - password: string; - }; - res: null; - }; - 'i/registry/get-all': { - req: { - scope?: string[]; - }; - res: Record<string, any>; - }; - 'i/registry/get-detail': { - req: { - key: string; - scope?: string[]; - }; - res: { - updatedAt: DateString; - value: any; - }; - }; - 'i/registry/get': { - req: { - key: string; - scope?: string[]; - }; - res: any; - }; - 'i/registry/keys-with-type': { - req: { - scope?: string[]; - }; - res: Record<string, 'null' | 'array' | 'number' | 'string' | 'boolean' | 'object'>; - }; - 'i/registry/keys': { - req: { - scope?: string[]; - }; - res: string[]; - }; - 'i/registry/remove': { - req: { - key: string; - scope?: string[]; - }; - res: null; - }; - 'i/registry/scopes': { - req: NoParams; - res: string[][]; - }; - 'i/registry/set': { - req: { - key: string; - value: any; - scope?: string[]; - }; - res: null; - }; - 'i/revoke-token': { - req: TODO; - res: TODO; - }; - 'i/signin-history': { - req: { - limit?: number; - sinceId?: Signin['id']; - untilId?: Signin['id']; - }; - res: Signin[]; - }; - 'i/unpin': { - req: { - noteId: Note['id']; - }; - res: MeDetailed; - }; - 'i/update-email': { - req: { - password: string; - email?: string | null; - }; - res: MeDetailed; - }; - 'i/update': { - req: { - name?: string | null; - description?: string | null; - lang?: string | null; - location?: string | null; - birthday?: string | null; - avatarId?: DriveFile['id'] | null; - bannerId?: DriveFile['id'] | null; - fields?: { - name: string; - value: string; - }[]; - isLocked?: boolean; - isExplorable?: boolean; - hideOnlineStatus?: boolean; - carefulBot?: boolean; - autoAcceptFollowed?: boolean; - noCrawle?: boolean; - isBot?: boolean; - isCat?: boolean; - injectFeaturedNote?: boolean; - receiveAnnouncementEmail?: boolean; - alwaysMarkNsfw?: boolean; - mutedWords?: string[][]; - mutingNotificationTypes?: Notification_2['type'][]; - emailNotificationTypes?: string[]; - }; - res: MeDetailed; - }; - 'i/user-group-invites': { - req: TODO; - res: TODO; - }; - 'i/2fa/done': { - req: TODO; - res: TODO; - }; - 'i/2fa/key-done': { - req: TODO; - res: TODO; - }; - 'i/2fa/password-less': { - req: TODO; - res: TODO; - }; - 'i/2fa/register-key': { - req: TODO; - res: TODO; - }; - 'i/2fa/register': { - req: TODO; - res: TODO; - }; - 'i/2fa/remove-key': { - req: TODO; - res: TODO; - }; - 'i/2fa/unregister': { - req: TODO; - res: TODO; - }; - 'messaging/history': { - req: { - limit?: number; - group?: boolean; - }; - res: MessagingMessage[]; - }; - 'messaging/messages': { - req: { - userId?: User['id']; - groupId?: UserGroup['id']; - limit?: number; - sinceId?: MessagingMessage['id']; - untilId?: MessagingMessage['id']; - markAsRead?: boolean; - }; - res: MessagingMessage[]; - }; - 'messaging/messages/create': { - req: { - userId?: User['id']; - groupId?: UserGroup['id']; - text?: string; - fileId?: DriveFile['id']; - }; - res: MessagingMessage; - }; - 'messaging/messages/delete': { - req: { - messageId: MessagingMessage['id']; - }; - res: null; - }; - 'messaging/messages/read': { - req: { - messageId: MessagingMessage['id']; - }; - res: null; - }; - 'meta': { - req: { - detail?: boolean; - }; - res: { - $switch: { - $cases: [ - [ - { - detail: true; - }, - DetailedInstanceMetadata - ], - [ - { - detail: false; - }, - LiteInstanceMetadata - ], - [ - { - detail: boolean; - }, - LiteInstanceMetadata | DetailedInstanceMetadata - ] - ]; - $default: LiteInstanceMetadata; - }; - }; - }; - 'miauth/gen-token': { - req: TODO; - res: TODO; - }; - 'mute/create': { - req: TODO; - res: TODO; - }; - 'mute/delete': { - req: { - userId: User['id']; - }; - res: null; - }; - 'mute/list': { - req: TODO; - res: TODO; - }; - 'my/apps': { - req: TODO; - res: TODO; - }; - 'notes': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - }; - res: Note[]; - }; - 'notes/children': { - req: { - noteId: Note['id']; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - }; - res: Note[]; - }; - 'notes/clips': { - req: TODO; - res: TODO; - }; - 'notes/conversation': { - req: TODO; - res: TODO; - }; - 'notes/create': { - req: { - visibility?: 'public' | 'home' | 'followers' | 'specified'; - visibleUserIds?: User['id'][]; - text?: null | string; - cw?: null | string; - viaMobile?: boolean; - localOnly?: boolean; - fileIds?: DriveFile['id'][]; - replyId?: null | Note['id']; - renoteId?: null | Note['id']; - channelId?: null | Channel['id']; - poll?: null | { - choices: string[]; - multiple?: boolean; - expiresAt?: null | number; - expiredAfter?: null | number; - }; - }; - res: { - createdNote: Note; - }; - }; - 'notes/delete': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/favorites/create': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/favorites/delete': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/featured': { - req: TODO; - res: Note[]; - }; - 'notes/global-timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/recommended-timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/hybrid-timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/local-timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/mentions': { - req: { - following?: boolean; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - }; - res: Note[]; - }; - 'notes/polls/recommendation': { - req: TODO; - res: TODO; - }; - 'notes/polls/vote': { - req: { - noteId: Note['id']; - choice: number; - }; - res: null; - }; - 'notes/reactions': { - req: { - noteId: Note['id']; - type?: string | null; - limit?: number; - }; - res: NoteReaction[]; - }; - 'notes/reactions/create': { - req: { - noteId: Note['id']; - reaction: string; - }; - res: null; - }; - 'notes/reactions/delete': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/renotes': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - noteId: Note['id']; - }; - res: Note[]; - }; - 'notes/replies': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - noteId: Note['id']; - }; - res: Note[]; - }; - 'notes/search-by-tag': { - req: TODO; - res: TODO; - }; - 'notes/search': { - req: TODO; - res: TODO; - }; - 'notes/show': { - req: { - noteId: Note['id']; - }; - res: Note; - }; - 'notes/state': { - req: TODO; - res: TODO; - }; - 'notes/timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/unrenote': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/user-list-timeline': { - req: { - listId: UserList['id']; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/watching/create': { - req: TODO; - res: TODO; - }; - 'notes/watching/delete': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notifications/create': { - req: { - body: string; - header?: string | null; - icon?: string | null; - }; - res: null; - }; - 'notifications/mark-all-as-read': { - req: NoParams; - res: null; - }; - 'notifications/read': { - req: { - notificationId: Notification_2['id']; - }; - res: null; - }; - 'page-push': { - req: { - pageId: Page['id']; - event: string; - var?: any; - }; - res: null; - }; - 'pages/create': { - req: TODO; - res: Page; - }; - 'pages/delete': { - req: { - pageId: Page['id']; - }; - res: null; - }; - 'pages/featured': { - req: NoParams; - res: Page[]; - }; - 'pages/like': { - req: { - pageId: Page['id']; - }; - res: null; - }; - 'pages/show': { - req: { - pageId?: Page['id']; - name?: string; - username?: string; - }; - res: Page; - }; - 'pages/unlike': { - req: { - pageId: Page['id']; - }; - res: null; - }; - 'pages/update': { - req: TODO; - res: null; - }; - 'ping': { - req: NoParams; - res: { - pong: number; - }; - }; - 'pinned-users': { - req: TODO; - res: TODO; - }; - 'promo/read': { - req: TODO; - res: TODO; - }; - 'request-reset-password': { - req: { - username: string; - email: string; - }; - res: null; - }; - 'reset-password': { - req: { - token: string; - password: string; - }; - res: null; - }; - 'room/show': { - req: TODO; - res: TODO; - }; - 'room/update': { - req: TODO; - res: TODO; - }; - 'stats': { - req: NoParams; - res: Stats; - }; - 'server-info': { - req: NoParams; - res: ServerInfo; - }; - 'latest-version': { - req: NoParams; - res: TODO; - }; - 'sw/register': { - req: TODO; - res: TODO; - }; - 'username/available': { - req: { - username: string; - }; - res: { - available: boolean; - }; - }; - 'users': { - req: { - limit?: number; - offset?: number; - sort?: UserSorting; - origin?: OriginType; - }; - res: User[]; - }; - 'users/clips': { - req: TODO; - res: TODO; - }; - 'users/followers': { - req: { - userId?: User['id']; - username?: User['username']; - host?: User['host'] | null; - limit?: number; - sinceId?: Following['id']; - untilId?: Following['id']; - }; - res: FollowingFollowerPopulated[]; - }; - 'users/following': { - req: { - userId?: User['id']; - username?: User['username']; - host?: User['host'] | null; - limit?: number; - sinceId?: Following['id']; - untilId?: Following['id']; - }; - res: FollowingFolloweePopulated[]; - }; - 'users/gallery/posts': { - req: TODO; - res: TODO; - }; - 'users/get-frequently-replied-users': { - req: TODO; - res: TODO; - }; - 'users/groups/create': { - req: TODO; - res: TODO; - }; - 'users/groups/delete': { - req: { - groupId: UserGroup['id']; - }; - res: null; - }; - 'users/groups/invitations/accept': { - req: TODO; - res: TODO; - }; - 'users/groups/invitations/reject': { - req: TODO; - res: TODO; - }; - 'users/groups/invite': { - req: TODO; - res: TODO; - }; - 'users/groups/joined': { - req: TODO; - res: TODO; - }; - 'users/groups/owned': { - req: TODO; - res: TODO; - }; - 'users/groups/pull': { - req: TODO; - res: TODO; - }; - 'users/groups/show': { - req: TODO; - res: TODO; - }; - 'users/groups/transfer': { - req: TODO; - res: TODO; - }; - 'users/groups/update': { - req: TODO; - res: TODO; - }; - 'users/lists/create': { - req: { - name: string; - }; - res: UserList; - }; - 'users/lists/delete': { - req: { - listId: UserList['id']; - }; - res: null; - }; - 'users/lists/list': { - req: NoParams; - res: UserList[]; - }; - 'users/lists/pull': { - req: { - listId: UserList['id']; - userId: User['id']; - }; - res: null; - }; - 'users/lists/push': { - req: { - listId: UserList['id']; - userId: User['id']; - }; - res: null; - }; - 'users/lists/show': { - req: { - listId: UserList['id']; - }; - res: UserList; - }; - 'users/lists/update': { - req: { - listId: UserList['id']; - name: string; - }; - res: UserList; - }; - 'users/notes': { - req: { - userId: User['id']; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'users/pages': { - req: TODO; - res: TODO; - }; - 'users/recommendation': { - req: TODO; - res: TODO; - }; - 'users/relation': { - req: TODO; - res: TODO; - }; - 'users/report-abuse': { - req: TODO; - res: TODO; - }; - 'users/search-by-username-and-host': { - req: TODO; - res: TODO; - }; - 'users/search': { - req: TODO; - res: TODO; - }; - 'users/show': { - req: ShowUserReq | { - userIds: User['id'][]; - }; - res: { - $switch: { - $cases: [ - [ - { - userIds: User['id'][]; - }, - UserDetailed[] - ] - ]; - $default: UserDetailed; - }; - }; - }; - 'users/stats': { - req: TODO; - res: TODO; - }; + "admin/abuse-user-reports": { + req: TODO; + res: TODO; + }; + "admin/delete-all-files-of-a-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "admin/delete-logs": { + req: NoParams; + res: null; + }; + "admin/get-index-stats": { + req: TODO; + res: TODO; + }; + "admin/get-table-stats": { + req: TODO; + res: TODO; + }; + "admin/invite": { + req: TODO; + res: TODO; + }; + "admin/logs": { + req: TODO; + res: TODO; + }; + "admin/meta": { + req: TODO; + res: TODO; + }; + "admin/reset-password": { + req: TODO; + res: TODO; + }; + "admin/resolve-abuse-user-report": { + req: TODO; + res: TODO; + }; + "admin/resync-chart": { + req: TODO; + res: TODO; + }; + "admin/send-email": { + req: TODO; + res: TODO; + }; + "admin/server-info": { + req: TODO; + res: TODO; + }; + "admin/show-moderation-logs": { + req: TODO; + res: TODO; + }; + "admin/show-user": { + req: TODO; + res: TODO; + }; + "admin/show-users": { + req: TODO; + res: TODO; + }; + "admin/silence-user": { + req: TODO; + res: TODO; + }; + "admin/suspend-user": { + req: TODO; + res: TODO; + }; + "admin/unsilence-user": { + req: TODO; + res: TODO; + }; + "admin/unsuspend-user": { + req: TODO; + res: TODO; + }; + "admin/update-meta": { + req: TODO; + res: TODO; + }; + "admin/vacuum": { + req: TODO; + res: TODO; + }; + "admin/accounts/create": { + req: TODO; + res: TODO; + }; + "admin/ad/create": { + req: TODO; + res: TODO; + }; + "admin/ad/delete": { + req: { + id: Ad["id"]; + }; + res: null; + }; + "admin/ad/list": { + req: TODO; + res: TODO; + }; + "admin/ad/update": { + req: TODO; + res: TODO; + }; + "admin/announcements/create": { + req: TODO; + res: TODO; + }; + "admin/announcements/delete": { + req: { + id: Announcement["id"]; + }; + res: null; + }; + "admin/announcements/list": { + req: TODO; + res: TODO; + }; + "admin/announcements/update": { + req: TODO; + res: TODO; + }; + "admin/drive/clean-remote-files": { + req: TODO; + res: TODO; + }; + "admin/drive/cleanup": { + req: TODO; + res: TODO; + }; + "admin/drive/files": { + req: TODO; + res: TODO; + }; + "admin/drive/show-file": { + req: TODO; + res: TODO; + }; + "admin/emoji/add": { + req: TODO; + res: TODO; + }; + "admin/emoji/copy": { + req: TODO; + res: TODO; + }; + "admin/emoji/list-remote": { + req: TODO; + res: TODO; + }; + "admin/emoji/list": { + req: TODO; + res: TODO; + }; + "admin/emoji/remove": { + req: TODO; + res: TODO; + }; + "admin/emoji/update": { + req: TODO; + res: TODO; + }; + "admin/federation/delete-all-files": { + req: { + host: string; + }; + res: null; + }; + "admin/federation/refresh-remote-instance-metadata": { + req: TODO; + res: TODO; + }; + "admin/federation/remove-all-following": { + req: TODO; + res: TODO; + }; + "admin/federation/update-instance": { + req: TODO; + res: TODO; + }; + "admin/moderators/add": { + req: TODO; + res: TODO; + }; + "admin/moderators/remove": { + req: TODO; + res: TODO; + }; + "admin/promo/create": { + req: TODO; + res: TODO; + }; + "admin/queue/clear": { + req: TODO; + res: TODO; + }; + "admin/queue/deliver-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/inbox-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/jobs": { + req: TODO; + res: TODO; + }; + "admin/queue/stats": { + req: TODO; + res: TODO; + }; + "admin/relays/add": { + req: TODO; + res: TODO; + }; + "admin/relays/list": { + req: TODO; + res: TODO; + }; + "admin/relays/remove": { + req: TODO; + res: TODO; + }; + announcements: { + req: { + limit?: number; + withUnreads?: boolean; + sinceId?: Announcement["id"]; + untilId?: Announcement["id"]; + }; + res: Announcement[]; + }; + "antennas/create": { + req: TODO; + res: Antenna; + }; + "antennas/delete": { + req: { + antennaId: Antenna["id"]; + }; + res: null; + }; + "antennas/list": { + req: NoParams; + res: Antenna[]; + }; + "antennas/notes": { + req: { + antennaId: Antenna["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "antennas/show": { + req: { + antennaId: Antenna["id"]; + }; + res: Antenna; + }; + "antennas/update": { + req: TODO; + res: Antenna; + }; + "antennas/mark-read": { + req: TODO; + res: Antenna; + }; + "ap/get": { + req: { + uri: string; + }; + res: Record<string, any>; + }; + "ap/show": { + req: { + uri: string; + }; + res: + | { + type: "Note"; + object: Note; + } + | { + type: "User"; + object: UserDetailed; + }; + }; + "app/create": { + req: TODO; + res: App; + }; + "app/show": { + req: { + appId: App["id"]; + }; + res: App; + }; + "auth/accept": { + req: { + token: string; + }; + res: null; + }; + "auth/session/generate": { + req: { + appSecret: string; + }; + res: { + token: string; + url: string; + }; + }; + "auth/session/show": { + req: { + token: string; + }; + res: AuthSession; + }; + "auth/session/userkey": { + req: { + appSecret: string; + token: string; + }; + res: { + accessToken: string; + user: User; + }; + }; + "blocking/create": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/delete": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/list": { + req: { + limit?: number; + sinceId?: Blocking["id"]; + untilId?: Blocking["id"]; + }; + res: Blocking[]; + }; + "channels/create": { + req: TODO; + res: TODO; + }; + "channels/featured": { + req: TODO; + res: TODO; + }; + "channels/follow": { + req: TODO; + res: TODO; + }; + "channels/followed": { + req: TODO; + res: TODO; + }; + "channels/owned": { + req: TODO; + res: TODO; + }; + "channels/pin-note": { + req: TODO; + res: TODO; + }; + "channels/show": { + req: TODO; + res: TODO; + }; + "channels/timeline": { + req: TODO; + res: TODO; + }; + "channels/unfollow": { + req: TODO; + res: TODO; + }; + "channels/update": { + req: TODO; + res: TODO; + }; + "charts/active-users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + users: number[]; + }; + remote: { + users: number[]; + }; + }; + }; + "charts/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + remote: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + }; + "charts/federation": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + instance: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/hashtag": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/instance": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + host: string; + }; + res: { + drive: { + decFiles: number[]; + decUsage: number[]; + incFiles: number[]; + incUsage: number[]; + totalFiles: number[]; + totalUsage: number[]; + }; + followers: { + dec: number[]; + inc: number[]; + total: number[]; + }; + following: { + dec: number[]; + inc: number[]; + total: number[]; + }; + notes: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + requests: { + failed: number[]; + received: number[]; + succeeded: number[]; + }; + users: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/network": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + }; + "charts/user/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + "charts/user/following": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/user/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + "charts/user/reactions": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "clips/add-note": { + req: TODO; + res: TODO; + }; + "clips/create": { + req: TODO; + res: TODO; + }; + "clips/delete": { + req: { + clipId: Clip["id"]; + }; + res: null; + }; + "clips/list": { + req: TODO; + res: TODO; + }; + "clips/notes": { + req: TODO; + res: TODO; + }; + "clips/show": { + req: TODO; + res: TODO; + }; + "clips/update": { + req: TODO; + res: TODO; + }; + drive: { + req: NoParams; + res: { + capacity: number; + usage: number; + }; + }; + "drive/files": { + req: { + folderId?: DriveFolder["id"] | null; + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + "drive/files/attached-notes": { + req: TODO; + res: TODO; + }; + "drive/files/check-existence": { + req: TODO; + res: TODO; + }; + "drive/files/create": { + req: TODO; + res: TODO; + }; + "drive/files/delete": { + req: { + fileId: DriveFile["id"]; + }; + res: null; + }; + "drive/files/find-by-hash": { + req: TODO; + res: TODO; + }; + "drive/files/find": { + req: { + name: string; + folderId?: DriveFolder["id"] | null; + }; + res: DriveFile[]; + }; + "drive/files/show": { + req: { + fileId?: DriveFile["id"]; + url?: string; + }; + res: DriveFile; + }; + "drive/files/update": { + req: { + fileId: DriveFile["id"]; + folderId?: DriveFolder["id"] | null; + name?: string; + isSensitive?: boolean; + comment?: string | null; + }; + res: DriveFile; + }; + "drive/files/upload-from-url": { + req: { + url: string; + folderId?: DriveFolder["id"] | null; + isSensitive?: boolean; + comment?: string | null; + marker?: string | null; + force?: boolean; + }; + res: null; + }; + "drive/folders": { + req: { + folderId?: DriveFolder["id"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFolder[]; + }; + "drive/folders/create": { + req: { + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/folders/delete": { + req: { + folderId: DriveFolder["id"]; + }; + res: null; + }; + "drive/folders/find": { + req: { + name: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder[]; + }; + "drive/folders/show": { + req: { + folderId: DriveFolder["id"]; + }; + res: DriveFolder; + }; + "drive/folders/update": { + req: { + folderId: DriveFolder["id"]; + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/stream": { + req: { + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + endpoint: { + req: { + endpoint: string; + }; + res: { + params: { + name: string; + type: string; + }[]; + }; + }; + endpoints: { + req: NoParams; + res: string[]; + }; + "federation/dns": { + req: { + host: string; + }; + res: { + a: string[]; + aaaa: string[]; + cname: string[]; + txt: string[]; + }; + }; + "federation/followers": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/following": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/instances": { + req: { + host?: string | null; + blocked?: boolean | null; + notResponding?: boolean | null; + suspended?: boolean | null; + federating?: boolean | null; + subscribing?: boolean | null; + publishing?: boolean | null; + limit?: number; + offset?: number; + sort?: + | "+pubSub" + | "-pubSub" + | "+notes" + | "-notes" + | "+users" + | "-users" + | "+following" + | "-following" + | "+followers" + | "-followers" + | "+caughtAt" + | "-caughtAt" + | "+lastCommunicatedAt" + | "-lastCommunicatedAt" + | "+driveUsage" + | "-driveUsage" + | "+driveFiles" + | "-driveFiles"; + }; + res: Instance[]; + }; + "federation/show-instance": { + req: { + host: string; + }; + res: Instance; + }; + "federation/update-remote-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "federation/users": { + req: { + host: string; + limit?: number; + sinceId?: User["id"]; + untilId?: User["id"]; + }; + res: UserDetailed[]; + }; + "following/create": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/delete": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/accept": { + req: { + userId: User["id"]; + }; + res: null; + }; + "following/requests/cancel": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/list": { + req: NoParams; + res: FollowRequest[]; + }; + "following/requests/reject": { + req: { + userId: User["id"]; + }; + res: null; + }; + "gallery/featured": { + req: TODO; + res: TODO; + }; + "gallery/popular": { + req: TODO; + res: TODO; + }; + "gallery/posts": { + req: TODO; + res: TODO; + }; + "gallery/posts/create": { + req: TODO; + res: TODO; + }; + "gallery/posts/delete": { + req: { + postId: GalleryPost["id"]; + }; + res: null; + }; + "gallery/posts/like": { + req: TODO; + res: TODO; + }; + "gallery/posts/show": { + req: TODO; + res: TODO; + }; + "gallery/posts/unlike": { + req: TODO; + res: TODO; + }; + "gallery/posts/update": { + req: TODO; + res: TODO; + }; + "games/reversi/games": { + req: TODO; + res: TODO; + }; + "games/reversi/games/show": { + req: TODO; + res: TODO; + }; + "games/reversi/games/surrender": { + req: TODO; + res: TODO; + }; + "games/reversi/invitations": { + req: TODO; + res: TODO; + }; + "games/reversi/match": { + req: TODO; + res: TODO; + }; + "games/reversi/match/cancel": { + req: TODO; + res: TODO; + }; + "get-online-users-count": { + req: NoParams; + res: { + count: number; + }; + }; + "hashtags/list": { + req: TODO; + res: TODO; + }; + "hashtags/search": { + req: TODO; + res: TODO; + }; + "hashtags/show": { + req: TODO; + res: TODO; + }; + "hashtags/trend": { + req: TODO; + res: TODO; + }; + "hashtags/users": { + req: TODO; + res: TODO; + }; + i: { + req: NoParams; + res: User; + }; + "i/apps": { + req: TODO; + res: TODO; + }; + "i/authorized-apps": { + req: TODO; + res: TODO; + }; + "i/change-password": { + req: TODO; + res: TODO; + }; + "i/delete-account": { + req: { + password: string; + }; + res: null; + }; + "i/export-blocking": { + req: TODO; + res: TODO; + }; + "i/export-following": { + req: TODO; + res: TODO; + }; + "i/export-mute": { + req: TODO; + res: TODO; + }; + "i/export-notes": { + req: TODO; + res: TODO; + }; + "i/export-user-lists": { + req: TODO; + res: TODO; + }; + "i/favorites": { + req: { + limit?: number; + sinceId?: NoteFavorite["id"]; + untilId?: NoteFavorite["id"]; + }; + res: NoteFavorite[]; + }; + "i/gallery/likes": { + req: TODO; + res: TODO; + }; + "i/gallery/posts": { + req: TODO; + res: TODO; + }; + "i/get-word-muted-notes-count": { + req: TODO; + res: TODO; + }; + "i/import-following": { + req: TODO; + res: TODO; + }; + "i/import-user-lists": { + req: TODO; + res: TODO; + }; + "i/move": { + req: TODO; + res: TODO; + }; + "i/known-as": { + req: TODO; + res: TODO; + }; + "i/notifications": { + req: { + limit?: number; + sinceId?: Notification_2["id"]; + untilId?: Notification_2["id"]; + following?: boolean; + markAsRead?: boolean; + includeTypes?: Notification_2["type"][]; + excludeTypes?: Notification_2["type"][]; + }; + res: Notification_2[]; + }; + "i/page-likes": { + req: TODO; + res: TODO; + }; + "i/pages": { + req: TODO; + res: TODO; + }; + "i/pin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/read-all-messaging-messages": { + req: TODO; + res: TODO; + }; + "i/read-all-unread-notes": { + req: TODO; + res: TODO; + }; + "i/read-announcement": { + req: TODO; + res: TODO; + }; + "i/regenerate-token": { + req: { + password: string; + }; + res: null; + }; + "i/registry/get-all": { + req: { + scope?: string[]; + }; + res: Record<string, any>; + }; + "i/registry/get-detail": { + req: { + key: string; + scope?: string[]; + }; + res: { + updatedAt: DateString; + value: any; + }; + }; + "i/registry/get": { + req: { + key: string; + scope?: string[]; + }; + res: any; + }; + "i/registry/keys-with-type": { + req: { + scope?: string[]; + }; + res: Record< + string, + "null" | "array" | "number" | "string" | "boolean" | "object" + >; + }; + "i/registry/keys": { + req: { + scope?: string[]; + }; + res: string[]; + }; + "i/registry/remove": { + req: { + key: string; + scope?: string[]; + }; + res: null; + }; + "i/registry/scopes": { + req: NoParams; + res: string[][]; + }; + "i/registry/set": { + req: { + key: string; + value: any; + scope?: string[]; + }; + res: null; + }; + "i/revoke-token": { + req: TODO; + res: TODO; + }; + "i/signin-history": { + req: { + limit?: number; + sinceId?: Signin["id"]; + untilId?: Signin["id"]; + }; + res: Signin[]; + }; + "i/unpin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/update-email": { + req: { + password: string; + email?: string | null; + }; + res: MeDetailed; + }; + "i/update": { + req: { + name?: string | null; + description?: string | null; + lang?: string | null; + location?: string | null; + birthday?: string | null; + avatarId?: DriveFile["id"] | null; + bannerId?: DriveFile["id"] | null; + fields?: { + name: string; + value: string; + }[]; + isLocked?: boolean; + isExplorable?: boolean; + hideOnlineStatus?: boolean; + carefulBot?: boolean; + autoAcceptFollowed?: boolean; + noCrawle?: boolean; + preventAiLearning?: boolean; + isBot?: boolean; + isCat?: boolean; + injectFeaturedNote?: boolean; + receiveAnnouncementEmail?: boolean; + alwaysMarkNsfw?: boolean; + mutedWords?: string[][]; + mutingNotificationTypes?: Notification_2["type"][]; + emailNotificationTypes?: string[]; + }; + res: MeDetailed; + }; + "i/user-group-invites": { + req: TODO; + res: TODO; + }; + "i/2fa/done": { + req: TODO; + res: TODO; + }; + "i/2fa/key-done": { + req: TODO; + res: TODO; + }; + "i/2fa/password-less": { + req: TODO; + res: TODO; + }; + "i/2fa/register-key": { + req: TODO; + res: TODO; + }; + "i/2fa/register": { + req: TODO; + res: TODO; + }; + "i/2fa/update-key": { + req: TODO; + res: TODO; + }; + "i/2fa/remove-key": { + req: TODO; + res: TODO; + }; + "i/2fa/unregister": { + req: TODO; + res: TODO; + }; + "messaging/history": { + req: { + limit?: number; + group?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + limit?: number; + sinceId?: MessagingMessage["id"]; + untilId?: MessagingMessage["id"]; + markAsRead?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages/create": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + text?: string; + fileId?: DriveFile["id"]; + }; + res: MessagingMessage; + }; + "messaging/messages/delete": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + "messaging/messages/read": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + meta: { + req: { + detail?: boolean; + }; + res: { + $switch: { + $cases: [ + [ + { + detail: true; + }, + DetailedInstanceMetadata, + ], + [ + { + detail: false; + }, + LiteInstanceMetadata, + ], + [ + { + detail: boolean; + }, + LiteInstanceMetadata | DetailedInstanceMetadata, + ], + ]; + $default: LiteInstanceMetadata; + }; + }; + }; + "miauth/gen-token": { + req: TODO; + res: TODO; + }; + "mute/create": { + req: TODO; + res: TODO; + }; + "mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "mute/list": { + req: TODO; + res: TODO; + }; + "renote-mute/create": { + req: TODO; + res: TODO; + }; + "renote-mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "renote-mute/list": { + req: TODO; + res: TODO; + }; + "my/apps": { + req: TODO; + res: TODO; + }; + notes: { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/children": { + req: { + noteId: Note["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/clips": { + req: TODO; + res: TODO; + }; + "notes/conversation": { + req: TODO; + res: TODO; + }; + "notes/create": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/edit": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/favorites/create": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/favorites/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/featured": { + req: TODO; + res: Note[]; + }; + "notes/global-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/recommended-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/hybrid-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/local-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/mentions": { + req: { + following?: boolean; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/polls/recommendation": { + req: TODO; + res: TODO; + }; + "notes/polls/vote": { + req: { + noteId: Note["id"]; + choice: number; + }; + res: null; + }; + "notes/reactions": { + req: { + noteId: Note["id"]; + type?: string | null; + limit?: number; + }; + res: NoteReaction[]; + }; + "notes/reactions/create": { + req: { + noteId: Note["id"]; + reaction: string; + }; + res: null; + }; + "notes/reactions/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/renotes": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/replies": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/search-by-tag": { + req: TODO; + res: TODO; + }; + "notes/search": { + req: TODO; + res: TODO; + }; + "notes/show": { + req: { + noteId: Note["id"]; + }; + res: Note; + }; + "notes/state": { + req: TODO; + res: TODO; + }; + "notes/timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/unrenote": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/user-list-timeline": { + req: { + listId: UserList["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/watching/create": { + req: TODO; + res: TODO; + }; + "notes/watching/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notifications/create": { + req: { + body: string; + header?: string | null; + icon?: string | null; + }; + res: null; + }; + "notifications/mark-all-as-read": { + req: NoParams; + res: null; + }; + "notifications/read": { + req: { + notificationId: Notification_2["id"]; + }; + res: null; + }; + "page-push": { + req: { + pageId: Page["id"]; + event: string; + var?: any; + }; + res: null; + }; + "pages/create": { + req: TODO; + res: Page; + }; + "pages/delete": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/featured": { + req: NoParams; + res: Page[]; + }; + "pages/like": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/show": { + req: { + pageId?: Page["id"]; + name?: string; + username?: string; + }; + res: Page; + }; + "pages/unlike": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/update": { + req: TODO; + res: null; + }; + ping: { + req: NoParams; + res: { + pong: number; + }; + }; + "pinned-users": { + req: TODO; + res: TODO; + }; + "promo/read": { + req: TODO; + res: TODO; + }; + "request-reset-password": { + req: { + username: string; + email: string; + }; + res: null; + }; + "reset-password": { + req: { + token: string; + password: string; + }; + res: null; + }; + "room/show": { + req: TODO; + res: TODO; + }; + "room/update": { + req: TODO; + res: TODO; + }; + stats: { + req: NoParams; + res: Stats; + }; + "server-info": { + req: NoParams; + res: ServerInfo; + }; + "latest-version": { + req: NoParams; + res: TODO; + }; + "sw/register": { + req: TODO; + res: TODO; + }; + "username/available": { + req: { + username: string; + }; + res: { + available: boolean; + }; + }; + users: { + req: { + limit?: number; + offset?: number; + sort?: UserSorting; + origin?: OriginType; + }; + res: User[]; + }; + "users/clips": { + req: TODO; + res: TODO; + }; + "users/followers": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFollowerPopulated[]; + }; + "users/following": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "users/gallery/posts": { + req: TODO; + res: TODO; + }; + "users/get-frequently-replied-users": { + req: TODO; + res: TODO; + }; + "users/groups/create": { + req: TODO; + res: TODO; + }; + "users/groups/delete": { + req: { + groupId: UserGroup["id"]; + }; + res: null; + }; + "users/groups/invitations/accept": { + req: TODO; + res: TODO; + }; + "users/groups/invitations/reject": { + req: TODO; + res: TODO; + }; + "users/groups/invite": { + req: TODO; + res: TODO; + }; + "users/groups/joined": { + req: TODO; + res: TODO; + }; + "users/groups/owned": { + req: TODO; + res: TODO; + }; + "users/groups/pull": { + req: TODO; + res: TODO; + }; + "users/groups/show": { + req: TODO; + res: TODO; + }; + "users/groups/transfer": { + req: TODO; + res: TODO; + }; + "users/groups/update": { + req: TODO; + res: TODO; + }; + "users/lists/create": { + req: { + name: string; + }; + res: UserList; + }; + "users/lists/delete": { + req: { + listId: UserList["id"]; + }; + res: null; + }; + "users/lists/list": { + req: NoParams; + res: UserList[]; + }; + "users/lists/pull": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/push": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/show": { + req: { + listId: UserList["id"]; + }; + res: UserList; + }; + "users/lists/update": { + req: { + listId: UserList["id"]; + name: string; + }; + res: UserList; + }; + "users/notes": { + req: { + userId: User["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "users/pages": { + req: TODO; + res: TODO; + }; + "users/recommendation": { + req: TODO; + res: TODO; + }; + "users/relation": { + req: TODO; + res: TODO; + }; + "users/report-abuse": { + req: TODO; + res: TODO; + }; + "users/search-by-username-and-host": { + req: TODO; + res: TODO; + }; + "users/search": { + req: TODO; + res: TODO; + }; + "users/show": { + req: + | ShowUserReq + | { + userIds: User["id"][]; + }; + res: { + $switch: { + $cases: [ + [ + { + userIds: User["id"][]; + }, + UserDetailed[], + ], + ]; + $default: UserDetailed; + }; + }; + }; + "users/stats": { + req: TODO; + res: TODO; + }; }; declare namespace entities { @@ -2206,14 +2290,17 @@ declare namespace entities { export { entities } // @public (undocumented) -type FetchLike = (input: string, init?: { - method?: string; - body?: string; - credentials?: RequestCredentials; - cache?: RequestCache; -}) => Promise<{ - status: number; - json(): Promise<any>; +type FetchLike = ( + input: string, + init?: { + method?: string; + body?: string; + credentials?: RequestCredentials; + cache?: RequestCache; + }, +) => Promise<{ + status: number; + json(): Promise<any>; }>; // @public (undocumented) @@ -2221,27 +2308,27 @@ export const ffVisibility: readonly ["public", "followers", "private"]; // @public (undocumented) type Following = { - id: ID; - createdAt: DateString; - followerId: User['id']; - followeeId: User['id']; + id: ID; + createdAt: DateString; + followerId: User["id"]; + followeeId: User["id"]; }; // @public (undocumented) type FollowingFolloweePopulated = Following & { - followee: UserDetailed; + followee: UserDetailed; }; // @public (undocumented) type FollowingFollowerPopulated = Following & { - follower: UserDetailed; + follower: UserDetailed; }; // @public (undocumented) type FollowRequest = { - id: ID; - follower: User; - followee: User; + id: ID; + follower: User; + followee: User; }; // @public (undocumented) @@ -2252,279 +2339,319 @@ type ID = string; // @public (undocumented) type Instance = { - id: ID; - caughtAt: DateString; - host: string; - usersCount: number; - notesCount: number; - followingCount: number; - followersCount: number; - driveUsage: number; - driveFiles: number; - latestRequestSentAt: DateString | null; - latestStatus: number | null; - latestRequestReceivedAt: DateString | null; - lastCommunicatedAt: DateString; - isNotResponding: boolean; - isSuspended: boolean; - softwareName: string | null; - softwareVersion: string | null; - openRegistrations: boolean | null; - name: string | null; - description: string | null; - maintainerName: string | null; - maintainerEmail: string | null; - iconUrl: string | null; - faviconUrl: string | null; - themeColor: string | null; - infoUpdatedAt: DateString | null; + id: ID; + caughtAt: DateString; + host: string; + usersCount: number; + notesCount: number; + followingCount: number; + followersCount: number; + driveUsage: number; + driveFiles: number; + latestRequestSentAt: DateString | null; + latestStatus: number | null; + latestRequestReceivedAt: DateString | null; + lastCommunicatedAt: DateString; + isNotResponding: boolean; + isSuspended: boolean; + softwareName: string | null; + softwareVersion: string | null; + openRegistrations: boolean | null; + name: string | null; + description: string | null; + maintainerName: string | null; + maintainerEmail: string | null; + iconUrl: string | null; + faviconUrl: string | null; + themeColor: string | null; + infoUpdatedAt: DateString | null; }; // @public (undocumented) -type InstanceMetadata = LiteInstanceMetadata | DetailedInstanceMetadata; +type InstanceMetadata = + | LiteInstanceMetadata + | DetailedInstanceMetadata; // @public (undocumented) function isAPIError(reason: any): reason is APIError; // @public (undocumented) type LiteInstanceMetadata = { - maintainerName: string | null; - maintainerEmail: string | null; - version: string; - name: string | null; - uri: string; - description: string | null; - tosUrl: string | null; - disableRegistration: boolean; - disableLocalTimeline: boolean; - disableRecommendedTimeline: boolean; - disableGlobalTimeline: boolean; - driveCapacityPerLocalUserMb: number; - driveCapacityPerRemoteUserMb: number; - enableHcaptcha: boolean; - hcaptchaSiteKey: string | null; - enableRecaptcha: boolean; - recaptchaSiteKey: string | null; - swPublickey: string | null; - maxNoteTextLength: number; - enableEmail: boolean; - enableTwitterIntegration: boolean; - enableGithubIntegration: boolean; - enableDiscordIntegration: boolean; - enableServiceWorker: boolean; - emojis: CustomEmoji[]; - ads: { - id: ID; - ratio: number; - place: string; - url: string; - imageUrl: string; - }[]; + maintainerName: string | null; + maintainerEmail: string | null; + version: string; + name: string | null; + uri: string; + description: string | null; + tosUrl: string | null; + disableRegistration: boolean; + disableLocalTimeline: boolean; + disableRecommendedTimeline: boolean; + disableGlobalTimeline: boolean; + driveCapacityPerLocalUserMb: number; + driveCapacityPerRemoteUserMb: number; + enableHcaptcha: boolean; + hcaptchaSiteKey: string | null; + enableRecaptcha: boolean; + recaptchaSiteKey: string | null; + swPublickey: string | null; + maxNoteTextLength: number; + enableEmail: boolean; + enableTwitterIntegration: boolean; + enableGithubIntegration: boolean; + enableDiscordIntegration: boolean; + enableServiceWorker: boolean; + emojis: CustomEmoji[]; + ads: { + id: ID; + ratio: number; + place: string; + url: string; + imageUrl: string; + }[]; }; // @public (undocumented) type MeDetailed = UserDetailed & { - avatarId: DriveFile['id']; - bannerId: DriveFile['id']; - autoAcceptFollowed: boolean; - alwaysMarkNsfw: boolean; - carefulBot: boolean; - emailNotificationTypes: string[]; - hasPendingReceivedFollowRequest: boolean; - hasUnreadAnnouncement: boolean; - hasUnreadAntenna: boolean; - hasUnreadChannel: boolean; - hasUnreadMentions: boolean; - hasUnreadMessagingMessage: boolean; - hasUnreadNotification: boolean; - hasUnreadSpecifiedNotes: boolean; - hideOnlineStatus: boolean; - injectFeaturedNote: boolean; - integrations: Record<string, any>; - isDeleted: boolean; - isExplorable: boolean; - mutedWords: string[][]; - mutingNotificationTypes: string[]; - noCrawle: boolean; - receiveAnnouncementEmail: boolean; - usePasswordLessLogin: boolean; - [other: string]: any; + avatarId: DriveFile["id"]; + bannerId: DriveFile["id"]; + autoAcceptFollowed: boolean; + alwaysMarkNsfw: boolean; + carefulBot: boolean; + emailNotificationTypes: string[]; + hasPendingReceivedFollowRequest: boolean; + hasUnreadAnnouncement: boolean; + hasUnreadAntenna: boolean; + hasUnreadChannel: boolean; + hasUnreadMentions: boolean; + hasUnreadMessagingMessage: boolean; + hasUnreadNotification: boolean; + hasUnreadSpecifiedNotes: boolean; + hideOnlineStatus: boolean; + injectFeaturedNote: boolean; + integrations: Record<string, any>; + isDeleted: boolean; + isExplorable: boolean; + mutedWords: string[][]; + mutingNotificationTypes: string[]; + noCrawle: boolean; + preventAiLearning: boolean; + receiveAnnouncementEmail: boolean; + usePasswordLessLogin: boolean; + [other: string]: any; }; // @public (undocumented) type MessagingMessage = { - id: ID; - createdAt: DateString; - file: DriveFile | null; - fileId: DriveFile['id'] | null; - isRead: boolean; - reads: User['id'][]; - text: string | null; - user: User; - userId: User['id']; - recipient?: User | null; - recipientId: User['id'] | null; - group?: UserGroup | null; - groupId: UserGroup['id'] | null; + id: ID; + createdAt: DateString; + file: DriveFile | null; + fileId: DriveFile["id"] | null; + isRead: boolean; + reads: User["id"][]; + text: string | null; + user: User; + userId: User["id"]; + recipient?: User | null; + recipientId: User["id"] | null; + group?: UserGroup | null; + groupId: UserGroup["id"] | null; }; // @public (undocumented) -export const mutedNoteReasons: readonly ["word", "manual", "spam", "other"]; +export const mutedNoteReasons: readonly [ + "word", + "manual", + "spam", + "other", +]; // @public (undocumented) type Note = { - id: ID; - createdAt: DateString; - text: string | null; - cw: string | null; - user: User; - userId: User['id']; - reply?: Note; - replyId: Note['id']; - renote?: Note; - renoteId: Note['id']; - files: DriveFile[]; - fileIds: DriveFile['id'][]; - visibility: 'public' | 'home' | 'followers' | 'specified'; - visibleUserIds?: User['id'][]; - localOnly?: boolean; - myReaction?: string; - reactions: Record<string, number>; - renoteCount: number; - repliesCount: number; - poll?: { - expiresAt: DateString | null; - multiple: boolean; - choices: { - isVoted: boolean; - text: string; - votes: number; - }[]; - }; - emojis: { - name: string; - url: string; - }[]; - uri?: string; - url?: string; - isHidden?: boolean; + id: ID; + createdAt: DateString; + text: string | null; + cw: string | null; + user: User; + userId: User["id"]; + reply?: Note; + replyId: Note["id"]; + renote?: Note; + renoteId: Note["id"]; + files: DriveFile[]; + fileIds: DriveFile["id"][]; + visibility: "public" | "home" | "followers" | "specified"; + visibleUserIds?: User["id"][]; + localOnly?: boolean; + channel?: Channel["id"]; + myReaction?: string; + reactions: Record<string, number>; + renoteCount: number; + repliesCount: number; + poll?: { + expiresAt: DateString | null; + multiple: boolean; + choices: { + isVoted: boolean; + text: string; + votes: number; + }[]; + }; + emojis: { + name: string; + url: string; + }[]; + uri?: string; + url?: string; + updatedAt?: DateString; + isHidden?: boolean; }; // @public (undocumented) type NoteFavorite = { - id: ID; - createdAt: DateString; - noteId: Note['id']; - note: Note; + id: ID; + createdAt: DateString; + noteId: Note["id"]; + note: Note; }; // @public (undocumented) type NoteReaction = { - id: ID; - createdAt: DateString; - user: UserLite; - type: string; + id: ID; + createdAt: DateString; + user: UserLite; + type: string; }; // @public (undocumented) -export const noteVisibilities: readonly ["public", "home", "followers", "specified"]; +export const noteVisibilities: readonly [ + "public", + "home", + "followers", + "specified", +]; // @public (undocumented) type Notification_2 = { - id: ID; - createdAt: DateString; - isRead: boolean; -} & ({ - type: 'reaction'; - reaction: string; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'reply'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'renote'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'quote'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'mention'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'pollVote'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'follow'; - user: User; - userId: User['id']; -} | { - type: 'followRequestAccepted'; - user: User; - userId: User['id']; -} | { - type: 'receiveFollowRequest'; - user: User; - userId: User['id']; -} | { - type: 'groupInvited'; - invitation: UserGroup; - user: User; - userId: User['id']; -} | { - type: 'app'; - header?: string | null; - body: string; - icon?: string | null; -}); + id: ID; + createdAt: DateString; + isRead: boolean; +} & ( + | { + type: "reaction"; + reaction: string; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "reply"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "renote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "quote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "mention"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "pollVote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "follow"; + user: User; + userId: User["id"]; + } + | { + type: "followRequestAccepted"; + user: User; + userId: User["id"]; + } + | { + type: "receiveFollowRequest"; + user: User; + userId: User["id"]; + } + | { + type: "groupInvited"; + invitation: UserGroup; + user: User; + userId: User["id"]; + } + | { + type: "app"; + header?: string | null; + body: string; + icon?: string | null; + } +); // @public (undocumented) -export const notificationTypes: readonly ["follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "pollEnded", "receiveFollowRequest", "followRequestAccepted", "groupInvited", "app"]; +export const notificationTypes: readonly [ + "follow", + "mention", + "reply", + "renote", + "quote", + "reaction", + "pollVote", + "pollEnded", + "receiveFollowRequest", + "followRequestAccepted", + "groupInvited", + "app", +]; // @public (undocumented) -type OriginType = 'combined' | 'local' | 'remote'; +type OriginType = "combined" | "local" | "remote"; // @public (undocumented) type Page = { - id: ID; - createdAt: DateString; - updatedAt: DateString; - userId: User['id']; - user: User; - content: Record<string, any>[]; - variables: Record<string, any>[]; - title: string; - name: string; - summary: string | null; - hideTitleWhenPinned: boolean; - alignCenter: boolean; - font: string; - script: string; - eyeCatchingImageId: DriveFile['id'] | null; - eyeCatchingImage: DriveFile | null; - attachedFiles: any; - likedCount: number; - isLiked?: boolean; + id: ID; + createdAt: DateString; + updatedAt: DateString; + userId: User["id"]; + user: User; + content: Record<string, any>[]; + variables: Record<string, any>[]; + title: string; + name: string; + summary: string | null; + hideTitleWhenPinned: boolean; + alignCenter: boolean; + font: string; + script: string; + eyeCatchingImageId: DriveFile["id"] | null; + eyeCatchingImage: DriveFile | null; + attachedFiles: any; + likedCount: number; + isLiked?: boolean; }; // @public (undocumented) type PageEvent = { - pageId: Page['id']; - event: string; - var: any; - userId: User['id']; - user: User; + pageId: Page["id"]; + event: string; + var: any; + userId: User["id"]; + user: User; }; // @public (undocumented) @@ -2532,117 +2659,126 @@ export const permissions: string[]; // @public (undocumented) type ServerInfo = { - machine: string; - cpu: { - model: string; - cores: number; - }; - mem: { - total: number; - }; - fs: { - total: number; - used: number; - }; + machine: string; + cpu: { + model: string; + cores: number; + }; + mem: { + total: number; + }; + fs: { + total: number; + used: number; + }; }; // @public (undocumented) type Signin = { - id: ID; - createdAt: DateString; - ip: string; - headers: Record<string, any>; - success: boolean; + id: ID; + createdAt: DateString; + ip: string; + headers: Record<string, any>; + success: boolean; }; // @public (undocumented) type Stats = { - notesCount: number; - originalNotesCount: number; - usersCount: number; - originalUsersCount: number; - instances: number; - driveUsageLocal: number; - driveUsageRemote: number; + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + instances: number; + driveUsageLocal: number; + driveUsageRemote: number; }; // Warning: (ae-forgotten-export) The symbol "StreamEvents" needs to be exported by the entry point index.d.ts // // @public (undocumented) export class Stream extends EventEmitter<StreamEvents> { - constructor(origin: string, user: { - token: string; - } | null, options?: { - WebSocket?: any; - }); - // (undocumented) + constructor( + origin: string, + user: { + token: string; + } | null, + options?: { + WebSocket?: any; + }, + ); + // (undocumented) close(): void; - // Warning: (ae-forgotten-export) The symbol "NonSharedConnection" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "NonSharedConnection" needs to be exported by the entry point index.d.ts // // (undocumented) disconnectToChannel(connection: NonSharedConnection): void; - // Warning: (ae-forgotten-export) The symbol "SharedConnection" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "SharedConnection" needs to be exported by the entry point index.d.ts // // (undocumented) removeSharedConnection(connection: SharedConnection): void; - // Warning: (ae-forgotten-export) The symbol "Pool" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "Pool" needs to be exported by the entry point index.d.ts // // (undocumented) removeSharedConnectionPool(pool: Pool): void; - // (undocumented) + // (undocumented) send(typeOrPayload: any, payload?: any): void; - // (undocumented) - state: 'initializing' | 'reconnecting' | 'connected'; - // (undocumented) - useChannel<C extends keyof Channels>(channel: C, params?: Channels[C]['params'], name?: string): ChannelConnection<Channels[C]>; -} + // (undocumented) + state: "initializing" | "reconnecting" | "connected"; + // (undocumented) + useChannel<C extends keyof Channels>( + channel: C, + params?: Channels[C]["params"], + name?: string, + ): ChannelConnection<Channels[C]>; + } // @public (undocumented) type User = UserLite | UserDetailed; // @public (undocumented) type UserDetailed = UserLite & { - bannerBlurhash: string | null; - bannerColor: string | null; - bannerUrl: string | null; - birthday: string | null; - createdAt: DateString; - description: string | null; - ffVisibility: 'public' | 'followers' | 'private'; - fields: { - name: string; - value: string; - }[]; - followersCount: number; - followingCount: number; - hasPendingFollowRequestFromYou: boolean; - hasPendingFollowRequestToYou: boolean; - isAdmin: boolean; - isBlocked: boolean; - isBlocking: boolean; - isBot: boolean; - isCat: boolean; - isFollowed: boolean; - isFollowing: boolean; - isLocked: boolean; - isModerator: boolean; - isMuted: boolean; - isSilenced: boolean; - isSuspended: boolean; - lang: string | null; - lastFetchedAt?: DateString; - location: string | null; - notesCount: number; - pinnedNoteIds: ID[]; - pinnedNotes: Note[]; - pinnedPage: Page | null; - pinnedPageId: string | null; - publicReactions: boolean; - securityKeys: boolean; - twoFactorEnabled: boolean; - updatedAt: DateString | null; - uri: string | null; - url: string | null; + bannerBlurhash: string | null; + bannerColor: string | null; + bannerUrl: string | null; + birthday: string | null; + createdAt: DateString; + description: string | null; + ffVisibility: "public" | "followers" | "private"; + fields: { + name: string; + value: string; + }[]; + followersCount: number; + followingCount: number; + hasPendingFollowRequestFromYou: boolean; + hasPendingFollowRequestToYou: boolean; + isAdmin: boolean; + isBlocked: boolean; + isBlocking: boolean; + isBot: boolean; + isCat: boolean; + isFollowed: boolean; + isFollowing: boolean; + isLocked: boolean; + isModerator: boolean; + isMuted: boolean; + isRenoteMuted: boolean; + isSilenced: boolean; + isSuspended: boolean; + lang: string | null; + lastFetchedAt?: DateString; + location: string | null; + notesCount: number; + pinnedNoteIds: ID[]; + pinnedNotes: Note[]; + pinnedPage: Page | null; + pinnedPageId: string | null; + publicReactions: boolean; + securityKeys: boolean; + twoFactorEnabled: boolean; + updatedAt: DateString | null; + uri: string | null; + url: string | null; }; // @public (undocumented) @@ -2650,46 +2786,53 @@ type UserGroup = TODO_2; // @public (undocumented) type UserList = { - id: ID; - createdAt: DateString; - name: string; - userIds: User['id'][]; + id: ID; + createdAt: DateString; + name: string; + userIds: User["id"][]; }; // @public (undocumented) type UserLite = { - id: ID; - username: string; - host: string | null; - name: string; - onlineStatus: 'online' | 'active' | 'offline' | 'unknown'; - avatarUrl: string; - avatarBlurhash: string; - alsoKnownAs: string[]; - movedToUri: any; - emojis: { - name: string; - url: string; - }[]; - instance?: { - name: Instance['name']; - softwareName: Instance['softwareName']; - softwareVersion: Instance['softwareVersion']; - iconUrl: Instance['iconUrl']; - faviconUrl: Instance['faviconUrl']; - themeColor: Instance['themeColor']; - }; + id: ID; + username: string; + host: string | null; + name: string; + onlineStatus: "online" | "active" | "offline" | "unknown"; + avatarUrl: string; + avatarBlurhash: string; + alsoKnownAs: string[]; + movedToUri: any; + emojis: { + name: string; + url: string; + }[]; + instance?: { + name: Instance["name"]; + softwareName: Instance["softwareName"]; + softwareVersion: Instance["softwareVersion"]; + iconUrl: Instance["iconUrl"]; + faviconUrl: Instance["faviconUrl"]; + themeColor: Instance["themeColor"]; + }; }; // @public (undocumented) -type UserSorting = '+follower' | '-follower' | '+createdAt' | '-createdAt' | '+updatedAt' | '-updatedAt'; +type UserSorting = + | "+follower" + | "-follower" + | "+createdAt" + | "-createdAt" + | "+updatedAt" + | "-updatedAt"; // Warnings were encountered during analysis: // -// src/api.types.ts:16:32 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts -// src/api.types.ts:18:25 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts -// src/api.types.ts:601:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts -// src/streaming.types.ts:35:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts +// src/api.types.ts:80:37 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts +// src/api.types.ts:83:28 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts +// src/api.types.ts:853:5 - (ae-forgotten-export) The symbol "NoteSubmitReq" needs to be exported by the entry point index.d.ts +// src/api.types.ts:1094:3 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts +// src/streaming.types.ts:56:18 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/calckey-js/markdown/calckey-js.acct.md b/packages/calckey-js/markdown/calckey-js.acct.md new file mode 100644 index 0000000000..2535e0e9a8 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.acct.md @@ -0,0 +1,14 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Acct](./calckey-js.acct.md) + +## Acct type + +**Signature:** + +```typescript +export declare type Acct = { + username: string; + host: string | null; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md b/packages/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md new file mode 100644 index 0000000000..ed4c03effc --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md @@ -0,0 +1,24 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [(constructor)](./calckey-js.api.apiclient._constructor_.md) + +## api.APIClient.(constructor) + +Constructs a new instance of the `APIClient` class + +**Signature:** + +```typescript +constructor(opts: { + origin: APIClient["origin"]; + credential?: APIClient["credential"]; + fetch?: APIClient["fetch"] | null | undefined; + }); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| opts | { origin: [APIClient](./calckey-js.api.apiclient.md)<!-- -->\["origin"\]; credential?: [APIClient](./calckey-js.api.apiclient.md)<!-- -->\["credential"\]; fetch?: [APIClient](./calckey-js.api.apiclient.md)<!-- -->\["fetch"\] \| null \| undefined; } | | + diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.credential.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.credential.md new file mode 100644 index 0000000000..2c14d244a3 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.credential.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [credential](./calckey-js.api.apiclient.credential.md) + +## api.APIClient.credential property + +**Signature:** + +```typescript +credential: string | null | undefined; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.fetch.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.fetch.md new file mode 100644 index 0000000000..c7108c23db --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.fetch.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [fetch](./calckey-js.api.apiclient.fetch.md) + +## api.APIClient.fetch property + +**Signature:** + +```typescript +fetch: FetchLike; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.md new file mode 100644 index 0000000000..92dff826fa --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.md @@ -0,0 +1,32 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) + +## api.APIClient class + +**Signature:** + +```typescript +export declare class APIClient +``` + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(opts)](./calckey-js.api.apiclient._constructor_.md) | | Constructs a new instance of the <code>APIClient</code> class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [credential](./calckey-js.api.apiclient.credential.md) | | string \| null \| undefined | | +| [fetch](./calckey-js.api.apiclient.fetch.md) | | [FetchLike](./calckey-js.api.fetchlike.md) | | +| [origin](./calckey-js.api.apiclient.origin.md) | | string | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [request(endpoint, params, credential)](./calckey-js.api.apiclient.request.md) | | | + diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.origin.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.origin.md new file mode 100644 index 0000000000..1f6a4be912 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.origin.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [origin](./calckey-js.api.apiclient.origin.md) + +## api.APIClient.origin property + +**Signature:** + +```typescript +origin: string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.request.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.request.md new file mode 100644 index 0000000000..a330011777 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.request.md @@ -0,0 +1,57 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [request](./calckey-js.api.apiclient.request.md) + +## api.APIClient.request() method + +**Signature:** + +```typescript +request<E extends keyof Endpoints, P extends Endpoints[E]["req"]>( + endpoint: E, + params?: P, + credential?: string | null | undefined, + ): Promise< + Endpoints[E]["res"] extends { + $switch: { + $cases: [any, any][]; + $default: any; + }; + } + ? IsCaseMatched<E, P, 0> extends true + ? GetCaseResult<E, P, 0> + : IsCaseMatched<E, P, 1> extends true + ? GetCaseResult<E, P, 1> + : IsCaseMatched<E, P, 2> extends true + ? GetCaseResult<E, P, 2> + : IsCaseMatched<E, P, 3> extends true + ? GetCaseResult<E, P, 3> + : IsCaseMatched<E, P, 4> extends true + ? GetCaseResult<E, P, 4> + : IsCaseMatched<E, P, 5> extends true + ? GetCaseResult<E, P, 5> + : IsCaseMatched<E, P, 6> extends true + ? GetCaseResult<E, P, 6> + : IsCaseMatched<E, P, 7> extends true + ? GetCaseResult<E, P, 7> + : IsCaseMatched<E, P, 8> extends true + ? GetCaseResult<E, P, 8> + : IsCaseMatched<E, P, 9> extends true + ? GetCaseResult<E, P, 9> + : Endpoints[E]["res"]["$switch"]["$default"] + : Endpoints[E]["res"] + >; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| endpoint | E | | +| params | P | _(Optional)_ | +| credential | string \| null \| undefined | _(Optional)_ | + +**Returns:** + +Promise< [Endpoints](./calckey-js.endpoints.md)<!-- -->\[E\]\["res"\] extends { $switch: { $cases: \[any, any\]\[\]; $default: any; }; } ? IsCaseMatched<E, P, 0> extends true ? GetCaseResult<E, P, 0> : IsCaseMatched<E, P, 1> extends true ? GetCaseResult<E, P, 1> : IsCaseMatched<E, P, 2> extends true ? GetCaseResult<E, P, 2> : IsCaseMatched<E, P, 3> extends true ? GetCaseResult<E, P, 3> : IsCaseMatched<E, P, 4> extends true ? GetCaseResult<E, P, 4> : IsCaseMatched<E, P, 5> extends true ? GetCaseResult<E, P, 5> : IsCaseMatched<E, P, 6> extends true ? GetCaseResult<E, P, 6> : IsCaseMatched<E, P, 7> extends true ? GetCaseResult<E, P, 7> : IsCaseMatched<E, P, 8> extends true ? GetCaseResult<E, P, 8> : IsCaseMatched<E, P, 9> extends true ? GetCaseResult<E, P, 9> : [Endpoints](./calckey-js.endpoints.md)<!-- -->\[E\]\["res"\]\["$switch"\]\["$default"\] : [Endpoints](./calckey-js.endpoints.md)<!-- -->\[E\]\["res"\] > + diff --git a/packages/calckey-js/markdown/calckey-js.api.apierror.md b/packages/calckey-js/markdown/calckey-js.api.apierror.md new file mode 100644 index 0000000000..7927cfd895 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apierror.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIError](./calckey-js.api.apierror.md) + +## api.APIError type + +**Signature:** + +```typescript +export declare type APIError = { + id: string; + code: string; + message: string; + kind: "client" | "server"; + info: Record<string, any>; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.fetchlike.md b/packages/calckey-js/markdown/calckey-js.api.fetchlike.md new file mode 100644 index 0000000000..9ec29fa2d5 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.fetchlike.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [FetchLike](./calckey-js.api.fetchlike.md) + +## api.FetchLike type + +**Signature:** + +```typescript +export declare type FetchLike = ( + input: string, + init?: { + method?: string; + body?: string; + credentials?: RequestCredentials; + cache?: RequestCache; + }, +) => Promise<{ + status: number; + json(): Promise<any>; +}>; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.isapierror.md b/packages/calckey-js/markdown/calckey-js.api.isapierror.md new file mode 100644 index 0000000000..965bf9ce27 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.isapierror.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [isAPIError](./calckey-js.api.isapierror.md) + +## api.isAPIError() function + +**Signature:** + +```typescript +export declare function isAPIError(reason: any): reason is APIError; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| reason | any | | + +**Returns:** + +reason is [APIError](./calckey-js.api.apierror.md) + diff --git a/packages/calckey-js/markdown/calckey-js.api.md b/packages/calckey-js/markdown/calckey-js.api.md new file mode 100644 index 0000000000..eee1920abc --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.md @@ -0,0 +1,25 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) + +## api namespace + +## Classes + +| Class | Description | +| --- | --- | +| [APIClient](./calckey-js.api.apiclient.md) | | + +## Functions + +| Function | Description | +| --- | --- | +| [isAPIError(reason)](./calckey-js.api.isapierror.md) | | + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [APIError](./calckey-js.api.apierror.md) | | +| [FetchLike](./calckey-js.api.fetchlike.md) | | + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection._constructor_.md b/packages/calckey-js/markdown/calckey-js.channelconnection._constructor_.md new file mode 100644 index 0000000000..65f7c3eee0 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection._constructor_.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [(constructor)](./calckey-js.channelconnection._constructor_.md) + +## ChannelConnection.(constructor) + +Constructs a new instance of the `Connection` class + +**Signature:** + +```typescript +constructor(stream: Stream, channel: string, name?: string); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| stream | [Stream](./calckey-js.stream.md) | | +| channel | string | | +| name | string | _(Optional)_ | + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.channel.md b/packages/calckey-js/markdown/calckey-js.channelconnection.channel.md new file mode 100644 index 0000000000..bbf36efced --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.channel.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [channel](./calckey-js.channelconnection.channel.md) + +## ChannelConnection.channel property + +**Signature:** + +```typescript +channel: string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.dispose.md b/packages/calckey-js/markdown/calckey-js.channelconnection.dispose.md new file mode 100644 index 0000000000..847e7dfae4 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.dispose.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [dispose](./calckey-js.channelconnection.dispose.md) + +## ChannelConnection.dispose() method + +**Signature:** + +```typescript +abstract dispose(): void; +``` +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.id.md b/packages/calckey-js/markdown/calckey-js.channelconnection.id.md new file mode 100644 index 0000000000..b145ffa067 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.id.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [id](./calckey-js.channelconnection.id.md) + +## ChannelConnection.id property + +**Signature:** + +```typescript +abstract id: string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.incount.md b/packages/calckey-js/markdown/calckey-js.channelconnection.incount.md new file mode 100644 index 0000000000..b7ef319e2d --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.incount.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [inCount](./calckey-js.channelconnection.incount.md) + +## ChannelConnection.inCount property + +**Signature:** + +```typescript +inCount: number; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.md b/packages/calckey-js/markdown/calckey-js.channelconnection.md new file mode 100644 index 0000000000..0429baa805 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.md @@ -0,0 +1,39 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) + +## ChannelConnection class + +**Signature:** + +```typescript +export declare abstract class Connection< + Channel extends AnyOf<Channels> = any, +> extends EventEmitter<Channel["events"]> +``` +**Extends:** EventEmitter<Channel\["events"\]> + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(stream, channel, name)](./calckey-js.channelconnection._constructor_.md) | | Constructs a new instance of the <code>Connection</code> class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [channel](./calckey-js.channelconnection.channel.md) | | string | | +| [id](./calckey-js.channelconnection.id.md) | <code>abstract</code> | string | | +| [inCount](./calckey-js.channelconnection.incount.md) | | number | | +| [name?](./calckey-js.channelconnection.name.md) | | string | _(Optional)_ | +| [outCount](./calckey-js.channelconnection.outcount.md) | | number | | +| [stream](./calckey-js.channelconnection.stream.md) | <code>protected</code> | [Stream](./calckey-js.stream.md) | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [dispose()](./calckey-js.channelconnection.dispose.md) | <code>abstract</code> | | +| [send(type, body)](./calckey-js.channelconnection.send.md) | | | + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.name.md b/packages/calckey-js/markdown/calckey-js.channelconnection.name.md new file mode 100644 index 0000000000..b364bdf844 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.name.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [name](./calckey-js.channelconnection.name.md) + +## ChannelConnection.name property + +**Signature:** + +```typescript +name?: string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.outcount.md b/packages/calckey-js/markdown/calckey-js.channelconnection.outcount.md new file mode 100644 index 0000000000..e300757688 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.outcount.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [outCount](./calckey-js.channelconnection.outcount.md) + +## ChannelConnection.outCount property + +**Signature:** + +```typescript +outCount: number; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.send.md b/packages/calckey-js/markdown/calckey-js.channelconnection.send.md new file mode 100644 index 0000000000..2ee5c20159 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.send.md @@ -0,0 +1,26 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [send](./calckey-js.channelconnection.send.md) + +## ChannelConnection.send() method + +**Signature:** + +```typescript +send<T extends keyof Channel["receives"]>( + type: T, + body: Channel["receives"][T], + ): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| type | T | | +| body | Channel\["receives"\]\[T\] | | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.stream.md b/packages/calckey-js/markdown/calckey-js.channelconnection.stream.md new file mode 100644 index 0000000000..2e1fc584c2 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.stream.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [stream](./calckey-js.channelconnection.stream.md) + +## ChannelConnection.stream property + +**Signature:** + +```typescript +protected stream: Stream; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channels.md b/packages/calckey-js/markdown/calckey-js.channels.md new file mode 100644 index 0000000000..952a79f044 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channels.md @@ -0,0 +1,143 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Channels](./calckey-js.channels.md) + +## Channels type + +**Signature:** + +```typescript +export declare type Channels = { + main: { + params: null; + events: { + notification: (payload: Notification) => void; + mention: (payload: Note) => void; + reply: (payload: Note) => void; + renote: (payload: Note) => void; + follow: (payload: User) => void; + followed: (payload: User) => void; + unfollow: (payload: User) => void; + meUpdated: (payload: MeDetailed) => void; + pageEvent: (payload: PageEvent) => void; + urlUploadFinished: (payload: { + marker: string; + file: DriveFile; + }) => void; + readAllNotifications: () => void; + unreadNotification: (payload: Notification) => void; + unreadMention: (payload: Note["id"]) => void; + readAllUnreadMentions: () => void; + unreadSpecifiedNote: (payload: Note["id"]) => void; + readAllUnreadSpecifiedNotes: () => void; + readAllMessagingMessages: () => void; + messagingMessage: (payload: MessagingMessage) => void; + unreadMessagingMessage: (payload: MessagingMessage) => void; + readAllAntennas: () => void; + unreadAntenna: (payload: Antenna) => void; + readAllAnnouncements: () => void; + readAllChannels: () => void; + unreadChannel: (payload: Note["id"]) => void; + myTokenRegenerated: () => void; + reversiNoInvites: () => void; + reversiInvited: (payload: FIXME) => void; + signin: (payload: FIXME) => void; + registryUpdated: (payload: { + scope?: string[]; + key: string; + value: any | null; + }) => void; + driveFileCreated: (payload: DriveFile) => void; + readAntenna: (payload: Antenna) => void; + }; + receives: null; + }; + homeTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + localTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + hybridTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + recommendedTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + globalTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + messaging: { + params: { + otherparty?: User["id"] | null; + group?: UserGroup["id"] | null; + }; + events: { + message: (payload: MessagingMessage) => void; + deleted: (payload: MessagingMessage["id"]) => void; + read: (payload: MessagingMessage["id"][]) => void; + typers: (payload: User[]) => void; + }; + receives: { + read: { + id: MessagingMessage["id"]; + }; + }; + }; + serverStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; + queueStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; +}; +``` +**References:** [Note](./calckey-js.entities.note.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [MeDetailed](./calckey-js.entities.medetailed.md)<!-- -->, [PageEvent](./calckey-js.entities.pageevent.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md)<!-- -->, [MessagingMessage](./calckey-js.entities.messagingmessage.md)<!-- -->, [Antenna](./calckey-js.entities.antenna.md)<!-- -->, [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/packages/calckey-js/markdown/calckey-js.endpoints.md b/packages/calckey-js/markdown/calckey-js.endpoints.md new file mode 100644 index 0000000000..c38a936836 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.endpoints.md @@ -0,0 +1,1911 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Endpoints](./calckey-js.endpoints.md) + +## Endpoints type + +**Signature:** + +```typescript +export declare type Endpoints = { + "admin/abuse-user-reports": { + req: TODO; + res: TODO; + }; + "admin/delete-all-files-of-a-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "admin/delete-logs": { + req: NoParams; + res: null; + }; + "admin/get-index-stats": { + req: TODO; + res: TODO; + }; + "admin/get-table-stats": { + req: TODO; + res: TODO; + }; + "admin/invite": { + req: TODO; + res: TODO; + }; + "admin/logs": { + req: TODO; + res: TODO; + }; + "admin/meta": { + req: TODO; + res: TODO; + }; + "admin/reset-password": { + req: TODO; + res: TODO; + }; + "admin/resolve-abuse-user-report": { + req: TODO; + res: TODO; + }; + "admin/resync-chart": { + req: TODO; + res: TODO; + }; + "admin/send-email": { + req: TODO; + res: TODO; + }; + "admin/server-info": { + req: TODO; + res: TODO; + }; + "admin/show-moderation-logs": { + req: TODO; + res: TODO; + }; + "admin/show-user": { + req: TODO; + res: TODO; + }; + "admin/show-users": { + req: TODO; + res: TODO; + }; + "admin/silence-user": { + req: TODO; + res: TODO; + }; + "admin/suspend-user": { + req: TODO; + res: TODO; + }; + "admin/unsilence-user": { + req: TODO; + res: TODO; + }; + "admin/unsuspend-user": { + req: TODO; + res: TODO; + }; + "admin/update-meta": { + req: TODO; + res: TODO; + }; + "admin/vacuum": { + req: TODO; + res: TODO; + }; + "admin/accounts/create": { + req: TODO; + res: TODO; + }; + "admin/ad/create": { + req: TODO; + res: TODO; + }; + "admin/ad/delete": { + req: { + id: Ad["id"]; + }; + res: null; + }; + "admin/ad/list": { + req: TODO; + res: TODO; + }; + "admin/ad/update": { + req: TODO; + res: TODO; + }; + "admin/announcements/create": { + req: TODO; + res: TODO; + }; + "admin/announcements/delete": { + req: { + id: Announcement["id"]; + }; + res: null; + }; + "admin/announcements/list": { + req: TODO; + res: TODO; + }; + "admin/announcements/update": { + req: TODO; + res: TODO; + }; + "admin/drive/clean-remote-files": { + req: TODO; + res: TODO; + }; + "admin/drive/cleanup": { + req: TODO; + res: TODO; + }; + "admin/drive/files": { + req: TODO; + res: TODO; + }; + "admin/drive/show-file": { + req: TODO; + res: TODO; + }; + "admin/emoji/add": { + req: TODO; + res: TODO; + }; + "admin/emoji/copy": { + req: TODO; + res: TODO; + }; + "admin/emoji/list-remote": { + req: TODO; + res: TODO; + }; + "admin/emoji/list": { + req: TODO; + res: TODO; + }; + "admin/emoji/remove": { + req: TODO; + res: TODO; + }; + "admin/emoji/update": { + req: TODO; + res: TODO; + }; + "admin/federation/delete-all-files": { + req: { + host: string; + }; + res: null; + }; + "admin/federation/refresh-remote-instance-metadata": { + req: TODO; + res: TODO; + }; + "admin/federation/remove-all-following": { + req: TODO; + res: TODO; + }; + "admin/federation/update-instance": { + req: TODO; + res: TODO; + }; + "admin/moderators/add": { + req: TODO; + res: TODO; + }; + "admin/moderators/remove": { + req: TODO; + res: TODO; + }; + "admin/promo/create": { + req: TODO; + res: TODO; + }; + "admin/queue/clear": { + req: TODO; + res: TODO; + }; + "admin/queue/deliver-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/inbox-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/jobs": { + req: TODO; + res: TODO; + }; + "admin/queue/stats": { + req: TODO; + res: TODO; + }; + "admin/relays/add": { + req: TODO; + res: TODO; + }; + "admin/relays/list": { + req: TODO; + res: TODO; + }; + "admin/relays/remove": { + req: TODO; + res: TODO; + }; + announcements: { + req: { + limit?: number; + withUnreads?: boolean; + sinceId?: Announcement["id"]; + untilId?: Announcement["id"]; + }; + res: Announcement[]; + }; + "antennas/create": { + req: TODO; + res: Antenna; + }; + "antennas/delete": { + req: { + antennaId: Antenna["id"]; + }; + res: null; + }; + "antennas/list": { + req: NoParams; + res: Antenna[]; + }; + "antennas/notes": { + req: { + antennaId: Antenna["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "antennas/show": { + req: { + antennaId: Antenna["id"]; + }; + res: Antenna; + }; + "antennas/update": { + req: TODO; + res: Antenna; + }; + "antennas/mark-read": { + req: TODO; + res: Antenna; + }; + "ap/get": { + req: { + uri: string; + }; + res: Record<string, any>; + }; + "ap/show": { + req: { + uri: string; + }; + res: + | { + type: "Note"; + object: Note; + } + | { + type: "User"; + object: UserDetailed; + }; + }; + "app/create": { + req: TODO; + res: App; + }; + "app/show": { + req: { + appId: App["id"]; + }; + res: App; + }; + "auth/accept": { + req: { + token: string; + }; + res: null; + }; + "auth/session/generate": { + req: { + appSecret: string; + }; + res: { + token: string; + url: string; + }; + }; + "auth/session/show": { + req: { + token: string; + }; + res: AuthSession; + }; + "auth/session/userkey": { + req: { + appSecret: string; + token: string; + }; + res: { + accessToken: string; + user: User; + }; + }; + "blocking/create": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/delete": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/list": { + req: { + limit?: number; + sinceId?: Blocking["id"]; + untilId?: Blocking["id"]; + }; + res: Blocking[]; + }; + "channels/create": { + req: TODO; + res: TODO; + }; + "channels/featured": { + req: TODO; + res: TODO; + }; + "channels/follow": { + req: TODO; + res: TODO; + }; + "channels/followed": { + req: TODO; + res: TODO; + }; + "channels/owned": { + req: TODO; + res: TODO; + }; + "channels/pin-note": { + req: TODO; + res: TODO; + }; + "channels/show": { + req: TODO; + res: TODO; + }; + "channels/timeline": { + req: TODO; + res: TODO; + }; + "channels/unfollow": { + req: TODO; + res: TODO; + }; + "channels/update": { + req: TODO; + res: TODO; + }; + "charts/active-users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + users: number[]; + }; + remote: { + users: number[]; + }; + }; + }; + "charts/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + remote: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + }; + "charts/federation": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + instance: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/hashtag": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/instance": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + host: string; + }; + res: { + drive: { + decFiles: number[]; + decUsage: number[]; + incFiles: number[]; + incUsage: number[]; + totalFiles: number[]; + totalUsage: number[]; + }; + followers: { + dec: number[]; + inc: number[]; + total: number[]; + }; + following: { + dec: number[]; + inc: number[]; + total: number[]; + }; + notes: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + requests: { + failed: number[]; + received: number[]; + succeeded: number[]; + }; + users: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/network": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + }; + "charts/user/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + "charts/user/following": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/user/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + "charts/user/reactions": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "clips/add-note": { + req: TODO; + res: TODO; + }; + "clips/create": { + req: TODO; + res: TODO; + }; + "clips/delete": { + req: { + clipId: Clip["id"]; + }; + res: null; + }; + "clips/list": { + req: TODO; + res: TODO; + }; + "clips/notes": { + req: TODO; + res: TODO; + }; + "clips/show": { + req: TODO; + res: TODO; + }; + "clips/update": { + req: TODO; + res: TODO; + }; + drive: { + req: NoParams; + res: { + capacity: number; + usage: number; + }; + }; + "drive/files": { + req: { + folderId?: DriveFolder["id"] | null; + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + "drive/files/attached-notes": { + req: TODO; + res: TODO; + }; + "drive/files/check-existence": { + req: TODO; + res: TODO; + }; + "drive/files/create": { + req: TODO; + res: TODO; + }; + "drive/files/delete": { + req: { + fileId: DriveFile["id"]; + }; + res: null; + }; + "drive/files/find-by-hash": { + req: TODO; + res: TODO; + }; + "drive/files/find": { + req: { + name: string; + folderId?: DriveFolder["id"] | null; + }; + res: DriveFile[]; + }; + "drive/files/show": { + req: { + fileId?: DriveFile["id"]; + url?: string; + }; + res: DriveFile; + }; + "drive/files/update": { + req: { + fileId: DriveFile["id"]; + folderId?: DriveFolder["id"] | null; + name?: string; + isSensitive?: boolean; + comment?: string | null; + }; + res: DriveFile; + }; + "drive/files/upload-from-url": { + req: { + url: string; + folderId?: DriveFolder["id"] | null; + isSensitive?: boolean; + comment?: string | null; + marker?: string | null; + force?: boolean; + }; + res: null; + }; + "drive/folders": { + req: { + folderId?: DriveFolder["id"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFolder[]; + }; + "drive/folders/create": { + req: { + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/folders/delete": { + req: { + folderId: DriveFolder["id"]; + }; + res: null; + }; + "drive/folders/find": { + req: { + name: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder[]; + }; + "drive/folders/show": { + req: { + folderId: DriveFolder["id"]; + }; + res: DriveFolder; + }; + "drive/folders/update": { + req: { + folderId: DriveFolder["id"]; + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/stream": { + req: { + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + endpoint: { + req: { + endpoint: string; + }; + res: { + params: { + name: string; + type: string; + }[]; + }; + }; + endpoints: { + req: NoParams; + res: string[]; + }; + "federation/dns": { + req: { + host: string; + }; + res: { + a: string[]; + aaaa: string[]; + cname: string[]; + txt: string[]; + }; + }; + "federation/followers": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/following": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/instances": { + req: { + host?: string | null; + blocked?: boolean | null; + notResponding?: boolean | null; + suspended?: boolean | null; + federating?: boolean | null; + subscribing?: boolean | null; + publishing?: boolean | null; + limit?: number; + offset?: number; + sort?: + | "+pubSub" + | "-pubSub" + | "+notes" + | "-notes" + | "+users" + | "-users" + | "+following" + | "-following" + | "+followers" + | "-followers" + | "+caughtAt" + | "-caughtAt" + | "+lastCommunicatedAt" + | "-lastCommunicatedAt" + | "+driveUsage" + | "-driveUsage" + | "+driveFiles" + | "-driveFiles"; + }; + res: Instance[]; + }; + "federation/show-instance": { + req: { + host: string; + }; + res: Instance; + }; + "federation/update-remote-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "federation/users": { + req: { + host: string; + limit?: number; + sinceId?: User["id"]; + untilId?: User["id"]; + }; + res: UserDetailed[]; + }; + "following/create": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/delete": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/accept": { + req: { + userId: User["id"]; + }; + res: null; + }; + "following/requests/cancel": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/list": { + req: NoParams; + res: FollowRequest[]; + }; + "following/requests/reject": { + req: { + userId: User["id"]; + }; + res: null; + }; + "gallery/featured": { + req: TODO; + res: TODO; + }; + "gallery/popular": { + req: TODO; + res: TODO; + }; + "gallery/posts": { + req: TODO; + res: TODO; + }; + "gallery/posts/create": { + req: TODO; + res: TODO; + }; + "gallery/posts/delete": { + req: { + postId: GalleryPost["id"]; + }; + res: null; + }; + "gallery/posts/like": { + req: TODO; + res: TODO; + }; + "gallery/posts/show": { + req: TODO; + res: TODO; + }; + "gallery/posts/unlike": { + req: TODO; + res: TODO; + }; + "gallery/posts/update": { + req: TODO; + res: TODO; + }; + "games/reversi/games": { + req: TODO; + res: TODO; + }; + "games/reversi/games/show": { + req: TODO; + res: TODO; + }; + "games/reversi/games/surrender": { + req: TODO; + res: TODO; + }; + "games/reversi/invitations": { + req: TODO; + res: TODO; + }; + "games/reversi/match": { + req: TODO; + res: TODO; + }; + "games/reversi/match/cancel": { + req: TODO; + res: TODO; + }; + "get-online-users-count": { + req: NoParams; + res: { + count: number; + }; + }; + "hashtags/list": { + req: TODO; + res: TODO; + }; + "hashtags/search": { + req: TODO; + res: TODO; + }; + "hashtags/show": { + req: TODO; + res: TODO; + }; + "hashtags/trend": { + req: TODO; + res: TODO; + }; + "hashtags/users": { + req: TODO; + res: TODO; + }; + i: { + req: NoParams; + res: User; + }; + "i/apps": { + req: TODO; + res: TODO; + }; + "i/authorized-apps": { + req: TODO; + res: TODO; + }; + "i/change-password": { + req: TODO; + res: TODO; + }; + "i/delete-account": { + req: { + password: string; + }; + res: null; + }; + "i/export-blocking": { + req: TODO; + res: TODO; + }; + "i/export-following": { + req: TODO; + res: TODO; + }; + "i/export-mute": { + req: TODO; + res: TODO; + }; + "i/export-notes": { + req: TODO; + res: TODO; + }; + "i/export-user-lists": { + req: TODO; + res: TODO; + }; + "i/favorites": { + req: { + limit?: number; + sinceId?: NoteFavorite["id"]; + untilId?: NoteFavorite["id"]; + }; + res: NoteFavorite[]; + }; + "i/gallery/likes": { + req: TODO; + res: TODO; + }; + "i/gallery/posts": { + req: TODO; + res: TODO; + }; + "i/get-word-muted-notes-count": { + req: TODO; + res: TODO; + }; + "i/import-following": { + req: TODO; + res: TODO; + }; + "i/import-user-lists": { + req: TODO; + res: TODO; + }; + "i/move": { + req: TODO; + res: TODO; + }; + "i/known-as": { + req: TODO; + res: TODO; + }; + "i/notifications": { + req: { + limit?: number; + sinceId?: Notification["id"]; + untilId?: Notification["id"]; + following?: boolean; + markAsRead?: boolean; + includeTypes?: Notification["type"][]; + excludeTypes?: Notification["type"][]; + }; + res: Notification[]; + }; + "i/page-likes": { + req: TODO; + res: TODO; + }; + "i/pages": { + req: TODO; + res: TODO; + }; + "i/pin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/read-all-messaging-messages": { + req: TODO; + res: TODO; + }; + "i/read-all-unread-notes": { + req: TODO; + res: TODO; + }; + "i/read-announcement": { + req: TODO; + res: TODO; + }; + "i/regenerate-token": { + req: { + password: string; + }; + res: null; + }; + "i/registry/get-all": { + req: { + scope?: string[]; + }; + res: Record<string, any>; + }; + "i/registry/get-detail": { + req: { + key: string; + scope?: string[]; + }; + res: { + updatedAt: DateString; + value: any; + }; + }; + "i/registry/get": { + req: { + key: string; + scope?: string[]; + }; + res: any; + }; + "i/registry/keys-with-type": { + req: { + scope?: string[]; + }; + res: Record< + string, + "null" | "array" | "number" | "string" | "boolean" | "object" + >; + }; + "i/registry/keys": { + req: { + scope?: string[]; + }; + res: string[]; + }; + "i/registry/remove": { + req: { + key: string; + scope?: string[]; + }; + res: null; + }; + "i/registry/scopes": { + req: NoParams; + res: string[][]; + }; + "i/registry/set": { + req: { + key: string; + value: any; + scope?: string[]; + }; + res: null; + }; + "i/revoke-token": { + req: TODO; + res: TODO; + }; + "i/signin-history": { + req: { + limit?: number; + sinceId?: Signin["id"]; + untilId?: Signin["id"]; + }; + res: Signin[]; + }; + "i/unpin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/update-email": { + req: { + password: string; + email?: string | null; + }; + res: MeDetailed; + }; + "i/update": { + req: { + name?: string | null; + description?: string | null; + lang?: string | null; + location?: string | null; + birthday?: string | null; + avatarId?: DriveFile["id"] | null; + bannerId?: DriveFile["id"] | null; + fields?: { + name: string; + value: string; + }[]; + isLocked?: boolean; + isExplorable?: boolean; + hideOnlineStatus?: boolean; + carefulBot?: boolean; + autoAcceptFollowed?: boolean; + noCrawle?: boolean; + preventAiLearning?: boolean; + isBot?: boolean; + isCat?: boolean; + injectFeaturedNote?: boolean; + receiveAnnouncementEmail?: boolean; + alwaysMarkNsfw?: boolean; + mutedWords?: string[][]; + mutingNotificationTypes?: Notification["type"][]; + emailNotificationTypes?: string[]; + }; + res: MeDetailed; + }; + "i/user-group-invites": { + req: TODO; + res: TODO; + }; + "i/2fa/done": { + req: TODO; + res: TODO; + }; + "i/2fa/key-done": { + req: TODO; + res: TODO; + }; + "i/2fa/password-less": { + req: TODO; + res: TODO; + }; + "i/2fa/register-key": { + req: TODO; + res: TODO; + }; + "i/2fa/register": { + req: TODO; + res: TODO; + }; + "i/2fa/update-key": { + req: TODO; + res: TODO; + }; + "i/2fa/remove-key": { + req: TODO; + res: TODO; + }; + "i/2fa/unregister": { + req: TODO; + res: TODO; + }; + "messaging/history": { + req: { + limit?: number; + group?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + limit?: number; + sinceId?: MessagingMessage["id"]; + untilId?: MessagingMessage["id"]; + markAsRead?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages/create": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + text?: string; + fileId?: DriveFile["id"]; + }; + res: MessagingMessage; + }; + "messaging/messages/delete": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + "messaging/messages/read": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + meta: { + req: { + detail?: boolean; + }; + res: { + $switch: { + $cases: [ + [ + { + detail: true; + }, + DetailedInstanceMetadata, + ], + [ + { + detail: false; + }, + LiteInstanceMetadata, + ], + [ + { + detail: boolean; + }, + LiteInstanceMetadata | DetailedInstanceMetadata, + ], + ]; + $default: LiteInstanceMetadata; + }; + }; + }; + "miauth/gen-token": { + req: TODO; + res: TODO; + }; + "mute/create": { + req: TODO; + res: TODO; + }; + "mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "mute/list": { + req: TODO; + res: TODO; + }; + "renote-mute/create": { + req: TODO; + res: TODO; + }; + "renote-mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "renote-mute/list": { + req: TODO; + res: TODO; + }; + "my/apps": { + req: TODO; + res: TODO; + }; + notes: { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/children": { + req: { + noteId: Note["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/clips": { + req: TODO; + res: TODO; + }; + "notes/conversation": { + req: TODO; + res: TODO; + }; + "notes/create": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/edit": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/favorites/create": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/favorites/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/featured": { + req: TODO; + res: Note[]; + }; + "notes/global-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/recommended-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/hybrid-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/local-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/mentions": { + req: { + following?: boolean; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/polls/recommendation": { + req: TODO; + res: TODO; + }; + "notes/polls/vote": { + req: { + noteId: Note["id"]; + choice: number; + }; + res: null; + }; + "notes/reactions": { + req: { + noteId: Note["id"]; + type?: string | null; + limit?: number; + }; + res: NoteReaction[]; + }; + "notes/reactions/create": { + req: { + noteId: Note["id"]; + reaction: string; + }; + res: null; + }; + "notes/reactions/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/renotes": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/replies": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/search-by-tag": { + req: TODO; + res: TODO; + }; + "notes/search": { + req: TODO; + res: TODO; + }; + "notes/show": { + req: { + noteId: Note["id"]; + }; + res: Note; + }; + "notes/state": { + req: TODO; + res: TODO; + }; + "notes/timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/unrenote": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/user-list-timeline": { + req: { + listId: UserList["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/watching/create": { + req: TODO; + res: TODO; + }; + "notes/watching/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notifications/create": { + req: { + body: string; + header?: string | null; + icon?: string | null; + }; + res: null; + }; + "notifications/mark-all-as-read": { + req: NoParams; + res: null; + }; + "notifications/read": { + req: { + notificationId: Notification["id"]; + }; + res: null; + }; + "page-push": { + req: { + pageId: Page["id"]; + event: string; + var?: any; + }; + res: null; + }; + "pages/create": { + req: TODO; + res: Page; + }; + "pages/delete": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/featured": { + req: NoParams; + res: Page[]; + }; + "pages/like": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/show": { + req: { + pageId?: Page["id"]; + name?: string; + username?: string; + }; + res: Page; + }; + "pages/unlike": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/update": { + req: TODO; + res: null; + }; + ping: { + req: NoParams; + res: { + pong: number; + }; + }; + "pinned-users": { + req: TODO; + res: TODO; + }; + "promo/read": { + req: TODO; + res: TODO; + }; + "request-reset-password": { + req: { + username: string; + email: string; + }; + res: null; + }; + "reset-password": { + req: { + token: string; + password: string; + }; + res: null; + }; + "room/show": { + req: TODO; + res: TODO; + }; + "room/update": { + req: TODO; + res: TODO; + }; + stats: { + req: NoParams; + res: Stats; + }; + "server-info": { + req: NoParams; + res: ServerInfo; + }; + "latest-version": { + req: NoParams; + res: TODO; + }; + "sw/register": { + req: TODO; + res: TODO; + }; + "username/available": { + req: { + username: string; + }; + res: { + available: boolean; + }; + }; + users: { + req: { + limit?: number; + offset?: number; + sort?: UserSorting; + origin?: OriginType; + }; + res: User[]; + }; + "users/clips": { + req: TODO; + res: TODO; + }; + "users/followers": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFollowerPopulated[]; + }; + "users/following": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "users/gallery/posts": { + req: TODO; + res: TODO; + }; + "users/get-frequently-replied-users": { + req: TODO; + res: TODO; + }; + "users/groups/create": { + req: TODO; + res: TODO; + }; + "users/groups/delete": { + req: { + groupId: UserGroup["id"]; + }; + res: null; + }; + "users/groups/invitations/accept": { + req: TODO; + res: TODO; + }; + "users/groups/invitations/reject": { + req: TODO; + res: TODO; + }; + "users/groups/invite": { + req: TODO; + res: TODO; + }; + "users/groups/joined": { + req: TODO; + res: TODO; + }; + "users/groups/owned": { + req: TODO; + res: TODO; + }; + "users/groups/pull": { + req: TODO; + res: TODO; + }; + "users/groups/show": { + req: TODO; + res: TODO; + }; + "users/groups/transfer": { + req: TODO; + res: TODO; + }; + "users/groups/update": { + req: TODO; + res: TODO; + }; + "users/lists/create": { + req: { + name: string; + }; + res: UserList; + }; + "users/lists/delete": { + req: { + listId: UserList["id"]; + }; + res: null; + }; + "users/lists/list": { + req: NoParams; + res: UserList[]; + }; + "users/lists/pull": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/push": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/show": { + req: { + listId: UserList["id"]; + }; + res: UserList; + }; + "users/lists/update": { + req: { + listId: UserList["id"]; + name: string; + }; + res: UserList; + }; + "users/notes": { + req: { + userId: User["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "users/pages": { + req: TODO; + res: TODO; + }; + "users/recommendation": { + req: TODO; + res: TODO; + }; + "users/relation": { + req: TODO; + res: TODO; + }; + "users/report-abuse": { + req: TODO; + res: TODO; + }; + "users/search-by-username-and-host": { + req: TODO; + res: TODO; + }; + "users/search": { + req: TODO; + res: TODO; + }; + "users/show": { + req: + | ShowUserReq + | { + userIds: User["id"][]; + }; + res: { + $switch: { + $cases: [ + [ + { + userIds: User["id"][]; + }, + UserDetailed[], + ], + ]; + $default: UserDetailed; + }; + }; + }; + "users/stats": { + req: TODO; + res: TODO; + }; +}; +``` +**References:** [User](./calckey-js.entities.user.md)<!-- -->, [Ad](./calckey-js.entities.ad.md)<!-- -->, [Announcement](./calckey-js.entities.announcement.md)<!-- -->, [Antenna](./calckey-js.entities.antenna.md)<!-- -->, [Note](./calckey-js.entities.note.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md)<!-- -->, [App](./calckey-js.entities.app.md)<!-- -->, [AuthSession](./calckey-js.entities.authsession.md)<!-- -->, [Blocking](./calckey-js.entities.blocking.md)<!-- -->, [Clip](./calckey-js.entities.clip.md)<!-- -->, [DriveFolder](./calckey-js.entities.drivefolder.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md)<!-- -->, [Following](./calckey-js.entities.following.md)<!-- -->, [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md)<!-- -->, [Instance](./calckey-js.entities.instance.md)<!-- -->, [FollowRequest](./calckey-js.entities.followrequest.md)<!-- -->, [GalleryPost](./calckey-js.entities.gallerypost.md)<!-- -->, [NoteFavorite](./calckey-js.entities.notefavorite.md)<!-- -->, [MeDetailed](./calckey-js.entities.medetailed.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [Signin](./calckey-js.entities.signin.md)<!-- -->, [MessagingMessage](./calckey-js.entities.messagingmessage.md)<!-- -->, [UserGroup](./calckey-js.entities.usergroup.md)<!-- -->, [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md)<!-- -->, [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md)<!-- -->, [NoteReaction](./calckey-js.entities.notereaction.md)<!-- -->, [UserList](./calckey-js.entities.userlist.md)<!-- -->, [Page](./calckey-js.entities.page.md)<!-- -->, [Stats](./calckey-js.entities.stats.md)<!-- -->, [ServerInfo](./calckey-js.entities.serverinfo.md)<!-- -->, [UserSorting](./calckey-js.entities.usersorting.md)<!-- -->, [OriginType](./calckey-js.entities.origintype.md)<!-- -->, [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.ad.md b/packages/calckey-js/markdown/calckey-js.entities.ad.md new file mode 100644 index 0000000000..83bc86e489 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.ad.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Ad](./calckey-js.entities.ad.md) + +## entities.Ad type + +**Signature:** + +```typescript +export declare type Ad = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.announcement.md b/packages/calckey-js/markdown/calckey-js.entities.announcement.md new file mode 100644 index 0000000000..09d572a584 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.announcement.md @@ -0,0 +1,21 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Announcement](./calckey-js.entities.announcement.md) + +## entities.Announcement type + +**Signature:** + +```typescript +export declare type Announcement = { + id: ID; + createdAt: DateString; + updatedAt: DateString | null; + text: string; + title: string; + imageUrl: string | null; + isRead?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.antenna.md b/packages/calckey-js/markdown/calckey-js.entities.antenna.md new file mode 100644 index 0000000000..7f05d15a82 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.antenna.md @@ -0,0 +1,29 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Antenna](./calckey-js.entities.antenna.md) + +## entities.Antenna type + +**Signature:** + +```typescript +export declare type Antenna = { + id: ID; + createdAt: DateString; + name: string; + keywords: string[][]; + excludeKeywords: string[][]; + src: "home" | "all" | "users" | "list" | "group" | "instances"; + userListId: ID | null; + userGroupId: ID | null; + users: string[]; + instances: string[]; + caseSensitive: boolean; + notify: boolean; + withReplies: boolean; + withFile: boolean; + hasUnreadNote: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.app.md b/packages/calckey-js/markdown/calckey-js.entities.app.md new file mode 100644 index 0000000000..4f31281e37 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.app.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [App](./calckey-js.entities.app.md) + +## entities.App type + +**Signature:** + +```typescript +export declare type App = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.authsession.md b/packages/calckey-js/markdown/calckey-js.entities.authsession.md new file mode 100644 index 0000000000..36ff409649 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.authsession.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [AuthSession](./calckey-js.entities.authsession.md) + +## entities.AuthSession type + +**Signature:** + +```typescript +export declare type AuthSession = { + id: ID; + app: App; + token: string; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [App](./calckey-js.entities.app.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.blocking.md b/packages/calckey-js/markdown/calckey-js.entities.blocking.md new file mode 100644 index 0000000000..6769b6475f --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.blocking.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Blocking](./calckey-js.entities.blocking.md) + +## entities.Blocking type + +**Signature:** + +```typescript +export declare type Blocking = { + id: ID; + createdAt: DateString; + blockeeId: User["id"]; + blockee: UserDetailed; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.channel.md b/packages/calckey-js/markdown/calckey-js.entities.channel.md new file mode 100644 index 0000000000..6f7d5f3b8f --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.channel.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Channel](./calckey-js.entities.channel.md) + +## entities.Channel type + +**Signature:** + +```typescript +export declare type Channel = { + id: ID; +}; +``` +**References:** [ID](./calckey-js.entities.id.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.clip.md b/packages/calckey-js/markdown/calckey-js.entities.clip.md new file mode 100644 index 0000000000..69607fb497 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.clip.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Clip](./calckey-js.entities.clip.md) + +## entities.Clip type + +**Signature:** + +```typescript +export declare type Clip = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.customemoji.md b/packages/calckey-js/markdown/calckey-js.entities.customemoji.md new file mode 100644 index 0000000000..834eb0ec22 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.customemoji.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [CustomEmoji](./calckey-js.entities.customemoji.md) + +## entities.CustomEmoji type + +**Signature:** + +```typescript +export declare type CustomEmoji = { + id: string; + name: string; + url: string; + category: string; + aliases: string[]; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.datestring.md b/packages/calckey-js/markdown/calckey-js.entities.datestring.md new file mode 100644 index 0000000000..20204330cb --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.datestring.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DateString](./calckey-js.entities.datestring.md) + +## entities.DateString type + +**Signature:** + +```typescript +export declare type DateString = string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md b/packages/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md new file mode 100644 index 0000000000..920e0bca94 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) + +## entities.DetailedInstanceMetadata type + +**Signature:** + +```typescript +export declare type DetailedInstanceMetadata = LiteInstanceMetadata & { + features: Record<string, any>; +}; +``` +**References:** [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.drivefile.md b/packages/calckey-js/markdown/calckey-js.entities.drivefile.md new file mode 100644 index 0000000000..eec361a9b8 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.drivefile.md @@ -0,0 +1,26 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DriveFile](./calckey-js.entities.drivefile.md) + +## entities.DriveFile type + +**Signature:** + +```typescript +export declare type DriveFile = { + id: ID; + createdAt: DateString; + isSensitive: boolean; + name: string; + thumbnailUrl: string; + url: string; + type: string; + size: number; + md5: string; + blurhash: string; + comment: string | null; + properties: Record<string, any>; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.drivefolder.md b/packages/calckey-js/markdown/calckey-js.entities.drivefolder.md new file mode 100644 index 0000000000..4d8c68e8bb --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.drivefolder.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DriveFolder](./calckey-js.entities.drivefolder.md) + +## entities.DriveFolder type + +**Signature:** + +```typescript +export declare type DriveFolder = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.following.md b/packages/calckey-js/markdown/calckey-js.entities.following.md new file mode 100644 index 0000000000..2c495d2fea --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.following.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Following](./calckey-js.entities.following.md) + +## entities.Following type + +**Signature:** + +```typescript +export declare type Following = { + id: ID; + createdAt: DateString; + followerId: User["id"]; + followeeId: User["id"]; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md b/packages/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md new file mode 100644 index 0000000000..f0000326a8 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md) + +## entities.FollowingFolloweePopulated type + +**Signature:** + +```typescript +export declare type FollowingFolloweePopulated = Following & { + followee: UserDetailed; +}; +``` +**References:** [Following](./calckey-js.entities.following.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md b/packages/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md new file mode 100644 index 0000000000..6f9860af8c --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) + +## entities.FollowingFollowerPopulated type + +**Signature:** + +```typescript +export declare type FollowingFollowerPopulated = Following & { + follower: UserDetailed; +}; +``` +**References:** [Following](./calckey-js.entities.following.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.followrequest.md b/packages/calckey-js/markdown/calckey-js.entities.followrequest.md new file mode 100644 index 0000000000..d7ff6bbef2 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.followrequest.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowRequest](./calckey-js.entities.followrequest.md) + +## entities.FollowRequest type + +**Signature:** + +```typescript +export declare type FollowRequest = { + id: ID; + follower: User; + followee: User; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [User](./calckey-js.entities.user.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.gallerypost.md b/packages/calckey-js/markdown/calckey-js.entities.gallerypost.md new file mode 100644 index 0000000000..a079955a91 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.gallerypost.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [GalleryPost](./calckey-js.entities.gallerypost.md) + +## entities.GalleryPost type + +**Signature:** + +```typescript +export declare type GalleryPost = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.id.md b/packages/calckey-js/markdown/calckey-js.entities.id.md new file mode 100644 index 0000000000..bf6e7f2911 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.id.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [ID](./calckey-js.entities.id.md) + +## entities.ID type + +**Signature:** + +```typescript +export declare type ID = string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.instance.md b/packages/calckey-js/markdown/calckey-js.entities.instance.md new file mode 100644 index 0000000000..7e0fb6cc6c --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.instance.md @@ -0,0 +1,40 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Instance](./calckey-js.entities.instance.md) + +## entities.Instance type + +**Signature:** + +```typescript +export declare type Instance = { + id: ID; + caughtAt: DateString; + host: string; + usersCount: number; + notesCount: number; + followingCount: number; + followersCount: number; + driveUsage: number; + driveFiles: number; + latestRequestSentAt: DateString | null; + latestStatus: number | null; + latestRequestReceivedAt: DateString | null; + lastCommunicatedAt: DateString; + isNotResponding: boolean; + isSuspended: boolean; + softwareName: string | null; + softwareVersion: string | null; + openRegistrations: boolean | null; + name: string | null; + description: string | null; + maintainerName: string | null; + maintainerEmail: string | null; + iconUrl: string | null; + faviconUrl: string | null; + themeColor: string | null; + infoUpdatedAt: DateString | null; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.instancemetadata.md b/packages/calckey-js/markdown/calckey-js.entities.instancemetadata.md new file mode 100644 index 0000000000..54e399e4ee --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.instancemetadata.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [InstanceMetadata](./calckey-js.entities.instancemetadata.md) + +## entities.InstanceMetadata type + +**Signature:** + +```typescript +export declare type InstanceMetadata = + | LiteInstanceMetadata + | DetailedInstanceMetadata; +``` +**References:** [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md)<!-- -->, [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md b/packages/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md new file mode 100644 index 0000000000..51d21efcc9 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md @@ -0,0 +1,46 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) + +## entities.LiteInstanceMetadata type + +**Signature:** + +```typescript +export declare type LiteInstanceMetadata = { + maintainerName: string | null; + maintainerEmail: string | null; + version: string; + name: string | null; + uri: string; + description: string | null; + tosUrl: string | null; + disableRegistration: boolean; + disableLocalTimeline: boolean; + disableRecommendedTimeline: boolean; + disableGlobalTimeline: boolean; + driveCapacityPerLocalUserMb: number; + driveCapacityPerRemoteUserMb: number; + enableHcaptcha: boolean; + hcaptchaSiteKey: string | null; + enableRecaptcha: boolean; + recaptchaSiteKey: string | null; + swPublickey: string | null; + maxNoteTextLength: number; + enableEmail: boolean; + enableTwitterIntegration: boolean; + enableGithubIntegration: boolean; + enableDiscordIntegration: boolean; + enableServiceWorker: boolean; + emojis: CustomEmoji[]; + ads: { + id: ID; + ratio: number; + place: string; + url: string; + imageUrl: string; + }[]; +}; +``` +**References:** [CustomEmoji](./calckey-js.entities.customemoji.md)<!-- -->, [ID](./calckey-js.entities.id.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.md b/packages/calckey-js/markdown/calckey-js.entities.md new file mode 100644 index 0000000000..a909f1f36a --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.md @@ -0,0 +1,51 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) + +## entities namespace + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [Ad](./calckey-js.entities.ad.md) | | +| [Announcement](./calckey-js.entities.announcement.md) | | +| [Antenna](./calckey-js.entities.antenna.md) | | +| [App](./calckey-js.entities.app.md) | | +| [AuthSession](./calckey-js.entities.authsession.md) | | +| [Blocking](./calckey-js.entities.blocking.md) | | +| [Channel](./calckey-js.entities.channel.md) | | +| [Clip](./calckey-js.entities.clip.md) | | +| [CustomEmoji](./calckey-js.entities.customemoji.md) | | +| [DateString](./calckey-js.entities.datestring.md) | | +| [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) | | +| [DriveFile](./calckey-js.entities.drivefile.md) | | +| [DriveFolder](./calckey-js.entities.drivefolder.md) | | +| [Following](./calckey-js.entities.following.md) | | +| [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md) | | +| [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) | | +| [FollowRequest](./calckey-js.entities.followrequest.md) | | +| [GalleryPost](./calckey-js.entities.gallerypost.md) | | +| [ID](./calckey-js.entities.id.md) | | +| [Instance](./calckey-js.entities.instance.md) | | +| [InstanceMetadata](./calckey-js.entities.instancemetadata.md) | | +| [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) | | +| [MeDetailed](./calckey-js.entities.medetailed.md) | | +| [MessagingMessage](./calckey-js.entities.messagingmessage.md) | | +| [Note](./calckey-js.entities.note.md) | | +| [NoteFavorite](./calckey-js.entities.notefavorite.md) | | +| [NoteReaction](./calckey-js.entities.notereaction.md) | | +| [Notification](./calckey-js.entities.notification.md) | | +| [OriginType](./calckey-js.entities.origintype.md) | | +| [Page](./calckey-js.entities.page.md) | | +| [PageEvent](./calckey-js.entities.pageevent.md) | | +| [ServerInfo](./calckey-js.entities.serverinfo.md) | | +| [Signin](./calckey-js.entities.signin.md) | | +| [Stats](./calckey-js.entities.stats.md) | | +| [User](./calckey-js.entities.user.md) | | +| [UserDetailed](./calckey-js.entities.userdetailed.md) | | +| [UserGroup](./calckey-js.entities.usergroup.md) | | +| [UserList](./calckey-js.entities.userlist.md) | | +| [UserLite](./calckey-js.entities.userlite.md) | | +| [UserSorting](./calckey-js.entities.usersorting.md) | | + diff --git a/packages/calckey-js/markdown/calckey-js.entities.medetailed.md b/packages/calckey-js/markdown/calckey-js.entities.medetailed.md new file mode 100644 index 0000000000..625722acbe --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.medetailed.md @@ -0,0 +1,40 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [MeDetailed](./calckey-js.entities.medetailed.md) + +## entities.MeDetailed type + +**Signature:** + +```typescript +export declare type MeDetailed = UserDetailed & { + avatarId: DriveFile["id"]; + bannerId: DriveFile["id"]; + autoAcceptFollowed: boolean; + alwaysMarkNsfw: boolean; + carefulBot: boolean; + emailNotificationTypes: string[]; + hasPendingReceivedFollowRequest: boolean; + hasUnreadAnnouncement: boolean; + hasUnreadAntenna: boolean; + hasUnreadChannel: boolean; + hasUnreadMentions: boolean; + hasUnreadMessagingMessage: boolean; + hasUnreadNotification: boolean; + hasUnreadSpecifiedNotes: boolean; + hideOnlineStatus: boolean; + injectFeaturedNote: boolean; + integrations: Record<string, any>; + isDeleted: boolean; + isExplorable: boolean; + mutedWords: string[][]; + mutingNotificationTypes: string[]; + noCrawle: boolean; + preventAiLearning: boolean; + receiveAnnouncementEmail: boolean; + usePasswordLessLogin: boolean; + [other: string]: any; +}; +``` +**References:** [UserDetailed](./calckey-js.entities.userdetailed.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.messagingmessage.md b/packages/calckey-js/markdown/calckey-js.entities.messagingmessage.md new file mode 100644 index 0000000000..ab810b79a4 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.messagingmessage.md @@ -0,0 +1,27 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [MessagingMessage](./calckey-js.entities.messagingmessage.md) + +## entities.MessagingMessage type + +**Signature:** + +```typescript +export declare type MessagingMessage = { + id: ID; + createdAt: DateString; + file: DriveFile | null; + fileId: DriveFile["id"] | null; + isRead: boolean; + reads: User["id"][]; + text: string | null; + user: User; + userId: User["id"]; + recipient?: User | null; + recipientId: User["id"] | null; + group?: UserGroup | null; + groupId: UserGroup["id"] | null; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.note.md b/packages/calckey-js/markdown/calckey-js.entities.note.md new file mode 100644 index 0000000000..c648a7d053 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.note.md @@ -0,0 +1,51 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Note](./calckey-js.entities.note.md) + +## entities.Note type + +**Signature:** + +```typescript +export declare type Note = { + id: ID; + createdAt: DateString; + text: string | null; + cw: string | null; + user: User; + userId: User["id"]; + reply?: Note; + replyId: Note["id"]; + renote?: Note; + renoteId: Note["id"]; + files: DriveFile[]; + fileIds: DriveFile["id"][]; + visibility: "public" | "home" | "followers" | "specified"; + visibleUserIds?: User["id"][]; + localOnly?: boolean; + channel?: Channel["id"]; + myReaction?: string; + reactions: Record<string, number>; + renoteCount: number; + repliesCount: number; + poll?: { + expiresAt: DateString | null; + multiple: boolean; + choices: { + isVoted: boolean; + text: string; + votes: number; + }[]; + }; + emojis: { + name: string; + url: string; + }[]; + uri?: string; + url?: string; + updatedAt?: DateString; + isHidden?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [Note](./calckey-js.entities.note.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md)<!-- -->, [Channel](./calckey-js.entities.channel.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.notefavorite.md b/packages/calckey-js/markdown/calckey-js.entities.notefavorite.md new file mode 100644 index 0000000000..e61a826915 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.notefavorite.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [NoteFavorite](./calckey-js.entities.notefavorite.md) + +## entities.NoteFavorite type + +**Signature:** + +```typescript +export declare type NoteFavorite = { + id: ID; + createdAt: DateString; + noteId: Note["id"]; + note: Note; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [Note](./calckey-js.entities.note.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.notereaction.md b/packages/calckey-js/markdown/calckey-js.entities.notereaction.md new file mode 100644 index 0000000000..c458b9ae73 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.notereaction.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [NoteReaction](./calckey-js.entities.notereaction.md) + +## entities.NoteReaction type + +**Signature:** + +```typescript +export declare type NoteReaction = { + id: ID; + createdAt: DateString; + user: UserLite; + type: string; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [UserLite](./calckey-js.entities.userlite.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.notification.md b/packages/calckey-js/markdown/calckey-js.entities.notification.md new file mode 100644 index 0000000000..9d8af4dff5 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.notification.md @@ -0,0 +1,82 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Notification](./calckey-js.entities.notification.md) + +## entities.Notification type + +**Signature:** + +```typescript +export declare type Notification = { + id: ID; + createdAt: DateString; + isRead: boolean; +} & ( + | { + type: "reaction"; + reaction: string; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "reply"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "renote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "quote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "mention"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "pollVote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "follow"; + user: User; + userId: User["id"]; + } + | { + type: "followRequestAccepted"; + user: User; + userId: User["id"]; + } + | { + type: "receiveFollowRequest"; + user: User; + userId: User["id"]; + } + | { + type: "groupInvited"; + invitation: UserGroup; + user: User; + userId: User["id"]; + } + | { + type: "app"; + header?: string | null; + body: string; + icon?: string | null; + } +); +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [Note](./calckey-js.entities.note.md)<!-- -->, [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.origintype.md b/packages/calckey-js/markdown/calckey-js.entities.origintype.md new file mode 100644 index 0000000000..f00c0b915b --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.origintype.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [OriginType](./calckey-js.entities.origintype.md) + +## entities.OriginType type + +**Signature:** + +```typescript +export declare type OriginType = "combined" | "local" | "remote"; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.page.md b/packages/calckey-js/markdown/calckey-js.entities.page.md new file mode 100644 index 0000000000..3a24e45120 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.page.md @@ -0,0 +1,33 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Page](./calckey-js.entities.page.md) + +## entities.Page type + +**Signature:** + +```typescript +export declare type Page = { + id: ID; + createdAt: DateString; + updatedAt: DateString; + userId: User["id"]; + user: User; + content: Record<string, any>[]; + variables: Record<string, any>[]; + title: string; + name: string; + summary: string | null; + hideTitleWhenPinned: boolean; + alignCenter: boolean; + font: string; + script: string; + eyeCatchingImageId: DriveFile["id"] | null; + eyeCatchingImage: DriveFile | null; + attachedFiles: any; + likedCount: number; + isLiked?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.pageevent.md b/packages/calckey-js/markdown/calckey-js.entities.pageevent.md new file mode 100644 index 0000000000..f3cba25919 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.pageevent.md @@ -0,0 +1,19 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [PageEvent](./calckey-js.entities.pageevent.md) + +## entities.PageEvent type + +**Signature:** + +```typescript +export declare type PageEvent = { + pageId: Page["id"]; + event: string; + var: any; + userId: User["id"]; + user: User; +}; +``` +**References:** [Page](./calckey-js.entities.page.md)<!-- -->, [User](./calckey-js.entities.user.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.serverinfo.md b/packages/calckey-js/markdown/calckey-js.entities.serverinfo.md new file mode 100644 index 0000000000..9c2aadedc1 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.serverinfo.md @@ -0,0 +1,24 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [ServerInfo](./calckey-js.entities.serverinfo.md) + +## entities.ServerInfo type + +**Signature:** + +```typescript +export declare type ServerInfo = { + machine: string; + cpu: { + model: string; + cores: number; + }; + mem: { + total: number; + }; + fs: { + total: number; + used: number; + }; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.signin.md b/packages/calckey-js/markdown/calckey-js.entities.signin.md new file mode 100644 index 0000000000..56d7f26ad3 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.signin.md @@ -0,0 +1,19 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Signin](./calckey-js.entities.signin.md) + +## entities.Signin type + +**Signature:** + +```typescript +export declare type Signin = { + id: ID; + createdAt: DateString; + ip: string; + headers: Record<string, any>; + success: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.stats.md b/packages/calckey-js/markdown/calckey-js.entities.stats.md new file mode 100644 index 0000000000..1067e1a27d --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.stats.md @@ -0,0 +1,19 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Stats](./calckey-js.entities.stats.md) + +## entities.Stats type + +**Signature:** + +```typescript +export declare type Stats = { + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + instances: number; + driveUsageLocal: number; + driveUsageRemote: number; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.user.md b/packages/calckey-js/markdown/calckey-js.entities.user.md new file mode 100644 index 0000000000..663daaaf38 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.user.md @@ -0,0 +1,13 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [User](./calckey-js.entities.user.md) + +## entities.User type + +**Signature:** + +```typescript +export declare type User = UserLite | UserDetailed; +``` +**References:** [UserLite](./calckey-js.entities.userlite.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.userdetailed.md b/packages/calckey-js/markdown/calckey-js.entities.userdetailed.md new file mode 100644 index 0000000000..cce30a85c9 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.userdetailed.md @@ -0,0 +1,56 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserDetailed](./calckey-js.entities.userdetailed.md) + +## entities.UserDetailed type + +**Signature:** + +```typescript +export declare type UserDetailed = UserLite & { + bannerBlurhash: string | null; + bannerColor: string | null; + bannerUrl: string | null; + birthday: string | null; + createdAt: DateString; + description: string | null; + ffVisibility: "public" | "followers" | "private"; + fields: { + name: string; + value: string; + }[]; + followersCount: number; + followingCount: number; + hasPendingFollowRequestFromYou: boolean; + hasPendingFollowRequestToYou: boolean; + isAdmin: boolean; + isBlocked: boolean; + isBlocking: boolean; + isBot: boolean; + isCat: boolean; + isFollowed: boolean; + isFollowing: boolean; + isLocked: boolean; + isModerator: boolean; + isMuted: boolean; + isRenoteMuted: boolean; + isSilenced: boolean; + isSuspended: boolean; + lang: string | null; + lastFetchedAt?: DateString; + location: string | null; + notesCount: number; + pinnedNoteIds: ID[]; + pinnedNotes: Note[]; + pinnedPage: Page | null; + pinnedPageId: string | null; + publicReactions: boolean; + securityKeys: boolean; + twoFactorEnabled: boolean; + updatedAt: DateString | null; + uri: string | null; + url: string | null; +}; +``` +**References:** [UserLite](./calckey-js.entities.userlite.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [ID](./calckey-js.entities.id.md)<!-- -->, [Note](./calckey-js.entities.note.md)<!-- -->, [Page](./calckey-js.entities.page.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.usergroup.md b/packages/calckey-js/markdown/calckey-js.entities.usergroup.md new file mode 100644 index 0000000000..16bb9076bf --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.usergroup.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserGroup](./calckey-js.entities.usergroup.md) + +## entities.UserGroup type + +**Signature:** + +```typescript +export declare type UserGroup = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.userlist.md b/packages/calckey-js/markdown/calckey-js.entities.userlist.md new file mode 100644 index 0000000000..6ba539c662 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.userlist.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserList](./calckey-js.entities.userlist.md) + +## entities.UserList type + +**Signature:** + +```typescript +export declare type UserList = { + id: ID; + createdAt: DateString; + name: string; + userIds: User["id"][]; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.userlite.md b/packages/calckey-js/markdown/calckey-js.entities.userlite.md new file mode 100644 index 0000000000..157b7b48a2 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.userlite.md @@ -0,0 +1,35 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserLite](./calckey-js.entities.userlite.md) + +## entities.UserLite type + +**Signature:** + +```typescript +export declare type UserLite = { + id: ID; + username: string; + host: string | null; + name: string; + onlineStatus: "online" | "active" | "offline" | "unknown"; + avatarUrl: string; + avatarBlurhash: string; + alsoKnownAs: string[]; + movedToUri: any; + emojis: { + name: string; + url: string; + }[]; + instance?: { + name: Instance["name"]; + softwareName: Instance["softwareName"]; + softwareVersion: Instance["softwareVersion"]; + iconUrl: Instance["iconUrl"]; + faviconUrl: Instance["faviconUrl"]; + themeColor: Instance["themeColor"]; + }; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [Instance](./calckey-js.entities.instance.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.usersorting.md b/packages/calckey-js/markdown/calckey-js.entities.usersorting.md new file mode 100644 index 0000000000..54c3e9783f --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.usersorting.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserSorting](./calckey-js.entities.usersorting.md) + +## entities.UserSorting type + +**Signature:** + +```typescript +export declare type UserSorting = + | "+follower" + | "-follower" + | "+createdAt" + | "-createdAt" + | "+updatedAt" + | "-updatedAt"; +``` diff --git a/packages/calckey-js/markdown/calckey-js.ffvisibility.md b/packages/calckey-js/markdown/calckey-js.ffvisibility.md new file mode 100644 index 0000000000..df08c489c7 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.ffvisibility.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ffVisibility](./calckey-js.ffvisibility.md) + +## ffVisibility variable + +**Signature:** + +```typescript +ffVisibility: readonly ["public", "followers", "private"] +``` diff --git a/packages/calckey-js/markdown/calckey-js.md b/packages/calckey-js/markdown/calckey-js.md new file mode 100644 index 0000000000..1674ddd5a6 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.md @@ -0,0 +1,43 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) + +## calckey-js package + +## Classes + +| Class | Description | +| --- | --- | +| [Stream](./calckey-js.stream.md) | | + +## Abstract Classes + +| Abstract Class | Description | +| --- | --- | +| [ChannelConnection](./calckey-js.channelconnection.md) | | + +## Namespaces + +| Namespace | Description | +| --- | --- | +| [api](./calckey-js.api.md) | | +| [entities](./calckey-js.entities.md) | | + +## Variables + +| Variable | Description | +| --- | --- | +| [ffVisibility](./calckey-js.ffvisibility.md) | | +| [mutedNoteReasons](./calckey-js.mutednotereasons.md) | | +| [noteVisibilities](./calckey-js.notevisibilities.md) | | +| [notificationTypes](./calckey-js.notificationtypes.md) | | +| [permissions](./calckey-js.permissions.md) | | + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [Acct](./calckey-js.acct.md) | | +| [Channels](./calckey-js.channels.md) | | +| [Endpoints](./calckey-js.endpoints.md) | | + diff --git a/packages/calckey-js/markdown/calckey-js.mutednotereasons.md b/packages/calckey-js/markdown/calckey-js.mutednotereasons.md new file mode 100644 index 0000000000..c518ae8704 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.mutednotereasons.md @@ -0,0 +1,16 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [mutedNoteReasons](./calckey-js.mutednotereasons.md) + +## mutedNoteReasons variable + +**Signature:** + +```typescript +mutedNoteReasons: readonly [ + "word", + "manual", + "spam", + "other", +] +``` diff --git a/packages/calckey-js/markdown/calckey-js.notevisibilities.md b/packages/calckey-js/markdown/calckey-js.notevisibilities.md new file mode 100644 index 0000000000..a18247abb1 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.notevisibilities.md @@ -0,0 +1,16 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [noteVisibilities](./calckey-js.notevisibilities.md) + +## noteVisibilities variable + +**Signature:** + +```typescript +noteVisibilities: readonly [ + "public", + "home", + "followers", + "specified", +] +``` diff --git a/packages/calckey-js/markdown/calckey-js.notificationtypes.md b/packages/calckey-js/markdown/calckey-js.notificationtypes.md new file mode 100644 index 0000000000..01d9ae3524 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.notificationtypes.md @@ -0,0 +1,24 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [notificationTypes](./calckey-js.notificationtypes.md) + +## notificationTypes variable + +**Signature:** + +```typescript +notificationTypes: readonly [ + "follow", + "mention", + "reply", + "renote", + "quote", + "reaction", + "pollVote", + "pollEnded", + "receiveFollowRequest", + "followRequestAccepted", + "groupInvited", + "app", +] +``` diff --git a/packages/calckey-js/markdown/calckey-js.permissions.md b/packages/calckey-js/markdown/calckey-js.permissions.md new file mode 100644 index 0000000000..6adcb917c7 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.permissions.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [permissions](./calckey-js.permissions.md) + +## permissions variable + +**Signature:** + +```typescript +permissions: string[] +``` diff --git a/packages/calckey-js/markdown/calckey-js.stream._constructor_.md b/packages/calckey-js/markdown/calckey-js.stream._constructor_.md new file mode 100644 index 0000000000..c6ab764983 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream._constructor_.md @@ -0,0 +1,30 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [(constructor)](./calckey-js.stream._constructor_.md) + +## Stream.(constructor) + +Constructs a new instance of the `Stream` class + +**Signature:** + +```typescript +constructor( + origin: string, + user: { + token: string; + } | null, + options?: { + WebSocket?: any; + }, + ); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| origin | string | | +| user | { token: string; } \| null | | +| options | { WebSocket?: any; } | _(Optional)_ | + diff --git a/packages/calckey-js/markdown/calckey-js.stream.close.md b/packages/calckey-js/markdown/calckey-js.stream.close.md new file mode 100644 index 0000000000..222c4ae8ac --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.close.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [close](./calckey-js.stream.close.md) + +## Stream.close() method + +**Signature:** + +```typescript +close(): void; +``` +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md b/packages/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md new file mode 100644 index 0000000000..2403a0d5de --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [disconnectToChannel](./calckey-js.stream.disconnecttochannel.md) + +## Stream.disconnectToChannel() method + +**Signature:** + +```typescript +disconnectToChannel(connection: NonSharedConnection): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| connection | NonSharedConnection | | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.md b/packages/calckey-js/markdown/calckey-js.stream.md new file mode 100644 index 0000000000..6c44402f56 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.md @@ -0,0 +1,36 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) + +## Stream class + +**Signature:** + +```typescript +export default class Stream extends EventEmitter<StreamEvents> +``` +**Extends:** EventEmitter<StreamEvents> + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(origin, user, options)](./calckey-js.stream._constructor_.md) | | Constructs a new instance of the <code>Stream</code> class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [state](./calckey-js.stream.state.md) | | "initializing" \| "reconnecting" \| "connected" | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [close()](./calckey-js.stream.close.md) | | | +| [disconnectToChannel(connection)](./calckey-js.stream.disconnecttochannel.md) | | | +| [removeSharedConnection(connection)](./calckey-js.stream.removesharedconnection.md) | | | +| [removeSharedConnectionPool(pool)](./calckey-js.stream.removesharedconnectionpool.md) | | | +| [send(typeOrPayload, payload)](./calckey-js.stream.send.md) | | | +| [useChannel(channel, params, name)](./calckey-js.stream.usechannel.md) | | | + diff --git a/packages/calckey-js/markdown/calckey-js.stream.removesharedconnection.md b/packages/calckey-js/markdown/calckey-js.stream.removesharedconnection.md new file mode 100644 index 0000000000..b52ce862e3 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.removesharedconnection.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [removeSharedConnection](./calckey-js.stream.removesharedconnection.md) + +## Stream.removeSharedConnection() method + +**Signature:** + +```typescript +removeSharedConnection(connection: SharedConnection): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| connection | SharedConnection | | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md b/packages/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md new file mode 100644 index 0000000000..aa99153734 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [removeSharedConnectionPool](./calckey-js.stream.removesharedconnectionpool.md) + +## Stream.removeSharedConnectionPool() method + +**Signature:** + +```typescript +removeSharedConnectionPool(pool: Pool): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| pool | Pool | | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.send.md b/packages/calckey-js/markdown/calckey-js.stream.send.md new file mode 100644 index 0000000000..d8e03032d5 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.send.md @@ -0,0 +1,23 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [send](./calckey-js.stream.send.md) + +## Stream.send() method + +**Signature:** + +```typescript +send(typeOrPayload: any, payload?: any): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| typeOrPayload | any | | +| payload | any | _(Optional)_ | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.state.md b/packages/calckey-js/markdown/calckey-js.stream.state.md new file mode 100644 index 0000000000..82c2e3c3ed --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.state.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [state](./calckey-js.stream.state.md) + +## Stream.state property + +**Signature:** + +```typescript +state: "initializing" | "reconnecting" | "connected"; +``` diff --git a/packages/calckey-js/markdown/calckey-js.stream.usechannel.md b/packages/calckey-js/markdown/calckey-js.stream.usechannel.md new file mode 100644 index 0000000000..b3c4abbf7c --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.usechannel.md @@ -0,0 +1,28 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [useChannel](./calckey-js.stream.usechannel.md) + +## Stream.useChannel() method + +**Signature:** + +```typescript +useChannel<C extends keyof Channels>( + channel: C, + params?: Channels[C]["params"], + name?: string, + ): Connection<Channels[C]>; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| channel | C | | +| params | [Channels](./calckey-js.channels.md)<!-- -->\[C\]\["params"\] | _(Optional)_ | +| name | string | _(Optional)_ | + +**Returns:** + +[Connection](./calckey-js.channelconnection.md)<!-- --><[Channels](./calckey-js.channels.md)<!-- -->\[C\]> + diff --git a/packages/calckey-js/markdown/index.md b/packages/calckey-js/markdown/index.md new file mode 100644 index 0000000000..73dd95deb3 --- /dev/null +++ b/packages/calckey-js/markdown/index.md @@ -0,0 +1,12 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) + +## API Reference + +## Packages + +| Package | Description | +| --- | --- | +| [calckey-js](./calckey-js.md) | | + diff --git a/packages/calckey-js/package-lock.json b/packages/calckey-js/package-lock.json deleted file mode 100644 index 774fcd5fa6..0000000000 --- a/packages/calckey-js/package-lock.json +++ /dev/null @@ -1,10662 +0,0 @@ -{ - "name": "calckey-js", - "version": "0.0.16", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "calckey-js", - "version": "0.0.16", - "dependencies": { - "autobind-decorator": "^2.4.0", - "eventemitter3": "^4.0.7", - "reconnecting-websocket": "^4.4.0", - "semver": "^7.3.8" - }, - "devDependencies": { - "@microsoft/api-extractor": "^7.19.3", - "@types/jest": "^27.4.0", - "@types/node": "17.0.5", - "@typescript-eslint/eslint-plugin": "5.8.1", - "@typescript-eslint/parser": "5.8.1", - "eslint": "8.6.0", - "jest": "^27.4.5", - "jest-fetch-mock": "^3.0.3", - "jest-websocket-mock": "^2.2.1", - "mock-socket": "^9.0.8", - "ts-jest": "^27.1.2", - "ts-node": "10.4.0", - "tsd": "^0.19.1", - "typescript": "4.5.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", - "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", - "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", - "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz", - "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", - "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.4.2", - "jest-util": "^27.4.2", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz", - "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.5", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.5", - "jest-haste-map": "^27.4.5", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-resolve-dependencies": "^27.4.5", - "jest-runner": "^27.4.5", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "jest-watcher": "^27.4.2", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz", - "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", - "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz", - "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.4.4", - "@jest/types": "^27.4.2", - "expect": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz", - "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.5", - "jest-resolve": "^27.4.5", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/source-map": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", - "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", - "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", - "dev": true, - "dependencies": { - "@jest/console": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz", - "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-runtime": "^27.4.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz", - "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.4.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-regex-util": "^27.4.0", - "jest-util": "^27.4.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@microsoft/api-extractor": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.3.tgz", - "integrity": "sha512-GZe+R3K4kh2X425iOHkPbByysB7FN0592mPPA6vNj5IhyhlPHgdZS6m6AmOZOIxMS4euM+SBKzEJEp3oC+WsOQ==", - "dev": true, - "dependencies": { - "@microsoft/api-extractor-model": "7.15.2", - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.44.3", - "@rushstack/rig-package": "0.3.7", - "@rushstack/ts-command-line": "4.10.6", - "colors": "~1.2.1", - "lodash": "~4.17.15", - "resolve": "~1.17.0", - "semver": "~7.3.0", - "source-map": "~0.6.1", - "typescript": "~4.5.2" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.15.2.tgz", - "integrity": "sha512-qgxKX/s6vo3nCVLhP0Ds7555QrErhcYHEok5/KyEZ7iR8J5M5oldD1eJJQmtEdVF5IzmnPPbxx1nRvfgA674LQ==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.44.3" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", - "dev": true - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.13.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rushstack/node-core-library": { - "version": "3.44.3", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.44.3.tgz", - "integrity": "sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w==", - "dev": true, - "dependencies": { - "@types/node": "12.20.24", - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.17.0", - "semver": "~7.3.0", - "timsort": "~0.3.0", - "z-schema": "~5.0.2" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/@types/node": { - "version": "12.20.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", - "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", - "dev": true - }, - "node_modules/@rushstack/node-core-library/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@rushstack/rig-package": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.7.tgz", - "integrity": "sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==", - "dev": true, - "dependencies": { - "resolve": "~1.17.0", - "strip-json-comments": "~3.1.1" - } - }, - "node_modules/@rushstack/rig-package/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.6.tgz", - "integrity": "sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==", - "dev": true, - "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "node_modules/@tsd/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-iDlLkdg3sCjUSNdoUCsYM/SXheHrdxHsR6msIkbFDW4pV6gHTMwg/8te/paLtywDjGL4S4ByDdUKA3RbfdBX0g==", - "dev": true, - "bin": { - "tsc": "typescript/bin/tsc", - "tsserver": "typescript/bin/tsserver" - } - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", - "dev": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz", - "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==", - "dev": true, - "dependencies": { - "jest-diff": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", - "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", - "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.1.tgz", - "integrity": "sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "5.8.1", - "@typescript-eslint/scope-manager": "5.8.1", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.1.tgz", - "integrity": "sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.8.1", - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/typescript-estree": "5.8.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.1.tgz", - "integrity": "sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.8.1", - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/typescript-estree": "5.8.1", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.1.tgz", - "integrity": "sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/visitor-keys": "5.8.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.1.tgz", - "integrity": "sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.1.tgz", - "integrity": "sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/visitor-keys": "5.8.1", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.1.tgz", - "integrity": "sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.8.1", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/autobind-decorator": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/autobind-decorator/-/autobind-decorator-2.4.0.tgz", - "integrity": "sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw==", - "engines": { - "node": ">=8.10", - "npm": ">=6.4.1" - } - }, - "node_modules/babel-jest": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz", - "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==", - "dev": true, - "dependencies": { - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.4.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", - "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", - "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^27.4.0", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001294", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz", - "integrity": "sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.31", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.31.tgz", - "integrity": "sha512-t3XVQtk+Frkv6aTD4RRk0OqosU+VLe1dQFW83MDer78ZD6a52frgXuYOIsLYTQiH2Lm+JB2OKYcn7zrX+YGAiQ==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-formatter-pretty": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", - "dev": true, - "dependencies": { - "@types/eslint": "^7.2.13", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.5", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-rule-docs": { - "version": "1.1.231", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.231.tgz", - "integrity": "sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==", - "dev": true - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", - "dev": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", - "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", - "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", - "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz", - "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==", - "dev": true, - "dependencies": { - "@jest/core": "^27.4.5", - "import-local": "^3.0.2", - "jest-cli": "^27.4.5" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", - "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz", - "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.4.4", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz", - "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==", - "dev": true, - "dependencies": { - "@jest/core": "^27.4.5", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz", - "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.5", - "@jest/types": "^27.4.2", - "babel-jest": "^27.4.5", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.5", - "jest-environment-jsdom": "^27.4.4", - "jest-environment-node": "^27.4.4", - "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.5", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-runner": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", - "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", - "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", - "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz", - "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.4.4", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz", - "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.4.4", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "dependencies": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "node_modules/jest-get-type": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", - "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.4.0", - "jest-serializer": "^27.4.0", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz", - "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.4", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", - "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", - "dev": true, - "dependencies": { - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", - "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", - "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-mock": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", - "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", - "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz", - "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz", - "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz", - "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==", - "dev": true, - "dependencies": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.4", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.4", - "jest-environment-node": "^27.4.4", - "jest-haste-map": "^27.4.5", - "jest-leak-detector": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.5", - "jest-runtime": "^27.4.5", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz", - "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.4", - "@jest/globals": "^27.4.4", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.2.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-serializer": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", - "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz", - "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.5", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.5", - "jest-util": "^27.4.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.4.2", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", - "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.4", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", - "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "leven": "^3.1.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", - "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.4.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-websocket-mock": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.2.1.tgz", - "integrity": "sha512-fhsGLXrPfs06PhHoxqOSA9yZ6Rb4qYrf4Wcm7/nfRzjlrf1gIeuhYUkzMRjjE0TMQ37SwkmeLanwrZY4ZaNp8g==", - "dev": true, - "dependencies": { - "jest-diff": "^27.0.2" - }, - "peerDependencies": { - "mock-socket": "^8||^9" - } - }, - "node_modules/jest-worker": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", - "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mock-socket": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.0.8.tgz", - "integrity": "sha512-8Syqkaaa2SzRqW68DEsnZkKQicHP7hVzfj3uCvigB5TL79H1ljKbwmOcRIENkx0ZTyu/5W6u+Pk9Qy6JCp38Ww==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "dependencies": { - "irregular-plurals": "^3.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", - "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-polyfill": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", - "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==", - "dev": true - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reconnecting-websocket": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", - "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-jest": { - "version": "27.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.2.tgz", - "integrity": "sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@types/jest": "^27.0.0", - "babel-jest": ">=27.0.0 <28", - "esbuild": "~0.14.0", - "jest": "^27.0.0", - "typescript": ">=3.8 <5.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tsd": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.19.1.tgz", - "integrity": "sha512-pSwchclr+ADdxlahRUQXUrdAIOjXx1T1PQV+fLfVLuo/S4z+T00YU84fH8iPlZxyA2pWgJjo42BG1p9SDb4NOw==", - "dev": true, - "dependencies": { - "@tsd/typescript": "~4.5.2", - "eslint-formatter-pretty": "^4.1.0", - "globby": "^11.0.1", - "meow": "^9.0.0", - "path-exists": "^4.0.0", - "read-pkg-up": "^7.0.0" - }, - "bin": { - "tsd": "dist/cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", - "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/z-schema": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.2.tgz", - "integrity": "sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==", - "dev": true, - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^2.7.1" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true - }, - "@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", - "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", - "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", - "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz", - "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", - "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.4.2", - "jest-util": "^27.4.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz", - "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.5", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.5", - "jest-haste-map": "^27.4.5", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-resolve-dependencies": "^27.4.5", - "jest-runner": "^27.4.5", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "jest-watcher": "^27.4.2", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz", - "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2" - } - }, - "@jest/fake-timers": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", - "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - } - }, - "@jest/globals": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz", - "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.4", - "@jest/types": "^27.4.2", - "expect": "^27.4.2" - } - }, - "@jest/reporters": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz", - "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.5", - "jest-resolve": "^27.4.5", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - } - }, - "@jest/source-map": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", - "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", - "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz", - "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-runtime": "^27.4.5" - } - }, - "@jest/transform": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz", - "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.4.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-regex-util": "^27.4.0", - "jest-util": "^27.4.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@microsoft/api-extractor": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.3.tgz", - "integrity": "sha512-GZe+R3K4kh2X425iOHkPbByysB7FN0592mPPA6vNj5IhyhlPHgdZS6m6AmOZOIxMS4euM+SBKzEJEp3oC+WsOQ==", - "dev": true, - "requires": { - "@microsoft/api-extractor-model": "7.15.2", - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.44.3", - "@rushstack/rig-package": "0.3.7", - "@rushstack/ts-command-line": "4.10.6", - "colors": "~1.2.1", - "lodash": "~4.17.15", - "resolve": "~1.17.0", - "semver": "~7.3.0", - "source-map": "~0.6.1", - "typescript": "~4.5.2" - }, - "dependencies": { - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "@microsoft/api-extractor-model": { - "version": "7.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.15.2.tgz", - "integrity": "sha512-qgxKX/s6vo3nCVLhP0Ds7555QrErhcYHEok5/KyEZ7iR8J5M5oldD1eJJQmtEdVF5IzmnPPbxx1nRvfgA674LQ==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.44.3" - } - }, - "@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", - "dev": true - }, - "@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "0.13.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - }, - "dependencies": { - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@rushstack/node-core-library": { - "version": "3.44.3", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.44.3.tgz", - "integrity": "sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w==", - "dev": true, - "requires": { - "@types/node": "12.20.24", - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.17.0", - "semver": "~7.3.0", - "timsort": "~0.3.0", - "z-schema": "~5.0.2" - }, - "dependencies": { - "@types/node": { - "version": "12.20.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", - "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "@rushstack/rig-package": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.7.tgz", - "integrity": "sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==", - "dev": true, - "requires": { - "resolve": "~1.17.0", - "strip-json-comments": "~3.1.1" - }, - "dependencies": { - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "@rushstack/ts-command-line": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.6.tgz", - "integrity": "sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==", - "dev": true, - "requires": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@tsd/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-iDlLkdg3sCjUSNdoUCsYM/SXheHrdxHsR6msIkbFDW4pV6gHTMwg/8te/paLtywDjGL4S4ByDdUKA3RbfdBX0g==", - "dev": true - }, - "@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", - "dev": true - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz", - "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==", - "dev": true, - "requires": { - "jest-diff": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/node": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", - "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/prettier": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", - "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.1.tgz", - "integrity": "sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.8.1", - "@typescript-eslint/scope-manager": "5.8.1", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.1.tgz", - "integrity": "sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.8.1", - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/typescript-estree": "5.8.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.1.tgz", - "integrity": "sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.8.1", - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/typescript-estree": "5.8.1", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.1.tgz", - "integrity": "sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/visitor-keys": "5.8.1" - } - }, - "@typescript-eslint/types": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.1.tgz", - "integrity": "sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.1.tgz", - "integrity": "sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/visitor-keys": "5.8.1", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.1.tgz", - "integrity": "sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.8.1", - "eslint-visitor-keys": "^3.0.0" - } - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "autobind-decorator": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/autobind-decorator/-/autobind-decorator-2.4.0.tgz", - "integrity": "sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw==" - }, - "babel-jest": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz", - "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==", - "dev": true, - "requires": { - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.4.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", - "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", - "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.4.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30001294", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz", - "integrity": "sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g==", - "dev": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "dev": true, - "requires": { - "node-fetch": "2.6.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "electron-to-chromium": { - "version": "1.4.31", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.31.tgz", - "integrity": "sha512-t3XVQtk+Frkv6aTD4RRk0OqosU+VLe1dQFW83MDer78ZD6a52frgXuYOIsLYTQiH2Lm+JB2OKYcn7zrX+YGAiQ==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "eslint-formatter-pretty": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", - "dev": true, - "requires": { - "@types/eslint": "^7.2.13", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.5", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - } - }, - "eslint-rule-docs": { - "version": "1.1.231", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.231.tgz", - "integrity": "sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true - }, - "espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expect": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", - "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "import-local": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", - "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", - "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz", - "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==", - "dev": true, - "requires": { - "@jest/core": "^27.4.5", - "import-local": "^3.0.2", - "jest-cli": "^27.4.5" - } - }, - "jest-changed-files": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", - "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz", - "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.4", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - } - }, - "jest-cli": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz", - "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==", - "dev": true, - "requires": { - "@jest/core": "^27.4.5", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - } - }, - "jest-config": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz", - "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.5", - "@jest/types": "^27.4.2", - "babel-jest": "^27.4.5", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.5", - "jest-environment-jsdom": "^27.4.4", - "jest-environment-node": "^27.4.4", - "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.5", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-runner": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0" - } - }, - "jest-diff": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", - "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-docblock": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", - "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", - "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2" - } - }, - "jest-environment-jsdom": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz", - "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.4", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz", - "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.4", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - } - }, - "jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "requires": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "jest-get-type": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "dev": true - }, - "jest-haste-map": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", - "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.4.0", - "jest-serializer": "^27.4.0", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz", - "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.4", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "throat": "^6.0.1" - } - }, - "jest-leak-detector": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", - "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", - "dev": true, - "requires": { - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-matcher-utils": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", - "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-message-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", - "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", - "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", - "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", - "dev": true - }, - "jest-resolve": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz", - "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz", - "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.5" - } - }, - "jest-runner": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz", - "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.4", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.4", - "jest-environment-node": "^27.4.4", - "jest-haste-map": "^27.4.5", - "jest-leak-detector": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.5", - "jest-runtime": "^27.4.5", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - } - }, - "jest-runtime": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz", - "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.4", - "@jest/globals": "^27.4.4", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.2.0" - } - }, - "jest-serializer": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", - "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz", - "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.5", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.5", - "jest-util": "^27.4.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.4.2", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", - "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.4", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", - "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "leven": "^3.1.0", - "pretty-format": "^27.4.2" - }, - "dependencies": { - "camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", - "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", - "dev": true, - "requires": { - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.4.2", - "string-length": "^4.0.1" - } - }, - "jest-websocket-mock": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.2.1.tgz", - "integrity": "sha512-fhsGLXrPfs06PhHoxqOSA9yZ6Rb4qYrf4Wcm7/nfRzjlrf1gIeuhYUkzMRjjE0TMQ37SwkmeLanwrZY4ZaNp8g==", - "dev": true, - "requires": { - "jest-diff": "^27.0.2" - } - }, - "jest-worker": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", - "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - } - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mock-socket": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.0.8.tgz", - "integrity": "sha512-8Syqkaaa2SzRqW68DEsnZkKQicHP7hVzfj3uCvigB5TL79H1ljKbwmOcRIENkx0ZTyu/5W6u+Pk9Qy6JCp38Ww==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - }, - "pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "requires": { - "irregular-plurals": "^3.2.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-format": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", - "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-polyfill": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", - "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==", - "dev": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "reconnecting-websocket": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", - "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "ts-jest": { - "version": "27.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.2.tgz", - "integrity": "sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - } - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tsd": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.19.1.tgz", - "integrity": "sha512-pSwchclr+ADdxlahRUQXUrdAIOjXx1T1PQV+fLfVLuo/S4z+T00YU84fH8iPlZxyA2pWgJjo42BG1p9SDb4NOw==", - "dev": true, - "requires": { - "@tsd/typescript": "~4.5.2", - "eslint-formatter-pretty": "^4.1.0", - "globby": "^11.0.1", - "meow": "^9.0.0", - "path-exists": "^4.0.0", - "read-pkg-up": "^7.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", - "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "z-schema": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.2.tgz", - "integrity": "sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==", - "dev": true, - "requires": { - "commander": "^2.7.1", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - } - } - } -} diff --git a/packages/calckey-js/package.json b/packages/calckey-js/package.json index 6f724fc219..d2235d04cf 100644 --- a/packages/calckey-js/package.json +++ b/packages/calckey-js/package.json @@ -1,16 +1,18 @@ { "name": "calckey-js", - "version": "0.0.22", + "version": "0.0.23", "description": "Calckey SDK for JavaScript", "main": "./built/index.js", "types": "./built/index.d.ts", "scripts": { - "build": "tsc", + "build": "pnpm swc src -d built -D && pnpm tsd", + "render": "pnpm run build && pnpm run api && pnpm run api-prod && cp temp/calckey-js.api.json etc/ && pnpm run api-doc", "tsd": "tsd", "api": "pnpm api-extractor run --local --verbose", "api-prod": "pnpm api-extractor run --verbose", - "typecheck": "tsc --noEmit", - "lint": "pnpm typecheck && pnpm rome check \"src/*.ts\"", + "api-doc": "pnpm api-documenter markdown -i ./etc/", + "lint": "pnpm rome check --apply * && pnpm rome check --apply 'src/*.ts'", + "format": "pnpm rome format --write '*' ; pnpm rome format --write '**/*.ts'", "jest": "jest --coverage --detectOpenHandles", "test": "pnpm jest && pnpm tsd" }, @@ -19,26 +21,30 @@ "url": "https://codeberg.org/calckey/calckey.js" }, "devDependencies": { - "@microsoft/api-extractor": "^7.19.3", + "@microsoft/api-extractor": "^7.36.0", + "@microsoft/api-documenter": "^7.22.21", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.62", "@types/jest": "^27.4.0", - "@types/node": "17.0.5", - "@typescript-eslint/eslint-plugin": "5.8.1", - "@typescript-eslint/parser": "5.8.1", - "eslint": "8.6.0", + "@types/node": "20.3.1", "jest": "^27.4.5", "jest-fetch-mock": "^3.0.3", "jest-websocket-mock": "^2.2.1", "mock-socket": "^9.0.8", "ts-jest": "^27.1.2", "ts-node": "10.4.0", - "tsd": "^0.19.1", - "typescript": "4.5.4" + "tsd": "^0.28.1", + "typescript": "5.1.3" }, - "files": ["built"], + "files": [ + "built" + ], "dependencies": { - "autobind-decorator": "^2.4.0", "eventemitter3": "^4.0.7", "reconnecting-websocket": "^4.4.0", "semver": "^7.3.8" + }, + "optionalDependencies": { + "@swc/core-android-arm64": "1.3.11" } } diff --git a/packages/calckey-js/src/streaming.ts b/packages/calckey-js/src/streaming.ts index 80a3d6e8c3..924e33a45c 100644 --- a/packages/calckey-js/src/streaming.ts +++ b/packages/calckey-js/src/streaming.ts @@ -1,8 +1,26 @@ -import autobind from "autobind-decorator"; import { EventEmitter } from "eventemitter3"; import ReconnectingWebsocket from "reconnecting-websocket"; import { BroadcastEvents, Channels } from "./streaming.types"; +function autobind(instance: any): void { + const prototype = Object.getPrototypeOf(instance); + + const propertyNames = Object.getOwnPropertyNames(prototype); + + for (const key of propertyNames) { + const descriptor = Object.getOwnPropertyDescriptor(prototype, key); + + if (typeof descriptor?.value === "function" && key !== "constructor") { + Object.defineProperty(instance, key, { + value: instance[key].bind(instance), + enumerable: descriptor.enumerable, + configurable: descriptor.configurable, + writable: descriptor.writable, + }); + } + } +} + export function urlQuery( obj: Record<string, string | number | boolean | undefined>, ): string { @@ -45,6 +63,7 @@ export default class Stream extends EventEmitter<StreamEvents> { }, ) { super(); + autobind(this); options = options || {}; const query = urlQuery({ @@ -71,12 +90,10 @@ export default class Stream extends EventEmitter<StreamEvents> { this.stream.addEventListener("message", this.onMessage); } - @autobind private genId(): string { return (++this.idCounter).toString(); } - @autobind public useChannel<C extends keyof Channels>( channel: C, params?: Channels[C]["params"], @@ -89,7 +106,6 @@ export default class Stream extends EventEmitter<StreamEvents> { } } - @autobind private useSharedConnection<C extends keyof Channels>( channel: C, name?: string, @@ -106,21 +122,18 @@ export default class Stream extends EventEmitter<StreamEvents> { return connection; } - @autobind public removeSharedConnection(connection: SharedConnection): void { this.sharedConnections = this.sharedConnections.filter( (c) => c !== connection, ); } - @autobind public removeSharedConnectionPool(pool: Pool): void { this.sharedConnectionPools = this.sharedConnectionPools.filter( (p) => p !== pool, ); } - @autobind private connectToChannel<C extends keyof Channels>( channel: C, params: Channels[C]["params"], @@ -135,7 +148,6 @@ export default class Stream extends EventEmitter<StreamEvents> { return connection; } - @autobind public disconnectToChannel(connection: NonSharedConnection): void { this.nonSharedConnections = this.nonSharedConnections.filter( (c) => c !== connection, @@ -145,7 +157,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Callback of when open connection */ - @autobind private onOpen(): void { const isReconnect = this.state === "reconnecting"; @@ -162,7 +173,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Callback of when close connection */ - @autobind private onClose(): void { if (this.state === "connected") { this.state = "reconnecting"; @@ -173,7 +183,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Callback of when received a message from connection */ - @autobind private onMessage(message: { data: string }): void { const { type, body } = JSON.parse(message.data); @@ -203,7 +212,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Send a message to connection */ - @autobind public send(typeOrPayload: any, payload?: any): void { const data = payload === undefined @@ -219,7 +227,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Close this connection */ - @autobind public close(): void { this.stream.close(); } @@ -243,12 +250,10 @@ class Pool { this.stream.on("_disconnected_", this.onStreamDisconnected); } - @autobind private onStreamDisconnected(): void { this.isConnected = false; } - @autobind public inc(): void { if (this.users === 0 && !this.isConnected) { this.connect(); @@ -263,7 +268,6 @@ class Pool { } } - @autobind public dec(): void { this.users--; @@ -277,7 +281,6 @@ class Pool { } } - @autobind public connect(): void { if (this.isConnected) return; this.isConnected = true; @@ -287,7 +290,6 @@ class Pool { }); } - @autobind private disconnect(): void { this.stream.off("_disconnected_", this.onStreamDisconnected); this.stream.send("disconnect", { id: this.id }); @@ -314,7 +316,6 @@ export abstract class Connection< this.name = name; } - @autobind public send<T extends keyof Channel["receives"]>( type: T, body: Channel["receives"][T], @@ -347,7 +348,6 @@ class SharedConnection< this.pool.inc(); } - @autobind public dispose(): void { this.pool.dec(); this.removeAllListeners(); @@ -375,7 +375,6 @@ class NonSharedConnection< this.connect(); } - @autobind public connect(): void { this.stream.send("connect", { channel: this.channel, @@ -384,7 +383,6 @@ class NonSharedConnection< }); } - @autobind public dispose(): void { this.removeAllListeners(); this.stream.send("disconnect", { id: this.id }); diff --git a/packages/calckey-js/src/streaming.types.ts b/packages/calckey-js/src/streaming.types.ts index 0eb3ce407d..c0b0b030cd 100644 --- a/packages/calckey-js/src/streaming.types.ts +++ b/packages/calckey-js/src/streaming.types.ts @@ -98,7 +98,7 @@ export type Channels = { note: (payload: Note) => void; }; receives: null; - } + }; messaging: { params: { otherparty?: User["id"] | null; diff --git a/packages/calckey-js/test-d/api.ts b/packages/calckey-js/test-d/api.ts index c5018177c9..82dbae245c 100644 --- a/packages/calckey-js/test-d/api.ts +++ b/packages/calckey-js/test-d/api.ts @@ -4,7 +4,7 @@ import * as Misskey from "../src"; describe("API", () => { test("success", async () => { const cli = new Misskey.api.APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); const res = await cli.request("meta", { detail: true }); @@ -13,7 +13,7 @@ describe("API", () => { test("conditional respose type (meta)", async () => { const cli = new Misskey.api.APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -35,7 +35,7 @@ describe("API", () => { test("conditional respose type (users/show)", async () => { const cli = new Misskey.api.APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); diff --git a/packages/calckey-js/test-d/streaming.ts b/packages/calckey-js/test-d/streaming.ts index c49795dcc2..f9c414da70 100644 --- a/packages/calckey-js/test-d/streaming.ts +++ b/packages/calckey-js/test-d/streaming.ts @@ -3,7 +3,7 @@ import * as Misskey from "../src"; describe("Streaming", () => { test("emit type", async () => { - const stream = new Misskey.Stream("https://misskey.test", { + const stream = new Misskey.Stream("https://calckey.test", { token: "TOKEN", }); const mainChannel = stream.useChannel("main"); @@ -13,7 +13,7 @@ describe("Streaming", () => { }); test("params type", async () => { - const stream = new Misskey.Stream("https://misskey.test", { + const stream = new Misskey.Stream("https://calckey.test", { token: "TOKEN", }); // TODO: 「stream.useChannel の第二引数として受け入れる型が diff --git a/packages/calckey-js/test/api.ts b/packages/calckey-js/test/api.ts index a8a1fc0e6f..5de41e1ed1 100644 --- a/packages/calckey-js/test/api.ts +++ b/packages/calckey-js/test/api.ts @@ -5,7 +5,7 @@ enableFetchMocks(); function getFetchCall(call: any[]) { const { body, method } = call[1]; - if (body != null && typeof body != "string") { + if (body != null && typeof body !== "string") { throw new Error("invalid body"); } return { @@ -20,7 +20,7 @@ describe("API", () => { fetchMock.resetMocks(); fetchMock.mockResponse(async (req) => { const body = await req.json(); - if (req.method == "POST" && req.url == "https://misskey.test/api/i") { + if (req.method === "POST" && req.url === "https://calckey.test/api/i") { if (body.i === "TOKEN") { return JSON.stringify({ id: "foo" }); } else { @@ -32,7 +32,7 @@ describe("API", () => { }); const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -43,7 +43,7 @@ describe("API", () => { }); expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ - url: "https://misskey.test/api/i", + url: "https://calckey.test/api/i", method: "POST", body: { i: "TOKEN" }, }); @@ -54,8 +54,8 @@ describe("API", () => { fetchMock.mockResponse(async (req) => { const body = await req.json(); if ( - req.method == "POST" && - req.url == "https://misskey.test/api/notes/show" + req.method === "POST" && + req.url === "https://calckey.test/api/notes/show" ) { if (body.i === "TOKEN" && body.noteId === "aaaaa") { return JSON.stringify({ id: "foo" }); @@ -68,7 +68,7 @@ describe("API", () => { }); const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -79,7 +79,7 @@ describe("API", () => { }); expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ - url: "https://misskey.test/api/notes/show", + url: "https://calckey.test/api/notes/show", method: "POST", body: { i: "TOKEN", noteId: "aaaaa" }, }); @@ -89,8 +89,8 @@ describe("API", () => { fetchMock.resetMocks(); fetchMock.mockResponse(async (req) => { if ( - req.method == "POST" && - req.url == "https://misskey.test/api/reset-password" + req.method === "POST" && + req.url === "https://calckey.test/api/reset-password" ) { return { status: 204 }; } else { @@ -99,7 +99,7 @@ describe("API", () => { }); const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -111,7 +111,7 @@ describe("API", () => { expect(res).toEqual(null); expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ - url: "https://misskey.test/api/reset-password", + url: "https://calckey.test/api/reset-password", method: "POST", body: { i: "TOKEN", token: "aaa", password: "aaa" }, }); @@ -121,7 +121,7 @@ describe("API", () => { fetchMock.resetMocks(); fetchMock.mockResponse(async (req) => { const body = await req.json(); - if (req.method == "POST" && req.url == "https://misskey.test/api/i") { + if (req.method === "POST" && req.url === "https://calckey.test/api/i") { if (typeof body.i === "string") { return JSON.stringify({ id: "foo" }); } else { @@ -143,7 +143,7 @@ describe("API", () => { try { const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -172,7 +172,7 @@ describe("API", () => { try { const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -189,7 +189,7 @@ describe("API", () => { try { const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -210,7 +210,7 @@ describe("API", () => { try { const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); diff --git a/packages/calckey-js/test/streaming.ts b/packages/calckey-js/test/streaming.ts index 920a9102b8..1a3a71374a 100644 --- a/packages/calckey-js/test/streaming.ts +++ b/packages/calckey-js/test/streaming.ts @@ -3,8 +3,8 @@ import Stream from "../src/streaming"; describe("Streaming", () => { test("useChannel", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); const mainChannelReceived: any[] = []; const main = stream.useChannel("main"); main.on("meUpdated", (payload) => { @@ -44,8 +44,8 @@ describe("Streaming", () => { }); test("useChannel with parameters", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); const messagingChannelReceived: any[] = []; const messaging = stream.useChannel("messaging", { otherparty: "aaa" }); messaging.on("message", (payload) => { @@ -86,8 +86,8 @@ describe("Streaming", () => { }); test("ちゃんとチャンネルごとにidが異なる", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); stream.useChannel("messaging", { otherparty: "aaa" }); stream.useChannel("messaging", { otherparty: "bbb" }); @@ -111,8 +111,8 @@ describe("Streaming", () => { }); test("Connection#send", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); const messaging = stream.useChannel("messaging", { otherparty: "aaa" }); messaging.send("read", { id: "aaa" }); @@ -136,8 +136,8 @@ describe("Streaming", () => { }); test("Connection#dispose", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); const mainChannelReceived: any[] = []; const main = stream.useChannel("main"); main.on("meUpdated", (payload) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b0612c4a2..8abd0eefb4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -614,9 +614,6 @@ importers: packages/calckey-js: dependencies: - autobind-decorator: - specifier: ^2.4.0 - version: 2.4.0 eventemitter3: specifier: ^4.0.7 version: 4.0.7 @@ -626,25 +623,29 @@ importers: semver: specifier: ^7.3.8 version: 7.5.1 + optionalDependencies: + '@swc/core-android-arm64': + specifier: 1.3.11 + version: 1.3.11 devDependencies: + '@microsoft/api-documenter': + specifier: ^7.22.21 + version: 7.22.21(@types/node@20.3.1) '@microsoft/api-extractor': - specifier: ^7.19.3 - version: 7.19.3 + specifier: ^7.36.0 + version: 7.36.0(@types/node@20.3.1) + '@swc/cli': + specifier: ^0.1.62 + version: 0.1.62(@swc/core@1.3.62)(chokidar@3.3.1) + '@swc/core': + specifier: ^1.3.62 + version: 1.3.62 '@types/jest': specifier: ^27.4.0 version: 27.4.0 '@types/node': - specifier: 17.0.5 - version: 17.0.5 - '@typescript-eslint/eslint-plugin': - specifier: 5.8.1 - version: 5.8.1(@typescript-eslint/parser@5.8.1)(eslint@8.6.0)(typescript@4.5.4) - '@typescript-eslint/parser': - specifier: 5.8.1 - version: 5.8.1(eslint@8.6.0)(typescript@4.5.4) - eslint: - specifier: 8.6.0 - version: 8.6.0 + specifier: 20.3.1 + version: 20.3.1 jest: specifier: ^27.4.5 version: 27.4.5(ts-node@10.4.0) @@ -659,16 +660,16 @@ 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@4.5.4) + version: 27.1.2(@babel/core@7.22.5)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3) ts-node: specifier: 10.4.0 - version: 10.4.0(@types/node@17.0.5)(typescript@4.5.4) + version: 10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3) tsd: - specifier: ^0.19.1 - version: 0.19.1 + specifier: ^0.28.1 + version: 0.28.1 typescript: - specifier: 4.5.4 - version: 4.5.4 + specifier: 5.1.3 + version: 5.1.3 packages/client: devDependencies: @@ -1806,23 +1807,6 @@ packages: resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.5.2 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/eslintrc@2.0.3: resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1863,17 +1847,6 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/config-array@0.9.5: - resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -1917,7 +1890,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -1938,7 +1911,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -1975,7 +1948,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 jest-mock: 27.5.1 dev: true @@ -1985,7 +1958,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.11.18 + '@types/node': 20.3.1 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -2014,7 +1987,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -2038,6 +2011,13 @@ packages: - supports-color dev: true + /@jest/schemas@29.4.3: + resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.25.24 + dev: true + /@jest/source-map@27.5.1: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2098,7 +2078,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -2221,43 +2201,62 @@ packages: dev: false optional: true - /@microsoft/api-extractor-model@7.15.2: - resolution: {integrity: sha512-qgxKX/s6vo3nCVLhP0Ds7555QrErhcYHEok5/KyEZ7iR8J5M5oldD1eJJQmtEdVF5IzmnPPbxx1nRvfgA674LQ==} - dependencies: - '@microsoft/tsdoc': 0.13.2 - '@microsoft/tsdoc-config': 0.15.2 - '@rushstack/node-core-library': 3.44.3 - dev: true - - /@microsoft/api-extractor@7.19.3: - resolution: {integrity: sha512-GZe+R3K4kh2X425iOHkPbByysB7FN0592mPPA6vNj5IhyhlPHgdZS6m6AmOZOIxMS4euM+SBKzEJEp3oC+WsOQ==} + /@microsoft/api-documenter@7.22.21(@types/node@20.3.1): + resolution: {integrity: sha512-o8VXpB83P87cLIYfkQS7ibShoYorTZ7Xs+gMwftT75pFaYWwhBuI8M0MPgzTGIAxzi338XfUjhctlVCjRn+Sqg==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.15.2 - '@microsoft/tsdoc': 0.13.2 - '@microsoft/tsdoc-config': 0.15.2 - '@rushstack/node-core-library': 3.44.3 - '@rushstack/rig-package': 0.3.7 - '@rushstack/ts-command-line': 4.10.6 + '@microsoft/api-extractor-model': 7.27.3(@types/node@20.3.1) + '@microsoft/tsdoc': 0.14.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + '@rushstack/ts-command-line': 4.15.1 colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.17.0 - semver: 7.3.8 - source-map: 0.6.1 - typescript: 4.5.4 + js-yaml: 3.13.1 + resolve: 1.22.2 + transitivePeerDependencies: + - '@types/node' dev: true - /@microsoft/tsdoc-config@0.15.2: - resolution: {integrity: sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==} + /@microsoft/api-extractor-model@7.27.3(@types/node@20.3.1): + resolution: {integrity: sha512-fSFvw7otYHduOkyshjTbapKKgwF8bgquVHvgF8VgeKtMYvqXkoaj7W6VcM7PNY7E2bbblhUgC4XNdqZLD4SJGw==} dependencies: - '@microsoft/tsdoc': 0.13.2 + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.36.0(@types/node@20.3.1): + resolution: {integrity: sha512-P+kYgJFDXIr+UNzhRMhlpM/dderi6ab4lxn35vdhfAIMPtGCSXIJxrrtpTOQmQW8CZtmoZX06LYoUsKCc1zjow==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.27.3(@types/node@20.3.1) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + '@rushstack/rig-package': 0.4.0 + '@rushstack/ts-command-line': 4.15.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.2 + semver: 7.3.8 + source-map: 0.6.1 + typescript: 5.0.4 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 ajv: 6.12.6 jju: 1.4.0 resolve: 1.19.0 dev: true - /@microsoft/tsdoc@0.13.2: - resolution: {integrity: sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==} + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: true /@mole-inc/bin-wrapper@8.0.1: @@ -2558,29 +2557,33 @@ packages: dev: true optional: true - /@rushstack/node-core-library@3.44.3: - resolution: {integrity: sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w==} + /@rushstack/node-core-library@3.59.4(@types/node@20.3.1): + resolution: {integrity: sha512-YAKJDC6Mz/KA1D7bvB88WaRX3knt/ZuLzkRu5G9QADGSjLtvTWzCNCytRF2PCSaaHOZaZsWul4F1KQdgFgUDqA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true dependencies: - '@types/node': 12.20.24 + '@types/node': 20.3.1 colors: 1.2.5 fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.17.0 + resolve: 1.22.2 semver: 7.3.8 - timsort: 0.3.0 z-schema: 5.0.5 dev: true - /@rushstack/rig-package@0.3.7: - resolution: {integrity: sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==} + /@rushstack/rig-package@0.4.0: + resolution: {integrity: sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==} dependencies: - resolve: 1.17.0 + resolve: 1.22.2 strip-json-comments: 3.1.1 dev: true - /@rushstack/ts-command-line@4.10.6: - resolution: {integrity: sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==} + /@rushstack/ts-command-line@4.15.1: + resolution: {integrity: sha512-EL4jxZe5fhb1uVL/P/wQO+Z8Rc8FMiWJ1G7VgnPDvdIt5GVjRfK7vwzder1CZQiX3x0PY6uxENYLNGTFd1InRQ==} dependencies: '@types/argparse': 1.0.38 argparse: 1.0.10 @@ -2602,6 +2605,10 @@ packages: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} dev: true + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: true + /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -3019,15 +3026,14 @@ packages: /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - /@tsd/typescript@4.5.5: - resolution: {integrity: sha512-TxQ9QiUT94ZjKu++ta/iwTMVHsix4ApohnaHPTSd58WQuTjPIELP0tUYcW7lT6psz7yZiU4eRw+X4v/XV830Sw==} - hasBin: true + /@tsd/typescript@5.0.4: + resolution: {integrity: sha512-YQi2lvZSI+xidKeUjlbv6b6Zw7qB3aXHw5oGJLs5OOGAEqKIOvz5UIAkWyg0bJbkSUWPBEtaOHpVxU4EYBO1Jg==} dev: true /@types/accepts@1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/adm-zip@0.5.0: resolution: {integrity: sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==} @@ -3076,7 +3082,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/bull@3.15.9: resolution: {integrity: sha512-MPUcyPPQauAmynoO3ezHAmCOhbB0pWmYyijr/5ctaCqhbKWsjW0YCod38ZcLzUBprosfZ9dPqfYIcfdKjk7RNQ==} @@ -3092,7 +3098,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/responselike': 1.0.0 /@types/cbor@6.0.0: @@ -3105,14 +3111,14 @@ packages: /@types/co-body@6.1.0: resolution: {integrity: sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/qs': 6.9.7 dev: false /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/content-disposition@0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} @@ -3123,7 +3129,7 @@ packages: '@types/connect': 3.4.35 '@types/express': 4.17.17 '@types/keygrip': 1.0.2 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/disposable-email-domains@1.0.4: resolution: {integrity: sha512-AmKPD8vBZzvey/jeg+YAIH/xJE3D6edOXz+YUooSCcHesGzFyzke83kj1j4d0LUR9nkSHIRklUVdcAMleuWLpg==} @@ -3169,7 +3175,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3191,13 +3197,13 @@ packages: /@types/formidable@2.0.6: resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: false /@types/glob-stream@8.0.0: resolution: {integrity: sha512-fxTWwdQmX9LWSHD7ZLlv3BHR992mKcVcDnT/2v+l/QZZo7TfDdyasqlSYVzOnMGWhRbrWeWkbj/mgezFjKynhw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/picomatch': 2.3.0 '@types/streamx': 2.9.1 dev: true @@ -3206,26 +3212,26 @@ packages: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/gulp-rename@2.0.1: resolution: {integrity: sha512-9ZjeS2RHEnmBmTcyi2+oeye3BgCsWhvi4uv3qCnAg8i6plOuRdaeNxjOves0ELysEXYLBl7bCl5fbVs7AZtgTA==} dependencies: - '@types/node': 18.11.18 + '@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': 18.11.18 + '@types/node': 20.3.1 '@types/vinyl': 2.0.7 dev: true @@ -3320,7 +3326,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/koa-bodyparser@4.3.10: resolution: {integrity: sha512-6ae05pjhmrmGhUR8GYD5qr5p9LTEMEGfGXCsK8VaSL+totwigm8+H/7MHW7K4854CMeuwRAubT8qcc/EagaeIA==} @@ -3485,13 +3491,13 @@ packages: /@types/needle@3.2.0: resolution: {integrity: sha512-6XzvzEyJ2ozFNfPajFmqH9JOt0Hp+9TawaYpJT59iIP/zR0U37cfWCRwosyIeEBBZBi021Osq4jGAD3AOju5fg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 form-data: 3.0.1 dev: false @@ -3502,20 +3508,15 @@ packages: node-fetch: 3.3.1 dev: true - /@types/node@12.20.24: - resolution: {integrity: sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==} - dev: true - /@types/node@14.18.51: resolution: {integrity: sha512-P9bsdGFPpVtofEKlhWMVS2qqx1A/rt9QBfihWlklfHHpUpjtYse5AzFz6j4DWrARLYh6gRnw9+5+DJcrq3KvBA==} - /@types/node@17.0.5: - resolution: {integrity: sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==} - dev: true - /@types/node@18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + /@types/node@20.3.1: + resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + /@types/nodemailer@6.4.8: resolution: {integrity: sha512-oVsJSCkqViCn8/pEu2hfjwVO+Gb3e+eTWjg3PcjeFKRItfKpKwHphQqbYmPQrlMk+op7pNNWPbsJIEthpFN/OQ==} dependencies: @@ -3585,7 +3586,7 @@ packages: /@types/redis@2.8.32: resolution: {integrity: sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/redis@4.0.11: @@ -3602,7 +3603,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/sanitize-html@2.9.0: resolution: {integrity: sha512-4fP/kEcKNj2u39IzrxWYuf/FnCCwwQCpif6wwY6ROUS1EPRIfWJjGkY3HIowY1EX/VbX5e86yq8AAE7UPMgATg==} @@ -3626,13 +3627,13 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/serve-static@1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/sharp@0.31.1: resolution: {integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==} @@ -3659,7 +3660,7 @@ packages: /@types/streamx@2.9.1: resolution: {integrity: sha512-9bywzhouyedmci7WCIPFwJ8zASDnxt2gaVUy52X0p0Tt085IJSAEP0L6j4SSNeDMSLzpYu6cPz0GrJZ7kPJ6Bg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/throttle-debounce@5.0.0: @@ -3685,7 +3686,7 @@ packages: /@types/undertaker@1.2.8: resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/undertaker-registry': 1.0.1 async-done: 1.3.2 dev: true @@ -3698,7 +3699,7 @@ packages: resolution: {integrity: sha512-ctNcmmzbMIKooXjRkyyUCOu2Z4AyqibL+RhXoF3pb7K7j+ezItnakmpm31LymkYHSIM5ey0tjIFzTvFOTSBCGw==} dependencies: '@types/glob-stream': 8.0.0 - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/vinyl': 2.0.7 dev: true @@ -3706,7 +3707,7 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/web-push@3.3.2: @@ -3748,116 +3749,10 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true optional: true - /@typescript-eslint/eslint-plugin@5.8.1(@typescript-eslint/parser@5.8.1)(eslint@8.6.0)(typescript@4.5.4): - resolution: {integrity: sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/experimental-utils': 5.8.1(eslint@8.6.0)(typescript@4.5.4) - '@typescript-eslint/parser': 5.8.1(eslint@8.6.0)(typescript@4.5.4) - '@typescript-eslint/scope-manager': 5.8.1 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.6.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.4 - regexpp: 3.2.0 - semver: 7.5.1 - tsutils: 3.21.0(typescript@4.5.4) - typescript: 4.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/experimental-utils@5.8.1(eslint@8.6.0)(typescript@4.5.4): - resolution: {integrity: sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@typescript-eslint/scope-manager': 5.8.1 - '@typescript-eslint/types': 5.8.1 - '@typescript-eslint/typescript-estree': 5.8.1(typescript@4.5.4) - eslint: 8.6.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.6.0) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/parser@5.8.1(eslint@8.6.0)(typescript@4.5.4): - resolution: {integrity: sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.8.1 - '@typescript-eslint/types': 5.8.1 - '@typescript-eslint/typescript-estree': 5.8.1(typescript@4.5.4) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.6.0 - typescript: 4.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.8.1: - resolution: {integrity: sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.8.1 - '@typescript-eslint/visitor-keys': 5.8.1 - dev: true - - /@typescript-eslint/types@5.8.1: - resolution: {integrity: sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.8.1(typescript@4.5.4): - resolution: {integrity: sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.8.1 - '@typescript-eslint/visitor-keys': 5.8.1 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.1 - tsutils: 3.21.0(typescript@4.5.4) - typescript: 4.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/visitor-keys@5.8.1: - resolution: {integrity: sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.8.1 - eslint-visitor-keys: 3.4.1 - dev: true - /@vitejs/plugin-vue@4.2.3(vite@4.3.9)(vue@3.3.4): resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5805,6 +5700,7 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + requiresBuild: true dev: true /common-path-prefix@3.0.0: @@ -6606,6 +6502,11 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -7012,26 +6913,11 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-utils@3.0.0(eslint@8.6.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.6.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: false - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - /eslint-visitor-keys@3.4.1: resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7083,53 +6969,6 @@ packages: transitivePeerDependencies: - supports-color - /eslint@8.6.0: - resolution: {integrity: sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.9.5 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - enquirer: 2.3.6 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-utils: 3.0.0(eslint@8.6.0) - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 6.0.2 - globals: 13.20.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - progress: 2.0.3 - regexpp: 3.2.0 - semver: 7.5.1 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - v8-compile-cache: 2.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /espree@9.5.2: resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7889,10 +7728,6 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -8285,7 +8120,7 @@ packages: resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==} engines: {node: '>=10'} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/vinyl': 2.0.7 istextorbinary: 3.3.0 replacestream: 4.0.3 @@ -8689,11 +8524,6 @@ packages: engines: {node: '>=10 <11 || >=12 <13 || >=14'} dev: true - /ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - dev: true - /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -9317,7 +9147,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -9400,7 +9230,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.4.0(@types/node@17.0.5)(typescript@4.5.4) + ts-node: 10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3) transitivePeerDependencies: - bufferutil - canvas @@ -9418,6 +9248,16 @@ packages: pretty-format: 27.5.1 dev: true + /jest-diff@29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + /jest-docblock@27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9443,7 +9283,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -9461,7 +9301,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true @@ -9480,13 +9320,18 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true + /jest-get-type@29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /jest-haste-map@27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.6 - '@types/node': 18.11.18 + '@types/node': 20.3.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9508,7 +9353,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -9563,7 +9408,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): @@ -9619,7 +9464,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -9676,7 +9521,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 graceful-fs: 4.2.11 dev: true @@ -9715,7 +9560,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -9740,7 +9585,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -9760,7 +9605,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -9843,6 +9688,14 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + /js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -12454,6 +12307,15 @@ packages: react-is: 17.0.2 dev: true + /pretty-format@29.5.0: + resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /pretty-hrtime@1.0.3: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} @@ -12513,6 +12375,8 @@ packages: /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + dev: false + optional: true /promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} @@ -12835,6 +12699,10 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + /read-pkg-up@1.0.1: resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} engines: {node: '>=0.10.0'} @@ -13004,11 +12872,6 @@ packages: safe-regex: 1.1.0 dev: true - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - /remove-bom-buffer@3.0.0: resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} engines: {node: '>=0.10.0'} @@ -13178,12 +13041,6 @@ packages: engines: {node: '>=10'} dev: true - /resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - dependencies: - path-parse: 1.0.7 - dev: true - /resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} dependencies: @@ -14364,10 +14221,6 @@ packages: engines: {node: '>=4'} dev: true - /timsort@0.3.0: - resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} - dev: true - /tinycolor2@1.5.2: resolution: {integrity: sha512-h80m9GPFGbcLzZByXlNSEhp1gf8Dy+VX/2JCGUZsWLo7lV1mnE/XlxGYgRBoMLJh1lIDXP0EMC4RPTjlRaV+Bg==} @@ -14494,7 +14347,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@4.5.4): + /ts-jest@27.1.2(@babel/core@7.22.5)(@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 @@ -14525,7 +14378,7 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.1 - typescript: 4.5.4 + typescript: 5.1.3 yargs-parser: 20.2.9 dev: true @@ -14544,7 +14397,7 @@ packages: webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true - /ts-node@10.4.0(@types/node@17.0.5)(typescript@4.5.4): + /ts-node@10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3): resolution: {integrity: sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==} hasBin: true peerDependencies: @@ -14559,18 +14412,19 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.7.0 + '@swc/core': 1.3.62 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 17.0.5 + '@types/node': 20.3.1 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.5.4 + typescript: 5.1.3 yn: 3.1.1 dev: true @@ -14626,23 +14480,20 @@ packages: strip-bom: 3.0.0 dev: true - /tsd@0.19.1: - resolution: {integrity: sha512-pSwchclr+ADdxlahRUQXUrdAIOjXx1T1PQV+fLfVLuo/S4z+T00YU84fH8iPlZxyA2pWgJjo42BG1p9SDb4NOw==} - engines: {node: '>=12'} + /tsd@0.28.1: + resolution: {integrity: sha512-FeYrfJ05QgEMW/qOukNCr4fAJHww4SaKnivAXRv4g5kj4FeLpNV7zH4dorzB9zAfVX4wmA7zWu/wQf7kkcvfbw==} + engines: {node: '>=14.16'} hasBin: true dependencies: - '@tsd/typescript': 4.5.5 + '@tsd/typescript': 5.0.4 eslint-formatter-pretty: 4.1.0 globby: 11.1.0 + jest-diff: 29.5.0 meow: 9.0.0 path-exists: 4.0.0 read-pkg-up: 7.0.1 dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} @@ -14651,16 +14502,6 @@ packages: engines: {node: '>=0.6.x'} dev: false - /tsutils@3.21.0(typescript@4.5.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 4.5.4 - dev: true - /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: @@ -14821,17 +14662,17 @@ packages: - supports-color dev: false - /typescript@4.5.4: - resolution: {integrity: sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - /typescript@4.9.4: resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + /typescript@5.1.3: resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} engines: {node: '>=14.17'} @@ -15045,10 +14886,6 @@ packages: /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - /v8-compile-cache@2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true - /v8-to-istanbul@8.1.1: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} From 1fddd319c458b6dc69741c9eb474c61fdf573d40 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 21:18:04 -0700 Subject: [PATCH 148/309] fix: :bug: remove cw in post edit Closes #10353 --- packages/backend/src/server/api/endpoints/notes/edit.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 90a4f4ded1..511ea618cc 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -527,9 +527,12 @@ export default define(meta, paramDef, async (ps, user) => { if (ps.text !== note.text) { update.text = ps.text; } - if (ps.cw !== note.cw) { + if (ps.cw !== note.cw || (ps.cw && !note.cw)) { update.cw = ps.cw; } + else if (!ps.cw && note.cw) { + update.cw = null; + } if (ps.visibility !== note.visibility) { update.visibility = ps.visibility; } From 2eea153ba1e565df9fe005cbf9f6aa89a73f1293 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 21:22:44 -0700 Subject: [PATCH 149/309] chore: :art: format --- cypress.config.ts | 20 +-- cypress/e2e/basic.cy.js | 126 +++++++++--------- cypress/e2e/widgets.cy.js | 78 +++++------ cypress/plugins/index.js | 6 +- cypress/support/commands.js | 34 ++--- cypress/support/e2e.js | 18 +-- .../src/server/api/endpoints/notes/edit.ts | 2 +- packages/backend/src/services/note/create.ts | 20 +-- packages/calckey-js/package.json | 2 +- packages/client/src/components/mfm.ts | 2 +- packages/client/src/directives/tooltip.ts | 1 - packages/client/src/os.ts | 96 +++++++------ packages/client/src/scripts/emojilist.ts | 85 +++++++----- packages/client/src/scripts/get-note-menu.ts | 65 ++++----- packages/client/src/scripts/get-user-menu.ts | 4 +- packages/client/src/store.ts | 2 +- scripts/build-greet.js | 12 +- scripts/clean-all.js | 75 +++++++---- scripts/clean.js | 26 +++- scripts/dev.js | 28 ++-- 20 files changed, 381 insertions(+), 321 deletions(-) diff --git a/cypress.config.ts b/cypress.config.ts index e390c41a54..25ff2aa075 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,12 +1,12 @@ -import { defineConfig } from 'cypress' +import { defineConfig } from "cypress"; export default defineConfig({ - e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index.js')(on, config) - }, - baseUrl: 'http://localhost:61812', - }, -}) + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require("./cypress/plugins/index.js")(on, config); + }, + baseUrl: "http://localhost:61812", + }, +}); diff --git a/cypress/e2e/basic.cy.js b/cypress/e2e/basic.cy.js index eb5195c4b2..f73a25efbc 100644 --- a/cypress/e2e/basic.cy.js +++ b/cypress/e2e/basic.cy.js @@ -1,4 +1,4 @@ -describe('Before setup instance', () => { +describe("Before setup instance", () => { beforeEach(() => { cy.resetState(); }); @@ -9,31 +9,31 @@ describe('Before setup instance', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('setup instance', () => { - cy.visit('/'); + it("setup instance", () => { + cy.visit("/"); - cy.intercept('POST', '/api/admin/accounts/create').as('signup'); - - cy.get('[data-cy-admin-username] input').type('admin'); - cy.get('[data-cy-admin-password] input').type('admin1234'); - cy.get('[data-cy-admin-ok]').click(); + cy.intercept("POST", "/api/admin/accounts/create").as("signup"); + + cy.get("[data-cy-admin-username] input").type("admin"); + cy.get("[data-cy-admin-password] input").type("admin1234"); + cy.get("[data-cy-admin-ok]").click(); // なぜか動かない //cy.wait('@signup').should('have.property', 'response.statusCode'); - cy.wait('@signup'); - }); + cy.wait("@signup"); + }); }); -describe('After setup instance', () => { +describe("After setup instance", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); }); afterEach(() => { @@ -42,34 +42,34 @@ describe('After setup instance', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('signup', () => { - cy.visit('/'); + it("signup", () => { + cy.visit("/"); - cy.intercept('POST', '/api/signup').as('signup'); + cy.intercept("POST", "/api/signup").as("signup"); - cy.get('[data-cy-signup]').click(); - cy.get('[data-cy-signup-username] input').type('alice'); - cy.get('[data-cy-signup-password] input').type('alice1234'); - cy.get('[data-cy-signup-password-retype] input').type('alice1234'); - cy.get('[data-cy-signup-submit]').click(); + cy.get("[data-cy-signup]").click(); + cy.get("[data-cy-signup-username] input").type("alice"); + cy.get("[data-cy-signup-password] input").type("alice1234"); + cy.get("[data-cy-signup-password-retype] input").type("alice1234"); + cy.get("[data-cy-signup-submit]").click(); - cy.wait('@signup'); - }); + cy.wait("@signup"); + }); }); -describe('After user signup', () => { +describe("After user signup", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); }); afterEach(() => { @@ -78,51 +78,53 @@ describe('After user signup', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('signin', () => { - cy.visit('/'); + it("signin", () => { + cy.visit("/"); - cy.intercept('POST', '/api/signin').as('signin'); + cy.intercept("POST", "/api/signin").as("signin"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type('alice'); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type("alice"); // Enterキーでサインインできるかの確認も兼ねる - cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + cy.get("[data-cy-signin-password] input").type("alice1234{enter}"); - cy.wait('@signin'); - }); + cy.wait("@signin"); + }); - it('suspend', function() { - cy.request('POST', '/api/admin/suspend-user', { + it("suspend", function () { + cy.request("POST", "/api/admin/suspend-user", { i: this.admin.token, userId: this.alice.id, }); - cy.visit('/'); + cy.visit("/"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type('alice'); - cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type("alice"); + cy.get("[data-cy-signin-password] input").type("alice1234{enter}"); // TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする - cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi); + cy.contains( + /アカウントが凍結されています|This account has been suspended due to/gi, + ); }); }); -describe('After user singed in', () => { +describe("After user singed in", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); - cy.login('alice', 'alice1234'); + cy.login("alice", "alice1234"); }); afterEach(() => { @@ -131,17 +133,17 @@ describe('After user singed in', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.get('[data-cy-open-post-form]').should('be.visible'); - }); + it("successfully loads", () => { + cy.get("[data-cy-open-post-form]").should("be.visible"); + }); - it('note', () => { - cy.get('[data-cy-open-post-form]').click(); - cy.get('[data-cy-post-form-text]').type('Hello, Misskey!'); - cy.get('[data-cy-open-post-form-submit]').click(); + it("note", () => { + cy.get("[data-cy-open-post-form]").click(); + cy.get("[data-cy-post-form-text]").type("Hello, Misskey!"); + cy.get("[data-cy-open-post-form-submit]").click(); - cy.contains('Hello, Misskey!'); - }); + cy.contains("Hello, Misskey!"); + }); }); // TODO: 投稿フォームの公開範囲指定のテスト diff --git a/cypress/e2e/widgets.cy.js b/cypress/e2e/widgets.cy.js index 9eea010bde..e3c9326db8 100644 --- a/cypress/e2e/widgets.cy.js +++ b/cypress/e2e/widgets.cy.js @@ -1,14 +1,14 @@ -describe('After user signed in', () => { +describe("After user signed in", () => { beforeEach(() => { cy.resetState(); - cy.viewport('macbook-16'); + cy.viewport("macbook-16"); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); - cy.login('alice', 'alice1234'); + cy.login("alice", "alice1234"); }); afterEach(() => { @@ -17,47 +17,47 @@ describe('After user signed in', () => { cy.wait(1000); }); - it('widget edit toggle is visible', () => { - cy.get('.mk-widget-edit').should('be.visible'); - }); + it("widget edit toggle is visible", () => { + cy.get(".mk-widget-edit").should("be.visible"); + }); - it('widget select should be visible in edit mode', () => { - cy.get('.mk-widget-edit').click(); - cy.get('.mk-widget-select').should('be.visible'); - }); + it("widget select should be visible in edit mode", () => { + cy.get(".mk-widget-edit").click(); + cy.get(".mk-widget-select").should("be.visible"); + }); - it('first widget should be removed', () => { - cy.get('.mk-widget-edit').click(); - cy.get('.customize-container:first-child .remove._button').click(); - cy.get('.customize-container').should('have.length', 2); + it("first widget should be removed", () => { + cy.get(".mk-widget-edit").click(); + cy.get(".customize-container:first-child .remove._button").click(); + cy.get(".customize-container").should("have.length", 2); }); function buildWidgetTest(widgetName) { it(`${widgetName} widget should get added`, () => { - cy.get('.mk-widget-edit').click(); - cy.get('.mk-widget-select select').select(widgetName, { force: true }); - cy.get('.bg._modalBg.transparent').click({ multiple: true, force: true }); - cy.get('.mk-widget-add').click({ force: true }); - cy.get(`.mkw-${widgetName}`).should('exist'); + cy.get(".mk-widget-edit").click(); + cy.get(".mk-widget-select select").select(widgetName, { force: true }); + cy.get(".bg._modalBg.transparent").click({ multiple: true, force: true }); + cy.get(".mk-widget-add").click({ force: true }); + cy.get(`.mkw-${widgetName}`).should("exist"); }); } - buildWidgetTest('memo'); - buildWidgetTest('notifications'); - buildWidgetTest('timeline'); - buildWidgetTest('calendar'); - buildWidgetTest('rss'); - buildWidgetTest('trends'); - buildWidgetTest('clock'); - buildWidgetTest('activity'); - buildWidgetTest('photos'); - buildWidgetTest('digitalClock'); - buildWidgetTest('federation'); - buildWidgetTest('postForm'); - buildWidgetTest('slideshow'); - buildWidgetTest('serverMetric'); - buildWidgetTest('onlineUsers'); - buildWidgetTest('jobQueue'); - buildWidgetTest('button'); - buildWidgetTest('aiscript'); + buildWidgetTest("memo"); + buildWidgetTest("notifications"); + buildWidgetTest("timeline"); + buildWidgetTest("calendar"); + buildWidgetTest("rss"); + buildWidgetTest("trends"); + buildWidgetTest("clock"); + buildWidgetTest("activity"); + buildWidgetTest("photos"); + buildWidgetTest("digitalClock"); + buildWidgetTest("federation"); + buildWidgetTest("postForm"); + buildWidgetTest("slideshow"); + buildWidgetTest("serverMetric"); + buildWidgetTest("onlineUsers"); + buildWidgetTest("jobQueue"); + buildWidgetTest("button"); + buildWidgetTest("aiscript"); }); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js index aa9918d215..3a4b6deb18 100644 --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -16,6 +16,6 @@ * @type {Cypress.PluginConfig} */ module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +}; diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 95bfcf6855..3fe95b93d0 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -24,32 +24,34 @@ // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -Cypress.Commands.add('resetState', () => { - cy.window(win => { - win.indexedDB.deleteDatabase('keyval-store'); +Cypress.Commands.add("resetState", () => { + cy.window((win) => { + win.indexedDB.deleteDatabase("keyval-store"); }); - cy.request('POST', '/api/reset-db').as('reset'); - cy.get('@reset').its('status').should('equal', 204); + cy.request("POST", "/api/reset-db").as("reset"); + cy.get("@reset").its("status").should("equal", 204); cy.reload(true); }); -Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => { - const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup'; +Cypress.Commands.add("registerUser", (username, password, isAdmin = false) => { + const route = isAdmin ? "/api/admin/accounts/create" : "/api/signup"; - cy.request('POST', route, { + cy.request("POST", route, { username: username, password: password, - }).its('body').as(username); + }) + .its("body") + .as(username); }); -Cypress.Commands.add('login', (username, password) => { - cy.visit('/'); +Cypress.Commands.add("login", (username, password) => { + cy.visit("/"); - cy.intercept('POST', '/api/signin').as('signin'); + cy.intercept("POST", "/api/signin").as("signin"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type(username); - cy.get('[data-cy-signin-password] input').type(`${password}{enter}`); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type(username); + cy.get("[data-cy-signin-password] input").type(`${password}{enter}`); - cy.wait('@signin').as('signedIn'); + cy.wait("@signin").as("signedIn"); }); diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js index 9185be344c..961c6ac888 100644 --- a/cypress/support/e2e.js +++ b/cypress/support/e2e.js @@ -14,19 +14,21 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands' +import "./commands"; // Alternatively you can use CommonJS syntax: // require('./commands') -Cypress.on('uncaught:exception', (err, runnable) => { - if ([ - // Chrome - 'ResizeObserver loop limit exceeded', +Cypress.on("uncaught:exception", (err, runnable) => { + if ( + [ + // Chrome + "ResizeObserver loop limit exceeded", - // Firefox - 'ResizeObserver loop completed with undelivered notifications', - ].some(msg => err.message.includes(msg))) { + // Firefox + "ResizeObserver loop completed with undelivered notifications", + ].some((msg) => err.message.includes(msg)) + ) { return false; } }); diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 511ea618cc..14ce2faafc 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -530,7 +530,7 @@ export default define(meta, paramDef, async (ps, user) => { if (ps.cw !== note.cw || (ps.cw && !note.cw)) { update.cw = ps.cw; } - else if (!ps.cw && note.cw) { + if (!ps.cw && note.cw) { update.cw = null; } if (ps.visibility !== note.visibility) { diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index d765ff7aab..ba6859249d 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -468,7 +468,9 @@ export default async ( } else if (boostedByRelay && data.renote?.uri) { // Use Redis transaction for atomicity await redisClient.watch(`publishedNote:${data.renote.uri}`); - const exists = await redisClient.exists(`publishedNote:${data.renote.uri}`); + const exists = await redisClient.exists( + `publishedNote:${data.renote.uri}`, + ); if (exists === 0) { // Start the transaction const transaction = redisClient.multi(); @@ -669,15 +671,15 @@ async function renderNoteOrRenoteActivity(data: Option, note: Note) { const content = data.renote && - data.text == null && - data.poll == null && - (data.files == null || data.files.length === 0) + data.text == null && + data.poll == null && + (data.files == null || data.files.length === 0) ? renderAnnounce( - data.renote.uri - ? data.renote.uri - : `${config.url}/notes/${data.renote.id}`, - note, - ) + data.renote.uri + ? data.renote.uri + : `${config.url}/notes/${data.renote.id}`, + note, + ) : renderCreate(await renderNote(note, false), note); return renderActivity(content); diff --git a/packages/calckey-js/package.json b/packages/calckey-js/package.json index d2235d04cf..105f2fda94 100644 --- a/packages/calckey-js/package.json +++ b/packages/calckey-js/package.json @@ -11,7 +11,7 @@ "api": "pnpm api-extractor run --local --verbose", "api-prod": "pnpm api-extractor run --verbose", "api-doc": "pnpm api-documenter markdown -i ./etc/", - "lint": "pnpm rome check --apply * && pnpm rome check --apply 'src/*.ts'", + "lint": "pnpm rome check --apply *.ts", "format": "pnpm rome format --write '*' ; pnpm rome format --write '**/*.ts'", "jest": "jest --coverage --detectOpenHandles", "test": "pnpm jest && pnpm tsd" diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 37e454fcfd..cb0942a338 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -65,7 +65,7 @@ export default defineComponent({ }; // const validEase = (e: string | null | undefined) => { // if (e == null) return null; - // return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) + // return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) // ? (e.startsWith("steps") ? e : "cubic-bezier" + e) // : null // } diff --git a/packages/client/src/directives/tooltip.ts b/packages/client/src/directives/tooltip.ts index e9668f28fe..e2db3fbf57 100644 --- a/packages/client/src/directives/tooltip.ts +++ b/packages/client/src/directives/tooltip.ts @@ -6,7 +6,6 @@ import { isTouchUsing } from "@/scripts/touch"; import { popup, alert } from "@/os"; import { mainRouter } from "@/router"; - const start = isTouchUsing ? "touchstart" : "mouseover"; const end = isTouchUsing ? "touchend" : "mouseleave"; diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts index 376d5184e5..32bb8f76b1 100644 --- a/packages/client/src/os.ts +++ b/packages/client/src/os.ts @@ -22,7 +22,7 @@ const apiClient = new Misskey.api.APIClient({ export const api = (( endpoint: string, data: Record<string, any> = {}, - token?: string | null | undefined + token?: string | null | undefined, ) => { pendingApiRequestsCount.value++; @@ -36,16 +36,13 @@ export const api = (( : undefined; const promise = new Promise((resolve, reject) => { - fetch( - endpoint.indexOf("://") > -1 ? endpoint : `${apiUrl}/${endpoint}`, - { - method: "POST", - body: JSON.stringify(data), - credentials: "omit", - cache: "no-cache", - headers: authorization ? { authorization } : {}, - } - ) + fetch(endpoint.indexOf("://") > -1 ? endpoint : `${apiUrl}/${endpoint}`, { + method: "POST", + body: JSON.stringify(data), + credentials: "omit", + cache: "no-cache", + headers: authorization ? { authorization } : {}, + }) .then(async (res) => { const body = res.status === 204 ? null : await res.json(); @@ -68,7 +65,7 @@ export const api = (( export const apiGet = (( endpoint: string, data: Record<string, any> = {}, - token?: string | null | undefined + token?: string | null | undefined, ) => { pendingApiRequestsCount.value++; @@ -113,7 +110,7 @@ export const apiGet = (( export const apiWithDialog = (( endpoint: string, data: Record<string, any> = {}, - token?: string | null | undefined + token?: string | null | undefined, ) => { const promise = api(endpoint, data, token); promiseDialog(promise, null, (err) => { @@ -130,7 +127,7 @@ export function promiseDialog<T extends Promise<any>>( promise: T, onSuccess?: ((res: any) => void) | null, onFailure?: ((err: Error) => void) | null, - text?: string + text?: string, ): T { const showing = ref(true); const success = ref(false); @@ -168,7 +165,7 @@ export function promiseDialog<T extends Promise<any>>( text: text, }, {}, - "closed" + "closed", ); return promise; @@ -189,7 +186,7 @@ const zIndexes = { high: 3000000, }; export function claimZIndex( - priority: "low" | "middle" | "high" = "low" + priority: "low" | "middle" | "high" = "low", ): number { zIndexes[priority] += 100; return zIndexes[priority]; @@ -204,7 +201,7 @@ export async function popup( component: Component, props: Record<string, any>, events = {}, - disposeEvent?: string + disposeEvent?: string, ) { markRaw(component); @@ -245,7 +242,7 @@ export function pageWindow(path: string) { initialPath: path, }, {}, - "closed" + "closed", ); } @@ -260,7 +257,7 @@ export function modalPageWindow(path: string) { initialPath: path, }, {}, - "closed" + "closed", ); } @@ -271,7 +268,7 @@ export function toast(message: string) { message, }, {}, - "closed" + "closed", ); } @@ -292,7 +289,7 @@ export function alert(props: { resolve(); }, }, - "closed" + "closed", ); }); } @@ -316,7 +313,7 @@ export function confirm(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -343,7 +340,7 @@ export function yesno(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -384,7 +381,7 @@ export function inputText(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -422,7 +419,7 @@ export function inputParagraph(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -462,7 +459,7 @@ export function inputNumber(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -499,11 +496,11 @@ export function inputDate(props: { result: new Date(result.result), canceled: false, } - : { canceled: true } + : { canceled: true }, ); }, }, - "closed" + "closed", ); }); } @@ -529,7 +526,7 @@ export function select<C = any>( }[]; }[]; } - ) + ), ): Promise< | { canceled: true; result: undefined } | { @@ -554,7 +551,7 @@ export function select<C = any>( resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -574,7 +571,7 @@ export function success(): Promise<void> { { done: () => resolve(), }, - "closed" + "closed", ); }); } @@ -591,7 +588,7 @@ export function waiting(): Promise<void> { { done: () => resolve(), }, - "closed" + "closed", ); }); } @@ -610,7 +607,7 @@ export function form(title, form) { resolve(result); }, }, - "closed" + "closed", ); }); } @@ -629,7 +626,7 @@ export async function selectUser() { resolve(user); }, }, - "closed" + "closed", ); }); } @@ -648,7 +645,7 @@ export async function selectInstance(): Promise<Misskey.entities.Instance> { resolve(instance); }, }, - "closed" + "closed", ); }); } @@ -672,7 +669,7 @@ export async function selectDriveFile(multiple: boolean) { } }, }, - "closed" + "closed", ); }); } @@ -696,7 +693,7 @@ export async function selectDriveFolder(multiple: boolean) { } }, }, - "closed" + "closed", ); }); } @@ -718,7 +715,7 @@ export async function pickEmoji(src: HTMLElement | null, opts) { resolve(emoji); }, }, - "closed" + "closed", ); }); } @@ -727,7 +724,7 @@ export async function cropImage( image: Misskey.entities.DriveFile, options: { aspectRatio: number; - } + }, ): Promise<Misskey.entities.DriveFile> { return new Promise((resolve, reject) => { popup( @@ -745,7 +742,7 @@ export async function cropImage( resolve(x); }, }, - "closed" + "closed", ); }); } @@ -760,7 +757,7 @@ let activeTextarea: HTMLTextAreaElement | HTMLInputElement | null = null; export async function openEmojiPicker( src?: HTMLElement, opts, - initialTextarea: typeof activeTextarea + initialTextarea: typeof activeTextarea, ) { if (openingEmojiPicker) return; @@ -776,14 +773,13 @@ export async function openEmojiPicker( const observer = new MutationObserver((records) => { for (const record of records) { for (const node of Array.from(record.addedNodes).filter( - (node) => node instanceof HTMLElement + (node) => node instanceof HTMLElement, ) as HTMLElement[]) { const textareas = node.querySelectorAll("textarea, input"); for (const textarea of Array.from(textareas).filter( - (textarea) => textarea.dataset.preventEmojiInsert == null + (textarea) => textarea.dataset.preventEmojiInsert == null, )) { - if (document.activeElement === textarea) - activeTextarea = textarea; + if (document.activeElement === textarea) activeTextarea = textarea; textarea.addEventListener("focus", () => { activeTextarea = textarea; }); @@ -821,7 +817,7 @@ export async function openEmojiPicker( openingEmojiPicker = null; observer.disconnect(); }, - } + }, ); } @@ -833,7 +829,7 @@ export function popupMenu( width?: number; viaKeyboard?: boolean; noReturnFocus?: boolean; - } + }, ) { return new Promise((resolve, reject) => { let dispose; @@ -856,7 +852,7 @@ export function popupMenu( resolve(); dispose(); }, - } + }, ).then((res) => { dispose = res.dispose; }); @@ -865,7 +861,7 @@ export function popupMenu( export function contextMenu( items: MenuItem[] | Ref<MenuItem[]>, - ev: MouseEvent + ev: MouseEvent, ) { ev.preventDefault(); return new Promise((resolve, reject) => { @@ -885,7 +881,7 @@ export function contextMenu( resolve(); dispose(); }, - } + }, ).then((res) => { dispose = res.dispose; }); diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 0609600f6f..a5ad7e3685 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -28,11 +28,11 @@ export const categoryMapping = { "People & Body": "people", "Animals & Nature": "animals_and_nature", "Food & Drink": "food_and_drink", - "Activities": "activity", + Activities: "activity", "Travel & Places": "travel_and_places", - "Objects": "objects", - "Symbols": "symbols", - "Flags": "flags", + Objects: "objects", + Symbols: "symbols", + Flags: "flags", } as const; export const unicodeEmojiSkinTones = [ @@ -47,24 +47,39 @@ export const unicodeEmojiSkinTones = [ export function addSkinTone(emoji: string, skinTone?: number) { const chosenSkinTone = skinTone || defaultStore.state.reactionPickerSkinTone; const skinToneModifiers = [ - "", - emojiComponents.light_skin_tone, - emojiComponents.medium_light_skin_tone, - emojiComponents.medium_skin_tone, - emojiComponents.medium_dark_skin_tone, - emojiComponents.dark_skin_tone + "", + emojiComponents.light_skin_tone, + emojiComponents.medium_light_skin_tone, + emojiComponents.medium_skin_tone, + emojiComponents.medium_dark_skin_tone, + emojiComponents.dark_skin_tone, ]; return emoji + (skinToneModifiers[chosenSkinTone - 1] || ""); } const unicodeFifteenEmojis = [ - '🫨', '🩷', '🩵', '🩶', - '🫷', '🫸', '🫎', '🫏', - '🪽', '🐦⬛', '🪿', '🪼', - '🪻', '🫚', '🫛', '🪭', - '🪮', '🪇', '🪈', '🪯', - '🛜' -] + "🫨", + "🩷", + "🩵", + "🩶", + "🫷", + "🫸", + "🫎", + "🫏", + "🪽", + "🐦⬛", + "🪿", + "🪼", + "🪻", + "🫚", + "🫛", + "🪭", + "🪮", + "🪇", + "🪈", + "🪯", + "🛜", +]; const newData = {}; @@ -84,22 +99,26 @@ Object.keys(data).forEach((originalCategory) => { } }); -export const emojilist: UnicodeEmojiDef[] = Object.keys(newData).reduce((acc, category) => { - const categoryItems = newData[category].map((item) => { - return { - emoji: item.emoji, - slug: item.slug, - category: item.category, - skin_tone_support: item.skin_tone_support || false, - keywords: item.keywords || [], - }; - }); - return acc.concat(categoryItems); -}, []); - +export const emojilist: UnicodeEmojiDef[] = Object.keys(newData).reduce( + (acc, category) => { + const categoryItems = newData[category].map((item) => { + return { + emoji: item.emoji, + slug: item.slug, + category: item.category, + skin_tone_support: item.skin_tone_support || false, + keywords: item.keywords || [], + }; + }); + return acc.concat(categoryItems); + }, + [], +); export function getNicelyLabeledCategory(internalName) { - return Object.keys(categoryMapping).find( - (key) => categoryMapping[key] === internalName - ) || internalName; + return ( + Object.keys(categoryMapping).find( + (key) => categoryMapping[key] === internalName, + ) || internalName + ); } diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts index 1eeaf29a5d..fa78c7ce54 100644 --- a/packages/client/src/scripts/get-note-menu.ts +++ b/packages/client/src/scripts/get-note-menu.ts @@ -341,7 +341,7 @@ export function getNoteMenu(props: { action: () => { window.open(appearNote.url || appearNote.uri, "_blank"); }, - } + } : undefined, { type: "parent", @@ -358,19 +358,21 @@ export function getNoteMenu(props: { text: i18n.ts.copyLink, action: copyLink, }, - appearNote.url || appearNote.uri ? { - icon: "ph-link-simple ph-bold ph-lg", - text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, - action: copyOriginal, - } : undefined, + appearNote.url || appearNote.uri + ? { + icon: "ph-link-simple ph-bold ph-lg", + text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, + action: copyOriginal, + } + : undefined, shareAvailable() - ? { - icon: "ph-share-network ph-bold ph-lg", - text: i18n.ts.share, - action: share, - } - : undefined, - ] + ? { + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + action: share, + } + : undefined, + ], }, /* ...($i.isModerator || $i.isAdmin ? [ @@ -404,7 +406,7 @@ export function getNoteMenu(props: { "closed", ); }, - } + } : undefined, instance.features.postEditing && isAppearAuthor ? { @@ -432,11 +434,12 @@ export function getNoteMenu(props: { !isAppearAuthor ? null : undefined, !isAppearAuthor ? { - type: "parent", - icon: "ph-user ph-bold ph-lg", - text: i18n.ts.user, - children: getUserMenu(appearNote.user) - } : undefined, + type: "parent", + icon: "ph-user ph-bold ph-lg", + text: i18n.ts.user, + children: getUserMenu(appearNote.user), + } + : undefined, ].filter((x) => x !== undefined); } else { menu = [ @@ -459,18 +462,20 @@ export function getNoteMenu(props: { text: i18n.ts.copyLink, action: copyLink, }, - appearNote.url || appearNote.uri ? { - icon: "ph-link-simple ph-bold ph-lg", - text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, - action: copyOriginal, - } : undefined, + appearNote.url || appearNote.uri + ? { + icon: "ph-link-simple ph-bold ph-lg", + text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, + action: copyOriginal, + } + : undefined, shareAvailable() - ? { - icon: "ph-share-network ph-bold ph-lg", - text: i18n.ts.share, - action: share, - } - : undefined, + ? { + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + action: share, + } + : undefined, ].filter((x) => x !== undefined); } diff --git a/packages/client/src/scripts/get-user-menu.ts b/packages/client/src/scripts/get-user-menu.ts index 39e1912b73..48b97fed62 100644 --- a/packages/client/src/scripts/get-user-menu.ts +++ b/packages/client/src/scripts/get-user-menu.ts @@ -227,7 +227,9 @@ export function getUserMenu(user, router: Router = mainRouter) { let menu = [ { type: "label", - text: user.host ? `@${user.username}@${user.host || host}` : `@${user.username}` + text: user.host + ? `@${user.username}@${user.host || host}` + : `@${user.username}`, }, { icon: "ph-at ph-bold ph-lg", diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index 74ee6e7555..e7be5135c5 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -337,7 +337,7 @@ export const defaultStore = markRaw( showTimelineReplies: { where: "device", default: true, - } + }, }), ); diff --git a/scripts/build-greet.js b/scripts/build-greet.js index bbcc2aec7b..4b119b0c9f 100644 --- a/scripts/build-greet.js +++ b/scripts/build-greet.js @@ -8,16 +8,8 @@ console.log(themeColor("/ /__| (_| | | (__| < __/ |_| |")); console.log(themeColor("\\____/\\__,_|_|\\___|_|\\_\\___|\\__, |")); console.log(themeColor(" (___/ ")); +console.log(" Currently building Calckey!"); console.log( - " Currently building Calckey!", -); -console.log( - chalk.rgb( - 255, - 136, - 0, - )( - " Hang on for a moment, as this may take a while.", - ), + chalk.rgb(255, 136, 0)(" Hang on for a moment, as this may take a while."), ); console.log(""); diff --git a/scripts/clean-all.js b/scripts/clean-all.js index c5f6829886..8c1032e338 100644 --- a/scripts/clean-all.js +++ b/scripts/clean-all.js @@ -1,30 +1,57 @@ -const fs = require('node:fs'); -const execa = require('execa'); -const { join } = require('node:path'); +const fs = require("node:fs"); +const execa = require("execa"); +const { join } = require("node:path"); (async () => { - fs.rmSync(join(__dirname, '/../packages/backend/built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../packages/backend/node_modules'), { recursive: true, force: true }); - - fs.rmSync(join(__dirname, '/../packages/backend/native-utils/built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../packages/backend/native-utils/node_modules'), { recursive: true, force: true }); - - fs.rmSync(join(__dirname, '/../packages/client/built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../packages/client/node_modules'), { recursive: true, force: true }); - - fs.rmSync(join(__dirname, '/../packages/sw/built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../packages/sw/node_modules'), { recursive: true, force: true }); - - fs.rmSync(join(__dirname, '/../built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../node_modules'), { recursive: true, force: true }); - - execa('pnpm', ['store', 'prune'], { - cwd: join(__dirname, '/../'), - stdio: 'inherit' + fs.rmSync(join(__dirname, "/../packages/backend/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/node_modules"), { + recursive: true, + force: true, }); - execa('cargo', ['clean'], { - cwd: join(__dirname, '/../packages/backend/native-utils'), - stdio: 'inherit' + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../packages/client/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/client/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../packages/sw/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/sw/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true }); + fs.rmSync(join(__dirname, "/../node_modules"), { + recursive: true, + force: true, + }); + + execa("pnpm", ["store", "prune"], { + cwd: join(__dirname, "/../"), + stdio: "inherit", + }); + + execa("cargo", ["clean"], { + cwd: join(__dirname, "/../packages/backend/native-utils"), + stdio: "inherit", }); })(); diff --git a/scripts/clean.js b/scripts/clean.js index cf8ee9bc56..76a7873b51 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -1,10 +1,22 @@ -const fs = require('node:fs'); -const { join } = require('node:path'); +const fs = require("node:fs"); +const { join } = require("node:path"); (async () => { - fs.rmSync(join(__dirname, '/../packages/backend/built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../packages/backend/native-utils/built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../packages/client/built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../packages/sw/built'), { recursive: true, force: true }); - fs.rmSync(join(__dirname, '/../built'), { recursive: true, force: true }); + fs.rmSync(join(__dirname, "/../packages/backend/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/client/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/sw/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true }); })(); diff --git a/scripts/dev.js b/scripts/dev.js index 7a61070f5c..0d6a05fe20 100644 --- a/scripts/dev.js +++ b/scripts/dev.js @@ -1,45 +1,45 @@ -const execa = require('execa'); +const execa = require("execa"); (async () => { - await execa('pnpm', ['clean'], { - cwd: __dirname + '/../', + await execa("pnpm", ["clean"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['dlx', 'gulp', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["dlx", "gulp", "watch"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'backend', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "backend", "watch"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'client', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "client", "watch"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'sw', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "sw", "watch"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); const start = async () => { try { - await execa('pnpm', ['start'], { - cwd: __dirname + '/../', + await execa("pnpm", ["start"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); } catch (e) { - await new Promise(resolve => setTimeout(resolve, 3000)); + await new Promise((resolve) => setTimeout(resolve, 3000)); start(); } }; From d3c5c48537ac6263d96c398bc325aeef37ec4919 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 21:24:16 -0700 Subject: [PATCH 150/309] fix: :construction_worker: fix format run --- packages/calckey-js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/calckey-js/package.json b/packages/calckey-js/package.json index 105f2fda94..4e22794078 100644 --- a/packages/calckey-js/package.json +++ b/packages/calckey-js/package.json @@ -12,7 +12,7 @@ "api-prod": "pnpm api-extractor run --verbose", "api-doc": "pnpm api-documenter markdown -i ./etc/", "lint": "pnpm rome check --apply *.ts", - "format": "pnpm rome format --write '*' ; pnpm rome format --write '**/*.ts'", + "format": "pnpm rome format --write *.ts", "jest": "jest --coverage --detectOpenHandles", "test": "pnpm jest && pnpm tsd" }, From 301c79bb36ac428b631a7f6abab226ae1ee7db13 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 21:27:00 -0700 Subject: [PATCH 151/309] chore: :memo: too many emojis --- issue_template/bug.yaml | 22 +++++++++++----------- issue_template/feature.yaml | 10 +++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index e6aa388223..d0c80d7534 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -20,7 +20,7 @@ body: - type: textarea id: what-happened attributes: - label: 👀 What happened? + label: What happened? description: Please give us a brief description of what happened. placeholder: Tell us what you see! validations: @@ -28,7 +28,7 @@ body: - type: textarea id: what-is-expected attributes: - label: 🤔 What did you expect to happen? + label: What did you expect to happen? description: Please give us a brief description of what you expected to happen. placeholder: Tell us what you wish happened! validations: @@ -36,7 +36,7 @@ body: - type: input id: version attributes: - label: 📦 Version + label: Version description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. placeholder: v13.1.4.1 validations: @@ -44,7 +44,7 @@ body: - type: input id: instance attributes: - label: 🌐 Instance + label: Instance description: What instance of calckey are you using? placeholder: calckey.social validations: @@ -52,7 +52,7 @@ body: - type: dropdown id: issue-type attributes: - label: 📲 What type of issue is this? + label: What type of issue is this? description: If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. multiple: false options: @@ -62,7 +62,7 @@ body: - type: dropdown id: browsers attributes: - label: 🕸️ What browser are you using? (Client-side issues only) + label: What browser are you using? (Client-side issues only) multiple: false options: - N/A @@ -77,7 +77,7 @@ body: - type: dropdown id: device attributes: - label: 🖥️ What operating system are you using? (Client-side issues only) + label: What operating system are you using? (Client-side issues only) multiple: false options: - N/A @@ -90,7 +90,7 @@ body: - type: dropdown id: deplotment-method attributes: - label: 🚀 How do you deploy Calckey on your server? (Server-side issues only) + label: How do you deploy Calckey on your server? (Server-side issues only) multiple: false options: - N/A @@ -105,7 +105,7 @@ body: - type: dropdown id: operating-system attributes: - label: 🐧 What operating system are you using? (Server-side issues only) + label: What operating system are you using? (Server-side issues only) multiple: false options: - N/A @@ -121,13 +121,13 @@ body: - type: textarea id: logs attributes: - label: 📜 Relevant log output + label: Relevant log output description: Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks. render: shell - type: checkboxes id: terms attributes: - label: 🤝 Contribution Guidelines + label: Contribution Guidelines description: By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) options: - label: I agree to follow this project's Contribution Guidelines diff --git a/issue_template/feature.yaml b/issue_template/feature.yaml index 2cdcd4d81b..9797113276 100644 --- a/issue_template/feature.yaml +++ b/issue_template/feature.yaml @@ -20,7 +20,7 @@ body: - type: textarea id: what-feature attributes: - label: 🙋 What feature would you like implemented? + label: What feature would you like implemented? description: Please give us a brief description of what you'd like. placeholder: Tell us what you want! validations: @@ -28,7 +28,7 @@ body: - type: textarea id: why-add-feature attributes: - label: 🤔 Why should we add this feature? + label: Why should we add this feature? description: Please give us a brief description of why your feature is important. placeholder: Tell us why you want this feature! validations: @@ -36,7 +36,7 @@ body: - type: input id: version attributes: - label: 📦 Version + label: Version description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. placeholder: Calckey Version 13.1.4.1 validations: @@ -44,7 +44,7 @@ body: - type: input id: instance attributes: - label: 🌐 Instance + label: Instance description: What instance of calckey are you using? placeholder: calckey.social validations: @@ -52,7 +52,7 @@ body: - type: checkboxes id: terms attributes: - label: 🤝 Contribution Guidelines + label: Contribution Guidelines description: By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) options: - label: I agree to follow this project's Contribution Guidelines From 98a22d8d042d036daae29e8e74255effd9488654 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 21:41:52 -0700 Subject: [PATCH 152/309] docs: :memo: add symlink for api docs in docs/ --- docs/calckey-js.md | 1 + 1 file changed, 1 insertion(+) create mode 120000 docs/calckey-js.md diff --git a/docs/calckey-js.md b/docs/calckey-js.md new file mode 120000 index 0000000000..9fe8a018ee --- /dev/null +++ b/docs/calckey-js.md @@ -0,0 +1 @@ +../packages/calckey-js/markdown/calckey-js.md \ No newline at end of file From ff719634149717e7e1c2decd4b3ee146cac9660b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 21:48:49 -0700 Subject: [PATCH 153/309] =?UTF-8?q?docs:=20=F0=9F=93=9D=20use=20document?= =?UTF-8?q?=20instead=20of=20symlink?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/api-doc.md | 5 +++++ docs/calckey-js.md | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 docs/api-doc.md delete mode 120000 docs/calckey-js.md diff --git a/docs/api-doc.md b/docs/api-doc.md new file mode 100644 index 0000000000..4051144de1 --- /dev/null +++ b/docs/api-doc.md @@ -0,0 +1,5 @@ +# API Documentation + +You can find interactive API documentation at any Calckey instance. https://calckey.social/api-doc + +You can also find auto-generated documentation for calckey-js [here](../packages/calckey-js/markdown/calckey-js.md). diff --git a/docs/calckey-js.md b/docs/calckey-js.md deleted file mode 120000 index 9fe8a018ee..0000000000 --- a/docs/calckey-js.md +++ /dev/null @@ -1 +0,0 @@ -../packages/calckey-js/markdown/calckey-js.md \ No newline at end of file From 62efd07ca0911eda798740c24347ab9efc5da50e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 22:00:29 -0700 Subject: [PATCH 154/309] docs: :memo: document packages dir --- packages/README.md | 8 ++++++++ packages/calckey-js/package.json | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 packages/README.md diff --git a/packages/README.md b/packages/README.md new file mode 100644 index 0000000000..75a66b12f1 --- /dev/null +++ b/packages/README.md @@ -0,0 +1,8 @@ +# 📦 Packages + +This directory contains all of the packages Calckey uses. + +- `backend`: Server side code +- `client`: Web app +- `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) +- [`calckey-js`](https://www.npmjs.com/package/calckey-js): Global TypeScript SDK diff --git a/packages/calckey-js/package.json b/packages/calckey-js/package.json index 4e22794078..78d28ff085 100644 --- a/packages/calckey-js/package.json +++ b/packages/calckey-js/package.json @@ -1,6 +1,6 @@ { "name": "calckey-js", - "version": "0.0.23", + "version": "0.0.24", "description": "Calckey SDK for JavaScript", "main": "./built/index.js", "types": "./built/index.d.ts", @@ -18,7 +18,7 @@ }, "repository": { "type": "git", - "url": "https://codeberg.org/calckey/calckey.js" + "url": "https://codeberg.org/calckey/calckey.git" }, "devDependencies": { "@microsoft/api-extractor": "^7.36.0", From 6e364a857f1dc81564cc22d595f99f7af0491ee9 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 22:07:52 -0700 Subject: [PATCH 155/309] docs: :memo: clearer package docs --- packages/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/README.md b/packages/README.md index 75a66b12f1..7d7c03e0b5 100644 --- a/packages/README.md +++ b/packages/README.md @@ -2,7 +2,8 @@ This directory contains all of the packages Calckey uses. -- `backend`: Server side code -- `client`: Web app -- `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) -- [`calckey-js`](https://www.npmjs.com/package/calckey-js): Global TypeScript SDK +- `backend`: Main backend code written in TypeScript for NodeJS +- `backend/native-utils`: Backend code written in Rust, bound to NodeJS by [NAPI-RS](https://napi.rs/) +- `client`: Web interface written in Vue3 and TypeScript +- `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) written in TypeScript +- `calckey-js`: TypeScript SDK for both backend and client, also published on [NPM](https://www.npmjs.com/package/calckey-js) for public use From 18f88034bbae488a518f78517a47b26fdc5328d4 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 22:11:13 -0700 Subject: [PATCH 156/309] chore: :coffin: remove vim settings --- .vim/coc-settings.json | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .vim/coc-settings.json diff --git a/.vim/coc-settings.json b/.vim/coc-settings.json deleted file mode 100644 index 62b7b934b2..0000000000 --- a/.vim/coc-settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "eslint.packageManager": "pnpm", - "workspace.workspaceFolderCheckCwd": false -} From d110099e1cce6f7f9c2a448211b947b6e6757140 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 23 Jun 2023 22:21:37 -0700 Subject: [PATCH 157/309] chore: :arrow_up: up emojilib --- pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8abd0eefb4..0dbaf840fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -783,7 +783,7 @@ importers: version: 2.30.0 emojilib: specifier: github:thatonecalculator/emojilib - version: github.com/thatonecalculator/emojilib/34528ca3b7acd27da0d3fb38296ea244a7e86dd0 + version: github.com/thatonecalculator/emojilib/7036d98e86bcf88826f4559323aebebb1ffb0f61 escape-regexp: specifier: 0.0.1 version: 0.0.1 @@ -15757,8 +15757,8 @@ packages: url-polyfill: 1.1.12 dev: true - github.com/thatonecalculator/emojilib/34528ca3b7acd27da0d3fb38296ea244a7e86dd0: - resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/34528ca3b7acd27da0d3fb38296ea244a7e86dd0} + github.com/thatonecalculator/emojilib/7036d98e86bcf88826f4559323aebebb1ffb0f61: + resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/7036d98e86bcf88826f4559323aebebb1ffb0f61} name: emojilib version: 3.0.10 dev: true From fd6b655a7ce218989b4587c968df673dae4db41a Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@mx.kazuno.co> Date: Sat, 24 Jun 2023 03:59:27 -0400 Subject: [PATCH 158/309] fix compile error --- packages/backend/.swcrc | 26 +++++++++++----------- packages/backend/native-utils/package.json | 2 +- packages/calckey-js/.swcrc | 20 +++++++++++++++++ packages/calckey-js/package.json | 4 ++-- scripts/clean-all.js | 8 +++++++ scripts/clean.js | 5 +++++ 6 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 packages/calckey-js/.swcrc diff --git a/packages/backend/.swcrc b/packages/backend/.swcrc index 39e112ff7c..272d9f698c 100644 --- a/packages/backend/.swcrc +++ b/packages/backend/.swcrc @@ -1,15 +1,15 @@ { - "$schema": "https://json.schemastore.org/swcrc", - "jsc": { - "parser": { - "syntax": "typescript", - "dynamicImport": true, - "decorators": true - }, - "transform": { - "legacyDecorator": true, - "decoratorMetadata": true - }, + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "parser": { + "syntax": "typescript", + "dynamicImport": true, + "decorators": true + }, + "transform": { + "legacyDecorator": true, + "decoratorMetadata": true + }, "experimental": { "keepImportAssertions": true }, @@ -20,6 +20,6 @@ ] }, "target": "es2022" - }, - "minify": false + }, + "minify": false } diff --git a/packages/backend/native-utils/package.json b/packages/backend/native-utils/package.json index 432074f251..385330d776 100644 --- a/packages/backend/native-utils/package.json +++ b/packages/backend/native-utils/package.json @@ -36,7 +36,7 @@ "artifacts": "napi artifacts", "build": "pnpm run build:napi && pnpm run build:migration", "build:napi": "napi build --features napi --platform --release ./built/", - "build:migration": "cargo build --locked --release --manifest-path ./migration/Cargo.toml && cp -v ./target/release/migration ./built/migration", + "build:migration": "cargo build --locked --release --manifest-path ./migration/Cargo.toml && cp ./target/release/migration ./built/migration", "build:debug": "napi build --platform ./built/ && cargo build --manifest-path ./migration/Cargo.toml", "prepublishOnly": "napi prepublish -t npm", "test": "pnpm run cargo:test && pnpm run build:napi && ava", diff --git a/packages/calckey-js/.swcrc b/packages/calckey-js/.swcrc new file mode 100644 index 0000000000..508e597b5c --- /dev/null +++ b/packages/calckey-js/.swcrc @@ -0,0 +1,20 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "parser": { + "syntax": "typescript", + "dynamicImport": true, + "decorators": true + }, + "transform": { + "legacyDecorator": true, + "decoratorMetadata": true + }, + "target": "es2022" + }, + "minify": false, + "module": { + "type": "commonjs", + "strict": true + } +} diff --git a/packages/calckey-js/package.json b/packages/calckey-js/package.json index 78d28ff085..fdb253f454 100644 --- a/packages/calckey-js/package.json +++ b/packages/calckey-js/package.json @@ -5,9 +5,9 @@ "main": "./built/index.js", "types": "./built/index.d.ts", "scripts": { - "build": "pnpm swc src -d built -D && pnpm tsd", + "build": "pnpm swc src -d built -D", "render": "pnpm run build && pnpm run api && pnpm run api-prod && cp temp/calckey-js.api.json etc/ && pnpm run api-doc", - "tsd": "tsd", + "tsd": "tsc && tsd", "api": "pnpm api-extractor run --local --verbose", "api-prod": "pnpm api-extractor run --verbose", "api-doc": "pnpm api-documenter markdown -i ./etc/", diff --git a/scripts/clean-all.js b/scripts/clean-all.js index 8c1032e338..c5fc658499 100644 --- a/scripts/clean-all.js +++ b/scripts/clean-all.js @@ -38,6 +38,14 @@ const { join } = require("node:path"); recursive: true, force: true, }); + fs.rmSync(join(__dirname, "/../packages/calckey-js/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/calckey-js/node_modules"), { + recursive: true, + force: true, + }); fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true }); fs.rmSync(join(__dirname, "/../node_modules"), { diff --git a/scripts/clean.js b/scripts/clean.js index 76a7873b51..39cbc77b90 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -1,4 +1,5 @@ const fs = require("node:fs"); +const execa = require("execa"); const { join } = require("node:path"); (async () => { @@ -18,5 +19,9 @@ const { join } = require("node:path"); recursive: true, force: true, }); + fs.rmSync(join(__dirname, "/../packages/calckey-js/built"), { + recursive: true, + force: true, + }); fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true }); })(); From 77aa1f9b924a843ed2bbd02d4397ba6c88c01104 Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Fri, 23 Jun 2023 11:28:33 +0000 Subject: [PATCH 159/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1805 of 1805 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 2462cda2cf..9a0427042f 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -1668,9 +1668,9 @@ popout: Apareixa volume: Volum objectStorageUseSSLDesc: Desactiva això si no fas servir HTTPS per les connexions API -objectStorageUseProxy: Conectarse mitjançant un Proxy +objectStorageUseProxy: Connectar-se mitjançant un Proxy objectStorageUseProxyDesc: Desactiva això si no faràs servir un servidor Proxy per - conexions API + conexions amb l'API objectStorageSetPublicRead: Fixar com a "public-read" al pujar serverLogs: Registres del servidor deleteAll: Esborrar tot @@ -2131,3 +2131,4 @@ _dialog: {max}" charactersBelow: 'No hi ha caràcters suficients! Corrent: {current}/Limit: {min}' removeReaction: Elimina la teva reacció +reactionPickerSkinTone: To de pell d'emoji preferit From eff50abf3d027ee4cdedcc2129c6f23dd25a52e6 Mon Sep 17 00:00:00 2001 From: Freeplay <freeplay@duck.com> Date: Sat, 24 Jun 2023 10:20:00 -0400 Subject: [PATCH 160/309] fix: jump to top of page when opening modals I want to do this probably later, for now it will still focus inside the window when pressing tab --- packages/client/src/components/MkModal.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue index 890ab9076c..ee030f3906 100644 --- a/packages/client/src/components/MkModal.vue +++ b/packages/client/src/components/MkModal.vue @@ -66,8 +66,6 @@ ]" :style="{ zIndex }" @click.self="onBgClick" - v-focus - tabindex="-1" > <slot :max-height="maxHeight" :type="type"></slot> </div> From ac768ece132fbf3f745d304563643a3422270fac Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 11:43:37 -0700 Subject: [PATCH 161/309] fix: :alembic: ensure splash is removed upon load https://codeberg.org/calckey/calckey/pulls/10285#issuecomment-951231 --- packages/client/src/init.ts | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts index 5d9ae12f36..9593be829a 100644 --- a/packages/client/src/init.ts +++ b/packages/client/src/init.ts @@ -12,8 +12,9 @@ import "@phosphor-icons/web/fill"; //#region account indexedDB migration import { set } from "@/scripts/idb-proxy"; -if (localStorage.getItem("accounts") != null) { - set("accounts", JSON.parse(localStorage.getItem("accounts"))); +const accounts = localStorage.getItem("accounts") +if (accounts) { + set("accounts", JSON.parse(accounts)); localStorage.removeItem("accounts"); } //#endregion @@ -50,6 +51,18 @@ import { reactionPicker } from "@/scripts/reaction-picker"; import { getUrlWithoutLoginId } from "@/scripts/login-id"; import { getAccountFromId } from "@/scripts/get-account-from-id"; +function checkForSplash() { + const splash = document.getElementById("splash"); + // 念のためnullチェック(HTMLが古い場合があるため(そのうち消す)) + if (splash) { + splash.style.opacity = "0"; + splash.style.pointerEvents = "none"; + splash.addEventListener("transitionend", () => { + splash.remove(); + }); + } +} + (async () => { console.info(`Calckey v${version}`); @@ -105,7 +118,7 @@ import { getAccountFromId } from "@/scripts/get-account-from-id"; //#region Set lang attr const html = document.documentElement; - html.setAttribute("lang", lang); + html.setAttribute("lang", lang || "en-US"); //#endregion //#region loginId @@ -198,12 +211,7 @@ import { getAccountFromId } from "@/scripts/get-account-from-id"; directives(app); components(app); - const splash = document.getElementById("splash"); - // 念のためnullチェック(HTMLが古い場合があるため(そのうち消す)) - if (splash) - splash.addEventListener("transitionend", () => { - splash.remove(); - }); + checkForSplash(); // https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 // なぜかinit.tsの内容が2回実行されることがあるため、mountするdivを1つに制限する @@ -231,10 +239,7 @@ import { getAccountFromId } from "@/scripts/get-account-from-id"; reactionPicker.init(); - if (splash) { - splash.style.opacity = "0"; - splash.style.pointerEvents = "none"; - } + checkForSplash(); // クライアントが更新されたか? const lastVersion = localStorage.getItem("lastVersion"); From 08df1d9d44d873c95da630f3e358ce2a2af0ee63 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sat, 24 Jun 2023 15:02:54 -0400 Subject: [PATCH 162/309] fix: focus first element inside modal --- packages/client/src/components/MkModal.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue index c65cc0fdcd..d48b6cbc54 100644 --- a/packages/client/src/components/MkModal.vue +++ b/packages/client/src/components/MkModal.vue @@ -381,6 +381,8 @@ onMounted(() => { { immediate: true } ); + content.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')?.focus(); + nextTick(() => { new ResizeObserver((entries, observer) => { align(); From 15e8db05635a7f34c590c24a83b4c4e822dc241b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 13:00:50 -0700 Subject: [PATCH 163/309] feat: :lock: expand /api/v1/instance/peers to proper endpoint and check for private mode Closes #10358 --- .../backend/src/server/api/compatibility.ts | 10 +++++--- .../api/endpoints/compatibility/peers.ts | 25 +++++++++++++++++++ packages/backend/src/server/api/index.ts | 15 ++--------- 3 files changed, 33 insertions(+), 17 deletions(-) create mode 100644 packages/backend/src/server/api/endpoints/compatibility/peers.ts diff --git a/packages/backend/src/server/api/compatibility.ts b/packages/backend/src/server/api/compatibility.ts index 7e44fa8b2e..42be40e104 100644 --- a/packages/backend/src/server/api/compatibility.ts +++ b/packages/backend/src/server/api/compatibility.ts @@ -1,11 +1,13 @@ import type { IEndpoint } from "./endpoints"; -import * as cp___instanceInfo from "./endpoints/compatibility/instance-info.js"; -import * as cp___customEmojis from "./endpoints/compatibility/custom-emojis.js"; +import * as cp___instance_info from "./endpoints/compatibility/instance-info.js"; +import * as cp___custom_emojis from "./endpoints/compatibility/custom-emojis.js"; +import * as ep___instance_peers from "./endpoints/compatibility/peers.js"; const cps = [ - ["v1/instance", cp___instanceInfo], - ["v1/custom_emojis", cp___customEmojis], + ["v1/instance", cp___instance_info], + ["v1/custom_emojis", cp___custom_emojis], + ["v1/instance/peers", ep___instance_peers], ]; const compatibility: IEndpoint[] = cps.map(([name, cp]) => { diff --git a/packages/backend/src/server/api/endpoints/compatibility/peers.ts b/packages/backend/src/server/api/endpoints/compatibility/peers.ts new file mode 100644 index 0000000000..30f6e0e937 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/compatibility/peers.ts @@ -0,0 +1,25 @@ +import { Instances } from "@/models/index.js"; +import define from "../../define.js"; + +export const meta = { + tags: ["meta"], + requireCredential: false, + requireCredentialPrivateMode: true, + allowGet: true, + cacheSec: 60, +} as const; + +export const paramDef = { + type: "object", +} as const; + +export default define(meta, paramDef, async (ps) => { + const instances = await Instances.find({ + select: ["host"], + where: { + isSuspended: false, + }, + }); + + return instances.map((instance) => instance.host); +}); diff --git a/packages/backend/src/server/api/index.ts b/packages/backend/src/server/api/index.ts index 3568a27b25..29cfbf93c0 100644 --- a/packages/backend/src/server/api/index.ts +++ b/packages/backend/src/server/api/index.ts @@ -87,7 +87,7 @@ mastoFileRouter.post("/v1/media", upload.single("file"), async (ctx) => { const accessTokens = ctx.headers.authorization; const client = getClient(BASE_URL, accessTokens); try { - let multipartData = await ctx.file; + const multipartData = await ctx.file; if (!multipartData) { ctx.body = { error: "No image" }; ctx.status = 401; @@ -106,7 +106,7 @@ mastoFileRouter.post("/v2/media", upload.single("file"), async (ctx) => { const accessTokens = ctx.headers.authorization; const client = getClient(BASE_URL, accessTokens); try { - let multipartData = await ctx.file; + const multipartData = await ctx.file; if (!multipartData) { ctx.body = { error: "No image" }; ctx.status = 401; @@ -185,17 +185,6 @@ router.use(discord.routes()); router.use(github.routes()); router.use(twitter.routes()); -router.get("/v1/instance/peers", async (ctx) => { - const instances = await Instances.find({ - select: ["host"], - where: { - isSuspended: false, - }, - }); - - ctx.body = instances.map((instance) => instance.host); -}); - router.post("/miauth/:session/check", async (ctx) => { const token = await AccessTokens.findOneBy({ session: ctx.params.session, From 4a3bcbeb5ee251a089a78f1781ba72a47f900b6a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 13:23:12 -0700 Subject: [PATCH 164/309] docs: :memo: mention libvips requirement #10352 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 04010e89a8..f66d14a324 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,7 @@ If you have access to a server that supports one of the sources below, I recomme - 🍀 Nginx (recommended) - 🦦 Caddy - 🪶 Apache +- ⚡ [libvips](https://www.libvips.org/) ### 😗 Optional dependencies From ae14da7014b39895e52980d73b01e714f9527577 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 13:25:25 -0700 Subject: [PATCH 165/309] fix: :adhesive_bandage: make cacheRemoteFiles false by default for new instances --- packages/backend/migration/1000000000000-Init.js | 2 +- packages/backend/src/models/entities/meta.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/migration/1000000000000-Init.js b/packages/backend/migration/1000000000000-Init.js index d32a6e0d25..bab5fae7a0 100644 --- a/packages/backend/migration/1000000000000-Init.js +++ b/packages/backend/migration/1000000000000-Init.js @@ -220,7 +220,7 @@ export class Init1000000000000 { `CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON "notification" ("notifieeId") `, ); await queryRunner.query( - `CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/static-assets/badges/info.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT '/static-assets/badges/error.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT true, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`, + `CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/static-assets/badges/info.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT '/static-assets/badges/error.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT false, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`, ); await queryRunner.query( `CREATE TABLE "following" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_c76c6e044bdf76ecf8bfb82a645" PRIMARY KEY ("id"))`, diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index b22c6510fa..dd3c5b3b72 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -198,7 +198,7 @@ export class Meta { public iconUrl: string | null; @Column("boolean", { - default: true, + default: false, }) public cacheRemoteFiles: boolean; From ce53288bf0758c78d5f181e10a9443a083804ee7 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sat, 24 Jun 2023 16:35:56 -0400 Subject: [PATCH 166/309] fix: basically just undo my previous modal changes --- packages/client/src/components/MkMenu.vue | 1 - packages/client/src/components/MkModal.vue | 12 ++- .../client/src/components/MkModalWindow.vue | 100 +++++++++--------- 3 files changed, 59 insertions(+), 54 deletions(-) diff --git a/packages/client/src/components/MkMenu.vue b/packages/client/src/components/MkMenu.vue index 5f0210c1f6..2d8fde610b 100644 --- a/packages/client/src/components/MkMenu.vue +++ b/packages/client/src/components/MkMenu.vue @@ -3,7 +3,6 @@ ref="focusTrap" v-model:active="isActive" :return-focus-on-deactivate="!noReturnFocus" - :initial-focus="() => itemsEl.children[0]" @deactivate="emit('close')" > <div> diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue index d48b6cbc54..e814c91e5b 100644 --- a/packages/client/src/components/MkModal.vue +++ b/packages/client/src/components/MkModal.vue @@ -14,16 +14,17 @@ :duration="transitionDuration" appear @after-leave="emit('closed')" + @keyup.esc="emit('click')" @enter="emit('opening')" @after-enter="onOpened" > <FocusTrap v-model:active="isActive" - :return-focus-on-deactivate="false" - @deactivate="close" + :return-focus-on-deactivate="!noReturnFocus" > <div v-show="manualShowing != null ? manualShowing : showing" + v-hotkey.global="keymap" :class="[ $style.root, { @@ -43,6 +44,7 @@ '--transformOrigin': transformOrigin, }" tabindex="-1" + v-focus > <div class="_modalBg data-cy-bg" @@ -206,6 +208,10 @@ if (type === "drawer") { maxHeight = window.innerHeight / 1.5; } +const keymap = { + esc: () => emit("esc"), +}; + const MARGIN = 16; const align = () => { @@ -381,8 +387,6 @@ onMounted(() => { { immediate: true } ); - content.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')?.focus(); - nextTick(() => { new ResizeObserver((entries, observer) => { align(); diff --git a/packages/client/src/components/MkModalWindow.vue b/packages/client/src/components/MkModalWindow.vue index d947803dd6..740f84d6b0 100644 --- a/packages/client/src/components/MkModalWindow.vue +++ b/packages/client/src/components/MkModalWindow.vue @@ -6,56 +6,58 @@ @keyup.esc="$emit('close')" @closed="$emit('closed')" > - <div - ref="rootEl" - class="ebkgoccj" - :style="{ - width: `${props.width}px`, - height: scroll - ? height - ? `${props.height}px` - : null - : height - ? `min(${props.height}px, 100%)` - : '100%', - }" - tabindex="-1" - > - <div ref="headerEl" class="header"> - <button - v-if="props.withOkButton" - :aria-label="i18n.t('close')" - class="_button" - @click="$emit('close')" - v-tooltip="i18n.ts.close" - > - <i class="ph-x ph-bold ph-lg"></i> - </button> - <span class="title"> - <slot name="header"></slot> - </span> - <button - v-if="!props.withOkButton" - :aria-label="i18n.t('close')" - class="_button" - @click="$emit('close')" - > - <i class="ph-x ph-bold ph-lg"></i> - </button> - <button - v-if="props.withOkButton" - :aria-label="i18n.t('ok')" - class="_button" - :disabled="props.okButtonDisabled" - @click="$emit('ok')" - > - <i class="ph-check ph-bold ph-lg"></i> - </button> + <FocusTrap v-model:active="isActive"> + <div + ref="rootEl" + class="ebkgoccj" + :style="{ + width: `${props.width}px`, + height: scroll + ? height + ? `${props.height}px` + : null + : height + ? `min(${props.height}px, 100%)` + : '100%', + }" + tabindex="-1" + > + <div ref="headerEl" class="header"> + <button + v-if="props.withOkButton" + :aria-label="i18n.t('close')" + class="_button" + @click="$emit('close')" + v-tooltip="i18n.ts.close" + > + <i class="ph-x ph-bold ph-lg"></i> + </button> + <span class="title"> + <slot name="header"></slot> + </span> + <button + v-if="!props.withOkButton" + :aria-label="i18n.t('close')" + class="_button" + @click="$emit('close')" + > + <i class="ph-x ph-bold ph-lg"></i> + </button> + <button + v-if="props.withOkButton" + :aria-label="i18n.t('ok')" + class="_button" + :disabled="props.okButtonDisabled" + @click="$emit('ok')" + > + <i class="ph-check ph-bold ph-lg"></i> + </button> + </div> + <div class="body"> + <slot></slot> + </div> </div> - <div class="body"> - <slot></slot> - </div> - </div> + </FocusTrap> </MkModal> </template> From 65d0e8f68396bc5afd0841c4c2310f3a082340b7 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sat, 24 Jun 2023 12:58:26 +0900 Subject: [PATCH 167/309] enhance(frontend): improve ux of deck scroll --- packages/client/src/ui/deck.vue | 20 ++++++++++---------- packages/client/src/ui/deck/column.vue | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index 6da6ad506d..270a92a5ee 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -9,6 +9,7 @@ class="columns" :class="deckStore.reactiveState.columnAlign.value" @contextmenu.self.prevent="onContextmenu" + @wheel.self="onWheel" > <template v-for="ids in layout"> <!-- sectionを利用しているのは、deck.vue側でcolumnに対してfirst-of-typeを効かせるため --> @@ -31,6 +32,7 @@ ) + 'px', } " + @wheel.self="onWheel" > <DeckColumnCore v-for="id in ids" @@ -50,6 +52,7 @@ :is-stacked="false" :style="columns.find(c => c.id === ids[0])!.flexible ? { flex: 1, minWidth: '350px' } : { width: columns.find(c => c.id === ids[0])!.width + 'px' }" @parent-focus="moveFocus(ids[0], $event)" + @headerWheel="onWheel" /> </template> <div v-if="layout.length === 0" class="intro _panel"> @@ -279,18 +282,15 @@ const onContextmenu = (ev) => { ); }; -document.documentElement.style.overflowY = "hidden"; -document.documentElement.style.scrollBehavior = "auto"; -window.addEventListener("wheel", (ev) => { - if (ev.target === columnsEl && ev.deltaX === 0) { - columnsEl.scrollLeft += ev.deltaY; - } else if ( - getScrollContainer(ev.target as HTMLElement) == null && - ev.deltaX === 0 - ) { +function onWheel(ev: WheelEvent) { + if (ev.deltaX === 0) { columnsEl.scrollLeft += ev.deltaY; } -}); +} + +document.documentElement.style.overflowY = "hidden"; +document.documentElement.style.scrollBehavior = "auto"; + loadDeck(); function moveFocus(id: string, direction: "up" | "down" | "left" | "right") { diff --git a/packages/client/src/ui/deck/column.vue b/packages/client/src/ui/deck/column.vue index 03859abc0a..dcf94b31a7 100644 --- a/packages/client/src/ui/deck/column.vue +++ b/packages/client/src/ui/deck/column.vue @@ -23,6 +23,7 @@ @dragstart="onDragstart" @dragend="onDragend" @contextmenu.prevent.stop="onContextmenu" + @wheel="emit('headerWheel', $event)" > <button v-if="isStacked && !isMainColumn" @@ -95,6 +96,7 @@ const props = withDefaults( const emit = defineEmits<{ (ev: "parent-focus", direction: "up" | "down" | "left" | "right"): void; (ev: "change-active-state", v: boolean): void; + (ev: "headerWheel", ctx: WheelEvent): void; }>(); let body = $ref<HTMLDivElement>(); From b13cc20a6ab320a8cb6ea01c5ca38a9ad829ea14 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 15:16:27 -0700 Subject: [PATCH 168/309] feat: :bookmark: v14.0.0-rc3 --- CHANGELOG.md | 2671 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 1762 insertions(+), 909 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af69478734..001e0ed1d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,296 +2,579 @@ All changes from v13.0.0 onwards, for a full list of differences read CALCKEY.md +## [14.0.0-rc3] - 2023-06-24 + +### Bug Fixes + +- Fix: editing caption accuracy + +- Fix: only show meili in metrics if available + +- Fix server metric iteration + +- Fix inbox stall + +- Fixes #10284, fixes #10208; passing in all pugVariables needed in base.pug, fixes csp + +- Fix: unread message bgcolor + +- Fix boost mutes + +- Fix search features + +- Fix: :bug: properly enter date + +- Fix back button display + +- Fix: "24"th hour doesn't exist, it's 0 + +- Fix: :adhesive_bandage: YYYYMMDD with dashes + +- Fix: :rotating_light: fix unused import + +- Fix: :adhesive_bandage: day isn't decreased by 1 + +- Fix: 🚸 make "show replies in timeline" work as expected + +Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> + +- Fix: :ambulance: fix stream.ts + +- Fix: :bug: sonic logged connection despite not existing + +- Fix: :ambulance: fix switch import + +- Fix: :lipstick: fix sign-in 2fa token style + +- Fix: :bug: 2FA dialog + +- Fix: :bug: use correct 2fa value + +- Fix: :adhesive_bandage: convert numeric input to string + +- Fix aode-relay compatibility + +- Fix: :bug: display punishments on desktop + +- Fix user preview menu color + +- Fix: :lipstick: white foreground on forced black background + +Remedies the problem introduced by 020c4f578827e2391b35cd102ee197cc037c0382 causing black text to appear over a black-ish background + +- Fix: :globe_with_meridians: correct "clear" + +- Fix: 🐛 don't allow editing a post on another account + +- Fix: 🐛 when editing polls, keep votes for unmodified choices + +- Fix: :bug: properly index edited post + +- Fix: :adhesive_bandage: duplicate update + +- Fix: :lipstick: badge style on mobile + +- Fix UI sometimes being offset on mobile + +- Fix: 🐛 empty fs stat + +- Fix build and clean scripts + +- Fix: :bug: only collapsed reply if notification is reply + +- Fix: 🐛 proper isDuplicateKeyValueError handling + +Closes #10340 +Co-authored-by: Kainoa Kanter <kainoa@t1c.dev> + +- Fix: :bug: collapse reply if type is a mention and it has a reply + +- Fix: :pencil2: typo in API docs + errors + +Co-authored-by: naskya <m@naskya.net> + +- Fix: hide tooltip on page change + +- Fix: don't use cache on autocomplete for now + +- Fix: :lipstick: consistent emoji styling + +- Fix: :adhesive_bandage: disable Unicode 15 emojis + +https://github.com/jdecked/twemoji/pull/43 + +- Fix: :bug: pull up instance window instead of search field + +- Fix: autocomplete not being focused properly + +- Fix: mobile note spacing + +- Fix: 🐛 race condition between workers when creating note + +Closes #10345 +Discovered here: https://codeberg.org/calckey/calckey/issues/10345#issuecomment-950475 + +- Fix: :bug: non-duplicate skin tone selection + +- Fix: :ambulance: disable lightningcss transformer for now + +- Fix: :arrow_down: downgrade chalk + +- Fix: :bug: start transaction with multi + +- Fix: :bug: remove cw in post edit + +Closes #10353 + +- Fix: :construction_worker: fix format run + +- Fix compile error + +- Fix: jump to top of page when opening modals + +I want to do this probably later, for now it will still focus inside the window when pressing tab + +- Fix: :alembic: ensure splash is removed upon load + +https://codeberg.org/calckey/calckey/pulls/10285#issuecomment-951231 + +- Fix: focus first element inside modal + +- Fix: :adhesive_bandage: make cacheRemoteFiles false by default for new instances + +- Fix: basically just undo my previous modal changes + + +### Documentation + +- Docs: 📝 tips + +- Docs: 📝 changelog + +- Docs: :memo: rudamentary sea-orm-cli instructions + +- Docs: :memo: sea orm migration "Setting Up Migration" doc link + +- Docs: 📝 fix formatting + +- Docs: :memo: min rust ver + +- Docs: :memo: changelog + +- Docs: :memo: update links + +- Docs: :memo: changelog + +- Docs: :memo: API documentation generation + +- Docs: :memo: add symlink for api docs in docs/ + +- Docs: 📝 use document instead of symlink + +- Docs: :memo: document packages dir + +- Docs: :memo: clearer package docs + +- Docs: :memo: mention libvips requirement + +#10352 + + +### Features + +- Feat: ✨ searchFilters meta property + +- Feat: ✨ patron labels + +- Feat: channel column in deck view + +- Feat: :sparkles: delay function in animated MFM + +- Feat: :monocle_face: bring back misskey's moderation displays on profile + +- Feat: 🔒 Improve 2FA/keypass experience + +Co-authored-by: Tamania <tamaina@hotmail.co.jp> +Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> + +- Feat: :lipstick: button icons for security + +- Feat: :sparkles: 2FA input dialog + +- Add comments + +- Add faded edges to swiper + shadows :3 + +- Add refresh button to poll + +- Add environment variable + +- Feat: :sparkles: display remaining time on ratelimits + +- Feat: :sparkles: $[small ] and $[center ] MFM syntax + +- Feat: :sparkles: clickable domains on job queue + +https://post.naskya.net/notes/9gbfos2mv5iz6g63 + +- Feat: :sparkles: emoji skin tone + +Closes #9959 + +- Feat: :sparkles: skin tone selector in category + +- Feat: :lock: expand /api/v1/instance/peers to proper endpoint and check for private mode + +Closes #10358 + + +### Miscellaneous Tasks + +- Chore: update patrons + +- Chore: lint sw + +- Chore: update patrons + +- Chore: update patrons + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1770 of 1770 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1770 of 1770 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Chore: update patrons + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1772 of 1772 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Update cheat sheet with delay + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1777 of 1777 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Polish) + +Currently translated at 96.4% (1714 of 1777 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Translated using Weblate (Italian) + +Currently translated at 71.0% (1262 of 1777 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/it/ + +- Chore: formatting + +- Chore: formatting + +- Chore: format + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1787 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 97.4% (1741 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 97.4% (1741 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: formatting + +- Chore: :passport_control: improve gitea templates + +- Chore: :passport_control: conventional commits in body, not checkbox + +- Chore: :arrow_up: up pnpm + +- Chore: Added translation using Weblate (Portuguese (Brazil)) + +- Chore: Translated using Weblate (German) + +Currently translated at 98.6% (1762 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (Portuguese (Brazil)) + +Currently translated at 0.6% (12 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pt_BR/ + +- Chore: :art: format + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1787 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Translated using Weblate (Chinese (Traditional)) + +Currently translated at 95.6% (1709 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1803 of 1803 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Portuguese (Brazil)) + +Currently translated at 4.4% (81 of 1803 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pt_BR/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1804 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Polish) + +Currently translated at 95.1% (1716 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1804 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 99.2% (1791 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Update to node 20 + +- Chore: format + +- Chore: Translated using Weblate (Italian) + +Currently translated at 69.9% (1262 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/it/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: :art: format + +- Chore: :bookmark: dev52 + +- Chore: :art: format + +- Chore: update bug report template + +- Chore: :memo: links in bug template + +- Chore: :memo: bring bug template changes to feature template + +- Chore: :memo: deployment method in bug report + +- Chore: :memo: fix duplicate, add emojis + +- Chore: :memo: add emojis to issue templates + +Because everything's better with emojis! + +- Chore: :memo: emojis in issue label + +- Chore: :art: format + +- Chore: :memo: too many emojis + +- Chore: :coffin: remove vim settings + +- Chore: :arrow_up: up emojilib + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1805 of 1805 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + + +### Performance + +- Perf: limit number of antennas + +- Perf: set patrons in redis + +- Perf: use charts data for stats endpoint + +- Perf: ⚡ update emojis, cache in IndexedDb + +Closes #9959 +May fix #9724 + +- Perf: ⚡ use setInterval instead of setTimeout chain in MkTime + + +### Refactor + +- Refactor: client assets + +- Refactor: client assets + +- Refactor: :coffin: remove old db calls, add todo + +- Refactor: :recycle: import from @/db + +- Refactor: 💄 reverse pie chart color on indexing + +Co-authored-by: PrivateGER <privateger@codeberg.org> + +- Refactor: :recycle: use parent/child selector for attachment + +- Refactor: :lipstick: style punishments + +- Refactor: :arrow_up: use custom version of vue3-otp-input + +This enables the use of number inputs without the slider + +- Refactor: :safety_vest: replace js-yaml with yaml + +Technically mitigates CVE-2023-2251, but users never input YAML to Calckey. Still, this does no harm, and it's a good idea to keep dependencies like these up-to-date, as js-yaml was last updated 2 years ago. + +- Refactor: :coffin: unused import + +- Refactor: :art: locale loader + +- Refactor: :recycle: better edited timestamp display + +- Refactor: :recycle: reorganize note menu + +translate just above view remote + +- Refactor: ♻️ open instance as lookup window + +- Refactor: :pushpin: use own emoji descriptions + +- Refactor: :recycle: refactor MkModalWindow for TS safety + +- Refactor: :recycle: simplify null check + +- Refactor: :recycle: make skin tones modular + +Could possibly be for future custom emoji sets that support custom skin tones? (i.e. Mutant Standard) + +- Refactor: :recycle: url preview + +- Refactor: :label: add antenna type to streaming types + + +### Styling + +- Style: 💄 full follow button for userinfo in userlist + +- Style: :lipstick: margin on user card follow btn + +- Style: :lipstick: 2fa dialog styling + + ## [14.0.0-rc2c] - 2023-06-06 ### Bug Fixes - Fix: post editing meta -- Fix: cw button position + + +### Miscellaneous Tasks + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1753 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + + +## [14.0.0-rc2b] - 2023-06-06 + +## [14.0.0-rc2a] - 2023-06-06 + +### Bug Fixes + +- Fix cw button pos... oops + ### Miscellaneous Tasks - Update cargo.lock -## [14.0.0-rc2] - 2023-06-05 + +## [14.0.0-rc2] - 2023-06-06 ### Bug Fixes -- Fix deck view margins - -- Fix: Parse mastoAPI `limit` argument in more places & Improve converting arguments to boolean ([#9716](https://github.com/orhun/git-cliff/issues/9716)) - -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9716 -Authored-by: fruye <fruye@unix.dog> -Signed-off-by: Cleo John <waterdev@galaxycrow.de> -Co-authored-by: fruye <fruye@unix.dog> -Co-committed-by: fruye <fruye@unix.dog> - -- Fix: send button - -- Fix: intermediarily convert ids - -- Fix: mobile button alignment - -- Fix: when count is actually 0 - -- Fix cli more - -- Fix: don't show smartphone UI when settings icon is double-clicked - -- Fix: unicode aliases - -- Fix: repo url - -- Fix: :bug: can't send blank messages - -Closes #9661 - -- Fix: make sure cw button is on new line - -- Fix: local time for users - -- Fix: max user profile length to db field length - -Resolves: #9749 - -- Fix: :bug: no nyaizing undefined text - -Closes #9752 - -- Fix: a bug in ads - -- Fix color in follow button - -- Fix: relay signature handling - -A change sometime ago moved to setting some signature fields in the incoming -object to undefined as opposed to deleting them. The trouble is that downstream -code checks against existence, not undefinedness and rejects the message. - -Resolves: #9665 - -- Fix - -- Fix - -- Fix callback url - -- Fix japanese locale - -- Fix? - -- Fix: allow announces with followers visibility - -- Fix: :bug: formlink -> button - -fixes notifications and drive in settings - -- Fix sounds settings - -- Fix doc link - -- Fix: direct boost ([#9783](https://github.com/orhun/git-cliff/issues/9783)) - -Sorry to create PR multiple times. I should have included this in #9778. - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9783 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Fix: don't nyaize quoted text - -- Fix: don't nyaize quoted text ([#9791](https://github.com/orhun/git-cliff/issues/9791)) - -- Fix search import - -- Fix migration - -- Fix: :bug: make recently used group - -Closes #9784 - -- Fix: add cargo to DOCKERFILE - -- Fix #9784 - -- Fix help button alignment iconsOnly - -- Fix indexing description - -- Fix: :passport_control: no longer need 2fa for webauthn - -- Fix import - -- Fix button alignments - -- Fix: dialogs not coming up - -- Fix: dockerfile - -- Fix: add copy for build from native-utils - -- Fix: changing passwords, 2fa, and password resets. - -The argon2 usage was only implemented for sign-ins which broke a bunch of other -endpoints and features. - -- Fix: buttons not showing - -- Fix: :bug: go to last timeline selected - -- Fix: toggling the blocking state from the instance-info admin view ([#9809](https://github.com/orhun/git-cliff/issues/9809)) - -Because the admin meta information was never loaded on this page, no amount of toggling the block or suspend sliders on the instance-info page (e.g. `https://calckey.example.com/instance-info/instance.tld`) will result in the instance actually being added to the blocklist. You could still do it from the bulk blocklist management page, but that can get unwieldy quickly if you just want to do a quick block of an instance. - -Co-authored-by: amy bones <amy@spookygirl.boo> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9809 -Co-authored-by: amybones <amybones@noreply.codeberg.org> -Co-committed-by: amybones <amybones@noreply.codeberg.org> - -- Fix - -- Fix(client): userpage ui ([#9179](https://github.com/orhun/git-cliff/issues/9179)) - -* fix(unverified): clip pages ui - -* fix(unverified): user page width - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -- Fix id of move activity - -- Fix move inbox - -- Fix: format script; chore: format - -- Fix: typo - -- Fix - -- Fix chat metadata - -- Fix lookup instance - -- Fix: :lock: don't show notes with CW on welcome screen - -Closes #9849 - -- Prevent crashes due to timezone === null - -- Fix a bug - -- Fix: disable "Search" keyword ([#9856](https://github.com/orhun/git-cliff/issues/9856)) - -Related: #9816 #9830 -I was so careless that I didn't know "Search" was also a keyword. I disabled that and fixed a minor bug. - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9856 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Fix - -- Fix tag on explore - -- Fix header tabs - -- Fix: ドライブアップロードで413が返ってきたときにエラーメッセージを表示 ([#10680](https://github.com/orhun/git-cliff/issues/10680)) - -- Fix: boost muting in the recommended timeline ([#9906](https://github.com/orhun/git-cliff/issues/9906)) - -Closes: #9905 -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9906 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Fix an instance ticker bug - -- Fix: add route - -- Fix? - -- Fix: style email with inline styles - -- Fix disabled, formatting - -- Fix: Make statusModel `created_at` fields be ISO 8601 strings - -This makes the 'Reactions to this post' status (seen when viewing -a status context) send the correct data type for `created_at` fields. - -https://docs.joinmastodon.org/entities/Account/#created_at -https://docs.joinmastodon.org/entities/Status/#created_at - -- Fix: Get list titles from Form data when creating and updating lists - -This change will actually make it possible for Mastodon clients to -create and rename lists, as they send the title in a Form data instead -of a query string. - -https://docs.joinmastodon.org/methods/lists/#form-data-parameters - -- Fix: Declare /api/v1/accounts/relationships before /api/v1/accounts/:id - -Previously the 'relationships' part was considered to be an account id -and was handled by completely different API endpoint. - -- Fixes - -- Fixes? - -- Fix subnote - -- Fix - -- Fix: centering block math ([#9946](https://github.com/orhun/git-cliff/issues/9946)) - -Similar to `inlineCode` and `blockCode`, MFM provides two types of formula syntax, `mathInline` and `mathBlock` (I'm curious why these aren't called `inlineMath`/`blockMath`, but oh well) - -Other platforms, like GitHub, **Math**todon, my blog, etc., also support these two types of formula representation, and math blocks are centered on (maybe) all such platforms. - - - -But Calckey (Misskey v12) don't center math blocks. I'd say this is a bug, and this makes `blockMath` useless (it's just `inlineMath` in a new line). - - - -So I fixed this. - - - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9946 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- BlockMath is not necessarily multi-line (is this copy-pasted from blockCode?) - -- Fix poll voting causing edit revisions. - -- Fix(ap): Use unique identifier for each follow request - -Closes #9677 - -Co-authored-by: GitHub <hutchisr> - -- Fix meta fetch - -- Fix params - -- Fix email validation - -- Fix: Commit CI not running because cargo is not installed - -- Fix: Switch to node alpine image - -- Fix db migration - -- Fix lang - - Fix translation box - Fix: correctly display links to self instance URL @@ -511,26 +794,6 @@ https://calckey.aokaga.work/notes/9f6ksv2oov ### Documentation -- Docs: changes - -- Docs: 📝 sonic instructions - -- Docs: 📝 sonic - -- Docs: sonic - -- Docs: add note about reverse migration - -- Docs: hyperlink foundkey commits - -- Docs: hyperlink foundkey commits - -- Docs: rm yunohost - -has been broken for months, I don't maintain it either. - -- Docs - - Docs: links - Docs: 📝 pm2 logrotate @@ -564,215 +827,6 @@ has been broken for months, I don't maintain it either. ### Features -- Feat: Make follower counts for remote users correct ([#9705](https://github.com/orhun/git-cliff/issues/9705)) - -#9293 - -Not sure if this is the right approach for this - -Co-authored-by: s1idewhist1e <trombonedude05@gmail.com> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9705 -Co-authored-by: s1idewhist1e <s1idewhist1e@noreply.codeberg.org> -Co-committed-by: s1idewhist1e <s1idewhist1e@noreply.codeberg.org> - -- Add 404 as replacements - -- Feat: set license information for custom emojis ([#9719](https://github.com/orhun/git-cliff/issues/9719)) - -Closes: #9711 (please check this issue first) - -I cherry-picked two commits ([1](https://github.com/misskey-dev/misskey/commit/8ae9d2eaa8b0842671558370f787902e94b7f5a3), [2](https://github.com/misskey-dev/misskey/commit/ed51209172441927d24339f0759a5badbee3c9b6)) from [Misskey](https://github.com/misskey-dev/misskey) and made a few changes. -「ライセンス」should be written as "License" in the following screenshots, but it has not yet been translated. - -It would be nice if we could include multiple lines of text, but I just ported what's been implemented so far in Misskey not to mess things up. - -This is my first pull request (aside from typo correction). Feel free to point out any issues! - - - - - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9719 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: compile time compression - -- Feat: spruce up CLI - -- Feat: :sparkles: more themes! - -- Feat: swap home timeline with social's functionality ([#9597](https://github.com/orhun/git-cliff/issues/9597)) - -The Home timeline functionality is swapped with social's. Meaning that Home timeline now consists of followee's and local posts. Social from now on will contain only followee's posts. See more info in the attached ticket. - -Some changes applied in english locales as well. Probably the rest of the languages need to be fixed though. - -This PR closes the ticket: https://codeberg.org/calckey/calckey/issues/9552 - -Co-authored-by: yawhn <kordaris@gmail.com> -Co-authored-by: ThatOneCalculator <kainoa@t1c.dev> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9597 -Co-authored-by: yawhn <yawhn@noreply.codeberg.org> -Co-committed-by: yawhn <yawhn@noreply.codeberg.org> - -- Feat: add sonic to docker - -- Feat: masto api add display name - -- Feat: :sparkles: post metadata uses full @ - -Closes #9660 - -- Feat: new chat button on mobile - -- Feat: experimental post import - -- Add info - -- Feat: :sparkles: button in admin dash to index posts - -- Feat: custom KaTeX macro ([#9779](https://github.com/orhun/git-cliff/issues/9779)) - -Closes: #9759 -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9779 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Add rust to docker - -- Feat: :lock: add argon2 support - -Passwords will be automatically re-hashed on sign-in. All new password hashes will be argon2 by default. This uses argon2id and is not configurable. In the very unlikely case someone has more specific needs, a fork is recommended. ChangeLog: Added Co-authored-by: Chloe Kudryavtsev <code@toast.bunkerlabs.net> - -Breaks Calckey -> Misskey migration, but fixes Foundkey -> Calckey migration - -- Add argon - -- Feat: add option to boost with Home and Followers-only visibility ([#9788](https://github.com/orhun/git-cliff/issues/9788)) - -Closes: #9777 - -This pull request includes UI changes (please check the attached images). - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9788 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: :sparkles: search now searches posts and users - -- Feat: :sparkles: help menu in navbar - -- Add top margin to help button - -- Add VIPS to dockerfile - -- Add "speak as cat" setting to ja-jp - -- Feat: :sparkles: push notifs button - -Co-authored-by: Tamania <tamaina@hotmail.co.jp> - -- Feat: give reason for soft mutes - -Bad UX when a post is muted and it just says "Some chick said something". Now -provide some context too to help people decide if they want to view something -potentially triggering. - -- Feat: blur muted text - -- Feat: add hidden hashtags management page - -This simply adds a basic admin UI to blocklist some hashtags from displaying in -the trending widget. The facility existed already in the backend, but there was -no UI to manipulate the list save for executing raw SQL or API calls. - -- Feat: per-user boost muting ([#9825](https://github.com/orhun/git-cliff/issues/9825)) - -Cherry-picked from FoundKey/c414f24a2c ([commit](https://akkoma.dev/FoundKeyGang/FoundKey/commit/c414f24a2c123774246c7eca65edda4d3afaf8b3)) - -This allows us to hide specified users' boosts from the timelines (the boosts will still be visible on their user page). - -Co-authored-by: Hélène <pleroma-dev@helene.moe> -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9825 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: messaging room banner - -- Feat: mark all as read action in chat - -- Feat: admin lookup files/instance - -- Feat: index posts action - -- Feat: lookup post action - -- Feat: rename workspaces - -- Feat: :sparkles: software name on hover icon in instance ticker - -- Feat: add an option to disable emoji reactions ([#9878](https://github.com/orhun/git-cliff/issues/9878)) - -Closes: #9865 -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9878 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: make it toggleable whether to disable emojis in notifications ([#9880](https://github.com/orhun/git-cliff/issues/9880)) - -I talked about feature #9865 on my fedi account and received a comment like, "I don't care about emoji reactions in my timelines, but I do care what reactions I get!" - -Adding too many options is bad, but I agreed that making it toggleable whether to disable emojis in notifications is helpful, so I added this feature. This allows you to check emoji reactions to your posts in notifications while using the simple UI. I'd say this provides an experience that neither Mastodon nor Misskey has. - -The new setting item shows up only when you disable emoji reactions. - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9880 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: Implement reading Announcements from MastoAPI - -- Feat: heatmap option for activity widget - -- Feat: reserved usernames ([#9917](https://github.com/orhun/git-cliff/issues/9917)) - -This PR adds a feature to prevent users from creating a new account with a reserved username such as root, admin, system, proxy, info, etc... - -Reserved usernames can be configured via the config file. - -The administrator can create an account with a reserved username via the first setup screen or the control panel. - -The existing account of reserved usernames will not be affected. - -Co-authored-by: Namekuji <nmkj@mx.kazuno.co> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9917 -Co-authored-by: Namekuji <nmkj@noreply.codeberg.org> -Co-committed-by: Namekuji <nmkj@noreply.codeberg.org> - -- Feat: :sparkles: frontend interface for post-account creation email verification - -- Add kaiteki to example proxyBypassHosts - -- Add additional information & show more button in user preview popup - -- Add the focus trap thingies again - -- Add toggler - -- Add blockMath - -- Add silenced colour - -- Add db migration - - Add catppuccin latte - Add migration patches and fix commands @@ -905,401 +959,6 @@ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> ### Miscellaneous Tasks -- Chore: update megalodon - -- Chore: update package locks - -- Chore: bump pnpm version - -- Chore: add emoji aliases - -- Chore: :package: upgrade megalodon - -- Chore: update patron list - -- Chore: update patrons - -- Chore: bump pnpm - -- Update post job - -- Chore: :globe_with_meridians: locale changes - -Closes #9781 #9773 - -- Chore: :globe_with_meridians: locale changes - -Closes #9781 #9773 - -- Chore: update patron list - -- Chore: up pnpm - -- Chore: add cleanup migration - -- Chore: :art: format - -- Chore: remove okteto - -- Chore: update Japanese locale ([#9802](https://github.com/orhun/git-cliff/issues/9802)) - -- Chore: update patrons - -- Chore: pnpm 8.1.1 - -- Chore: back button in control panel - -- Chore: back button in more places - -- Chore: rome formatting - -- Chore: formatting - -- Chore: up pnpm - -- Chore: formatting - -- Chore: update mfm-js version ([#9844](https://github.com/orhun/git-cliff/issues/9844)) - -This resolves #9757. - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9844 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Chore: up swc - -- Update locale - -- Chore: formatting - -- Chore: add weblate config file - -- Chore: Translated using Weblate (Polish) - -Currently translated at 99.7% (1720 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: formatting - -- Update locales for calckey - -- Chore: Translated using Weblate (Greek) - -Currently translated at 31.6% (545 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Translated using Weblate (English) - -Currently translated at 100.0% (1724 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ - -- Chore: Translated using Weblate (Spanish) - -Currently translated at 92.0% (1587 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ - -- Chore: Translated using Weblate (Polish) - -Currently translated at 100.0% (1724 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 90.1% (1554 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Greek) - -Currently translated at 33.2% (574 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Translated using Weblate (Spanish) - -Currently translated at 92.0% (1587 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ - -- Chore: Translated using Weblate (Greek) - -Currently translated at 41.4% (714 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Translated using Weblate (Greek) - -Currently translated at 43.2% (745 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Translated using Weblate (Spanish) - -Currently translated at 92.5% (1595 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 93.6% (1615 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Greek) - -Currently translated at 43.2% (745 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: formatting - -- Chore: update summaly - -- Chore: Translated using Weblate (Japanese) - -Currently translated at 100.0% (1726 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ - -- Chore: Translated using Weblate (Polish) - -Currently translated at 100.0% (1726 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 95.0% (1640 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 95.2% (1644 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 100.0% (1726 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: formatting - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: Translated using Weblate (English) - -Currently translated at 100.0% (1727 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 99.8% (1724 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: up pakcages - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 22.9% (396 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: Translated using Weblate (German) - -Currently translated at 94.6% (1634 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ - -- Chore: Translated using Weblate (German) - -Currently translated at 94.6% (1634 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ - -- Chore: Translated using Weblate (Spanish) - -Currently translated at 92.2% (1594 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ - -- Chore: Translated using Weblate (French) - -Currently translated at 95.6% (1652 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fr/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 100.0% (1727 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Chinese (Traditional)) - -Currently translated at 97.2% (1680 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ - -- Chore: formatting - -- Chore: more rpine for server activity widget - -- Chore: update examples - -- Update patrons - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 35.0% (606 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 100.0% (1727 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Chinese (Traditional)) - -Currently translated at 97.4% (1683 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: update icons on post form - -- Chore: Added translation using Weblate (Finnish) - -- Chore: Translated using Weblate (Finnish) - -Currently translated at 2.4% (43 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ - -- Chore: upgrade megalodon - -- Chore: Translated using Weblate (English) - -Currently translated at 100.0% (1735 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 37.1% (644 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: Translated using Weblate (Finnish) - -Currently translated at 11.7% (204 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ - -- Chore: Translated using Weblate (Finnish) - -Currently translated at 11.7% (204 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ - -- Chore: Translated using Weblate (Japanese) - -Currently translated at 99.3% (1724 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: up browser-image-resizer - -- Chore: format - -- Chore: theme refactor - -- Update patrons - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 69.2% (1204 of 1739 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: patrons - -- Chore: formatting - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 100.0% (1739 of 1739 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: Merge branch 'origin/develop' into Weblate. - - Updates to include alt text editing - Update file sensitivity on note edit @@ -1977,12 +1636,117 @@ Translate-URL: https://hosted.weblate.org/projects/calckey/locales/nl/ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> +- Chore: Translated using Weblate (English) + +Currently translated at 100.0% (1753 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 98.8% (1732 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Translated using Weblate (Dutch) + +Currently translated at 32.2% (566 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/nl/ + +- Chore: Translated using Weblate (Dutch) + +Currently translated at 32.3% (567 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/nl/ + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1753 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 97.6% (1711 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.1% (1720 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.1% (1720 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.1% (1720 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.1% (1720 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (Dutch) + +Currently translated at 34.2% (601 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/nl/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + - Chore: formatting - Chore: :arrow_up: up pnpm - Chore: :bulb: meili +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + - Chore: format - Chore: format @@ -1995,8 +1759,29 @@ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> - Chore: :arrow_up: up bull +- Chore: Translated using Weblate (Danish) + +Currently translated at 11.5% (203 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/da/ + - Chore: formatting +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 99.5% (1745 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + - Chore: formatting - Chore: update example config @@ -2007,6 +1792,13 @@ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> - Chore: :arrow_up: up various deps +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1753 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + - Chore: format - Chore: formatting @@ -2027,12 +1819,6 @@ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> ### Refactor -- Refactor: nyaize on the frontend - -- Refactor - -- Refactor: change import type to radio - - Refactor: remove internal apps page - Enhance: emoji width and height @@ -2054,11 +1840,1076 @@ Correct og:type for users, format docs, deprecate _info_card_ ### Styling -- Style +- Style: 💄 server metrics widgets + + +## [14.0.0-rc] - 2023-05-02 + +### Bug Fixes + +- BlockMath is not necessarily multi-line (is this copy-pasted from blockCode?) + +- Fix poll voting causing edit revisions. + +- Fix(ap): Use unique identifier for each follow request + +Closes #9677 + +Co-authored-by: GitHub <hutchisr> + +- Fix meta fetch + +- Fix params + +- Fix email validation + +- Fix: Commit CI not running because cargo is not installed + +- Fix: Switch to node alpine image + +- Fix db migration + +- Fix lang + +- Fix show more import + + +### Features + +- Add toggler + +- Add blockMath + +- Add silenced colour + +- Add db migration + + +### Miscellaneous Tasks + +- Chore: Translated using Weblate (English) + +Currently translated at 100.0% (1735 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 37.1% (644 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Finnish) + +Currently translated at 11.7% (204 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ + +- Chore: Translated using Weblate (Finnish) + +Currently translated at 11.7% (204 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 99.3% (1724 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: up browser-image-resizer + +- Chore: format + +- Chore: theme refactor + +- Update patrons + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 69.2% (1204 of 1739 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: patrons + +- Chore: formatting + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1739 of 1739 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Merge branch 'origin/develop' into Weblate. + + +## [13.2.0-beta9h] - 2023-04-30 + +## [13.2.0-beta9] - 2023-04-29 + +### Bug Fixes + +- Fix: add route + +- Fix? + +- Fix: style email with inline styles + +- Fix disabled, formatting + +- Fix: Make statusModel `created_at` fields be ISO 8601 strings + +This makes the 'Reactions to this post' status (seen when viewing +a status context) send the correct data type for `created_at` fields. + +https://docs.joinmastodon.org/entities/Account/#created_at +https://docs.joinmastodon.org/entities/Status/#created_at + +- Fix: Get list titles from Form data when creating and updating lists + +This change will actually make it possible for Mastodon clients to +create and rename lists, as they send the title in a Form data instead +of a query string. + +https://docs.joinmastodon.org/methods/lists/#form-data-parameters + +- Fix: Declare /api/v1/accounts/relationships before /api/v1/accounts/:id + +Previously the 'relationships' part was considered to be an account id +and was handled by completely different API endpoint. + +- Fixes + +- Fixes? + +- Fix subnote + +- Fix + +- Fix: centering block math ([#9946](https://github.com/orhun/git-cliff/issues/9946)) + +Similar to `inlineCode` and `blockCode`, MFM provides two types of formula syntax, `mathInline` and `mathBlock` (I'm curious why these aren't called `inlineMath`/`blockMath`, but oh well) + +Other platforms, like GitHub, **Math**todon, my blog, etc., also support these two types of formula representation, and math blocks are centered on (maybe) all such platforms. + + + +But Calckey (Misskey v12) don't center math blocks. I'd say this is a bug, and this makes `blockMath` useless (it's just `inlineMath` in a new line). + + + +So I fixed this. + + + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9946 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + + +### Documentation + +- Docs + + +### Features + +- Feat: :sparkles: frontend interface for post-account creation email verification + +- Add kaiteki to example proxyBypassHosts + +- Add additional information & show more button in user preview popup + +- Add the focus trap thingies again + + +### Miscellaneous Tasks + +- Chore: more rpine for server activity widget + +- Chore: update examples + +- Update patrons + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 35.0% (606 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 100.0% (1727 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Chinese (Traditional)) + +Currently translated at 97.4% (1683 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: update icons on post form + +- Chore: Added translation using Weblate (Finnish) + +- Chore: Translated using Weblate (Finnish) + +Currently translated at 2.4% (43 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ + +- Chore: upgrade megalodon + + +### Refactor + +- Refactor: change import type to radio + + +## [13.2.0-beta8] - 2023-04-26 + +### Bug Fixes + +- Fix an instance ticker bug + + +### Features + +- Feat: heatmap option for activity widget + +- Feat: reserved usernames ([#9917](https://github.com/orhun/git-cliff/issues/9917)) + +This PR adds a feature to prevent users from creating a new account with a reserved username such as root, admin, system, proxy, info, etc... + +Reserved usernames can be configured via the config file. + +The administrator can create an account with a reserved username via the first setup screen or the control panel. + +The existing account of reserved usernames will not be affected. + +Co-authored-by: Namekuji <nmkj@mx.kazuno.co> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9917 +Co-authored-by: Namekuji <nmkj@noreply.codeberg.org> +Co-committed-by: Namekuji <nmkj@noreply.codeberg.org> + + +### Miscellaneous Tasks + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 22.9% (396 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 94.6% (1634 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 94.6% (1634 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 92.2% (1594 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ + +- Chore: Translated using Weblate (French) + +Currently translated at 95.6% (1652 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fr/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 100.0% (1727 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Chinese (Traditional)) + +Currently translated at 97.2% (1680 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ + +- Chore: formatting + + +## [13.2.0-beta7] - 2023-04-25 + +### Bug Fixes + +- Fix: :lock: don't show notes with CW on welcome screen + +Closes #9849 + +- Prevent crashes due to timezone === null + +- Fix a bug + +- Fix: disable "Search" keyword ([#9856](https://github.com/orhun/git-cliff/issues/9856)) + +Related: #9816 #9830 +I was so careless that I didn't know "Search" was also a keyword. I disabled that and fixed a minor bug. + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9856 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Fix + +- Fix tag on explore + +- Fix header tabs + +- Fix: ドライブアップロードで413が返ってきたときにエラーメッセージを表示 ([#10680](https://github.com/orhun/git-cliff/issues/10680)) + +- Fix: boost muting in the recommended timeline ([#9906](https://github.com/orhun/git-cliff/issues/9906)) + +Closes: #9905 +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9906 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + + +### Documentation + +- Docs: rm yunohost + +has been broken for months, I don't maintain it either. + + +### Features + +- Feat: rename workspaces + +- Feat: :sparkles: software name on hover icon in instance ticker + +- Feat: add an option to disable emoji reactions ([#9878](https://github.com/orhun/git-cliff/issues/9878)) + +Closes: #9865 +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9878 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: make it toggleable whether to disable emojis in notifications ([#9880](https://github.com/orhun/git-cliff/issues/9880)) + +I talked about feature #9865 on my fedi account and received a comment like, "I don't care about emoji reactions in my timelines, but I do care what reactions I get!" + +Adding too many options is bad, but I agreed that making it toggleable whether to disable emojis in notifications is helpful, so I added this feature. This allows you to check emoji reactions to your posts in notifications while using the simple UI. I'd say this provides an experience that neither Mastodon nor Misskey has. + +The new setting item shows up only when you disable emoji reactions. + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9880 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: Implement reading Announcements from MastoAPI + + +### Miscellaneous Tasks + +- Chore: up swc + +- Update locale + +- Chore: formatting + +- Chore: add weblate config file + +- Chore: Translated using Weblate (Polish) + +Currently translated at 99.7% (1720 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Update locales for calckey + +- Chore: Translated using Weblate (Greek) + +Currently translated at 31.6% (545 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Translated using Weblate (English) + +Currently translated at 100.0% (1724 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 92.0% (1587 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ + +- Chore: Translated using Weblate (Polish) + +Currently translated at 100.0% (1724 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 90.1% (1554 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Greek) + +Currently translated at 33.2% (574 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 92.0% (1587 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ + +- Chore: Translated using Weblate (Greek) + +Currently translated at 41.4% (714 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Translated using Weblate (Greek) + +Currently translated at 43.2% (745 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 92.5% (1595 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 93.6% (1615 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Greek) + +Currently translated at 43.2% (745 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Chore: update summaly + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1726 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Translated using Weblate (Polish) + +Currently translated at 100.0% (1726 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 95.0% (1640 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 95.2% (1644 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 100.0% (1726 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (English) + +Currently translated at 100.0% (1727 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 99.8% (1724 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: up pakcages + + +### Styling - Style announcement image -- Style: 💄 server metrics widgets + +## [13.2.0-beta6] - 2023-04-13 + +### Bug Fixes + +- Fix: add cargo to DOCKERFILE + +- Fix: add cargo to DOCKERFILE + +- Fix #9784 + +- Fix #9784 + +- Fix help button alignment iconsOnly + +- Fix indexing description + +- Fix: :passport_control: no longer need 2fa for webauthn + +- Fix import + +- Fix button alignments + +- Fix: dialogs not coming up + +- Fix: dockerfile + +- Fix: add copy for build from native-utils + +- Fix: changing passwords, 2fa, and password resets. + +The argon2 usage was only implemented for sign-ins which broke a bunch of other +endpoints and features. + +- Fix help button alignment iconsOnly + +- Fix indexing description + +- Fix: :passport_control: no longer need 2fa for webauthn + +- Fix import + +- Fix button alignments + +- Fix: dialogs not coming up + +- Fix: dockerfile + +- Fix: add copy for build from native-utils + +- Fix: changing passwords, 2fa, and password resets. + +The argon2 usage was only implemented for sign-ins which broke a bunch of other +endpoints and features. + +- Fix: buttons not showing + +- Fix: :bug: go to last timeline selected + +- Fix: toggling the blocking state from the instance-info admin view ([#9809](https://github.com/orhun/git-cliff/issues/9809)) + +Because the admin meta information was never loaded on this page, no amount of toggling the block or suspend sliders on the instance-info page (e.g. `https://calckey.example.com/instance-info/instance.tld`) will result in the instance actually being added to the blocklist. You could still do it from the bulk blocklist management page, but that can get unwieldy quickly if you just want to do a quick block of an instance. + +Co-authored-by: amy bones <amy@spookygirl.boo> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9809 +Co-authored-by: amybones <amybones@noreply.codeberg.org> +Co-committed-by: amybones <amybones@noreply.codeberg.org> + +- Fix + +- Fix(client): userpage ui ([#9179](https://github.com/orhun/git-cliff/issues/9179)) + +* fix(unverified): clip pages ui + +* fix(unverified): user page width + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +- Fix id of move activity + +- Fix move inbox + +- Fix: format script; chore: format + +- Fix: typo + +- Fix + +- Fix chat metadata + +- Fix lookup instance + + +### Documentation + +- Docs: hyperlink foundkey commits + +- Docs: hyperlink foundkey commits + + +### Features + +- Add VIPS to dockerfile + +- Add "speak as cat" setting to ja-jp + +- Add VIPS to dockerfile + +- Add "speak as cat" setting to ja-jp + +- Feat: :sparkles: push notifs button + +Co-authored-by: Tamania <tamaina@hotmail.co.jp> + +- Feat: give reason for soft mutes + +Bad UX when a post is muted and it just says "Some chick said something". Now +provide some context too to help people decide if they want to view something +potentially triggering. + +- Feat: blur muted text + +- Feat: add hidden hashtags management page + +This simply adds a basic admin UI to blocklist some hashtags from displaying in +the trending widget. The facility existed already in the backend, but there was +no UI to manipulate the list save for executing raw SQL or API calls. + +- Feat: per-user boost muting ([#9825](https://github.com/orhun/git-cliff/issues/9825)) + +Cherry-picked from FoundKey/c414f24a2c ([commit](https://akkoma.dev/FoundKeyGang/FoundKey/commit/c414f24a2c123774246c7eca65edda4d3afaf8b3)) + +This allows us to hide specified users' boosts from the timelines (the boosts will still be visible on their user page). + +Co-authored-by: Hélène <pleroma-dev@helene.moe> +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9825 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: messaging room banner + +- Feat: mark all as read action in chat + +- Feat: admin lookup files/instance + +- Feat: index posts action + +- Feat: lookup post action + + +### Miscellaneous Tasks + +- Chore: :art: format + +- Chore: remove okteto + +- Chore: update Japanese locale ([#9802](https://github.com/orhun/git-cliff/issues/9802)) + +- Chore: :art: format + +- Chore: remove okteto + +- Chore: update patrons + +- Chore: pnpm 8.1.1 + +- Chore: back button in control panel + +- Chore: back button in more places + +- Chore: rome formatting + +- Chore: formatting + +- Chore: up pnpm + +- Chore: formatting + +- Chore: update mfm-js version ([#9844](https://github.com/orhun/git-cliff/issues/9844)) + +This resolves #9757. + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9844 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + + +### Refactor + +- Refactor + + +### Styling + +- Style + +- Style + + +## [13.2.0-beta4] - 2023-04-01 + +### Bug Fixes + +- Fix + +- Fix + +- Fix callback url + +- Fix japanese locale + +- Fix? + +- Fix: allow announces with followers visibility + +- Fix: :bug: formlink -> button + +fixes notifications and drive in settings + +- Fix sounds settings + +- Fix doc link + +- Fix: direct boost ([#9783](https://github.com/orhun/git-cliff/issues/9783)) + +Sorry to create PR multiple times. I should have included this in #9778. + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9783 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Fix: don't nyaize quoted text + +- Fix: don't nyaize quoted text ([#9791](https://github.com/orhun/git-cliff/issues/9791)) + +- Fix search import + +- Fix migration + +- Fix: :bug: make recently used group + +Closes #9784 + + +### Documentation + +- Docs: add note about reverse migration + + +### Features + +- Feat: :sparkles: post metadata uses full @ + +Closes #9660 + +- Feat: new chat button on mobile + +- Feat: experimental post import + +- Add info + +- Feat: :sparkles: button in admin dash to index posts + +- Feat: custom KaTeX macro ([#9779](https://github.com/orhun/git-cliff/issues/9779)) + +Closes: #9759 +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9779 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Add rust to docker + +- Feat: :lock: add argon2 support + +Passwords will be automatically re-hashed on sign-in. All new password hashes will be argon2 by default. This uses argon2id and is not configurable. In the very unlikely case someone has more specific needs, a fork is recommended. ChangeLog: Added Co-authored-by: Chloe Kudryavtsev <code@toast.bunkerlabs.net> + +Breaks Calckey -> Misskey migration, but fixes Foundkey -> Calckey migration + +- Add argon + +- Feat: add option to boost with Home and Followers-only visibility ([#9788](https://github.com/orhun/git-cliff/issues/9788)) + +Closes: #9777 + +This pull request includes UI changes (please check the attached images). + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9788 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: :sparkles: search now searches posts and users + +- Feat: :sparkles: help menu in navbar + +- Add top margin to help button + + +### Miscellaneous Tasks + +- Chore: update patron list + +- Chore: update patrons + +- Chore: bump pnpm + +- Update post job + +- Chore: :globe_with_meridians: locale changes + +Closes #9781 #9773 + +- Chore: :globe_with_meridians: locale changes + +Closes #9781 #9773 + +- Chore: update patron list + +- Chore: up pnpm + +- Chore: add cleanup migration + + +## [13.2.0-beta31] - 2023-03-24 + +### Bug Fixes + +- Fix: max user profile length to db field length + +Resolves: #9749 + +- Fix: :bug: no nyaizing undefined text + +Closes #9752 + +- Fix: a bug in ads + +- Fix color in follow button + +- Fix: relay signature handling + +A change sometime ago moved to setting some signature fields in the incoming +object to undefined as opposed to deleting them. The trouble is that downstream +code checks against existence, not undefinedness and rejects the message. + +Resolves: #9665 + + +### Documentation + +- Docs: sonic + + +### Features + +- Feat: swap home timeline with social's functionality ([#9597](https://github.com/orhun/git-cliff/issues/9597)) + +The Home timeline functionality is swapped with social's. Meaning that Home timeline now consists of followee's and local posts. Social from now on will contain only followee's posts. See more info in the attached ticket. + +Some changes applied in english locales as well. Probably the rest of the languages need to be fixed though. + +This PR closes the ticket: https://codeberg.org/calckey/calckey/issues/9552 + +Co-authored-by: yawhn <kordaris@gmail.com> +Co-authored-by: ThatOneCalculator <kainoa@t1c.dev> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9597 +Co-authored-by: yawhn <yawhn@noreply.codeberg.org> +Co-committed-by: yawhn <yawhn@noreply.codeberg.org> + +- Feat: add sonic to docker + +- Feat: masto api add display name + + +### Miscellaneous Tasks + +- Chore: :package: upgrade megalodon + + +## [13.2.0-beta2] - 2023-03-21 + +### Bug Fixes + +- Fix deck view margins + +- Fix: Parse mastoAPI `limit` argument in more places & Improve converting arguments to boolean ([#9716](https://github.com/orhun/git-cliff/issues/9716)) + +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9716 +Authored-by: fruye <fruye@unix.dog> +Signed-off-by: Cleo John <waterdev@galaxycrow.de> +Co-authored-by: fruye <fruye@unix.dog> +Co-committed-by: fruye <fruye@unix.dog> + +- Fix: send button + +- Fix: intermediarily convert ids + +- Fix: mobile button alignment + +- Fix: when count is actually 0 + +- Fix cli more + +- Fix: don't show smartphone UI when settings icon is double-clicked + +- Fix: unicode aliases + +- Fix: repo url + +- Fix: :bug: can't send blank messages + +Closes #9661 + +- Fix: make sure cw button is on new line + +- Fix: local time for users + + +### Documentation + +- Docs: changes + +- Docs: 📝 sonic instructions + +- Docs: 📝 sonic + + +### Features + +- Feat: Make follower counts for remote users correct ([#9705](https://github.com/orhun/git-cliff/issues/9705)) + +#9293 + +Not sure if this is the right approach for this + +Co-authored-by: s1idewhist1e <trombonedude05@gmail.com> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9705 +Co-authored-by: s1idewhist1e <s1idewhist1e@noreply.codeberg.org> +Co-committed-by: s1idewhist1e <s1idewhist1e@noreply.codeberg.org> + +- Add 404 as replacements + +- Feat: set license information for custom emojis ([#9719](https://github.com/orhun/git-cliff/issues/9719)) + +Closes: #9711 (please check this issue first) + +I cherry-picked two commits ([1](https://github.com/misskey-dev/misskey/commit/8ae9d2eaa8b0842671558370f787902e94b7f5a3), [2](https://github.com/misskey-dev/misskey/commit/ed51209172441927d24339f0759a5badbee3c9b6)) from [Misskey](https://github.com/misskey-dev/misskey) and made a few changes. +「ライセンス」should be written as "License" in the following screenshots, but it has not yet been translated. + +It would be nice if we could include multiple lines of text, but I just ported what's been implemented so far in Misskey not to mess things up. + +This is my first pull request (aside from typo correction). Feel free to point out any issues! + + + + + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9719 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: compile time compression + +- Feat: spruce up CLI + +- Feat: :sparkles: more themes! + + +### Miscellaneous Tasks + +- Chore: update megalodon + +- Chore: update package locks + +- Chore: bump pnpm version + +- Chore: add emoji aliases + + +### Refactor + +- Refactor: nyaize on the frontend ## [13.2.0-beta3] - 2023-03-16 @@ -2107,6 +2958,8 @@ Needed for pleromaFE to display a timeline. - Fix line alignment in smaller windows +## [13.2.0-beta] - 2023-03-15 + ## [13.1.3] - 2023-03-14 ### Bug Fixes From 5ab80337dbfca728d71855fb5febd8cf197ae6af Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 15:18:26 -0700 Subject: [PATCH 169/309] docs: :memo: v14.0.0-rc3 changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 001e0ed1d8..988156a72d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ All changes from v13.0.0 onwards, for a full list of differences read CALCKEY.md ### Bug Fixes +- Fix: improv ux of deck scroll + - Fix: editing caption accuracy - Fix: only show meili in metrics if available From dba594c55a43522ad9e5bd00e4fbf7bb5d375322 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 19:16:15 -0700 Subject: [PATCH 170/309] refactor: :lipstick: improve miauth style --- locales/en-US.yml | 5 ++- packages/client/src/pages/miauth.vue | 56 +++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index c619c26086..1d7fa3741b 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1548,11 +1548,12 @@ _auth: shareAccess: "Would you like to authorize \"{name}\" to access this account?" shareAccessAsk: "Are you sure you want to authorize this application to access your account?" - permissionAsk: "This application requests the following permissions" + permissionAsk: "This application requests the following permissions:" pleaseGoBack: "Please go back to the application" callback: "Returning to the application" denied: "Access denied" - copyAsk: "Please paste the following authorization code to the application" + copyAsk: "Please paste the following authorization code to the application:" + allPermissions: "Full account access" _antennaSources: all: "All posts" homeTimeline: "Posts from followed users" diff --git a/packages/client/src/pages/miauth.vue b/packages/client/src/pages/miauth.vue index bf4c2542fb..1bf652c820 100644 --- a/packages/client/src/pages/miauth.vue +++ b/packages/client/src/pages/miauth.vue @@ -28,11 +28,38 @@ </div> <div class="_content"> <p>{{ i18n.ts._auth.permissionAsk }}</p> - <ul> - <li v-for="p in _permissions" :key="p"> + <div + v-if="_permissions.length === 32" + :class="[$style.permissions]" + > + <div + :class="[$style.permission]" + style=" + background-color: var(--error); + color: var(--fgOnAccent); + " + > + <i + class="ph-shield-warning ph-bold ph-xl" + style="margin-right: 0.5rem" + ></i> + {{ i18n.ts._permissions.allPermissions }} + </div> + </div> + <div v-else :class="[$style.permissions]"> + <div + v-for="p in _permissions" + :key="p" + :class="[$style.permission, $style.permission]" + > + <i + :class="[`ph-${getIcon(p)}`]" + class="ph-bold ph-xl" + style="margin-right: 0.5rem" + ></i> {{ i18n.t(`_permissions.${p}`) }} - </li> - </ul> + </div> + </div> </div> <div class="_footer"> <MkButton inline @click="deny">{{ @@ -71,6 +98,10 @@ const _permissions = props.permission.split(","); let state = $ref<string | null>(null); +function getIcon(p: string) { + return p.includes("write") ? "pencil-simple" : "eye"; +} + async function accept(): Promise<void> { state = "waiting"; await os.api("miauth/gen-token", { @@ -107,4 +138,19 @@ function onLogin(res): void { } </script> -<style lang="scss" scoped></style> +<style lang="scss" module> +.permissions { + display: flex; + flex-wrap: wrap; + gap: 1rem; + margin-bottom: 2rem; +} + +.permission { + display: inline-flex; + padding: 0.5rem 1rem; + border-radius: var(--radius); + background-color: var(--buttonBg); + color: var(--fg); +} +</style> From 2425382d63540d46429ae05b6769de6eacdff4b1 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 19:17:48 -0700 Subject: [PATCH 171/309] fix: :pencil2: deduplicate class --- packages/client/src/pages/miauth.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/pages/miauth.vue b/packages/client/src/pages/miauth.vue index 1bf652c820..768787ef26 100644 --- a/packages/client/src/pages/miauth.vue +++ b/packages/client/src/pages/miauth.vue @@ -50,7 +50,7 @@ <div v-for="p in _permissions" :key="p" - :class="[$style.permission, $style.permission]" + :class="[$style.permission]" > <i :class="[`ph-${getIcon(p)}`]" From e5315db92c38f7001126aa4ab84c2ea54929807b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 19:23:14 -0700 Subject: [PATCH 172/309] fix: :adhesive_bandage: ask for reload upon changing skin tone --- packages/client/src/pages/settings/reaction.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue index 8d8bca8930..65abaaa765 100644 --- a/packages/client/src/pages/settings/reaction.vue +++ b/packages/client/src/pages/settings/reaction.vue @@ -238,6 +238,10 @@ watch(enableEmojiReactions, async () => { await reloadAsk(); }); +watch(reactionPickerSkinTone, async () => { + await reloadAsk(); +}) + const headerActions = $computed(() => []); const headerTabs = $computed(() => []); From 41c65a4623d3b7c003e7bf1043d7b71a67066495 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 24 Jun 2023 19:38:55 -0700 Subject: [PATCH 173/309] fix: :bug: properly apply unicode for skin tone selector --- .../src/components/MkEmojiPicker.section.vue | 14 +------------- packages/client/src/scripts/emojilist.ts | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/client/src/components/MkEmojiPicker.section.vue b/packages/client/src/components/MkEmojiPicker.section.vue index ffe891a0b9..c6052c60ee 100644 --- a/packages/client/src/components/MkEmojiPicker.section.vue +++ b/packages/client/src/components/MkEmojiPicker.section.vue @@ -14,7 +14,7 @@ <button v-for="skinTone in props.skinTones" class="_button" - @click.prevent=" + @click.stop=" applyUnicodeSkinTone( props.skinTones.indexOf(skinTone) + 1 ) @@ -43,7 +43,6 @@ <script lang="ts" setup> import { ref, watch, onMounted } from "vue"; import { addSkinTone } from "@/scripts/emojilist"; -import emojiComponents from "unicode-emoji-json/data-emoji-components.json"; const props = defineProps<{ emojis: string[]; @@ -56,17 +55,6 @@ const localEmojis = ref([...props.emojis]); function applyUnicodeSkinTone(custom?: number) { for (let i = 0; i < localEmojis.value.length; i++) { - if ( - [ - emojiComponents.light_skin_tone, - emojiComponents.medium_light_skin_tone, - emojiComponents.medium_skin_tone, - emojiComponents.medium_dark_skin_tone, - emojiComponents.dark_skin_tone, - ].some((v) => localEmojis.value[i].endsWith(v)) - ) { - localEmojis.value[i] = localEmojis.value[i].slice(0, -1); - } localEmojis.value[i] = addSkinTone(localEmojis.value[i], custom); } } diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index a5ad7e3685..5ae8bce3bd 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -45,6 +45,8 @@ export const unicodeEmojiSkinTones = [ ]; export function addSkinTone(emoji: string, skinTone?: number) { + const individualData = import("unicode-emoji-json/data-by-emoji.json"); + const chosenSkinTone = skinTone || defaultStore.state.reactionPickerSkinTone; const skinToneModifiers = [ "", @@ -54,7 +56,18 @@ export function addSkinTone(emoji: string, skinTone?: number) { emojiComponents.medium_dark_skin_tone, emojiComponents.dark_skin_tone, ]; - return emoji + (skinToneModifiers[chosenSkinTone - 1] || ""); + if (individualData[emoji]?.skin_tone_support === false) { + return emoji; + } + return ( + emoji.replace( + new RegExp( + `(${skinToneModifiers.slice(1).join("|")})`, + "gi", + ), + "", + ) + (skinToneModifiers[chosenSkinTone - 1] || "") + ); } const unicodeFifteenEmojis = [ From f172c3a59a2e586a4e0227af443597297a542b0f Mon Sep 17 00:00:00 2001 From: mutex <medini_seiken@mailredacted.com> Date: Sat, 24 Jun 2023 19:15:34 +0000 Subject: [PATCH 174/309] chore: Translated using Weblate (German) Currently translated at 99.5% (1796 of 1805 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ --- locales/de-DE.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 4a1bcdf565..d37869064d 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -693,8 +693,8 @@ abuseReported: "Deine Meldung wurde versendet. Vielen Dank." reporter: "Melder" reporteeOrigin: "Herkunft des Gemeldeten" reporterOrigin: "Herkunft des Meldenden" -forwardReport: "Einen Meldung zusätzlich an den mit-beteiligten Server senden" -forwardReportIsAnonymous: "Anstelle Ihres Nutzerkontos wird ein anonymes Systemkonto +forwardReport: "Meldung auch an den mit-beteiligten Server weiterleiten" +forwardReportIsAnonymous: "Anstelle deines Nutzerkontos wird ein anonymes Systemkonto als Hinweisgeber auf dem mit-beteiligten Server angezeigt." send: "Senden" abuseMarkAsResolved: "Meldung als gelöst markieren" @@ -1983,8 +1983,8 @@ renoteMute: Boosts stummschalten renoteUnmute: Stummschaltung von Boosts aufheben noInstances: Keine Server gefunden privateModeInfo: Wenn diese Option aktiviert ist, können nur als vertrauenswürdig - eingestufte Server mit diesem Server verknüpft werden. Alle Beiträge werden für - die Öffentlichkeit verborgen. + eingestufte Server mit diesem Server kommunizieren. Alle Beiträge werden für die + Öffentlichkeit verborgen. allowedInstances: Vertrauenswürdige Server selectInstance: Wähle einen Server aus silencedInstancesDescription: Liste die Hostnamen der Server auf, die du stummschalten @@ -2151,3 +2151,4 @@ listsDesc: Listen lassen dich Timelines mit bestimmten Nutzer:innen erstellen. S clipsDesc: Clips sind wie teilbare, kategorisierte Lesezeichen. Du kannst Clips vom Menü individueller Posts aus erstellen. channelFederationWarn: Kanäle föderieren noch nicht zu anderen Servern +reactionPickerSkinTone: Bevorzugte Emoji-Hautfarbe From dabd0d0acc75ad8d11f20b65cbc6a80492953ac8 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sat, 24 Jun 2023 23:18:49 -0400 Subject: [PATCH 175/309] fix: 2fa registration code --- packages/client/src/pages/settings/2fa.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue index 56a4cca0f4..48d27c31a4 100644 --- a/packages/client/src/pages/settings/2fa.vue +++ b/packages/client/src/pages/settings/2fa.vue @@ -176,7 +176,7 @@ async function registerTOTP() { }); if (!qrdialog) return; - const token = await os.inputNumber({ + const token = await os.inputText({ title: i18n.ts._2fa.step3Title, text: i18n.ts._2fa.step3, autocomplete: "one-time-code", @@ -184,7 +184,7 @@ async function registerTOTP() { if (token.canceled) return; await os.apiWithDialog("i/2fa/done", { - token: token.result.toString(), + token: token.result, }); await os.alert({ From 7fa2ed853a831caa6e2a4a2cccd0a372a7538a8b Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 11:11:18 -0400 Subject: [PATCH 176/309] Update visibility descriptions --- locales/en-US.yml | 4 ++-- packages/client/src/components/MkVisibilityPicker.vue | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 1d7fa3741b..03ec9284ba 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1628,11 +1628,11 @@ _poll: remainingSeconds: "{s} second(s) remaining" _visibility: public: "Public" - publicDescription: "Your post will be visible for all users" + publicDescription: "Your post will be visible in all public timelines" home: "Unlisted" homeDescription: "Post to home timeline only" followers: "Followers" - followersDescription: "Make visible to your followers only" + followersDescription: "Make visible to your followers and mentioned users only" specified: "Direct" specifiedDescription: "Make visible for specified users only" localOnly: "Local only" diff --git a/packages/client/src/components/MkVisibilityPicker.vue b/packages/client/src/components/MkVisibilityPicker.vue index f4529faa52..d724f94b70 100644 --- a/packages/client/src/components/MkVisibilityPicker.vue +++ b/packages/client/src/components/MkVisibilityPicker.vue @@ -215,7 +215,6 @@ function choose(visibility: (typeof misskey.noteVisibilities)[number]): void { .body { flex: 1 1 auto; - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } @@ -226,7 +225,9 @@ function choose(visibility: (typeof misskey.noteVisibilities)[number]): void { } .itemDescription { - opacity: 0.6; + opacity: .6; + display: block; + line-height: 1.5; } .toggle { From fc30217c69f35b967de0993424eb98c247ab0665 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 17:07:01 -0400 Subject: [PATCH 177/309] style: New posts button --- packages/client/src/pages/timeline.vue | 62 ++++++++++++++++++++++---- packages/client/src/style.scss | 10 +++++ 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index 2633d0e0b5..d849258f33 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -17,8 +17,13 @@ /> <div v-if="queue > 0" class="new"> - <button class="_buttonPrimary" @click="top()"> + <button + class="_buttonPrimary _shadow" + @click="top()" + :class="{ instant: !$store.state.animation }" + > {{ i18n.ts.newNoteRecived }} + <i class="ph-arrow-up ph-bold"></i> </button> </div> <!-- <div v-if="!isMobile" class="tl _block"> @@ -328,22 +333,63 @@ onMounted(() => { </script> <style lang="scss" scoped> +@keyframes slideUp { + to { + transform: translateY(-100%); + opacity: 0; + } +} .cmuxhskf { --swiper-theme-color: var(--accent); > .new { position: sticky; - top: calc(var(--stickyTop, 0px) + 16px); + display: flex; + justify-content: center; + top: calc(var(--stickyTop, 0px) - 60px); z-index: 1000; - width: 100%; + width: 600px; + height: 60px; pointer-events: none; - + margin-inline: auto; + z-index: 90000; + max-width: 600px; + box-shadow: 0 24px 24px -20px var(--accentedBg); + &::after { + content: ""; + position: absolute; + inset: 0; + border: 2px solid var(--accent); + mask: linear-gradient(to right, transparent,black 40% 60%,transparent); + } > button { - display: block; - margin: var(--margin) auto 0 auto; - padding: 8px 16px; - border-radius: 32px; + display: flex; + position: absolute; + top: 120%; + margin-inline: auto; + border-radius: 2em; + padding: .5em 1.2em; + background: var(--accentedBg); + border: 0; + color: var(--accent); + overflow: hidden; pointer-events: all; + transform: translateY(-100%); + opacity: 0; + animation: reset .4s forwards cubic-bezier(0,.4,0,1.1), + slideUp 1s 5s forwards cubic-bezier(1,0,1,1); + &::before { + content: ""; + position: absolute; + inset: 0; + background: var(--bg); + z-index: -1; + } + i { + margin-left: .7em; + border-left: 1px solid var(--accentedBg); + padding-left: .4em; + } } } diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 32975920ab..966e44f924 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -842,6 +842,16 @@ hr { margin: 0; } +@keyframes reset { + to { + transform: none; + opacity: 1; + } +} +.instant { + animation-duration: 0s !important; +} + @media(prefers-reduced-motion: no-preference) { @keyframes scaleIn { from { From 0a2f1d9243a58b3cbea41fccb6d250b5af17c7a5 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 17:10:10 -0400 Subject: [PATCH 178/309] fix: new posts button mobile position + webkit-mask --- packages/client/src/pages/timeline.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index d849258f33..d886c4b7a1 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -349,6 +349,7 @@ onMounted(() => { top: calc(var(--stickyTop, 0px) - 60px); z-index: 1000; width: 600px; + max-width: 100%; height: 60px; pointer-events: none; margin-inline: auto; @@ -361,6 +362,7 @@ onMounted(() => { inset: 0; border: 2px solid var(--accent); mask: linear-gradient(to right, transparent,black 40% 60%,transparent); + -webkit-mask: linear-gradient(to right, transparent,black 40% 60%,transparent); } > button { display: flex; From 6809c2fcbc6729d79c4d65bfb5aa44564e4561b4 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 17:28:35 -0400 Subject: [PATCH 179/309] fix: actually fix mobile pos oops... --- packages/client/src/pages/timeline.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index d886c4b7a1..b34ad78497 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -354,7 +354,6 @@ onMounted(() => { pointer-events: none; margin-inline: auto; z-index: 90000; - max-width: 600px; box-shadow: 0 24px 24px -20px var(--accentedBg); &::after { content: ""; From cc1b34d3e53d33ea94569af5ba4f1c9d6d23edf9 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 18:19:37 -0400 Subject: [PATCH 180/309] feat: Make scrollable widgets flexible --- packages/client/src/components/MkContainer.vue | 1 + packages/client/src/components/MkWidgets.vue | 5 ++++- packages/client/src/ui/universal.widgets.vue | 8 +++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkContainer.vue b/packages/client/src/components/MkContainer.vue index 62c198cb16..4c4e91160c 100644 --- a/packages/client/src/components/MkContainer.vue +++ b/packages/client/src/components/MkContainer.vue @@ -196,6 +196,7 @@ export default defineComponent({ &.scrollable { display: flex; flex-direction: column; + flex-grow: 1; > .content { overflow: auto; diff --git a/packages/client/src/components/MkWidgets.vue b/packages/client/src/components/MkWidgets.vue index d48fc53832..0d64c9fb62 100644 --- a/packages/client/src/components/MkWidgets.vue +++ b/packages/client/src/components/MkWidgets.vue @@ -172,6 +172,9 @@ function onContextmenu(widget: Widget, ev: MouseEvent) { <style lang="scss" scoped> .vjoppmmu { + display: flex; + flex-direction: column; + flex-grow: 1; > header { margin: 16px 0; @@ -184,7 +187,7 @@ function onContextmenu(widget: Widget, ev: MouseEvent) { > .widget, .customize-container { contain: content; - margin: var(--margin) 0; + margin-bottom: var(--margin); &:first-of-type { margin-top: 0; diff --git a/packages/client/src/ui/universal.widgets.vue b/packages/client/src/ui/universal.widgets.vue index d931e1bf3f..5c5f2073a7 100644 --- a/packages/client/src/ui/universal.widgets.vue +++ b/packages/client/src/ui/universal.widgets.vue @@ -88,9 +88,11 @@ function updateWidgets(widgets) { min-height: 100vh; padding: var(--margin) 0; box-sizing: border-box; + display: flex; + flex-direction: column; > * { - margin: var(--margin) 0; + margin-top: var(--margin); width: 300px; &:first-child { @@ -98,6 +100,10 @@ function updateWidgets(widgets) { } } + .a:empty { + display: none; + } + > .add { margin: 0 auto; } From 5fcbf699ffb096994975aa060c4061ae3be9de2f Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 18:33:13 -0400 Subject: [PATCH 181/309] feat: make RSS feed scrollable (#10108) --- packages/client/src/widgets/rss.vue | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/client/src/widgets/rss.vue b/packages/client/src/widgets/rss.vue index 370ec2023b..a37e32e8da 100644 --- a/packages/client/src/widgets/rss.vue +++ b/packages/client/src/widgets/rss.vue @@ -1,5 +1,10 @@ <template> - <MkContainer :show-header="widgetProps.showHeader" class="mkw-rss"> + <MkContainer + :show-header="widgetProps.showHeader" + class="mkw-rss" + :scrollable="true" + :style="`height: ${widgetProps.height}px;`" + > <template #header><i class="ph-rss ph-bold ph-lg"></i>RSS</template> <template #func ><button class="_button" @click="configure"> @@ -44,6 +49,10 @@ const widgetPropsDef = { type: "string" as const, default: "http://feeds.afpbb.com/rss/afpbb/afpbbnews", }, + height: { + type: "number" as const, + default: 300, + }, showHeader: { type: "boolean" as const, default: true, From a61054e3f51e0faa97336e5a05c935fc0a6ea001 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 18:49:12 -0400 Subject: [PATCH 182/309] fix: ad widget size --- packages/client/src/ui/universal.widgets.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/ui/universal.widgets.vue b/packages/client/src/ui/universal.widgets.vue index 5c5f2073a7..4a7a0d9e2e 100644 --- a/packages/client/src/ui/universal.widgets.vue +++ b/packages/client/src/ui/universal.widgets.vue @@ -91,7 +91,7 @@ function updateWidgets(widgets) { display: flex; flex-direction: column; - > * { + > :deep(*) { margin-top: var(--margin); width: 300px; From 88f435015d19bbc5e1d6a625fb2c0deff063bd5f Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 20:26:15 -0400 Subject: [PATCH 183/309] feat: ALT button (#9265) --- locales/en-US.yml | 1 + .../client/src/components/MkMediaImage.vue | 60 ++++++++++++------- .../client/src/components/MkMediaVideo.vue | 57 +++++++++++------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 03ec9284ba..e9580b9d51 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -941,6 +941,7 @@ deleteAccountConfirm: "This will irreversibly delete your account. Proceed?" incorrectPassword: "Incorrect password." voteConfirm: "Confirm your vote for \"{choice}\"?" hide: "Hide" +alt: "ALT" leaveGroup: "Leave group" leaveGroupConfirm: "Are you sure you want to leave \"{name}\"?" useDrawerReactionPickerForMobile: "Display reaction picker as drawer on mobile" diff --git a/packages/client/src/components/MkMediaImage.vue b/packages/client/src/components/MkMediaImage.vue index 9097a4771c..df2c75e14c 100644 --- a/packages/client/src/components/MkMediaImage.vue +++ b/packages/client/src/components/MkMediaImage.vue @@ -16,24 +16,33 @@ </div> </button> <div v-else class="gqnyydlz"> - <a :href="image.url" :title="image.name"> + <a :href="image.url"> <ImgWithBlurhash :hash="image.blurhash" :src="url" :alt="image.comment" :type="image.type" - :title="image.comment" :cover="false" /> <div v-if="image.type === 'image/gif'" class="gif">GIF</div> </a> - <button - v-tooltip="i18n.ts.hide" - class="_button hide" - @click="hide = true" - > - <i class="ph-eye-slash ph-bold ph-lg"></i> - </button> + <div class="buttons"> + <button + v-if="image.comment" + v-tooltip="i18n.ts.alt" + class="_button" + @click.stop="captionPopup" + > + <i class="ph-subtitles ph-bold ph-lg"></i> + </button> + <button + v-tooltip="i18n.ts.hide" + class="_button" + @click="hide = true" + > + <i class="ph-eye-slash ph-bold ph-lg"></i> + </button> + </div> </div> </template> @@ -44,6 +53,8 @@ import { getStaticImageUrl } from "@/scripts/get-static-image-url"; import ImgWithBlurhash from "@/components/MkImgWithBlurhash.vue"; import { defaultStore } from "@/store"; import { i18n } from "@/i18n"; +import * as os from "@/os"; + const props = defineProps<{ image: misskey.entities.DriveFile; @@ -59,6 +70,13 @@ const url = ? getStaticImageUrl(props.image.thumbnailUrl) : props.image.thumbnailUrl; +function captionPopup() { + os.alert({ + type: "info", + text: props.image.comment + }) +} + // Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする watch( () => props.image, @@ -110,22 +128,22 @@ watch( position: relative; background: var(--bg); - > .hide { - display: block; + > .buttons { + display: flex; + gap: 4px; position: absolute; border-radius: 6px; - background-color: var(--accentedBg); - -webkit-backdrop-filter: var(--blur, blur(15px)); - backdrop-filter: var(--blur, blur(15px)); - color: var(--accent); - font-size: 0.8em; - padding: 6px 8px; - text-align: center; + overflow: hidden; top: 12px; right: 12px; - - > i { - display: block; + > * { + background-color: var(--accentedBg); + -webkit-backdrop-filter: var(--blur, blur(15px)); + backdrop-filter: var(--blur, blur(15px)); + color: var(--accent); + font-size: 0.8em; + padding: 6px 8px; + text-align: center; } } diff --git a/packages/client/src/components/MkMediaVideo.vue b/packages/client/src/components/MkMediaVideo.vue index 21f8aceddf..f743b1359b 100644 --- a/packages/client/src/components/MkMediaVideo.vue +++ b/packages/client/src/components/MkMediaVideo.vue @@ -32,7 +32,6 @@ > <video :poster="video.thumbnailUrl" - :title="video.comment" :aria-label="video.comment" preload="none" controls @@ -41,13 +40,23 @@ <source :src="video.url" :type="video.type" /> </video> </VuePlyr> - <button - v-tooltip="i18n.ts.hide" - class="_button hide" - @click="hide = true" - > - <i class="ph-eye-slash ph-bold ph-lg"></i> - </button> + <div class="buttons"> + <button + v-if="video.comment" + v-tooltip="i18n.ts.alt" + class="_button" + @click.stop="captionPopup" + > + <i class="ph-subtitles ph-bold ph-lg"></i> + </button> + <button + v-tooltip="i18n.ts.hide" + class="_button" + @click="hide = true" + > + <i class="ph-eye-slash ph-bold ph-lg"></i> + </button> + </div> </div> </template> @@ -58,6 +67,7 @@ import type * as misskey from "calckey-js"; import { defaultStore } from "@/store"; import "vue-plyr/dist/vue-plyr.css"; import { i18n } from "@/i18n"; +import * as os from "@/os"; const props = defineProps<{ video: misskey.entities.DriveFile; @@ -72,6 +82,13 @@ const hide = ref( : props.video.isSensitive && defaultStore.state.nsfw !== "ignore" ); +function captionPopup() { + os.alert({ + type: "info", + text: props.video.comment + }) +} + onMounted(() => { mini.value = plyr.value.player.media.scrollWidth < 300; if (mini.value) { @@ -87,22 +104,22 @@ onMounted(() => { position: relative; --plyr-color-main: var(--accent); - > .hide { - display: block; + > .buttons { + display: flex; + gap: 4px; position: absolute; border-radius: 6px; - background-color: var(--accentedBg); - -webkit-backdrop-filter: var(--blur, blur(15px)); - backdrop-filter: var(--blur, blur(15px)); - color: var(--accent); - font-size: 0.8em; - padding: 6px 8px; - text-align: center; + overflow: hidden; top: 12px; right: 12px; - - > i { - display: block; + > * { + background-color: var(--accentedBg); + -webkit-backdrop-filter: var(--blur, blur(15px)); + backdrop-filter: var(--blur, blur(15px)); + color: var(--accent); + font-size: 0.8em; + padding: 6px 8px; + text-align: center; } } From f0ebd73a113b0c172b8aee298c4d185bceb4c265 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 25 Jun 2023 20:33:08 -0400 Subject: [PATCH 184/309] fix: prevent jump when new posts button appears --- packages/client/src/pages/timeline.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index b34ad78497..5d78fbeb14 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -351,6 +351,7 @@ onMounted(() => { width: 600px; max-width: 100%; height: 60px; + margin-top: -60px; pointer-events: none; margin-inline: auto; z-index: 90000; From 5e40afb4710aafa905e44d2bd5e70d398664715e Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Sun, 25 Jun 2023 07:42:33 +0000 Subject: [PATCH 185/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1806 of 1806 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 9a0427042f..9aabc2d46e 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -2031,11 +2031,12 @@ _auth: shareAccessAsk: Estàs segur que vols autoritzar aquesta aplicació per accedir al teu compte? shareAccess: Vols autoritzar "{name}" per accedir a aquest compte? - permissionAsk: Aquesta aplicació sol·licita els següents permisos + permissionAsk: 'Aquesta aplicació sol·licita els següents permisos:' callback: Tornant a l'aplicació denied: Accés denegat pleaseGoBack: Si us plau, torneu a l'aplicació - copyAsk: Posa el següent codi d'autorització a l'aplicació + copyAsk: "Posa el següent codi d'autorització a l'aplicació:" + allPermissions: Accés complet al compte _weekday: wednesday: Dimecres saturday: Dissabte From 4fdbf1c7127b450d61b8678222095820c1896e82 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Mon, 26 Jun 2023 07:47:56 -0400 Subject: [PATCH 186/309] fix: back from the future --- packages/backend/src/services/note/create.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index ba6859249d..defd9742e2 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -196,7 +196,13 @@ export default async ( data.channel = await Channels.findOneBy({ id: data.reply.channelId }); } - if (data.createdAt == null) data.createdAt = new Date(); + const now = new Date(); + if ( + !data.createdAt || + isNaN(data.createdAt.getTime()) || + data.createdAt > now + ) + data.createdAt = now; if (data.visibility == null) data.visibility = "public"; if (data.localOnly == null) data.localOnly = false; if (data.channel != null) data.visibility = "public"; From 674f243885f16dee00e167d93e58104e575bd27a Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Mon, 26 Jun 2023 12:56:47 -0400 Subject: [PATCH 187/309] fix: new posts button z-index + use darkened accent --- packages/client/src/pages/timeline.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index 5d78fbeb14..88c41d2831 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -354,13 +354,13 @@ onMounted(() => { margin-top: -60px; pointer-events: none; margin-inline: auto; - z-index: 90000; + z-index: 1001; box-shadow: 0 24px 24px -20px var(--accentedBg); &::after { content: ""; position: absolute; inset: 0; - border: 2px solid var(--accent); + border: 2px solid var(--accentDarken); mask: linear-gradient(to right, transparent,black 40% 60%,transparent); -webkit-mask: linear-gradient(to right, transparent,black 40% 60%,transparent); } From 371b6b784833d9f5187f1445f7d9d8c48e4d4f51 Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Mon, 26 Jun 2023 11:36:29 +0000 Subject: [PATCH 188/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1806 of 1806 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 9aabc2d46e..f63fee93b0 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -385,12 +385,13 @@ _cw: chars: '{count} caràcters' _visibility: followers: "Seguidors" - publicDescription: La teva publicació serà visible per a tots els usuaris + publicDescription: La teva publicació serà visible per a totes les línies de temps + públiques localOnly: Només Local specified: Directe home: Sense llistar homeDescription: Publica només a la línea de temps local - followersDescription: Fes visible només per als teus seguidors + followersDescription: Fes visible només per als teus seguidors i usuaris mencionats specifiedDescription: Fer visible només per a usuaris determinats public: Públic localOnlyDescription: No és visible per als usuaris remots From 03f0a7144b5db607411f84133786404aa7367266 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Mon, 26 Jun 2023 14:36:28 -0400 Subject: [PATCH 189/309] feat: toggle-able swiping --- locales/en-US.yml | 1 + packages/client/src/pages/settings/general.vue | 7 +++++++ packages/client/src/pages/timeline.vue | 7 +------ packages/client/src/store.ts | 4 ++++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index e9580b9d51..8897cc0e12 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1053,6 +1053,7 @@ recommendedInstancesDescription: "Recommended servers separated by line breaks t caption: "Auto Caption" splash: "Splash Screen" updateAvailable: "There might be an update available!" +swipeOnMobile: "Allow swiping between pages" swipeOnDesktop: "Allow mobile-style swiping on desktop" logoImageUrl: "Logo image URL" showAdminUpdates: "Indicate a new Calckey version is avaliable (admin only)" diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue index 36a4e2a13c..18afb3b9f5 100644 --- a/packages/client/src/pages/settings/general.vue +++ b/packages/client/src/pages/settings/general.vue @@ -45,6 +45,9 @@ class="_formBlock" >{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch > + <FormSwitch v-model="swipeOnMobile" class="_formBlock">{{ + i18n.ts.swipeOnMobile + }}</FormSwitch> <FormSwitch v-model="swipeOnDesktop" class="_formBlock">{{ i18n.ts.swipeOnDesktop }}</FormSwitch> @@ -339,6 +342,9 @@ const showUpdates = computed(defaultStore.makeGetterSetter("showUpdates")); const swipeOnDesktop = computed( defaultStore.makeGetterSetter("swipeOnDesktop") ); +const swipeOnMobile = computed( + defaultStore.makeGetterSetter("swipeOnMobile") +); const showAdminUpdates = computed( defaultStore.makeGetterSetter("showAdminUpdates") ); @@ -379,6 +385,7 @@ watch( overridedDeviceKind, showAds, showUpdates, + swipeOnMobile, swipeOnDesktop, seperateRenoteQuote, showAdminUpdates, diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index 88c41d2831..9a496c3c45 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -45,12 +45,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index e7be5135c5..044a983563 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -314,6 +314,10 @@ export const defaultStore = markRaw( where: "device", default: false, }, + swipeOnMobile: { + where: "device", + default: true, + }, showAdminUpdates: { where: "account", default: true, From 4d6d04a7865b9868ebb236774dc2a62579d88ee6 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Mon, 26 Jun 2023 15:39:59 -0400 Subject: [PATCH 190/309] chore: apply to all swipers --- packages/client/src/pages/about.vue | 7 +------ packages/client/src/pages/admin-file.vue | 7 +------ packages/client/src/pages/channels.vue | 7 +------ packages/client/src/pages/explore.vue | 7 +------ packages/client/src/pages/gallery/index.vue | 7 +------ packages/client/src/pages/instance-info.vue | 7 +------ packages/client/src/pages/messaging/index.vue | 7 +------ packages/client/src/pages/notifications.vue | 7 +------ packages/client/src/pages/pages.vue | 7 +------ packages/client/src/pages/search.vue | 7 +------ packages/client/src/pages/tag.vue | 7 +------ 11 files changed, 11 insertions(+), 66 deletions(-) diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue index 3e951c00b1..10dc4483ad 100644 --- a/packages/client/src/pages/about.vue +++ b/packages/client/src/pages/about.vue @@ -15,12 +15,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/admin-file.vue b/packages/client/src/pages/admin-file.vue index 63a8132861..1a0f8b4555 100644 --- a/packages/client/src/pages/admin-file.vue +++ b/packages/client/src/pages/admin-file.vue @@ -15,12 +15,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/channels.vue b/packages/client/src/pages/channels.vue index b79985bafb..ada861c463 100644 --- a/packages/client/src/pages/channels.vue +++ b/packages/client/src/pages/channels.vue @@ -18,12 +18,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/explore.vue b/packages/client/src/pages/explore.vue index 9202d78878..790d1e400c 100644 --- a/packages/client/src/pages/explore.vue +++ b/packages/client/src/pages/explore.vue @@ -16,12 +16,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/gallery/index.vue b/packages/client/src/pages/gallery/index.vue index 92fb22354b..66eb72f83e 100644 --- a/packages/client/src/pages/gallery/index.vue +++ b/packages/client/src/pages/gallery/index.vue @@ -16,12 +16,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/instance-info.vue b/packages/client/src/pages/instance-info.vue index 73c1051e1f..4d18961603 100644 --- a/packages/client/src/pages/instance-info.vue +++ b/packages/client/src/pages/instance-info.vue @@ -20,12 +20,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/messaging/index.vue b/packages/client/src/pages/messaging/index.vue index ba385e3958..f97aa6526a 100644 --- a/packages/client/src/pages/messaging/index.vue +++ b/packages/client/src/pages/messaging/index.vue @@ -16,12 +16,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/notifications.vue b/packages/client/src/pages/notifications.vue index bda42a8b4a..95bd3a0197 100644 --- a/packages/client/src/pages/notifications.vue +++ b/packages/client/src/pages/notifications.vue @@ -17,12 +17,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/pages.vue b/packages/client/src/pages/pages.vue index 1724ab27f0..9574ada76f 100644 --- a/packages/client/src/pages/pages.vue +++ b/packages/client/src/pages/pages.vue @@ -15,12 +15,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/search.vue b/packages/client/src/pages/search.vue index be09daebcf..29fe4a23c8 100644 --- a/packages/client/src/pages/search.vue +++ b/packages/client/src/pages/search.vue @@ -16,12 +16,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/tag.vue b/packages/client/src/pages/tag.vue index e5d8c674b1..2022fc7e20 100644 --- a/packages/client/src/pages/tag.vue +++ b/packages/client/src/pages/tag.vue @@ -16,12 +16,7 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) - " + :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" @swiper="setSwiperRef" @slide-change="onSlideChange" > From e17497e6687b95c26ecbcb40428e5bf86d04b194 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Mon, 26 Jun 2023 15:47:05 -0400 Subject: [PATCH 191/309] chore: format --- .../client/src/components/MkMediaImage.vue | 5 ++- .../client/src/components/MkMediaVideo.vue | 4 +-- .../src/components/MkVisibilityPicker.vue | 2 +- packages/client/src/pages/about.vue | 6 +++- packages/client/src/pages/admin-file.vue | 6 +++- packages/client/src/pages/channels.vue | 6 +++- packages/client/src/pages/explore.vue | 6 +++- packages/client/src/pages/gallery/index.vue | 6 +++- packages/client/src/pages/instance-info.vue | 6 +++- packages/client/src/pages/messaging/index.vue | 6 +++- packages/client/src/pages/notifications.vue | 6 +++- packages/client/src/pages/pages.vue | 6 +++- packages/client/src/pages/search.vue | 6 +++- .../client/src/pages/settings/general.vue | 4 +-- .../client/src/pages/settings/reaction.vue | 2 +- packages/client/src/pages/tag.vue | 6 +++- packages/client/src/pages/timeline.vue | 34 +++++++++++++------ packages/client/src/widgets/rss.vue | 4 +-- 18 files changed, 88 insertions(+), 33 deletions(-) diff --git a/packages/client/src/components/MkMediaImage.vue b/packages/client/src/components/MkMediaImage.vue index df2c75e14c..cbd5c0515e 100644 --- a/packages/client/src/components/MkMediaImage.vue +++ b/packages/client/src/components/MkMediaImage.vue @@ -55,7 +55,6 @@ import { defaultStore } from "@/store"; import { i18n } from "@/i18n"; import * as os from "@/os"; - const props = defineProps<{ image: misskey.entities.DriveFile; raw?: boolean; @@ -73,8 +72,8 @@ const url = function captionPopup() { os.alert({ type: "info", - text: props.image.comment - }) + text: props.image.comment, + }); } // Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする diff --git a/packages/client/src/components/MkMediaVideo.vue b/packages/client/src/components/MkMediaVideo.vue index f743b1359b..53dc6a8ab8 100644 --- a/packages/client/src/components/MkMediaVideo.vue +++ b/packages/client/src/components/MkMediaVideo.vue @@ -85,8 +85,8 @@ const hide = ref( function captionPopup() { os.alert({ type: "info", - text: props.video.comment - }) + text: props.video.comment, + }); } onMounted(() => { diff --git a/packages/client/src/components/MkVisibilityPicker.vue b/packages/client/src/components/MkVisibilityPicker.vue index d724f94b70..ce51f851e4 100644 --- a/packages/client/src/components/MkVisibilityPicker.vue +++ b/packages/client/src/components/MkVisibilityPicker.vue @@ -225,7 +225,7 @@ function choose(visibility: (typeof misskey.noteVisibilities)[number]): void { } .itemDescription { - opacity: .6; + opacity: 0.6; display: block; line-height: 1.5; } diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue index 10dc4483ad..9234273a65 100644 --- a/packages/client/src/pages/about.vue +++ b/packages/client/src/pages/about.vue @@ -15,7 +15,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/admin-file.vue b/packages/client/src/pages/admin-file.vue index 1a0f8b4555..de47377043 100644 --- a/packages/client/src/pages/admin-file.vue +++ b/packages/client/src/pages/admin-file.vue @@ -15,7 +15,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/channels.vue b/packages/client/src/pages/channels.vue index ada861c463..c871655b67 100644 --- a/packages/client/src/pages/channels.vue +++ b/packages/client/src/pages/channels.vue @@ -18,7 +18,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/explore.vue b/packages/client/src/pages/explore.vue index 790d1e400c..b23998c417 100644 --- a/packages/client/src/pages/explore.vue +++ b/packages/client/src/pages/explore.vue @@ -16,7 +16,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/gallery/index.vue b/packages/client/src/pages/gallery/index.vue index 66eb72f83e..aa9141acc7 100644 --- a/packages/client/src/pages/gallery/index.vue +++ b/packages/client/src/pages/gallery/index.vue @@ -16,7 +16,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/instance-info.vue b/packages/client/src/pages/instance-info.vue index 4d18961603..111717459d 100644 --- a/packages/client/src/pages/instance-info.vue +++ b/packages/client/src/pages/instance-info.vue @@ -20,7 +20,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/messaging/index.vue b/packages/client/src/pages/messaging/index.vue index f97aa6526a..0e3ea6e42a 100644 --- a/packages/client/src/pages/messaging/index.vue +++ b/packages/client/src/pages/messaging/index.vue @@ -16,7 +16,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/notifications.vue b/packages/client/src/pages/notifications.vue index 95bd3a0197..37548c9802 100644 --- a/packages/client/src/pages/notifications.vue +++ b/packages/client/src/pages/notifications.vue @@ -17,7 +17,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/pages.vue b/packages/client/src/pages/pages.vue index 9574ada76f..36fd6c0d76 100644 --- a/packages/client/src/pages/pages.vue +++ b/packages/client/src/pages/pages.vue @@ -15,7 +15,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/search.vue b/packages/client/src/pages/search.vue index 29fe4a23c8..4604c69f76 100644 --- a/packages/client/src/pages/search.vue +++ b/packages/client/src/pages/search.vue @@ -16,7 +16,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue index 18afb3b9f5..6a9af2412b 100644 --- a/packages/client/src/pages/settings/general.vue +++ b/packages/client/src/pages/settings/general.vue @@ -342,9 +342,7 @@ const showUpdates = computed(defaultStore.makeGetterSetter("showUpdates")); const swipeOnDesktop = computed( defaultStore.makeGetterSetter("swipeOnDesktop") ); -const swipeOnMobile = computed( - defaultStore.makeGetterSetter("swipeOnMobile") -); +const swipeOnMobile = computed(defaultStore.makeGetterSetter("swipeOnMobile")); const showAdminUpdates = computed( defaultStore.makeGetterSetter("showAdminUpdates") ); diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue index 65abaaa765..b8ee2d4889 100644 --- a/packages/client/src/pages/settings/reaction.vue +++ b/packages/client/src/pages/settings/reaction.vue @@ -240,7 +240,7 @@ watch(enableEmojiReactions, async () => { watch(reactionPickerSkinTone, async () => { await reloadAsk(); -}) +}); const headerActions = $computed(() => []); diff --git a/packages/client/src/pages/tag.vue b/packages/client/src/pages/tag.vue index 2022fc7e20..ce353457d0 100644 --- a/packages/client/src/pages/tag.vue +++ b/packages/client/src/pages/tag.vue @@ -16,7 +16,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index 9a496c3c45..3b3a08c0ab 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -17,8 +17,8 @@ /> <div v-if="queue > 0" class="new"> - <button - class="_buttonPrimary _shadow" + <button + class="_buttonPrimary _shadow" @click="top()" :class="{ instant: !$store.state.animation }" > @@ -45,7 +45,11 @@ :modules="[Virtual]" :space-between="20" :virtual="true" - :allow-touch-move="defaultStore.state.swipeOnMobile && ( deviceKind !== 'desktop' || defaultStore.state.swipeOnDesktop )" + :allow-touch-move=" + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) + " @swiper="setSwiperRef" @slide-change="onSlideChange" > @@ -356,8 +360,18 @@ onMounted(() => { position: absolute; inset: 0; border: 2px solid var(--accentDarken); - mask: linear-gradient(to right, transparent,black 40% 60%,transparent); - -webkit-mask: linear-gradient(to right, transparent,black 40% 60%,transparent); + mask: linear-gradient( + to right, + transparent, + black 40% 60%, + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 40% 60%, + transparent + ); } > button { display: flex; @@ -365,7 +379,7 @@ onMounted(() => { top: 120%; margin-inline: auto; border-radius: 2em; - padding: .5em 1.2em; + padding: 0.5em 1.2em; background: var(--accentedBg); border: 0; color: var(--accent); @@ -373,8 +387,8 @@ onMounted(() => { pointer-events: all; transform: translateY(-100%); opacity: 0; - animation: reset .4s forwards cubic-bezier(0,.4,0,1.1), - slideUp 1s 5s forwards cubic-bezier(1,0,1,1); + animation: reset 0.4s forwards cubic-bezier(0, 0.4, 0, 1.1), + slideUp 1s 5s forwards cubic-bezier(1, 0, 1, 1); &::before { content: ""; position: absolute; @@ -383,9 +397,9 @@ onMounted(() => { z-index: -1; } i { - margin-left: .7em; + margin-left: 0.7em; border-left: 1px solid var(--accentedBg); - padding-left: .4em; + padding-left: 0.4em; } } } diff --git a/packages/client/src/widgets/rss.vue b/packages/client/src/widgets/rss.vue index a37e32e8da..d28f1bf323 100644 --- a/packages/client/src/widgets/rss.vue +++ b/packages/client/src/widgets/rss.vue @@ -1,7 +1,7 @@ <template> - <MkContainer + <MkContainer :show-header="widgetProps.showHeader" - class="mkw-rss" + class="mkw-rss" :scrollable="true" :style="`height: ${widgetProps.height}px;`" > From d740c9fc61f8e0e7aee99e244d335db31c08de25 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 26 Jun 2023 14:49:55 -0700 Subject: [PATCH 192/309] fix: :bug: apply skin tone to default reactions, aria labels for tone picker --- locales/en-US.yml | 8 +++++++- .../src/components/MkEmojiPicker.section.vue | 10 +++++++++- .../client/src/components/MkEmojiPicker.vue | 20 ++++++++++++++++++- .../client/src/pages/settings/reaction.vue | 18 ++++++++++------- packages/client/src/scripts/emojilist.ts | 9 --------- 5 files changed, 46 insertions(+), 19 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 03ec9284ba..eb4ad495a1 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -2073,7 +2073,13 @@ _experiments: postImportsCaption: "Allows users to import their posts from past Calckey,\ \ Misskey, Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during\ \ load if your queue is bottlenecked." - _dialog: charactersExceeded: "Max characters exceeded! Current: {current}/Limit: {max}" charactersBelow: "Not enough characters! Current: {current}/Limit: {min}" +_skinTones: + yellow: "Yellow" + light: "Light" + mediumLight: "Medium Light" + medium: "Medium" + mediumDark: "Medium Dark" + dark: "Dark" diff --git a/packages/client/src/components/MkEmojiPicker.section.vue b/packages/client/src/components/MkEmojiPicker.section.vue index c6052c60ee..1a9bccb149 100644 --- a/packages/client/src/components/MkEmojiPicker.section.vue +++ b/packages/client/src/components/MkEmojiPicker.section.vue @@ -22,7 +22,14 @@ > <i class="ph-circle ph-fill ph-fw ph-lg" - :style="{ color: skinTone + '!important' }" + :style="{ color: skinTone + ' !important' }" + :aria-label=" + props.skinToneLabels + ? props.skinToneLabels[ + props.skinTones.indexOf(skinTone) + ] + : '' + " ></i> </button> </span> @@ -49,6 +56,7 @@ const props = defineProps<{ initialShown?: boolean; skinToneSelector?: boolean; skinTones?: string[]; + skinToneLabels?: string[]; }>(); const localEmojis = ref([...props.emojis]); diff --git a/packages/client/src/components/MkEmojiPicker.vue b/packages/client/src/components/MkEmojiPicker.vue index 260898e6e6..88eaf3eedd 100644 --- a/packages/client/src/components/MkEmojiPicker.vue +++ b/packages/client/src/components/MkEmojiPicker.vue @@ -115,6 +115,7 @@ :key="category" :skin-tone-selector="category === 'people'" :skin-tones="unicodeEmojiSkinTones" + :skin-tone-labels="unicodeEmojiSkinToneLabels" :emojis=" emojilist .filter((e) => e.category === category) @@ -168,7 +169,6 @@ import XSection from "@/components/MkEmojiPicker.section.vue"; import { emojilist, unicodeEmojiCategories, - unicodeEmojiSkinTones, UnicodeEmojiDef, getNicelyLabeledCategory, } from "@/scripts/emojilist"; @@ -210,6 +210,24 @@ const { recentlyUsedEmojis, } = defaultStore.reactiveState; +const unicodeEmojiSkinTones = [ + "#FFDC5E", + "#F7DFCF", + "#F3D3A3", + "#D6AE89", + "#B17F56", + "#7D523C", +]; + +const unicodeEmojiSkinToneLabels = [ + i18n.ts._skinTones.yellow, + i18n.ts._skinTones.light, + i18n.ts._skinTones.mediumLight, + i18n.ts._skinTones.medium, + i18n.ts._skinTones.mediumDark, + i18n.ts._skinTones.dark, +]; + const size = computed(() => props.asReactionPicker ? reactionPickerSize.value : 1 ); diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue index 65abaaa765..60f1ee03d0 100644 --- a/packages/client/src/pages/settings/reaction.vue +++ b/packages/client/src/pages/settings/reaction.vue @@ -47,22 +47,22 @@ <FormRadios v-model="reactionPickerSkinTone" class="_formBlock"> <template #label>{{ i18n.ts.reactionPickerSkinTone }}</template> - <option :value="1"> + <option :value="1" :aria-label="i18n.ts._skinTones.yellow"> <MkEmoji style="height: 1.7em" emoji="✌️" /> </option> - <option :value="6"> + <option :value="6" :aria-label="i18n.ts._skinTones.dark"> <MkEmoji style="height: 1.7em" emoji="✌🏿" /> </option> - <option :value="5"> + <option :value="5" :aria-label="i18n.ts._skinTones.mediumDark"> <MkEmoji style="height: 1.7em" emoji="✌🏾" /> </option> - <option :value="4"> + <option :value="4" :aria-label="i18n.ts._skinTones.medium"> <MkEmoji style="height: 1.7em" emoji="✌🏽" /> </option> - <option :value="3"> + <option :value="3" :aria-label="i18n.ts._skinTones.mediumLight"> <MkEmoji style="height: 1.7em" emoji="✌🏼" /> </option> - <option :value="2"> + <option :value="2" :aria-label="i18n.ts._skinTones.light"> <MkEmoji style="height: 1.7em" emoji="✌🏻" /> </option> </FormRadios> @@ -137,6 +137,7 @@ import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; import { deepClone } from "@/scripts/clone"; import { unisonReload } from "@/scripts/unison-reload"; +import {addSkinTone } from "@/scripts/emojilist"; async function reloadAsk() { const { canceled } = await os.confirm({ @@ -239,8 +240,11 @@ watch(enableEmojiReactions, async () => { }); watch(reactionPickerSkinTone, async () => { + reactions.forEach((emoji) => { + addSkinTone(emoji, reactionPickerSkinTone.value); + }); await reloadAsk(); -}) +}); const headerActions = $computed(() => []); diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 5ae8bce3bd..6620635882 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -35,15 +35,6 @@ export const categoryMapping = { Flags: "flags", } as const; -export const unicodeEmojiSkinTones = [ - "#FFDC5E", - "#F7DFCF", - "#F3D3A3", - "#D6AE89", - "#B17F56", - "#7D523C", -]; - export function addSkinTone(emoji: string, skinTone?: number) { const individualData = import("unicode-emoji-json/data-by-emoji.json"); From 7575a04a5ff10bf8402e2fdbd1b2427afbc29299 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 26 Jun 2023 14:51:45 -0700 Subject: [PATCH 193/309] chore: :art: format --- .../client/src/components/MkMediaImage.vue | 5 ++-- .../client/src/components/MkMediaVideo.vue | 4 +-- .../src/components/MkVisibilityPicker.vue | 2 +- .../client/src/pages/settings/reaction.vue | 2 +- packages/client/src/pages/timeline.vue | 28 +++++++++++++------ packages/client/src/widgets/rss.vue | 4 +-- 6 files changed, 27 insertions(+), 18 deletions(-) diff --git a/packages/client/src/components/MkMediaImage.vue b/packages/client/src/components/MkMediaImage.vue index df2c75e14c..cbd5c0515e 100644 --- a/packages/client/src/components/MkMediaImage.vue +++ b/packages/client/src/components/MkMediaImage.vue @@ -55,7 +55,6 @@ import { defaultStore } from "@/store"; import { i18n } from "@/i18n"; import * as os from "@/os"; - const props = defineProps<{ image: misskey.entities.DriveFile; raw?: boolean; @@ -73,8 +72,8 @@ const url = function captionPopup() { os.alert({ type: "info", - text: props.image.comment - }) + text: props.image.comment, + }); } // Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする diff --git a/packages/client/src/components/MkMediaVideo.vue b/packages/client/src/components/MkMediaVideo.vue index f743b1359b..53dc6a8ab8 100644 --- a/packages/client/src/components/MkMediaVideo.vue +++ b/packages/client/src/components/MkMediaVideo.vue @@ -85,8 +85,8 @@ const hide = ref( function captionPopup() { os.alert({ type: "info", - text: props.video.comment - }) + text: props.video.comment, + }); } onMounted(() => { diff --git a/packages/client/src/components/MkVisibilityPicker.vue b/packages/client/src/components/MkVisibilityPicker.vue index d724f94b70..ce51f851e4 100644 --- a/packages/client/src/components/MkVisibilityPicker.vue +++ b/packages/client/src/components/MkVisibilityPicker.vue @@ -225,7 +225,7 @@ function choose(visibility: (typeof misskey.noteVisibilities)[number]): void { } .itemDescription { - opacity: .6; + opacity: 0.6; display: block; line-height: 1.5; } diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue index 60f1ee03d0..9f6d264079 100644 --- a/packages/client/src/pages/settings/reaction.vue +++ b/packages/client/src/pages/settings/reaction.vue @@ -137,7 +137,7 @@ import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; import { deepClone } from "@/scripts/clone"; import { unisonReload } from "@/scripts/unison-reload"; -import {addSkinTone } from "@/scripts/emojilist"; +import { addSkinTone } from "@/scripts/emojilist"; async function reloadAsk() { const { canceled } = await os.confirm({ diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index 88c41d2831..91c92c9bea 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -17,8 +17,8 @@ /> <div v-if="queue > 0" class="new"> - <button - class="_buttonPrimary _shadow" + <button + class="_buttonPrimary _shadow" @click="top()" :class="{ instant: !$store.state.animation }" > @@ -361,8 +361,18 @@ onMounted(() => { position: absolute; inset: 0; border: 2px solid var(--accentDarken); - mask: linear-gradient(to right, transparent,black 40% 60%,transparent); - -webkit-mask: linear-gradient(to right, transparent,black 40% 60%,transparent); + mask: linear-gradient( + to right, + transparent, + black 40% 60%, + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 40% 60%, + transparent + ); } > button { display: flex; @@ -370,7 +380,7 @@ onMounted(() => { top: 120%; margin-inline: auto; border-radius: 2em; - padding: .5em 1.2em; + padding: 0.5em 1.2em; background: var(--accentedBg); border: 0; color: var(--accent); @@ -378,8 +388,8 @@ onMounted(() => { pointer-events: all; transform: translateY(-100%); opacity: 0; - animation: reset .4s forwards cubic-bezier(0,.4,0,1.1), - slideUp 1s 5s forwards cubic-bezier(1,0,1,1); + animation: reset 0.4s forwards cubic-bezier(0, 0.4, 0, 1.1), + slideUp 1s 5s forwards cubic-bezier(1, 0, 1, 1); &::before { content: ""; position: absolute; @@ -388,9 +398,9 @@ onMounted(() => { z-index: -1; } i { - margin-left: .7em; + margin-left: 0.7em; border-left: 1px solid var(--accentedBg); - padding-left: .4em; + padding-left: 0.4em; } } } diff --git a/packages/client/src/widgets/rss.vue b/packages/client/src/widgets/rss.vue index a37e32e8da..d28f1bf323 100644 --- a/packages/client/src/widgets/rss.vue +++ b/packages/client/src/widgets/rss.vue @@ -1,7 +1,7 @@ <template> - <MkContainer + <MkContainer :show-header="widgetProps.showHeader" - class="mkw-rss" + class="mkw-rss" :scrollable="true" :style="`height: ${widgetProps.height}px;`" > From 7198c1d5eb02a92b662931d2bc2694226be6bfe6 Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Mon, 26 Jun 2023 17:22:19 +0000 Subject: [PATCH 194/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1807 of 1807 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index f63fee93b0..455a091306 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -2134,3 +2134,4 @@ _dialog: charactersBelow: 'No hi ha caràcters suficients! Corrent: {current}/Limit: {min}' removeReaction: Elimina la teva reacció reactionPickerSkinTone: To de pell d'emoji preferit +alt: ALT From 3df3c97deb284ecbf3363b90a45c6501957d1e98 Mon Sep 17 00:00:00 2001 From: Ashex <ashex@codeberg.org> Date: Mon, 26 Jun 2023 14:54:16 -0700 Subject: [PATCH 195/309] =?UTF-8?q?fix:=20=F0=9F=90=9B=20support=20for=20S?= =?UTF-8?q?SL=20data=20when=20loading=20redis=20and=20postgres=20configs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #10366 --- packages/backend/ormconfig.js | 4 ++++ packages/backend/src/db/postgre.ts | 9 +++++++++ packages/backend/src/db/redis.ts | 5 +++++ packages/backend/src/queue/initialize.ts | 4 ++++ 4 files changed, 22 insertions(+) diff --git a/packages/backend/ormconfig.js b/packages/backend/ormconfig.js index 5f85cead8a..c230e09fd5 100644 --- a/packages/backend/ormconfig.js +++ b/packages/backend/ormconfig.js @@ -12,4 +12,8 @@ export default new DataSource({ extra: config.db.extra, entities: entities, migrations: ["migration/*.js"], + ssl: { + rejectUnauthorized: false, + ca: process.env.DB_SSL_CERT, + }, }); diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 0fa5fdff67..85c4e424aa 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -207,9 +207,14 @@ export const db = new DataSource({ host: config.redis.host, port: config.redis.port, family: config.redis.family == null ? 0 : config.redis.family, + user: "default", password: config.redis.pass, keyPrefix: `${config.redis.prefix}:query:`, db: config.redis.db || 0, + tls: { + host: config.redis.host, + rejectUnauthorized: false, + }, }, } : false, @@ -218,6 +223,10 @@ export const db = new DataSource({ maxQueryExecutionTime: 300, entities: entities, migrations: ["../../migration/*.js"], + ssl: { + rejectUnauthorized: false, + ca: process.env.DB_SSL_CERT, + }, }); export async function initDb(force = false) { diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index 6ad3de386f..0a88a0deb4 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -7,8 +7,13 @@ export function createConnection() { host: config.redis.host, family: config.redis.family == null ? 0 : config.redis.family, password: config.redis.pass, + username: "default", keyPrefix: `${config.redis.prefix}:`, db: config.redis.db || 0, + tls: { + rejectUnauthorized: false, + host: config.redis.host, + }, }); } diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts index 0686fe9cd3..4d7facd136 100644 --- a/packages/backend/src/queue/initialize.ts +++ b/packages/backend/src/queue/initialize.ts @@ -7,8 +7,12 @@ export function initialize<T>(name: string, limitPerSec = -1) { port: config.redis.port, host: config.redis.host, family: config.redis.family == null ? 0 : config.redis.family, + user: "default", password: config.redis.pass, db: config.redis.db || 0, + tls: { + host: config.redis.host, + }, }, prefix: config.redis.prefix ? `${config.redis.prefix}:queue` : "queue", limiter: From d96877033be9790d11b0212ab8825f93202d22a2 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 26 Jun 2023 15:02:54 -0700 Subject: [PATCH 196/309] refactor: :wrench: allow redis user to be configured Follow up #10366, 3df3c97deb284ecbf3363b90a45c6501957d1e98 --- .config/example.yml | 1 + chart/templates/_helpers.tpl | 1 + packages/backend/src/config/types.ts | 1 + packages/backend/src/db/redis.ts | 4 ++-- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index 16fa67142e..ee61ebe25c 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -60,6 +60,7 @@ redis: #pass: example-pass #prefix: example-prefix #db: 1 + #user: default # Please configure either MeiliSearch *or* Sonic. # If both MeiliSearch and Sonic configurations are present, MeiliSearch will take precedence. diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl index b732fa5a4b..62ff2f8ff0 100644 --- a/chart/templates/_helpers.tpl +++ b/chart/templates/_helpers.tpl @@ -153,6 +153,7 @@ redis: pass: {{ .Values.redis.auth.password | quote }} #prefix: example-prefix #db: 1 + #user: default # ┌─────────────────────┐ #───┘ Sonic configuration └───────────────────────────────────── diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 54332c9932..e9d1dbb645 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -23,6 +23,7 @@ export type Source = { pass: string; db?: number; prefix?: string; + user?: string; }; elasticsearch: { host: string; diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index 0a88a0deb4..a54bad2e7a 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -5,9 +5,9 @@ export function createConnection() { return new Redis({ port: config.redis.port, host: config.redis.host, - family: config.redis.family == null ? 0 : config.redis.family, + family: config.redis.family ?? 0, password: config.redis.pass, - username: "default", + username: config.redis.user ?? "default", keyPrefix: `${config.redis.prefix}:`, db: config.redis.db || 0, tls: { From e53d1f6bdc6fbb8da2d0b75c1b294708e7244058 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 26 Jun 2023 15:06:32 -0700 Subject: [PATCH 197/309] fix: :adhesive_bandage: use redis user for bull and postgres cache interface Follow up #10366, d96877033be9790d11b0212ab8825f93202d22a2 --- packages/backend/src/db/postgre.ts | 2 +- packages/backend/src/queue/initialize.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 85c4e424aa..0a0802a3a8 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -207,7 +207,7 @@ export const db = new DataSource({ host: config.redis.host, port: config.redis.port, family: config.redis.family == null ? 0 : config.redis.family, - user: "default", + user: config.redis.user ?? "default", password: config.redis.pass, keyPrefix: `${config.redis.prefix}:query:`, db: config.redis.db || 0, diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts index 4d7facd136..5d96f7747d 100644 --- a/packages/backend/src/queue/initialize.ts +++ b/packages/backend/src/queue/initialize.ts @@ -7,7 +7,7 @@ export function initialize<T>(name: string, limitPerSec = -1) { port: config.redis.port, host: config.redis.host, family: config.redis.family == null ? 0 : config.redis.family, - user: "default", + user: config.redis.user ?? "default", password: config.redis.pass, db: config.redis.db || 0, tls: { From 8cb5f581a805367513ff88748efc5df047e1726e Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Mon, 26 Jun 2023 21:50:02 -0400 Subject: [PATCH 198/309] fix: only show option based on device + add option to backups --- packages/client/src/pages/settings/general.vue | 9 +++++++-- .../client/src/pages/settings/preferences-backups.vue | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue index 6a9af2412b..0add2b9df9 100644 --- a/packages/client/src/pages/settings/general.vue +++ b/packages/client/src/pages/settings/general.vue @@ -45,10 +45,10 @@ class="_formBlock" >{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch > - <FormSwitch v-model="swipeOnMobile" class="_formBlock">{{ + <FormSwitch v-if="deviceKind !== 'desktop'" v-model="swipeOnMobile" class="_formBlock">{{ i18n.ts.swipeOnMobile }}</FormSwitch> - <FormSwitch v-model="swipeOnDesktop" class="_formBlock">{{ + <FormSwitch v-if="deviceKind === 'desktop'" v-model="swipeOnDesktop" class="_formBlock">{{ i18n.ts.swipeOnDesktop }}</FormSwitch> <FormSwitch v-model="enterSendsMessage" class="_formBlock">{{ @@ -256,6 +256,7 @@ import * as os from "@/os"; import { unisonReload } from "@/scripts/unison-reload"; import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; +import { deviceKind } from "@/scripts/device-kind"; const lang = ref(localStorage.getItem("lang")); const fontSize = ref(localStorage.getItem("fontSize")); @@ -350,6 +351,10 @@ const showTimelineReplies = computed( defaultStore.makeGetterSetter("showTimelineReplies") ); +watch(swipeOnDesktop, () => { + defaultStore.set("swipeOnMobile", true); +}); + watch(lang, () => { localStorage.setItem("lang", lang.value as string); localStorage.removeItem("locale"); diff --git a/packages/client/src/pages/settings/preferences-backups.vue b/packages/client/src/pages/settings/preferences-backups.vue index 313024d869..15fd804bf9 100644 --- a/packages/client/src/pages/settings/preferences-backups.vue +++ b/packages/client/src/pages/settings/preferences-backups.vue @@ -110,6 +110,7 @@ const defaultStoreSaveKeys: (keyof (typeof defaultStore)["state"])[] = [ "squareAvatars", "numberOfPageCache", "showUpdates", + "swipeOnMobile", "swipeOnDesktop", "showAdminUpdates", "enableCustomKaTeXMacro", From 5df6c2c8193b17ddec9b240afbf9567c8f29c2dd Mon Sep 17 00:00:00 2001 From: Pointify <pointy-other.on2g4@simplelogin.com> Date: Mon, 26 Jun 2023 22:56:28 +0000 Subject: [PATCH 199/309] chore: Translated using Weblate (Spanish) Currently translated at 87.2% (1582 of 1813 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ --- locales/es-ES.yml | 510 ++++++++++++++++++++++++---------------------- 1 file changed, 262 insertions(+), 248 deletions(-) diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 6d1d88ffe2..0bd874f331 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -1,8 +1,8 @@ _lang_: "Español" -headlineMisskey: "¡Un proyecto de código abierto y una plataforma de medios de comunicación\ - \ descentralizada que es gratis para siempre! \U0001F680" -introMisskey: "¡Bienvenido! ¡Calckey es un proyecto de código abierto, plataforma\ - \ descentralizado medios de comunicación social que es gratis para siempre! \U0001F680" +headlineMisskey: "¡Un proyecto de código abierto y una plataforma de medios de comunicación + descentralizada que es gratis para siempre! 🚀" +introMisskey: "¡Bienvenido! ¡Calckey es un proyecto de código abierto, plataforma + descentralizado medios de comunicación social que es gratis para siempre! 🚀" monthAndDay: "{day}/{month}" search: "Buscar" notifications: "Notificaciones" @@ -17,7 +17,7 @@ enterUsername: "Introduce el nombre de usuario" renotedBy: "Impulsado por {user}" noNotes: "No hay publicaciones" noNotifications: "No hay notificaciones" -instance: "Instancia" +instance: "Servidor" settings: "Configuración" basicSettings: "Configuración Básica" otherSettings: "Configuración avanzada" @@ -45,8 +45,8 @@ copyContent: "Copiar contenido" copyLink: "Copiar enlace" delete: "Borrar" deleteAndEdit: "Borrar y editar" -deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta publicación y editarla?\ - \ Perderás todas las reacciones, impulsos y respuestas." +deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta publicación y editarla? + Perderás todas las reacciones, impulsos y respuestas." addToList: "Agregar a lista" sendMessage: "Enviar un mensaje" copyUsername: "Copiar nombre de usuario" @@ -66,11 +66,11 @@ import: "Importar" export: "Exportar" files: "Archivos" download: "Descargar" -driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Las publicaciones que\ - \ tengan este archivo como adjunto serán eliminadas." +driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Será removido de todas + las publicaciones que tengan este archivo adjunto." unfollowConfirm: "¿Desea dejar de seguir a {name}?" -exportRequested: "Se ha solicitado la exportación. Puede tomar un tiempo. Cuando termine\ - \ la exportación, se añadirá en el drive." +exportRequested: "Se ha solicitado la exportación. Puede tomar un tiempo. Cuando termine + la exportación, se añadirá en el drive." importRequested: "Se ha solicitado la importación. Puede tomar un tiempo." lists: "Listas" noLists: "No tiene listas" @@ -85,11 +85,11 @@ error: "Error" somethingHappened: "Ocurrió un error" retry: "Reintentar" pageLoadError: "Error al cargar la página." -pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador.\ - \ Por favor limpie el caché o intente más tarde." +pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador. + Por favor limpie el caché o intente más tarde." serverIsDead: "No hay respuesta del servidor. Espere un momento y vuelva a intentarlo." -youShouldUpgradeClient: "Para ver esta página, por favor refrezca el navegador y utiliza\ - \ una versión más reciente del cliente." +youShouldUpgradeClient: "Para ver esta página, por favor refrezca el navegador y utiliza + una versión más reciente del cliente." enterListName: "Ingrese nombre de lista" privacy: "Privacidad" makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento" @@ -114,8 +114,8 @@ sensitive: "Marcado como sensible" add: "Agregar" reaction: "Reacción" reactionSetting: "Reacciones para mostrar en el menú de reacciones" -reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete\ - \ la tecla + para añadir." +reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete + la tecla + para añadir." rememberNoteVisibility: "Recordar la configuración de visibilidad de la publicación" attachCancel: "Quitar adjunto" markAsSensitive: "Marcar como sensible" @@ -144,24 +144,24 @@ emojiUrl: "URL de la imágen del emoji" addEmoji: "Agregar emoji" settingGuide: "Configuración sugerida" cacheRemoteFiles: "Mantener en cache los archivos remotos" -cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos\ - \ se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar\ - \ almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas." +cacheRemoteFilesDescription: "Si desactiva esta configuración, los archivos remotos + se cargarán desde el servidor remoto sin usar la caché. Con eso se puede ahorrar + almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas." flagAsBot: "Esta cuenta es un bot" -flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active\ - \ esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar\ - \ cadenas infinitas de reacciones, y ajustará los sistemas internos de Calckey para\ - \ que trate a esta cuenta como un bot." +flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active + esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar + cadenas infinitas de reacciones, y ajustará los sistemas internos de Calckey para + que trate a esta cuenta como un bot." flagAsCat: "Esta cuenta es un gato" flagAsCatDescription: "Vas a tener orejas de gato y hablar como un gato!" flagShowTimelineReplies: "Mostrar respuestas a las notas en la biografía" -flagShowTimelineRepliesDescription: "Cuando se marca, la línea de tiempo muestra respuestas\ - \ a otras publicaciones además de las publicaciones del usuario." -autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los\ - \ usuarios que sigues" +flagShowTimelineRepliesDescription: "Cuando se marca, la línea de tiempo muestra respuestas + a otras publicaciones además de las publicaciones del usuario." +autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los + usuarios que sigues" addAccount: "Agregar Cuenta" loginFailed: "Error al iniciar sesión" -showOnRemote: "Ver en una instancia remota" +showOnRemote: "Ver en servidor remoto" general: "General" wallpaper: "Fondo de pantalla" setWallpaper: "Establecer fondo de pantalla" @@ -170,17 +170,17 @@ searchWith: "Buscar: {q}" youHaveNoLists: "No tienes listas" followConfirm: "¿Desea seguir a {name}?" proxyAccount: "Cuenta proxy" -proxyAccountDescription: "Una cuenta proxy es una cuenta que actúa como un seguidor\ - \ remoto de un usuario bajo ciertas condiciones. Por ejemplo, cuando un usuario\ - \ añade un usuario remoto a una lista, si ningún usuario local sigue al usuario\ - \ agregado a la lista, la instancia no puede obtener su actividad. Así que la cuenta\ - \ proxy sigue al usuario añadido a la lista." +proxyAccountDescription: "Una cuenta proxy es una cuenta que actúa como un seguidor + remoto de un usuario bajo ciertas condiciones. Por ejemplo, cuando un usuario añade + un usuario remoto a una lista, si ningún usuario local sigue al usuario agregado + a la lista, el servidor no puede obtener su actividad. Así que la cuenta proxy sigue + al usuario añadido a la lista." host: "Host" selectUser: "Elegir usuario" recipient: "Recipiente" annotation: "Anotación" federation: "Federación" -instances: "Instancia" +instances: "Servidores" registeredAt: "Registrado en" latestRequestSentAt: "Ultimo pedido enviado" latestRequestReceivedAt: "Ultimo pedido recibido" @@ -190,7 +190,7 @@ charts: "Chat" perHour: "por hora" perDay: "por día" stopActivityDelivery: "Dejar de enviar actividades" -blockThisInstance: "Bloquear instancia" +blockThisInstance: "Bloquear este servidor" operations: "Operaciones" software: "Software" version: "Versión" @@ -200,18 +200,17 @@ jobQueue: "Cola de trabajos" cpuAndMemory: "CPU y Memoria" network: "Red" disk: "Disco" -instanceInfo: "información de la instancia" +instanceInfo: "Información del servidor" statistics: "Estadísticas" clearQueue: "Limpiar cola" clearQueueConfirmTitle: "¿Desea limpiar la cola?" -clearQueueConfirmText: "Las publicaciones aún no entregadas no se federarán. Normalmente\ - \ no se necesita ejecutar esta operación." +clearQueueConfirmText: "Las publicaciones aún no entregadas no se federarán. Normalmente + no se necesita ejecutar esta operación." clearCachedFiles: "Limpiar caché" clearCachedFilesConfirm: "¿Desea borrar todos los archivos remotos cacheados?" -blockedInstances: "Instancias bloqueadas" -blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear,\ - \ separadas por una linea nueva. Las instancias bloqueadas no podrán comunicarse\ - \ con esta instancia." +blockedInstances: "Servidores bloqueados" +blockedInstancesDescription: "Escriba los hosts de los servidores que desea bloquear. + Los servidores bloqueados no podrán comunicarse con este servidor." muteAndBlock: "Silenciar y bloquear" mutedUsers: "Usuarios silenciados" blockedUsers: "Usuarios bloqueados" @@ -234,9 +233,9 @@ all: "Todo" subscribing: "Suscribiendo" publishing: "Publicando" notResponding: "Sin respuestas" -instanceFollowing: "Siguiendo instancias" -instanceFollowers: "Seguidores de la instancia" -instanceUsers: "Usuarios de la instancia" +instanceFollowing: "Siguiendo en este servidor" +instanceFollowers: "Seguidores del servidor" +instanceUsers: "Usuarios de este servidor" changePassword: "Cambiar contraseña" security: "Seguridad" retypedNotMatch: "No hay coincidencia." @@ -260,9 +259,9 @@ saved: "Guardado" messaging: "Chat" upload: "Subir" keepOriginalUploading: "Mantener la imagen original" -keepOriginalUploadingDescription: "Mantener la versión original al cargar imágenes.\ - \ Si está desactivado, el navegador generará imágenes para la publicación web en\ - \ el momento de recargar la página." +keepOriginalUploadingDescription: "Mantener la versión original al cargar imágenes. + Si está desactivado, el navegador generará imágenes para la publicación web en el + momento de recargar la página." fromDrive: "Desde el drive" fromUrl: "Desde la URL" uploadFromUrl: "Subir desde una URL" @@ -311,8 +310,8 @@ unableToDelete: "No se puede borrar" inputNewFileName: "Ingrese un nuevo nombre de archivo" inputNewDescription: "Ingrese nueva descripción" inputNewFolderName: "Ingrese un nuevo nombre de la carpeta" -circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que\ - \ quieres mover." +circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que + quieres mover." hasChildFilesOrFolders: "No se puede borrar esta carpeta. No está vacía." copyUrl: "Copiar URL" rename: "Renombrar" @@ -329,8 +328,8 @@ unwatch: "Dejar de ver" accept: "Aceptar" reject: "Rechazar" normal: "Normal" -instanceName: "Nombre de la instancia" -instanceDescription: "Descripción de la instancia" +instanceName: "Nombre del servidor" +instanceDescription: "Descripción del servidor" maintainerName: "Nombre del administrador" maintainerEmail: "Correo del administrador" tosUrl: "URL de los términos de uso" @@ -346,8 +345,8 @@ connectService: "Conectar" disconnectService: "Desconectar" enableLocalTimeline: "Habilitar linea de tiempo local" enableGlobalTimeline: "Habilitar linea de tiempo global" -disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia\ - \ el administrador y los moderadores pueden seguir usándolos" +disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia + el administrador y los moderadores pueden seguir usándolos" registration: "Registro" enableRegistration: "Permitir nuevos registros" invite: "Invitar" @@ -359,11 +358,11 @@ bannerUrl: "URL de la imagen del banner" backgroundImageUrl: "URL de la imagen de fondo" basicInfo: "Información básica" pinnedUsers: "Usuarios fijados" -pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\"\ - \ separados por una linea nueva" +pinnedUsersDescription: "Describir los usuarios que quiere fijar en la pestaña \"\ + Explorar\" separados por líneas nuevas." pinnedPages: "Páginas fijadas" -pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página\ - \ principal de la instancia, separadas por lineas nuevas" +pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página + principal del servidor, separadas por líneas nuevas." pinnedClipId: "Id del clip fijado" pinnedNotes: "Publicación fijada" hcaptcha: "hCaptcha" @@ -374,17 +373,17 @@ recaptcha: "reCAPTCHA" enableRecaptcha: "activar reCAPTCHA" recaptchaSiteKey: "Clave del sitio" recaptchaSecretKey: "Clave secreta" -avoidMultiCaptchaConfirm: "El uso de múltiples Captchas puede causar interferencia.\ - \ ¿Desea desactivar el otro Captcha? Puede dejar múltiples Captchas habilitadas\ - \ presionando cancelar." +avoidMultiCaptchaConfirm: "El uso de múltiples Captchas puede causar interferencia. + ¿Desea desactivar el otro Captcha? Puede dejar múltiples Captchas habilitadas presionando + cancelar." antennas: "Antenas" manageAntennas: "Administrar antenas" name: "Nombre" antennaSource: "Origen de la antena" antennaKeywords: "Palabras clave para recibir" antennaExcludeKeywords: "Palabras clave para excluir" -antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar\ - \ con una linea nueva es una declaración OR" +antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar + con una linea nueva es una declaración OR" notifyAntenna: "Notificar nueva publicación" withFileAntenna: "Sólo publicaciones con archivos adjuntados" enableServiceworker: "Activar ServiceWorker" @@ -472,8 +471,8 @@ strongPassword: "Muy buena contraseña" passwordMatched: "Correcto" passwordNotMatched: "Las contraseñas no son las mismas" signinWith: "Inicie sesión con {x}" -signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario\ - \ y contraseña correctos." +signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario + y contraseña correctos." tapSecurityKey: "Toque la clave de seguridad" or: "O" language: "Idioma" @@ -483,8 +482,8 @@ aboutX: "Acerca de {x}" useOsNativeEmojis: "Usa los emojis nativos de la plataforma" disableDrawer: "No mostrar los menús en cajones" youHaveNoGroups: "Sin grupos" -joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su\ - \ propio grupo." +joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su + propio grupo." noHistory: "No hay datos en el historial" signinHistory: "Historial de ingresos" disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones" @@ -515,28 +514,28 @@ showFeaturedNotesInTimeline: "Mostrar publicaciones destacadas en la línea de t objectStorage: "Almacenamiento de objetos" useObjectStorage: "Usar almacenamiento de objetos" objectStorageBaseUrl: "Base URL" -objectStorageBaseUrlDesc: "Prefijo de URL utilizado para construir URL para hacer\ - \ referencia a objetos (medios). Especifique su URL si está utilizando un CDN o\ - \ Proxy; de lo contrario, especifique la dirección a la que se puede acceder públicamente\ - \ de acuerdo con la guía de servicio que va a utilizar. i.g 'https://<bucket>.s3.amazonaws.com'\ - \ para AWS S3 y 'https://storage.googleapis.com/<bucket>' para GCS." +objectStorageBaseUrlDesc: "Prefijo de URL utilizado para construir URL para hacer + referencia a objetos (medios). Especifique su URL si está utilizando un CDN o Proxy; + de lo contrario, especifique la dirección a la que se puede acceder públicamente + de acuerdo con la guía de servicio que va a utilizar. i.g 'https://<bucket>.s3.amazonaws.com' + para AWS S3 y 'https://storage.googleapis.com/<bucket>' para GCS." objectStorageBucket: "Bucket" -objectStorageBucketDesc: "Especifique el nombre del depósito utilizado en el servicio\ - \ configurado." +objectStorageBucketDesc: "Especifique el nombre del depósito utilizado en el servicio + configurado." objectStoragePrefix: "Prefix" objectStoragePrefixDesc: "Los archivos se almacenarán en el directorio de este prefijo." objectStorageEndpoint: "Endpoint" -objectStorageEndpointDesc: "Deje esto en blanco si está utilizando AWS S3; de lo contrario,\ - \ especifique el punto final como '<host>' o '<host>: <port>' de acuerdo con la\ - \ guía de servicio que va a utilizar." +objectStorageEndpointDesc: "Deje esto en blanco si está utilizando AWS S3; de lo contrario, + especifique el punto final como '<host>' o '<host>: <port>' de acuerdo con la guía + de servicio que va a utilizar." objectStorageRegion: "Region" -objectStorageRegionDesc: "Especifique una región como 'xx-east-1'. Si su servicio\ - \ no tiene distinción sobre regiones, déjelo en blanco o complete con 'us-east-1'." +objectStorageRegionDesc: "Especifique una región como 'xx-east-1'. Si su servicio + no tiene distinción sobre regiones, déjelo en blanco o complete con 'us-east-1'." objectStorageUseSSL: "Usar SSL" objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión API" objectStorageUseProxy: "Conectarse a través de Proxy" -objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\ - \ de Almacenamiento de objetos" +objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión + de Almacenamiento de objetos" objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir " serverLogs: "Registros del servidor" deleteAll: "Eliminar todos" @@ -564,8 +563,8 @@ sort: "Ordenar" ascendingOrder: "Ascendente" descendingOrder: "Descendente" scratchpad: "Scratch pad" -scratchpadDescription: "Scratchpad proporciona un entorno experimental para AiScript.\ - \ Puede escribir, ejecutar y verificar los resultados que interactúan con Calckey." +scratchpadDescription: "Scratchpad proporciona un entorno experimental para AiScript. + Puede escribir, ejecutar y verificar los resultados que interactúan con Calckey." output: "Salida" script: "Script" disablePagesScript: "Deshabilitar AiScript en Páginas" @@ -573,14 +572,14 @@ updateRemoteUser: "Actualizar información de usuario remoto" deleteAllFiles: "Borrar todos los archivos" deleteAllFilesConfirm: "¿Desea borrar todos los archivos?" removeAllFollowing: "Retener todos los siguientes" -removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}.\ - \ Ejecutar en caso de que esta instancia haya dejado de existir." +removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. + Ejecutar en caso de que esta instancia haya dejado de existir." userSuspended: "Este usuario ha sido suspendido." userSilenced: "Este usuario ha sido silenciado." yourAccountSuspendedTitle: "Esta cuenta ha sido suspendida" -yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violaciones\ - \ de los términos de servicio del servidor y otras razones. Para más información,\ - \ póngase en contacto con el administrador. Por favor, no cree una nueva cuenta." +yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violaciones + de los términos de servicio del servidor y otras razones. Para más información, + póngase en contacto con el administrador. Por favor, no cree una nueva cuenta." menu: "Menú" divider: "Divisor" addItem: "Agregar elemento" @@ -634,15 +633,15 @@ smtpHost: "Host" smtpPort: "Puerto" smtpUser: "Nombre de usuario" smtpPass: "Contraseña" -emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para\ - \ deshabilitar la autenticación SMTP" +emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para + deshabilitar la autenticación SMTP" smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP" smtpSecureInfo: "Apagar cuando se use STARTTLS" testEmail: "Prueba de envío" wordMute: "Silenciar palabras" regexpError: "Error de la expresión regular" -regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line}\ - \ de las palabras muteadas {tab}" +regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line} + de las palabras muteadas {tab}" instanceMute: "Instancias silenciadas" userSaysSomething: "{name} dijo algo" makeActive: "Activar" @@ -658,13 +657,13 @@ create: "Crear" notificationSetting: "Ajustes de Notificaciones" notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar" useGlobalSetting: "Usar ajustes globales" -useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de\ - \ la cuenta, al desactivarse se pueden hacer configuraciones particulares." +useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de + la cuenta, al desactivarse se pueden hacer configuraciones particulares." other: "Otro" regenerateLoginToken: "Regenerar token de login" -regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el\ - \ login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en\ - \ todos los dispositivos." +regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el + login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en todos + los dispositivos." setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios." fileIdOrUrl: "Id del archivo o URL" behavior: "Comportamiento" @@ -672,15 +671,15 @@ sample: "Muestra" abuseReports: "Reportes" reportAbuse: "Reportar" reportAbuseOf: "Reportar a {name}" -fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en\ - \ particular, ingrese la URL de esta." +fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en + particular, ingrese la URL de esta." abuseReported: "Se ha enviado el reporte. Muchas gracias." reporter: "Reportador" reporteeOrigin: "Reportar a" reporterOrigin: "Origen del reporte" forwardReport: "Transferir un informe a una instancia remota" -forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá\ - \ como una cuenta anónima del sistema" +forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá + como una cuenta anónima del sistema" send: "Enviar" abuseMarkAsResolved: "Marcar reporte como resuelto" openInNewTab: "Abrir en una Nueva Pestaña" @@ -701,8 +700,8 @@ unclip: "Quitar clip" confirmToUnclipAlreadyClippedNote: "Esta nota ya está incluida en el clip \"{name}\"\ . ¿Quiere quitar la nota del clip?" public: "Público" -i18nInfo: "Calckey está siendo traducido a varios idiomas gracias a voluntarios. Se\ - \ puede colaborar traduciendo en {link}" +i18nInfo: "Calckey está siendo traducido a varios idiomas gracias a voluntarios. Se + puede colaborar traduciendo en {link}" manageAccessTokens: "Administrar tokens de acceso" accountInfo: "Información de la Cuenta" notesCount: "Cantidad de notas" @@ -721,18 +720,18 @@ no: "No" driveFilesCount: "Cantidad de archivos en el drive" driveUsage: "Uso del drive" noCrawle: "Rechazar indexación del crawler" -noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas,\ - \ páginas, etc." -lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"Sólo\ - \ seguidores\", tus notas serán visibles para cualquiera, incluso si requieres que\ - \ los seguidores sean aprobados manualmente." -alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por\ - \ defecto" +noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas, + páginas, etc." +lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"Sólo + seguidores\", tus notas serán visibles para cualquiera, incluso si requieres que + los seguidores sean aprobados manualmente." +alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por + defecto" loadRawImages: "Cargar las imágenes originales en lugar de mostrar las miniaturas" disableShowingAnimatedImages: "No reproducir imágenes animadas" -verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por\ - \ favor, acceda al enlace proporcionado en el correo electrónico para completar\ - \ la configuración." +verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por + favor, acceda al enlace proporcionado en el correo electrónico para completar la + configuración." notSet: "Sin especificar" emailVerified: "Su dirección de correo electrónico ha sido verificada." noteFavoritesCount: "Número de notas favoritas" @@ -744,16 +743,16 @@ clips: "Clip" experimentalFeatures: "Características experimentales" developer: "Desarrolladores" makeExplorable: "Hacer visible la cuenta en \"Explorar\"" -makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la\ - \ sección \"Explorar\"." +makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la + sección \"Explorar\"." showGapBetweenNotesInTimeline: "Mostrar un intervalo entre notas en la línea de tiempo" duplicate: "Duplicar" left: "Izquierda" center: "Centrar" wide: "Ancho" narrow: "Estrecho" -reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la\ - \ página. ¿Recargar ahora?" +reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la + página. ¿Recargar ahora?" needReloadToApply: "Se requiere un reinicio para la aplicar los cambios" showTitlebar: "Mostrar la barra de título" clearCache: "Limpiar caché" @@ -761,11 +760,11 @@ onlineUsersCount: "{n} usuarios en línea" nUsers: "{n} Usuarios" nNotes: "{n} Notas" sendErrorReports: "Envíar informe de errores" -sendErrorReportsDescription: "Si habilita esta opción, los detalles de los errores\ - \ serán compartidos con Calckey cuando ocurra un problema, lo que ayudará a mejorar\ - \ la calidad de Calckey. \nEsto incluye información como la versión del sistema\ - \ operativo, el tipo de navegador que está utilizando y su historial en Calckey,\ - \ entre otros datos." +sendErrorReportsDescription: "Si habilita esta opción, los detalles de los errores + serán compartidos con Calckey cuando ocurra un problema, lo que ayudará a mejorar + la calidad de Calckey. \nEsto incluye información como la versión del sistema operativo, + el tipo de navegador que está utilizando y su historial en Calckey, entre otros + datos." myTheme: "Mi Tema" backgroundColor: "Fondo" accentColor: "Acento" @@ -793,8 +792,8 @@ receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia" emailNotification: "Notificaciones por correo electrónico" publish: "Publicar" inChannelSearch: "Buscar en el canal" -useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\ - \ de reacciones" +useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu + de reacciones" typingUsers: "{users} está escribiendo" jumpToSpecifiedDate: "Saltar a una fecha específica" showingPastTimeline: "Mostrar líneas de tiempo antiguas" @@ -805,16 +804,16 @@ unlikeConfirm: "¿Quitar como favorito?" fullView: "Vista completa" quitFullView: "quitar vista completa" addDescription: "Agregar descripción" -userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando Pin en el menú\ - \ de notas individuales" +userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando Pin en el menú + de notas individuales" notSpecifiedMentionWarning: "Algunas menciones no están incluidas en el destino" info: "Información" userInfo: "Información del usuario" unknown: "Desconocido" onlineStatus: "En línea" hideOnlineStatus: "mostrarse como desconectado" -hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia\ - \ de algunas funciones, como la búsqueda" +hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia + de algunas funciones, como la búsqueda" online: "En línea" active: "Activo" offline: "Sin conexión" @@ -849,8 +848,8 @@ emailNotConfiguredWarning: "No se ha configurado una dirección de correo electr ratio: "Proporción" previewNoteText: "Mostrar vista preliminar" customCss: "CSS personalizado" -customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir\ - \ valores inadecuados puede hacer que el cliente deje de funcionar con normalidad." +customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir + valores inadecuados puede hacer que el cliente deje de funcionar con normalidad." global: "Global" squareAvatars: "Mostrar iconos cuadrados" sent: "Enviar" @@ -865,9 +864,9 @@ whatIsNew: "Mostrar cambios" translate: "Traducir" translatedFrom: "Traducido de {x}" accountDeletionInProgress: "La eliminación de la cuenta está en curso" -usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede\ - \ utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres\ - \ de usuario no se pueden cambiar posteriormente." +usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede + utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres + de usuario no se pueden cambiar posteriormente." aiChanMode: "Modo Ai" keepCw: "Mantener la advertencia de contenido" pubSub: "Cuentas Pub/Sub" @@ -877,21 +876,21 @@ unresolved: "Sin resolver" breakFollow: "Dejar de seguir" itsOn: "¡Está encendido!" itsOff: "¡Está apagado!" -emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro\ - \ de la cuenta" +emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro + de la cuenta" unread: "No leído" filter: "Filtro" controlPanel: "Panel de control" manageAccounts: "Administrar cuenta" makeReactionsPublic: "Hacer el historial de reacciones público" -makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán públicamente\ - \ visibles." +makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán públicamente + visibles." classic: "Clásico" muteThread: "Ocultar hilo" unmuteThread: "Mostrar hilo" ffVisibility: "Visibilidad de seguidores y seguidos" -ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes\ - \ te siguen" +ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes + te siguen" continueThread: "Ver la continuación del hilo" deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?" incorrectPassword: "La contraseña es incorrecta" @@ -932,16 +931,16 @@ thereIsUnresolvedAbuseReportWarning: "Hay reportes sin resolver" recommended: "Recomendado" check: "Verificar" driveCapOverrideLabel: "Cambiar la capacidad de la unidad para este usuario" -driveCapOverrideCaption: "Restablecer la capacidad a su predeterminado ingresando\ - \ un valor de 0 o menos" +driveCapOverrideCaption: "Restablecer la capacidad a su predeterminado ingresando + un valor de 0 o menos" requireAdminForView: "Necesitas iniciar sesión como administrador para ver esto." isSystemAccount: "Cuenta creada y operada automáticamente por el sistema" typeToConfirm: "Ingrese {x} para confirmar" deleteAccount: "Borrar cuenta" document: "Documento" numberOfPageCache: "Cantidad de páginas cacheadas" -numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien\ - \ puede aumentar la carga y la memoria a usarse" +numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien + puede aumentar la carga y la memoria a usarse" logoutConfirm: "¿Cerrar sesión?" lastActiveDate: "Utilizado por última vez el" statusbar: "Barra de estado" @@ -958,37 +957,36 @@ sensitiveMediaDetection: "Detección de contenido NSFW" localOnly: "Solo local" remoteOnly: "Sólo remoto" failedToUpload: "La subida falló" -cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas\ - \ partes han sido detectadas comoNSFW." -cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en\ - \ la unidad del usuario." +cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas + partes han sido detectadas comoNSFW." +cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en + la unidad del usuario." beta: "Beta" enableAutoSensitive: "Marcar automáticamente contenido NSFW" -enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido\ - \ NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está\ - \ desactivada, puede ser activado para toda la instancia." -activeEmailValidationDescription: "Habilita la validación estricta de direcciones\ - \ de correo electrónico, lo cual incluye la revisión de direcciones desechables\ - \ y si se puede comunicar con éstas. Cuando está deshabilitado, sólo el formato\ - \ de la dirección es validado." +enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido + NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está desactivada, + puede ser activado para toda la instancia." +activeEmailValidationDescription: "Habilita la validación estricta de direcciones + de correo electrónico, lo cual incluye la revisión de direcciones desechables y + si se puede comunicar con éstas. Cuando está deshabilitado, sólo el formato de la + dirección es validado." navbar: "Barra de navegación" shuffle: "Aleatorio" account: "Cuentas" move: "Mover" _sensitiveMediaDetection: - description: "Reduce el esfuerzo de la moderación el el servidor a través del reconocimiento\ - \ automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar\ - \ ligeramente la carga en el servidor." + description: "Reduce el esfuerzo de la moderación el el servidor a través del reconocimiento + automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar + ligeramente la carga en el servidor." sensitivity: "Sensibilidad de detección" - sensitivityDescription: "Reducir la sensibilidad puede acarrear a varios falsos\ - \ positivos, mientras que incrementarla puede reducir las detecciones (falsos\ - \ negativos)." + sensitivityDescription: "Reducir la sensibilidad puede acarrear a varios falsos + positivos, mientras que incrementarla puede reducir las detecciones (falsos negativos)." setSensitiveFlagAutomatically: "Marcar como NSFW" - setSensitiveFlagAutomaticallyDescription: "Los resultados de la detección interna\ - \ pueden ser retenidos incluso si la opción está desactivada." + setSensitiveFlagAutomaticallyDescription: "Los resultados de la detección interna + pueden ser retenidos incluso si la opción está desactivada." analyzeVideos: "Habilitar el análisis de videos" - analyzeVideosDescription: "Analizar videos en adición a las imágenes. Esto puede\ - \ incrementar ligeramente la carga del servidor." + analyzeVideosDescription: "Analizar videos en adición a las imágenes. Esto puede + incrementar ligeramente la carga del servidor." _emailUnavailable: used: "Ya fue usado" format: "El formato de este correo electrónico no es válido" @@ -1002,15 +1000,15 @@ _ffVisibility: _signup: almostThere: "Ya falta poco" emailAddressInfo: "Ingrese el correo electrónico que usa. Este no se hará público." - emailSent: "Se envió un correo de verificación a la dirección {email}. Acceda al\ - \ link enviado en el correo para completar el ingreso." + emailSent: "Se envió un correo de verificación a la dirección {email}. Acceda al + link enviado en el correo para completar el ingreso." _accountDelete: accountDelete: "Eliminar Cuenta" - mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede\ - \ pasar un tiempo hasta que se complete si es mucho el contenido creado y los\ - \ archivos subidos." - sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección\ - \ usada para el registro." + mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede + pasar un tiempo hasta que se complete si es mucho el contenido creado y los archivos + subidos." + sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección + usada para el registro." requestAccountDelete: "Pedir la eliminación de la cuenta." started: "El proceso de eliminación ha comenzado." inProgress: "La eliminación está en proceso." @@ -1018,12 +1016,11 @@ _ad: back: "Deseleccionar" reduceFrequencyOfThisAd: "Mostrar menos este anuncio." _forgotPassword: - enterEmail: "Ingrese el correo usado para registrar la cuenta. Se enviará un link\ - \ para resetear la contraseña." + enterEmail: "Ingrese el correo usado para registrar la cuenta. Se enviará un link + para resetear la contraseña." ifNoEmail: "Si no utilizó un correo para crear la cuenta, contáctese con el administrador." - contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,\ - \ póngase en contacto con el administrador de la instancia para restablecer su\ - \ contraseña" + contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico, + póngase en contacto con el administrador de la instancia para restablecer su contraseña" _gallery: my: "Mi galería" liked: "Publicaciones que me gustan" @@ -1046,15 +1043,15 @@ _preferencesBackups: save: "Guardar cambios" inputName: "Por favor, ingresa un nombre para este respaldo" cannotSave: "Fallo al guardar" - nameAlreadyExists: "Un respaldo llamado \"{name}\" ya existe. Por favor ingresa\ - \ un nombre diferente" + nameAlreadyExists: "Un respaldo llamado \"{name}\" ya existe. Por favor ingresa + un nombre diferente" applyConfirm: "¿Realmente quieres aplicar los cambios desde el archivo \"{name}\"\ \ a este dispositivo? Las configuraciones existentes serán sobreescritas. " saveConfirm: "¿Guardar respaldo como \"{name}\"?" deleteConfirm: "¿Borrar el respaldo \"{name}\"?" renameConfirm: "¿Renombrar este respaldo de \"{old}\" a \"{new}\"?" - noBackups: "No existen respaldos. Deberás respaldar las configuraciones del cliente\ - \ en este servidor usando \"Crear nuevo respaldo\"" + noBackups: "No existen respaldos. Deberás respaldar las configuraciones del cliente + en este servidor usando \"Crear nuevo respaldo\"" createdAt: "Creado: {date} {time}" updatedAt: "Actualizado: {date} {time}" cannotLoad: "La carga falló" @@ -1066,15 +1063,15 @@ _registry: domain: "Dominio" createKey: "Crear una llave" _aboutMisskey: - about: "Calckey es una bifurcación de Misskey creada por ThatOneCalculator, que\ - \ ha estado en desarrollo desde el 2022." + about: "Calckey es una bifurcación de Misskey creada por ThatOneCalculator, que + ha estado en desarrollo desde el 2022." contributors: "Principales colaboradores" allContributors: "Todos los colaboradores" source: "Código fuente" translation: "Traducir Calckey" donate: "Donar a Calckey" - morePatrons: "También apreciamos el apoyo de muchos más que no están enlistados\ - \ aquí. ¡Gracias! \U0001F970" + morePatrons: "También apreciamos el apoyo de muchos más que no están enlistados + aquí. ¡Gracias! 🥰" patrons: "Mecenas de Calckey" _nsfw: respect: "Ocultar medios NSFW" @@ -1082,13 +1079,13 @@ _nsfw: force: "Ocultar todos los medios" _mfm: cheatSheet: "Hoja de referencia de MFM" - intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares\ - \ dentro de Misskey, Calckey, Akkoma, y mucho más. Aquí puede ver una lista de\ - \ sintaxis disponibles en MFM." + intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares + dentro de Misskey, Calckey, Akkoma, y mucho más. Aquí puede ver una lista de sintaxis + disponibles en MFM." dummy: "Calckey expande el mundo de la Fediverso" mention: "Menciones" - mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar\ - \ para notificar a un usuario en particular." + mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar + para notificar a un usuario en particular." hashtag: "Hashtag" hashtagDescription: "Puede especificar un hashtag con un numeral y el texto." url: "URL" @@ -1104,8 +1101,8 @@ _mfm: inlineCode: "Código (insertado)" inlineCodeDescription: "Muestra el código de un programa resaltando su sintaxis" blockCode: "Código (bloque)" - blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias\ - \ líneas con bloques." + blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias + líneas con bloques." inlineMath: "Fórmula (insertado)" inlineMathDescription: "Muestra fórmulas (KaTeX) insertadas" blockMath: "Fórmula (bloque)" @@ -1117,8 +1114,8 @@ _mfm: search: "Buscar" searchDescription: "Muestra una caja de búsqueda con texto pre-escrito" flip: "Echar de un capirotazo" - flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda\ - \ / derecha." + flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda + / derecha." jelly: "Animación (gelatina)" jellyDescription: "Aplica un efecto de animación tipo gelatina" tada: "Animación (tadá)" @@ -1140,8 +1137,8 @@ _mfm: x4: "Totalmente grande" x4Description: "Muestra el contenido totalmente grande" blur: "Desenfoque" - blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar\ - \ el puntero encima." + blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar + el puntero encima." font: "Fuente" fontDescription: "Elegir la fuente del contenido" rainbow: "Arcoíris" @@ -1151,8 +1148,8 @@ _mfm: rotate: "Rotar" rotateDescription: "Rota el contenido a un ángulo especificado." plain: "Plano" - plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto\ - \ MFM." + plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto + MFM." position: Posición _instanceTicker: none: "No mostrar" @@ -1182,20 +1179,19 @@ _menuDisplay: hide: "Ocultar" _wordMute: muteWords: "Palabras que silenciar" - muteWordsDescription: "Separar con espacios indica una declaracion And, separar\ - \ con lineas nuevas indica una declaracion Or。" - muteWordsDescription2: "Encerrar las palabras clave entre numerales para usar expresiones\ - \ regulares" + muteWordsDescription: "Separar con espacios indica una declaracion And, separar + con lineas nuevas indica una declaracion Or。" + muteWordsDescription2: "Encerrar las palabras clave entre numerales para usar expresiones + regulares" softDescription: "Ocultar en la linea de tiempo las notas que cumplen las condiciones" - hardDescription: "Evitar que se agreguen a la linea de tiempo las notas que cumplen\ - \ las condiciones. Las notas no agregadas seguirán quitadas aunque cambien las\ - \ condiciones." + hardDescription: "Evitar que se agreguen a la linea de tiempo las notas que cumplen + las condiciones. Las notas no agregadas seguirán quitadas aunque cambien las condiciones." soft: "Suave" hard: "Duro" mutedNotes: "Notas silenciadas" _instanceMute: - instanceMuteDescription: "Silencia todas las notas y reposts de la instancias seleccionadas,\ - \ incluyendo respuestas a los usuarios de las mismas" + instanceMuteDescription: "Silencia todas las notas y reposts de la instancias seleccionadas, + incluyendo respuestas a los usuarios de las mismas" instanceMuteDescription2: "Separar por líneas" title: "Oculta las notas de las instancias listadas." heading: "Instancias a silenciar" @@ -1301,47 +1297,47 @@ _tutorial: step1_1: "¡Bienvenido!" step1_2: "Vamos a configurarte. Estarás listo y funcionando en poco tiempo" step2_1: "En primer lugar, rellena tu perfil" - step2_2: "Proporcionar algo de información sobre quién eres hará que sea más fácil\ - \ para los demás saber si quieren ver tus notas o seguirte." + step2_2: "Proporcionar algo de información sobre quién eres hará que sea más fácil + para los demás saber si quieren ver tus notas o seguirte." step3_1: "¡Ahora es el momento de seguir a algunas personas!" - step3_2: "Tu página de inicio y tus líneas de tiempo sociales se basan en quién\ - \ sigues, así que intenta seguir un par de cuentas para empezar.\nHaz clic en\ - \ el círculo más en la parte superior derecha de un perfil para seguirlos." + step3_2: "Tu página de inicio y tus líneas de tiempo sociales se basan en quién + sigues, así que intenta seguir un par de cuentas para empezar.\nHaz clic en el + círculo más en la parte superior derecha de un perfil para seguirlos." step4_1: "Vamos a salir a la calle" - step4_2: "Para tu primer post, a algunas personas les gusta hacer un post de {introduction}\ - \ o un simple \"¡Hola mundo!\"" + step4_2: "Para tu primer post, a algunas personas les gusta hacer un post de {introduction} + o un simple \"¡Hola mundo!\"" step5_1: "¡Líneas de tiempo, líneas de tiempo por todas partes!" step5_2: "Su instancia tiene {timelines} diferentes líneas de tiempo habilitadas" - step5_3: "La línea de tiempo Inicio {icon} es donde puedes ver las publicaciones\ - \ de tus seguidores." - step5_4: "La línea de tiempo Local {icon} es donde puedes ver las publicaciones\ - \ de todos los demás en esta instancia." - step5_5: "La línea de tiempo {icon} recomendada es donde puedes ver las publicaciones\ - \ de las instancias que los administradores recomiendan." - step5_6: "La línea de tiempo Social {icon} es donde puedes ver las publicaciones\ - \ de los amigos de tus seguidores." - step5_7: "La línea de tiempo Global {icon} es donde puedes ver las publicaciones\ - \ de todas las demás instancias conectadas." + step5_3: "La línea de tiempo Inicio {icon} es donde puedes ver las publicaciones + de tus seguidores." + step5_4: "La línea de tiempo Local {icon} es donde puedes ver las publicaciones + de todos los demás en esta instancia." + step5_5: "La línea de tiempo {icon} recomendada es donde puedes ver las publicaciones + de las instancias que los administradores recomiendan." + step5_6: "La línea de tiempo Social {icon} es donde puedes ver las publicaciones + de los amigos de tus seguidores." + step5_7: "La línea de tiempo Global {icon} es donde puedes ver las publicaciones + de todas las demás instancias conectadas." step6_1: "Entonces, ¿qué es este lugar?" - step6_2: "Bueno, no sólo te has unido a Calckey. Te has unido a un portal del Fediverso,\ - \ una red interconectada de miles de servidores, llamada \"instancias\"" - step6_3: "Cada servidor funciona de forma diferente, y no todos los servidores ejecutan\ - \ Calckey. Sin embargo, ¡éste lo hace! Es un poco complicado, pero le cogerás\ - \ el tranquillo enseguida" + step6_2: "Bueno, no sólo te has unido a Calckey. Te has unido a un portal del Fediverso, + una red interconectada de miles de servidores, llamada \"instancias\"" + step6_3: "Cada servidor funciona de forma diferente, y no todos los servidores ejecutan + Calckey. Sin embargo, ¡éste lo hace! Es un poco complicado, pero le cogerás el + tranquillo enseguida" step6_4: "¡Ahora ve, explora y diviértete!" _2fa: alreadyRegistered: "Ya has completado la configuración." registerTOTP: "Registrar dispositivo" registerSecurityKey: "Registrar clave" - step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o\ - \ {b} u otra." + step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o + {b} u otra." step2: "Luego, escanee con la aplicación el código QR mostrado en pantalla." step2Url: "En una aplicación de escritorio se puede ingresar la siguiente URL:" step3: "Para terminar, ingrese el token mostrado en la aplicación." step4: "Ahora cuando inicie sesión, ingrese el mismo token" - securityKeyInfo: "Se puede configurar el inicio de sesión usando una clave de seguridad\ - \ de hardware que soporte FIDO2 o con un certificado de huella digital o con un\ - \ PIN" + securityKeyInfo: "Se puede configurar el inicio de sesión usando una clave de seguridad + de hardware que soporte FIDO2 o con un certificado de huella digital o con un + PIN" _permissions: "read:account": "Ver información de la cuenta" "write:account": "Editar información de la cuenta" @@ -1377,8 +1373,8 @@ _permissions: "write:gallery-likes": "Editar favoritos de la galería" _auth: shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?" - shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder\ - \ a su cuenta?" + shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder + a su cuenta?" permissionAsk: "Esta aplicación requiere los siguientes permisos" pleaseGoBack: "Por favor, vuelve a la aplicación" callback: "Volviendo a la aplicación" @@ -1772,8 +1768,8 @@ _pages: _seedRandomPick: arg1: "Semilla" arg2: "Listas" - DRPWPM: "Elegir aleatoriamente de la lista ponderada (Diariamente para cada\ - \ usuario)" + DRPWPM: "Elegir aleatoriamente de la lista ponderada (Diariamente para cada + usuario)" _DRPWPM: arg1: "Lista de texto" pick: "Elegir de la lista" @@ -1804,8 +1800,8 @@ _pages: _for: arg1: "Cantidad de repeticiones" arg2: "Acción" - typeError: "El slot {slot} acepta el tipo {expect} pero fue ingresado el tipo\ - \ {actual}" + typeError: "El slot {slot} acepta el tipo {expect} pero fue ingresado el tipo + {actual}" thereIsEmptySlot: "El slot {slot} está vacío" types: string: "Texto" @@ -1869,10 +1865,10 @@ _deck: newProfile: "Nuevo perfil" deleteProfile: "Eliminar perfil" introduction: "¡Crea la interfaz perfecta para tí organizando las columnas libremente!" - introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas\ - \ columnas donde quieras." - widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna\ - \ y agrega un widget." + introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas + columnas donde quieras." + widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna + y agrega un widget." _columns: main: "Principal" widgets: "Widgets" @@ -1885,11 +1881,11 @@ _deck: manageGroups: Administrar grupos replayTutorial: Repetir Tutorial privateMode: Modo privado -addInstance: Añadir una instancia +addInstance: Añadir un servidor renoteMute: Silenciar impulsos renoteUnmute: Dejar de silenciar impulsos flagSpeakAsCat: Habla como un gato -selectInstance: Selectiona una instancia +selectInstance: Selecciona un servidor flagSpeakAsCatDescription: Tu publicación se "nyanified" cuando esté en modo gato allowedInstances: Instancias en la lista blanca breakFollowConfirm: ¿Estás seguro de que quieres eliminar el seguidor? @@ -1905,7 +1901,7 @@ license: Licencia noThankYou: No gracias userSaysSomethingReason: '{name} dijo {reason}' hiddenTags: Etiquetas Ocultas -noInstances: No hay instancias +noInstances: No hay servidores accountMoved: 'Usuario ha movido a una cuenta nueva:' caption: Auto Subtítulos showAds: Mostrar Anuncios @@ -1924,6 +1920,24 @@ silenced: Silenciado deleted: Eliminado edited: 'Editado a las {date} {time}' editNote: Editar nota -silenceThisInstance: Silenciar esta instancia +silenceThisInstance: Silenciar este servidor findOtherInstance: Buscar otro servidor userSaysSomethingReasonRenote: '{name} impulsó una publicación que contiene {reason]' +enableRecommendedTimeline: Habilitar línea de tiempo "Recomendado" +searchPlaceholder: Buscar en Calckey +listsDesc: Las listas te permiten crear líneas de tiempo con usuarios específicos. + Puedes acceder a ellas desde la pestaña "Línea de tiempo". +removeReaction: Quitar tu reacción +selectChannel: Seleccionar canal +showEmojisInReactionNotifications: Mostrar emojis en notificaciones de reacciones +silencedInstancesDescription: Escriba los hosts de los servidores que desea bloquear. + Las cuentas en estos servidores serán tratadas como "silenciadas", solo podrán hacer + solicitudes de seguimiento, y no podrán mencionar a usuarios de este servidor si + no les siguen. Esto no afecta los servidores bloqueados. +silencedInstances: Servidores silenciados +hiddenTagsDescription: 'Escriba los hashtags (sin el #) que desea ocultar de las secciones + de Tendencias y Explorar. Los hashtags ocultos seguirán siendo descubribles por + otros métodos.' +jumpToPrevious: Ver anterior +enableEmojiReactions: Habilitar reacciones de emoji +cw: Aviso de contenido From 9f14f0ad9b8149c23c0260974311bcbaac5de46b Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Mon, 26 Jun 2023 23:22:43 -0400 Subject: [PATCH 200/309] feat: horizontally scrolling reactions --- .../components/MkReactionsViewer.reaction.vue | 7 +++++++ .../src/components/MkReactionsViewer.vue | 20 +++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/MkReactionsViewer.reaction.vue b/packages/client/src/components/MkReactionsViewer.reaction.vue index 461628a94a..d82e134278 100644 --- a/packages/client/src/components/MkReactionsViewer.reaction.vue +++ b/packages/client/src/components/MkReactionsViewer.reaction.vue @@ -36,6 +36,10 @@ const props = defineProps<{ note: misskey.entities.Note; }>(); +const emit = defineEmits<{ + (ev: "reacted", v): void; +}>(); + const buttonRef = ref<HTMLElement>(); const canToggle = computed(() => !props.reaction.match(/@\w/) && $i); @@ -60,6 +64,7 @@ const toggleReaction = () => { noteId: props.note.id, reaction: props.reaction, }); + emit("reacted"); } }; @@ -101,6 +106,7 @@ useTooltip( padding: 0 6px; border-radius: 4px; pointer-events: all; + min-width: max-content; &.newlyAdded { animation: scaleInSmall 0.3s cubic-bezier(0, 0, 0, 1.2); :deep(.mk-emoji) { @@ -132,6 +138,7 @@ useTooltip( } &.reacted { + order: -1; background: var(--accent); &:hover { diff --git a/packages/client/src/components/MkReactionsViewer.vue b/packages/client/src/components/MkReactionsViewer.vue index fc108b4729..f5a9a6cb2e 100644 --- a/packages/client/src/components/MkReactionsViewer.vue +++ b/packages/client/src/components/MkReactionsViewer.vue @@ -1,5 +1,5 @@ <template> - <div class="tdflqwzn" :class="{ isMe }"> + <div ref="reactionsEl" class="reactions-list tdflqwzn" :class="{ isMe }"> <XReaction v-for="(count, reaction) in note.reactions" :key="reaction" @@ -7,12 +7,13 @@ :count="count" :is-initial="initialReactions.has(reaction)" :note="note" + @reacted="reactionsEl.scrollTo(0,0)" /> </div> </template> <script lang="ts" setup> -import { computed } from "vue"; +import { computed, ref } from "vue"; import * as misskey from "calckey-js"; import { $i } from "@/account"; import XReaction from "@/components/MkReactionsViewer.reaction.vue"; @@ -21,16 +22,27 @@ const props = defineProps<{ note: misskey.entities.Note; }>(); +const reactionsEl = ref<HTMLElement>(); + const initialReactions = new Set(Object.keys(props.note.reactions)); const isMe = computed(() => $i && $i.id === props.note.userId); </script> <style lang="scss" scoped> -.tdflqwzn { - margin-inline: -2px; +.reactions-list { margin-top: 0.2em; width: 100%; + display: flex; + overflow-x: auto; + margin-inline: -24px; + padding-inline: 22px 160px; + mask: linear-gradient(to right, transparent, black 24px calc(100% - 160px), transparent); + -webkit-mask: linear-gradient(to right, transparent, black 24px calc(100% - 160px), transparent); + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } &:empty { display: none; From e2670c90f5e0c04c74c08f3551d81ed92fd9de4c Mon Sep 17 00:00:00 2001 From: Brayd <braydofficial@noreply.codeberg.org> Date: Tue, 27 Jun 2023 12:21:28 +0000 Subject: [PATCH 201/309] change: hide replies in timeline Hide replies in timeline per default due to being more straightforward for people comming from other Fediverse platforms. Also reduces amount of "posts" in timeline, linking to one "viral" post. --- packages/client/src/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index 044a983563..25ed553070 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -340,7 +340,7 @@ export const defaultStore = markRaw( }, showTimelineReplies: { where: "device", - default: true, + default: false, }, }), ); From e0e957c7216b7bd9afe0f029d78003530e754b53 Mon Sep 17 00:00:00 2001 From: Laura Hausmann <laura@hausmann.dev> Date: Tue, 27 Jun 2023 19:19:15 +0200 Subject: [PATCH 202/309] Also search for url field when looking for existing note in database --- .../backend/src/remote/activitypub/db-resolver.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/remote/activitypub/db-resolver.ts b/packages/backend/src/remote/activitypub/db-resolver.ts index 44ff70c56c..6e448d4b17 100644 --- a/packages/backend/src/remote/activitypub/db-resolver.ts +++ b/packages/backend/src/remote/activitypub/db-resolver.ts @@ -80,8 +80,15 @@ export default class DbResolver { id: parsed.id, }); } else { - return await Notes.findOneBy({ - uri: parsed.uri, + return await Notes.findOne({ + where: [ + { + uri: parsed.uri, + }, + { + url: parsed.uri, + }, + ], }); } } From 9d56db0fbfd645b2325a37e77e409a1676769d13 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Tue, 27 Jun 2023 15:34:30 -0400 Subject: [PATCH 203/309] index note url --- .../backend/native-utils/migration/src/lib.rs | 6 ++- .../src/m20230627_185451_index_note_url.rs | 38 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 packages/backend/native-utils/migration/src/m20230627_185451_index_note_url.rs diff --git a/packages/backend/native-utils/migration/src/lib.rs b/packages/backend/native-utils/migration/src/lib.rs index 4835c2d3d7..94e2b08cc4 100644 --- a/packages/backend/native-utils/migration/src/lib.rs +++ b/packages/backend/native-utils/migration/src/lib.rs @@ -1,12 +1,16 @@ pub use sea_orm_migration::prelude::*; mod m20230531_180824_drop_reversi; +mod m20230627_185451_index_note_url; pub struct Migrator; #[async_trait::async_trait] impl MigratorTrait for Migrator { fn migrations() -> Vec<Box<dyn MigrationTrait>> { - vec![Box::new(m20230531_180824_drop_reversi::Migration)] + vec![ + Box::new(m20230531_180824_drop_reversi::Migration), + Box::new(m20230627_185451_index_note_url::Migration), + ] } } diff --git a/packages/backend/native-utils/migration/src/m20230627_185451_index_note_url.rs b/packages/backend/native-utils/migration/src/m20230627_185451_index_note_url.rs new file mode 100644 index 0000000000..ceffed9c41 --- /dev/null +++ b/packages/backend/native-utils/migration/src/m20230627_185451_index_note_url.rs @@ -0,0 +1,38 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_index( + Index::create() + .name("IDX_note_url") + .table(Note::Table) + .col(Note::Url) + .if_not_exists() + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_index( + Index::drop() + .name("IDX_note_url") + .table(Note::Table) + .to_owned(), + ) + .await + } +} + +/// Learn more at https://docs.rs/sea-query#iden +#[derive(Iden)] +enum Note { + Table, + Url, +} From d9fc2c061d2008e2a132f9e58a378d1204696c9a Mon Sep 17 00:00:00 2001 From: Laura Hausmann <laura@hausmann.dev> Date: Wed, 28 Jun 2023 01:02:28 +0200 Subject: [PATCH 204/309] Add signature to remote note lookup --- packages/backend/src/remote/activitypub/request.ts | 2 ++ packages/backend/src/remote/activitypub/resolver.ts | 8 ++++++++ packages/backend/src/server/api/endpoints/ap/show.ts | 5 +++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/remote/activitypub/request.ts b/packages/backend/src/remote/activitypub/request.ts index ffb3e25a33..7360f95449 100644 --- a/packages/backend/src/remote/activitypub/request.ts +++ b/packages/backend/src/remote/activitypub/request.ts @@ -3,6 +3,7 @@ import { getUserKeypair } from "@/misc/keypair-store.js"; import type { User } from "@/models/entities/user.js"; import { getResponse } from "../../misc/fetch.js"; import { createSignedPost, createSignedGet } from "./ap-request.js"; +import { apLogger } from "@/remote/activitypub/logger.js"; export default async (user: { id: User["id"] }, url: string, object: any) => { const body = JSON.stringify(object); @@ -35,6 +36,7 @@ export default async (user: { id: User["id"] }, url: string, object: any) => { * @param url URL to fetch */ export async function signedGet(url: string, user: { id: User["id"] }) { + apLogger.debug("running signedGet on url: " + url); const keypair = await getUserKeypair(user.id); const req = createSignedGet({ diff --git a/packages/backend/src/remote/activitypub/resolver.ts b/packages/backend/src/remote/activitypub/resolver.ts index 0547927609..e6bbf9fafc 100644 --- a/packages/backend/src/remote/activitypub/resolver.ts +++ b/packages/backend/src/remote/activitypub/resolver.ts @@ -23,6 +23,7 @@ import renderCreate from "@/remote/activitypub/renderer/create.js"; import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import renderFollow from "@/remote/activitypub/renderer/follow.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js"; +import { apLogger } from "@/remote/activitypub/logger.js"; export default class Resolver { private history: Set<string>; @@ -34,6 +35,10 @@ export default class Resolver { this.recursionLimit = recursionLimit; } + public setUser(user) { + this.user = user; + } + public getHistory(): string[] { return Array.from(this.history); } @@ -102,6 +107,9 @@ export default class Resolver { this.user = await getInstanceActor(); } + apLogger.debug("getting object from remote, authenticated as user:"); + apLogger.debug(JSON.stringify(this.user, null, 2)); + const object = ( this.user ? await signedGet(value, this.user) diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts index 0bd3414ee3..2fdf24075d 100644 --- a/packages/backend/src/server/api/endpoints/ap/show.ts +++ b/packages/backend/src/server/api/endpoints/ap/show.ts @@ -127,6 +127,7 @@ async function fetchAny( // fetching Object once from remote const resolver = new Resolver(); + resolver.setUser(me); const object = await resolver.resolve(uri); // /@user If a URI other than the id is specified, @@ -144,8 +145,8 @@ async function fetchAny( return await mergePack( me, - isActor(object) ? await createPerson(getApId(object)) : null, - isPost(object) ? await createNote(getApId(object), undefined, true) : null, + isActor(object) ? await createPerson(getApId(object), resolver) : null, + isPost(object) ? await createNote(getApId(object), resolver, true) : null, ); } From 1b77d101eeb7f5b5eaaaf3ad936686a16500051c Mon Sep 17 00:00:00 2001 From: sparrow <sparrow@spooky.academy> Date: Wed, 28 Jun 2023 00:41:18 +0100 Subject: [PATCH 205/309] Make redis and postgres tls optional and opt-in --- .config/example.yml | 4 +++- packages/backend/ormconfig.js | 6 +++--- packages/backend/src/config/types.ts | 2 ++ packages/backend/src/db/postgre.ts | 10 +++++----- packages/backend/src/db/redis.ts | 6 +++--- packages/backend/src/queue/initialize.ts | 6 +++--- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index ee61ebe25c..2d42c2522b 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -35,7 +35,7 @@ port: 3000 db: host: localhost port: 5432 - + #ssl: false # Database name db: calckey @@ -48,6 +48,7 @@ db: # Extra Connection options #extra: + # TODO: find another example # ssl: true # ┌─────────────────────┐ @@ -56,6 +57,7 @@ db: redis: host: localhost port: 6379 + #tls: false #family: 0 # 0=Both, 4=IPv4, 6=IPv6 #pass: example-pass #prefix: example-prefix diff --git a/packages/backend/ormconfig.js b/packages/backend/ormconfig.js index c230e09fd5..b4a9333560 100644 --- a/packages/backend/ormconfig.js +++ b/packages/backend/ormconfig.js @@ -12,8 +12,8 @@ export default new DataSource({ extra: config.db.extra, entities: entities, migrations: ["migration/*.js"], - ssl: { - rejectUnauthorized: false, + ssl: config.db.ssl ? { + rejectUnauthorized: false, //TODO make configurable ca: process.env.DB_SSL_CERT, - }, + } : undefined, }); diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index e9d1dbb645..93cb760f9b 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -15,6 +15,7 @@ export type Source = { pass: string; disableCache?: boolean; extra?: { [x: string]: string }; + ssl?: boolean; }; redis: { host: string; @@ -24,6 +25,7 @@ export type Source = { db?: number; prefix?: string; user?: string; + tls?: boolean; }; elasticsearch: { host: string; diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 0a0802a3a8..93de959a81 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -211,10 +211,10 @@ export const db = new DataSource({ password: config.redis.pass, keyPrefix: `${config.redis.prefix}:query:`, db: config.redis.db || 0, - tls: { + tls: config.redis.tls ? { host: config.redis.host, - rejectUnauthorized: false, - }, + rejectUnauthorized: false, // TODO make configurable + } : undefined, }, } : false, @@ -223,10 +223,10 @@ export const db = new DataSource({ maxQueryExecutionTime: 300, entities: entities, migrations: ["../../migration/*.js"], - ssl: { + ssl: config.db.ssl ? { rejectUnauthorized: false, ca: process.env.DB_SSL_CERT, - }, + } : undefined, }); export async function initDb(force = false) { diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index a54bad2e7a..e79b971081 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -10,10 +10,10 @@ export function createConnection() { username: config.redis.user ?? "default", keyPrefix: `${config.redis.prefix}:`, db: config.redis.db || 0, - tls: { - rejectUnauthorized: false, + tls: config.redis.tls ? { + rejectUnauthorized: false, //TODO make configurable host: config.redis.host, - }, + } : undefined, }); } diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts index 5d96f7747d..9a99d23e26 100644 --- a/packages/backend/src/queue/initialize.ts +++ b/packages/backend/src/queue/initialize.ts @@ -10,9 +10,9 @@ export function initialize<T>(name: string, limitPerSec = -1) { user: config.redis.user ?? "default", password: config.redis.pass, db: config.redis.db || 0, - tls: { - host: config.redis.host, - }, + tls: config.redis.tls ? { + host: config.redis.host, //TODO add configurable cert validation + } : undefined, }, prefix: config.redis.prefix ? `${config.redis.prefix}:queue` : "queue", limiter: From b20298ceb12491b0bb87dd9b98f7c2bd6c9aa535 Mon Sep 17 00:00:00 2001 From: Laura Hausmann <laura@hausmann.dev> Date: Wed, 28 Jun 2023 02:01:55 +0200 Subject: [PATCH 206/309] Fix AP resolver history on reuse for authorized fetch --- packages/backend/src/remote/activitypub/request.ts | 2 +- packages/backend/src/remote/activitypub/resolver.ts | 12 +++++++++++- packages/backend/src/server/api/endpoints/ap/show.ts | 8 ++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/remote/activitypub/request.ts b/packages/backend/src/remote/activitypub/request.ts index 7360f95449..69c97a445d 100644 --- a/packages/backend/src/remote/activitypub/request.ts +++ b/packages/backend/src/remote/activitypub/request.ts @@ -36,7 +36,7 @@ export default async (user: { id: User["id"] }, url: string, object: any) => { * @param url URL to fetch */ export async function signedGet(url: string, user: { id: User["id"] }) { - apLogger.debug("running signedGet on url: " + url); + apLogger.debug(`Running signedGet on url: ${url}`); const keypair = await getUserKeypair(user.id); const req = createSignedGet({ diff --git a/packages/backend/src/remote/activitypub/resolver.ts b/packages/backend/src/remote/activitypub/resolver.ts index e6bbf9fafc..608ca3e935 100644 --- a/packages/backend/src/remote/activitypub/resolver.ts +++ b/packages/backend/src/remote/activitypub/resolver.ts @@ -39,6 +39,11 @@ export default class Resolver { this.user = user; } + public reset(): Resolver { + this.history = new Set(); + return this; + } + public getHistory(): string[] { return Array.from(this.history); } @@ -61,15 +66,20 @@ export default class Resolver { } if (typeof value !== "string") { + apLogger.debug("Object to resolve is not a string"); if (typeof value.id !== "undefined") { const host = extractDbHost(getApId(value)); if (await shouldBlockInstance(host)) { throw new Error("instance is blocked"); } } + apLogger.debug("Returning existing object:"); + apLogger.debug(JSON.stringify(value, null, 2)); return value; } + apLogger.debug(`Resolving: ${value}`); + if (value.includes("#")) { // URLs with fragment parts cannot be resolved correctly because // the fragment part does not get transmitted over HTTP(S). @@ -107,7 +117,7 @@ export default class Resolver { this.user = await getInstanceActor(); } - apLogger.debug("getting object from remote, authenticated as user:"); + apLogger.debug("Getting object from remote, authenticated as user:"); apLogger.debug(JSON.stringify(this.user, null, 2)); const object = ( diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts index 2fdf24075d..3dd168d718 100644 --- a/packages/backend/src/server/api/endpoints/ap/show.ts +++ b/packages/backend/src/server/api/endpoints/ap/show.ts @@ -145,8 +145,12 @@ async function fetchAny( return await mergePack( me, - isActor(object) ? await createPerson(getApId(object), resolver) : null, - isPost(object) ? await createNote(getApId(object), resolver, true) : null, + isActor(object) + ? await createPerson(getApId(object), resolver.reset()) + : null, + isPost(object) + ? await createNote(getApId(object), resolver.reset(), true) + : null, ); } From cc32d09913c52f3ca12acb7c3b537108f3e94cee Mon Sep 17 00:00:00 2001 From: sparrow <sparrow@spooky.academy> Date: Wed, 28 Jun 2023 01:48:55 +0100 Subject: [PATCH 207/309] Remove static postgres tls settings They can be configured through `extra` in config. --- .config/example.yml | 5 +++-- packages/backend/ormconfig.js | 4 ---- packages/backend/src/config/types.ts | 1 - packages/backend/src/db/postgre.ts | 4 ---- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index 2d42c2522b..b96dc643ba 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -48,8 +48,9 @@ db: # Extra Connection options #extra: - # TODO: find another example - # ssl: true + # ssl: + # host: localhost + # rejectUnauthorized: false # ┌─────────────────────┐ #───┘ Redis configuration └───────────────────────────────────── diff --git a/packages/backend/ormconfig.js b/packages/backend/ormconfig.js index b4a9333560..5f85cead8a 100644 --- a/packages/backend/ormconfig.js +++ b/packages/backend/ormconfig.js @@ -12,8 +12,4 @@ export default new DataSource({ extra: config.db.extra, entities: entities, migrations: ["migration/*.js"], - ssl: config.db.ssl ? { - rejectUnauthorized: false, //TODO make configurable - ca: process.env.DB_SSL_CERT, - } : undefined, }); diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 93cb760f9b..028403374f 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -15,7 +15,6 @@ export type Source = { pass: string; disableCache?: boolean; extra?: { [x: string]: string }; - ssl?: boolean; }; redis: { host: string; diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 93de959a81..2295246eb1 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -223,10 +223,6 @@ export const db = new DataSource({ maxQueryExecutionTime: 300, entities: entities, migrations: ["../../migration/*.js"], - ssl: config.db.ssl ? { - rejectUnauthorized: false, - ca: process.env.DB_SSL_CERT, - } : undefined, }); export async function initDb(force = false) { From 2f1e9696a8f1e637d9789302bc17aea2aadf8962 Mon Sep 17 00:00:00 2001 From: sparrow <sparrow@spooky.academy> Date: Wed, 28 Jun 2023 02:11:02 +0100 Subject: [PATCH 208/309] empty object instead of undefined --- packages/backend/src/db/postgre.ts | 2 +- packages/backend/src/db/redis.ts | 2 +- packages/backend/src/queue/initialize.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 2295246eb1..a3f065e198 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -214,7 +214,7 @@ export const db = new DataSource({ tls: config.redis.tls ? { host: config.redis.host, rejectUnauthorized: false, // TODO make configurable - } : undefined, + } : {}, }, } : false, diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index e79b971081..0d353d3ce1 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -13,7 +13,7 @@ export function createConnection() { tls: config.redis.tls ? { rejectUnauthorized: false, //TODO make configurable host: config.redis.host, - } : undefined, + } : {}, }); } diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts index 9a99d23e26..d5cf2b9087 100644 --- a/packages/backend/src/queue/initialize.ts +++ b/packages/backend/src/queue/initialize.ts @@ -12,7 +12,7 @@ export function initialize<T>(name: string, limitPerSec = -1) { db: config.redis.db || 0, tls: config.redis.tls ? { host: config.redis.host, //TODO add configurable cert validation - } : undefined, + } : {}, }, prefix: config.redis.prefix ? `${config.redis.prefix}:queue` : "queue", limiter: From 516e0f8ecf35c55a41209059b9ba32eda22c9225 Mon Sep 17 00:00:00 2001 From: Laura Hausmann <laura@hausmann.dev> Date: Wed, 28 Jun 2023 03:43:32 +0200 Subject: [PATCH 209/309] Allow follower-only notes to be fetched by properly authorized remote users --- .../src/remote/activitypub/check-fetch.ts | 76 +++++++++++++++++++ packages/backend/src/server/activitypub.ts | 34 ++++++++- 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/remote/activitypub/check-fetch.ts b/packages/backend/src/remote/activitypub/check-fetch.ts index a8bbe61b84..3e52575a94 100644 --- a/packages/backend/src/remote/activitypub/check-fetch.ts +++ b/packages/backend/src/remote/activitypub/check-fetch.ts @@ -95,3 +95,79 @@ export async function checkFetch(req: IncomingMessage): Promise<number> { } return 200; } + +export async function getSignatureUser( + req: IncomingMessage, +): Promise<CacheableRemoteUser> { + let authUser; + const meta = await fetchMeta(); + if (meta.secureMode || meta.privateMode) { + let signature; + + try { + signature = httpSignature.parseRequest(req, { headers: [] }); + } catch (e) { + return null; + } + + const keyId = new URL(signature.keyId); + const host = toPuny(keyId.hostname); + + if (await shouldBlockInstance(host, meta)) { + return 403; + } + + if ( + meta.privateMode && + host !== config.host && + !meta.allowedHosts.includes(host) + ) { + return null; + } + + const keyIdLower = signature.keyId.toLowerCase(); + if (keyIdLower.startsWith("acct:")) { + // Old keyId is no longer supported. + return null; + } + + const dbResolver = new DbResolver(); + + // HTTP-Signature keyIdを元にDBから取得 + authUser = await dbResolver.getAuthUserFromKeyId(signature.keyId); + + // keyIdでわからなければ、resolveしてみる + if (authUser == null) { + try { + keyId.hash = ""; + authUser = await dbResolver.getAuthUserFromApId( + getApId(keyId.toString()), + ); + } catch (e) { + // できなければ駄目 + return null; + } + } + + // publicKey がなくても終了 + if (authUser?.key == null) { + return null; + } + + // もう一回チェック + if (authUser.user.host !== host) { + return null; + } + + // HTTP-Signatureの検証 + const httpSignatureValidated = httpSignature.verifySignature( + signature, + authUser.key.keyPem, + ); + + if (!httpSignatureValidated) { + return null; + } + } + return authUser; +} diff --git a/packages/backend/src/server/activitypub.ts b/packages/backend/src/server/activitypub.ts index 042ab446c7..548aafdd2f 100644 --- a/packages/backend/src/server/activitypub.ts +++ b/packages/backend/src/server/activitypub.ts @@ -20,7 +20,11 @@ import { import type { ILocalUser, User } from "@/models/entities/user.js"; import { renderLike } from "@/remote/activitypub/renderer/like.js"; import { getUserKeypair } from "@/misc/keypair-store.js"; -import { checkFetch, hasSignature } from "@/remote/activitypub/check-fetch.js"; +import { + checkFetch, + hasSignature, + getSignatureUser, +} from "@/remote/activitypub/check-fetch.js"; import { getInstanceActor } from "@/services/instance-actor.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; import renderFollow from "@/remote/activitypub/renderer/follow.js"; @@ -28,6 +32,7 @@ import Featured from "./activitypub/featured.js"; import Following from "./activitypub/following.js"; import Followers from "./activitypub/followers.js"; import Outbox, { packActivity } from "./activitypub/outbox.js"; +import { serverLogger } from "./index.js"; // Init router const router = new Router(); @@ -84,7 +89,7 @@ router.get("/notes/:note", async (ctx, next) => { const note = await Notes.findOneBy({ id: ctx.params.note, - visibility: In(["public" as const, "home" as const]), + visibility: In(["public" as const, "home" as const, "followers" as const]), localOnly: false, }); @@ -103,6 +108,31 @@ router.get("/notes/:note", async (ctx, next) => { return; } + if (note.visibility == "followers") { + serverLogger.debug( + "Responding to request for follower-only note, validating access...", + ); + let remoteUser = await getSignatureUser(ctx.req); + serverLogger.debug("Local note author user:"); + serverLogger.debug(JSON.stringify(note, null, 2)); + serverLogger.debug("Authenticated remote user:"); + serverLogger.debug(JSON.stringify(remoteUser, null, 2)); + + let relation = await Users.getRelation(remoteUser.user.id, note.userId); + serverLogger.debug("Relation:"); + serverLogger.debug(JSON.stringify(relation, null, 2)); + + if (!relation.isFollowing || relation.isBlocked) { + serverLogger.debug( + "Rejecting: authenticated user is not following us or was blocked by us", + ); + ctx.status = 403; + return; + } + + serverLogger.debug("Accepting: access criteria met"); + } + ctx.body = renderActivity(await renderNote(note, false)); const meta = await fetchMeta(); From f0256b08ffe566885521d48ba275708a46e2703b Mon Sep 17 00:00:00 2001 From: sparrow <sparrow@spooky.academy> Date: Wed, 28 Jun 2023 03:09:22 +0100 Subject: [PATCH 210/309] expose redis tls settings directly to config --- .config/example.yml | 4 +++- packages/backend/src/config/types.ts | 2 +- packages/backend/src/db/postgre.ts | 5 +---- packages/backend/src/db/redis.ts | 5 +---- packages/backend/src/queue/initialize.ts | 4 +--- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index b96dc643ba..51d380e7e7 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -58,7 +58,9 @@ db: redis: host: localhost port: 6379 - #tls: false + #tls: + # host: localhost + # rejectUnauthorized: false #family: 0 # 0=Both, 4=IPv4, 6=IPv6 #pass: example-pass #prefix: example-prefix diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 028403374f..cbe27543b3 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -24,7 +24,7 @@ export type Source = { db?: number; prefix?: string; user?: string; - tls?: boolean; + tls?: { [x: string]: string }; }; elasticsearch: { host: string; diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index a3f065e198..f632a6ec4a 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -211,10 +211,7 @@ export const db = new DataSource({ password: config.redis.pass, keyPrefix: `${config.redis.prefix}:query:`, db: config.redis.db || 0, - tls: config.redis.tls ? { - host: config.redis.host, - rejectUnauthorized: false, // TODO make configurable - } : {}, + tls: config.redis.tls || {} , }, } : false, diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index 0d353d3ce1..24563661e9 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -10,10 +10,7 @@ export function createConnection() { username: config.redis.user ?? "default", keyPrefix: `${config.redis.prefix}:`, db: config.redis.db || 0, - tls: config.redis.tls ? { - rejectUnauthorized: false, //TODO make configurable - host: config.redis.host, - } : {}, + tls: config.redis.tls || {}, }); } diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts index d5cf2b9087..8d728df5be 100644 --- a/packages/backend/src/queue/initialize.ts +++ b/packages/backend/src/queue/initialize.ts @@ -10,9 +10,7 @@ export function initialize<T>(name: string, limitPerSec = -1) { user: config.redis.user ?? "default", password: config.redis.pass, db: config.redis.db || 0, - tls: config.redis.tls ? { - host: config.redis.host, //TODO add configurable cert validation - } : {}, + tls: config.redis.tls || {}, }, prefix: config.redis.prefix ? `${config.redis.prefix}:queue` : "queue", limiter: From bb43cc27eee69dd3996c80522552949d7e0e739b Mon Sep 17 00:00:00 2001 From: sparrow <sparrow@spooky.academy> Date: Wed, 28 Jun 2023 03:10:54 +0100 Subject: [PATCH 211/309] update helm config template --- chart/templates/_helpers.tpl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl index 62ff2f8ff0..81009ed017 100644 --- a/chart/templates/_helpers.tpl +++ b/chart/templates/_helpers.tpl @@ -137,7 +137,9 @@ db: # Extra Connection options #extra: - # ssl: true + # ssl: + # host: localhost + # rejectUnauthorized: false # ┌─────────────────────┐ #───┘ Redis configuration └───────────────────────────────────── @@ -154,6 +156,9 @@ redis: #prefix: example-prefix #db: 1 #user: default + #tls: + # host: localhost + # rejectUnauthorized: false # ┌─────────────────────┐ #───┘ Sonic configuration └───────────────────────────────────── From ad62cadb7d972516459e76a7344f2a656e1594a2 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 27 Jun 2023 19:25:01 -0700 Subject: [PATCH 212/309] fix: :wheelchair: don't animate indicator dot if animation is off Closes #10372 --- .../client/src/components/MkLaunchPad.vue | 19 ++++++++++-- packages/client/src/components/MkMenu.vue | 31 ++++++++++++++++--- packages/client/src/style.scss | 9 ++++++ .../src/ui/_common_/navbar-for-mobile.vue | 11 ++++++- packages/client/src/ui/_common_/navbar.vue | 15 ++++++++- packages/client/src/ui/deck.vue | 13 ++++++-- packages/client/src/ui/universal.vue | 17 ++++++++-- 7 files changed, 102 insertions(+), 13 deletions(-) diff --git a/packages/client/src/components/MkLaunchPad.vue b/packages/client/src/components/MkLaunchPad.vue index b1f42ec76b..bc268f2e95 100644 --- a/packages/client/src/components/MkLaunchPad.vue +++ b/packages/client/src/components/MkLaunchPad.vue @@ -29,7 +29,12 @@ > <i class="icon" :class="item.icon"></i> <div class="text">{{ item.text }}</div> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -41,7 +46,12 @@ > <i class="icon" :class="item.icon"></i> <div class="text">{{ item.text }}</div> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </MkA> @@ -163,13 +173,16 @@ function close() { left: 32px; color: var(--indicator); font-size: 8px; - animation: blink 1s infinite; @media (max-width: 500px) { top: 16px; left: 16px; } } + + > .animateIndicator { + animation: blink 1s infinite; + } } } diff --git a/packages/client/src/components/MkMenu.vue b/packages/client/src/components/MkMenu.vue index 2d8fde610b..dea14ef053 100644 --- a/packages/client/src/components/MkMenu.vue +++ b/packages/client/src/components/MkMenu.vue @@ -52,7 +52,12 @@ <span :style="item.textStyle || ''">{{ item.text }}</span> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </MkA> @@ -74,7 +79,12 @@ <span :style="item.textStyle || ''">{{ item.text }}</span> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </a> @@ -92,7 +102,12 @@ class="avatar" disableLink /><MkUserName :user="item.user" /> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -158,7 +173,12 @@ <span :style="item.textStyle || ''">{{ item.text }}</span> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -483,6 +503,9 @@ onBeforeUnmount(() => { left: 13px; color: var(--indicator); font-size: 12px; + } + + > .animateIndicator { animation: blink 1s infinite; } } diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 966e44f924..d110e516e0 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -710,6 +710,15 @@ hr { transform: scale3d(1, 1, 1); } } + + @keyframes blink { + 0% { + opacity: 1; + } + 100% { + opacity: 1; + } + } } ._anime_bounce { diff --git a/packages/client/src/ui/_common_/navbar-for-mobile.vue b/packages/client/src/ui/_common_/navbar-for-mobile.vue index 39abb7c261..03a8e6d8a7 100644 --- a/packages/client/src/ui/_common_/navbar-for-mobile.vue +++ b/packages/client/src/ui/_common_/navbar-for-mobile.vue @@ -62,6 +62,9 @@ <span v-if="navbarItemDef[item].indicated" class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="icon ph-circle ph-fill"></i ></span> </component> @@ -82,7 +85,10 @@ class="icon ph-dots-three-outline ph-bold ph-lg ph-fw ph-lg" ></i ><span class="text">{{ i18n.ts.more }}</span> - <span v-if="otherMenuItemIndicated" class="indicator" + <span + v-if="otherMenuItemIndicated" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="icon ph-circle ph-fill"></i ></span> </button> @@ -341,6 +347,9 @@ function more() { left: 20px; color: var(--navIndicator); font-size: 8px; + } + + > .animateIndicator { animation: blink 1s infinite; } diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue index 7905c331c7..f63be18cbe 100644 --- a/packages/client/src/ui/_common_/navbar.vue +++ b/packages/client/src/ui/_common_/navbar.vue @@ -66,6 +66,9 @@ <span v-if="navbarItemDef[item].indicated" class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="icon ph-circle ph-fill"></i ></span> </component> @@ -88,6 +91,7 @@ updateAvailable " class="indicator" + :class="{ animateIndicator: $store.state.animation }" ></span ><i class="icon ph-door ph-bold ph-fw ph-lg"></i ><span class="text">{{ i18n.ts.controlPanel }}</span> @@ -102,7 +106,10 @@ class="icon ph-dots-three-outline ph-bold ph-fw ph-lg" ></i ><span class="text">{{ i18n.ts.more }}</span> - <span v-if="otherMenuItemIndicated" class="indicator" + <span + v-if="otherMenuItemIndicated" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="icon ph-circle ph-fill"></i ></span> </button> @@ -419,6 +426,9 @@ function more(ev: MouseEvent) { left: 20px; color: var(--navIndicator); font-size: 8px; + } + + > .animateIndicator { animation: blink 1s infinite; } @@ -602,6 +612,9 @@ function more(ev: MouseEvent) { left: 24px; color: var(--navIndicator); font-size: 8px; + } + + > .animateIndicator { animation: blink 1s infinite; } diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index 270a92a5ee..944ee17e5c 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -119,7 +119,10 @@ @click="drawerMenuShowing = true" > <i class="ph-list ph-bold ph-lg"></i - ><span v-if="menuIndicated" class="indicator" + ><span + v-if="menuIndicated" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -136,7 +139,10 @@ @click="mainRouter.push('/my/notifications')" > <i class="ph-bell ph-bold ph-lg"></i - ><span v-if="$i?.hasUnreadNotification" class="indicator" + ><span + v-if="$i?.hasUnreadNotification" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -551,6 +557,9 @@ async function deleteProfile() { left: 0; color: var(--indicator); font-size: 16px; + } + + > .animateIndicator { animation: blink 1s infinite; } diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue index c9e66cf345..e7a1f97f37 100644 --- a/packages/client/src/ui/universal.vue +++ b/packages/client/src/ui/universal.vue @@ -39,7 +39,10 @@ > <div class="button-wrapper"> <i class="ph-list ph-bold ph-lg"></i - ><span v-if="menuIndicated" class="indicator" + ><span + v-if="menuIndicated" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </div> @@ -74,7 +77,10 @@ :class="buttonAnimIndex === 1 ? 'on' : ''" > <i class="ph-bell ph-bold ph-lg"></i - ><span v-if="$i?.hasUnreadNotification" class="indicator" + ><span + v-if="$i?.hasUnreadNotification" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </div> @@ -95,6 +101,7 @@ ><span v-if="$i?.hasUnreadMessagingMessage" class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </div> @@ -692,6 +699,9 @@ console.log(mainRouter.currentRoute.value.name); left: 0; color: var(--indicator); font-size: 16px; + } + + > .animateIndicator { animation: blink 1s infinite; } } @@ -713,6 +723,9 @@ console.log(mainRouter.currentRoute.value.name); left: 0; color: var(--indicator); font-size: 16px; + } + + > .animateIndicator { animation: blink 1s infinite; } From 5c10b18014679a03995bd9d6c581a736410f988f Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 27 Jun 2023 19:32:17 -0700 Subject: [PATCH 213/309] chore: :art: format, add scss to prettier formatting --- packages/client/package.json | 2 +- .../src/components/MkReactionsViewer.vue | 16 +- .../client/src/pages/settings/general.vue | 18 +- packages/client/src/style.scss | 225 ++++++++++-------- 4 files changed, 156 insertions(+), 105 deletions(-) diff --git a/packages/client/package.json b/packages/client/package.json index 4cb60bbc4f..4858ad1f0a 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -5,7 +5,7 @@ "watch": "pnpm vite build --watch --mode development", "build": "pnpm vite build", "lint": "pnpm rome check \"src/**/*.{ts,vue}\"", - "format": "pnpm prettier --write '**/*.vue'" + "format": "pnpm prettier --write '**/*.{scss,vue}'" }, "devDependencies": { "@discordapp/twemoji": "14.1.2", diff --git a/packages/client/src/components/MkReactionsViewer.vue b/packages/client/src/components/MkReactionsViewer.vue index f5a9a6cb2e..b60c53df6b 100644 --- a/packages/client/src/components/MkReactionsViewer.vue +++ b/packages/client/src/components/MkReactionsViewer.vue @@ -7,7 +7,7 @@ :count="count" :is-initial="initialReactions.has(reaction)" :note="note" - @reacted="reactionsEl.scrollTo(0,0)" + @reacted="reactionsEl.scrollTo(0, 0)" /> </div> </template> @@ -37,8 +37,18 @@ const isMe = computed(() => $i && $i.id === props.note.userId); overflow-x: auto; margin-inline: -24px; padding-inline: 22px 160px; - mask: linear-gradient(to right, transparent, black 24px calc(100% - 160px), transparent); - -webkit-mask: linear-gradient(to right, transparent, black 24px calc(100% - 160px), transparent); + mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 160px), + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 160px), + transparent + ); scrollbar-width: none; &::-webkit-scrollbar { display: none; diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue index 0add2b9df9..3a3bf6bb1d 100644 --- a/packages/client/src/pages/settings/general.vue +++ b/packages/client/src/pages/settings/general.vue @@ -45,12 +45,18 @@ class="_formBlock" >{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch > - <FormSwitch v-if="deviceKind !== 'desktop'" v-model="swipeOnMobile" class="_formBlock">{{ - i18n.ts.swipeOnMobile - }}</FormSwitch> - <FormSwitch v-if="deviceKind === 'desktop'" v-model="swipeOnDesktop" class="_formBlock">{{ - i18n.ts.swipeOnDesktop - }}</FormSwitch> + <FormSwitch + v-if="deviceKind !== 'desktop'" + v-model="swipeOnMobile" + class="_formBlock" + >{{ i18n.ts.swipeOnMobile }}</FormSwitch + > + <FormSwitch + v-if="deviceKind === 'desktop'" + v-model="swipeOnDesktop" + class="_formBlock" + >{{ i18n.ts.swipeOnDesktop }}</FormSwitch + > <FormSwitch v-model="enterSendsMessage" class="_formBlock">{{ i18n.ts.enterSendsMessage }}</FormSwitch> diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index d110e516e0..8ce3d56d21 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -13,22 +13,14 @@ } // https://larsenwork.com/easing-gradients/ - --gradient: hsl(0, 0%, 0%) 0%, - hsla(0, 0%, 0%, 0.987) 8.1%, - hsla(0, 0%, 0%, 0.951) 15.5%, - hsla(0, 0%, 0%, 0.896) 22.5%, - hsla(0, 0%, 0%, 0.825) 29%, - hsla(0, 0%, 0%, 0.741) 35.3%, - hsla(0, 0%, 0%, 0.648) 41.2%, - hsla(0, 0%, 0%, 0.55) 47.1%, - hsla(0, 0%, 0%, 0.45) 52.9%, - hsla(0, 0%, 0%, 0.352) 58.8%, - hsla(0, 0%, 0%, 0.259) 64.7%, - hsla(0, 0%, 0%, 0.175) 71%, - hsla(0, 0%, 0%, 0.104) 77.5%, - hsla(0, 0%, 0%, 0.049) 84.5%, - hsla(0, 0%, 0%, 0.013) 91.9%, - hsla(0, 0%, 0%, 0) 100%; + --gradient: hsl(0, 0%, 0%) 0%, hsla(0, 0%, 0%, 0.987) 8.1%, + hsla(0, 0%, 0%, 0.951) 15.5%, hsla(0, 0%, 0%, 0.896) 22.5%, + hsla(0, 0%, 0%, 0.825) 29%, hsla(0, 0%, 0%, 0.741) 35.3%, + hsla(0, 0%, 0%, 0.648) 41.2%, hsla(0, 0%, 0%, 0.55) 47.1%, + hsla(0, 0%, 0%, 0.45) 52.9%, hsla(0, 0%, 0%, 0.352) 58.8%, + hsla(0, 0%, 0%, 0.259) 64.7%, hsla(0, 0%, 0%, 0.175) 71%, + hsla(0, 0%, 0%, 0.104) 77.5%, hsla(0, 0%, 0%, 0.049) 84.5%, + hsla(0, 0%, 0%, 0.013) 91.9%, hsla(0, 0%, 0%, 0) 100%; //--ad: rgb(255 169 0 / 10%); } @@ -56,7 +48,9 @@ html { overflow-x: clip; &.useSystemFont { - font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", + Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", + sans-serif; } } body::-webkit-scrollbar { @@ -98,12 +92,16 @@ body::-webkit-scrollbar-thumb { } html._themeChanging_ { - &, *, ::before, ::after { + &, + *, + ::before, + ::after { transition: background 1s ease, border 1s ease !important; } } -html, body { +html, +body { margin: 0; padding: 0; } @@ -111,8 +109,18 @@ html, body { .swiper { margin-inline: -24px !important; padding-inline: 24px !important; - mask: linear-gradient(to right, transparent, black 24px calc(100% - 24px), transparent); - -webkit-mask: linear-gradient(to right, transparent, black 24px calc(100% - 24px), transparent); + mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 24px), + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 24px), + transparent + ); } .swiper-slide { min-height: 100vh; @@ -129,11 +137,13 @@ a { // transform: translateY(0.1em); // } -textarea, input { +textarea, +input { -webkit-tap-highlight-color: transparent; } -optgroup, option { +optgroup, +option { background: var(--panel); color: var(--fg); } @@ -150,8 +160,12 @@ hr { } @keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } } ._noSelect { @@ -161,7 +175,8 @@ hr { } ._ghost { - &, * { + &, + * { @extend ._noSelect; pointer-events: none; } @@ -201,7 +216,8 @@ hr { font-family: inherit; line-height: inherit; - &, * { + &, + * { @extend ._noSelect; } @@ -241,7 +257,9 @@ hr { transition: background 0.2s; } - &:hover:before, &:focus::before, &.highlighted::before { + &:hover:before, + &:focus::before, + &.highlighted::before { background: var(--buttonBg); } &:focus-visible::before { @@ -269,7 +287,11 @@ hr { ._buttonGradate { @extend ._buttonPrimary; color: var(--fgOnAccent); - background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); + background: linear-gradient( + 90deg, + var(--buttonGradateA), + var(--buttonGradateB) + ); &:not(:disabled):hover { background: linear-gradient(90deg, var(--X8), var(--X8)); @@ -282,7 +304,7 @@ hr { ._help { color: var(--accent); - cursor: help + cursor: help; } ._textButton { @@ -486,7 +508,7 @@ hr { bottom: 0; z-index: -1; background: var(--bg); - opacity: .75; + opacity: 0.75; } } } @@ -517,7 +539,7 @@ hr { ._flexList { display: flex; flex-wrap: wrap; - gap: .2em; + gap: 0.2em; width: min-content; min-width: 100%; &._center { @@ -594,7 +616,7 @@ hr { color: var(--link); &:after { - content: ''; + content: ""; position: absolute; bottom: 0; left: 0; @@ -635,10 +657,15 @@ hr { } :not(.noGap):not(._block) > { - .note-container, .cmuxhskf > section, ._gap > ._block, ._panel, .noGap, .profile, .card { - &:not(.caution) - { - box-shadow: 0 4px 25px rgba(0,0,0,0.04); + .note-container, + .cmuxhskf > section, + ._gap > ._block, + ._panel, + .noGap, + .profile, + .card { + &:not(.caution) { + box-shadow: 0 4px 25px rgba(0, 0, 0, 0.04); border-radius: var(--radius); overflow: clip; } @@ -651,21 +678,29 @@ hr { ._zoom { transition-duration: 0.5s, 0.5s; transition-property: opacity, transform; - transition-timing-function: cubic-bezier(0,.5,.5,1); + transition-timing-function: cubic-bezier(0, 0.5, 0.5, 1); } -.zoom-enter-active, .zoom-leave-active { +.zoom-enter-active, +.zoom-leave-active { transition: opacity 0.5s, transform 0.5s !important; } -.zoom-enter-from, .zoom-leave-to { +.zoom-enter-from, +.zoom-leave-to { opacity: 0; transform: scale(0.9); } @keyframes blink { - 0% { opacity: 1; } - 70% { opacity: 0; } - 100% { opacity: 1; } + 0% { + opacity: 1; + } + 70% { + opacity: 0; + } + 100% { + opacity: 1; + } } @keyframes tada { @@ -696,7 +731,7 @@ hr { } } -@media(prefers-reduced-motion) { +@media (prefers-reduced-motion) { @keyframes tada { from { transform: scale3d(1, 1, 1); @@ -723,101 +758,101 @@ hr { ._anime_bounce { will-change: transform; - animation: bounce ease 0.7s; - animation-iteration-count: 1; - transform-origin: 50% 50%; + animation: bounce ease 0.7s; + animation-iteration-count: 1; + transform-origin: 50% 50%; } ._anime_bounce_ready { will-change: transform; - transform: scaleX(0.90) scaleY(0.90) ; + transform: scaleX(0.9) scaleY(0.9); } ._anime_bounce_standBy { transition: transform 0.1s ease; } -@keyframes bounce{ - 0% { - transform: scaleX(0.90) scaleY(0.90) ; - } - 19% { - transform: scaleX(1.10) scaleY(1.10) ; - } - 48% { - transform: scaleX(0.95) scaleY(0.95) ; - } - 100% { - transform: scaleX(1.00) scaleY(1.00) ; - } +@keyframes bounce { + 0% { + transform: scaleX(0.9) scaleY(0.9); + } + 19% { + transform: scaleX(1.1) scaleY(1.1); + } + 48% { + transform: scaleX(0.95) scaleY(0.95); + } + 100% { + transform: scaleX(1) scaleY(1); + } } .ph-xxs { - font-size: 0.5em; + font-size: 0.5em; } .ph-xs { - font-size: 0.75em; + font-size: 0.75em; } .ph-sm { - font-size: 0.875em; + font-size: 0.875em; } .ph-lg { - font-size: 1.3333em; - line-height: 0.75em; - vertical-align: -0.0667em; + font-size: 1.3333em; + line-height: 0.75em; + vertical-align: -0.0667em; justify-content: center; } .ph-xl { - font-size: 1.5em; - line-height: 0.6666em; - vertical-align: -0.075em; + font-size: 1.5em; + line-height: 0.6666em; + vertical-align: -0.075em; } .ph-1x { - font-size: 1em; + font-size: 1em; } .ph-2x { - font-size: 2em; + font-size: 2em; } .ph-3x { - font-size: 3em; + font-size: 3em; } .ph-4x { - font-size: 4em; + font-size: 4em; } .ph-5x { - font-size: 5em; + font-size: 5em; } .ph-6x { - font-size: 6em; + font-size: 6em; } .ph-7x { - font-size: 7em; + font-size: 7em; } .ph-8x { - font-size: 8em; + font-size: 8em; } .ph-9x { - font-size: 9em; + font-size: 9em; } .ph-10x { - font-size: 10em; + font-size: 10em; } .ph-fw { - text-align: center; - width: 1.25em; + text-align: center; + width: 1.25em; display: inline-flex; } @@ -831,24 +866,24 @@ hr { } ._otp_input { - width: 30px; - height: 30px; - padding: 5px; - margin: 1rem 7px auto; - font-size: 20px; - border-radius: 4px; - border: 2px solid var(--accent); + width: 30px; + height: 30px; + padding: 5px; + margin: 1rem 7px auto; + font-size: 20px; + border-radius: 4px; + border: 2px solid var(--accent); background-color: var(--accentedBg); color: var(--fg); - text-align: center; + text-align: center; } ._otp_input.error { - border-color: var(--error) !important; + border-color: var(--error) !important; } ._otp_input::-webkit-inner-spin-button, ._otp_input::-webkit-outer-spin-button { - -webkit-appearance: none; - margin: 0; + -webkit-appearance: none; + margin: 0; } @keyframes reset { @@ -861,7 +896,7 @@ hr { animation-duration: 0s !important; } -@media(prefers-reduced-motion: no-preference) { +@media (prefers-reduced-motion: no-preference) { @keyframes scaleIn { from { transform: scale(0); @@ -870,7 +905,7 @@ hr { } @keyframes scaleInSmall { from { - transform: scale(.8); + transform: scale(0.8); opacity: 0; } } From 022d478fa87cdb1e4112a7dff24d997af621e13b Mon Sep 17 00:00:00 2001 From: sparrow <sparrow@spooky.academy> Date: Wed, 28 Jun 2023 03:55:29 +0100 Subject: [PATCH 214/309] format --- packages/backend/src/db/postgre.ts | 2 +- .../src/components/MkReactionsViewer.vue | 16 +++++++++++++--- packages/client/src/pages/settings/general.vue | 18 ++++++++++++------ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index f632a6ec4a..1ba226a8e1 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -211,7 +211,7 @@ export const db = new DataSource({ password: config.redis.pass, keyPrefix: `${config.redis.prefix}:query:`, db: config.redis.db || 0, - tls: config.redis.tls || {} , + tls: config.redis.tls || {}, }, } : false, diff --git a/packages/client/src/components/MkReactionsViewer.vue b/packages/client/src/components/MkReactionsViewer.vue index f5a9a6cb2e..b60c53df6b 100644 --- a/packages/client/src/components/MkReactionsViewer.vue +++ b/packages/client/src/components/MkReactionsViewer.vue @@ -7,7 +7,7 @@ :count="count" :is-initial="initialReactions.has(reaction)" :note="note" - @reacted="reactionsEl.scrollTo(0,0)" + @reacted="reactionsEl.scrollTo(0, 0)" /> </div> </template> @@ -37,8 +37,18 @@ const isMe = computed(() => $i && $i.id === props.note.userId); overflow-x: auto; margin-inline: -24px; padding-inline: 22px 160px; - mask: linear-gradient(to right, transparent, black 24px calc(100% - 160px), transparent); - -webkit-mask: linear-gradient(to right, transparent, black 24px calc(100% - 160px), transparent); + mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 160px), + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 160px), + transparent + ); scrollbar-width: none; &::-webkit-scrollbar { display: none; diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue index 0add2b9df9..3a3bf6bb1d 100644 --- a/packages/client/src/pages/settings/general.vue +++ b/packages/client/src/pages/settings/general.vue @@ -45,12 +45,18 @@ class="_formBlock" >{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch > - <FormSwitch v-if="deviceKind !== 'desktop'" v-model="swipeOnMobile" class="_formBlock">{{ - i18n.ts.swipeOnMobile - }}</FormSwitch> - <FormSwitch v-if="deviceKind === 'desktop'" v-model="swipeOnDesktop" class="_formBlock">{{ - i18n.ts.swipeOnDesktop - }}</FormSwitch> + <FormSwitch + v-if="deviceKind !== 'desktop'" + v-model="swipeOnMobile" + class="_formBlock" + >{{ i18n.ts.swipeOnMobile }}</FormSwitch + > + <FormSwitch + v-if="deviceKind === 'desktop'" + v-model="swipeOnDesktop" + class="_formBlock" + >{{ i18n.ts.swipeOnDesktop }}</FormSwitch + > <FormSwitch v-model="enterSendsMessage" class="_formBlock">{{ i18n.ts.enterSendsMessage }}</FormSwitch> From 487e7ba43cddac3d1dd3c31042f5bc1bb70b79be Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 27 Jun 2023 22:20:52 -0700 Subject: [PATCH 215/309] fixes --- .../backend/src/remote/activitypub/check-fetch.ts | 15 ++++++++++----- packages/backend/src/server/activitypub.ts | 12 +++++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/backend/src/remote/activitypub/check-fetch.ts b/packages/backend/src/remote/activitypub/check-fetch.ts index 3e52575a94..a3e241c254 100644 --- a/packages/backend/src/remote/activitypub/check-fetch.ts +++ b/packages/backend/src/remote/activitypub/check-fetch.ts @@ -7,6 +7,8 @@ import DbResolver from "@/remote/activitypub/db-resolver.js"; import { getApId } from "@/remote/activitypub/type.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js"; import type { IncomingMessage } from "http"; +import type { CacheableRemoteUser } from "@/models/entities/user.js"; +import type { UserPublickey } from "@/models/entities/user-publickey.js"; export async function hasSignature(req: IncomingMessage): Promise<string> { const meta = await fetchMeta(); @@ -98,7 +100,10 @@ export async function checkFetch(req: IncomingMessage): Promise<number> { export async function getSignatureUser( req: IncomingMessage, -): Promise<CacheableRemoteUser> { +): Promise<{ + user: CacheableRemoteUser; + key: UserPublickey | null; +} | null> { let authUser; const meta = await fetchMeta(); if (meta.secureMode || meta.privateMode) { @@ -114,7 +119,7 @@ export async function getSignatureUser( const host = toPuny(keyId.hostname); if (await shouldBlockInstance(host, meta)) { - return 403; + return null; } if ( @@ -137,20 +142,20 @@ export async function getSignatureUser( authUser = await dbResolver.getAuthUserFromKeyId(signature.keyId); // keyIdでわからなければ、resolveしてみる - if (authUser == null) { + if (!authUser) { try { keyId.hash = ""; authUser = await dbResolver.getAuthUserFromApId( getApId(keyId.toString()), ); - } catch (e) { + } catch { // できなければ駄目 return null; } } // publicKey がなくても終了 - if (authUser?.key == null) { + if (!authUser?.key) { return null; } diff --git a/packages/backend/src/server/activitypub.ts b/packages/backend/src/server/activitypub.ts index 548aafdd2f..f9d5eb99c3 100644 --- a/packages/backend/src/server/activitypub.ts +++ b/packages/backend/src/server/activitypub.ts @@ -108,17 +108,23 @@ router.get("/notes/:note", async (ctx, next) => { return; } - if (note.visibility == "followers") { + if (note.visibility === "followers") { serverLogger.debug( "Responding to request for follower-only note, validating access...", ); - let remoteUser = await getSignatureUser(ctx.req); + const remoteUser = await getSignatureUser(ctx.req); serverLogger.debug("Local note author user:"); serverLogger.debug(JSON.stringify(note, null, 2)); serverLogger.debug("Authenticated remote user:"); serverLogger.debug(JSON.stringify(remoteUser, null, 2)); - let relation = await Users.getRelation(remoteUser.user.id, note.userId); + if (remoteUser == null) { + serverLogger.debug("Rejecting: no user"); + ctx.status = 401; + return; + } + + const relation = await Users.getRelation(remoteUser.user.id, note.userId); serverLogger.debug("Relation:"); serverLogger.debug(JSON.stringify(relation, null, 2)); From 89e4e3ea5bf8c631f366f027b29ff51dccb2a232 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@noreply.codeberg.org> Date: Tue, 27 Jun 2023 22:44:16 -0700 Subject: [PATCH 216/309] refactor: simplify getSignatureUser --- .../src/remote/activitypub/check-fetch.ts | 84 +++---------------- 1 file changed, 12 insertions(+), 72 deletions(-) diff --git a/packages/backend/src/remote/activitypub/check-fetch.ts b/packages/backend/src/remote/activitypub/check-fetch.ts index a3e241c254..c885b4a199 100644 --- a/packages/backend/src/remote/activitypub/check-fetch.ts +++ b/packages/backend/src/remote/activitypub/check-fetch.ts @@ -98,81 +98,21 @@ export async function checkFetch(req: IncomingMessage): Promise<number> { return 200; } -export async function getSignatureUser( - req: IncomingMessage, -): Promise<{ +export async function getSignatureUser(req: IncomingMessage): Promise<{ user: CacheableRemoteUser; key: UserPublickey | null; } | null> { - let authUser; - const meta = await fetchMeta(); - if (meta.secureMode || meta.privateMode) { - let signature; + const signature = httpSignature.parseRequest(req, { headers: [] }); + const keyId = new URL(signature.keyId); + const dbResolver = new DbResolver(); - try { - signature = httpSignature.parseRequest(req, { headers: [] }); - } catch (e) { - return null; - } - - const keyId = new URL(signature.keyId); - const host = toPuny(keyId.hostname); - - if (await shouldBlockInstance(host, meta)) { - return null; - } - - if ( - meta.privateMode && - host !== config.host && - !meta.allowedHosts.includes(host) - ) { - return null; - } - - const keyIdLower = signature.keyId.toLowerCase(); - if (keyIdLower.startsWith("acct:")) { - // Old keyId is no longer supported. - return null; - } - - const dbResolver = new DbResolver(); - - // HTTP-Signature keyIdを元にDBから取得 - authUser = await dbResolver.getAuthUserFromKeyId(signature.keyId); - - // keyIdでわからなければ、resolveしてみる - if (!authUser) { - try { - keyId.hash = ""; - authUser = await dbResolver.getAuthUserFromApId( - getApId(keyId.toString()), - ); - } catch { - // できなければ駄目 - return null; - } - } - - // publicKey がなくても終了 - if (!authUser?.key) { - return null; - } - - // もう一回チェック - if (authUser.user.host !== host) { - return null; - } - - // HTTP-Signatureの検証 - const httpSignatureValidated = httpSignature.verifySignature( - signature, - authUser.key.keyPem, - ); - - if (!httpSignatureValidated) { - return null; - } + // Retrieve from DB by HTTP-Signature keyId + const authUser = await dbResolver.getAuthUserFromKeyId(signature.keyId); + if (authUser) { + return authUser; } - return authUser; + + // Resolve if failed to retrieve by keyId + keyId.hash = ""; + return await dbResolver.getAuthUserFromApId(getApId(keyId.toString())); } From 4147073fdacca1383826763d7b4b40bd0f9978a8 Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Tue, 27 Jun 2023 05:23:08 +0000 Subject: [PATCH 217/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1814 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 455a091306..4e8a475282 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -2135,3 +2135,11 @@ _dialog: removeReaction: Elimina la teva reacció reactionPickerSkinTone: To de pell d'emoji preferit alt: ALT +_skinTones: + light: Clar + mediumLight: Clar Mitx + medium: Mitx + mediumDark: Fosc Mitx + dark: Fosc + yellow: Groc +swipeOnMobile: Permet lliscar entre pàgines From bf1e61236b90b6addbd4d3c6661d68f13a8684ef Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 27 Jun 2023 23:01:21 -0700 Subject: [PATCH 218/309] fix: :bug: security key display name Closes #10313 --- packages/client/src/pages/settings/2fa.vue | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue index 48d27c31a4..ddca361cdc 100644 --- a/packages/client/src/pages/settings/2fa.vue +++ b/packages/client/src/pages/settings/2fa.vue @@ -78,16 +78,9 @@ v-for="key in $i.securityKeysList" :key="key.id" > - <template #label>{{ key.name }}</template> - <template #suffix - ><I18n :src="i18n.ts.lastUsedAt" - ><template #t - ><MkTime - :time=" - key.lastUsed - " /></template></I18n - ></template> - <div class="_buttons"> + <h3>{{ key.name }}</h3> + <p>{{ `${i18n.ts.lastUsedDate}: ${key.lastUsed}` }} </p> + <div class="_buttons _flexList"> <MkButton @click="renameKey(key)" ><i class="ph-pencil-line ph-bold ph-lg" From 0015afaca8fd80ca2780d113c03d328a1b49e67c Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Tue, 27 Jun 2023 23:37:24 -0700 Subject: [PATCH 219/309] chore: :art: format --- packages/backend/assets/favicon.svg | 2 +- packages/backend/assets/inverse wordmark.svg | 2 +- packages/backend/test/resources/image.svg | 2 +- .../backend/test/resources/with-xml-def.svg | 3 +- packages/calckey-js/etc/calckey-js.api.json | 19628 ++++++++-------- packages/client/assets/label-red.svg | 2 +- packages/client/assets/label.svg | 2 +- packages/client/assets/misskey.svg | 17 +- packages/client/package.json | 2 +- packages/client/src/init.ts | 2 +- packages/client/src/pages/settings/2fa.vue | 4 +- packages/client/src/scripts/emojilist.ts | 5 +- pnpm-lock.yaml | 396 +- 13 files changed, 10030 insertions(+), 10037 deletions(-) diff --git a/packages/backend/assets/favicon.svg b/packages/backend/assets/favicon.svg index 675d09cc85..e1a3abbbc2 100644 --- a/packages/backend/assets/favicon.svg +++ b/packages/backend/assets/favicon.svg @@ -1 +1 @@ -<svg viewBox="1.95 0.97 128 128" width="128" height="128" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><linearGradient id="a" gradientTransform="rotate(90)"><stop offset="5%" stop-color="#9ccfd8" style="--darkreader-inline-stopcolor:#265760"/><stop offset="95%" stop-color="#31748f" style="--darkreader-inline-stopcolor:#275d72"/></linearGradient><defs><linearGradient xlink:href="#a" id="f" gradientTransform="scale(1.27567 .7839)" x1="-43.77" y1="98.469" x2="-27.05" y2="137.466" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="d" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="e" gradientTransform="scale(1.27567 .7839)" x1="-43.77" y1="98.468" x2="-8.156" y2="98.468" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="c" gradientTransform="scale(1.27567 .7839)" x1="1.571" y1="1.27" x2="133.179" y2="1.27" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="b" gradientTransform="scale(1.27567 .7839)" x1="1.571" y1="1.27" x2="133.179" y2="1.27" gradientUnits="userSpaceOnUse"/></defs><g style="fill:url(#b)" transform="translate(.934 25.196) scale(.75646)"><g style="fill:url(#c)" fill="url(#a)" word-spacing="0" letter-spacing="0" font-family="'OTADESIGN Rounded'" font-weight="400"><g transform="translate(-55.341 -52.023) scale(.26953)" style="fill:url(#d)"/><g style="fill:url(#e)"><path style="fill:url(#f)" d="M-41.832 77.19c-3.868 0-7.177 1.358-9.93 4.074-2.716 2.752-4.074 6.063-4.074 9.931 0 3.869 1.358 7.04 4.074 9.793 2.753 2.716 6.064 4.073 9.932 4.073 3.831 0 7.122-1.357 9.875-4.073.855-.855 1.283-1.896 1.283-3.123 0-1.228-.428-2.271-1.283-3.127-.856-.855-1.897-1.281-3.123-1.281-1.229 0-2.27.426-3.125 1.281-1.004 1.042-2.213 1.563-3.627 1.563-3.035-.31-5.208-2.263-5.246-5.106.038-2.842 2.21-4.935 5.244-5.246 1.414 0 2.623.52 3.627 1.563.855.855 1.898 1.283 3.127 1.283 1.226 0 2.267-.428 3.123-1.283.855-.856 1.283-1.897 1.283-3.125 0-1.227-.428-2.268-1.283-3.123-2.753-2.716-6.046-4.075-9.877-4.075zm20.902 6.91c-2.88 0-5.353 1.02-7.422 3.06-.642.643-.964 1.426-.964 2.348 0 .923.322 1.706.964 2.35.644.642 1.427.962 2.348.962.924 0 1.707-.32 2.35-.963.754-.783 1.662-1.173 2.724-1.173 1.09 0 2.026.376 2.809 1.13a3.909 3.909 0 0 1 1.135 2.811c0 1.062-.393 1.97-1.176 2.725-.392.419-.868.7-1.426.84-.141.027-.252.012-.336-.044-.056-.084-.028-.168.084-.251l.84-.881c.643-.643.965-1.411.965-2.305 0-.922-.28-1.663-.838-2.223-.559-.559-1.343-.84-2.35-.84-.698 0-1.397.35-2.095 1.05l-4.866 4.822c-.643.643-.964 1.426-.964 2.347 0 .923.321 1.705.964 2.348 1.957 1.93 4.375 2.894 7.254 2.894 2.908 0 5.396-1.034 7.465-3.103 2.041-2.041 3.06-4.5 3.06-7.379 0-2.907-1.019-5.396-3.06-7.465-2.069-2.04-4.557-3.06-7.465-3.06z" transform="translate(208.34 -284.25) scale(3.6954)" clip-rule="evenodd" fill-rule="evenodd"/></g></g></g></svg> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" viewBox="1.95 0.97 128 128"><linearGradient id="a" gradientTransform="rotate(90)"><stop offset="5%" stop-color="#9ccfd8" style="--darkreader-inline-stopcolor:#265760"/><stop offset="95%" stop-color="#31748f" style="--darkreader-inline-stopcolor:#275d72"/></linearGradient><defs><linearGradient xlink:href="#a" id="f" x1="-43.77" x2="-27.05" y1="98.469" y2="137.466" gradientTransform="scale(1.27567 .7839)" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="d" x1="0" x2="1" y1="0" y2="0" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="e" x1="-43.77" x2="-8.156" y1="98.468" y2="98.468" gradientTransform="scale(1.27567 .7839)" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="c" x1="1.571" x2="133.179" y1="1.27" y2="1.27" gradientTransform="scale(1.27567 .7839)" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="b" x1="1.571" x2="133.179" y1="1.27" y2="1.27" gradientTransform="scale(1.27567 .7839)" gradientUnits="userSpaceOnUse"/></defs><g style="fill:url(#b)" transform="translate(.934 25.196) scale(.75646)"><g fill="url(#a)" font-family="'OTADESIGN Rounded'" font-weight="400" letter-spacing="0" style="fill:url(#c)" word-spacing="0"><g style="fill:url(#e)"><path fill-rule="evenodd" d="M-41.832 77.19c-3.868 0-7.177 1.358-9.93 4.074-2.716 2.752-4.074 6.063-4.074 9.931 0 3.869 1.358 7.04 4.074 9.793 2.753 2.716 6.064 4.073 9.932 4.073 3.831 0 7.122-1.357 9.875-4.073.855-.855 1.283-1.896 1.283-3.123 0-1.228-.428-2.271-1.283-3.127-.856-.855-1.897-1.281-3.123-1.281-1.229 0-2.27.426-3.125 1.281-1.004 1.042-2.213 1.563-3.627 1.563-3.035-.31-5.208-2.263-5.246-5.106.038-2.842 2.21-4.935 5.244-5.246 1.414 0 2.623.52 3.627 1.563.855.855 1.898 1.283 3.127 1.283 1.226 0 2.267-.428 3.123-1.283.855-.856 1.283-1.897 1.283-3.125 0-1.227-.428-2.268-1.283-3.123-2.753-2.716-6.046-4.075-9.877-4.075zm20.902 6.91c-2.88 0-5.353 1.02-7.422 3.06-.642.643-.964 1.426-.964 2.348 0 .923.322 1.706.964 2.35.644.642 1.427.962 2.348.962.924 0 1.707-.32 2.35-.963.754-.783 1.662-1.173 2.724-1.173 1.09 0 2.026.376 2.809 1.13a3.909 3.909 0 0 1 1.135 2.811c0 1.062-.393 1.97-1.176 2.725-.392.419-.868.7-1.426.84-.141.027-.252.012-.336-.044-.056-.084-.028-.168.084-.251l.84-.881c.643-.643.965-1.411.965-2.305 0-.922-.28-1.663-.838-2.223-.559-.559-1.343-.84-2.35-.84-.698 0-1.397.35-2.095 1.05l-4.866 4.822c-.643.643-.964 1.426-.964 2.347 0 .923.321 1.705.964 2.348 1.957 1.93 4.375 2.894 7.254 2.894 2.908 0 5.396-1.034 7.465-3.103 2.041-2.041 3.06-4.5 3.06-7.379 0-2.907-1.019-5.396-3.06-7.465-2.069-2.04-4.557-3.06-7.465-3.06z" clip-rule="evenodd" style="fill:url(#f)" transform="translate(208.34 -284.25) scale(3.6954)"/></g></g></g></svg> \ No newline at end of file diff --git a/packages/backend/assets/inverse wordmark.svg b/packages/backend/assets/inverse wordmark.svg index 59125fe7be..c0110540ea 100644 --- a/packages/backend/assets/inverse wordmark.svg +++ b/packages/backend/assets/inverse wordmark.svg @@ -1 +1 @@ -<svg xml:space="preserve" viewBox="0 0 512 512" height="512" width="512" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="a"><stop style="stop-color:#31748f;stop-opacity:1" offset="0"/><stop style="stop-color:#9ccfd8;stop-opacity:1" offset="1"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="254.819" y1="411.542" x2="259.34" y2="-1.41" gradientUnits="userSpaceOnUse"/></defs><path style="fill:url(#b);fill-opacity:1;stroke-width:.996356" d="M0 0v512h512V0Z"/><g style="font-weight:400;font-family:"OTADESIGN Rounded";letter-spacing:0;word-spacing:0;fill:#fff"><g transform="translate(-38.55 37.929) scale(.5619)" style="fill:#fff"/><path style="fill:#fff" d="M-41.832 77.19c-3.868 0-7.177 1.358-9.93 4.074-2.716 2.752-4.074 6.063-4.074 9.931 0 3.869 1.358 7.04 4.074 9.793 2.753 2.716 6.064 4.073 9.932 4.073 3.831 0 7.122-1.357 9.875-4.073.855-.855 1.283-1.896 1.283-3.123 0-1.228-.428-2.271-1.283-3.127-.856-.855-1.897-1.281-3.123-1.281-1.229 0-2.27.426-3.125 1.281-1.004 1.042-2.213 1.563-3.627 1.563-3.035-.31-5.208-2.263-5.246-5.106.038-2.842 2.21-4.935 5.244-5.246 1.414 0 2.623.52 3.627 1.563.855.855 1.898 1.283 3.127 1.283 1.226 0 2.267-.428 3.123-1.283.855-.856 1.283-1.897 1.283-3.125 0-1.227-.428-2.268-1.283-3.123-2.753-2.716-6.046-4.075-9.877-4.075zm20.902 6.91c-2.88 0-5.353 1.02-7.422 3.06-.642.643-.964 1.426-.964 2.348 0 .923.322 1.706.964 2.35.644.642 1.427.962 2.348.962.924 0 1.707-.32 2.35-.963.754-.783 1.662-1.173 2.724-1.173 1.09 0 2.026.376 2.809 1.13a3.909 3.909 0 0 1 1.135 2.811c0 1.062-.393 1.97-1.176 2.725-.392.419-.868.7-1.426.84-.141.027-.252.012-.336-.044-.056-.084-.028-.168.084-.251l.84-.881c.643-.643.965-1.411.965-2.305 0-.922-.28-1.663-.838-2.223-.559-.559-1.343-.84-2.35-.84-.698 0-1.397.35-2.095 1.05l-4.866 4.822c-.643.643-.964 1.426-.964 2.347 0 .923.321 1.705.964 2.348 1.957 1.93 4.375 2.894 7.254 2.894 2.908 0 5.396-1.034 7.465-3.103 2.041-2.041 3.06-4.5 3.06-7.379 0-2.907-1.019-5.396-3.06-7.465-2.069-2.04-4.557-3.06-7.465-3.06z" transform="translate(511.15 -446.2) scale(7.70387)" clip-rule="evenodd" fill-rule="evenodd"/></g></svg> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="512" height="512"><defs><linearGradient id="a"><stop offset="0" style="stop-color:#31748f;stop-opacity:1"/><stop offset="1" style="stop-color:#9ccfd8;stop-opacity:1"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="254.819" x2="259.34" y1="411.542" y2="-1.41" gradientUnits="userSpaceOnUse"/></defs><path d="M0 0v512h512V0Z" style="fill:url(#b);fill-opacity:1;stroke-width:.996356"/><g style="font-weight:400;font-family:"OTADESIGN Rounded";letter-spacing:0;word-spacing:0;fill:#fff"><path fill-rule="evenodd" d="M-41.832 77.19c-3.868 0-7.177 1.358-9.93 4.074-2.716 2.752-4.074 6.063-4.074 9.931 0 3.869 1.358 7.04 4.074 9.793 2.753 2.716 6.064 4.073 9.932 4.073 3.831 0 7.122-1.357 9.875-4.073.855-.855 1.283-1.896 1.283-3.123 0-1.228-.428-2.271-1.283-3.127-.856-.855-1.897-1.281-3.123-1.281-1.229 0-2.27.426-3.125 1.281-1.004 1.042-2.213 1.563-3.627 1.563-3.035-.31-5.208-2.263-5.246-5.106.038-2.842 2.21-4.935 5.244-5.246 1.414 0 2.623.52 3.627 1.563.855.855 1.898 1.283 3.127 1.283 1.226 0 2.267-.428 3.123-1.283.855-.856 1.283-1.897 1.283-3.125 0-1.227-.428-2.268-1.283-3.123-2.753-2.716-6.046-4.075-9.877-4.075zm20.902 6.91c-2.88 0-5.353 1.02-7.422 3.06-.642.643-.964 1.426-.964 2.348 0 .923.322 1.706.964 2.35.644.642 1.427.962 2.348.962.924 0 1.707-.32 2.35-.963.754-.783 1.662-1.173 2.724-1.173 1.09 0 2.026.376 2.809 1.13a3.909 3.909 0 0 1 1.135 2.811c0 1.062-.393 1.97-1.176 2.725-.392.419-.868.7-1.426.84-.141.027-.252.012-.336-.044-.056-.084-.028-.168.084-.251l.84-.881c.643-.643.965-1.411.965-2.305 0-.922-.28-1.663-.838-2.223-.559-.559-1.343-.84-2.35-.84-.698 0-1.397.35-2.095 1.05l-4.866 4.822c-.643.643-.964 1.426-.964 2.347 0 .923.321 1.705.964 2.348 1.957 1.93 4.375 2.894 7.254 2.894 2.908 0 5.396-1.034 7.465-3.103 2.041-2.041 3.06-4.5 3.06-7.379 0-2.907-1.019-5.396-3.06-7.465-2.069-2.04-4.557-3.06-7.465-3.06z" clip-rule="evenodd" style="fill:#fff" transform="translate(511.15 -446.2) scale(7.70387)"/></g></svg> \ No newline at end of file diff --git a/packages/backend/test/resources/image.svg b/packages/backend/test/resources/image.svg index 1e2bf5b5bb..983f0ae648 100644 --- a/packages/backend/test/resources/image.svg +++ b/packages/backend/test/resources/image.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#FF40A4" d="M128 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C164 84 144 76 128 80"/><path fill="#FFBF40" d="M192 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C228 84 208 76 192 80"/><path fill="#408EFF" d="M64 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8C28 172 48 180 64 176s20-24 20-48v-16c0-8 8-16 20.3-8C100 84 80 76 64 80"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#FF40A4" d="M128 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C164 84 144 76 128 80"/><path fill="#FFBF40" d="M192 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C228 84 208 76 192 80"/><path fill="#408EFF" d="M64 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8C28 172 48 180 64 176s20-24 20-48v-16c0-8 8-16 20.3-8C100 84 80 76 64 80"/></svg> \ No newline at end of file diff --git a/packages/backend/test/resources/with-xml-def.svg b/packages/backend/test/resources/with-xml-def.svg index 90971215a6..983f0ae648 100644 --- a/packages/backend/test/resources/with-xml-def.svg +++ b/packages/backend/test/resources/with-xml-def.svg @@ -1,2 +1 @@ -<?xml version="1.0" encoding="utf-8"?> -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#FF40A4" d="M128 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C164 84 144 76 128 80"/><path fill="#FFBF40" d="M192 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C228 84 208 76 192 80"/><path fill="#408EFF" d="M64 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8C28 172 48 180 64 176s20-24 20-48v-16c0-8 8-16 20.3-8C100 84 80 76 64 80"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#FF40A4" d="M128 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C164 84 144 76 128 80"/><path fill="#FFBF40" d="M192 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C228 84 208 76 192 80"/><path fill="#408EFF" d="M64 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8C28 172 48 180 64 176s20-24 20-48v-16c0-8 8-16 20.3-8C100 84 80 76 64 80"/></svg> \ No newline at end of file diff --git a/packages/calckey-js/etc/calckey-js.api.json b/packages/calckey-js/etc/calckey-js.api.json index 524ae3b2eb..61ab4e2473 100644 --- a/packages/calckey-js/etc/calckey-js.api.json +++ b/packages/calckey-js/etc/calckey-js.api.json @@ -1,9814 +1,9814 @@ -{ - "metadata": { - "toolPackage": "@microsoft/api-extractor", - "toolVersion": "7.36.0", - "schemaVersion": 1011, - "oldestForwardsCompatibleVersion": 1001, - "tsdocConfig": { - "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", - "noStandardTags": true, - "tagDefinitions": [ - { - "tagName": "@alpha", - "syntaxKind": "modifier" - }, - { - "tagName": "@beta", - "syntaxKind": "modifier" - }, - { - "tagName": "@defaultValue", - "syntaxKind": "block" - }, - { - "tagName": "@decorator", - "syntaxKind": "block", - "allowMultiple": true - }, - { - "tagName": "@deprecated", - "syntaxKind": "block" - }, - { - "tagName": "@eventProperty", - "syntaxKind": "modifier" - }, - { - "tagName": "@example", - "syntaxKind": "block", - "allowMultiple": true - }, - { - "tagName": "@experimental", - "syntaxKind": "modifier" - }, - { - "tagName": "@inheritDoc", - "syntaxKind": "inline" - }, - { - "tagName": "@internal", - "syntaxKind": "modifier" - }, - { - "tagName": "@label", - "syntaxKind": "inline" - }, - { - "tagName": "@link", - "syntaxKind": "inline", - "allowMultiple": true - }, - { - "tagName": "@override", - "syntaxKind": "modifier" - }, - { - "tagName": "@packageDocumentation", - "syntaxKind": "modifier" - }, - { - "tagName": "@param", - "syntaxKind": "block", - "allowMultiple": true - }, - { - "tagName": "@privateRemarks", - "syntaxKind": "block" - }, - { - "tagName": "@public", - "syntaxKind": "modifier" - }, - { - "tagName": "@readonly", - "syntaxKind": "modifier" - }, - { - "tagName": "@remarks", - "syntaxKind": "block" - }, - { - "tagName": "@returns", - "syntaxKind": "block" - }, - { - "tagName": "@sealed", - "syntaxKind": "modifier" - }, - { - "tagName": "@see", - "syntaxKind": "block" - }, - { - "tagName": "@throws", - "syntaxKind": "block", - "allowMultiple": true - }, - { - "tagName": "@typeParam", - "syntaxKind": "block", - "allowMultiple": true - }, - { - "tagName": "@virtual", - "syntaxKind": "modifier" - }, - { - "tagName": "@betaDocumentation", - "syntaxKind": "modifier" - }, - { - "tagName": "@internalRemarks", - "syntaxKind": "block" - }, - { - "tagName": "@preapproved", - "syntaxKind": "modifier" - } - ], - "supportForTags": { - "@alpha": true, - "@beta": true, - "@defaultValue": true, - "@decorator": true, - "@deprecated": true, - "@eventProperty": true, - "@example": true, - "@experimental": true, - "@inheritDoc": true, - "@internal": true, - "@label": true, - "@link": true, - "@override": true, - "@packageDocumentation": true, - "@param": true, - "@privateRemarks": true, - "@public": true, - "@readonly": true, - "@remarks": true, - "@returns": true, - "@sealed": true, - "@see": true, - "@throws": true, - "@typeParam": true, - "@virtual": true, - "@betaDocumentation": true, - "@internalRemarks": true, - "@preapproved": true - }, - "reportUnsupportedHtmlElements": false - } - }, - "kind": "Package", - "canonicalReference": "calckey-js!", - "docComment": "", - "name": "calckey-js", - "preserveMemberOrder": false, - "members": [ - { - "kind": "EntryPoint", - "canonicalReference": "calckey-js!", - "name": "", - "preserveMemberOrder": false, - "members": [ - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!Acct:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Acct = " - }, - { - "kind": "Content", - "text": "{\n\tusername: string;\n\thost: string | null;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/acct.ts", - "releaseTag": "Public", - "name": "Acct", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "Namespace", - "canonicalReference": "calckey-js!api:namespace", - "docComment": "", - "excerptTokens": [], - "fileUrlPath": "src/index.ts", - "releaseTag": "None", - "name": "api", - "preserveMemberOrder": false, - "members": [ - { - "kind": "Class", - "canonicalReference": "calckey-js!api.APIClient:class", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare class APIClient " - } - ], - "fileUrlPath": "src/api.ts", - "releaseTag": "Public", - "isAbstract": false, - "name": "APIClient", - "preserveMemberOrder": false, - "members": [ - { - "kind": "Constructor", - "canonicalReference": "calckey-js!api.APIClient:constructor(1)", - "docComment": "/**\n * Constructs a new instance of the `APIClient` class\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "constructor(opts: " - }, - { - "kind": "Content", - "text": "{\n\t\torigin: " - }, - { - "kind": "Reference", - "text": "APIClient", - "canonicalReference": "calckey-js!api.APIClient:class" - }, - { - "kind": "Content", - "text": "[\"origin\"];\n\t\tcredential?: " - }, - { - "kind": "Reference", - "text": "APIClient", - "canonicalReference": "calckey-js!api.APIClient:class" - }, - { - "kind": "Content", - "text": "[\"credential\"];\n\t\tfetch?: " - }, - { - "kind": "Reference", - "text": "APIClient", - "canonicalReference": "calckey-js!api.APIClient:class" - }, - { - "kind": "Content", - "text": "[\"fetch\"] | null | undefined;\n\t}" - }, - { - "kind": "Content", - "text": ");" - } - ], - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "opts", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 8 - }, - "isOptional": false - } - ] - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!api.APIClient#credential:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "credential: " - }, - { - "kind": "Content", - "text": "string | null | undefined" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "credential", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": false - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!api.APIClient#fetch:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "fetch: " - }, - { - "kind": "Reference", - "text": "FetchLike", - "canonicalReference": "calckey-js!api.FetchLike:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "fetch", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": false - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!api.APIClient#origin:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "origin: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "origin", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": false - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!api.APIClient#request:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "request<E extends " - }, - { - "kind": "Content", - "text": "keyof " - }, - { - "kind": "Reference", - "text": "Endpoints", - "canonicalReference": "calckey-js!Endpoints:type" - }, - { - "kind": "Content", - "text": ", P extends " - }, - { - "kind": "Reference", - "text": "Endpoints", - "canonicalReference": "calckey-js!Endpoints:type" - }, - { - "kind": "Content", - "text": "[E][\"req\"]" - }, - { - "kind": "Content", - "text": ">(\n\t\tendpoint: " - }, - { - "kind": "Content", - "text": "E" - }, - { - "kind": "Content", - "text": ",\n\t\tparams?: " - }, - { - "kind": "Content", - "text": "P" - }, - { - "kind": "Content", - "text": ",\n\t\tcredential?: " - }, - { - "kind": "Content", - "text": "string | null | undefined" - }, - { - "kind": "Content", - "text": ",\n\t): " - }, - { - "kind": "Reference", - "text": "Promise", - "canonicalReference": "!Promise:interface" - }, - { - "kind": "Content", - "text": "<\n\t\t" - }, - { - "kind": "Reference", - "text": "Endpoints", - "canonicalReference": "calckey-js!Endpoints:type" - }, - { - "kind": "Content", - "text": "[E][\"res\"] extends {\n\t\t\t$switch: {\n\t\t\t\t$cases: [any, any][];\n\t\t\t\t$default: any;\n\t\t\t};\n\t\t}\n\t\t\t? " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 0> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 0>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 1> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 1>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 2> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 2>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 3> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 3>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 4> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 4>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 5> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 5>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 6> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 6>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 7> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 7>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 8> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 8>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "IsCaseMatched", - "canonicalReference": "calckey-js!~IsCaseMatched:type" - }, - { - "kind": "Content", - "text": "<E, P, 9> extends true\n\t\t\t\t? " - }, - { - "kind": "Reference", - "text": "GetCaseResult", - "canonicalReference": "calckey-js!~GetCaseResult:type" - }, - { - "kind": "Content", - "text": "<E, P, 9>\n\t\t\t\t: " - }, - { - "kind": "Reference", - "text": "Endpoints", - "canonicalReference": "calckey-js!Endpoints:type" - }, - { - "kind": "Content", - "text": "[E][\"res\"][\"$switch\"][\"$default\"]\n\t\t\t: " - }, - { - "kind": "Reference", - "text": "Endpoints", - "canonicalReference": "calckey-js!Endpoints:type" - }, - { - "kind": "Content", - "text": "[E][\"res\"]\n\t>" - }, - { - "kind": "Content", - "text": ";" - } - ], - "typeParameters": [ - { - "typeParameterName": "E", - "constraintTokenRange": { - "startIndex": 1, - "endIndex": 3 - }, - "defaultTypeTokenRange": { - "startIndex": 0, - "endIndex": 0 - } - }, - { - "typeParameterName": "P", - "constraintTokenRange": { - "startIndex": 4, - "endIndex": 6 - }, - "defaultTypeTokenRange": { - "startIndex": 0, - "endIndex": 0 - } - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 13, - "endIndex": 61 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "endpoint", - "parameterTypeTokenRange": { - "startIndex": 7, - "endIndex": 8 - }, - "isOptional": false - }, - { - "parameterName": "params", - "parameterTypeTokenRange": { - "startIndex": 9, - "endIndex": 10 - }, - "isOptional": true - }, - { - "parameterName": "credential", - "parameterTypeTokenRange": { - "startIndex": 11, - "endIndex": 12 - }, - "isOptional": true - } - ], - "isOptional": false, - "isAbstract": false, - "name": "request" - } - ], - "implementsTokenRanges": [] - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!api.APIError:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type APIError = " - }, - { - "kind": "Content", - "text": "{\n\tid: string;\n\tcode: string;\n\tmessage: string;\n\tkind: \"client\" | \"server\";\n\tinfo: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/api.ts", - "releaseTag": "Public", - "name": "APIError", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 4 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!api.FetchLike:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type FetchLike = " - }, - { - "kind": "Content", - "text": "(\n\tinput: string,\n\tinit?: {\n\t\tmethod?: string;\n\t\tbody?: string;\n\t\tcredentials?: " - }, - { - "kind": "Reference", - "text": "RequestCredentials", - "canonicalReference": "!RequestCredentials:type" - }, - { - "kind": "Content", - "text": ";\n\t\tcache?: " - }, - { - "kind": "Reference", - "text": "RequestCache", - "canonicalReference": "!RequestCache:type" - }, - { - "kind": "Content", - "text": ";\n\t},\n) => " - }, - { - "kind": "Reference", - "text": "Promise", - "canonicalReference": "!Promise:interface" - }, - { - "kind": "Content", - "text": "<{\n\tstatus: number;\n\tjson(): " - }, - { - "kind": "Reference", - "text": "Promise", - "canonicalReference": "!Promise:interface" - }, - { - "kind": "Content", - "text": "<any>;\n}>" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/api.ts", - "releaseTag": "Public", - "name": "FetchLike", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 10 - } - }, - { - "kind": "Function", - "canonicalReference": "calckey-js!api.isAPIError:function(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare function isAPIError(reason: " - }, - { - "kind": "Content", - "text": "any" - }, - { - "kind": "Content", - "text": "): " - }, - { - "kind": "Reference", - "text": "reason", - "canonicalReference": "calckey-js!~reason" - }, - { - "kind": "Content", - "text": " is " - }, - { - "kind": "Reference", - "text": "APIError", - "canonicalReference": "calckey-js!api.APIError:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/api.ts", - "returnTypeTokenRange": { - "startIndex": 3, - "endIndex": 6 - }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "reason", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isOptional": false - } - ], - "name": "isAPIError" - } - ] - }, - { - "kind": "Class", - "canonicalReference": "calckey-js!ChannelConnection:class", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare abstract class Connection<\n\tChannel extends " - }, - { - "kind": "Reference", - "text": "AnyOf", - "canonicalReference": "calckey-js!~AnyOf:type" - }, - { - "kind": "Content", - "text": "<" - }, - { - "kind": "Reference", - "text": "Channels", - "canonicalReference": "calckey-js!Channels:type" - }, - { - "kind": "Content", - "text": ">" - }, - { - "kind": "Content", - "text": " = " - }, - { - "kind": "Content", - "text": "any" - }, - { - "kind": "Content", - "text": ",\n> extends " - }, - { - "kind": "Reference", - "text": "EventEmitter", - "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" - }, - { - "kind": "Content", - "text": "<Channel[\"events\"]>" - }, - { - "kind": "Content", - "text": " " - } - ], - "fileUrlPath": "src/streaming.ts", - "releaseTag": "Public", - "typeParameters": [ - { - "typeParameterName": "Channel", - "constraintTokenRange": { - "startIndex": 1, - "endIndex": 5 - }, - "defaultTypeTokenRange": { - "startIndex": 6, - "endIndex": 7 - } - } - ], - "isAbstract": true, - "name": "ChannelConnection", - "preserveMemberOrder": false, - "members": [ - { - "kind": "Constructor", - "canonicalReference": "calckey-js!ChannelConnection:constructor(1)", - "docComment": "/**\n * Constructs a new instance of the `Connection` class\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "constructor(stream: " - }, - { - "kind": "Reference", - "text": "Stream", - "canonicalReference": "calckey-js!Stream:class" - }, - { - "kind": "Content", - "text": ", channel: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ", name?: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ");" - } - ], - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "stream", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isOptional": false - }, - { - "parameterName": "channel", - "parameterTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - }, - "isOptional": false - }, - { - "parameterName": "name", - "parameterTypeTokenRange": { - "startIndex": 5, - "endIndex": 6 - }, - "isOptional": true - } - ] - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!ChannelConnection#channel:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "channel: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "channel", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": false - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!ChannelConnection#dispose:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "abstract dispose(): " - }, - { - "kind": "Content", - "text": "void" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [], - "isOptional": false, - "isAbstract": true, - "name": "dispose" - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!ChannelConnection#id:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "abstract id: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "id", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": true - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!ChannelConnection#inCount:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "inCount: " - }, - { - "kind": "Content", - "text": "number" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "inCount", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": false - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!ChannelConnection#name:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "name?: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": true, - "releaseTag": "Public", - "name": "name", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": false - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!ChannelConnection#outCount:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "outCount: " - }, - { - "kind": "Content", - "text": "number" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "outCount", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": false - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!ChannelConnection#send:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "send<T extends " - }, - { - "kind": "Content", - "text": "keyof Channel[\"receives\"]" - }, - { - "kind": "Content", - "text": ">(\n\t\ttype: " - }, - { - "kind": "Content", - "text": "T" - }, - { - "kind": "Content", - "text": ",\n\t\tbody: " - }, - { - "kind": "Content", - "text": "Channel[\"receives\"][T]" - }, - { - "kind": "Content", - "text": ",\n\t): " - }, - { - "kind": "Content", - "text": "void" - }, - { - "kind": "Content", - "text": ";" - } - ], - "typeParameters": [ - { - "typeParameterName": "T", - "constraintTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "defaultTypeTokenRange": { - "startIndex": 0, - "endIndex": 0 - } - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 7, - "endIndex": 8 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "type", - "parameterTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - }, - "isOptional": false - }, - { - "parameterName": "body", - "parameterTypeTokenRange": { - "startIndex": 5, - "endIndex": 6 - }, - "isOptional": false - } - ], - "isOptional": false, - "isAbstract": false, - "name": "send" - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!ChannelConnection#stream:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "protected stream: " - }, - { - "kind": "Reference", - "text": "Stream", - "canonicalReference": "calckey-js!Stream:class" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "stream", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": true, - "isAbstract": false - } - ], - "extendsTokenRange": { - "startIndex": 8, - "endIndex": 10 - }, - "implementsTokenRanges": [] - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!Channels:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Channels = " - }, - { - "kind": "Content", - "text": "{\n\tmain: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnotification: (payload: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tmention: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\treply: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\trenote: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tfollow: (payload: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tfollowed: (payload: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tunfollow: (payload: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tmeUpdated: (payload: " - }, - { - "kind": "Reference", - "text": "MeDetailed", - "canonicalReference": "calckey-js!entities.MeDetailed:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tpageEvent: (payload: " - }, - { - "kind": "Reference", - "text": "PageEvent", - "canonicalReference": "calckey-js!entities.PageEvent:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\turlUploadFinished: (payload: {\n\t\t\t\tmarker: string;\n\t\t\t\tfile: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\t}) => void;\n\t\t\treadAllNotifications: () => void;\n\t\t\tunreadNotification: (payload: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tunreadMention: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadMentions: () => void;\n\t\t\tunreadSpecifiedNote: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadSpecifiedNotes: () => void;\n\t\t\treadAllMessagingMessages: () => void;\n\t\t\tmessagingMessage: (payload: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tunreadMessagingMessage: (payload: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\treadAllAntennas: () => void;\n\t\t\tunreadAntenna: (payload: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\treadAllAnnouncements: () => void;\n\t\t\treadAllChannels: () => void;\n\t\t\tunreadChannel: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"]) => void;\n\t\t\tmyTokenRegenerated: () => void;\n\t\t\treversiNoInvites: () => void;\n\t\t\treversiInvited: (payload: " - }, - { - "kind": "Reference", - "text": "FIXME", - "canonicalReference": "calckey-js!~FIXME:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tsignin: (payload: " - }, - { - "kind": "Reference", - "text": "FIXME", - "canonicalReference": "calckey-js!~FIXME:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tregistryUpdated: (payload: {\n\t\t\t\tscope?: string[];\n\t\t\t\tkey: string;\n\t\t\t\tvalue: any | null;\n\t\t\t}) => void;\n\t\t\tdriveFileCreated: (payload: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\treadAntenna: (payload: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thomeTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tlocalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thybridTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\trecommendedTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tglobalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tantenna: {\n\t\tparams: {\n\t\t\tantennaId: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tevents: {\n\t\t\tnote: (payload: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tmessaging: {\n\t\tparams: {\n\t\t\totherparty?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t\tgroup?: " - }, - { - "kind": "Reference", - "text": "UserGroup", - "canonicalReference": "calckey-js!entities.UserGroup:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t};\n\t\tevents: {\n\t\t\tmessage: (payload: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t\tdeleted: (payload: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[\"id\"]) => void;\n\t\t\tread: (payload: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[\"id\"][]) => void;\n\t\t\ttypers: (payload: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[]) => void;\n\t\t};\n\t\treceives: {\n\t\t\tread: {\n\t\t\t\tid: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\t};\n\t\t};\n\t};\n\tserverStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " - }, - { - "kind": "Reference", - "text": "FIXME", - "canonicalReference": "calckey-js!~FIXME:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n\tqueueStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " - }, - { - "kind": "Reference", - "text": "FIXME", - "canonicalReference": "calckey-js!~FIXME:type" - }, - { - "kind": "Content", - "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/streaming.types.ts", - "releaseTag": "Public", - "name": "Channels", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 76 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!Endpoints:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Endpoints = " - }, - { - "kind": "Content", - "text": "{\n\t\"admin/abuse-user-reports\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/delete-all-files-of-a-user\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/delete-logs\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: null;\n\t};\n\t\"admin/get-index-stats\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/get-table-stats\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/invite\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/logs\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/meta\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/reset-password\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/resolve-abuse-user-report\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/resync-chart\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/send-email\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/server-info\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/show-moderation-logs\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/show-user\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/show-users\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/silence-user\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/suspend-user\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/unsilence-user\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/unsuspend-user\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/update-meta\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/vacuum\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/accounts/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/ad/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/ad/delete\": {\n\t\treq: {\n\t\t\tid: " - }, - { - "kind": "Reference", - "text": "Ad", - "canonicalReference": "calckey-js!entities.Ad:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/ad/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/ad/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/announcements/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/announcements/delete\": {\n\t\treq: {\n\t\t\tid: " - }, - { - "kind": "Reference", - "text": "Announcement", - "canonicalReference": "calckey-js!entities.Announcement:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/announcements/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/announcements/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/drive/clean-remote-files\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/drive/cleanup\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/drive/files\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/drive/show-file\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/emoji/add\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/emoji/copy\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/emoji/list-remote\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/emoji/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/emoji/remove\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/emoji/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/federation/delete-all-files\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/federation/refresh-remote-instance-metadata\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/federation/remove-all-following\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/federation/update-instance\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/moderators/add\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/moderators/remove\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/promo/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/queue/clear\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/queue/deliver-delayed\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/queue/inbox-delayed\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/queue/jobs\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/queue/stats\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/relays/add\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/relays/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"admin/relays/remove\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\tannouncements: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\twithUnreads?: boolean;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Announcement", - "canonicalReference": "calckey-js!entities.Announcement:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Announcement", - "canonicalReference": "calckey-js!entities.Announcement:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Announcement", - "canonicalReference": "calckey-js!entities.Announcement:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"antennas/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"antennas/delete\": {\n\t\treq: {\n\t\t\tantennaId: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"antennas/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"antennas/notes\": {\n\t\treq: {\n\t\t\tantennaId: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"antennas/show\": {\n\t\treq: {\n\t\t\tantennaId: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"antennas/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"antennas/mark-read\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Antenna", - "canonicalReference": "calckey-js!entities.Antenna:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"ap/get\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>;\n\t};\n\t\"ap/show\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres:\n\t\t\t| {\n\t\t\t\t\ttype: \"Note\";\n\t\t\t\t\tobject: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\ttype: \"User\";\n\t\t\t\t\tobject: " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\t };\n\t};\n\t\"app/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "App", - "canonicalReference": "calckey-js!entities.App:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"app/show\": {\n\t\treq: {\n\t\t\tappId: " - }, - { - "kind": "Reference", - "text": "App", - "canonicalReference": "calckey-js!entities.App:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "App", - "canonicalReference": "calckey-js!entities.App:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"auth/accept\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"auth/session/generate\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t};\n\t\tres: {\n\t\t\ttoken: string;\n\t\t\turl: string;\n\t\t};\n\t};\n\t\"auth/session/show\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "AuthSession", - "canonicalReference": "calckey-js!entities.AuthSession:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"auth/session/userkey\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t\ttoken: string;\n\t\t};\n\t\tres: {\n\t\t\taccessToken: string;\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t};\n\t};\n\t\"blocking/create\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"blocking/delete\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"blocking/list\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Blocking", - "canonicalReference": "calckey-js!entities.Blocking:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Blocking", - "canonicalReference": "calckey-js!entities.Blocking:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Blocking", - "canonicalReference": "calckey-js!entities.Blocking:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"channels/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/featured\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/follow\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/followed\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/owned\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/pin-note\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/show\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/timeline\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/unfollow\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"channels/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"charts/active-users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/federation\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tinstance: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/hashtag\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"charts/instance\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\tdrive: {\n\t\t\t\tdecFiles: number[];\n\t\t\t\tdecUsage: number[];\n\t\t\t\tincFiles: number[];\n\t\t\t\tincUsage: number[];\n\t\t\t\ttotalFiles: number[];\n\t\t\t\ttotalUsage: number[];\n\t\t\t};\n\t\t\tfollowers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tfollowing: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tnotes: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\trequests: {\n\t\t\t\tfailed: number[];\n\t\t\t\treceived: number[];\n\t\t\t\tsucceeded: number[];\n\t\t\t};\n\t\t\tusers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/network\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"charts/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdecCount: number[];\n\t\t\tdecSize: number[];\n\t\t\tincCount: number[];\n\t\t\tincSize: number[];\n\t\t\ttotalCount: number[];\n\t\t\ttotalSize: number[];\n\t\t};\n\t};\n\t\"charts/user/following\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"charts/user/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdec: number[];\n\t\t\tinc: number[];\n\t\t\ttotal: number[];\n\t\t\tdiffs: {\n\t\t\t\tnormal: number[];\n\t\t\t\trenote: number[];\n\t\t\t\treply: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/reactions\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"charts/users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"clips/add-note\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"clips/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"clips/delete\": {\n\t\treq: {\n\t\t\tclipId: " - }, - { - "kind": "Reference", - "text": "Clip", - "canonicalReference": "calckey-js!entities.Clip:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"clips/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"clips/notes\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"clips/show\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"clips/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\tdrive: {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: {\n\t\t\tcapacity: number;\n\t\t\tusage: number;\n\t\t};\n\t};\n\t\"drive/files\": {\n\t\treq: {\n\t\t\tfolderId?: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t\ttype?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"drive/files/attached-notes\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/files/check-existence\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/files/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/files/delete\": {\n\t\treq: {\n\t\t\tfileId: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/files/find-by-hash\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/files/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tfolderId?: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"drive/files/show\": {\n\t\treq: {\n\t\t\tfileId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\turl?: string;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/files/update\": {\n\t\treq: {\n\t\t\tfileId: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tfolderId?: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t\tname?: string;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/files/upload-from-url\": {\n\t\treq: {\n\t\t\turl: string;\n\t\t\tfolderId?: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t\tmarker?: string | null;\n\t\t\tforce?: boolean;\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders\": {\n\t\treq: {\n\t\t\tfolderId?: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"drive/folders/create\": {\n\t\treq: {\n\t\t\tname?: string;\n\t\t\tparentId?: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/folders/delete\": {\n\t\treq: {\n\t\t\tfolderId: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tparentId?: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"drive/folders/show\": {\n\t\treq: {\n\t\t\tfolderId: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/folders/update\": {\n\t\treq: {\n\t\t\tfolderId: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tparentId?: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFolder", - "canonicalReference": "calckey-js!entities.DriveFolder:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"drive/stream\": {\n\t\treq: {\n\t\t\ttype?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\tendpoint: {\n\t\treq: {\n\t\t\tendpoint: string;\n\t\t};\n\t\tres: {\n\t\t\tparams: {\n\t\t\t\tname: string;\n\t\t\t\ttype: string;\n\t\t\t}[];\n\t\t};\n\t};\n\tendpoints: {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: string[];\n\t};\n\t\"federation/dns\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\ta: string[];\n\t\t\taaaa: string[];\n\t\t\tcname: string[];\n\t\t\ttxt: string[];\n\t\t};\n\t};\n\t\"federation/followers\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "FollowingFolloweePopulated", - "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"federation/following\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "FollowingFolloweePopulated", - "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"federation/instances\": {\n\t\treq: {\n\t\t\thost?: string | null;\n\t\t\tblocked?: boolean | null;\n\t\t\tnotResponding?: boolean | null;\n\t\t\tsuspended?: boolean | null;\n\t\t\tfederating?: boolean | null;\n\t\t\tsubscribing?: boolean | null;\n\t\t\tpublishing?: boolean | null;\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?:\n\t\t\t\t| \"+pubSub\"\n\t\t\t\t| \"-pubSub\"\n\t\t\t\t| \"+notes\"\n\t\t\t\t| \"-notes\"\n\t\t\t\t| \"+users\"\n\t\t\t\t| \"-users\"\n\t\t\t\t| \"+following\"\n\t\t\t\t| \"-following\"\n\t\t\t\t| \"+followers\"\n\t\t\t\t| \"-followers\"\n\t\t\t\t| \"+caughtAt\"\n\t\t\t\t| \"-caughtAt\"\n\t\t\t\t| \"+lastCommunicatedAt\"\n\t\t\t\t| \"-lastCommunicatedAt\"\n\t\t\t\t| \"+driveUsage\"\n\t\t\t\t| \"-driveUsage\"\n\t\t\t\t| \"+driveFiles\"\n\t\t\t\t| \"-driveFiles\";\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Instance", - "canonicalReference": "calckey-js!entities.Instance:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"federation/show-instance\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Instance", - "canonicalReference": "calckey-js!entities.Instance:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"federation/update-remote-user\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"federation/users\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"following/create\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"following/delete\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"following/requests/accept\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"following/requests/cancel\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"following/requests/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "FollowRequest", - "canonicalReference": "calckey-js!entities.FollowRequest:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"following/requests/reject\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/featured\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"gallery/popular\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"gallery/posts\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"gallery/posts/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"gallery/posts/delete\": {\n\t\treq: {\n\t\t\tpostId: " - }, - { - "kind": "Reference", - "text": "GalleryPost", - "canonicalReference": "calckey-js!entities.GalleryPost:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/posts/like\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"gallery/posts/show\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"gallery/posts/unlike\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"gallery/posts/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"games/reversi/games\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"games/reversi/games/show\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"games/reversi/games/surrender\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"games/reversi/invitations\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"games/reversi/match\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"games/reversi/match/cancel\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"get-online-users-count\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: {\n\t\t\tcount: number;\n\t\t};\n\t};\n\t\"hashtags/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"hashtags/search\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"hashtags/show\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"hashtags/trend\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"hashtags/users\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\ti: {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/apps\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/authorized-apps\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/change-password\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/delete-account\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/export-blocking\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/export-following\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/export-mute\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/export-notes\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/export-user-lists\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/favorites\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "NoteFavorite", - "canonicalReference": "calckey-js!entities.NoteFavorite:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "NoteFavorite", - "canonicalReference": "calckey-js!entities.NoteFavorite:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "NoteFavorite", - "canonicalReference": "calckey-js!entities.NoteFavorite:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"i/gallery/likes\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/gallery/posts\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/get-word-muted-notes-count\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/import-following\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/import-user-lists\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/move\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/known-as\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/notifications\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tfollowing?: boolean;\n\t\t\tmarkAsRead?: boolean;\n\t\t\tincludeTypes?: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": "[\"type\"][];\n\t\t\texcludeTypes?: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": "[\"type\"][];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"i/page-likes\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/pages\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/pin\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "MeDetailed", - "canonicalReference": "calckey-js!entities.MeDetailed:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/read-all-messaging-messages\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/read-all-unread-notes\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/read-announcement\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/regenerate-token\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/get-all\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>;\n\t};\n\t\"i/registry/get-detail\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: {\n\t\t\tupdatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tvalue: any;\n\t\t};\n\t};\n\t\"i/registry/get\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: any;\n\t};\n\t\"i/registry/keys-with-type\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<\n\t\t\tstring,\n\t\t\t\"null\" | \"array\" | \"number\" | \"string\" | \"boolean\" | \"object\"\n\t\t>;\n\t};\n\t\"i/registry/keys\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: string[];\n\t};\n\t\"i/registry/remove\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/scopes\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: string[][];\n\t};\n\t\"i/registry/set\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tvalue: any;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/revoke-token\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/signin-history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Signin", - "canonicalReference": "calckey-js!entities.Signin:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Signin", - "canonicalReference": "calckey-js!entities.Signin:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Signin", - "canonicalReference": "calckey-js!entities.Signin:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"i/unpin\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "MeDetailed", - "canonicalReference": "calckey-js!entities.MeDetailed:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/update-email\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t\temail?: string | null;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "MeDetailed", - "canonicalReference": "calckey-js!entities.MeDetailed:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/update\": {\n\t\treq: {\n\t\t\tname?: string | null;\n\t\t\tdescription?: string | null;\n\t\t\tlang?: string | null;\n\t\t\tlocation?: string | null;\n\t\t\tbirthday?: string | null;\n\t\t\tavatarId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t\tbannerId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\t\t\tfields?: {\n\t\t\t\tname: string;\n\t\t\t\tvalue: string;\n\t\t\t}[];\n\t\t\tisLocked?: boolean;\n\t\t\tisExplorable?: boolean;\n\t\t\thideOnlineStatus?: boolean;\n\t\t\tcarefulBot?: boolean;\n\t\t\tautoAcceptFollowed?: boolean;\n\t\t\tnoCrawle?: boolean;\n\t\t\tpreventAiLearning?: boolean;\n\t\t\tisBot?: boolean;\n\t\t\tisCat?: boolean;\n\t\t\tinjectFeaturedNote?: boolean;\n\t\t\treceiveAnnouncementEmail?: boolean;\n\t\t\talwaysMarkNsfw?: boolean;\n\t\t\tmutedWords?: string[][];\n\t\t\tmutingNotificationTypes?: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": "[\"type\"][];\n\t\t\temailNotificationTypes?: string[];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "MeDetailed", - "canonicalReference": "calckey-js!entities.MeDetailed:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/user-group-invites\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/2fa/done\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/2fa/key-done\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/2fa/password-less\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/2fa/register-key\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/2fa/register\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/2fa/update-key\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/2fa/remove-key\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"i/2fa/unregister\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"messaging/history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tgroup?: boolean;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"messaging/messages\": {\n\t\treq: {\n\t\t\tuserId?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tgroupId?: " - }, - { - "kind": "Reference", - "text": "UserGroup", - "canonicalReference": "calckey-js!entities.UserGroup:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tmarkAsRead?: boolean;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"messaging/messages/create\": {\n\t\treq: {\n\t\t\tuserId?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tgroupId?: " - }, - { - "kind": "Reference", - "text": "UserGroup", - "canonicalReference": "calckey-js!entities.UserGroup:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\ttext?: string;\n\t\t\tfileId?: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"messaging/messages/delete\": {\n\t\treq: {\n\t\t\tmessageId: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"messaging/messages/read\": {\n\t\treq: {\n\t\t\tmessageId: " - }, - { - "kind": "Reference", - "text": "MessagingMessage", - "canonicalReference": "calckey-js!entities.MessagingMessage:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\tmeta: {\n\t\treq: {\n\t\t\tdetail?: boolean;\n\t\t};\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" - }, - { - "kind": "Reference", - "text": "DetailedInstanceMetadata", - "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" - }, - { - "kind": "Content", - "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" - }, - { - "kind": "Reference", - "text": "LiteInstanceMetadata", - "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" - }, - { - "kind": "Content", - "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: boolean;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" - }, - { - "kind": "Reference", - "text": "LiteInstanceMetadata", - "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" - }, - { - "kind": "Content", - "text": " | " - }, - { - "kind": "Reference", - "text": "DetailedInstanceMetadata", - "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" - }, - { - "kind": "Content", - "text": ",\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " - }, - { - "kind": "Reference", - "text": "LiteInstanceMetadata", - "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"miauth/gen-token\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"mute/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"mute/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"renote-mute/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"renote-mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"renote-mute/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"my/apps\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\tnotes: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/children\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/clips\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"notes/conversation\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"notes/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoteSubmitReq", - "canonicalReference": "calckey-js!~NoteSubmitReq:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t\t};\n\t};\n\t\"notes/delete\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/edit\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoteSubmitReq", - "canonicalReference": "calckey-js!~NoteSubmitReq:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t\t};\n\t};\n\t\"notes/favorites/create\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/favorites/delete\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/featured\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/global-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/recommended-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/hybrid-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/local-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/mentions\": {\n\t\treq: {\n\t\t\tfollowing?: boolean;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/polls/recommendation\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"notes/polls/vote\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tchoice: number;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\ttype?: string | null;\n\t\t\tlimit?: number;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "NoteReaction", - "canonicalReference": "calckey-js!entities.NoteReaction:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/reactions/create\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\treaction: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions/delete\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/renotes\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/replies\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/search-by-tag\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"notes/search\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"notes/show\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"notes/state\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"notes/timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/unrenote\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/user-list-timeline\": {\n\t\treq: {\n\t\t\tlistId: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"notes/watching/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"notes/watching/delete\": {\n\t\treq: {\n\t\t\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/create\": {\n\t\treq: {\n\t\t\tbody: string;\n\t\t\theader?: string | null;\n\t\t\ticon?: string | null;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/mark-all-as-read\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: null;\n\t};\n\t\"notifications/read\": {\n\t\treq: {\n\t\t\tnotificationId: " - }, - { - "kind": "Reference", - "text": "Notification", - "canonicalReference": "calckey-js!entities.Notification_2:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"page-push\": {\n\t\treq: {\n\t\t\tpageId: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tevent: string;\n\t\t\tvar?: any;\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"pages/delete\": {\n\t\treq: {\n\t\t\tpageId: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/featured\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"pages/like\": {\n\t\treq: {\n\t\t\tpageId: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/show\": {\n\t\treq: {\n\t\t\tpageId?: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tusername?: string;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"pages/unlike\": {\n\t\treq: {\n\t\t\tpageId: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: null;\n\t};\n\tping: {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: {\n\t\t\tpong: number;\n\t\t};\n\t};\n\t\"pinned-users\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"promo/read\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"request-reset-password\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t\temail: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"reset-password\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"room/show\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"room/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\tstats: {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Stats", - "canonicalReference": "calckey-js!entities.Stats:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"server-info\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "ServerInfo", - "canonicalReference": "calckey-js!entities.ServerInfo:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"latest-version\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"sw/register\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"username/available\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t};\n\t\tres: {\n\t\t\tavailable: boolean;\n\t\t};\n\t};\n\tusers: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?: " - }, - { - "kind": "Reference", - "text": "UserSorting", - "canonicalReference": "calckey-js!entities.UserSorting:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\torigin?: " - }, - { - "kind": "Reference", - "text": "OriginType", - "canonicalReference": "calckey-js!entities.OriginType:type" - }, - { - "kind": "Content", - "text": ";\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"users/clips\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/followers\": {\n\t\treq: {\n\t\t\tuserId?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tusername?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"username\"];\n\t\t\thost?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "FollowingFollowerPopulated", - "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"users/following\": {\n\t\treq: {\n\t\t\tuserId?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tusername?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"username\"];\n\t\t\thost?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "FollowingFolloweePopulated", - "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"users/gallery/posts\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/get-frequently-replied-users\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/create\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/delete\": {\n\t\treq: {\n\t\t\tgroupId: " - }, - { - "kind": "Reference", - "text": "UserGroup", - "canonicalReference": "calckey-js!entities.UserGroup:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/groups/invitations/accept\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/invitations/reject\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/invite\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/joined\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/owned\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/pull\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/show\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/transfer\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/groups/update\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/lists/create\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/lists/delete\": {\n\t\treq: {\n\t\t\tlistId: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/list\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "NoParams", - "canonicalReference": "calckey-js!~NoParams:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"users/lists/pull\": {\n\t\treq: {\n\t\t\tlistId: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/push\": {\n\t\treq: {\n\t\t\tlistId: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/show\": {\n\t\treq: {\n\t\t\tlistId: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/lists/update\": {\n\t\treq: {\n\t\t\tlistId: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tname: string;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "UserList", - "canonicalReference": "calckey-js!entities.UserList:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/notes\": {\n\t\treq: {\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tuntilId?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\t};\n\t\"users/pages\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/recommendation\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/relation\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/report-abuse\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/search-by-username-and-host\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/search\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n\t\"users/show\": {\n\t\treq:\n\t\t\t| " - }, - { - "kind": "Reference", - "text": "ShowUserReq", - "canonicalReference": "calckey-js!~ShowUserReq:type" - }, - { - "kind": "Content", - "text": "\n\t\t\t| {\n\t\t\t\t\tuserIds: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"][];\n\t\t\t };\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserIds: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"][];\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": "[],\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"users/stats\": {\n\t\treq: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t\tres: " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO:type" - }, - { - "kind": "Content", - "text": ";\n\t};\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/api.types.ts", - "releaseTag": "Public", - "name": "Endpoints", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 1158 - } - }, - { - "kind": "Namespace", - "canonicalReference": "calckey-js!entities:namespace", - "docComment": "", - "excerptTokens": [], - "fileUrlPath": "src/index.ts", - "releaseTag": "None", - "name": "entities", - "preserveMemberOrder": false, - "members": [ - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Ad:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Ad = " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO_2:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Ad", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Announcement:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Announcement = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tupdatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": " | null;\n\ttext: string;\n\ttitle: string;\n\timageUrl: string | null;\n\tisRead?: boolean;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Announcement", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 8 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Antenna:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Antenna = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tname: string;\n\tkeywords: string[][];\n\texcludeKeywords: string[][];\n\tsrc: \"home\" | \"all\" | \"users\" | \"list\" | \"group\" | \"instances\";\n\tuserListId: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": " | null;\n\tuserGroupId: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": " | null;\n\tusers: string[];\n\tinstances: string[];\n\tcaseSensitive: boolean;\n\tnotify: boolean;\n\twithReplies: boolean;\n\twithFile: boolean;\n\thasUnreadNote: boolean;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Antenna", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 10 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.App:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type App = " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO_2:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "App", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.AuthSession:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type AuthSession = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tapp: " - }, - { - "kind": "Reference", - "text": "App", - "canonicalReference": "calckey-js!entities.App:type" - }, - { - "kind": "Content", - "text": ";\n\ttoken: string;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "AuthSession", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 6 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Blocking:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Blocking = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tblockeeId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tblockee: " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": ";\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Blocking", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 10 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Channel:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Channel = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Channel", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 4 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Clip:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Clip = " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO_2:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Clip", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.CustomEmoji:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type CustomEmoji = " - }, - { - "kind": "Content", - "text": "{\n\tid: string;\n\tname: string;\n\turl: string;\n\tcategory: string;\n\taliases: string[];\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "CustomEmoji", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.DateString:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type DateString = " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "DateString", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type DetailedInstanceMetadata = " - }, - { - "kind": "Reference", - "text": "LiteInstanceMetadata", - "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" - }, - { - "kind": "Content", - "text": " & {\n\tfeatures: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "DetailedInstanceMetadata", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 5 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.DriveFile:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type DriveFile = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tisSensitive: boolean;\n\tname: string;\n\tthumbnailUrl: string;\n\turl: string;\n\ttype: string;\n\tsize: number;\n\tmd5: string;\n\tblurhash: string;\n\tcomment: string | null;\n\tproperties: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "DriveFile", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 8 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.DriveFolder:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type DriveFolder = " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO_2:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "DriveFolder", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Following:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Following = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tfollowerId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tfolloweeId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Following", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 10 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type FollowingFolloweePopulated = " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": " & {\n\tfollowee: " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": ";\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "FollowingFolloweePopulated", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 5 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type FollowingFollowerPopulated = " - }, - { - "kind": "Reference", - "text": "Following", - "canonicalReference": "calckey-js!entities.Following:type" - }, - { - "kind": "Content", - "text": " & {\n\tfollower: " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": ";\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "FollowingFollowerPopulated", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 5 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.FollowRequest:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type FollowRequest = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tfollower: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\tfollowee: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "FollowRequest", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 8 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.GalleryPost:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type GalleryPost = " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO_2:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "GalleryPost", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.ID:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type ID = " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "ID", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Instance:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Instance = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcaughtAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\thost: string;\n\tusersCount: number;\n\tnotesCount: number;\n\tfollowingCount: number;\n\tfollowersCount: number;\n\tdriveUsage: number;\n\tdriveFiles: number;\n\tlatestRequestSentAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": " | null;\n\tlatestStatus: number | null;\n\tlatestRequestReceivedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": " | null;\n\tlastCommunicatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tisNotResponding: boolean;\n\tisSuspended: boolean;\n\tsoftwareName: string | null;\n\tsoftwareVersion: string | null;\n\topenRegistrations: boolean | null;\n\tname: string | null;\n\tdescription: string | null;\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\ticonUrl: string | null;\n\tfaviconUrl: string | null;\n\tthemeColor: string | null;\n\tinfoUpdatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": " | null;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Instance", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 14 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.InstanceMetadata:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type InstanceMetadata =\n\t" - }, - { - "kind": "Content", - "text": "| " - }, - { - "kind": "Reference", - "text": "LiteInstanceMetadata", - "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" - }, - { - "kind": "Content", - "text": "\n\t| " - }, - { - "kind": "Reference", - "text": "DetailedInstanceMetadata", - "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "InstanceMetadata", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 5 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type LiteInstanceMetadata = " - }, - { - "kind": "Content", - "text": "{\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\tversion: string;\n\tname: string | null;\n\turi: string;\n\tdescription: string | null;\n\ttosUrl: string | null;\n\tdisableRegistration: boolean;\n\tdisableLocalTimeline: boolean;\n\tdisableRecommendedTimeline: boolean;\n\tdisableGlobalTimeline: boolean;\n\tdriveCapacityPerLocalUserMb: number;\n\tdriveCapacityPerRemoteUserMb: number;\n\tenableHcaptcha: boolean;\n\thcaptchaSiteKey: string | null;\n\tenableRecaptcha: boolean;\n\trecaptchaSiteKey: string | null;\n\tswPublickey: string | null;\n\tmaxNoteTextLength: number;\n\tenableEmail: boolean;\n\tenableTwitterIntegration: boolean;\n\tenableGithubIntegration: boolean;\n\tenableDiscordIntegration: boolean;\n\tenableServiceWorker: boolean;\n\temojis: " - }, - { - "kind": "Reference", - "text": "CustomEmoji", - "canonicalReference": "calckey-js!entities.CustomEmoji:type" - }, - { - "kind": "Content", - "text": "[];\n\tads: {\n\t\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\t\tratio: number;\n\t\tplace: string;\n\t\turl: string;\n\t\timageUrl: string;\n\t}[];\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "LiteInstanceMetadata", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 6 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.MeDetailed:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type MeDetailed = " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": " & {\n\tavatarId: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tbannerId: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tautoAcceptFollowed: boolean;\n\talwaysMarkNsfw: boolean;\n\tcarefulBot: boolean;\n\temailNotificationTypes: string[];\n\thasPendingReceivedFollowRequest: boolean;\n\thasUnreadAnnouncement: boolean;\n\thasUnreadAntenna: boolean;\n\thasUnreadChannel: boolean;\n\thasUnreadMentions: boolean;\n\thasUnreadMessagingMessage: boolean;\n\thasUnreadNotification: boolean;\n\thasUnreadSpecifiedNotes: boolean;\n\thideOnlineStatus: boolean;\n\tinjectFeaturedNote: boolean;\n\tintegrations: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>;\n\tisDeleted: boolean;\n\tisExplorable: boolean;\n\tmutedWords: string[][];\n\tmutingNotificationTypes: string[];\n\tnoCrawle: boolean;\n\tpreventAiLearning: boolean;\n\treceiveAnnouncementEmail: boolean;\n\tusePasswordLessLogin: boolean;\n\t[other: string]: any;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "MeDetailed", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 9 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.MessagingMessage:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type MessagingMessage = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tfile: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": " | null;\n\tfileId: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\tisRead: boolean;\n\treads: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"][];\n\ttext: string | null;\n\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\trecipient?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": " | null;\n\trecipientId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\tgroup?: " - }, - { - "kind": "Reference", - "text": "UserGroup", - "canonicalReference": "calckey-js!entities.UserGroup:type" - }, - { - "kind": "Content", - "text": " | null;\n\tgroupId: " - }, - { - "kind": "Reference", - "text": "UserGroup", - "canonicalReference": "calckey-js!entities.UserGroup:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "MessagingMessage", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 24 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Note:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Note = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\ttext: string | null;\n\tcw: string | null;\n\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\treply?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\treplyId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\trenote?: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\trenoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tfiles: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[];\n\tfileIds: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"][];\n\tvisibility: \"public\" | \"home\" | \"followers\" | \"specified\";\n\tvisibleUserIds?: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"][];\n\tlocalOnly?: boolean;\n\tchannel?: " - }, - { - "kind": "Reference", - "text": "Channel", - "canonicalReference": "calckey-js!entities.Channel:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tmyReaction?: string;\n\treactions: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, number>;\n\trenoteCount: number;\n\trepliesCount: number;\n\tpoll?: {\n\t\texpiresAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": " | null;\n\t\tmultiple: boolean;\n\t\tchoices: {\n\t\t\tisVoted: boolean;\n\t\t\ttext: string;\n\t\t\tvotes: number;\n\t\t}[];\n\t};\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\turi?: string;\n\turl?: string;\n\tupdatedAt?: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tisHidden?: boolean;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Note", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 32 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.NoteFavorite:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type NoteFavorite = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tnoteId: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tnote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "NoteFavorite", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 10 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.NoteReaction:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type NoteReaction = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tuser: " - }, - { - "kind": "Reference", - "text": "UserLite", - "canonicalReference": "calckey-js!entities.UserLite:type" - }, - { - "kind": "Content", - "text": ";\n\ttype: string;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "NoteReaction", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 8 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Notification:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Notification = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tisRead: boolean;\n} & (\n\t| {\n\t\t\ttype: \"reaction\";\n\t\t\treaction: string;\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tnote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t }\n\t| {\n\t\t\ttype: \"reply\";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tnote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t }\n\t| {\n\t\t\ttype: \"renote\";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tnote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t }\n\t| {\n\t\t\ttype: \"quote\";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tnote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t }\n\t| {\n\t\t\ttype: \"mention\";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tnote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t }\n\t| {\n\t\t\ttype: \"pollVote\";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t\t\tnote: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": ";\n\t }\n\t| {\n\t\t\ttype: \"follow\";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"followRequestAccepted\";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"receiveFollowRequest\";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"groupInvited\";\n\t\t\tinvitation: " - }, - { - "kind": "Reference", - "text": "UserGroup", - "canonicalReference": "calckey-js!entities.UserGroup:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\t\t\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"app\";\n\t\t\theader?: string | null;\n\t\t\tbody: string;\n\t\t\ticon?: string | null;\n\t }\n)" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Notification", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 60 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.OriginType:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type OriginType = " - }, - { - "kind": "Content", - "text": "\"combined\" | \"local\" | \"remote\"" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "OriginType", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Page:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Page = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tupdatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n\tcontent: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>[];\n\tvariables: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>[];\n\ttitle: string;\n\tname: string;\n\tsummary: string | null;\n\thideTitleWhenPinned: boolean;\n\talignCenter: boolean;\n\tfont: string;\n\tscript: string;\n\teyeCatchingImageId: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": "[\"id\"] | null;\n\teyeCatchingImage: " - }, - { - "kind": "Reference", - "text": "DriveFile", - "canonicalReference": "calckey-js!entities.DriveFile:type" - }, - { - "kind": "Content", - "text": " | null;\n\tattachedFiles: any;\n\tlikedCount: number;\n\tisLiked?: boolean;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Page", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 20 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.PageEvent:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type PageEvent = " - }, - { - "kind": "Content", - "text": "{\n\tpageId: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tevent: string;\n\tvar: any;\n\tuserId: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"];\n\tuser: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": ";\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "PageEvent", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 8 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.ServerInfo:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type ServerInfo = " - }, - { - "kind": "Content", - "text": "{\n\tmachine: string;\n\tcpu: {\n\t\tmodel: string;\n\t\tcores: number;\n\t};\n\tmem: {\n\t\ttotal: number;\n\t};\n\tfs: {\n\t\ttotal: number;\n\t\tused: number;\n\t};\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "ServerInfo", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Signin:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Signin = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tip: string;\n\theaders: " - }, - { - "kind": "Reference", - "text": "Record", - "canonicalReference": "!Record:type" - }, - { - "kind": "Content", - "text": "<string, any>;\n\tsuccess: boolean;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Signin", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 8 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.Stats:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type Stats = " - }, - { - "kind": "Content", - "text": "{\n\tnotesCount: number;\n\toriginalNotesCount: number;\n\tusersCount: number;\n\toriginalUsersCount: number;\n\tinstances: number;\n\tdriveUsageLocal: number;\n\tdriveUsageRemote: number;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "Stats", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.User:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type User = " - }, - { - "kind": "Reference", - "text": "UserLite", - "canonicalReference": "calckey-js!entities.UserLite:type" - }, - { - "kind": "Content", - "text": " | " - }, - { - "kind": "Reference", - "text": "UserDetailed", - "canonicalReference": "calckey-js!entities.UserDetailed:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "User", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 4 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.UserDetailed:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type UserDetailed = " - }, - { - "kind": "Reference", - "text": "UserLite", - "canonicalReference": "calckey-js!entities.UserLite:type" - }, - { - "kind": "Content", - "text": " & {\n\tbannerBlurhash: string | null;\n\tbannerColor: string | null;\n\tbannerUrl: string | null;\n\tbirthday: string | null;\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tdescription: string | null;\n\tffVisibility: \"public\" | \"followers\" | \"private\";\n\tfields: {\n\t\tname: string;\n\t\tvalue: string;\n\t}[];\n\tfollowersCount: number;\n\tfollowingCount: number;\n\thasPendingFollowRequestFromYou: boolean;\n\thasPendingFollowRequestToYou: boolean;\n\tisAdmin: boolean;\n\tisBlocked: boolean;\n\tisBlocking: boolean;\n\tisBot: boolean;\n\tisCat: boolean;\n\tisFollowed: boolean;\n\tisFollowing: boolean;\n\tisLocked: boolean;\n\tisModerator: boolean;\n\tisMuted: boolean;\n\tisRenoteMuted: boolean;\n\tisSilenced: boolean;\n\tisSuspended: boolean;\n\tlang: string | null;\n\tlastFetchedAt?: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tlocation: string | null;\n\tnotesCount: number;\n\tpinnedNoteIds: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": "[];\n\tpinnedNotes: " - }, - { - "kind": "Reference", - "text": "Note", - "canonicalReference": "calckey-js!entities.Note:type" - }, - { - "kind": "Content", - "text": "[];\n\tpinnedPage: " - }, - { - "kind": "Reference", - "text": "Page", - "canonicalReference": "calckey-js!entities.Page:type" - }, - { - "kind": "Content", - "text": " | null;\n\tpinnedPageId: string | null;\n\tpublicReactions: boolean;\n\tsecurityKeys: boolean;\n\ttwoFactorEnabled: boolean;\n\tupdatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": " | null;\n\turi: string | null;\n\turl: string | null;\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "UserDetailed", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 15 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.UserGroup:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type UserGroup = " - }, - { - "kind": "Reference", - "text": "TODO", - "canonicalReference": "calckey-js!~TODO_2:type" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "UserGroup", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.UserList:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type UserList = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tcreatedAt: " - }, - { - "kind": "Reference", - "text": "DateString", - "canonicalReference": "calckey-js!entities.DateString:type" - }, - { - "kind": "Content", - "text": ";\n\tname: string;\n\tuserIds: " - }, - { - "kind": "Reference", - "text": "User", - "canonicalReference": "calckey-js!entities.User:type" - }, - { - "kind": "Content", - "text": "[\"id\"][];\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "UserList", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 8 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.UserLite:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type UserLite = " - }, - { - "kind": "Content", - "text": "{\n\tid: " - }, - { - "kind": "Reference", - "text": "ID", - "canonicalReference": "calckey-js!entities.ID:type" - }, - { - "kind": "Content", - "text": ";\n\tusername: string;\n\thost: string | null;\n\tname: string;\n\tonlineStatus: \"online\" | \"active\" | \"offline\" | \"unknown\";\n\tavatarUrl: string;\n\tavatarBlurhash: string;\n\talsoKnownAs: string[];\n\tmovedToUri: any;\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\tinstance?: {\n\t\tname: " - }, - { - "kind": "Reference", - "text": "Instance", - "canonicalReference": "calckey-js!entities.Instance:type" - }, - { - "kind": "Content", - "text": "[\"name\"];\n\t\tsoftwareName: " - }, - { - "kind": "Reference", - "text": "Instance", - "canonicalReference": "calckey-js!entities.Instance:type" - }, - { - "kind": "Content", - "text": "[\"softwareName\"];\n\t\tsoftwareVersion: " - }, - { - "kind": "Reference", - "text": "Instance", - "canonicalReference": "calckey-js!entities.Instance:type" - }, - { - "kind": "Content", - "text": "[\"softwareVersion\"];\n\t\ticonUrl: " - }, - { - "kind": "Reference", - "text": "Instance", - "canonicalReference": "calckey-js!entities.Instance:type" - }, - { - "kind": "Content", - "text": "[\"iconUrl\"];\n\t\tfaviconUrl: " - }, - { - "kind": "Reference", - "text": "Instance", - "canonicalReference": "calckey-js!entities.Instance:type" - }, - { - "kind": "Content", - "text": "[\"faviconUrl\"];\n\t\tthemeColor: " - }, - { - "kind": "Reference", - "text": "Instance", - "canonicalReference": "calckey-js!entities.Instance:type" - }, - { - "kind": "Content", - "text": "[\"themeColor\"];\n\t};\n}" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "UserLite", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 16 - } - }, - { - "kind": "TypeAlias", - "canonicalReference": "calckey-js!entities.UserSorting:type", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare type UserSorting =\n\t" - }, - { - "kind": "Content", - "text": "| \"+follower\"\n\t| \"-follower\"\n\t| \"+createdAt\"\n\t| \"-createdAt\"\n\t| \"+updatedAt\"\n\t| \"-updatedAt\"" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "src/entities.ts", - "releaseTag": "Public", - "name": "UserSorting", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - } - ] - }, - { - "kind": "Variable", - "canonicalReference": "calckey-js!ffVisibility:var", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "ffVisibility: " - }, - { - "kind": "Content", - "text": "readonly [\"public\", \"followers\", \"private\"]" - } - ], - "fileUrlPath": "src/index.ts", - "isReadonly": true, - "releaseTag": "Public", - "name": "ffVisibility", - "variableTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "Variable", - "canonicalReference": "calckey-js!mutedNoteReasons:var", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "mutedNoteReasons: " - }, - { - "kind": "Content", - "text": "readonly [\n\t\"word\",\n\t\"manual\",\n\t\"spam\",\n\t\"other\",\n]" - } - ], - "fileUrlPath": "src/index.ts", - "isReadonly": true, - "releaseTag": "Public", - "name": "mutedNoteReasons", - "variableTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "Variable", - "canonicalReference": "calckey-js!noteVisibilities:var", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "noteVisibilities: " - }, - { - "kind": "Content", - "text": "readonly [\n\t\"public\",\n\t\"home\",\n\t\"followers\",\n\t\"specified\",\n]" - } - ], - "fileUrlPath": "src/index.ts", - "isReadonly": true, - "releaseTag": "Public", - "name": "noteVisibilities", - "variableTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "Variable", - "canonicalReference": "calckey-js!notificationTypes:var", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "notificationTypes: " - }, - { - "kind": "Content", - "text": "readonly [\n\t\"follow\",\n\t\"mention\",\n\t\"reply\",\n\t\"renote\",\n\t\"quote\",\n\t\"reaction\",\n\t\"pollVote\",\n\t\"pollEnded\",\n\t\"receiveFollowRequest\",\n\t\"followRequestAccepted\",\n\t\"groupInvited\",\n\t\"app\",\n]" - } - ], - "fileUrlPath": "src/index.ts", - "isReadonly": true, - "releaseTag": "Public", - "name": "notificationTypes", - "variableTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "Variable", - "canonicalReference": "calckey-js!permissions:var", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "permissions: " - }, - { - "kind": "Content", - "text": "string[]" - } - ], - "fileUrlPath": "src/index.ts", - "isReadonly": true, - "releaseTag": "Public", - "name": "permissions", - "variableTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } - }, - { - "kind": "Class", - "canonicalReference": "calckey-js!Stream:class", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "export default class Stream extends " - }, - { - "kind": "Reference", - "text": "EventEmitter", - "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" - }, - { - "kind": "Content", - "text": "<" - }, - { - "kind": "Reference", - "text": "StreamEvents", - "canonicalReference": "calckey-js!~StreamEvents:type" - }, - { - "kind": "Content", - "text": ">" - }, - { - "kind": "Content", - "text": " " - } - ], - "fileUrlPath": "src/streaming.ts", - "releaseTag": "Public", - "isAbstract": false, - "name": "Stream", - "preserveMemberOrder": false, - "members": [ - { - "kind": "Constructor", - "canonicalReference": "calckey-js!Stream:constructor(1)", - "docComment": "/**\n * Constructs a new instance of the `Stream` class\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "constructor(\n\t\torigin: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ",\n\t\tuser: " - }, - { - "kind": "Content", - "text": "{\n\t\t\ttoken: string;\n\t\t} | null" - }, - { - "kind": "Content", - "text": ",\n\t\toptions?: " - }, - { - "kind": "Content", - "text": "{\n\t\t\tWebSocket?: any;\n\t\t}" - }, - { - "kind": "Content", - "text": ",\n\t);" - } - ], - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "origin", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isOptional": false - }, - { - "parameterName": "user", - "parameterTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - }, - "isOptional": false - }, - { - "parameterName": "options", - "parameterTypeTokenRange": { - "startIndex": 5, - "endIndex": 6 - }, - "isOptional": true - } - ] - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!Stream#close:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "close(): " - }, - { - "kind": "Content", - "text": "void" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [], - "isOptional": false, - "isAbstract": false, - "name": "close" - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!Stream#disconnectToChannel:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "disconnectToChannel(connection: " - }, - { - "kind": "Reference", - "text": "NonSharedConnection", - "canonicalReference": "calckey-js!~NonSharedConnection:class" - }, - { - "kind": "Content", - "text": "): " - }, - { - "kind": "Content", - "text": "void" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "connection", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isOptional": false - } - ], - "isOptional": false, - "isAbstract": false, - "name": "disconnectToChannel" - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!Stream#removeSharedConnection:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "removeSharedConnection(connection: " - }, - { - "kind": "Reference", - "text": "SharedConnection", - "canonicalReference": "calckey-js!~SharedConnection:class" - }, - { - "kind": "Content", - "text": "): " - }, - { - "kind": "Content", - "text": "void" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "connection", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isOptional": false - } - ], - "isOptional": false, - "isAbstract": false, - "name": "removeSharedConnection" - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!Stream#removeSharedConnectionPool:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "removeSharedConnectionPool(pool: " - }, - { - "kind": "Reference", - "text": "Pool", - "canonicalReference": "calckey-js!~Pool:class" - }, - { - "kind": "Content", - "text": "): " - }, - { - "kind": "Content", - "text": "void" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "pool", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isOptional": false - } - ], - "isOptional": false, - "isAbstract": false, - "name": "removeSharedConnectionPool" - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!Stream#send:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "send(typeOrPayload: " - }, - { - "kind": "Content", - "text": "any" - }, - { - "kind": "Content", - "text": ", payload?: " - }, - { - "kind": "Content", - "text": "any" - }, - { - "kind": "Content", - "text": "): " - }, - { - "kind": "Content", - "text": "void" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 5, - "endIndex": 6 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "typeOrPayload", - "parameterTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isOptional": false - }, - { - "parameterName": "payload", - "parameterTypeTokenRange": { - "startIndex": 3, - "endIndex": 4 - }, - "isOptional": true - } - ], - "isOptional": false, - "isAbstract": false, - "name": "send" - }, - { - "kind": "Property", - "canonicalReference": "calckey-js!Stream#state:member", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "state: " - }, - { - "kind": "Content", - "text": "\"initializing\" | \"reconnecting\" | \"connected\"" - }, - { - "kind": "Content", - "text": ";" - } - ], - "isReadonly": false, - "isOptional": false, - "releaseTag": "Public", - "name": "state", - "propertyTypeTokenRange": { - "startIndex": 1, - "endIndex": 2 - }, - "isStatic": false, - "isProtected": false, - "isAbstract": false - }, - { - "kind": "Method", - "canonicalReference": "calckey-js!Stream#useChannel:member(1)", - "docComment": "", - "excerptTokens": [ - { - "kind": "Content", - "text": "useChannel<C extends " - }, - { - "kind": "Content", - "text": "keyof " - }, - { - "kind": "Reference", - "text": "Channels", - "canonicalReference": "calckey-js!Channels:type" - }, - { - "kind": "Content", - "text": ">(\n\t\tchannel: " - }, - { - "kind": "Content", - "text": "C" - }, - { - "kind": "Content", - "text": ",\n\t\tparams?: " - }, - { - "kind": "Reference", - "text": "Channels", - "canonicalReference": "calckey-js!Channels:type" - }, - { - "kind": "Content", - "text": "[C][\"params\"]" - }, - { - "kind": "Content", - "text": ",\n\t\tname?: " - }, - { - "kind": "Content", - "text": "string" - }, - { - "kind": "Content", - "text": ",\n\t): " - }, - { - "kind": "Reference", - "text": "Connection", - "canonicalReference": "calckey-js!ChannelConnection:class" - }, - { - "kind": "Content", - "text": "<" - }, - { - "kind": "Reference", - "text": "Channels", - "canonicalReference": "calckey-js!Channels:type" - }, - { - "kind": "Content", - "text": "[C]>" - }, - { - "kind": "Content", - "text": ";" - } - ], - "typeParameters": [ - { - "typeParameterName": "C", - "constraintTokenRange": { - "startIndex": 1, - "endIndex": 3 - }, - "defaultTypeTokenRange": { - "startIndex": 0, - "endIndex": 0 - } - } - ], - "isStatic": false, - "returnTypeTokenRange": { - "startIndex": 11, - "endIndex": 15 - }, - "releaseTag": "Public", - "isProtected": false, - "overloadIndex": 1, - "parameters": [ - { - "parameterName": "channel", - "parameterTypeTokenRange": { - "startIndex": 4, - "endIndex": 5 - }, - "isOptional": false - }, - { - "parameterName": "params", - "parameterTypeTokenRange": { - "startIndex": 6, - "endIndex": 8 - }, - "isOptional": true - }, - { - "parameterName": "name", - "parameterTypeTokenRange": { - "startIndex": 9, - "endIndex": 10 - }, - "isOptional": true - } - ], - "isOptional": false, - "isAbstract": false, - "name": "useChannel" - } - ], - "extendsTokenRange": { - "startIndex": 1, - "endIndex": 5 - }, - "implementsTokenRanges": [] - } - ] - } - ] -} +{ + "metadata": { + "toolPackage": "@microsoft/api-extractor", + "toolVersion": "7.36.0", + "schemaVersion": 1011, + "oldestForwardsCompatibleVersion": 1001, + "tsdocConfig": { + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "noStandardTags": true, + "tagDefinitions": [ + { + "tagName": "@alpha", + "syntaxKind": "modifier" + }, + { + "tagName": "@beta", + "syntaxKind": "modifier" + }, + { + "tagName": "@defaultValue", + "syntaxKind": "block" + }, + { + "tagName": "@decorator", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@deprecated", + "syntaxKind": "block" + }, + { + "tagName": "@eventProperty", + "syntaxKind": "modifier" + }, + { + "tagName": "@example", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@experimental", + "syntaxKind": "modifier" + }, + { + "tagName": "@inheritDoc", + "syntaxKind": "inline" + }, + { + "tagName": "@internal", + "syntaxKind": "modifier" + }, + { + "tagName": "@label", + "syntaxKind": "inline" + }, + { + "tagName": "@link", + "syntaxKind": "inline", + "allowMultiple": true + }, + { + "tagName": "@override", + "syntaxKind": "modifier" + }, + { + "tagName": "@packageDocumentation", + "syntaxKind": "modifier" + }, + { + "tagName": "@param", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@privateRemarks", + "syntaxKind": "block" + }, + { + "tagName": "@public", + "syntaxKind": "modifier" + }, + { + "tagName": "@readonly", + "syntaxKind": "modifier" + }, + { + "tagName": "@remarks", + "syntaxKind": "block" + }, + { + "tagName": "@returns", + "syntaxKind": "block" + }, + { + "tagName": "@sealed", + "syntaxKind": "modifier" + }, + { + "tagName": "@see", + "syntaxKind": "block" + }, + { + "tagName": "@throws", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@typeParam", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@virtual", + "syntaxKind": "modifier" + }, + { + "tagName": "@betaDocumentation", + "syntaxKind": "modifier" + }, + { + "tagName": "@internalRemarks", + "syntaxKind": "block" + }, + { + "tagName": "@preapproved", + "syntaxKind": "modifier" + } + ], + "supportForTags": { + "@alpha": true, + "@beta": true, + "@defaultValue": true, + "@decorator": true, + "@deprecated": true, + "@eventProperty": true, + "@example": true, + "@experimental": true, + "@inheritDoc": true, + "@internal": true, + "@label": true, + "@link": true, + "@override": true, + "@packageDocumentation": true, + "@param": true, + "@privateRemarks": true, + "@public": true, + "@readonly": true, + "@remarks": true, + "@returns": true, + "@sealed": true, + "@see": true, + "@throws": true, + "@typeParam": true, + "@virtual": true, + "@betaDocumentation": true, + "@internalRemarks": true, + "@preapproved": true + }, + "reportUnsupportedHtmlElements": false + } + }, + "kind": "Package", + "canonicalReference": "calckey-js!", + "docComment": "", + "name": "calckey-js", + "preserveMemberOrder": false, + "members": [ + { + "kind": "EntryPoint", + "canonicalReference": "calckey-js!", + "name": "", + "preserveMemberOrder": false, + "members": [ + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Acct:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Acct = " + }, + { + "kind": "Content", + "text": "{\n\tusername: string;\n\thost: string | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/acct.ts", + "releaseTag": "Public", + "name": "Acct", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Namespace", + "canonicalReference": "calckey-js!api:namespace", + "docComment": "", + "excerptTokens": [], + "fileUrlPath": "src/index.ts", + "releaseTag": "None", + "name": "api", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Class", + "canonicalReference": "calckey-js!api.APIClient:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare class APIClient " + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "isAbstract": false, + "name": "APIClient", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!api.APIClient:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `APIClient` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(opts: " + }, + { + "kind": "Content", + "text": "{\n\t\torigin: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"origin\"];\n\t\tcredential?: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"credential\"];\n\t\tfetch?: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"fetch\"] | null | undefined;\n\t}" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "opts", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 8 + }, + "isOptional": false + } + ] + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#credential:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "credential: " + }, + { + "kind": "Content", + "text": "string | null | undefined" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "credential", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#fetch:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "fetch: " + }, + { + "kind": "Reference", + "text": "FetchLike", + "canonicalReference": "calckey-js!api.FetchLike:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "fetch", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#origin:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "origin: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "origin", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!api.APIClient#request:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "request<E extends " + }, + { + "kind": "Content", + "text": "keyof " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": ", P extends " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"req\"]" + }, + { + "kind": "Content", + "text": ">(\n\t\tendpoint: " + }, + { + "kind": "Content", + "text": "E" + }, + { + "kind": "Content", + "text": ",\n\t\tparams?: " + }, + { + "kind": "Content", + "text": "P" + }, + { + "kind": "Content", + "text": ",\n\t\tcredential?: " + }, + { + "kind": "Content", + "text": "string | null | undefined" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<\n\t\t" + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"] extends {\n\t\t\t$switch: {\n\t\t\t\t$cases: [any, any][];\n\t\t\t\t$default: any;\n\t\t\t};\n\t\t}\n\t\t\t? " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 0> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 0>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 1> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 1>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 2> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 2>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 3> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 3>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 4> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 4>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 5> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 5>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 6> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 6>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 7> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 7>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 8> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 8>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 9> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 9>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"][\"$switch\"][\"$default\"]\n\t\t\t: " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"]\n\t>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "E", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + }, + { + "typeParameterName": "P", + "constraintTokenRange": { + "startIndex": 4, + "endIndex": 6 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 13, + "endIndex": 61 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "endpoint", + "parameterTypeTokenRange": { + "startIndex": 7, + "endIndex": 8 + }, + "isOptional": false + }, + { + "parameterName": "params", + "parameterTypeTokenRange": { + "startIndex": 9, + "endIndex": 10 + }, + "isOptional": true + }, + { + "parameterName": "credential", + "parameterTypeTokenRange": { + "startIndex": 11, + "endIndex": 12 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "request" + } + ], + "implementsTokenRanges": [] + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!api.APIError:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type APIError = " + }, + { + "kind": "Content", + "text": "{\n\tid: string;\n\tcode: string;\n\tmessage: string;\n\tkind: \"client\" | \"server\";\n\tinfo: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "name": "APIError", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!api.FetchLike:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FetchLike = " + }, + { + "kind": "Content", + "text": "(\n\tinput: string,\n\tinit?: {\n\t\tmethod?: string;\n\t\tbody?: string;\n\t\tcredentials?: " + }, + { + "kind": "Reference", + "text": "RequestCredentials", + "canonicalReference": "!RequestCredentials:type" + }, + { + "kind": "Content", + "text": ";\n\t\tcache?: " + }, + { + "kind": "Reference", + "text": "RequestCache", + "canonicalReference": "!RequestCache:type" + }, + { + "kind": "Content", + "text": ";\n\t},\n) => " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<{\n\tstatus: number;\n\tjson(): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<any>;\n}>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "name": "FetchLike", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "Function", + "canonicalReference": "calckey-js!api.isAPIError:function(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare function isAPIError(reason: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "reason", + "canonicalReference": "calckey-js!~reason" + }, + { + "kind": "Content", + "text": " is " + }, + { + "kind": "Reference", + "text": "APIError", + "canonicalReference": "calckey-js!api.APIError:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 6 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "reason", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "name": "isAPIError" + } + ] + }, + { + "kind": "Class", + "canonicalReference": "calckey-js!ChannelConnection:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare abstract class Connection<\n\tChannel extends " + }, + { + "kind": "Reference", + "text": "AnyOf", + "canonicalReference": "calckey-js!~AnyOf:type" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": ">" + }, + { + "kind": "Content", + "text": " = " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ",\n> extends " + }, + { + "kind": "Reference", + "text": "EventEmitter", + "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" + }, + { + "kind": "Content", + "text": "<Channel[\"events\"]>" + }, + { + "kind": "Content", + "text": " " + } + ], + "fileUrlPath": "src/streaming.ts", + "releaseTag": "Public", + "typeParameters": [ + { + "typeParameterName": "Channel", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "defaultTypeTokenRange": { + "startIndex": 6, + "endIndex": 7 + } + } + ], + "isAbstract": true, + "name": "ChannelConnection", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!ChannelConnection:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `Connection` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(stream: " + }, + { + "kind": "Reference", + "text": "Stream", + "canonicalReference": "calckey-js!Stream:class" + }, + { + "kind": "Content", + "text": ", channel: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ", name?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "stream", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "channel", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": true + } + ] + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#channel:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "channel: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "channel", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!ChannelConnection#dispose:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract dispose(): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [], + "isOptional": false, + "isAbstract": true, + "name": "dispose" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#id:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract id: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "id", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": true + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#inCount:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "inCount: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "inCount", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#name:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "name?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "name", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#outCount:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "outCount: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "outCount", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!ChannelConnection#send:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "send<T extends " + }, + { + "kind": "Content", + "text": "keyof Channel[\"receives\"]" + }, + { + "kind": "Content", + "text": ">(\n\t\ttype: " + }, + { + "kind": "Content", + "text": "T" + }, + { + "kind": "Content", + "text": ",\n\t\tbody: " + }, + { + "kind": "Content", + "text": "Channel[\"receives\"][T]" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "T", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 7, + "endIndex": 8 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "type", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "body", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#stream:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "protected stream: " + }, + { + "kind": "Reference", + "text": "Stream", + "canonicalReference": "calckey-js!Stream:class" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "stream", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": true, + "isAbstract": false + } + ], + "extendsTokenRange": { + "startIndex": 8, + "endIndex": 10 + }, + "implementsTokenRanges": [] + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Channels:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Channels = " + }, + { + "kind": "Content", + "text": "{\n\tmain: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnotification: (payload: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tmention: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treply: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\trenote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tfollow: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tfollowed: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunfollow: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tmeUpdated: (payload: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tpageEvent: (payload: " + }, + { + "kind": "Reference", + "text": "PageEvent", + "canonicalReference": "calckey-js!entities.PageEvent:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\turlUploadFinished: (payload: {\n\t\t\t\tmarker: string;\n\t\t\t\tfile: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t}) => void;\n\t\t\treadAllNotifications: () => void;\n\t\t\tunreadNotification: (payload: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunreadMention: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadMentions: () => void;\n\t\t\tunreadSpecifiedNote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadSpecifiedNotes: () => void;\n\t\t\treadAllMessagingMessages: () => void;\n\t\t\tmessagingMessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunreadMessagingMessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAllAntennas: () => void;\n\t\t\tunreadAntenna: (payload: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAllAnnouncements: () => void;\n\t\t\treadAllChannels: () => void;\n\t\t\tunreadChannel: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\tmyTokenRegenerated: () => void;\n\t\t\treversiNoInvites: () => void;\n\t\t\treversiInvited: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tsignin: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tregistryUpdated: (payload: {\n\t\t\t\tscope?: string[];\n\t\t\t\tkey: string;\n\t\t\t\tvalue: any | null;\n\t\t\t}) => void;\n\t\t\tdriveFileCreated: (payload: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAntenna: (payload: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thomeTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tlocalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thybridTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\trecommendedTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tglobalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tantenna: {\n\t\tparams: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tmessaging: {\n\t\tparams: {\n\t\t\totherparty?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tgroup?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tevents: {\n\t\t\tmessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tdeleted: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\tread: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"][]) => void;\n\t\t\ttypers: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[]) => void;\n\t\t};\n\t\treceives: {\n\t\t\tread: {\n\t\t\t\tid: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\t};\n\t\t};\n\t};\n\tserverStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n\tqueueStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/streaming.types.ts", + "releaseTag": "Public", + "name": "Channels", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 76 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Endpoints:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Endpoints = " + }, + { + "kind": "Content", + "text": "{\n\t\"admin/abuse-user-reports\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/delete-all-files-of-a-user\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/delete-logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\t\"admin/get-index-stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/get-table-stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/invite\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/meta\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/reset-password\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/resolve-abuse-user-report\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/resync-chart\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/send-email\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/server-info\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-moderation-logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/silence-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/suspend-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/unsilence-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/unsuspend-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/update-meta\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/vacuum\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/accounts/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/delete\": {\n\t\treq: {\n\t\t\tid: " + }, + { + "kind": "Reference", + "text": "Ad", + "canonicalReference": "calckey-js!entities.Ad:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/ad/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/delete\": {\n\t\treq: {\n\t\t\tid: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/announcements/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/clean-remote-files\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/cleanup\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/files\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/show-file\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/copy\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/list-remote\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/delete-all-files\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/federation/refresh-remote-instance-metadata\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/remove-all-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/update-instance\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/moderators/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/moderators/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/promo/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/clear\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/deliver-delayed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/inbox-delayed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/jobs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tannouncements: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\twithUnreads?: boolean;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/delete\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"antennas/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/notes\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/show\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/mark-read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"ap/get\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\t};\n\t\"ap/show\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres:\n\t\t\t| {\n\t\t\t\t\ttype: \"Note\";\n\t\t\t\t\tobject: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\ttype: \"User\";\n\t\t\t\t\tobject: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t };\n\t};\n\t\"app/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"app/show\": {\n\t\treq: {\n\t\t\tappId: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"auth/accept\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"auth/session/generate\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t};\n\t\tres: {\n\t\t\ttoken: string;\n\t\t\turl: string;\n\t\t};\n\t};\n\t\"auth/session/show\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "AuthSession", + "canonicalReference": "calckey-js!entities.AuthSession:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"auth/session/userkey\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t\ttoken: string;\n\t\t};\n\t\tres: {\n\t\t\taccessToken: string;\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"blocking/create\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"blocking/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"blocking/list\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"channels/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/follow\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/followed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/owned\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/pin-note\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/timeline\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/unfollow\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/active-users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/federation\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tinstance: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/hashtag\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/instance\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\tdrive: {\n\t\t\t\tdecFiles: number[];\n\t\t\t\tdecUsage: number[];\n\t\t\t\tincFiles: number[];\n\t\t\t\tincUsage: number[];\n\t\t\t\ttotalFiles: number[];\n\t\t\t\ttotalUsage: number[];\n\t\t\t};\n\t\t\tfollowers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tfollowing: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tnotes: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\trequests: {\n\t\t\t\tfailed: number[];\n\t\t\t\treceived: number[];\n\t\t\t\tsucceeded: number[];\n\t\t\t};\n\t\t\tusers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/network\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdecCount: number[];\n\t\t\tdecSize: number[];\n\t\t\tincCount: number[];\n\t\t\tincSize: number[];\n\t\t\ttotalCount: number[];\n\t\t\ttotalSize: number[];\n\t\t};\n\t};\n\t\"charts/user/following\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/user/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdec: number[];\n\t\t\tinc: number[];\n\t\t\ttotal: number[];\n\t\t\tdiffs: {\n\t\t\t\tnormal: number[];\n\t\t\t\trenote: number[];\n\t\t\t\treply: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/reactions\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"clips/add-note\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/delete\": {\n\t\treq: {\n\t\t\tclipId: " + }, + { + "kind": "Reference", + "text": "Clip", + "canonicalReference": "calckey-js!entities.Clip:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"clips/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tdrive: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcapacity: number;\n\t\t\tusage: number;\n\t\t};\n\t};\n\t\"drive/files\": {\n\t\treq: {\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\ttype?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/files/attached-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/check-existence\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/delete\": {\n\t\treq: {\n\t\t\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/files/find-by-hash\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/files/show\": {\n\t\treq: {\n\t\t\tfileId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\turl?: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/update\": {\n\t\treq: {\n\t\t\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tname?: string;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/upload-from-url\": {\n\t\treq: {\n\t\t\turl: string;\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t\tmarker?: string | null;\n\t\t\tforce?: boolean;\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders\": {\n\t\treq: {\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/folders/create\": {\n\t\treq: {\n\t\t\tname?: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/folders/delete\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/folders/show\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/folders/update\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/stream\": {\n\t\treq: {\n\t\t\ttype?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\tendpoint: {\n\t\treq: {\n\t\t\tendpoint: string;\n\t\t};\n\t\tres: {\n\t\t\tparams: {\n\t\t\t\tname: string;\n\t\t\t\ttype: string;\n\t\t\t}[];\n\t\t};\n\t};\n\tendpoints: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: string[];\n\t};\n\t\"federation/dns\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\ta: string[];\n\t\t\taaaa: string[];\n\t\t\tcname: string[];\n\t\t\ttxt: string[];\n\t\t};\n\t};\n\t\"federation/followers\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/following\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/instances\": {\n\t\treq: {\n\t\t\thost?: string | null;\n\t\t\tblocked?: boolean | null;\n\t\t\tnotResponding?: boolean | null;\n\t\t\tsuspended?: boolean | null;\n\t\t\tfederating?: boolean | null;\n\t\t\tsubscribing?: boolean | null;\n\t\t\tpublishing?: boolean | null;\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?:\n\t\t\t\t| \"+pubSub\"\n\t\t\t\t| \"-pubSub\"\n\t\t\t\t| \"+notes\"\n\t\t\t\t| \"-notes\"\n\t\t\t\t| \"+users\"\n\t\t\t\t| \"-users\"\n\t\t\t\t| \"+following\"\n\t\t\t\t| \"-following\"\n\t\t\t\t| \"+followers\"\n\t\t\t\t| \"-followers\"\n\t\t\t\t| \"+caughtAt\"\n\t\t\t\t| \"-caughtAt\"\n\t\t\t\t| \"+lastCommunicatedAt\"\n\t\t\t\t| \"-lastCommunicatedAt\"\n\t\t\t\t| \"+driveUsage\"\n\t\t\t\t| \"-driveUsage\"\n\t\t\t\t| \"+driveFiles\"\n\t\t\t\t| \"-driveFiles\";\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/show-instance\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"federation/update-remote-user\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"federation/users\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"following/create\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/requests/accept\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"following/requests/cancel\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/requests/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowRequest", + "canonicalReference": "calckey-js!entities.FollowRequest:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"following/requests/reject\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/popular\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/delete\": {\n\t\treq: {\n\t\t\tpostId: " + }, + { + "kind": "Reference", + "text": "GalleryPost", + "canonicalReference": "calckey-js!entities.GalleryPost:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/posts/like\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/unlike\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games/surrender\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/invitations\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/match\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/match/cancel\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"get-online-users-count\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcount: number;\n\t\t};\n\t};\n\t\"hashtags/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/trend\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\ti: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/authorized-apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/change-password\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/delete-account\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/export-blocking\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-mute\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-user-lists\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/favorites\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/gallery/likes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/get-word-muted-notes-count\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/import-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/import-user-lists\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/move\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/known-as\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/notifications\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tfollowing?: boolean;\n\t\t\tmarkAsRead?: boolean;\n\t\t\tincludeTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t\texcludeTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/page-likes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/pages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/pin\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-all-messaging-messages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-all-unread-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-announcement\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/regenerate-token\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/get-all\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\t};\n\t\"i/registry/get-detail\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: {\n\t\t\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tvalue: any;\n\t\t};\n\t};\n\t\"i/registry/get\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: any;\n\t};\n\t\"i/registry/keys-with-type\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<\n\t\t\tstring,\n\t\t\t\"null\" | \"array\" | \"number\" | \"string\" | \"boolean\" | \"object\"\n\t\t>;\n\t};\n\t\"i/registry/keys\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: string[];\n\t};\n\t\"i/registry/remove\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/scopes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: string[][];\n\t};\n\t\"i/registry/set\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tvalue: any;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/revoke-token\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/signin-history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/unpin\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/update-email\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t\temail?: string | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/update\": {\n\t\treq: {\n\t\t\tname?: string | null;\n\t\t\tdescription?: string | null;\n\t\t\tlang?: string | null;\n\t\t\tlocation?: string | null;\n\t\t\tbirthday?: string | null;\n\t\t\tavatarId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tbannerId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tfields?: {\n\t\t\t\tname: string;\n\t\t\t\tvalue: string;\n\t\t\t}[];\n\t\t\tisLocked?: boolean;\n\t\t\tisExplorable?: boolean;\n\t\t\thideOnlineStatus?: boolean;\n\t\t\tcarefulBot?: boolean;\n\t\t\tautoAcceptFollowed?: boolean;\n\t\t\tnoCrawle?: boolean;\n\t\t\tpreventAiLearning?: boolean;\n\t\t\tisBot?: boolean;\n\t\t\tisCat?: boolean;\n\t\t\tinjectFeaturedNote?: boolean;\n\t\t\treceiveAnnouncementEmail?: boolean;\n\t\t\talwaysMarkNsfw?: boolean;\n\t\t\tmutedWords?: string[][];\n\t\t\tmutingNotificationTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t\temailNotificationTypes?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/user-group-invites\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/done\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/key-done\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/password-less\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/register-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/register\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/update-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/remove-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/unregister\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"messaging/history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tgroup?: boolean;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"messaging/messages\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tgroupId?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tmarkAsRead?: boolean;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"messaging/messages/create\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tgroupId?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\ttext?: string;\n\t\t\tfileId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"messaging/messages/delete\": {\n\t\treq: {\n\t\t\tmessageId: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"messaging/messages/read\": {\n\t\treq: {\n\t\t\tmessageId: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\tmeta: {\n\t\treq: {\n\t\t\tdetail?: boolean;\n\t\t};\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: boolean;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": " | " + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"miauth/gen-token\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"mute/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"mute/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"renote-mute/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"renote-mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"renote-mute/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"my/apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tnotes: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/children\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/clips\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/conversation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoteSubmitReq", + "canonicalReference": "calckey-js!~NoteSubmitReq:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"notes/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/edit\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoteSubmitReq", + "canonicalReference": "calckey-js!~NoteSubmitReq:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"notes/favorites/create\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/favorites/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/global-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/recommended-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/hybrid-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/local-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/mentions\": {\n\t\treq: {\n\t\t\tfollowing?: boolean;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/polls/recommendation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/polls/vote\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tchoice: number;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\ttype?: string | null;\n\t\t\tlimit?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "NoteReaction", + "canonicalReference": "calckey-js!entities.NoteReaction:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/reactions/create\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\treaction: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/renotes\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/replies\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/search-by-tag\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/show\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/state\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/unrenote\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/user-list-timeline\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/watching/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/watching/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/create\": {\n\t\treq: {\n\t\t\tbody: string;\n\t\t\theader?: string | null;\n\t\t\ticon?: string | null;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/mark-all-as-read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\t\"notifications/read\": {\n\t\treq: {\n\t\t\tnotificationId: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"page-push\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tevent: string;\n\t\t\tvar?: any;\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"pages/delete\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"pages/like\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/show\": {\n\t\treq: {\n\t\t\tpageId?: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tusername?: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"pages/unlike\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\tping: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tpong: number;\n\t\t};\n\t};\n\t\"pinned-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"promo/read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"request-reset-password\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t\temail: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"reset-password\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"room/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"room/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tstats: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Stats", + "canonicalReference": "calckey-js!entities.Stats:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"server-info\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "ServerInfo", + "canonicalReference": "calckey-js!entities.ServerInfo:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"latest-version\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"sw/register\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"username/available\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t};\n\t\tres: {\n\t\t\tavailable: boolean;\n\t\t};\n\t};\n\tusers: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?: " + }, + { + "kind": "Reference", + "text": "UserSorting", + "canonicalReference": "calckey-js!entities.UserSorting:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\torigin?: " + }, + { + "kind": "Reference", + "text": "OriginType", + "canonicalReference": "calckey-js!entities.OriginType:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/clips\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/followers\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tusername?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"username\"];\n\t\t\thost?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFollowerPopulated", + "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/following\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tusername?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"username\"];\n\t\t\thost?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/get-frequently-replied-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/delete\": {\n\t\treq: {\n\t\t\tgroupId: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/groups/invitations/accept\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/invitations/reject\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/invite\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/joined\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/owned\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/pull\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/transfer\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/create\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/delete\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/lists/pull\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/push\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/show\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/update\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/notes\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/pages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/recommendation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/relation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/report-abuse\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/search-by-username-and-host\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/show\": {\n\t\treq:\n\t\t\t| " + }, + { + "kind": "Reference", + "text": "ShowUserReq", + "canonicalReference": "calckey-js!~ShowUserReq:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t| {\n\t\t\t\t\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\t\t\t };\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": "[],\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"users/stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.types.ts", + "releaseTag": "Public", + "name": "Endpoints", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 1158 + } + }, + { + "kind": "Namespace", + "canonicalReference": "calckey-js!entities:namespace", + "docComment": "", + "excerptTokens": [], + "fileUrlPath": "src/index.ts", + "releaseTag": "None", + "name": "entities", + "preserveMemberOrder": false, + "members": [ + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Ad:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Ad = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Ad", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Announcement:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Announcement = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\ttext: string;\n\ttitle: string;\n\timageUrl: string | null;\n\tisRead?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Announcement", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Antenna:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Antenna = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tname: string;\n\tkeywords: string[][];\n\texcludeKeywords: string[][];\n\tsrc: \"home\" | \"all\" | \"users\" | \"list\" | \"group\" | \"instances\";\n\tuserListId: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": " | null;\n\tuserGroupId: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": " | null;\n\tusers: string[];\n\tinstances: string[];\n\tcaseSensitive: boolean;\n\tnotify: boolean;\n\twithReplies: boolean;\n\twithFile: boolean;\n\thasUnreadNote: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Antenna", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.App:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type App = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "App", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.AuthSession:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type AuthSession = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tapp: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\ttoken: string;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "AuthSession", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 6 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Blocking:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Blocking = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tblockeeId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tblockee: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Blocking", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Channel:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Channel = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Channel", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Clip:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Clip = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Clip", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.CustomEmoji:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type CustomEmoji = " + }, + { + "kind": "Content", + "text": "{\n\tid: string;\n\tname: string;\n\turl: string;\n\tcategory: string;\n\taliases: string[];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "CustomEmoji", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DateString:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DateString = " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DateString", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DetailedInstanceMetadata = " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": " & {\n\tfeatures: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DetailedInstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DriveFile:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DriveFile = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisSensitive: boolean;\n\tname: string;\n\tthumbnailUrl: string;\n\turl: string;\n\ttype: string;\n\tsize: number;\n\tmd5: string;\n\tblurhash: string;\n\tcomment: string | null;\n\tproperties: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DriveFile", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DriveFolder:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DriveFolder = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DriveFolder", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Following:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Following = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tfollowerId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tfolloweeId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Following", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowingFolloweePopulated = " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": " & {\n\tfollowee: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowingFolloweePopulated", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowingFollowerPopulated = " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": " & {\n\tfollower: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowingFollowerPopulated", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowRequest:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowRequest = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tfollower: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tfollowee: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowRequest", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.GalleryPost:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type GalleryPost = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "GalleryPost", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.ID:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type ID = " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "ID", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Instance:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Instance = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcaughtAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\thost: string;\n\tusersCount: number;\n\tnotesCount: number;\n\tfollowingCount: number;\n\tfollowersCount: number;\n\tdriveUsage: number;\n\tdriveFiles: number;\n\tlatestRequestSentAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\tlatestStatus: number | null;\n\tlatestRequestReceivedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\tlastCommunicatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisNotResponding: boolean;\n\tisSuspended: boolean;\n\tsoftwareName: string | null;\n\tsoftwareVersion: string | null;\n\topenRegistrations: boolean | null;\n\tname: string | null;\n\tdescription: string | null;\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\ticonUrl: string | null;\n\tfaviconUrl: string | null;\n\tthemeColor: string | null;\n\tinfoUpdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Instance", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 14 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.InstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type InstanceMetadata =\n\t" + }, + { + "kind": "Content", + "text": "| " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": "\n\t| " + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "InstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type LiteInstanceMetadata = " + }, + { + "kind": "Content", + "text": "{\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\tversion: string;\n\tname: string | null;\n\turi: string;\n\tdescription: string | null;\n\ttosUrl: string | null;\n\tdisableRegistration: boolean;\n\tdisableLocalTimeline: boolean;\n\tdisableRecommendedTimeline: boolean;\n\tdisableGlobalTimeline: boolean;\n\tdriveCapacityPerLocalUserMb: number;\n\tdriveCapacityPerRemoteUserMb: number;\n\tenableHcaptcha: boolean;\n\thcaptchaSiteKey: string | null;\n\tenableRecaptcha: boolean;\n\trecaptchaSiteKey: string | null;\n\tswPublickey: string | null;\n\tmaxNoteTextLength: number;\n\tenableEmail: boolean;\n\tenableTwitterIntegration: boolean;\n\tenableGithubIntegration: boolean;\n\tenableDiscordIntegration: boolean;\n\tenableServiceWorker: boolean;\n\temojis: " + }, + { + "kind": "Reference", + "text": "CustomEmoji", + "canonicalReference": "calckey-js!entities.CustomEmoji:type" + }, + { + "kind": "Content", + "text": "[];\n\tads: {\n\t\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\t\tratio: number;\n\t\tplace: string;\n\t\turl: string;\n\t\timageUrl: string;\n\t}[];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "LiteInstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 6 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.MeDetailed:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type MeDetailed = " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": " & {\n\tavatarId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tbannerId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tautoAcceptFollowed: boolean;\n\talwaysMarkNsfw: boolean;\n\tcarefulBot: boolean;\n\temailNotificationTypes: string[];\n\thasPendingReceivedFollowRequest: boolean;\n\thasUnreadAnnouncement: boolean;\n\thasUnreadAntenna: boolean;\n\thasUnreadChannel: boolean;\n\thasUnreadMentions: boolean;\n\thasUnreadMessagingMessage: boolean;\n\thasUnreadNotification: boolean;\n\thasUnreadSpecifiedNotes: boolean;\n\thideOnlineStatus: boolean;\n\tinjectFeaturedNote: boolean;\n\tintegrations: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\tisDeleted: boolean;\n\tisExplorable: boolean;\n\tmutedWords: string[][];\n\tmutingNotificationTypes: string[];\n\tnoCrawle: boolean;\n\tpreventAiLearning: boolean;\n\treceiveAnnouncementEmail: boolean;\n\tusePasswordLessLogin: boolean;\n\t[other: string]: any;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "MeDetailed", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 9 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.MessagingMessage:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type MessagingMessage = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tfile: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": " | null;\n\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\tisRead: boolean;\n\treads: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\ttext: string | null;\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\trecipient?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": " | null;\n\trecipientId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\tgroup?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": " | null;\n\tgroupId: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "MessagingMessage", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 24 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Note:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Note = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\ttext: string | null;\n\tcw: string | null;\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\treply?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\treplyId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\trenote?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\trenoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tfiles: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\tfileIds: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\tvisibility: \"public\" | \"home\" | \"followers\" | \"specified\";\n\tvisibleUserIds?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\tlocalOnly?: boolean;\n\tchannel?: " + }, + { + "kind": "Reference", + "text": "Channel", + "canonicalReference": "calckey-js!entities.Channel:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tmyReaction?: string;\n\treactions: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, number>;\n\trenoteCount: number;\n\trepliesCount: number;\n\tpoll?: {\n\t\texpiresAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\t\tmultiple: boolean;\n\t\tchoices: {\n\t\t\tisVoted: boolean;\n\t\t\ttext: string;\n\t\t\tvotes: number;\n\t\t}[];\n\t};\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\turi?: string;\n\turl?: string;\n\tupdatedAt?: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisHidden?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Note", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 32 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.NoteFavorite:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type NoteFavorite = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "NoteFavorite", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.NoteReaction:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type NoteReaction = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tuser: " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": ";\n\ttype: string;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "NoteReaction", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Notification:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Notification = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisRead: boolean;\n} & (\n\t| {\n\t\t\ttype: \"reaction\";\n\t\t\treaction: string;\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"reply\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"renote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"quote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"mention\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"pollVote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"follow\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"followRequestAccepted\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"receiveFollowRequest\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"groupInvited\";\n\t\t\tinvitation: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"app\";\n\t\t\theader?: string | null;\n\t\t\tbody: string;\n\t\t\ticon?: string | null;\n\t }\n)" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Notification", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 60 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.OriginType:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type OriginType = " + }, + { + "kind": "Content", + "text": "\"combined\" | \"local\" | \"remote\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "OriginType", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Page:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Page = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tcontent: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>[];\n\tvariables: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>[];\n\ttitle: string;\n\tname: string;\n\tsummary: string | null;\n\thideTitleWhenPinned: boolean;\n\talignCenter: boolean;\n\tfont: string;\n\tscript: string;\n\teyeCatchingImageId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\teyeCatchingImage: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": " | null;\n\tattachedFiles: any;\n\tlikedCount: number;\n\tisLiked?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Page", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 20 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.PageEvent:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type PageEvent = " + }, + { + "kind": "Content", + "text": "{\n\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tevent: string;\n\tvar: any;\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "PageEvent", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.ServerInfo:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type ServerInfo = " + }, + { + "kind": "Content", + "text": "{\n\tmachine: string;\n\tcpu: {\n\t\tmodel: string;\n\t\tcores: number;\n\t};\n\tmem: {\n\t\ttotal: number;\n\t};\n\tfs: {\n\t\ttotal: number;\n\t\tused: number;\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "ServerInfo", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Signin:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Signin = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tip: string;\n\theaders: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\tsuccess: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Signin", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Stats:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Stats = " + }, + { + "kind": "Content", + "text": "{\n\tnotesCount: number;\n\toriginalNotesCount: number;\n\tusersCount: number;\n\toriginalUsersCount: number;\n\tinstances: number;\n\tdriveUsageLocal: number;\n\tdriveUsageRemote: number;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Stats", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.User:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type User = " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": " | " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "User", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserDetailed:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserDetailed = " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": " & {\n\tbannerBlurhash: string | null;\n\tbannerColor: string | null;\n\tbannerUrl: string | null;\n\tbirthday: string | null;\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tdescription: string | null;\n\tffVisibility: \"public\" | \"followers\" | \"private\";\n\tfields: {\n\t\tname: string;\n\t\tvalue: string;\n\t}[];\n\tfollowersCount: number;\n\tfollowingCount: number;\n\thasPendingFollowRequestFromYou: boolean;\n\thasPendingFollowRequestToYou: boolean;\n\tisAdmin: boolean;\n\tisBlocked: boolean;\n\tisBlocking: boolean;\n\tisBot: boolean;\n\tisCat: boolean;\n\tisFollowed: boolean;\n\tisFollowing: boolean;\n\tisLocked: boolean;\n\tisModerator: boolean;\n\tisMuted: boolean;\n\tisRenoteMuted: boolean;\n\tisSilenced: boolean;\n\tisSuspended: boolean;\n\tlang: string | null;\n\tlastFetchedAt?: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tlocation: string | null;\n\tnotesCount: number;\n\tpinnedNoteIds: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": "[];\n\tpinnedNotes: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\tpinnedPage: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": " | null;\n\tpinnedPageId: string | null;\n\tpublicReactions: boolean;\n\tsecurityKeys: boolean;\n\ttwoFactorEnabled: boolean;\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\turi: string | null;\n\turl: string | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserDetailed", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 15 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserGroup:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserGroup = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserGroup", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserList:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserList = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tname: string;\n\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserList", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserLite:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserLite = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tusername: string;\n\thost: string | null;\n\tname: string;\n\tonlineStatus: \"online\" | \"active\" | \"offline\" | \"unknown\";\n\tavatarUrl: string;\n\tavatarBlurhash: string;\n\talsoKnownAs: string[];\n\tmovedToUri: any;\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\tinstance?: {\n\t\tname: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"name\"];\n\t\tsoftwareName: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"softwareName\"];\n\t\tsoftwareVersion: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"softwareVersion\"];\n\t\ticonUrl: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"iconUrl\"];\n\t\tfaviconUrl: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"faviconUrl\"];\n\t\tthemeColor: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"themeColor\"];\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserLite", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 16 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserSorting:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserSorting =\n\t" + }, + { + "kind": "Content", + "text": "| \"+follower\"\n\t| \"-follower\"\n\t| \"+createdAt\"\n\t| \"-createdAt\"\n\t| \"+updatedAt\"\n\t| \"-updatedAt\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserSorting", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ] + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!ffVisibility:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "ffVisibility: " + }, + { + "kind": "Content", + "text": "readonly [\"public\", \"followers\", \"private\"]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "ffVisibility", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!mutedNoteReasons:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "mutedNoteReasons: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"word\",\n\t\"manual\",\n\t\"spam\",\n\t\"other\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "mutedNoteReasons", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!noteVisibilities:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "noteVisibilities: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"public\",\n\t\"home\",\n\t\"followers\",\n\t\"specified\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "noteVisibilities", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!notificationTypes:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "notificationTypes: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"follow\",\n\t\"mention\",\n\t\"reply\",\n\t\"renote\",\n\t\"quote\",\n\t\"reaction\",\n\t\"pollVote\",\n\t\"pollEnded\",\n\t\"receiveFollowRequest\",\n\t\"followRequestAccepted\",\n\t\"groupInvited\",\n\t\"app\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "notificationTypes", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!permissions:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "permissions: " + }, + { + "kind": "Content", + "text": "string[]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "permissions", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Class", + "canonicalReference": "calckey-js!Stream:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export default class Stream extends " + }, + { + "kind": "Reference", + "text": "EventEmitter", + "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "StreamEvents", + "canonicalReference": "calckey-js!~StreamEvents:type" + }, + { + "kind": "Content", + "text": ">" + }, + { + "kind": "Content", + "text": " " + } + ], + "fileUrlPath": "src/streaming.ts", + "releaseTag": "Public", + "isAbstract": false, + "name": "Stream", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!Stream:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `Stream` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(\n\t\torigin: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ",\n\t\tuser: " + }, + { + "kind": "Content", + "text": "{\n\t\t\ttoken: string;\n\t\t} | null" + }, + { + "kind": "Content", + "text": ",\n\t\toptions?: " + }, + { + "kind": "Content", + "text": "{\n\t\t\tWebSocket?: any;\n\t\t}" + }, + { + "kind": "Content", + "text": ",\n\t);" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "origin", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "user", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "options", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": true + } + ] + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#close:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "close(): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [], + "isOptional": false, + "isAbstract": false, + "name": "close" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#disconnectToChannel:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "disconnectToChannel(connection: " + }, + { + "kind": "Reference", + "text": "NonSharedConnection", + "canonicalReference": "calckey-js!~NonSharedConnection:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "connection", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "disconnectToChannel" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#removeSharedConnection:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "removeSharedConnection(connection: " + }, + { + "kind": "Reference", + "text": "SharedConnection", + "canonicalReference": "calckey-js!~SharedConnection:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "connection", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "removeSharedConnection" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#removeSharedConnectionPool:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "removeSharedConnectionPool(pool: " + }, + { + "kind": "Reference", + "text": "Pool", + "canonicalReference": "calckey-js!~Pool:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "pool", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "removeSharedConnectionPool" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#send:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "send(typeOrPayload: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ", payload?: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "typeOrPayload", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "payload", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!Stream#state:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "state: " + }, + { + "kind": "Content", + "text": "\"initializing\" | \"reconnecting\" | \"connected\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "state", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#useChannel:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "useChannel<C extends " + }, + { + "kind": "Content", + "text": "keyof " + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": ">(\n\t\tchannel: " + }, + { + "kind": "Content", + "text": "C" + }, + { + "kind": "Content", + "text": ",\n\t\tparams?: " + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": "[C][\"params\"]" + }, + { + "kind": "Content", + "text": ",\n\t\tname?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Reference", + "text": "Connection", + "canonicalReference": "calckey-js!ChannelConnection:class" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": "[C]>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "C", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 11, + "endIndex": 15 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "channel", + "parameterTypeTokenRange": { + "startIndex": 4, + "endIndex": 5 + }, + "isOptional": false + }, + { + "parameterName": "params", + "parameterTypeTokenRange": { + "startIndex": 6, + "endIndex": 8 + }, + "isOptional": true + }, + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 9, + "endIndex": 10 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "useChannel" + } + ], + "extendsTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "implementsTokenRanges": [] + } + ] + } + ] +} diff --git a/packages/client/assets/label-red.svg b/packages/client/assets/label-red.svg index 4b95a931a3..bf1e9cedbc 100644 --- a/packages/client/assets/label-red.svg +++ b/packages/client/assets/label-red.svg @@ -1 +1 @@ -<svg width="96" height="96" xmlns="http://www.w3.org/2000/svg"><path fill="#eb6f92" d="M0 45.255L45.254 0h39.6L0 84.854z"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96"><path fill="#eb6f92" d="M0 45.255 45.254 0h39.6L0 84.854z"/></svg> \ No newline at end of file diff --git a/packages/client/assets/label.svg b/packages/client/assets/label.svg index e076c6baf8..976bf410f9 100644 --- a/packages/client/assets/label.svg +++ b/packages/client/assets/label.svg @@ -1 +1 @@ -<svg width="96" height="96" xmlns="http://www.w3.org/2000/svg"><path fill="#31748f" d="M0 45.255L45.254 0h39.6L0 84.854z"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96"><path fill="#31748f" d="M0 45.255 45.254 0h39.6L0 84.854z"/></svg> \ No newline at end of file diff --git a/packages/client/assets/misskey.svg b/packages/client/assets/misskey.svg index e68af591a6..13ee2ced63 100644 --- a/packages/client/assets/misskey.svg +++ b/packages/client/assets/misskey.svg @@ -1,16 +1 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" version="1.1" - viewBox="0 0 521 136" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> - - <g> - <g transform="matrix(.26953 0 0 .26953 -55.341 -52.023)"> - - </g> - <g transform="matrix(3.6954 0 0 3.6954 208.34 -284.25)" clip-rule="evenodd" fill-rule="evenodd" - stroke-linejoin="round" stroke-miterlimit="2"> - <path - d="m11.582 84.119c-2.9058 0-5.3921 1.02-7.46 3.0598-2.0402 2.0676-3.0598 4.5542-3.0598 7.46 3.7964 0.03742 4.5686 0.01036 6.5746 8.19e-4 0.0018-4.15e-4 0.0033-4.15e-4 0.0052-8.19e-4 0.02839-2.1351 1.6603-3.7068 3.94-3.94 1.0619 0 1.9701 0.39127 2.7243 1.174 0.64225 0.6421 1.425 0.96317 2.348 0.96317 0.92083 0 1.7034-0.32106 2.3464-0.96317 0.64225-0.64276 0.96396-1.4254 0.96396-2.348 0-0.92126-0.32172-1.7032-0.96396-2.346-2.0679-2.0399-4.5406-3.0598-7.4187-3.0598zm-3.9452 10.521c-2.5881-4.2016-2.6041 0.06416-6.5746-8.19e-4 0 2.9058 1.0204 5.2887 3.0606 7.3564 2.0679 2.0399 4.5538 3.0598 7.4596 3.0598 2.8781 0 5.3512-1.02 7.4191-3.0598 0.64225-0.64284 0.96357-1.4247 0.96357-2.346 0-0.92258-0.32132-1.7052-0.96357-2.348-0.64298-0.6421-1.4256-0.96317-2.3464-0.96317-0.92301 0-1.7057 0.32106-2.348 0.96317-0.75426 0.7827-1.6628 1.1736-2.7247 1.1736-2.2797-0.23324-3.9124-1.7001-3.9408-3.8352-0.0018 1.1e-5 -0.0029-1e-5 -0.0048 0zm-49.468-17.45c-3.8683 0-7.1782 1.3578-9.9311 4.0734-2.716 2.7525-4.0734 6.0628-4.0734 9.9311 5.0539 0.04979 6.082 0.01348 8.7525 0.0011 0.0024-4.51e-4 0.0044-6.05e-4 0.0069-0.0011 0.03779-2.8423 2.2103-4.9346 5.2451-5.2451 1.4137 0 2.6227 0.52089 3.6268 1.5629 0.855 0.8548 1.897 1.2822 3.1257 1.2822 1.2258 0 2.2676-0.42741 3.1236-1.2822 0.85499-0.85567 1.2833-1.8976 1.2833-3.1257 0-1.2264-0.42828-2.2673-1.2833-3.1231-2.7528-2.7156-6.0446-4.0734-9.8761-4.0734zm-5.252 14.006c-3.4453-5.5934-3.4667 0.08539-8.7525-0.0011 0 3.8683 1.3584 7.0406 4.0744 9.7931 2.7528 2.7156 6.0623 4.0734 9.9305 4.0734 3.8315 0 7.1238-1.3578 9.8766-4.0734 0.85499-0.85577 1.2827-1.8967 1.2827-3.1231 0-1.2282-0.42775-2.2701-1.2827-3.1257-0.85596-0.8548-1.8978-1.2822-3.1236-1.2822-1.2287 0-2.2707 0.42741-3.1257 1.2822-1.0041 1.042-2.2136 1.5623-3.6273 1.5623-3.0348-0.31051-5.2084-2.2633-5.2462-5.1056-0.0024 1.1e-5 -0.0039-1.2e-5 -0.0063 0zm42.663-14.006c-1.1773 0-2.1864 0.42062-3.0269 1.2611-0.84045 0.84111-1.2714 1.8501-1.2605 3.0274l0.17494 19.047c0.010814 1.1772 0.42009 2.1864 1.2605 3.0269 0.84111 0.81273 1.8503 1.2188 3.0269 1.2188 1.178 0 2.1735-0.40606 2.9862-1.2188 0.84045-0.84045 1.2708-1.8497 1.26-3.0269l-0.17494-19.047c-0.010822-1.178-0.41956-2.187-1.26-3.0274-0.81332-0.84045-1.8089-1.2611-2.9862-1.2611zm29.767 0c-1.1765 0-2.1851 0.42062-3.0253 1.2611-0.81252 0.81266-1.2278 1.807-1.2198 2.9836l0.13108 19.314c8e-3 1.1772 0.4068 2.1864 1.2193 3.0269 0.84023 0.81266 1.8488 1.2193 3.0253 1.2193 1.1779 0 2.1859-0.40666 3.0269-1.2193 0.84023-0.84045 1.2611-1.8491 1.2611-3.0258 0-0.84046 0.1119-1.26 0.33509-1.26 0.11305 0 0.22508 0.04136 0.33667 0.12473l4.2029 4.0771c0.84023 0.81267 1.8348 1.2188 2.9836 1.2188 1.2042 0 2.2131-0.42062 3.0264-1.2611 0.81252-0.86897 1.2188-1.8637 1.2188-2.9841 0-1.2051-0.43415-2.2277-1.3028-3.0681-1.9058-1.8775-2.8997-2.8439-2.9836-2.8995-0.36468-0.36468-0.35117-0.67278 0.04123-0.92493l0.08456-0.04175v-0.04175l2.6479-1.6813c1.2603-0.84045 1.8911-2.0312 1.8911-3.5718 0-0.84045-0.22446-1.6253-0.67229-2.3546-0.84023-1.2606-2.0312-1.8911-3.5723-1.8911-0.84023 0-1.6251 0.22424-2.353 0.67229-3.2501 2.1581-4.932 3.265-5.0443 3.3213-0.19547 0.1396-0.37822 0.167-0.54597 0.08298-0.19693-0.08402-0.28963-0.2661-0.29545-0.54597l-0.13055-6.2858c-0.02446-1.1764-0.41978-2.1709-1.26-2.9836-0.84023-0.84045-1.8492-1.2611-3.0264-1.2611zm-46.276 6.9095c-2.8795 0-5.3538 1.0204-7.4227 3.0612-0.64257 0.64316-0.96404 1.4255-0.96404 2.3472 0 0.92303 0.32146 1.7062 0.96404 2.3493 0.64331 0.64243 1.4265 0.96351 2.3477 0.96351 0.92347 0 1.7068-0.32108 2.3493-0.96351 0.75465-0.78308 1.6632-1.1744 2.7256-1.1744 1.0894 0 2.0261 0.37695 2.8091 1.1316 0.75536 0.78309 1.1332 1.7201 1.1332 2.8102 0 1.0617-0.39242 1.9703-1.1754 2.7256-0.39149 0.4193-0.86676 0.69884-1.4249 0.83878-0.14116 0.02773-0.25248 0.01369-0.33614-0.04175-0.05605-0.08456-0.02751-0.16827 0.08456-0.25211l0.83825-0.88053c0.64329-0.64315 0.9651-1.412 0.9651-2.306 0-0.92236-0.27937-1.6632-0.83825-2.2225-0.55888-0.55932-1.3422-0.83878-2.3493-0.83878-0.6986 0-1.397 0.34902-2.0956 1.0475l-4.8651 4.8223c-0.64328 0.6438-0.96457 1.4271-0.96457 2.3488 0 0.92302 0.32128 1.7053 0.96457 2.3477 1.9568 1.9293 4.3751 2.8942 7.2546 2.8942 2.9072 0 5.3945-1.0343 7.4634-3.103 2.0412-2.0409 3.0618-4.501 3.0618-7.3804 0-2.9072-1.0206-5.3952-3.0618-7.4639-2.0689-2.0409-4.5562-3.0612-7.4634-3.0612zm74.764 0.02061c-2.9138 0-5.4067 1.0365-7.4803 3.1099-2.0459 2.0456-3.0686 4.5113-3.0686 7.3973 0 2.9138 1.0228 5.4074 3.0686 7.4808 2.0736 2.0455 4.5665 3.0681 7.4803 3.0681 2.8861 0 5.366-1.0226 7.4396-3.0681 0.64403-0.64462 0.96668-1.4287 0.96668-2.3525 0-0.92513-0.32265-1.7101-0.96668-2.3546-0.64476-0.64388-1.4296-0.96562-2.353-0.96562-0.92557 0-1.71 0.32174-2.3541 0.96562-0.75635 0.78488-1.6676 1.177-2.7325 1.177-1.0919 0-2.0307-0.37787-2.8155-1.1342-0.75708-0.78487-1.1353-1.7239-1.1353-2.8165 0-1.0641 0.39276-1.9749 1.1776-2.732 0.3924-0.42026 0.86866-0.7001 1.4281-0.84036 0.1415-0.02779 0.25332-0.01436 0.3372 0.04122 0.05616 0.08475 0.02777 0.16914-0.08456 0.25317l-0.84036 0.88264c-0.64476 0.64462-0.96721 1.4152-0.96721 2.3113 0 0.92447 0.28021 1.6667 0.84036 2.2272 0.56015 0.56059 1.3452 0.84036 2.3546 0.84036 0.70019 0 1.4002-0.34954 2.1004-1.0497l4.8757-4.8334c0.64476-0.64527 0.96721-1.4303 0.96721-2.3541 0-0.92513-0.32245-1.7091-0.96721-2.353-1.9613-1.9337-4.3849-2.9006-7.271-2.9006zm14.135 0.36468c-1.1765 0-2.1851 0.42009-3.0253 1.2605-0.81252 0.812-1.2188 1.8068-1.2188 2.9841v5.8418c0 2.8297 1.0081 5.2528 3.0248 7.2699 2.0182 2.0171 4.4428 3.0258 7.272 3.0258 0.56088 0 1.0792-0.0419 1.5555-0.12526 0.28008-0.0563 0.4756-5e-5 0.5872 0.16807 0.08461 0.11181 0.05633 0.26591-0.08298 0.46247-0.36468 0.50429-1.1358 0.75632-2.3123 0.75632-0.44783 0-1.0216-0.11178-1.7225-0.33614-0.70019-0.22435-1.2466-0.33668-1.639-0.33668-1.6535 0-2.8163 0.75713-3.4888 2.2706-0.25163 0.50428-0.37843 1.0362-0.37843 1.5967 0 1.6531 0.74329 2.816 2.2283 3.4883 1.485 0.70012 3.1515 1.0502 5.0004 1.0502 3.1946 0 5.7299-0.93854 7.6066-2.816 3.8023-4.6583 2.8593-9.356 2.8593-15.214 7.29e-4 -2.3268 0.04625-4.7173 0.08298-7.1024 0.01812-1.1765-0.41958-2.1714-1.2605-2.9841-0.81252-0.84045-1.8064-1.2605-2.9836-1.2605s-2.1859 0.42009-3.0269 1.2605c-0.84023 0.812-1.2605 1.8068-1.2605 2.9841v5.8418c0 0.47577-0.16851 0.89593-0.50475 1.2605-0.33551 0.33624-0.75529 0.50422-1.26 0.50422-0.47628 0-0.89659-0.16798-1.2605-0.50422-0.33624-0.36461-0.50475-0.78478-0.50475-1.2605v-5.8418c0-1.1766-0.42031-2.1714-1.2605-2.9841-0.84096-0.84045-1.8504-1.2605-3.0269-1.2605z" - clip-rule="evenodd" fill="#fff" fill-rule="nonzero" stroke-miterlimit="2" stroke-width="0" /> - </g> - </g> -</svg> +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 521 136"><path fill="#fff" fill-rule="nonzero" d="M251.14 26.603c-10.738 0-19.926 3.77-27.568 11.308-7.539 7.64-11.307 16.83-11.307 27.567 14.03.139 16.883.039 24.296.003l.02-.003c.104-7.89 6.135-13.698 14.56-14.56 3.923 0 7.28 1.446 10.067 4.339 2.373 2.373 5.265 3.559 8.676 3.559 3.403 0 6.295-1.186 8.671-3.56 2.374-2.375 3.562-5.267 3.562-8.676 0-3.404-1.188-6.294-3.562-8.67-7.642-7.538-16.78-11.307-27.415-11.307zm-14.579 38.88c-9.564-15.527-9.623.237-24.296-.003 0 10.738 3.771 19.543 11.31 27.184 7.642 7.539 16.829 11.308 27.567 11.308 10.635 0 19.774-3.77 27.416-11.308 2.374-2.375 3.56-5.264 3.56-8.669 0-3.41-1.186-6.301-3.56-8.677-2.376-2.373-5.268-3.559-8.67-3.559-3.412 0-6.304 1.186-8.678 3.56-2.787 2.892-6.144 4.336-10.068 4.336-8.425-.862-14.458-6.282-14.563-14.172h-.018zM53.757.998c-14.295 0-26.526 5.018-36.7 15.053C7.022 26.222 2.006 38.455 2.006 52.75c18.676.183 22.475.049 32.344.003l.025-.004c.14-10.503 8.168-18.235 19.383-19.383 5.224 0 9.692 1.925 13.402 5.776 3.16 3.159 7.01 4.738 11.551 4.738 4.53 0 8.38-1.58 11.543-4.738 3.16-3.162 4.742-7.012 4.742-11.55 0-4.533-1.582-8.38-4.742-11.542C80.08 6.016 67.916.998 53.757.998zM34.349 52.756c-12.732-20.67-12.811.315-32.344-.004 0 14.295 5.02 26.017 15.056 36.19 10.173 10.034 22.403 15.052 36.697 15.052 14.16 0 26.326-5.018 36.498-15.053 3.16-3.162 4.74-7.009 4.74-11.541 0-4.539-1.58-8.389-4.74-11.55-3.163-3.16-7.013-4.739-11.543-4.739-4.54 0-8.39 1.58-11.55 4.738-3.71 3.85-8.18 5.774-13.405 5.774-11.214-1.148-19.247-8.364-19.386-18.868h-.024zM192.006.998c-4.351 0-8.08 1.554-11.186 4.66-3.106 3.108-4.698 6.837-4.658 11.188l.646 70.386c.04 4.35 1.553 8.08 4.658 11.186 3.109 3.003 6.838 4.503 11.186 4.503 4.353 0 8.032-1.5 11.035-4.503 3.106-3.106 4.696-6.836 4.656-11.186l-.646-70.386c-.04-4.354-1.55-8.082-4.656-11.188-3.006-3.106-6.685-4.66-11.035-4.66zm110 0c-4.347 0-8.074 1.554-11.18 4.66-3.002 3.003-4.536 6.678-4.507 11.026l.485 71.373c.03 4.35 1.503 8.08 4.505 11.185 3.105 3.003 6.832 4.506 11.18 4.506 4.353 0 8.078-1.503 11.186-4.506 3.105-3.105 4.66-6.833 4.66-11.181 0-3.106.414-4.656 1.238-4.656.418 0 .832.152 1.244.46l15.532 15.067c3.105 3.003 6.78 4.504 11.025 4.504 4.45 0 8.179-1.554 11.184-4.66 3.003-3.211 4.504-6.887 4.504-11.028 0-4.453-1.604-8.232-4.814-11.338-7.043-6.938-10.716-10.509-11.026-10.714-1.347-1.348-1.298-2.487.153-3.418l.312-.155v-.154l9.785-6.213c4.657-3.106 6.988-7.506 6.988-13.2 0-3.105-.83-6.005-2.484-8.7-3.105-4.659-7.506-6.989-13.201-6.989-3.105 0-6.005.829-8.695 2.485-12.01 7.975-18.226 12.065-18.641 12.273-.722.516-1.398.617-2.018.307-.727-.31-1.07-.984-1.091-2.018l-.483-23.228c-.09-4.348-1.551-8.023-4.656-11.026C310.086 2.554 306.357 1 302.007 1zM130.999 26.53c-10.64 0-19.784 3.771-27.43 11.313-2.374 2.376-3.562 5.267-3.562 8.673 0 3.411 1.188 6.306 3.562 8.682 2.378 2.374 5.272 3.56 8.676 3.56 3.413 0 6.307-1.186 8.682-3.56 2.788-2.894 6.146-4.34 10.072-4.34 4.026 0 7.487 1.393 10.38 4.182 2.792 2.894 4.188 6.356 4.188 10.385 0 3.923-1.45 7.28-4.343 10.072a10.578 10.578 0 0 1-5.266 3.1c-.522.102-.933.05-1.242-.155-.207-.312-.102-.622.312-.931l3.098-3.254c2.377-2.377 3.567-5.218 3.567-8.522 0-3.408-1.033-6.146-3.098-8.213-2.065-2.067-4.96-3.1-8.682-3.1-2.581 0-5.162 1.29-7.744 3.871l-17.978 17.82c-2.378 2.38-3.565 5.274-3.565 8.68 0 3.411 1.187 6.302 3.565 8.676 7.23 7.13 16.167 10.695 26.808 10.695 10.744 0 19.935-3.822 27.58-11.466 7.544-7.542 11.315-16.633 11.315-27.274 0-10.743-3.771-19.937-11.314-27.582-7.646-7.542-16.837-11.312-27.58-11.312zm276.283.076c-10.768 0-19.98 3.83-27.643 11.493-7.56 7.56-11.34 16.67-11.34 27.336 0 10.767 3.78 19.982 11.34 27.644 7.663 7.56 16.875 11.338 27.643 11.338 10.665 0 19.83-3.779 27.492-11.338 2.38-2.382 3.573-5.28 3.573-8.693 0-3.419-1.193-6.32-3.573-8.701-2.382-2.38-5.283-3.569-8.695-3.569-3.42 0-6.319 1.19-8.7 3.569-2.794 2.9-6.162 4.35-10.097 4.35-4.035 0-7.504-1.397-10.404-4.192-2.798-2.9-4.196-6.37-4.196-10.408 0-3.933 1.452-7.298 4.352-10.096a10.6 10.6 0 0 1 5.277-3.106c.523-.102.937-.053 1.247.153.207.313.102.625-.313.935l-3.105 3.262c-2.383 2.382-3.575 5.23-3.575 8.541 0 3.417 1.036 6.16 3.106 8.23 2.07 2.072 4.97 3.106 8.701 3.106 2.587 0 5.174-1.292 7.762-3.879l18.017-17.861c2.383-2.385 3.575-5.286 3.575-8.7 0-3.418-1.192-6.315-3.575-8.695-7.247-7.146-16.203-10.719-26.869-10.719zm52.235 1.348c-4.348 0-8.075 1.552-11.18 4.658-3.003 3-4.504 6.677-4.504 11.028v21.587c0 10.457 3.725 19.412 11.178 26.866 7.458 7.454 16.418 11.181 26.873 11.181 2.072 0 3.988-.155 5.748-.463 1.035-.208 1.757 0 2.17.621.313.413.208.983-.307 1.71-1.347 1.863-4.197 2.794-8.545 2.794-1.655 0-3.775-.413-6.365-1.242-2.587-.829-4.607-1.244-6.057-1.244-6.11 0-10.407 2.798-12.892 8.39a13.044 13.044 0 0 0-1.399 5.901c0 6.109 2.747 10.406 8.235 12.89 5.487 2.588 11.646 3.882 18.478 3.882 11.806 0 21.175-3.469 28.11-10.407 14.05-17.214 10.566-34.574 10.566-56.221.003-8.599.17-17.433.307-26.247.067-4.347-1.55-8.024-4.658-11.027-3.003-3.106-6.676-4.658-11.026-4.658s-8.078 1.552-11.186 4.658c-3.105 3-4.658 6.677-4.658 11.027v21.588c0 1.758-.622 3.311-1.865 4.658-1.24 1.243-2.791 1.864-4.656 1.864-1.76 0-3.313-.621-4.658-1.864-1.243-1.347-1.865-2.9-1.865-4.658V43.64c0-4.348-1.554-8.024-4.659-11.027-3.107-3.106-6.838-4.658-11.185-4.658z"/></svg> \ No newline at end of file diff --git a/packages/client/package.json b/packages/client/package.json index 4858ad1f0a..a843d63edc 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -5,7 +5,7 @@ "watch": "pnpm vite build --watch --mode development", "build": "pnpm vite build", "lint": "pnpm rome check \"src/**/*.{ts,vue}\"", - "format": "pnpm prettier --write '**/*.{scss,vue}'" + "format": "pnpm rome format * --write && pnpm prettier --write '**/*.{scss,vue}'" }, "devDependencies": { "@discordapp/twemoji": "14.1.2", diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts index 9593be829a..1c68b87c95 100644 --- a/packages/client/src/init.ts +++ b/packages/client/src/init.ts @@ -12,7 +12,7 @@ import "@phosphor-icons/web/fill"; //#region account indexedDB migration import { set } from "@/scripts/idb-proxy"; -const accounts = localStorage.getItem("accounts") +const accounts = localStorage.getItem("accounts"); if (accounts) { set("accounts", JSON.parse(accounts)); localStorage.removeItem("accounts"); diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue index ddca361cdc..f108572f99 100644 --- a/packages/client/src/pages/settings/2fa.vue +++ b/packages/client/src/pages/settings/2fa.vue @@ -79,7 +79,9 @@ :key="key.id" > <h3>{{ key.name }}</h3> - <p>{{ `${i18n.ts.lastUsedDate}: ${key.lastUsed}` }} </p> + <p> + {{ `${i18n.ts.lastUsedDate}: ${key.lastUsed}` }} + </p> <div class="_buttons _flexList"> <MkButton @click="renameKey(key)" ><i diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 6620635882..894c6461e6 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -52,10 +52,7 @@ export function addSkinTone(emoji: string, skinTone?: number) { } return ( emoji.replace( - new RegExp( - `(${skinToneModifiers.slice(1).join("|")})`, - "gi", - ), + new RegExp(`(${skinToneModifiers.slice(1).join("|")})`, "gi"), "", ) + (skinToneModifiers[chosenSkinTone - 1] || "") ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0dbaf840fb..6b92dbe85b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -783,7 +783,7 @@ importers: version: 2.30.0 emojilib: specifier: github:thatonecalculator/emojilib - version: github.com/thatonecalculator/emojilib/7036d98e86bcf88826f4559323aebebb1ffb0f61 + version: github.com/thatonecalculator/emojilib/542fcc1a25003afad78f3248ceee8ac6980ddeb8 escape-regexp: specifier: 0.0.1 version: 0.0.1 @@ -952,6 +952,10 @@ importers: packages: + /@aashutoshrathi/word-wrap@1.2.5: + resolution: {integrity: sha512-plhoNEfSVdHMKXQyAxvH0Zyv3/4NL8r6pwgMQdmHR2vBUXn2t74PN2pBRppqKUa6RMT0yldyvOHG5Dbjwy2mBQ==} + engines: {node: '>=0.10.0'} + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -1009,7 +1013,7 @@ packages: '@babel/compat-data': 7.22.5 '@babel/core': 7.22.5 '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.8 + browserslist: 4.21.9 lru-cache: 5.1.1 semver: 6.3.0 @@ -1421,92 +1425,92 @@ packages: dev: true optional: true - /@cropper/element-canvas@2.0.0-beta.2: - resolution: {integrity: sha512-LZcnMwv7M3ZxUKX9YrYGxqbf8YsYfeIUFREaB/IkKsm7E7ASaDrrjdc996QYMjdjUNcWdJjxhsoucPNEvl/DXA==} + /@cropper/element-canvas@2.0.0-beta.3: + resolution: {integrity: sha512-G4KqpZHAqb2PNY63lt7MxSIXQhYrQUWImDmsQYrXSTVYC5yrMLlk5bT9oEaSTjQZnV4x5EaujFM+gx6lWh/5sg==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-crosshair@2.0.0-beta.2: - resolution: {integrity: sha512-kBxZ2zZ7uR7XlQcnUbudq7562XwtTOqbGNYg5VWem/ukcAAKwYmPlapNlv7n228DSUGEz5FxKW8GSwLucJlQ0Q==} + /@cropper/element-crosshair@2.0.0-beta.3: + resolution: {integrity: sha512-SfrzZjO+x7ND/CgAclfwDQ9T/nTlZTKsLtM+dDXfjJQjuqreMaWaLD23isB1kh8H7iqjz1g+VE2ZsdiLB932ww==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-grid@2.0.0-beta.2: - resolution: {integrity: sha512-rWMOjlj+eq9L2oxAthNYdGxbV3sYyV+tra6VAuooZl+RbdQZ9XCnG0Pitb/RfgPZb860ia0q8biE5zEq4Uc8fA==} + /@cropper/element-grid@2.0.0-beta.3: + resolution: {integrity: sha512-/U1/sNcJ9TKcUD7N+yHJqxRfZcW15XHz63LYMLaWQ7Cnnq2uYopopJUqtTiAdIoCh6mwoIWdYvLZ1Vhr6XKJBg==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-handle@2.0.0-beta.2: - resolution: {integrity: sha512-IAFyqldnB57ZGzvf3VuE7Y9UAaq9IMmun15v17cAWX1q4ZCVqdFrugAWpRF+V5WgHBL2doxHUOQlfy7LznzRmg==} + /@cropper/element-handle@2.0.0-beta.3: + resolution: {integrity: sha512-bjxZfX0rqj4RsTBGxJ1WcxDya1/25dKe9j4+YRZFyASQUOPuUrqVOpWKQcGaQ0PeN+wfwLo3422vjaGSXNA+Pg==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-image@2.0.0-beta.2: - resolution: {integrity: sha512-FgYb+GfcxdewH6VKgw6Ltws8fw3TSP8d0HMH/WZubBC2w/NNAvp92EonwgjDoTLEFFJKbj5P2aKTFY0aO70R0Q==} + /@cropper/element-image@2.0.0-beta.3: + resolution: {integrity: sha512-1VjqaJG+IxPDkvEUvnKAfR12zK8fx+C6+ZsC5T4986KLtpltmqccaYiupgGXX8CVHrVyaW5ncBvOXSTGowiC7Q==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-selection@2.0.0-beta.2: - resolution: {integrity: sha512-O/fxpJe/WB5H+mELSVfp4tOAAa7yMVa+wn35DCRxaDPb/1Um55E7OT1G3puAL9Elm7NFA/CCMYuHohl9emE25A==} + /@cropper/element-selection@2.0.0-beta.3: + resolution: {integrity: sha512-FjcNwUaV5/KzQROoaoNZzOpeRe92PCd8PPTgfl4/b2rGgpYvGcjwpjei5HRsF+uaDJwR2f1MOK8L+3ZkAUw18Q==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/element-image': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-shade@2.0.0-beta.2: - resolution: {integrity: sha512-aY5RP2ygteq51ZDU3+rAj+f+0hSgEf+vRAdJ1YO2bJ1n25TpOaz2klO5COdHxn3unLVjYK97khIZGs7ClbV0rQ==} + /@cropper/element-shade@2.0.0-beta.3: + resolution: {integrity: sha512-WCmGYbmewIF49GUeJyXCXZUBwmLsu7B+G22o5FObhtxoY8pF7mp1SclIZdJU5KfvGFFOzXKHJg4yx1wO9IAfvQ==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/element-selection': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-viewer@2.0.0-beta.2: - resolution: {integrity: sha512-/2BhLFr2Ti5LnRvcIlLlR3NDSF3x9w9BvYukFbnCxoTLIbGvwM02YQV2Qx+al8C0mBoW0ab6uF5ykl6W8i9WkQ==} + /@cropper/element-viewer@2.0.0-beta.3: + resolution: {integrity: sha512-A2yh8ULbxuykJHVvcG3eI81VX2ug/IklDuOAzCP4yRMGSvGb9eK0BQDkOButoViwM2FtleCf2blXPuXjzD1OMA==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/element-image': 2.0.0-beta.2 - '@cropper/element-selection': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element@2.0.0-beta.2: - resolution: {integrity: sha512-i3wfelk5d4MLNgAcQpRa/jOaxWAcDLRAUkiHmU6CMl7xvOAD/4TFQGB3qSpzgx3NK4hUDLn80/gp7gM2nvrBWg==} + /@cropper/element@2.0.0-beta.3: + resolution: {integrity: sha512-Ta1QPx6uqO4WtlvWbQanKSdTi0NptfnSk4h93TSk/GTKYTUI6Qa1g5C+2ibdsomcD/bVTTY6cbuGMFfM8E8zQQ==} dependencies: - '@cropper/utils': 2.0.0-beta.2 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/elements@2.0.0-beta.2: - resolution: {integrity: sha512-l08CmeOvLJ8XLJ95OQ+kSHSbf7+pHcsu3pvQYjustbrUj0H1vzBiWT8VygPjkCUMoVIfsBpYmBNpWVGJvjoy2Q==} + /@cropper/elements@2.0.0-beta.3: + resolution: {integrity: sha512-oHRnhrFN/S2vadX1/ogaoZQuPUwUxYRoZ+BZjPUxr0kdX4SwumU0pMD2hxVMbveTl0zxFc0S3HdqXx8kcHGPtg==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/element-crosshair': 2.0.0-beta.2 - '@cropper/element-grid': 2.0.0-beta.2 - '@cropper/element-handle': 2.0.0-beta.2 - '@cropper/element-image': 2.0.0-beta.2 - '@cropper/element-selection': 2.0.0-beta.2 - '@cropper/element-shade': 2.0.0-beta.2 - '@cropper/element-viewer': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-crosshair': 2.0.0-beta.3 + '@cropper/element-grid': 2.0.0-beta.3 + '@cropper/element-handle': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/element-shade': 2.0.0-beta.3 + '@cropper/element-viewer': 2.0.0-beta.3 dev: true - /@cropper/utils@2.0.0-beta.2: - resolution: {integrity: sha512-RJu5IWzH6vcygwLsx9KEqzwjnEqApPkSFViMzxCRbe0IuAXt2ZlSUmYKgLFZY+YJIdaZ+/P7PwiUcZ7GYH3Msw==} + /@cropper/utils@2.0.0-beta.3: + resolution: {integrity: sha512-3oBwFN2DZiqfKzkB+fpAa+LV2izRUpbH0MS427p8rgMb7EEOP/UFaKeq/P/Ovs3dhLbiA48aLiV6GmX9piEmlw==} dev: true /@cspotcode/source-map-consumer@0.8.0: @@ -2064,7 +2068,7 @@ packages: jest-regex-util: 27.5.1 jest-util: 27.5.1 micromatch: 4.0.5 - pirates: 4.0.5 + pirates: 4.0.6 slash: 3.0.0 source-map: 0.6.1 write-file-atomic: 3.0.3 @@ -2264,7 +2268,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: bin-check: 4.1.0 - bin-version-check: 5.0.0 + bin-version-check: 5.1.0 content-disposition: 0.5.4 ext-name: 5.0.0 file-type: 17.1.6 @@ -2457,7 +2461,7 @@ packages: engines: {node: '>=12.0.0'} dependencies: '@redocly/ajv': 8.11.0 - '@types/node': 14.18.51 + '@types/node': 14.18.52 colorette: 1.4.0 js-levenshtein: 1.1.6 js-yaml: 4.1.0 @@ -2665,7 +2669,6 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [android] - requiresBuild: true dependencies: '@swc/wasm': 1.2.130 @@ -2772,7 +2775,6 @@ packages: /@swc/wasm@1.2.130: resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==} - requiresBuild: true /@syuilo/aiscript@0.11.1: resolution: {integrity: sha512-chwOIA3yLUKvOB0G611hjLArKTeOWNmTm3lHERSaDW1d+dS6do56naX6Lkwy2UpnwWC0qzeNSgg35elk6t2gZg==} @@ -3038,7 +3040,7 @@ packages: /@types/adm-zip@0.5.0: resolution: {integrity: sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/argparse@1.0.38: @@ -3186,12 +3188,12 @@ packages: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 + '@types/serve-static': 1.15.2 /@types/fluent-ffmpeg@2.1.20: resolution: {integrity: sha512-B+OvhCdJ3LgEq2PhvWNOiB/EfwnXLElfMCgc4Z1K5zXgSfo9I6uGKwR/lqmNPFQuebNnes7re3gqkV77SyypLg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/formidable@2.0.6: @@ -3299,7 +3301,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -3442,7 +3444,7 @@ packages: '@types/http-errors': 2.0.1 '@types/keygrip': 1.0.2 '@types/koa-compose': 3.2.5 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/koa__cors@3.3.0: resolution: {integrity: sha512-FUN8YxcBakIs+walVe3+HcNP+Bxd0SB8BJHBWkglZ5C1XQWljlKcEFDG/dPiCIqwVCUbc5X0nYDlH62uEhdHMA==} @@ -3508,8 +3510,8 @@ packages: node-fetch: 3.3.1 dev: true - /@types/node@14.18.51: - resolution: {integrity: sha512-P9bsdGFPpVtofEKlhWMVS2qqx1A/rt9QBfihWlklfHHpUpjtYse5AzFz6j4DWrARLYh6gRnw9+5+DJcrq3KvBA==} + /@types/node@14.18.52: + resolution: {integrity: sha512-DGhiXKOHSFVVm+PJD+9Y0ObxXLeG6qwc0HoOn+ooQKeNNu+T2mEJCM5UBDUREKAggl9MHYjb5E71PAmx6MbzIg==} /@types/node@18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} @@ -3520,7 +3522,7 @@ packages: /@types/nodemailer@6.4.8: resolution: {integrity: sha512-oVsJSCkqViCn8/pEu2hfjwVO+Gb3e+eTWjg3PcjeFKRItfKpKwHphQqbYmPQrlMk+op7pNNWPbsJIEthpFN/OQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/normalize-package-data@2.4.1: @@ -3530,7 +3532,7 @@ packages: /@types/oauth@0.9.1: resolution: {integrity: sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/offscreencanvas@2019.3.0: resolution: {integrity: sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==} @@ -3552,7 +3554,7 @@ packages: resolution: {integrity: sha512-R5H3vw62gHNHrn+JGZbKejb+Z2D/6E5UNVlhCzIaBBLroMQMOFqy5Pap2gM+ZZHdqBtVU0/cx/M6to+mOJcoew==} dependencies: '@types/needle': 3.2.0 - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/pug@2.0.6: @@ -3566,7 +3568,7 @@ packages: /@types/qrcode@1.5.0: resolution: {integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/qs@6.9.7: @@ -3629,16 +3631,17 @@ packages: '@types/mime': 1.3.2 '@types/node': 20.3.1 - /@types/serve-static@1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + /@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/sharp@0.31.1: resolution: {integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/sinonjs__fake-timers@8.1.1: @@ -3713,7 +3716,7 @@ packages: /@types/web-push@3.3.2: resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/webgl-ext@0.0.30: @@ -3727,13 +3730,13 @@ packages: /@types/websocket@1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -4045,24 +4048,24 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 dev: false - /acorn-import-assertions@1.9.0(acorn@8.8.2): + /acorn-import-assertions@1.9.0(acorn@8.9.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.2 + acorn: 8.9.0 dev: true - /acorn-jsx@5.3.2(acorn@8.8.2): + /acorn-jsx@5.3.2(acorn@8.9.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.9.0 /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} @@ -4078,8 +4081,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn@8.9.0: + resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -4494,7 +4497,7 @@ packages: /async-mutex@0.4.0: resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} dependencies: - tslib: 2.5.3 + tslib: 2.6.0 dev: false /async-settle@1.0.0: @@ -4528,14 +4531,14 @@ packages: /autolinker@4.0.0: resolution: {integrity: sha512-fl5Kh6BmEEZx+IWBfEirnRUU5+cOiV0OK7PEt0RBKvJMJ8GaRseIOeDU3FKf4j3CE5HVefcjHmhYPOcaVt0bZw==} dependencies: - tslib: 2.5.3 + tslib: 2.6.0 dev: false /autoprefixer@6.7.7: resolution: {integrity: sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ==} dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001502 + caniuse-db: 1.0.30001509 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -4562,7 +4565,7 @@ packages: '@ava/typescript': optional: true dependencies: - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 ansi-styles: 6.2.1 arrgv: 1.0.2 @@ -4584,7 +4587,7 @@ packages: del: 7.0.0 emittery: 1.0.1 figures: 5.0.0 - globby: 13.1.4 + globby: 13.2.0 ignore-by-default: 2.1.0 indent-string: 5.0.0 is-error: 2.2.2 @@ -4830,13 +4833,13 @@ packages: executable: 4.1.1 dev: true - /bin-version-check@5.0.0: - resolution: {integrity: sha512-Q3FMQnS5eZmrBGqmDXLs4dbAn/f+52voP6ykJYmweSA60t6DyH4UTSwZhtbK5UH+LBoWvDljILUQMLRUtsynsA==} + /bin-version-check@5.1.0: + resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} engines: {node: '>=12'} dependencies: bin-version: 6.0.0 - semver: 7.5.1 - semver-truncate: 2.0.0 + semver: 7.5.3 + semver-truncate: 3.0.0 dev: true /bin-version@6.0.0: @@ -4948,19 +4951,19 @@ packages: deprecated: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools. hasBin: true dependencies: - caniuse-db: 1.0.30001502 - electron-to-chromium: 1.4.430 + caniuse-db: 1.0.30001509 + electron-to-chromium: 1.4.442 dev: true - /browserslist@4.21.8: - resolution: {integrity: sha512-j+7xYe+v+q2Id9qbBeCI8WX5NmZSRe8es1+0xntD/+gaWXznP8tFEkv5IgSaHf5dS1YwVMbX/4W6m937mj+wQw==} + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001502 - electron-to-chromium: 1.4.430 + caniuse-lite: 1.0.30001509 + electron-to-chromium: 1.4.442 node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.8) + update-browserslist-db: 1.0.11(browserslist@4.21.9) /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -5058,7 +5061,7 @@ packages: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.2 - glob: 10.2.7 + glob: 10.3.1 lru-cache: 7.18.3 minipass: 5.0.0 minipass-collect: 1.0.2 @@ -5102,8 +5105,8 @@ packages: engines: {node: '>=14.16'} dev: false - /cacheable-request@10.2.10: - resolution: {integrity: sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==} + /cacheable-request@10.2.12: + resolution: {integrity: sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==} engines: {node: '>=14.16'} dependencies: '@types/http-cache-semantics': 4.0.1 @@ -5174,17 +5177,17 @@ packages: resolution: {integrity: sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q==} dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001502 + caniuse-db: 1.0.30001509 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-db@1.0.30001502: - resolution: {integrity: sha512-nNj61ClInBeMsDqHo20wgMJ40Jhyg9l6W0Z9tipmsc99g43TGvlJky4LP3TlrXbLrVCzRWVS4Gox606M6Hw9Ow==} + /caniuse-db@1.0.30001509: + resolution: {integrity: sha512-Gf3pFp97loixG5w83NVb09DMI+WzkVXLn4H2abxv7DXxHUyKYbZc5qpEqAQy/mDFO6bAnNQh4hZ8lLeGlPTZQg==} dev: true - /caniuse-lite@1.0.30001502: - resolution: {integrity: sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg==} + /caniuse-lite@1.0.30001509: + resolution: {integrity: sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==} /canonicalize@1.0.8: resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==} @@ -5700,7 +5703,6 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - requiresBuild: true dev: true /common-path-prefix@3.0.0: @@ -6030,8 +6032,8 @@ packages: /cropperjs@2.0.0-beta.2: resolution: {integrity: sha512-jDRSODDGKmi9vp3p/+WXkxMqV/AE+GpSld1U3cHZDRdLy9UykRzurSe8k1dR0TExn45ygCMrv31qkg+K3EeXXw==} dependencies: - '@cropper/elements': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/elements': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true /cross-env@7.0.3: @@ -6178,7 +6180,7 @@ packages: dependencies: '@cypress/request': 2.88.11 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 14.18.51 + '@types/node': 14.18.52 '@types/sinonjs__fake-timers': 8.1.1 '@types/sizzle': 2.3.3 arch: 2.2.0 @@ -6439,7 +6441,7 @@ packages: resolution: {integrity: sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==} engines: {node: '>=14.16'} dependencies: - globby: 13.1.4 + globby: 13.2.0 graceful-fs: 4.2.11 is-glob: 4.0.3 is-path-cwd: 3.0.0 @@ -6608,8 +6610,8 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 - /dotenv@16.1.4: - resolution: {integrity: sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==} + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} dev: false @@ -6668,8 +6670,8 @@ packages: dependencies: jake: 10.8.7 - /electron-to-chromium@1.4.430: - resolution: {integrity: sha512-FytjTbGwz///F+ToZ5XSeXbbSaXalsVRXsz2mHityI5gfxft7ieW3HqFLkU5V1aIrY42aflICqbmFoDxW10etg==} + /electron-to-chromium@1.4.442: + resolution: {integrity: sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q==} /emittery@0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} @@ -6746,8 +6748,8 @@ packages: engines: {node: '>=6'} dev: false - /envinfo@7.8.1: - resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + /envinfo@7.10.0: + resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} engines: {node: '>=4'} hasBin: true dev: true @@ -6962,7 +6964,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 @@ -6973,8 +6975,8 @@ packages: resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) eslint-visitor-keys: 3.4.1 /esprima@2.7.3: @@ -7528,7 +7530,7 @@ packages: /focus-trap@7.4.3: resolution: {integrity: sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==} dependencies: - tabbable: 6.1.2 + tabbable: 6.2.0 dev: true /follow-redirects@1.15.2(debug@4.3.4): @@ -7607,8 +7609,8 @@ packages: dependencies: fetch-blob: 3.2.0 - /formidable@2.1.1: - resolution: {integrity: sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==} + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 @@ -7910,16 +7912,16 @@ packages: - supports-color dev: true - /glob@10.2.7: - resolution: {integrity: sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==} + /glob@10.3.1: + resolution: {integrity: sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.2.1 - minimatch: 9.0.1 + minimatch: 9.0.2 minipass: 5.0.0 - path-scurry: 1.9.2 + path-scurry: 1.10.0 dev: false /glob@7.2.0: @@ -8002,8 +8004,8 @@ packages: slash: 3.0.0 dev: true - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + /globby@13.2.0: + resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 @@ -8054,7 +8056,7 @@ packages: '@sindresorhus/is': 5.4.1 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.10 + cacheable-request: 10.2.12 decompress-response: 6.0.0 form-data-encoder: 2.1.4 get-stream: 6.0.1 @@ -8132,7 +8134,7 @@ packages: engines: {node: '>=10'} dependencies: plugin-error: 1.0.1 - terser: 5.18.0 + terser: 5.18.2 through2: 4.0.2 vinyl-sourcemaps-apply: 0.2.1 dev: true @@ -9740,7 +9742,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 + acorn: 8.9.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -9782,7 +9784,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 + acorn: 8.9.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -9849,7 +9851,7 @@ packages: dependencies: json5: 2.2.3 loader-utils: 2.0.4 - schema-utils: 3.2.0 + schema-utils: 3.3.0 webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true @@ -9997,7 +9999,7 @@ packages: '@types/formidable': 2.0.6 '@types/koa': 2.13.5 co-body: 6.1.0 - formidable: 2.1.1 + formidable: 2.1.2 zod: 3.21.4 dev: false @@ -10486,6 +10488,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /lru-cache@10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -10508,11 +10515,6 @@ packages: engines: {node: '>=12'} dev: false - /lru-cache@9.1.2: - resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} - engines: {node: 14 || >=16.14} - dev: false - /luxon@3.3.0: resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} engines: {node: '>=12'} @@ -10788,8 +10790,8 @@ packages: dependencies: brace-expansion: 2.0.1 - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + /minimatch@9.0.2: + resolution: {integrity: sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -11495,16 +11497,16 @@ packages: type-check: 0.3.2 word-wrap: 1.2.3 - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.5 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 /ordered-read-streams@1.0.1: resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} @@ -11793,11 +11795,11 @@ packages: path-root-regex: 0.1.2 dev: true - /path-scurry@1.9.2: - resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==} + /path-scurry@1.10.0: + resolution: {integrity: sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 9.1.2 + lru-cache: 10.0.0 minipass: 5.0.0 dev: false @@ -11836,14 +11838,14 @@ packages: /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - /pg-cloudflare@1.1.0: - resolution: {integrity: sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==} + /pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} requiresBuild: true dev: false optional: true - /pg-connection-string@2.6.0: - resolution: {integrity: sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==} + /pg-connection-string@2.6.1: + resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} dev: false /pg-int8@1.0.1: @@ -11851,8 +11853,8 @@ packages: engines: {node: '>=4.0.0'} dev: false - /pg-pool@3.6.0(pg@8.11.0): - resolution: {integrity: sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==} + /pg-pool@3.6.1(pg@8.11.0): + resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} peerDependencies: pg: '>=8.0' dependencies: @@ -11885,13 +11887,13 @@ packages: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 - pg-connection-string: 2.6.0 - pg-pool: 3.6.0(pg@8.11.0) + pg-connection-string: 2.6.1 + pg-pool: 3.6.1(pg@8.11.0) pg-protocol: 1.6.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.1.0 + pg-cloudflare: 1.1.1 dev: false /pgpass@1.0.5: @@ -11933,8 +11935,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} dev: true @@ -13151,7 +13153,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.3 + tslib: 2.6.0 dev: true /s-age@1.1.2: @@ -13215,8 +13217,8 @@ packages: xmlchars: 2.2.0 dev: false - /schema-utils@3.2.0: - resolution: {integrity: sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==} + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.12 @@ -13246,11 +13248,11 @@ packages: engines: {node: '>=12'} dev: true - /semver-truncate@2.0.0: - resolution: {integrity: sha512-Rh266MLDYNeML5h90ttdMwfXe1+Nc4LAWd9X1KdJe8pPHP4kFmvLZALtsMNHNdvTyQygbEC0D59sIz47DIaq8w==} - engines: {node: '>=8'} + /semver-truncate@3.0.0: + resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} + engines: {node: '>=12'} dependencies: - semver: 6.3.0 + semver: 7.5.1 dev: true /semver@5.7.1: @@ -13276,6 +13278,14 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} @@ -14004,8 +14014,8 @@ packages: resolution: {integrity: sha512-g9rPT3V1Q4WjWFZ/t5BdGC1mT/FpYnsLdBl+M5e6MlRkuE1RSR+R43wcY/3mKI59B9KEr+vxdWCuWNMD3oNHKA==} dev: true - /tabbable@6.1.2: - resolution: {integrity: sha512-qCN98uP7i9z0fIS4amQ5zbGBOq+OSigYeGvPy7NDk8Y9yncqDZ9pRPgfsc2PJIVM9RrJj7GIfuRgmjoUU9zTHQ==} + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: true /tapable@2.2.1: @@ -14091,19 +14101,19 @@ packages: '@jridgewell/trace-mapping': 0.3.18 '@swc/core': 1.3.62 jest-worker: 27.5.1 - schema-utils: 3.2.0 + schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.18.0 + terser: 5.18.2 webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true - /terser@5.18.0: - resolution: {integrity: sha512-pdL757Ig5a0I+owA42l6tIuEycRuM7FPY4n62h44mRLRfnOxJkkOHd6i89dOpwZlpF6JXBwaAHF6yWzFrt+QyA==} + /terser@5.18.2: + resolution: {integrity: sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 + acorn: 8.9.0 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -14418,7 +14428,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.3.1 - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -14449,7 +14459,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.11.18 - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -14494,8 +14504,8 @@ packages: read-pkg-up: 7.0.1 dev: true - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + /tslib@2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} @@ -14645,7 +14655,7 @@ packages: cli-highlight: 2.1.11 date-fns: 2.30.0 debug: 4.3.4(supports-color@8.1.1) - dotenv: 16.1.4 + dotenv: 16.3.1 glob: 7.2.3 ioredis: 5.3.2 js-yaml: 4.1.0 @@ -14654,7 +14664,7 @@ packages: reflect-metadata: 0.1.13 sha.js: 2.4.11 ts-node: 10.9.1(@swc/core@1.3.62)(@types/node@18.11.18)(typescript@5.1.3) - tslib: 2.5.3 + tslib: 2.6.0 uuid: 8.3.2 xml2js: 0.4.23 yargs: 17.7.2 @@ -14793,13 +14803,13 @@ packages: engines: {node: '>=8'} dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.8): + /update-browserslist-db@1.0.11(browserslist@4.21.9): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.8 + browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 @@ -15215,7 +15225,7 @@ packages: colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 - envinfo: 7.8.1 + envinfo: 7.10.0 fastest-levenshtein: 1.0.16 import-local: 3.1.0 interpret: 3.1.1 @@ -15252,9 +15262,9 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.8.2 - acorn-import-assertions: 1.9.0(acorn@8.8.2) - browserslist: 4.21.8 + acorn: 8.9.0 + acorn-import-assertions: 1.9.0(acorn@8.9.0) + browserslist: 4.21.9 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.3.0 @@ -15266,7 +15276,7 @@ packages: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.2.0 + schema-utils: 3.3.0 tapable: 2.2.1 terser-webpack-plugin: 5.3.9(@swc/core@1.3.62)(webpack@5.85.1) watchpack: 2.4.0 @@ -15757,8 +15767,8 @@ packages: url-polyfill: 1.1.12 dev: true - github.com/thatonecalculator/emojilib/7036d98e86bcf88826f4559323aebebb1ffb0f61: - resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/7036d98e86bcf88826f4559323aebebb1ffb0f61} + github.com/thatonecalculator/emojilib/542fcc1a25003afad78f3248ceee8ac6980ddeb8: + resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/542fcc1a25003afad78f3248ceee8ac6980ddeb8} name: emojilib version: 3.0.10 dev: true From 2d4eda2c1df56b205d3d674a8b81903e7894bbfb Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Wed, 28 Jun 2023 02:44:16 -0400 Subject: [PATCH 220/309] fix: disable redis tls if undefined in config --- packages/backend/src/config/types.ts | 4 ++-- packages/backend/src/db/postgre.ts | 4 ++-- packages/backend/src/db/redis.ts | 2 +- packages/backend/src/queue/initialize.ts | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index cbe27543b3..84808413c0 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -20,11 +20,11 @@ export type Source = { host: string; port: number; family?: number; - pass: string; + pass?: string; db?: number; prefix?: string; user?: string; - tls?: { [x: string]: string }; + tls?: { [y: string]: string }; }; elasticsearch: { host: string; diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 1ba226a8e1..89b7a7bf6e 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -207,11 +207,11 @@ export const db = new DataSource({ host: config.redis.host, port: config.redis.port, family: config.redis.family == null ? 0 : config.redis.family, - user: config.redis.user ?? "default", + username: config.redis.user ?? "default", password: config.redis.pass, keyPrefix: `${config.redis.prefix}:query:`, db: config.redis.db || 0, - tls: config.redis.tls || {}, + tls: config.redis.tls, }, } : false, diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index 24563661e9..a1f3279f35 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -10,7 +10,7 @@ export function createConnection() { username: config.redis.user ?? "default", keyPrefix: `${config.redis.prefix}:`, db: config.redis.db || 0, - tls: config.redis.tls || {}, + tls: config.redis.tls, }); } diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts index 8d728df5be..16e623d137 100644 --- a/packages/backend/src/queue/initialize.ts +++ b/packages/backend/src/queue/initialize.ts @@ -7,10 +7,10 @@ export function initialize<T>(name: string, limitPerSec = -1) { port: config.redis.port, host: config.redis.host, family: config.redis.family == null ? 0 : config.redis.family, - user: config.redis.user ?? "default", + username: config.redis.user ?? "default", password: config.redis.pass, db: config.redis.db || 0, - tls: config.redis.tls || {}, + tls: config.redis.tls, }, prefix: config.redis.prefix ? `${config.redis.prefix}:queue` : "queue", limiter: From 5343c14184a274379d835b5657bb9f7d8ee843ae Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Wed, 28 Jun 2023 23:04:40 -0700 Subject: [PATCH 221/309] fix: :bug: don't convert time since epoch for ratelimit https://calckey.social/notes/9gkasnzglmi07rpa --- packages/backend/src/server/api/limiter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/limiter.ts b/packages/backend/src/server/api/limiter.ts index a661ed0e95..367fb3d279 100644 --- a/packages/backend/src/server/api/limiter.ts +++ b/packages/backend/src/server/api/limiter.ts @@ -79,7 +79,7 @@ export const limiter = ( if (info.remaining === 0) { reject({ message: "RATE_LIMIT_EXCEEDED", - remainingTime: convertMilliseconds(info.resetMs), + remainingTime: convertMilliseconds(info.resetMs - Date.now()), }); } else { ok(); From 3e36531afd6fb9470075ad7dce073acab6f8853d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 29 Jun 2023 18:05:27 -0700 Subject: [PATCH 222/309] fix: :bug: fix tapping parent on mobile causing side effects --- packages/client/src/components/MkMenu.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkMenu.vue b/packages/client/src/components/MkMenu.vue index dea14ef053..aa3a3a3000 100644 --- a/packages/client/src/components/MkMenu.vue +++ b/packages/client/src/components/MkMenu.vue @@ -130,7 +130,7 @@ class="_button item parent" :class="{ childShowing: childShowingItem === item }" @mouseenter="showChildren(item, $event)" - @click="showChildren(item, $event)" + @click.stop="showChildren(item, $event)" > <i v-if="item.icon" From 7df442b48e0e1176143b3ea3d42a42c4c027cb2c Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 29 Jun 2023 19:12:42 -0700 Subject: [PATCH 223/309] fix: :bug: standard input for 2FA token Closes #10361, removes client dependency --- locales/en-US.yml | 1 + locales/ja-JP.yml | 1 + packages/client/package.json | 1 - packages/client/src/components/MkSignin.vue | 20 ++++++----- packages/client/src/style.scss | 40 ++++++++++----------- pnpm-lock.yaml | 12 ------- 6 files changed, 33 insertions(+), 42 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index c1854ba066..cc327c5aa5 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1513,6 +1513,7 @@ _2fa: renewTOTPConfirm: "This will cause verification codes from your previous app to stop working" renewTOTPOk: "Reconfigure" renewTOTPCancel: "Cancel" + token: "2FA Token" _permissions: "read:account": "View your account information" "write:account": "Edit your account information" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 617930db17..21f616808b 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1336,6 +1336,7 @@ _2fa: renewTOTPConfirm: "今までの認証アプリの確認コードは使用できなくなります" renewTOTPOk: "再設定する" renewTOTPCancel: "やめておく" + token: "多要素認証トークン" _permissions: "read:account": "アカウントの情報を見る" "write:account": "アカウントの情報を変更する" diff --git a/packages/client/package.json b/packages/client/package.json index a843d63edc..2ec569381d 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -89,7 +89,6 @@ "vue-isyourpasswordsafe": "^2.0.0", "vue-plyr": "^7.0.0", "vue-prism-editor": "2.0.0-alpha.2", - "vue3-otp-input": "^0.4.1", "vuedraggable": "4.1.0" } } diff --git a/packages/client/src/components/MkSignin.vue b/packages/client/src/components/MkSignin.vue index 27de73c49d..cebfda8d3a 100644 --- a/packages/client/src/components/MkSignin.vue +++ b/packages/client/src/components/MkSignin.vue @@ -99,17 +99,19 @@ ><i class="ph-lock ph-bold ph-lg"></i ></template> </MkInput> - <vue3-otp-input - input-classes="_otp_input" - inputType="letter-numeric" - separator="" - :num-inputs="6" + <MkInput v-model="token" - :should-auto-focus="true" - @on-change="updateToken" - @on-complete="onSubmit" + type="text" + autocomplete="one-time-code" + pattern="^[0-9]{6}$" + :spellcheck="false" required - /> + > + <template #label>{{ i18n.ts._2fa.token }}</template> + <template #prefix + ><i class="ph-poker-chip ph-bold ph-lg"></i + ></template> + </MkInput> <MkButton type="submit" :disabled="signing" diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 8ce3d56d21..41dd19cf7a 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -865,26 +865,26 @@ hr { } } -._otp_input { - width: 30px; - height: 30px; - padding: 5px; - margin: 1rem 7px auto; - font-size: 20px; - border-radius: 4px; - border: 2px solid var(--accent); - background-color: var(--accentedBg); - color: var(--fg); - text-align: center; -} -._otp_input.error { - border-color: var(--error) !important; -} -._otp_input::-webkit-inner-spin-button, -._otp_input::-webkit-outer-spin-button { - -webkit-appearance: none; - margin: 0; -} +// ._otp_input { +// width: 30px; +// height: 30px; +// padding: 5px; +// margin: 1rem 7px auto; +// font-size: 20px; +// border-radius: 4px; +// border: 2px solid var(--accent); +// background-color: var(--accentedBg); +// color: var(--fg); +// text-align: center; +// } +// ._otp_input.error { +// border-color: var(--error) !important; +// } +// ._otp_input::-webkit-inner-spin-button, +// ._otp_input::-webkit-outer-spin-button { +// -webkit-appearance: none; +// margin: 0; +// } @keyframes reset { to { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b92dbe85b..760931858b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -916,9 +916,6 @@ importers: vue-prism-editor: specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2(vue@3.3.4) - vue3-otp-input: - specifier: ^0.4.1 - version: 0.4.1(vue@3.3.4) vuedraggable: specifier: 4.1.0 version: 4.1.0(vue@3.3.4) @@ -15076,15 +15073,6 @@ packages: vue: 3.3.4 dev: true - /vue3-otp-input@0.4.1(vue@3.3.4): - resolution: {integrity: sha512-wVl9i3DcWlO0C7fBI9V+RIP3crm/1tY72fuhvb3YM2JfbLoYofB96aPl5AgFhA0Cse5bQEMYtIvOeiqW3rfbAw==} - engines: {node: '>=16.0.0', npm: '>=8.0.0'} - peerDependencies: - vue: ^3.0.* - dependencies: - vue: 3.3.4 - dev: true - /vue@2.7.14: resolution: {integrity: sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==} dependencies: From 24cc6a925dc15059ca28a237eb77421e44309cf8 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 29 Jun 2023 19:53:46 -0700 Subject: [PATCH 224/309] feat: :sparkles: introduce local user select dialog Used for selecting group members and proxy account. Closes #7987, API change: users/search-by-username-and-host now takes `maxDaysSinceLastActive` parameter and doesn't have any active threshold anymore by default. --- .../users/search-by-username-and-host.ts | 17 +- .../components/MkUserSelectLocalDialog.vue | 223 ++++++++++++++++++ packages/client/src/os.ts | 19 ++ .../client/src/pages/admin/proxy-account.vue | 19 +- packages/client/src/pages/my-groups/group.vue | 4 +- 5 files changed, 273 insertions(+), 9 deletions(-) create mode 100644 packages/client/src/components/MkUserSelectLocalDialog.vue diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts index eeccf69386..f34083233f 100644 --- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts +++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts @@ -32,6 +32,12 @@ export const paramDef = { username: { type: "string", nullable: true }, host: { type: "string", nullable: true }, limit: { type: "integer", minimum: 1, maximum: 100, default: 10 }, + maxDaysSinceLastActive: { + type: "integer", + minimum: 1, + maximum: 1000, + default: 30, + }, detail: { type: "boolean", default: true }, }, anyOf: [{ required: ["username"] }, { required: ["host"] }], @@ -40,7 +46,9 @@ export const paramDef = { // TODO: avatar,bannerをJOINしたいけどエラーになる export default define(meta, paramDef, async (ps, me) => { - const activeThreshold = new Date(Date.now() - 1000 * 60 * 60 * 24 * 30); // 30日 + const activeThreshold = ps.maxDaysSinceLastActive + ? new Date(Date.now() - 1000 * 60 * 60 * 24 * ps.maxDaysSinceLastActive) + : null; if (ps.host) { const q = Users.createQueryBuilder("user") @@ -75,8 +83,10 @@ export default define(meta, paramDef, async (ps, me) => { .andWhere("user.isSuspended = FALSE") .andWhere("user.usernameLower LIKE :username", { username: `${sqlLikeEscape(ps.username.toLowerCase())}%`, - }) - .andWhere( + }); + + if (activeThreshold) { + query.andWhere( new Brackets((qb) => { qb.where("user.updatedAt IS NULL").orWhere( "user.updatedAt > :activeThreshold", @@ -84,6 +94,7 @@ export default define(meta, paramDef, async (ps, me) => { ); }), ); + } query.setParameters(followingQuery.getParameters()); diff --git a/packages/client/src/components/MkUserSelectLocalDialog.vue b/packages/client/src/components/MkUserSelectLocalDialog.vue new file mode 100644 index 0000000000..e74a63da27 --- /dev/null +++ b/packages/client/src/components/MkUserSelectLocalDialog.vue @@ -0,0 +1,223 @@ +<template> + <XModalWindow + ref="dialogEl" + :with-ok-button="true" + :ok-button-disabled="selected == null" + @click="cancel()" + @close="cancel()" + @ok="ok()" + @closed="$emit('closed')" + > + <template #header>{{ i18n.ts.selectUser }}</template> + <div class="tbhwbxdg"> + <div class="form"> + <FormSplit :min-width="170"> + <MkInput + v-model="username" + :autofocus="true" + @update:modelValue="search" + > + <template #label>{{ i18n.ts.username }}</template> + <template #prefix>@</template> + </MkInput> + </FormSplit> + </div> + <div + v-if="username != '' || host != ''" + class="result" + :class="{ hit: users.length > 0 }" + > + <div v-if="users.length > 0" class="users"> + <div + v-for="user in users" + :key="user.id" + class="user" + :class="{ + selected: selected && selected.id === user.id, + }" + @click="selected = user" + @dblclick="ok()" + > + <MkAvatar + :user="user" + class="avatar" + :show-indicator="true" + disableLink + /> + <div class="body"> + <MkUserName :user="user" class="name" /> + <MkAcct :user="user" class="acct" /> + </div> + </div> + </div> + <div v-else class="empty"> + <span>{{ i18n.ts.noUsers }}</span> + </div> + </div> + <div v-if="username == '' && host == ''" class="recent"> + <div class="users"> + <div + v-for="user in recentUsers" + :key="user.id" + class="user" + :class="{ + selected: selected && selected.id === user.id, + }" + @click="selected = user" + @dblclick="ok()" + > + <MkAvatar + :user="user" + class="avatar" + :show-indicator="true" + disableLink + /> + <div class="body"> + <MkUserName :user="user" class="name" /> + <MkAcct :user="user" class="acct" /> + </div> + </div> + </div> + </div> + </div> + </XModalWindow> +</template> + +<script lang="ts" setup> +import { nextTick, onMounted } from "vue"; +import * as misskey from "calckey-js"; +import MkInput from "@/components/form/input.vue"; +import FormSplit from "@/components/form/split.vue"; +import XModalWindow from "@/components/MkModalWindow.vue"; +import * as os from "@/os"; +import { defaultStore } from "@/store"; +import { i18n } from "@/i18n"; + +const emit = defineEmits<{ + (ev: "ok", selected: misskey.entities.UserDetailed): void; + (ev: "cancel"): void; + (ev: "closed"): void; +}>(); + +let username = $ref(""); +let host = $ref(""); +let users: misskey.entities.UserDetailed[] = $ref([]); +let recentUsers: misskey.entities.UserDetailed[] = $ref([]); +let selected: misskey.entities.UserDetailed | null = $ref(null); +let dialogEl = $ref(); + +const search = () => { + if (username === "" && host === "") { + users = []; + return; + } + os.api("users/search-by-username-and-host", { + username: username, + host: null, + limit: 10, + detail: false, + }).then((_users) => { + users = _users; + }); +}; + +const ok = () => { + if (selected == null) return; + emit("ok", selected); + dialogEl.close(); + + // 最近使ったユーザー更新 + let recents = defaultStore.state.recentlyUsedUsers; + recents = recents.filter((x) => x !== selected.id); + recents.unshift(selected.id); + defaultStore.set("recentlyUsedUsers", recents.splice(0, 16)); +}; + +const cancel = () => { + emit("cancel"); + dialogEl.close(); +}; + +onMounted(() => { + os.api("users/show", { + userIds: defaultStore.state.recentlyUsedUsers, + }).then((users) => { + recentUsers = users; + }); +}); +</script> + +<style lang="scss" scoped> +.tbhwbxdg { + > .form { + padding: 0 var(--root-margin); + } + + > .result, + > .recent { + display: flex; + flex-direction: column; + overflow: auto; + height: 100%; + + &.result.hit { + padding: 0; + } + + &.recent { + padding: 0; + } + + > .users { + flex: 1; + overflow: auto; + padding: 8px 0; + + > .user { + display: flex; + align-items: center; + padding: 8px var(--root-margin); + font-size: 14px; + + &:hover { + background: var(--X7); + } + + &.selected { + background: var(--accent); + color: #fff; + } + + > * { + pointer-events: none; + user-select: none; + } + + > .avatar { + width: 45px; + height: 45px; + } + + > .body { + padding: 0 8px; + min-width: 0; + + > .name { + display: block; + font-weight: bold; + } + + > .acct { + opacity: 0.5; + } + } + } + } + + > .empty { + opacity: 0.7; + text-align: center; + } + } +} +</style> diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts index 32bb8f76b1..0802d8e345 100644 --- a/packages/client/src/os.ts +++ b/packages/client/src/os.ts @@ -631,6 +631,25 @@ export async function selectUser() { }); } +export async function selectLocalUser() { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkUserSelectLocalDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + {}, + { + ok: (user) => { + resolve(user); + }, + }, + "closed", + ); + }); +} + export async function selectInstance(): Promise<Misskey.entities.Instance> { return new Promise((resolve, reject) => { popup( diff --git a/packages/client/src/pages/admin/proxy-account.vue b/packages/client/src/pages/admin/proxy-account.vue index 87b3c684e2..7d72b0ac0f 100644 --- a/packages/client/src/pages/admin/proxy-account.vue +++ b/packages/client/src/pages/admin/proxy-account.vue @@ -20,12 +20,15 @@ }}</template> </MkKeyValue> - <FormButton + <MkButton primary class="_formBlock" @click="chooseProxyAccount" - >{{ i18n.ts.selectAccount }}</FormButton + >{{ i18n.ts.selectAccount }}</MkButton > + <MkButton danger class="_formBlock" @click="del">{{ + i18n.ts.remove + }}</MkButton> </FormSuspense> </MkSpacer> </MkStickyContainer> @@ -34,7 +37,7 @@ <script lang="ts" setup> import {} from "vue"; import MkKeyValue from "@/components/MkKeyValue.vue"; -import FormButton from "@/components/MkButton.vue"; +import MkButton from "@/components/MkButton.vue"; import MkInfo from "@/components/MkInfo.vue"; import FormSuspense from "@/components/form/suspense.vue"; import * as os from "@/os"; @@ -54,7 +57,7 @@ async function init() { } function chooseProxyAccount() { - os.selectUser().then((user) => { + os.selectLocalUser().then((user) => { proxyAccount = user; proxyAccountId = user.id; save(); @@ -69,6 +72,14 @@ function save() { }); } +function del() { + os.apiWithDialog("admin/update-meta", { + proxyAccountId: null, + }).then(() => { + fetchInstance(); + }); +} + const headerActions = $computed(() => []); const headerTabs = $computed(() => []); diff --git a/packages/client/src/pages/my-groups/group.vue b/packages/client/src/pages/my-groups/group.vue index 192572db1e..e6c7db1fb0 100644 --- a/packages/client/src/pages/my-groups/group.vue +++ b/packages/client/src/pages/my-groups/group.vue @@ -77,7 +77,7 @@ async function fetch() { fetch(); function invite() { - os.selectUser().then((user) => { + os.selectLocalUser().then((user) => { os.apiWithDialog("users/groups/invite", { groupId: group.value.id, userId: user.id, @@ -110,7 +110,7 @@ async function renameGroup() { } function transfer() { - os.selectUser().then((user) => { + os.selectLocalUser().then((user) => { os.apiWithDialog("users/groups/transfer", { groupId: group.value.id, userId: user.id, From 914ebd0b296b365f563d0c11298aa762b845cfdb Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Thu, 29 Jun 2023 22:58:34 -0400 Subject: [PATCH 225/309] feat: reveal muted word on press & hold Refs: #10363 --- packages/client/src/components/MkNote.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 9de87704da..f5c2d06218 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -224,7 +224,7 @@ </div> </article> </div> - <button v-else class="muted _button" @click="muted.muted = false"> + <button v-else class="muted _button" @click="muted.muted = false" @contextmenu.stop.prevent> <I18n :src="softMuteReasonI18nSrc(muted.what)" tag="small"> <template #name> <MkA @@ -954,5 +954,8 @@ defineExpose({ ._blur_text { pointer-events: auto; } + &:active ._blur_text { + filter: blur(0px); + } } </style> From 34beab24b78f74427c8257289b1c37d44a372795 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 29 Jun 2023 21:12:55 -0700 Subject: [PATCH 226/309] fix --- packages/client/src/components/MkEmojiPickerDialog.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkEmojiPickerDialog.vue b/packages/client/src/components/MkEmojiPickerDialog.vue index 4cff9f2751..fec014e407 100644 --- a/packages/client/src/components/MkEmojiPickerDialog.vue +++ b/packages/client/src/components/MkEmojiPickerDialog.vue @@ -65,7 +65,7 @@ function chosen(emoji: any) { } function opening() { - picker.value?.reset(); + // picker.value?.reset(); picker.value?.focus(); } </script> From 05d869d0fc315ae62ee856bba22fbed921ef0564 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Thu, 29 Jun 2023 21:34:09 -0700 Subject: [PATCH 227/309] fix: :bug: addSkinTone strip logic --- packages/client/src/scripts/emojilist.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 894c6461e6..b042c26662 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -1,5 +1,6 @@ import data from "unicode-emoji-json/data-by-group.json"; import emojiComponents from "unicode-emoji-json/data-emoji-components.json"; +import individualData from "unicode-emoji-json/data-by-emoji.json"; import keywordSet from "emojilib"; import { defaultStore } from "@/store"; @@ -36,8 +37,6 @@ export const categoryMapping = { } as const; export function addSkinTone(emoji: string, skinTone?: number) { - const individualData = import("unicode-emoji-json/data-by-emoji.json"); - const chosenSkinTone = skinTone || defaultStore.state.reactionPickerSkinTone; const skinToneModifiers = [ "", @@ -47,15 +46,15 @@ export function addSkinTone(emoji: string, skinTone?: number) { emojiComponents.medium_dark_skin_tone, emojiComponents.dark_skin_tone, ]; - if (individualData[emoji]?.skin_tone_support === false) { + const strippedEmoji = emoji.replace( + new RegExp(`(${skinToneModifiers.slice(1).join("|")})`, "gi"), + "", + ); + if (individualData[strippedEmoji].skin_tone_support) { + return strippedEmoji + (skinToneModifiers[chosenSkinTone - 1] || ""); + } else { return emoji; } - return ( - emoji.replace( - new RegExp(`(${skinToneModifiers.slice(1).join("|")})`, "gi"), - "", - ) + (skinToneModifiers[chosenSkinTone - 1] || "") - ); } const unicodeFifteenEmojis = [ From 7a93c81a3f9a1407d1db885bfc48fedafa79affb Mon Sep 17 00:00:00 2001 From: cgsama <cgsama@noreply.codeberg.org> Date: Fri, 30 Jun 2023 06:26:22 +0000 Subject: [PATCH 228/309] proper expire remote user drivefile over limits at adding time --- packages/backend/src/services/drive/add-file.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/services/drive/add-file.ts b/packages/backend/src/services/drive/add-file.ts index b25375b947..b5ba221372 100644 --- a/packages/backend/src/services/drive/add-file.ts +++ b/packages/backend/src/services/drive/add-file.ts @@ -368,7 +368,7 @@ async function upload( ); } -async function deleteOldFile(user: IRemoteUser) { +async function expireOldFile(user: IRemoteUser, driveCapacity: number) { const q = DriveFiles.createQueryBuilder("file") .where("file.userId = :userId", { userId: user.id }) .andWhere("file.isLink = FALSE"); @@ -381,12 +381,17 @@ async function deleteOldFile(user: IRemoteUser) { q.andWhere("file.id != :bannerId", { bannerId: user.bannerId }); } + //This selete is hard coded, be careful if change database schema + q.addSelect('SUM("file"."size") OVER (ORDER BY "file"."id" DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)', 'acc_usage'); + q.orderBy("file.id", "ASC"); - const oldFile = await q.getOne(); + const fileList = await q.getRawMany(); + const exceedFileIds = fileList.filter((x: any) => x.acc_usage > driveCapacity).map((x: any) => x.file_id); - if (oldFile) { - deleteFile(oldFile, true); + for (const fileId of exceedFileIds) { + const file = await DriveFiles.findOneBy({ id: fileId }); + deleteFile(file, true); } } @@ -529,8 +534,9 @@ export async function addFile({ ); } else { // (アバターまたはバナーを含まず)最も古いファイルを削除する - deleteOldFile( + expireOldFile( (await Users.findOneByOrFail({ id: user.id })) as IRemoteUser, + driveCapacity - info.size ); } } From 326679784a5ffd6decaedf1303870c33c22dca53 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Fri, 30 Jun 2023 03:52:22 -0400 Subject: [PATCH 229/309] feat: link previews redesign --- .../client/src/components/MkUrlPreview.vue | 441 +++++++----------- 1 file changed, 170 insertions(+), 271 deletions(-) diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 65befbb99c..22e2b10847 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -1,125 +1,111 @@ <template> - <div - v-if="playerEnabled" - class="player" - :style="`padding: ${ - ((player.height || 0) / (player.width || 1)) * 100 - }% 0 0`" - @click.stop + <transition + :name="defaultStore.state.animation ? 'zoom' : ''" + mode="out-in" > - <button - class="disablePlayer" - :title="i18n.ts.disablePlayer" - @click="playerEnabled = false" - > - <i class="ph-x ph-bold ph-lg"></i> - </button> - <iframe - :src=" - player.url + - (player.url.match(/\?/) - ? '&autoplay=1&auto_play=1' - : '?autoplay=1&auto_play=1') - " - :width="player.width || '100%'" - :heigth="player.height || 250" - frameborder="0" - allow="autoplay; encrypted-media" - allowfullscreen - /> - </div> - <div - v-else-if="tweetId && tweetExpanded" - ref="twitter" - class="twitter" - @click.stop - > - <iframe - ref="tweet" - scrolling="no" - frameborder="no" - :style="{ - position: 'relative', - width: '100%', - height: `${tweetHeight}px`, - }" - :src="`https://platform.twitter.com/embed/index.html?embedId=${embedId}&hideCard=false&hideThread=false&lang=en&theme=${ - defaultStore.state.darkMode ? 'dark' : 'light' - }&id=${tweetId}`" - ></iframe> - </div> - <div v-else v-size="{ max: [400, 350] }" class="mk-url-preview" @click.stop> - <transition - :name="defaultStore.state.animation ? 'zoom' : ''" - mode="out-in" + <!-- v-if="!fetching" for now, I think there's something + weird w/ some links stuck loading (?) --> + <article + v-if="!fetching" + class="url-preview" + @click.stop > <component :is="self ? 'MkA' : 'a'" - v-if="!fetching" - class="link" - :class="{ compact }" - :[attr]="self ? url.substr(local.length) : url" + :[attr]="self ? url.substring(local.length) : url" rel="nofollow noopener" :target="target" :title="url" + :class="{ + hasButton: tweetId || player.url + }" > <div v-if="thumbnail" class="thumbnail" - :style="`background-image: url('${thumbnail}')`" > + <img :src="thumbnail" loading="lazy"/> <button - v-if="!playerEnabled && player.url" + v-if="tweetId" class="_button" - :title="i18n.ts.enablePlayer" - @click.prevent="playerEnabled = true" + v-tooltip="tweetExpanded ? i18n.ts.close : i18n.ts.expandTweet" + @click.stop.prevent="tweetExpanded = !tweetExpanded" > - <i class="ph-play-circle ph-bold ph-lg"></i> + <i v-if="!tweetExpanded" class="ph-twitter-logo ph-bold ph-lg"></i> + <i v-else class="ph-x ph-bold ph-lg"></i> + </button> + <button + v-else-if="player.url" + class="_button" + v-tooltip="playerEnabled ? i18n.ts.close : i18n.ts.enablePlayer" + @click.stop.prevent="playerEnabled = !playerEnabled" + > + <i v-if="!playerEnabled" class="ph-play ph-bold ph-lg"></i> + <i v-else class="ph-x ph-bold ph-lg"></i> </button> </div> - <article> - <header> - <h1 :title="title || undefined">{{ title }}</h1> - </header> - <p v-if="description" :title="description"> - {{ - description.length > 85 - ? description.slice(0, 85) + "…" - : description - }} + <div v-if="fetching"> + <MkLoading mini /> + </div> + <div v-else> + <h1 :title="title || undefined">{{ title || url }}</h1> + <p :title="description"> + <span> + <span :title="sitename || undefined"> + <img v-if="icon" class="icon" :src="icon" /> + {{ sitename }}: + </span> + {{ description }} + </span> </p> - <footer> - <img v-if="icon" class="icon" :src="icon" /> - <p :title="sitename || undefined">{{ sitename }}</p> - </footer> - </article> + </div> </component> - </transition> - <div v-if="tweetId" class="expand-tweet"> - <MkButton mini rounded @click="tweetExpanded = true"> - <i class="ph-twitter-logo ph-bold ph-lg"></i> - {{ i18n.ts.expandTweet }} - </MkButton> - </div> - </div> + <iframe + v-if="playerEnabled" + :src=" + player.url + + (player.url.match(/\?/) + ? '&autoplay=1&auto_play=1' + : '?autoplay=1&auto_play=1') + " + :style="`aspect-ratio: ${((player.width || 1) / (player.height || 1))}`" + frameborder="0" + allow="autoplay; encrypted-media" + allowfullscreen + @click.stop + /> + <iframe + v-else-if="tweetId && tweetExpanded" + ref="tweet" + scrolling="no" + frameborder="no" + :style="{ + position: 'relative', + width: '100%', + height: `${tweetHeight}px`, + }" + :src="`https://platform.twitter.com/embed/index.html?embedId=${embedId}&hideCard=false&hideThread=false&lang=en&theme=${ + defaultStore.state.darkMode ? 'dark' : 'light' + }&id=${tweetId}`" + @click.stop + ></iframe> + </article> + </transition> </template> <script lang="ts" setup> import { onMounted, onUnmounted } from "vue"; import { url as local, lang } from "@/config"; import { i18n } from "@/i18n"; -import MkButton from "@/components/MkButton.vue"; import { defaultStore } from "@/store"; const props = withDefaults( defineProps<{ url: string; detail?: boolean; - compact?: boolean; }>(), { detail: false, - compact: false, } ); @@ -198,201 +184,114 @@ onUnmounted(() => { </script> <style lang="scss" scoped> -.player { - position: relative; - width: 100%; - - > button { - position: absolute; - top: -1.5em; - right: 0; - font-size: 1em; - width: 1.5em; - height: 1.5em; - padding: 0; - margin: 0; - color: var(--fg); - background: rgba(128, 128, 128, 0.2); - opacity: 0.7; - - &:hover { - opacity: 0.9; - } - } - - > iframe { - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 100%; - } -} - -.mk-url-preview { - > .expand-tweet { - margin-top: 0.5rem; - } - - &.max-width_400px { - > .link { - font-size: 12px; - - > .thumbnail { - height: 80px; - } - - > article { - padding: 12px; - } - } - } - - &.max-width_350px { - > .link { - font-size: 10px; - - > .thumbnail { - height: 70px; - } - - > article { - padding: 8px; - - > header { - margin-bottom: 4px; - } - - > footer { - margin-top: 4px; - - > img { - width: 12px; - height: 12px; - } - } - } - - &.compact { - > .thumbnail { - position: absolute; - width: 56px; - height: 100%; - } - - > article { - left: 56px; - width: calc(100% - 56px); - padding: 4px; - - > header { - margin-bottom: 2px; - } - - > footer { - margin-top: 2px; - } - } - } - } - } - - > .link { - position: relative; - display: block; - font-size: 14px; - border: 1px solid var(--divider); - border-radius: 8px; - overflow: hidden; - transition: background 0.2s; - &:hover, - &:focus-within { - text-decoration: none; - background-color: var(--panelHighlight); - > article > header > h1 { - text-decoration: underline; - } - } - - > .thumbnail { - position: absolute; - width: 100px; - height: 100%; - background-position: center; - background-size: cover; +.url-preview { + border: 1px solid var(--divider); + border-radius: var(--radius); + overflow: hidden; + > a { + display: flex; + transition: background .2s; + > div:first-child:not(:last-child) { + position: relative; + width: 90px; + overflow: hidden; display: flex; justify-content: center; align-items: center; + img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + transition: opacity .2s; + } + button { + display: flex; + width: 100%; + height: 100%; + i { - > button { - font-size: 3.5em; - opacity: 0.7; - - &:hover { - font-size: 4em; - opacity: 0.9; + background: var(--bg); + padding: 14px; + border-radius: var(--radius); + transform: scale(.95); + opacity: 0; + transition: transform .2s, opacity .2s, background .2s; } - } - - & + article { - left: 100px; - width: calc(100% - 100px); - } - } - - > article { - position: relative; - box-sizing: border-box; - padding: 16px; - - > header { - margin-bottom: 8px; - - > h1 { - margin: 0; - font-size: 1em; - } - } - - > p { - margin: 0; - font-size: 0.8em; - } - - > footer { - margin-top: 8px; - height: 16px; - - > img { - display: inline-block; - width: 16px; - height: 16px; - margin-right: 4px; - vertical-align: top; - } - - > p { - display: inline-block; - margin: 0; - color: var(--urlPreviewInfo); - font-size: 0.8em; - line-height: 16px; - vertical-align: top; + &:hover, &:focus { + i { + background: var(--panelHighlight) !important; + transform: scale(1.1) !important; + } } } } - - &.compact { - > article { - > header h1, - p, - footer { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; + > div:last-child { + padding: 14px 16px; + width: 0; + flex-grow: 1; + } + h1, p { + display: block; + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + } + h1 { + font-size: 1em; + white-space: nowrap; + margin-bottom: .2em; + } + p { + margin-bottom: -.5em; + > span { + display: -webkit-inline-box; + font-size: .8em; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + > span { + font-weight: 600; + margin-right: .4em; } } } + .icon { + width: 1.2em; + height: 1.2em; + vertical-align: middle; + border-radius: 4px; + } + &:hover, &:focus, &:focus-within { + background: var(--panelHighlight); + h1 { + text-decoration: underline; + } + } + } + &:hover, &:focus-within { + > .hasButton { + > div:first-child { + img { + opacity: .2; + } + button i { + transform: none; + opacity: 1; + } + } + } + } + iframe { + border-top: 1px solid var(--divider); + display: block; + width: 100%; + overflow-y: auto; + &:not([src^="https://platform.twitter"]) { + max-height: 70vh; + } } } </style> From cda1c19454ee8aec4d29b55954129cf6f3716da8 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Fri, 30 Jun 2023 18:43:35 -0400 Subject: [PATCH 230/309] fix: soft mutes not being applied to boosts --- packages/client/src/components/MkNote.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index f5c2d06218..de3b173ba2 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -332,7 +332,7 @@ let appearNote = $computed(() => const isMyRenote = $i && $i.id === note.userId; const showContent = ref(false); const isDeleted = ref(false); -const muted = ref(getWordSoftMute(note, $i, defaultStore.state.mutedWords)); +const muted = ref(getWordSoftMute(appearNote, $i, defaultStore.state.mutedWords)); const translation = ref(null); const translating = ref(false); const enableEmojiReactions = defaultStore.state.enableEmojiReactions; From 6ebd2f1569b5f6e336eed536c20b3a486dcee7da Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Fri, 30 Jun 2023 18:44:38 -0400 Subject: [PATCH 231/309] fix: misaligned new post button I don't understand why margin-top caused that ?? --- packages/client/src/pages/timeline.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index 3b3a08c0ab..c786f016bb 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -346,13 +346,12 @@ onMounted(() => { display: flex; justify-content: center; top: calc(var(--stickyTop, 0px) - 60px); - z-index: 1000; width: 600px; max-width: 100%; height: 60px; - margin-top: -60px; pointer-events: none; - margin-inline: auto; + margin: auto; + margin-bottom: -60px; z-index: 1001; box-shadow: 0 24px 24px -20px var(--accentedBg); &::after { From ec7928d4780328494173b0437512f51e29d9e9ed Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Fri, 30 Jun 2023 05:25:59 +0000 Subject: [PATCH 232/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1815 of 1815 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 4e8a475282..208ccb1598 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -349,6 +349,7 @@ _2fa: deixin de funcionar whyTOTPOnlyRenew: L’aplicació d’autenticació no es pot eliminar sempre que es hi hagi una clau de seguretat registrada. + token: Token 2FA _widgets: notifications: "Notificacions" timeline: "Línia de temps" From 8103dd82ecc0655e85748bf42a433b2bf77aaf7d Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 30 Jun 2023 23:27:41 -0700 Subject: [PATCH 233/309] chore: :busts_in_silhouette: patrons --- patrons.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/patrons.json b/patrons.json index cda7551d8c..84efb59e2b 100644 --- a/patrons.json +++ b/patrons.json @@ -56,6 +56,20 @@ "@riversidebryan@calckey.lgbt", "@aRubes@sloth.run", "@andreasdotorg@calckey.social", + "@ozzy@calckey.online", + "@leni@windycity.style", + "@mhzmodels@calckey.art", + "@ReflexVE@calckey.social", + "@mark@calckey.social", + "@skyizwhite@himagine.club", + "@Uwu@calckey.social", + "@jGoose@calckey.social", + "@kunev@blewsky.social", + "@Simoto@electricrequiem.com", + "@Evoterra@calckey.social", + "@LauraLangdon@procial.tchncs.de", + "@mho@social.heise.de", + "@blues653@calckey.social", "\nInterkosmos Link" ] } From 6fbe508403530bc12e7fcd86a13292228e0c4ccb Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 30 Jun 2023 23:33:54 -0700 Subject: [PATCH 234/309] refactor: :recycle: force patrons update on about-calckey --- .../backend/src/server/api/endpoints/patrons.ts | 14 ++++++++++---- packages/client/src/pages/about-calckey.vue | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/patrons.ts b/packages/backend/src/server/api/endpoints/patrons.ts index 944858694a..ac914daa12 100644 --- a/packages/backend/src/server/api/endpoints/patrons.ts +++ b/packages/backend/src/server/api/endpoints/patrons.ts @@ -11,19 +11,25 @@ export const meta = { export const paramDef = { type: "object", - properties: {}, + properties: { + forceUpdate: { type: "boolean", default: false }, + }, required: [], } as const; -export default define(meta, paramDef, async () => { +export default define(meta, paramDef, async (ps) => { let patrons; const cachedPatrons = await redisClient.get("patrons"); - if (cachedPatrons) { + if (!ps.forceUpdate && cachedPatrons) { patrons = JSON.parse(cachedPatrons); } else { patrons = await fetch( "https://codeberg.org/calckey/calckey/raw/branch/develop/patrons.json", - ).then((response) => response.json()); + ) + .then((response) => response.json()) + .catch(() => { + patrons = cachedPatrons ? JSON.parse(cachedPatrons) : []; + }); await redisClient.set("patrons", JSON.stringify(patrons), "EX", 3600); } diff --git a/packages/client/src/pages/about-calckey.vue b/packages/client/src/pages/about-calckey.vue index 1e16356a51..6071a2c2d9 100644 --- a/packages/client/src/pages/about-calckey.vue +++ b/packages/client/src/pages/about-calckey.vue @@ -164,7 +164,7 @@ import { defaultStore } from "@/store"; import * as os from "@/os"; import { definePageMetadata } from "@/scripts/page-metadata"; -const patrons = await os.api("patrons"); +const patrons = await os.api("patrons", { forceUpdate: true }); let easterEggReady = false; let easterEggEmojis = $ref([]); From ee5a08efdcfb05c771f026838eca18710b6e8e4c Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Fri, 30 Jun 2023 23:35:45 -0700 Subject: [PATCH 235/309] chore: :art: format --- .../backend/src/services/drive/add-file.ts | 11 ++- packages/client/src/components/MkNote.vue | 11 ++- .../client/src/components/MkUrlPreview.vue | 74 +++++++++++-------- 3 files changed, 59 insertions(+), 37 deletions(-) diff --git a/packages/backend/src/services/drive/add-file.ts b/packages/backend/src/services/drive/add-file.ts index b5ba221372..b9991f4949 100644 --- a/packages/backend/src/services/drive/add-file.ts +++ b/packages/backend/src/services/drive/add-file.ts @@ -382,12 +382,17 @@ async function expireOldFile(user: IRemoteUser, driveCapacity: number) { } //This selete is hard coded, be careful if change database schema - q.addSelect('SUM("file"."size") OVER (ORDER BY "file"."id" DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)', 'acc_usage'); + q.addSelect( + 'SUM("file"."size") OVER (ORDER BY "file"."id" DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)', + "acc_usage", + ); q.orderBy("file.id", "ASC"); const fileList = await q.getRawMany(); - const exceedFileIds = fileList.filter((x: any) => x.acc_usage > driveCapacity).map((x: any) => x.file_id); + const exceedFileIds = fileList + .filter((x: any) => x.acc_usage > driveCapacity) + .map((x: any) => x.file_id); for (const fileId of exceedFileIds) { const file = await DriveFiles.findOneBy({ id: fileId }); @@ -536,7 +541,7 @@ export async function addFile({ // (アバターまたはバナーを含まず)最も古いファイルを削除する expireOldFile( (await Users.findOneByOrFail({ id: user.id })) as IRemoteUser, - driveCapacity - info.size + driveCapacity - info.size, ); } } diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index de3b173ba2..1123035849 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -224,7 +224,12 @@ </div> </article> </div> - <button v-else class="muted _button" @click="muted.muted = false" @contextmenu.stop.prevent> + <button + v-else + class="muted _button" + @click="muted.muted = false" + @contextmenu.stop.prevent + > <I18n :src="softMuteReasonI18nSrc(muted.what)" tag="small"> <template #name> <MkA @@ -332,7 +337,9 @@ let appearNote = $computed(() => const isMyRenote = $i && $i.id === note.userId; const showContent = ref(false); const isDeleted = ref(false); -const muted = ref(getWordSoftMute(appearNote, $i, defaultStore.state.mutedWords)); +const muted = ref( + getWordSoftMute(appearNote, $i, defaultStore.state.mutedWords) +); const translation = ref(null); const translating = ref(false); const enableEmojiReactions = defaultStore.state.enableEmojiReactions; diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 22e2b10847..f20d117259 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -5,11 +5,7 @@ > <!-- v-if="!fetching" for now, I think there's something weird w/ some links stuck loading (?) --> - <article - v-if="!fetching" - class="url-preview" - @click.stop - > + <article v-if="!fetching" class="url-preview" @click.stop> <component :is="self ? 'MkA' : 'a'" :[attr]="self ? url.substring(local.length) : url" @@ -17,30 +13,37 @@ :target="target" :title="url" :class="{ - hasButton: tweetId || player.url + hasButton: tweetId || player.url, }" > - <div - v-if="thumbnail" - class="thumbnail" - > - <img :src="thumbnail" loading="lazy"/> + <div v-if="thumbnail" class="thumbnail"> + <img :src="thumbnail" loading="lazy" /> <button v-if="tweetId" class="_button" - v-tooltip="tweetExpanded ? i18n.ts.close : i18n.ts.expandTweet" + v-tooltip=" + tweetExpanded ? i18n.ts.close : i18n.ts.expandTweet + " @click.stop.prevent="tweetExpanded = !tweetExpanded" > - <i v-if="!tweetExpanded" class="ph-twitter-logo ph-bold ph-lg"></i> + <i + v-if="!tweetExpanded" + class="ph-twitter-logo ph-bold ph-lg" + ></i> <i v-else class="ph-x ph-bold ph-lg"></i> </button> <button v-else-if="player.url" class="_button" - v-tooltip="playerEnabled ? i18n.ts.close : i18n.ts.enablePlayer" + v-tooltip=" + playerEnabled ? i18n.ts.close : i18n.ts.enablePlayer + " @click.stop.prevent="playerEnabled = !playerEnabled" > - <i v-if="!playerEnabled" class="ph-play ph-bold ph-lg"></i> + <i + v-if="!playerEnabled" + class="ph-play ph-bold ph-lg" + ></i> <i v-else class="ph-x ph-bold ph-lg"></i> </button> </div> @@ -53,7 +56,7 @@ <span> <span :title="sitename || undefined"> <img v-if="icon" class="icon" :src="icon" /> - {{ sitename }}: + {{ sitename }}: </span> {{ description }} </span> @@ -68,7 +71,9 @@ ? '&autoplay=1&auto_play=1' : '?autoplay=1&auto_play=1') " - :style="`aspect-ratio: ${((player.width || 1) / (player.height || 1))}`" + :style="`aspect-ratio: ${ + (player.width || 1) / (player.height || 1) + }`" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen @@ -190,7 +195,7 @@ onUnmounted(() => { overflow: hidden; > a { display: flex; - transition: background .2s; + transition: background 0.2s; > div:first-child:not(:last-child) { position: relative; width: 90px; @@ -204,22 +209,22 @@ onUnmounted(() => { width: 100%; height: 100%; object-fit: cover; - transition: opacity .2s; + transition: opacity 0.2s; } button { display: flex; width: 100%; height: 100%; i { - background: var(--bg); padding: 14px; border-radius: var(--radius); - transform: scale(.95); + transform: scale(0.95); opacity: 0; - transition: transform .2s, opacity .2s, background .2s; + transition: transform 0.2s, opacity 0.2s, background 0.2s; } - &:hover, &:focus { + &:hover, + &:focus { i { background: var(--panelHighlight) !important; transform: scale(1.1) !important; @@ -232,7 +237,8 @@ onUnmounted(() => { width: 0; flex-grow: 1; } - h1, p { + h1, + p { display: block; margin: 0; overflow: hidden; @@ -242,19 +248,19 @@ onUnmounted(() => { h1 { font-size: 1em; white-space: nowrap; - margin-bottom: .2em; + margin-bottom: 0.2em; } p { - margin-bottom: -.5em; + margin-bottom: -0.5em; > span { display: -webkit-inline-box; - font-size: .8em; + font-size: 0.8em; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; > span { font-weight: 600; - margin-right: .4em; + margin-right: 0.4em; } } } @@ -264,18 +270,21 @@ onUnmounted(() => { vertical-align: middle; border-radius: 4px; } - &:hover, &:focus, &:focus-within { + &:hover, + &:focus, + &:focus-within { background: var(--panelHighlight); h1 { text-decoration: underline; } } } - &:hover, &:focus-within { + &:hover, + &:focus-within { > .hasButton { > div:first-child { img { - opacity: .2; + opacity: 0.2; } button i { transform: none; @@ -289,7 +298,8 @@ onUnmounted(() => { display: block; width: 100%; overflow-y: auto; - &:not([src^="https://platform.twitter"]) { + &:not([src^="https://platform.twitter"]) + { max-height: 70vh; } } From 44bf99e0c1427a56058fbb56f5fba7e826ec2df2 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Fri, 30 Jun 2023 17:44:36 -0400 Subject: [PATCH 236/309] fix: multiple boost publication by relay --- packages/backend/src/services/note/create.ts | 98 ++++++++++---------- 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index defd9742e2..2a5845943e 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -461,57 +461,61 @@ export default async ( } if (!dontFederateInitially) { - const relays = await getCachedRelays(); - // Some relays (e.g., aode-relay) deliver posts by boosting them as - // Announce activities. In that case, user is the relay's actor. - const boostedByRelay = - !!user.inbox && - relays.map((relay) => relay.inbox).includes(user.inbox); - - if (!note.uri) { + if (!note.userHost) { // Publish if the post is local publishNotesStream(note); - } else if (boostedByRelay && data.renote?.uri) { - // Use Redis transaction for atomicity - await redisClient.watch(`publishedNote:${data.renote.uri}`); - const exists = await redisClient.exists( - `publishedNote:${data.renote.uri}`, - ); - if (exists === 0) { - // Start the transaction - const transaction = redisClient.multi(); - const key = `publishedNote:${data.renote.uri}`; - transaction.set(key, 1, "EX", 30); - // Execute the transaction - transaction.exec((err, replies) => { - // Publish after setting the key in Redis - if (!err && data.renote) { - publishNotesStream(data.renote); - } - }); + } else { + const relays = await getCachedRelays(); + // Some relays (e.g., aode-relay) deliver posts by boosting them as + // Announce activities. In that case, user is the relay's actor. + const boostedByRelay = relays + .map((relay) => new URL(relay.inbox).host) + .includes(note.userHost); + + if (boostedByRelay && data.renote) { + // Use Redis transaction for atomicity + const key = `publishedNote:${data.renote.id}`; + await redisClient.watch(key); + const exists = await redisClient.exists(key); + if (exists === 0) { + // Start the transaction + const transaction = redisClient.multi(); + transaction.set(key, 1, "EX", 30); + // Execute the transaction + await transaction.exec((err, _replies) => { + // Publish after setting the key in Redis + if (!err && boostedByRelay && data.renote) { + publishNotesStream(data.renote); + } + }); + } else { + // Abort the transaction + redisClient.unwatch(); + } } else { - // Abort the transaction - redisClient.unwatch(); - } - } else if (!boostedByRelay && note.uri) { - // Use Redis transaction for atomicity - await redisClient.watch(`publishedNote:${note.uri}`); - const exists = await redisClient.exists(`publishedNote:${note.uri}`); - if (exists === 0) { - // Start the transaction - const transaction = redisClient.multi(); - const key = `publishedNote:${note.uri}`; - transaction.set(key, 1, "EX", 30); - // Execute the transaction - transaction.exec((err, replies) => { - // Publish after setting the key in Redis - if (!err) { - publishNotesStream(note); + // Use Redis transaction for atomicity + const key = `publishedNote:${note.id}`; + await redisClient.watch(key); + const exists = await redisClient.exists(key); + if (exists === 0) { + // Start the transaction + const transaction = redisClient.multi(); + transaction.set(key, 1, "EX", 30); + if (note.renoteId) { + // Prevent other threads from publishing this boosting post + transaction.set(`publishedNote:${note.renoteId}`, 1, "EX", 30); } - }); - } else { - // Abort the transaction - redisClient.unwatch(); + // Execute the transaction + await transaction.exec((err, _replies) => { + // Publish after setting the key in Redis + if (!err) { + publishNotesStream(note); + } + }); + } else { + // Abort the transaction + redisClient.unwatch(); + } } } } From 159f788696ef81352ab5a083f5becc36f2d605f7 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Fri, 30 Jun 2023 18:13:07 -0400 Subject: [PATCH 237/309] fix: ignore if post boosted by relay is local --- packages/backend/src/services/note/create.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 2a5845943e..dd08aca41d 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -472,7 +472,8 @@ export default async ( .map((relay) => new URL(relay.inbox).host) .includes(note.userHost); - if (boostedByRelay && data.renote) { + if (boostedByRelay && data.renote && data.renote.userHost) { + /* A relay boosted a remote post. */ // Use Redis transaction for atomicity const key = `publishedNote:${data.renote.id}`; await redisClient.watch(key); From f53fa96fc6d4c34ffdf2d58fad3efd862647d1d7 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Fri, 30 Jun 2023 18:35:05 -0400 Subject: [PATCH 238/309] refactor: no url instantiation --- packages/backend/src/services/note/create.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index dd08aca41d..369b3e4f77 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -461,16 +461,16 @@ export default async ( } if (!dontFederateInitially) { - if (!note.userHost) { + if (Users.isLocalUser(user)) { // Publish if the post is local publishNotesStream(note); } else { const relays = await getCachedRelays(); // Some relays (e.g., aode-relay) deliver posts by boosting them as // Announce activities. In that case, user is the relay's actor. - const boostedByRelay = relays - .map((relay) => new URL(relay.inbox).host) - .includes(note.userHost); + const boostedByRelay = + !!user.inbox && + relays.map((relay) => relay.inbox).includes(user.inbox); if (boostedByRelay && data.renote && data.renote.userHost) { /* A relay boosted a remote post. */ From 38d4d347135d37ef873b43b9e7227e7963d0bc59 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sat, 1 Jul 2023 00:50:46 -0400 Subject: [PATCH 239/309] refactor: use redis-semaphore for mutex across workers --- packages/backend/package.json | 1 + packages/backend/src/services/note/create.ts | 89 ++++++++------------ pnpm-lock.yaml | 17 ++++ 3 files changed, 53 insertions(+), 54 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index f7d19d85b2..b584a56910 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -112,6 +112,7 @@ "ratelimiter": "3.4.1", "re2": "1.19.0", "redis-lock": "0.1.4", + "redis-semaphore": "5.3.1", "reflect-metadata": "0.1.13", "rename": "1.0.4", "rndstr": "1.0.0", diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 369b3e4f77..6d64bec50e 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -69,6 +69,7 @@ import { getActiveWebhooks } from "@/misc/webhook-cache.js"; import { shouldSilenceInstance } from "@/misc/should-block-instance.js"; import meilisearch from "../../db/meilisearch.js"; import { redisClient } from "@/db/redis.js"; +import { Mutex } from "redis-semaphore"; const mutedWordsCache = new Cache< { userId: UserProfile["userId"]; mutedWords: UserProfile["mutedWords"] }[] @@ -461,63 +462,43 @@ export default async ( } if (!dontFederateInitially) { - if (Users.isLocalUser(user)) { - // Publish if the post is local - publishNotesStream(note); - } else { - const relays = await getCachedRelays(); - // Some relays (e.g., aode-relay) deliver posts by boosting them as - // Announce activities. In that case, user is the relay's actor. - const boostedByRelay = - !!user.inbox && - relays.map((relay) => relay.inbox).includes(user.inbox); + let publishKey: string; + let noteToPublish: Note; + const relays = await getCachedRelays(); - if (boostedByRelay && data.renote && data.renote.userHost) { - /* A relay boosted a remote post. */ - // Use Redis transaction for atomicity - const key = `publishedNote:${data.renote.id}`; - await redisClient.watch(key); - const exists = await redisClient.exists(key); - if (exists === 0) { - // Start the transaction - const transaction = redisClient.multi(); - transaction.set(key, 1, "EX", 30); - // Execute the transaction - await transaction.exec((err, _replies) => { - // Publish after setting the key in Redis - if (!err && boostedByRelay && data.renote) { - publishNotesStream(data.renote); - } - }); - } else { - // Abort the transaction - redisClient.unwatch(); - } - } else { - // Use Redis transaction for atomicity - const key = `publishedNote:${note.id}`; - await redisClient.watch(key); - const exists = await redisClient.exists(key); - if (exists === 0) { - // Start the transaction - const transaction = redisClient.multi(); - transaction.set(key, 1, "EX", 30); - if (note.renoteId) { - // Prevent other threads from publishing this boosting post - transaction.set(`publishedNote:${note.renoteId}`, 1, "EX", 30); - } - // Execute the transaction - await transaction.exec((err, _replies) => { - // Publish after setting the key in Redis - if (!err) { - publishNotesStream(note); - } - }); - } else { - // Abort the transaction - redisClient.unwatch(); + // Some relays (e.g., aode-relay) deliver posts by boosting them as + // Announce activities. In that case, user is the relay's actor. + const boostedByRelay = + !!user.inbox && + relays.map((relay) => relay.inbox).includes(user.inbox); + + if (boostedByRelay && data.renote && data.renote.userHost) { + publishKey = `publishedNote:${data.renote.id}`; + noteToPublish = data.renote; + } else { + publishKey = `publishedNote:${note.id}`; + noteToPublish = note; + } + + const lock = new Mutex(redisClient, "publishedNote:lock"); + await lock.acquire(); + try { + const exists = (await redisClient.exists(publishKey)) > 0; + if (!exists) { + await redisClient.set(publishKey, 1, "EX", 30); + if (noteToPublish.renoteId) { + // Prevents other threads from publishing the boosting post + await redisClient.set( + `publishedNote:${noteToPublish.renoteId}`, + 1, + "EX", + 30, + ); } + publishNotesStream(noteToPublish); } + } finally { + lock.release(); } } if (note.replyId != null) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 760931858b..1002a6f958 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -339,6 +339,9 @@ importers: redis-lock: specifier: 0.1.4 version: 0.1.4 + redis-semaphore: + specifier: 5.3.1 + version: 5.3.1(ioredis@5.3.2) reflect-metadata: specifier: 0.1.13 version: 0.1.13 @@ -2666,6 +2669,7 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [android] + requiresBuild: true dependencies: '@swc/wasm': 1.2.130 @@ -2772,6 +2776,7 @@ packages: /@swc/wasm@1.2.130: resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==} + requiresBuild: true /@syuilo/aiscript@0.11.1: resolution: {integrity: sha512-chwOIA3yLUKvOB0G611hjLArKTeOWNmTm3lHERSaDW1d+dS6do56naX6Lkwy2UpnwWC0qzeNSgg35elk6t2gZg==} @@ -12831,6 +12836,18 @@ packages: dependencies: redis-errors: 1.2.0 + /redis-semaphore@5.3.1(ioredis@5.3.2): + resolution: {integrity: sha512-oUpxxfxSbh5eT0mvVpz2d4Qlg2CsaoQkeo80/v6CU2l97zO0u6NPgc9/zQZa9KGR3/93b0igtSct3hEFh8Ei8w==} + engines: {node: '>= 14.17.0'} + peerDependencies: + ioredis: ^4.1.0 || ^5 + dependencies: + debug: 4.3.4(supports-color@8.1.1) + ioredis: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + /redis@4.6.7: resolution: {integrity: sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==} dependencies: From 4bf1dbbd83333b7058a8eb77f64bbc725f266fd3 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sat, 1 Jul 2023 02:53:08 -0400 Subject: [PATCH 240/309] change mutex key --- packages/backend/src/services/note/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 6d64bec50e..95d005fe00 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -480,7 +480,7 @@ export default async ( noteToPublish = note; } - const lock = new Mutex(redisClient, "publishedNote:lock"); + const lock = new Mutex(redisClient, "publishedNote"); await lock.acquire(); try { const exists = (await redisClient.exists(publishKey)) > 0; From ab789f2ca8c95c2e7fb8d978a25e6f671804e07d Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sat, 1 Jul 2023 03:22:40 -0400 Subject: [PATCH 241/309] fix: await release --- packages/backend/src/services/note/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 95d005fe00..6eb0df8170 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -498,7 +498,7 @@ export default async ( publishNotesStream(noteToPublish); } } finally { - lock.release(); + await lock.release(); } } if (note.replyId != null) { From 1ad356c30e978cd0b71a495e4a7bf89eb38c5724 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 07:57:59 +0000 Subject: [PATCH 242/309] =?UTF-8?q?chore:=20=F0=9F=91=A5=20patrons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index 84efb59e2b..2218a9749f 100644 --- a/patrons.json +++ b/patrons.json @@ -69,6 +69,7 @@ "@Evoterra@calckey.social", "@LauraLangdon@procial.tchncs.de", "@mho@social.heise.de", + "@richardazia@calckey.social", "@blues653@calckey.social", "\nInterkosmos Link" ] From 49e17e776c2276ee7f87ca4d59fe8386060d7c64 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sat, 1 Jul 2023 04:07:50 -0400 Subject: [PATCH 243/309] refactor: examine by get instead of exists --- packages/backend/src/services/note/create.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 6eb0df8170..f00678ce22 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -483,14 +483,14 @@ export default async ( const lock = new Mutex(redisClient, "publishedNote"); await lock.acquire(); try { - const exists = (await redisClient.exists(publishKey)) > 0; - if (!exists) { - await redisClient.set(publishKey, 1, "EX", 30); + const published = (await redisClient.get(publishKey)) !== null; + if (!published) { + await redisClient.set(publishKey, "done", "EX", 30); if (noteToPublish.renoteId) { // Prevents other threads from publishing the boosting post await redisClient.set( `publishedNote:${noteToPublish.renoteId}`, - 1, + "done", "EX", 30, ); From d0877c8db9234493de357bc94efc0fd78988205d Mon Sep 17 00:00:00 2001 From: Kainoa Kanter <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 15:16:14 +0000 Subject: [PATCH 244/309] =?UTF-8?q?chore:=20=F0=9F=91=A5=20patrons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index 2218a9749f..9ef30d7f24 100644 --- a/patrons.json +++ b/patrons.json @@ -71,6 +71,7 @@ "@mho@social.heise.de", "@richardazia@calckey.social", "@blues653@calckey.social", + "@rafale_blue@calc.04.si", "\nInterkosmos Link" ] } From 61ad79ec17033efd7ec2cf2637544434af8f3580 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sat, 1 Jul 2023 19:21:26 -0400 Subject: [PATCH 245/309] fix: webkit blur effects --- .../src/components/global/MkPageHeader.vue | 4 ++-- packages/client/src/pages/user/home.vue | 20 +++++-------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/packages/client/src/components/global/MkPageHeader.vue b/packages/client/src/components/global/MkPageHeader.vue index 08c27bcf76..f24d3de05a 100644 --- a/packages/client/src/components/global/MkPageHeader.vue +++ b/packages/client/src/components/global/MkPageHeader.vue @@ -307,6 +307,8 @@ onUnmounted(() => { padding-inline: 24px; box-sizing: border-box; overflow: hidden; + -webkit-backdrop-filter: var(--blur, blur(15px)); + backdrop-filter: var(--blur, blur(15px)); @media (max-width: 500px) { padding-inline: 16px; &.tabs > .buttons > :deep(.follow-button > span) { @@ -345,8 +347,6 @@ onUnmounted(() => { position: absolute; inset: 0; border-bottom: solid 0.5px var(--divider); - -webkit-backdrop-filter: var(--blur, blur(15px)); - backdrop-filter: var(--blur, blur(15px)); z-index: -1; } &::after { diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index 9e9dfcc7c7..a8aa2844f5 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -20,11 +20,11 @@ /> <div :key="user.id" class="_block main"> - <div class="banner-container" :style="style"> + <div class="banner-container"> <div ref="bannerEl" class="banner" - :style="style" + :style="{ backgroundImage: `url('${user.bannerUrl}')` }" ></div> <div class="fade"></div> <div class="title"> @@ -405,13 +405,6 @@ let narrow = $ref<null | boolean>(null); let rootEl = $ref<null | HTMLElement>(null); let bannerEl = $ref<null | HTMLElement>(null); -const style = $computed(() => { - if (props.user.bannerUrl == null) return {}; - return { - backgroundImage: `url(${props.user.bannerUrl})`, - }; -}); - const age = $computed(() => { return calcAge(props.user.birthday); }); @@ -502,7 +495,6 @@ onUnmounted(() => { overflow: hidden; background-size: cover; background-position: center; - > .banner { height: 100%; background-color: #26233a; @@ -510,17 +502,15 @@ onUnmounted(() => { background-position: center; box-shadow: 0 0 128px var(--shadow) inset; will-change: background-position; - - &::after { + &::before { content: ""; - background-image: var(--blur, inherit); position: fixed; inset: 0; + background: var(--blur, inherit); background-size: cover; background-position: center; pointer-events: none; - opacity: 0.1; - filter: var(--blur, blur(10px)); + filter: blur(12px) opacity(.1); } } From 3db785444aa06c094caa6cb938e52846044f6c09 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 16:59:57 -0700 Subject: [PATCH 246/309] fix: :loud_sound: log emoji picker errors --- packages/client/src/components/MkEmojiPickerDialog.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/client/src/components/MkEmojiPickerDialog.vue b/packages/client/src/components/MkEmojiPickerDialog.vue index fec014e407..8bbb4bb850 100644 --- a/packages/client/src/components/MkEmojiPickerDialog.vue +++ b/packages/client/src/components/MkEmojiPickerDialog.vue @@ -65,7 +65,12 @@ function chosen(emoji: any) { } function opening() { - // picker.value?.reset(); + try { + picker.value?.reset(); + } + catch (e) { + console.error(`Something's wrong with restting the emoji picker: ${e}`) + } picker.value?.focus(); } </script> From ec8642bf4fd1d6170cc28b995dd4f91939c322eb Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 17:31:45 -0700 Subject: [PATCH 247/309] chore: :busts_in_silhouette: patrons --- patrons.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/patrons.json b/patrons.json index 9ef30d7f24..1d206942d5 100644 --- a/patrons.json +++ b/patrons.json @@ -72,6 +72,9 @@ "@richardazia@calckey.social", "@blues653@calckey.social", "@rafale_blue@calc.04.si", + "@esm@lethallava.land", + "@vmstan@vmst.io", + "@jtbennett@noc.social", "\nInterkosmos Link" ] } From 7007abff4646e3ac8c69aa081bee18740a1a10b5 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 18:11:21 -0700 Subject: [PATCH 248/309] chore: :busts_in_silhouette: patrons --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index 1d206942d5..1216e90c2a 100644 --- a/patrons.json +++ b/patrons.json @@ -75,6 +75,7 @@ "@esm@lethallava.land", "@vmstan@vmst.io", "@jtbennett@noc.social", + "@renere@distance.blue", "\nInterkosmos Link" ] } From 0ee70ebffdcfa5940913ffb72cb8406dddcd925b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 18:21:40 -0700 Subject: [PATCH 249/309] chore: :busts_in_silhouette: patrons --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index 1216e90c2a..7d38e5f005 100644 --- a/patrons.json +++ b/patrons.json @@ -76,6 +76,7 @@ "@vmstan@vmst.io", "@jtbennett@noc.social", "@renere@distance.blue", + "@theking@kitsunes.club", "\nInterkosmos Link" ] } From aead731e6322ad6eb215b8df72bec587e1db4bad Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sat, 1 Jul 2023 21:35:05 -0400 Subject: [PATCH 250/309] fix/refactor: move new posts button to MkTimeline --- packages/client/src/components/MkTimeline.vue | 89 +++++++++++++++- .../client/src/pages/antenna-timeline.vue | 32 +----- packages/client/src/pages/timeline.vue | 100 +----------------- .../client/src/pages/user-list-timeline.vue | 31 ------ 4 files changed, 89 insertions(+), 163 deletions(-) diff --git a/packages/client/src/components/MkTimeline.vue b/packages/client/src/components/MkTimeline.vue index c3366c17ac..f126581d6c 100644 --- a/packages/client/src/components/MkTimeline.vue +++ b/packages/client/src/components/MkTimeline.vue @@ -9,16 +9,26 @@ <template #icon></template> </I18n> </MkInfo> + <div v-if="queue > 0" class="new"> + <button + class="_buttonPrimary _shadow" + @click="scrollTop" + :class="{ instant: !$store.state.animation }" + > + {{ i18n.ts.newNoteRecived }} + <i class="ph-arrow-up ph-bold"></i> + </button> + </div> <XNotes ref="tlComponent" :no-gap="!$store.state.showGapBetweenNotesInTimeline" :pagination="pagination" - @queue="emit('queue', $event)" + @queue="(x) => queue = x" /> </template> <script lang="ts" setup> -import { ref, computed, provide, onUnmounted } from "vue"; +import { ref, watch, computed, provide, onUnmounted } from "vue"; import XNotes from "@/components/MkNotes.vue"; import MkInfo from "@/components/MkInfo.vue"; import * as os from "@/os"; @@ -27,6 +37,7 @@ import * as sound from "@/scripts/sound"; import { $i } from "@/account"; import { i18n } from "@/i18n"; import { defaultStore } from "@/store"; +import { scroll } from "@/scripts/scroll"; const props = defineProps<{ src: string; @@ -36,6 +47,8 @@ const props = defineProps<{ sound?: boolean; }>(); +let queue = $ref(0); + const emit = defineEmits<{ (ev: "note"): void; (ev: "queue", count: number): void; @@ -210,6 +223,9 @@ function closeHint() { break; } } +function scrollTop() { + scroll(tlComponent, { top: 0, behavior: 'smooth' }) +} const pagination = { endpoint: endpoint, @@ -229,3 +245,72 @@ const timetravel = (date?: Date) => { }; */ </script> +<style lang="scss" scoped> +@keyframes slideUp { + to { + transform: translateY(-100%); + opacity: 0; + } +} +.new { + position: sticky; + display: flex; + justify-content: center; + top: calc(var(--stickyTop, 0px) - 60px); + width: 600px; + max-width: 100%; + height: 60px; + pointer-events: none; + margin: auto; + margin-top: -60px; + z-index: 1001; + box-shadow: 0 24px 24px -20px var(--accentedBg); + &::after { + content: ""; + position: absolute; + inset: -2px 0; + border: 2px solid var(--accentDarken); + mask: linear-gradient( + to right, + transparent, + black 40% 60%, + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 40% 60%, + transparent + ); + } + > button { + display: flex; + position: absolute; + top: 120%; + margin-inline: auto; + border-radius: 2em; + padding: 0.5em 1.2em; + background: var(--accentedBg); + border: 0; + color: var(--accent); + overflow: hidden; + pointer-events: all; + transform: translateY(-100%); + opacity: 0; + animation: reset 0.4s forwards cubic-bezier(0, 0.4, 0, 1.1), + slideUp 1s 5s forwards cubic-bezier(1, 0, 1, 1); + &::before { + content: ""; + position: absolute; + inset: 0; + background: var(--bg); + z-index: -1; + } + i { + margin-left: 0.7em; + border-left: 1px solid var(--accentedBg); + padding-left: 0.4em; + } + } +} +</style> diff --git a/packages/client/src/pages/antenna-timeline.vue b/packages/client/src/pages/antenna-timeline.vue index 2100be8bff..fbee993d32 100644 --- a/packages/client/src/pages/antenna-timeline.vue +++ b/packages/client/src/pages/antenna-timeline.vue @@ -9,11 +9,6 @@ v-size="{ min: [800] }" class="tqmomfks" > - <div v-if="queue > 0" class="new"> - <button class="_buttonPrimary" @click="top()"> - {{ i18n.ts.newNoteRecived }} - </button> - </div> <div class="tl _block"> <XTimeline ref="tlEl" @@ -22,7 +17,6 @@ src="antenna" :antenna="antennaId" :sound="true" - @queue="queueUpdated" /> </div> </div> @@ -32,7 +26,6 @@ <script lang="ts" setup> import { computed, inject, watch } from "vue"; import XTimeline from "@/components/MkTimeline.vue"; -import { scroll } from "@/scripts/scroll"; import * as os from "@/os"; import { useRouter } from "@/router"; import { definePageMetadata } from "@/scripts/page-metadata"; @@ -45,21 +38,12 @@ const props = defineProps<{ }>(); let antenna = $ref(null); -let queue = $ref(0); let rootEl = $ref<HTMLElement>(); let tlEl = $ref<InstanceType<typeof XTimeline>>(); const keymap = $computed(() => ({ t: focus, })); -function queueUpdated(q) { - queue = q; -} - -function top() { - scroll(rootEl, { top: 0 }); -} - async function timetravel() { const { canceled, result: date } = await os.inputDate({ title: i18n.ts.date, @@ -142,21 +126,7 @@ definePageMetadata( <style lang="scss" scoped> .tqmomfks { padding: var(--margin); - - > .new { - position: sticky; - top: calc(var(--stickyTop, 0px) + 16px); - z-index: 1000; - width: 100%; - - > button { - display: block; - margin: var(--margin) auto 0 auto; - padding: 8px 16px; - border-radius: 32px; - } - } - + > .tl { background: none; border-radius: var(--radius); diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index c786f016bb..479d836eb1 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -15,17 +15,6 @@ class="post-form _block" fixed /> - - <div v-if="queue > 0" class="new"> - <button - class="_buttonPrimary _shadow" - @click="top()" - :class="{ instant: !$store.state.animation }" - > - {{ i18n.ts.newNoteRecived }} - <i class="ph-arrow-up ph-bold"></i> - </button> - </div> <!-- <div v-if="!isMobile" class="tl _block"> <XTimeline ref="tl" @@ -65,7 +54,6 @@ class="tl" :src="src" :sound="true" - @queue="queueUpdated" /> </swiper-slide> </swiper> @@ -76,13 +64,12 @@ </template> <script lang="ts" setup> -import { computed, watch, ref, onMounted } from "vue"; +import { computed, ref, onMounted } from "vue"; import { Virtual } from "swiper"; import { Swiper, SwiperSlide } from "swiper/vue"; import XTutorial from "@/components/MkTutorialDialog.vue"; import XTimeline from "@/components/MkTimeline.vue"; import XPostForm from "@/components/MkPostForm.vue"; -import { scroll } from "@/scripts/scroll"; import * as os from "@/os"; import { defaultStore } from "@/store"; import { i18n } from "@/i18n"; @@ -137,7 +124,6 @@ window.addEventListener("resize", () => { const tlComponent = $ref<InstanceType<typeof XTimeline>>(); const rootEl = $ref<HTMLElement>(); -let queue = $ref(0); const src = $computed({ get: () => defaultStore.reactiveState.tl.value.src, set: (x) => { @@ -146,16 +132,6 @@ const src = $computed({ }, }); -watch($$(src), () => (queue = 0)); - -function queueUpdated(q: number): void { - queue = q; -} - -function top(): void { - scroll(rootEl, { top: 0 }); -} - const lists = os.api("users/lists/list"); async function chooseList(ev: MouseEvent) { await lists.then((res) => { @@ -332,84 +308,10 @@ onMounted(() => { </script> <style lang="scss" scoped> -@keyframes slideUp { - to { - transform: translateY(-100%); - opacity: 0; - } -} .cmuxhskf { --swiper-theme-color: var(--accent); - - > .new { - position: sticky; - display: flex; - justify-content: center; - top: calc(var(--stickyTop, 0px) - 60px); - width: 600px; - max-width: 100%; - height: 60px; - pointer-events: none; - margin: auto; - margin-bottom: -60px; - z-index: 1001; - box-shadow: 0 24px 24px -20px var(--accentedBg); - &::after { - content: ""; - position: absolute; - inset: 0; - border: 2px solid var(--accentDarken); - mask: linear-gradient( - to right, - transparent, - black 40% 60%, - transparent - ); - -webkit-mask: linear-gradient( - to right, - transparent, - black 40% 60%, - transparent - ); - } - > button { - display: flex; - position: absolute; - top: 120%; - margin-inline: auto; - border-radius: 2em; - padding: 0.5em 1.2em; - background: var(--accentedBg); - border: 0; - color: var(--accent); - overflow: hidden; - pointer-events: all; - transform: translateY(-100%); - opacity: 0; - animation: reset 0.4s forwards cubic-bezier(0, 0.4, 0, 1.1), - slideUp 1s 5s forwards cubic-bezier(1, 0, 1, 1); - &::before { - content: ""; - position: absolute; - inset: 0; - background: var(--bg); - z-index: -1; - } - i { - margin-left: 0.7em; - border-left: 1px solid var(--accentedBg); - padding-left: 0.4em; - } - } - } - - > .post-form { - border-radius: var(--radius); - } - > .tl { background: none; - border-radius: var(--radius); } } </style> diff --git a/packages/client/src/pages/user-list-timeline.vue b/packages/client/src/pages/user-list-timeline.vue index 7b33e8c282..839b1a6afa 100644 --- a/packages/client/src/pages/user-list-timeline.vue +++ b/packages/client/src/pages/user-list-timeline.vue @@ -4,11 +4,6 @@ ><MkPageHeader :actions="headerActions" :tabs="headerTabs" /></template> <div ref="rootEl" v-size="{ min: [800] }" class="eqqrhokj"> - <div v-if="queue > 0" class="new"> - <button class="_buttonPrimary" @click="top()"> - {{ i18n.ts.newNoteRecived }} - </button> - </div> <div class="tl _block"> <XTimeline ref="tlEl" @@ -17,7 +12,6 @@ src="list" :list="listId" :sound="true" - @queue="queueUpdated" /> </div> </div> @@ -27,7 +21,6 @@ <script lang="ts" setup> import { computed, watch, inject } from "vue"; import XTimeline from "@/components/MkTimeline.vue"; -import { scroll } from "@/scripts/scroll"; import * as os from "@/os"; import { useRouter } from "@/router"; import { definePageMetadata } from "@/scripts/page-metadata"; @@ -40,7 +33,6 @@ const props = defineProps<{ }>(); let list = $ref(null); -let queue = $ref(0); let tlEl = $ref<InstanceType<typeof XTimeline>>(); let rootEl = $ref<HTMLElement>(); @@ -54,14 +46,6 @@ watch( { immediate: true } ); -function queueUpdated(q) { - queue = q; -} - -function top() { - scroll(rootEl, { top: 0 }); -} - function settings() { router.push(`/my/lists/${props.listId}`); } @@ -109,21 +93,6 @@ definePageMetadata( <style lang="scss" scoped> .eqqrhokj { padding: var(--margin); - - > .new { - position: sticky; - top: calc(var(--stickyTop, 0px) + 16px); - z-index: 1000; - width: 100%; - - > button { - display: block; - margin: var(--margin) auto 0 auto; - padding: 8px 16px; - border-radius: 32px; - } - } - > .tl { background: none; border-radius: var(--radius); From 934a21776caab6ce22b6eb152a8f69af8b39e663 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sat, 1 Jul 2023 21:48:18 -0400 Subject: [PATCH 251/309] fix: new posts click --- packages/client/src/components/MkNotes.vue | 10 +++++++++- packages/client/src/components/MkTimeline.vue | 6 +----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/client/src/components/MkNotes.vue b/packages/client/src/components/MkNotes.vue index bf3631c182..3ddcb6079b 100644 --- a/packages/client/src/components/MkNotes.vue +++ b/packages/client/src/components/MkNotes.vue @@ -12,7 +12,7 @@ </template> <template #default="{ items: notes }"> - <div class="giivymft" :class="{ noGap }"> + <div class="giivymft" :class="{ noGap }" ref="tlEl"> <XList ref="notes" v-slot="{ item: note }" @@ -41,6 +41,9 @@ import XNote from "@/components/MkNote.vue"; import XList from "@/components/MkDateSeparatedList.vue"; import MkPagination from "@/components/MkPagination.vue"; import { i18n } from "@/i18n"; +import { scroll } from "@/scripts/scroll"; + +const tlEl = ref<HTMLElement>(); const props = defineProps<{ pagination: Paging; @@ -49,8 +52,13 @@ const props = defineProps<{ const pagingComponent = ref<InstanceType<typeof MkPagination>>(); +function scrollTop() { + scroll(tlEl.value, { top: 0, behavior: 'smooth' }) +} + defineExpose({ pagingComponent, + scrollTop }); </script> diff --git a/packages/client/src/components/MkTimeline.vue b/packages/client/src/components/MkTimeline.vue index f126581d6c..81e4f575c6 100644 --- a/packages/client/src/components/MkTimeline.vue +++ b/packages/client/src/components/MkTimeline.vue @@ -12,7 +12,7 @@ <div v-if="queue > 0" class="new"> <button class="_buttonPrimary _shadow" - @click="scrollTop" + @click="tlComponent.scrollTop()" :class="{ instant: !$store.state.animation }" > {{ i18n.ts.newNoteRecived }} @@ -37,7 +37,6 @@ import * as sound from "@/scripts/sound"; import { $i } from "@/account"; import { i18n } from "@/i18n"; import { defaultStore } from "@/store"; -import { scroll } from "@/scripts/scroll"; const props = defineProps<{ src: string; @@ -223,9 +222,6 @@ function closeHint() { break; } } -function scrollTop() { - scroll(tlComponent, { top: 0, behavior: 'smooth' }) -} const pagination = { endpoint: endpoint, From fc8f9f63ca98617d26f4f4d90dc29fecbc407a9b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 19:14:14 -0700 Subject: [PATCH 252/309] chore: :busts_in_silhouette: patrons --- patrons.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/patrons.json b/patrons.json index 7d38e5f005..d53643484a 100644 --- a/patrons.json +++ b/patrons.json @@ -10,8 +10,7 @@ "@griff@stop.voring.me", "@cafkafk@ck.cafkafk.com", "@privateger@plasmatrap.com", - "@self@neo.voidworks.cc", - "@effy@social.effy.space", + "@effye@toot.thoughtworks.com", "@Kio@kitsunes.club", "@twann@tech.lgbt", "@surfbum@calckey.nz", @@ -35,13 +34,12 @@ "@box464@calckey.social", "@MariaTheMartian@calckey.social", "@nisemikol@calckey.social", - "@smallpatatas@calckey.patatas.ca", + "@smallpatatas@blahaj.zone", "@bayra@stop.voring.me", "@frost@wolfdo.gg", "@joebiden@fuckgov.org", "@nyaa@calckey.social", "@Dan@calckey.social", - "@testing@stop.voring.me", "@dana@calckey.social", "@Jdreben@calckey.social", "@natalie@prismst.one", @@ -77,6 +75,7 @@ "@jtbennett@noc.social", "@renere@distance.blue", "@theking@kitsunes.club", + "@toof@fedi.toofie.net", "\nInterkosmos Link" ] } From 1048c1f6762f3cdc2753f354c8796fb360631778 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 19:17:22 -0700 Subject: [PATCH 253/309] chore: :busts_in_silhouette: patrons --- patrons.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/patrons.json b/patrons.json index d53643484a..41c53f9851 100644 --- a/patrons.json +++ b/patrons.json @@ -17,9 +17,8 @@ "@topher@mastodon.online", "@hanicef@stop.voring.me", "@nmkj@calckey.jp", - "@trapezial@calckey.jp", "@unattributed@calckey.social", - "@cody@mk.codingneko.com", + "@cody@misskey.codingneko.com", "@kate@blahaj.zone", "@emtk@mkkey.net", "@jovikowi@calckey.social", From f2bedbd645f98edd72fc27dea5d6079f142b2238 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 19:31:05 -0700 Subject: [PATCH 254/309] refactor: :globe_with_meridians: patrons description --- locales/en-US.yml | 1 + packages/client/src/pages/about-calckey.vue | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index cc327c5aa5..5daff11a91 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1213,6 +1213,7 @@ _aboutMisskey: morePatrons: "We also appreciate the support of many other helpers not listed here. Thank you! 🥰" patrons: "Calckey patrons" + patronsList: "Listed chronologically, not by donation size. Donate with the link above to get your name on here!" _nsfw: respect: "Hide NSFW media" ignore: "Don't hide NSFW media" diff --git a/packages/client/src/pages/about-calckey.vue b/packages/client/src/pages/about-calckey.vue index 6071a2c2d9..a8cee78d55 100644 --- a/packages/client/src/pages/about-calckey.vue +++ b/packages/client/src/pages/about-calckey.vue @@ -97,13 +97,16 @@ ><Mfm :text="'$[sparkle @kainoa@calckey.social] (Main developer)'" /></FormLink> - <FormLink to="/@april@calckey.social" - ><Mfm :text="'@april@calckey.social (Backend)'" - /></FormLink> <FormLink to="/@freeplay@calckey.social" ><Mfm :text="'@freeplay@calckey.social (UI/UX)'" /></FormLink> + <FormLink to="/@nmkj@calckey.jp" + ><Mfm :text="'@nmkj@calckey.jp (Backend)'" + /></FormLink> + <FormLink to="/@dev@post.naskya.net" + ><Mfm :text="'@dev@post.naskya.net (Backend)'" + /></FormLink> <FormLink to="/@panos@calckey.social" ><Mfm :text="'@panos@calckey.social (Project Coordinator)'" @@ -128,6 +131,9 @@ ><Mfm text="$[jelly ❤]" /> {{ i18n.ts._aboutMisskey.patrons }}</template > + <p> + {{ i18n.ts._aboutMisskey.patronsList }} + </p> <MkSparkle> <span v-for="patron in patrons" From eeed9159da3a000f10fe35dd39d8a96612fee0f0 Mon Sep 17 00:00:00 2001 From: Ettore Atalan <atalanttore@googlemail.com> Date: Sat, 1 Jul 2023 08:32:50 +0000 Subject: [PATCH 255/309] chore: Translated using Weblate (German) Currently translated at 98.7% (1793 of 1815 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ --- locales/de-DE.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/locales/de-DE.yml b/locales/de-DE.yml index d37869064d..de071e00e6 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -2152,3 +2152,4 @@ clipsDesc: Clips sind wie teilbare, kategorisierte Lesezeichen. Du kannst Clips Menü individueller Posts aus erstellen. channelFederationWarn: Kanäle föderieren noch nicht zu anderen Servern reactionPickerSkinTone: Bevorzugte Emoji-Hautfarbe +swipeOnMobile: Wischen zwischen den Seiten erlauben From d9af4f3a2737f32b054131aad4818e6659894e01 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 20:00:51 -0700 Subject: [PATCH 256/309] refactor: :triangular_flag_on_post: post editing is no longer experimental --- locales/ca-ES.yml | 4 ---- locales/de-DE.yml | 3 --- locales/en-US.yml | 3 --- locales/fr-FR.yml | 2 +- locales/ja-JP.yml | 2 -- locales/zh-TW.yml | 1 - .../src/remote/activitypub/models/note.ts | 4 ---- .../src/server/api/endpoints/admin/meta.ts | 3 --- .../server/api/endpoints/admin/update-meta.ts | 1 - .../backend/src/server/api/endpoints/meta.ts | 2 +- .../src/server/api/endpoints/notes/edit.ts | 11 ----------- packages/backend/src/server/nodeinfo.ts | 2 +- packages/client/src/pages/admin/experiments.vue | 17 ----------------- packages/client/src/scripts/get-note-menu.ts | 2 +- 14 files changed, 4 insertions(+), 53 deletions(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 208ccb1598..e482750f4a 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -2082,11 +2082,7 @@ _experiments: alpha: Alfa beta: Beta release: Publicà - enablePostEditing: Activà l'edició de publicacions title: Experiments - postEditingCaption: Mostra l'opció perquè els usuaris editin les seves publicacions - mitjançant el menú d'opcions de publicació, i permet rebre publicacions editades - d'altres servidors. enablePostImports: Activar l'importació de publicacions postImportsCaption: Permet els usuaris importar publicacions desde comptes a Calckey, Misskey, Mastodon, Akkoma i Pleroma. Pot fer que el servidor vagi més lent durant diff --git a/locales/de-DE.yml b/locales/de-DE.yml index d37869064d..e9e33d6d65 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -2095,10 +2095,7 @@ jumpToPrevious: Zum Vorherigen springen silencedWarning: Diese Meldung wird angezeigt, weil diese Nutzer von Servern stammen, die Ihr Administrator abgeschaltet hat, so dass es sich möglicherweise um Spam handelt. _experiments: - enablePostEditing: Beitragsbearbeitung ermöglichen title: Funktionstests - postEditingCaption: Zeigt die Option für Nutzer an, ihre bestehenden Beiträge über - das Menü "Beitragsoptionen" zu bearbeiten enablePostImports: Beitragsimporte aktivieren postImportsCaption: Erlaubt es Nutzer:innen ihre Posts von alten Calckey, Misskey, Mastodon, Akkoma und Pleroma Accounts zu importieren. Bei Engpässen in der Warteschlange diff --git a/locales/en-US.yml b/locales/en-US.yml index 5daff11a91..d493f332f5 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -2070,9 +2070,6 @@ _deck: direct: "Direct messages" _experiments: title: "Experiments" - enablePostEditing: "Enable post editing" - postEditingCaption: "Shows the option for users to edit their existing posts via\ - \ the post options menu, and allows post edits from other instances to be recieved." enablePostImports: "Enable post imports" postImportsCaption: "Allows users to import their posts from past Calckey,\ \ Misskey, Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during\ diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 5a61870c4e..5291d16932 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -2028,7 +2028,7 @@ flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponse _experiments: alpha: Alpha beta: Beta - enablePostEditing: Autoriser l'édition de note + enablePostImports: Autoriser l'importation de messages title: Expérimentations findOtherInstance: Trouver un autre serveur userSaysSomethingReasonQuote: '{name} a cité une note contenant {reason}' diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 21f616808b..fa3c3f1cc1 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1887,9 +1887,7 @@ hiddenTagsDescription: 'トレンドと「みつける」から除外したい hiddenTags: 非表示にするハッシュタグ apps: "アプリ" _experiments: - enablePostEditing: 投稿の編集機能を有効にする title: 試験的な機能 - postEditingCaption: 投稿のメニューに既存の投稿を編集するボタンを表示し、他サーバーの編集も受信できるようにします。 postImportsCaption: ユーザーが過去の投稿をCalckey・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。 enablePostImports: 投稿のインポートを有効にする diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index d373daf5d9..c615bcdcc5 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -1816,7 +1816,6 @@ silenceThisInstance: 靜音此伺服器 silencedInstances: 已靜音的伺服器 silenced: 已靜音 _experiments: - enablePostEditing: 啟用帖子編輯 title: 試驗功能 findOtherInstance: 找找另一個伺服器 noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Calckey發生衝突,請停用該擴展。 diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 26aa5bf544..a3141e388a 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -541,10 +541,6 @@ function notEmpty(partial: Partial<any>) { export async function updateNote(value: string | IObject, resolver?: Resolver) { const uri = typeof value === "string" ? value : value.id; if (!uri) throw new Error("Missing note uri"); - const instanceMeta = await fetchMeta(); - if (instanceMeta.experimentalFeatures?.postEdits === false) { - throw new Error("Post edits disabled."); - } // Skip if URI points to this server if (uri.startsWith(`${config.url}/`)) throw new Error("uri points local"); diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index ad70310633..3193301275 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -476,9 +476,6 @@ export const meta = { optional: true, nullable: true, properties: { - postEditing: { - type: "boolean", - }, postImports: { type: "boolean", }, 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 b967112a5c..cf22c6c489 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -174,7 +174,6 @@ export const paramDef = { type: "object", nullable: true, properties: { - postEditing: { type: "boolean" }, postImports: { type: "boolean" }, }, }, diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts index f6c978b2de..673a0266c8 100644 --- a/packages/backend/src/server/api/endpoints/meta.ts +++ b/packages/backend/src/server/api/endpoints/meta.ts @@ -529,7 +529,7 @@ export default define(meta, paramDef, async (ps, me) => { github: instance.enableGithubIntegration, discord: instance.enableDiscordIntegration, serviceWorker: instance.enableServiceWorker, - postEditing: instance.experimentalFeatures?.postEditing || false, + postEditing: true, postImports: instance.experimentalFeatures?.postImports || false, miauth: true, }; diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 14ce2faafc..70c5ceffb4 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -140,12 +140,6 @@ export const meta = { code: "NOT_LOCAL_USER", id: "b907f407-2aa0-4283-800b-a2c56290b822", }, - - editsDisabled: { - message: "Post edits are disabled.", - code: "EDITS_DISABLED", - id: "99306f00-fb81-11ed-be56-0242ac120002", - }, }, } as const; @@ -244,11 +238,6 @@ export const paramDef = { export default define(meta, paramDef, async (ps, user) => { if (user.movedToUri != null) throw new ApiError(meta.errors.accountLocked); - const instanceMeta = await fetchMeta(); - if (instanceMeta.experimentalFeatures?.postEdits === false) { - throw new ApiError(meta.errors.editsDisabled); - } - if (!Users.isLocalUser(user)) { throw new ApiError(meta.errors.notLocalUser); } diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts index 18e04f4209..dbfb28ff6a 100644 --- a/packages/backend/src/server/nodeinfo.ts +++ b/packages/backend/src/server/nodeinfo.ts @@ -83,7 +83,7 @@ const nodeinfo2 = async () => { disableGlobalTimeline: meta.disableGlobalTimeline, emailRequiredForSignup: meta.emailRequiredForSignup, searchFilters: config.meilisearch ? true : false, - postEditing: meta.experimentalFeatures?.postEditing || false, + postEditing: true, postImports: meta.experimentalFeatures?.postImports || false, enableHcaptcha: meta.enableHcaptcha, enableRecaptcha: meta.enableRecaptcha, diff --git a/packages/client/src/pages/admin/experiments.vue b/packages/client/src/pages/admin/experiments.vue index 0c9a258cb4..32ce9bfae8 100644 --- a/packages/client/src/pages/admin/experiments.vue +++ b/packages/client/src/pages/admin/experiments.vue @@ -8,19 +8,6 @@ /></template> <MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> <FormSuspense :p="init"> - <FormSwitch - v-model="enablePostEditing" - @update:modelValue="save" - class="_formBlock" - > - <template #label> - <i class="ph-pencil-line ph-bold ph-lg"></i> - {{ i18n.ts._experiments.enablePostEditing }} - </template> - <template #caption>{{ - i18n.ts._experiments.postEditingCaption - }}</template> - </FormSwitch> <FormSwitch v-model="enablePostImports" @update:modelValue="save" @@ -49,13 +36,11 @@ import { fetchInstance } from "@/instance"; import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; -let enablePostEditing = $ref(false); let enablePostImports = $ref(false); let meta = $ref<MetaExperiments | null>(null); type MetaExperiments = { experimentalFeatures?: { - postEditing?: boolean; postImports?: boolean; }; }; @@ -64,14 +49,12 @@ async function init() { meta = (await os.api("admin/meta")) as MetaExperiments; if (!meta) return; - enablePostEditing = meta.experimentalFeatures?.postEditing ?? false; enablePostImports = meta.experimentalFeatures?.postImports ?? false; } function save() { const experiments: MetaExperiments = { experimentalFeatures: { - postEditing: enablePostEditing, postImports: enablePostImports, }, }; diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts index fa78c7ce54..75565a1ac3 100644 --- a/packages/client/src/scripts/get-note-menu.ts +++ b/packages/client/src/scripts/get-note-menu.ts @@ -408,7 +408,7 @@ export function getNoteMenu(props: { }, } : undefined, - instance.features.postEditing && isAppearAuthor + isAppearAuthor ? { icon: "ph-pencil-line ph-bold ph-lg", text: i18n.ts.edit, From cf3c3e823486c75277d258539a06bf6a7d25cac4 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 20:46:13 -0700 Subject: [PATCH 257/309] feat: :sparkles: celebrate on calendar when birthday --- packages/client/src/widgets/calendar.vue | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/client/src/widgets/calendar.vue b/packages/client/src/widgets/calendar.vue index 655308d504..1377b44bf0 100644 --- a/packages/client/src/widgets/calendar.vue +++ b/packages/client/src/widgets/calendar.vue @@ -5,7 +5,7 @@ <span class="year">{{ i18n.t("yearX", { year }) }}</span> <span class="month">{{ i18n.t("monthX", { month }) }}</span> </p> - <p v-if="month === 1 && day === 1" class="day"> + <p v-if="(month === 1 && day === 1) || isBirthday" class="day"> 🎉{{ i18n.t("dayX", { day }) }}<span style="display: inline-block; transform: scaleX(-1)" >🎉</span @@ -55,6 +55,7 @@ import { import { GetFormResultType } from "@/scripts/form"; import { i18n } from "@/i18n"; import { useInterval } from "@/scripts/use-interval"; +import { $i } from "@/account"; const name = "calendar"; @@ -80,6 +81,8 @@ const { widgetProps, configure } = useWidgetPropsManager( emit ); +const hasBirthday = Boolean($i?.birthday); + const year = ref(0); const month = ref(0); const day = ref(0); @@ -88,6 +91,7 @@ const yearP = ref(0); const monthP = ref(0); const dayP = ref(0); const isHoliday = ref(false); +const isBirthday = ref(false); const tick = () => { const now = new Date(); const nd = now.getDate(); @@ -121,6 +125,13 @@ const tick = () => { yearP.value = (yearNumer / yearDenom) * 100; isHoliday.value = now.getDay() === 0 || now.getDay() === 6; + + if (hasBirthday) { + const [bdayYear, bdayMonth, bdayDay] = $i.birthday.split("-"); + if (month.value === +bdayMonth && day.value == +bdayDay) { + isBirthday.value = true; + } + } }; useInterval(tick, 1000, { From 3d8fe32ef46f6ebf7205b86565e94ad6adaf1f8f Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 20:46:33 -0700 Subject: [PATCH 258/309] =?UTF-8?q?chore:=20=F0=9F=8E=A8=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/components/MkEmojiPickerDialog.vue | 5 ++--- packages/client/src/components/MkNotes.vue | 4 ++-- packages/client/src/components/MkTimeline.vue | 2 +- packages/client/src/pages/antenna-timeline.vue | 2 +- packages/client/src/pages/user/home.vue | 6 ++++-- packages/client/src/widgets/calendar.vue | 1 + 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/client/src/components/MkEmojiPickerDialog.vue b/packages/client/src/components/MkEmojiPickerDialog.vue index 8bbb4bb850..204505e89f 100644 --- a/packages/client/src/components/MkEmojiPickerDialog.vue +++ b/packages/client/src/components/MkEmojiPickerDialog.vue @@ -67,9 +67,8 @@ function chosen(emoji: any) { function opening() { try { picker.value?.reset(); - } - catch (e) { - console.error(`Something's wrong with restting the emoji picker: ${e}`) + } catch (e) { + console.error(`Something's wrong with restting the emoji picker: ${e}`); } picker.value?.focus(); } diff --git a/packages/client/src/components/MkNotes.vue b/packages/client/src/components/MkNotes.vue index 3ddcb6079b..5916621840 100644 --- a/packages/client/src/components/MkNotes.vue +++ b/packages/client/src/components/MkNotes.vue @@ -53,12 +53,12 @@ const props = defineProps<{ const pagingComponent = ref<InstanceType<typeof MkPagination>>(); function scrollTop() { - scroll(tlEl.value, { top: 0, behavior: 'smooth' }) + scroll(tlEl.value, { top: 0, behavior: "smooth" }); } defineExpose({ pagingComponent, - scrollTop + scrollTop, }); </script> diff --git a/packages/client/src/components/MkTimeline.vue b/packages/client/src/components/MkTimeline.vue index 81e4f575c6..8c57a29ef5 100644 --- a/packages/client/src/components/MkTimeline.vue +++ b/packages/client/src/components/MkTimeline.vue @@ -23,7 +23,7 @@ ref="tlComponent" :no-gap="!$store.state.showGapBetweenNotesInTimeline" :pagination="pagination" - @queue="(x) => queue = x" + @queue="(x) => (queue = x)" /> </template> diff --git a/packages/client/src/pages/antenna-timeline.vue b/packages/client/src/pages/antenna-timeline.vue index fbee993d32..a99ba68724 100644 --- a/packages/client/src/pages/antenna-timeline.vue +++ b/packages/client/src/pages/antenna-timeline.vue @@ -126,7 +126,7 @@ definePageMetadata( <style lang="scss" scoped> .tqmomfks { padding: var(--margin); - + > .tl { background: none; border-radius: var(--radius); diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index a8aa2844f5..12da28807e 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -24,7 +24,9 @@ <div ref="bannerEl" class="banner" - :style="{ backgroundImage: `url('${user.bannerUrl}')` }" + :style="{ + backgroundImage: `url('${user.bannerUrl}')`, + }" ></div> <div class="fade"></div> <div class="title"> @@ -510,7 +512,7 @@ onUnmounted(() => { background-size: cover; background-position: center; pointer-events: none; - filter: blur(12px) opacity(.1); + filter: blur(12px) opacity(0.1); } } diff --git a/packages/client/src/widgets/calendar.vue b/packages/client/src/widgets/calendar.vue index 1377b44bf0..aab03be9e9 100644 --- a/packages/client/src/widgets/calendar.vue +++ b/packages/client/src/widgets/calendar.vue @@ -92,6 +92,7 @@ const monthP = ref(0); const dayP = ref(0); const isHoliday = ref(false); const isBirthday = ref(false); + const tick = () => { const now = new Date(); const nd = now.getDate(); From 592894dbb0d8fc43afc4bd5b32ad96693760ad8a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 20:54:37 -0700 Subject: [PATCH 259/309] feat: :sparkles: add emoji count to admin panel --- .../client/src/pages/admin/overview.stats.vue | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/client/src/pages/admin/overview.stats.vue b/packages/client/src/pages/admin/overview.stats.vue index b6d9e0bf14..35f74953d1 100644 --- a/packages/client/src/pages/admin/overview.stats.vue +++ b/packages/client/src/pages/admin/overview.stats.vue @@ -22,7 +22,7 @@ :value="usersComparedToThePrevDay" ></MkNumberDiff> </div> - <div class="label">Users</div> + <div class="label">{{ i18n.ts.users }}</div> </div> </div> <div class="item _panel notes"> @@ -41,7 +41,7 @@ :value="notesComparedToThePrevDay" ></MkNumberDiff> </div> - <div class="label">Posts</div> + <div class="label">{{ i18n.ts.notes }}</div> </div> </div> <div class="item _panel instances"> @@ -55,7 +55,7 @@ style="margin-right: 0.5em" /> </div> - <div class="label">Instances</div> + <div class="label">{{ i18n.ts.instances }}</div> </div> </div> <div class="item _panel online"> @@ -69,10 +69,24 @@ style="margin-right: 0.5em" /> </div> - <div class="label">Online</div> + <div class="label">{{ i18n.ts.online }}</div> </div> </div> </div> + <div class="item _panel emojis"> + <div class="icon"> + <i class="ph-smiley ph-bold ph-xl"></i> + </div> + <div class="body"> + <div class="value"> + <MkNumber + :value="emojiCount" + style="margin-right: 0.5em" + /> + </div> + <div class="label">{{ i18n.ts.emojis }}</div> + </div> + </div> </Transition> </div> </template> @@ -90,6 +104,7 @@ let stats: any = $ref(null); let usersComparedToThePrevDay = $ref<number>(); let notesComparedToThePrevDay = $ref<number>(); let onlineUsersCount = $ref(0); +let emojiCount = $ref(0); let fetching = $ref(true); onMounted(async () => { @@ -110,6 +125,10 @@ onMounted(async () => { stats.originalNotesCount - chart.local.total[1]; }); + os.apiGet("meta").then((meta) => { + emojiCount = meta.emojis.length; + }); + fetching = false; }); </script> From ba680211ca2e71be2dcf3dd7bd9a265f621ab77a Mon Sep 17 00:00:00 2001 From: CGsama <CGsama@outlook.com> Date: Sat, 1 Jul 2023 23:58:36 -0400 Subject: [PATCH 260/309] Embedded all attachment, renotes and discussion history into rss feed content & improve title, and not generate feed for locked account --- packages/backend/src/server/web/feed.ts | 111 ++++++++++++++++++----- packages/backend/src/server/web/index.ts | 28 ++++-- 2 files changed, 106 insertions(+), 33 deletions(-) diff --git a/packages/backend/src/server/web/feed.ts b/packages/backend/src/server/web/feed.ts index 9cbeb28ae1..1d24345024 100644 --- a/packages/backend/src/server/web/feed.ts +++ b/packages/backend/src/server/web/feed.ts @@ -4,34 +4,40 @@ import config from "@/config/index.js"; import type { User } from "@/models/entities/user.js"; import { Notes, DriveFiles, UserProfiles, Users } from "@/models/index.js"; -export default async function (user: User) { +export default async function (user: User, threadDepth = 5, history = 20, noteintitle = false, renotes = true, replies = true) { const author = { link: `${config.url}/@${user.username}`, - name: user.name || user.username, + email: `${user.username}@${config.host}`, + name: user.name || user.username }; const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); + const searchCriteria = { + userId: user.id, + visibility: In(['public', 'home']), + }; + + if (!renotes) { + searchCriteria.renoteId = IsNull(); + } + + if (!replies) { + searchCriteria.replyId = IsNull(); + } + const notes = await Notes.find({ - where: { - userId: user.id, - renoteId: IsNull(), - visibility: In(["public", "home"]), - }, + where: searchCriteria, order: { createdAt: -1 }, - take: 20, + take: history, }); const feed = new Feed({ id: author.link, title: `${author.name} (@${user.username}@${config.host})`, updated: notes[0].createdAt, - generator: "Calckey", - description: `${user.notesCount} Notes, ${ - profile.ffVisibility === "public" ? user.followingCount : "?" - } Following, ${ - profile.ffVisibility === "public" ? user.followersCount : "?" - } Followers${profile.description ? ` · ${profile.description}` : ""}`, + generator: 'Calckey', + description: `${user.notesCount} Notes, ${profile.ffVisibility === 'public' ? user.followingCount : '?'} Following, ${profile.ffVisibility === 'public' ? user.followersCount : '?'} Followers${profile.description ? ` · ${profile.description}` : ''}`, link: author.link, image: await Users.getAvatarUrl(user), feedLinks: { @@ -43,23 +49,78 @@ export default async function (user: User) { }); for (const note of notes) { - const files = - note.fileIds.length > 0 - ? await DriveFiles.findBy({ - id: In(note.fileIds), - }) - : []; - const file = files.find((file) => file.type.startsWith("image/")); + let contentStr = await noteToString(note, true); + let next = note.renoteId ? note.renoteId : note.replyId; + let depth = threadDepth; + while (depth > 0 && next) { + const finding = await findById(next); + contentStr += finding.text; + next = finding.next; + depth -= 1; + } + + let title = `${author.name} `; + if (note.renoteId) { + title += 'renotes'; + } else if (note.replyId) { + title += 'replies'; + } else { + title += 'says'; + } + if (noteintitle) { + const content = note.cw ?? note.text; + if (content) { + title += `: ${content}`; + } else { + title += 'something'; + } + } feed.addItem({ - title: `New note by ${author.name}`, + title: title.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, '').substring(0,100), link: `${config.url}/notes/${note.id}`, date: note.createdAt, - description: note.cw || undefined, - content: note.text || undefined, - image: file ? DriveFiles.getPublicUrl(file) || undefined : undefined, + description: note.cw ? note.cw.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, '') : undefined, + content: contentStr.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, '') }); } + async function noteToString (note, isTheNote = false) { + const author = isTheNote ? null : await Users.findOneBy({ id: note.userId }); + let outstr = author ? `${author.name}(@${author.username}@${author.host ? author.host : config.host}) ${(note.renoteId ? 'renotes' : (note.replyId ? 'replies' : 'says'))}: <br>` : ''; + const files = note.fileIds.length > 0 ? await DriveFiles.findBy({ + id: In(note.fileIds), + }) : []; + let fileEle = ''; + for (const file of files) { + if (file.type.startsWith('image/')) { + fileEle += ` <br><img src="${DriveFiles.getPublicUrl(file)}">`; + } else if (file.type.startsWith('audio/')) { + fileEle += ` <br><audio controls src="${DriveFiles.getPublicUrl(file)}" type="${file.type}">`; + } else if (file.type.startsWith('video/')) { + fileEle += ` <br><video controls src="${DriveFiles.getPublicUrl(file)}" type="${file.type}">`; + } else { + fileEle += ` <br><a href="${DriveFiles.getPublicUrl(file)}" download="${file.name}">${file.name}</a>`; + } + } + outstr += `${note.cw ? note.cw + '<br>' : ''}${note.text || ''}${fileEle}`; + if (isTheNote) { + outstr += ` <span class="${(note.renoteId ? 'renote_note' : (note.replyId ? 'reply_note' : 'new_note'))} ${(fileEle.indexOf('img src') !== -1 ? 'with_img' : 'without_img')}"></span>`; + } + return outstr; + } + + async function findById (id) { + let text = ''; + let next = null; + const findings = await Notes.findOneBy({ id: id, visibility: In(['public', 'home']) }); + if (findings) { + text += `<hr>`; + text += await noteToString(findings); + next = findings.renoteId ? findings.renoteId : findings.replyId; + } + return { text, next }; + } + return feed; } diff --git a/packages/backend/src/server/web/index.ts b/packages/backend/src/server/web/index.ts index 55a125fac3..f54d1f495b 100644 --- a/packages/backend/src/server/web/index.ts +++ b/packages/backend/src/server/web/index.ts @@ -247,7 +247,7 @@ router.get("/api.json", async (ctx) => { ctx.body = genOpenapiSpec(); }); -const getFeed = async (acct: string) => { +const getFeed = async (acct: string, threadDepth:string, historyCount:string, noteInTitle:string, noRenotes:string, noReplies:string) => { const meta = await fetchMeta(); if (meta.privateMode) { return; @@ -257,14 +257,26 @@ const getFeed = async (acct: string) => { usernameLower: username.toLowerCase(), host: host ?? IsNull(), isSuspended: false, + isLocked:false, }); - - return user && (await packFeed(user)); + if (!user) { + return; + } + let thread = parseInt(threadDepth, 10); + if (isNaN(thread) || thread < 0 || thread > 30) { + thread = 3; + } + let history = parseInt(historyCount, 10); + //cant be 0 here or it will get all posts + if (isNaN(history) || history <= 0 || history > 30) { + history = 20; + } + return user && await packFeed(user, thread, history, !isNaN(noteInTitle), isNaN(noRenotes), isNaN(noReplies)); }; // As the /@user[.json|.rss|.atom]/sub endpoint is complicated, we will use a regex to switch between them. const reUser = new RegExp( - "^/@(?<user>[^/]+?)(?:.(?<feed>json|rss|atom))?(?:/(?<sub>[^/]+))?$", + "^/@(?<user>[^/]+?)(?:.(?<feed>json|rss|atom)(?:\\?[^/]*)?)?(?:/(?<sub>[^/]+))?$", ); router.get(reUser, async (ctx, next) => { const groups = reUser.exec(ctx.originalUrl)?.groups; @@ -275,7 +287,7 @@ router.get(reUser, async (ctx, next) => { ctx.params = groups; - console.log(ctx, ctx.params); + //console.log(ctx, ctx.params, ctx.query); if (groups.feed) { if (groups.sub) { await next(); @@ -301,7 +313,7 @@ router.get(reUser, async (ctx, next) => { // Atom const atomFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user); + const feed = await getFeed(ctx.params.user, ctx.query.thread, ctx.query.history, ctx.query.noteintitle, ctx.query.norenotes, ctx.query.noreplies); if (feed) { ctx.set("Content-Type", "application/atom+xml; charset=utf-8"); @@ -313,7 +325,7 @@ const atomFeed: Router.Middleware = async (ctx) => { // RSS const rssFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user); + const feed = await getFeed(ctx.params.user, ctx.query.thread, ctx.query.history, ctx.query.noteintitle, ctx.query.norenotes, ctx.query.noreplies); if (feed) { ctx.set("Content-Type", "application/rss+xml; charset=utf-8"); @@ -325,7 +337,7 @@ const rssFeed: Router.Middleware = async (ctx) => { // JSON const jsonFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user); + const feed = await getFeed(ctx.params.user, ctx.query.thread, ctx.query.history, ctx.query.noteintitle, ctx.query.norenotes, ctx.query.noreplies); if (feed) { ctx.set("Content-Type", "application/json; charset=utf-8"); From 097c93df3aa5dd8eb6d0c38bb1a0fc962495ac5c Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 21:02:01 -0700 Subject: [PATCH 261/309] chore: :busts_in_silhouette: patrons --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index 41c53f9851..9d3518a11d 100644 --- a/patrons.json +++ b/patrons.json @@ -75,6 +75,7 @@ "@renere@distance.blue", "@theking@kitsunes.club", "@toof@fedi.toofie.net", + "@punko@calckey.social", "\nInterkosmos Link" ] } From 6e17c0d7ef5fb7f91c36c885b06e59955fde24c4 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 21:03:11 -0700 Subject: [PATCH 262/309] drive todo --- packages/client/src/pages/admin/overview.stats.vue | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/client/src/pages/admin/overview.stats.vue b/packages/client/src/pages/admin/overview.stats.vue index 35f74953d1..3b17013e29 100644 --- a/packages/client/src/pages/admin/overview.stats.vue +++ b/packages/client/src/pages/admin/overview.stats.vue @@ -87,6 +87,7 @@ <div class="label">{{ i18n.ts.emojis }}</div> </div> </div> + <!-- TODO: Drive --> </Transition> </div> </template> @@ -191,6 +192,13 @@ onMounted(async () => { } } + &.drive { + > .icon { + background: #b4637a22; + color: #eb6f92; + } + } + > .body { padding: 2px 0; From b90c824f0c86a012660193afed07fd743d6df378 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 21:05:38 -0700 Subject: [PATCH 263/309] fix typo --- patrons.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patrons.json b/patrons.json index 9d3518a11d..17379798ff 100644 --- a/patrons.json +++ b/patrons.json @@ -75,7 +75,7 @@ "@renere@distance.blue", "@theking@kitsunes.club", "@toof@fedi.toofie.net", - "@punko@calckey.social", + "@Punko@calckey.social", "\nInterkosmos Link" ] } From 79765e4b19402a064d97dc958e1b43e2c9d672ac Mon Sep 17 00:00:00 2001 From: naskya <naskya@noreply.codeberg.org> Date: Sun, 2 Jul 2023 04:47:11 +0000 Subject: [PATCH 264/309] Please let me revert this (appearNote in getWordSoftMute) for now This reverts commit cda1c19454ee8aec4d29b55954129cf6f3716da8. --- packages/client/src/components/MkNote.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 1123035849..c615209eb0 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -338,7 +338,7 @@ const isMyRenote = $i && $i.id === note.userId; const showContent = ref(false); const isDeleted = ref(false); const muted = ref( - getWordSoftMute(appearNote, $i, defaultStore.state.mutedWords) + getWordSoftMute(note, $i, defaultStore.state.mutedWords) ); const translation = ref(null); const translating = ref(false); From 6c29a2ae0167538c9db8b59bf63d9bcc75b693fb Mon Sep 17 00:00:00 2001 From: Laura Hausmann <laura@hausmann.dev> Date: Sun, 2 Jul 2023 02:36:56 +0200 Subject: [PATCH 265/309] Fix mastodon api conversion for new note id type --- packages/backend/native-utils/src/mastodon_api.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/backend/native-utils/src/mastodon_api.rs b/packages/backend/native-utils/src/mastodon_api.rs index 57119ea73f..3016acd54f 100644 --- a/packages/backend/native-utils/src/mastodon_api.rs +++ b/packages/backend/native-utils/src/mastodon_api.rs @@ -13,18 +13,19 @@ pub enum IdConvertType { #[napi] pub fn convert_id(in_id: String, id_convert_type: IdConvertType) -> napi::Result<String> { + println!("converting id: {}", in_id); use IdConvertType::*; match id_convert_type { MastodonId => { - let mut out: i64 = 0; + let mut out: i128 = 0; for (i, c) in in_id.to_lowercase().chars().rev().enumerate() { - out += num_from_char(c)? as i64 * 36_i64.pow(i as u32); + out += num_from_char(c)? as i128 * 36_i128.pow(i as u32); } Ok(out.to_string()) } CalckeyId => { - let mut input: i64 = match in_id.parse() { + let mut input: i128 = match in_id.parse() { Ok(s) => s, Err(_) => { return Err(Error::new( From 9788fc0ce18e76e95c7a006620eda04307f2c914 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 22:21:48 -0700 Subject: [PATCH 266/309] chore: :busts_in_silhouette: patrons --- patrons.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/patrons.json b/patrons.json index 17379798ff..c2110a298e 100644 --- a/patrons.json +++ b/patrons.json @@ -76,6 +76,8 @@ "@theking@kitsunes.club", "@toof@fedi.toofie.net", "@Punko@calckey.social", + "@joesbrat67@calckey.social", + "@arth@calckey.social", "\nInterkosmos Link" ] } From 4b410194c2881e0dfa78e06e1070e159e1bbf0ac Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 22:35:38 -0700 Subject: [PATCH 267/309] fix --- .../client/src/pages/admin/overview.stats.vue | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/client/src/pages/admin/overview.stats.vue b/packages/client/src/pages/admin/overview.stats.vue index 3b17013e29..5b3c8d1022 100644 --- a/packages/client/src/pages/admin/overview.stats.vue +++ b/packages/client/src/pages/admin/overview.stats.vue @@ -74,18 +74,18 @@ </div> </div> <div class="item _panel emojis"> - <div class="icon"> - <i class="ph-smiley ph-bold ph-xl"></i> - </div> - <div class="body"> - <div class="value"> - <MkNumber - :value="emojiCount" - style="margin-right: 0.5em" - /> - </div> - <div class="label">{{ i18n.ts.emojis }}</div> + <div class="icon"> + <i class="ph-smiley ph-bold ph-xl"></i> + </div> + <div class="body"> + <div class="value"> + <MkNumber + :value="emojiCount" + style="margin-right: 0.5em" + /> </div> + <div class="label">{{ i18n.ts.emojis }}</div> + </div> </div> <!-- TODO: Drive --> </Transition> @@ -126,7 +126,7 @@ onMounted(async () => { stats.originalNotesCount - chart.local.total[1]; }); - os.apiGet("meta").then((meta) => { + os.api("meta", { detail: false }).then((meta) => { emojiCount = meta.emojis.length; }); From b5907fb86db2b9eacea633bb5d69547982326afa Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sat, 1 Jul 2023 22:37:28 -0700 Subject: [PATCH 268/309] chore: :art: format --- packages/client/src/components/MkNote.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index c615209eb0..18961bed42 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -337,9 +337,7 @@ let appearNote = $computed(() => const isMyRenote = $i && $i.id === note.userId; const showContent = ref(false); const isDeleted = ref(false); -const muted = ref( - getWordSoftMute(note, $i, defaultStore.state.mutedWords) -); +const muted = ref(getWordSoftMute(note, $i, defaultStore.state.mutedWords)); const translation = ref(null); const translating = ref(false); const enableEmojiReactions = defaultStore.state.enableEmojiReactions; From ac2b057f85e1f7cd012338872eaf0e62e17ed198 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sat, 1 Jul 2023 04:45:15 -0400 Subject: [PATCH 269/309] fix: use redis-semaphore for global mutex and memory leak prevention --- packages/backend/package.json | 1 - packages/backend/src/misc/emoji-meta.ts | 34 +++++---- pnpm-lock.yaml | 94 +++++++++++++++++++------ 3 files changed, 94 insertions(+), 35 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index b584a56910..fd5b2c3b3d 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -43,7 +43,6 @@ "ajv": "8.12.0", "archiver": "5.3.1", "argon2": "^0.30.3", - "async-mutex": "^0.4.0", "autobind-decorator": "2.4.0", "autolinker": "4.0.0", "autwh": "0.1.0", diff --git a/packages/backend/src/misc/emoji-meta.ts b/packages/backend/src/misc/emoji-meta.ts index fd9d9baa5c..0d385f72bc 100644 --- a/packages/backend/src/misc/emoji-meta.ts +++ b/packages/backend/src/misc/emoji-meta.ts @@ -1,30 +1,36 @@ import probeImageSize from "probe-image-size"; -import { Mutex, withTimeout } from "async-mutex"; +import { Mutex } from "redis-semaphore"; import { FILE_TYPE_BROWSERSAFE } from "@/const.js"; import Logger from "@/services/logger.js"; -import { Cache } from "./cache.js"; +import { redisClient } from "@/db/redis.js"; export type Size = { width: number; height: number; }; -const cache = new Cache<boolean>(1000 * 60 * 10); // once every 10 minutes for the same url -const mutex = withTimeout(new Mutex(), 1000); +const logger = new Logger("emoji"); export async function getEmojiSize(url: string): Promise<Size> { - const logger = new Logger("emoji"); + let attempted = true; - await mutex.runExclusive(() => { - const attempted = cache.get(url); + const lock = new Mutex(redisClient, "getEmojiSize"); + await lock.acquire(); + try { + const key = `getEmojiSize:${url}`; + attempted = await redisClient.get(key) !== null; if (!attempted) { - cache.set(url, true); - } else { - logger.warn(`Attempt limit exceeded: ${url}`); - throw new Error("Too many attempts"); + await redisClient.set(key, "done", "EX", 60 * 10); } - }); + } finally { + await lock.release(); + } + + if (attempted) { + logger.warn(`Attempt limit exceeded: ${url}`); + throw new Error("attempt limit exceeded"); + } try { logger.info(`Retrieving emoji size from ${url}`); @@ -32,11 +38,11 @@ export async function getEmojiSize(url: string): Promise<Size> { timeout: 5000, }); if (!(mime.startsWith("image/") && FILE_TYPE_BROWSERSAFE.includes(mime))) { - throw new Error("Unsupported image type"); + throw new Error("unsupported image type"); } return { width, height }; } catch (e) { - throw new Error(`Unable to retrieve metadata: ${e}`); + throw new Error(`unable to retrieve metadata: ${e}`); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1002a6f958..c7c0089ee9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,9 +132,6 @@ importers: argon2: specifier: ^0.30.3 version: 0.30.3 - async-mutex: - specifier: ^0.4.0 - version: 0.4.0 autobind-decorator: specifier: 2.4.0 version: 2.4.0 @@ -601,7 +598,7 @@ importers: version: 5.1.3 webpack: specifier: ^5.85.1 - version: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + version: 5.85.1(@swc/core@1.3.62) ws: specifier: 8.13.0 version: 8.13.0 @@ -4496,12 +4493,6 @@ packages: stream-exhaust: 1.0.2 dev: true - /async-mutex@0.4.0: - resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} - dependencies: - tslib: 2.6.0 - dev: false - /async-settle@1.0.0: resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} engines: {node: '>= 0.10'} @@ -4646,7 +4637,7 @@ packages: /axios@0.24.0: resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: false @@ -4662,7 +4653,7 @@ packages: /axios@1.2.2: resolution: {integrity: sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -4672,7 +4663,7 @@ packages: /axios@1.4.0: resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -6288,6 +6279,17 @@ packages: dependencies: ms: 2.0.0 + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + /debug@3.2.7(supports-color@8.1.1): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -6298,6 +6300,7 @@ packages: dependencies: ms: 2.1.3 supports-color: 8.1.1 + dev: true /debug@4.3.3: resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} @@ -7535,6 +7538,16 @@ packages: tabbable: 6.2.0 dev: true + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -7545,6 +7558,7 @@ packages: optional: true dependencies: debug: 4.3.4(supports-color@8.1.1) + dev: true /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -8455,7 +8469,7 @@ packages: engines: {node: '>= 4.5.0'} dependencies: agent-base: 4.3.0 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 transitivePeerDependencies: - supports-color dev: false @@ -9854,7 +9868,7 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack: 5.85.1(@swc/core@1.3.62) dev: true /json5@2.2.3: @@ -10097,7 +10111,7 @@ packages: resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} engines: {node: '>= 7.6.0'} dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 koa-send: 5.0.1 transitivePeerDependencies: - supports-color @@ -11091,7 +11105,7 @@ packages: engines: {node: '>= 4.4.x'} hasBin: true dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 iconv-lite: 0.4.24 sax: 1.2.4 transitivePeerDependencies: @@ -13997,7 +14011,7 @@ packages: webpack: '>=2' dependencies: '@swc/core': 1.3.62 - webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack: 5.85.1(@swc/core@1.3.62) dev: true /swiper@9.3.2: @@ -14118,7 +14132,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.18.2 - webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack: 5.85.1(@swc/core@1.3.62) dev: true /terser@5.18.2: @@ -14418,7 +14432,7 @@ packages: micromatch: 4.0.5 semver: 7.5.1 typescript: 5.1.3 - webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack: 5.85.1(@swc/core@1.3.62) dev: true /ts-node@10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3): @@ -15252,6 +15266,46 @@ packages: engines: {node: '>=10.13.0'} dev: true + /webpack@5.85.1(@swc/core@1.3.62): + resolution: {integrity: sha512-xTb7MRf4LY8Z5rzn7aIx4TDrwYJrjcHnIfU1TqtyZOoObyuGSpAUwIvVuqq5wPnv7WEgQr8UvO1q/dgoGG4HjA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.9.0 + acorn-import-assertions: 1.9.0(acorn@8.9.0) + browserslist: 4.21.9 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(@swc/core@1.3.62)(webpack@5.85.1) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /webpack@5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3): resolution: {integrity: sha512-xTb7MRf4LY8Z5rzn7aIx4TDrwYJrjcHnIfU1TqtyZOoObyuGSpAUwIvVuqq5wPnv7WEgQr8UvO1q/dgoGG4HjA==} engines: {node: '>=10.13.0'} From eee80b3ff6ddd3ee4222a0030ab793ea4543c14c Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sun, 2 Jul 2023 02:03:14 -0400 Subject: [PATCH 270/309] set log level to debug --- packages/backend/src/misc/emoji-meta.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/misc/emoji-meta.ts b/packages/backend/src/misc/emoji-meta.ts index 0d385f72bc..3bcc4262bc 100644 --- a/packages/backend/src/misc/emoji-meta.ts +++ b/packages/backend/src/misc/emoji-meta.ts @@ -19,7 +19,7 @@ export async function getEmojiSize(url: string): Promise<Size> { await lock.acquire(); try { const key = `getEmojiSize:${url}`; - attempted = await redisClient.get(key) !== null; + attempted = (await redisClient.get(key)) !== null; if (!attempted) { await redisClient.set(key, "done", "EX", 60 * 10); } @@ -33,7 +33,7 @@ export async function getEmojiSize(url: string): Promise<Size> { } try { - logger.info(`Retrieving emoji size from ${url}`); + logger.debug(`Retrieving emoji size from ${url}`); const { width, height, mime } = await probeImageSize(url, { timeout: 5000, }); From 17009455daa5a2d71b5667bbf75136ddad4408e0 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 00:16:01 -0700 Subject: [PATCH 271/309] fix: :bug: patron timeout --- packages/backend/src/server/api/endpoints/patrons.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/backend/src/server/api/endpoints/patrons.ts b/packages/backend/src/server/api/endpoints/patrons.ts index ac914daa12..353cba1dc0 100644 --- a/packages/backend/src/server/api/endpoints/patrons.ts +++ b/packages/backend/src/server/api/endpoints/patrons.ts @@ -23,8 +23,15 @@ export default define(meta, paramDef, async (ps) => { if (!ps.forceUpdate && cachedPatrons) { patrons = JSON.parse(cachedPatrons); } else { + AbortSignal.timeout ??= function timeout(ms) { + const ctrl = new AbortController() + setTimeout(() => ctrl.abort(), ms) + return ctrl.signal + } + patrons = await fetch( "https://codeberg.org/calckey/calckey/raw/branch/develop/patrons.json", + { signal: AbortSignal.timeout(2000) } ) .then((response) => response.json()) .catch(() => { From d3ccd00d5e2a251633e7a35ab3a80c8f97bcc9b1 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 00:20:14 -0700 Subject: [PATCH 272/309] me when codeberg --- packages/client/src/pages/about-calckey.vue | 7 ++++++- packages/client/src/pages/user/home.vue | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/about-calckey.vue b/packages/client/src/pages/about-calckey.vue index a8cee78d55..0a22dca4da 100644 --- a/packages/client/src/pages/about-calckey.vue +++ b/packages/client/src/pages/about-calckey.vue @@ -170,7 +170,12 @@ import { defaultStore } from "@/store"; import * as os from "@/os"; import { definePageMetadata } from "@/scripts/page-metadata"; -const patrons = await os.api("patrons", { forceUpdate: true }); +let patrons = []; +try { + patrons = await os.api("patrons", { forceUpdate: true }); +} catch { + console.error("Codeberg's down.") +} let easterEggReady = false; let easterEggEmojis = $ref([]); diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index 12da28807e..317656b662 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -451,7 +451,12 @@ const timeForThem = $computed(() => { return ""; }); -const patrons = await os.api("patrons"); +let patrons = []; +try { + patrons = await os.api("patrons"); +} catch { + console.error("Codeberg's down.") +} function parallaxLoop() { parallaxAnimationId = window.requestAnimationFrame(parallaxLoop); From 5004da0ea3e695f39751666edfb4a4194a146a0e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 00:47:55 -0700 Subject: [PATCH 273/309] adjust timeout for indexing notes --- packages/backend/src/queue/index.ts | 3 ++- .../backend/src/queue/processors/background/index-all-notes.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts index a84a446fe7..d7580a4f62 100644 --- a/packages/backend/src/queue/index.ts +++ b/packages/backend/src/queue/index.ts @@ -482,7 +482,8 @@ export function createCleanRemoteFilesJob() { export function createIndexAllNotesJob(data = {}) { return backgroundQueue.add("indexAllNotes", data, { removeOnComplete: true, - removeOnFail: true, + removeOnFail: false, + timeout: 1000 * 60 * 60 * 24, }); } 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 10c332aa3b..1dce4406a9 100644 --- a/packages/backend/src/queue/processors/background/index-all-notes.ts +++ b/packages/backend/src/queue/processors/background/index-all-notes.ts @@ -20,7 +20,7 @@ export default async function indexAllNotes( let total: number = (job.data.total as number) ?? 0; let running = true; - const take = 50000; + const take = 100000; const batch = 100; while (running) { logger.info( From f74c968714b19d12b67224a90105018b28083239 Mon Sep 17 00:00:00 2001 From: yawhn <yawhn@noreply.codeberg.org> Date: Sun, 2 Jul 2023 16:16:01 +0300 Subject: [PATCH 274/309] fix: temp fix for null metadata --- packages/client/src/components/global/MkPageHeader.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/global/MkPageHeader.vue b/packages/client/src/components/global/MkPageHeader.vue index f24d3de05a..c1ee84f4df 100644 --- a/packages/client/src/components/global/MkPageHeader.vue +++ b/packages/client/src/components/global/MkPageHeader.vue @@ -33,7 +33,7 @@ @click="showTabsPopup" > <MkAvatar - v-if="metadata.avatar" + v-if="metadata && metadata.avatar" class="avatar" :user="metadata.avatar" :show-indicator="true" @@ -91,7 +91,7 @@ </nav> </template> <div class="buttons right"> - <template v-if="metadata.avatar"> + <template v-if="metadata && metadata.avatar"> <MkFollowButton v-if="narrow" :user="metadata.avatar" From cb2046efacba57d9ba3a9ca1f83b7f94781f0aa3 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 09:26:03 -0700 Subject: [PATCH 275/309] fix: :bug: display emoji stat properly --- .../client/src/pages/admin/overview.stats.vue | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/client/src/pages/admin/overview.stats.vue b/packages/client/src/pages/admin/overview.stats.vue index 5b3c8d1022..172e346e70 100644 --- a/packages/client/src/pages/admin/overview.stats.vue +++ b/packages/client/src/pages/admin/overview.stats.vue @@ -72,21 +72,22 @@ <div class="label">{{ i18n.ts.online }}</div> </div> </div> - </div> - <div class="item _panel emojis"> - <div class="icon"> - <i class="ph-smiley ph-bold ph-xl"></i> - </div> - <div class="body"> - <div class="value"> - <MkNumber - :value="emojiCount" - style="margin-right: 0.5em" - /> + <div class="item _panel emojis"> + <div class="icon"> + <i class="ph-smiley ph-bold ph-xl"></i> + </div> + <div class="body"> + <div class="value"> + <MkNumber + :value="emojiCount" + style="margin-right: 0.5em" + /> + </div> + <div class="label">{{ i18n.ts.emojis }}</div> </div> - <div class="label">{{ i18n.ts.emojis }}</div> </div> </div> + <!-- TODO: Drive --> </Transition> </div> From 57b5fcff6df2acde6636beb6ac45e9e5cf0b1047 Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Sun, 2 Jul 2023 06:27:32 +0000 Subject: [PATCH 276/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1814 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index e482750f4a..a269a0d008 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -1601,6 +1601,8 @@ _aboutMisskey: morePatrons: També agraïm el suport de molts altres ajudants que no figuren aquí. Gràcies! 🥰 patrons: Mecenes de Calckey + patronsList: Llistats cronològicament, no per la quantitat donada. Fes una donació + amb l'enllaç de dalt per veure el teu nom aquí! unknown: Desconegut pageLikesCount: Nombre de pàgines amb M'agrada youAreRunningUpToDateClient: Estás fent servir la versió del client més nova. From f243a5ec506be555efc59f3b856838d58aaf9ca7 Mon Sep 17 00:00:00 2001 From: Poesty Li <poesty7450@gmail.com> Date: Sun, 2 Jul 2023 16:13:18 +0000 Subject: [PATCH 277/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 88.2% (1600 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index a6c9ec5a1e..27a500a8f4 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1,7 +1,7 @@ ---- _lang_: "简体中文" headlineMisskey: "通过帖子连接在一起的网络" -introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀" +introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n\ + 来探索新的世界吧!🚀" monthAndDay: "{month}月 {day}日" search: "搜索" notifications: "通知" @@ -166,7 +166,7 @@ selectUser: "选择用户" recipient: "收件人" annotation: "注解" federation: "联合" -instances: "实例" +instances: "服务器" registeredAt: "初次观测" latestRequestSentAt: "上次发送的请求" latestRequestReceivedAt: "上次收到的请求" @@ -321,7 +321,7 @@ dayX: "{day}日" monthX: "{month}月" yearX: "{year}年" pages: "页面" -integration: "关联" +integration: "整合" connectService: "连接" disconnectService: "断开连接" enableLocalTimeline: "启用本地时间线功能" @@ -643,7 +643,7 @@ instanceTicker: "帖子的实例信息" waitingFor: "等待{x}" random: "随机" system: "系统" -switchUi: "切换界面" +switchUi: "界面" desktop: "桌面" clip: "便签" createNew: "新建" @@ -816,7 +816,7 @@ controlPanel: "控制面板" manageAccounts: "管理账户" makeReactionsPublic: "将回应设置为公开" makeReactionsPublicDescription: "将您发表过的回应设置成公开可见。" -classic: "经典" +classic: "居中" muteThread: "屏蔽帖子列表" unmuteThread: "取消屏蔽帖子列表" ffVisibility: "连接的可见范围" @@ -896,7 +896,10 @@ shuffle: "随机" account: "账户" move: "移动" customKaTeXMacro: "自定义 KaTeX 宏" -customKaTeXMacroDescription: "使用宏来轻松的输入数学表达式吧!宏的用法与 LaTeX 中的命令定义相同。你可以使用 \\newcommand{\\name}{content} 或 \\newcommand{\\name}[number of arguments]{content} 来输入数学表达式。举个例子,\\newcommand{\\add}[2]{#1 + #2} 会将 \\add{3}{foo} 展开为 3 + foo。此外,宏名称外的花括号 {} 可以被替换为圆括号 () 和方括号 [],这会影响用于参数的括号。每行只能够定义一个宏,无法在中间换行,且无效的行将被忽略。只支持简单字符串替换功能,不支持高级语法,如条件分支等。" +customKaTeXMacroDescription: "使用宏来轻松的输入数学表达式吧!宏的用法与 LaTeX 中的命令定义相同。你可以使用 \\newcommand{\\ + name}{content} 或 \\newcommand{\\name}[number of arguments]{content} 来输入数学表达式。举个例子,\\ + newcommand{\\add}[2]{#1 + #2} 会将 \\add{3}{foo} 展开为 3 + foo。此外,宏名称外的花括号 {} 可以被替换为圆括号 + () 和方括号 [],这会影响用于参数的括号。每行只能够定义一个宏,无法在中间换行,且无效的行将被忽略。只支持简单字符串替换功能,不支持高级语法,如条件分支等。" enableCustomKaTeXMacro: "启用自定义 KaTeX 宏" _sensitiveMediaDetection: description: "可以使用机器学习技术自动检测敏感媒体,以便进行审核。服务器负载将略微增加。" @@ -1051,6 +1054,10 @@ _mfm: rotateDescription: "旋转指定的角度。" plain: "简洁" plainDescription: "禁用所有内部语法。" + crop: 裁剪 + scale: 缩放 + position: 位置 + fade: 渐淡 _instanceTicker: none: "不显示" remote: "仅远程用户" @@ -1325,7 +1332,7 @@ _poll: _visibility: public: "公开" publicDescription: "您的帖子将出现在全局时间线上" - home: "首页" + home: "不公开" homeDescription: "仅发送至首页的时间线" followers: "仅关注者" followersDescription: "仅发送至关注者" @@ -1395,6 +1402,7 @@ _timelines: local: "本地" social: "社交" global: "全局" + recommended: 推荐 _pages: newPage: "创建页面" editPage: "编辑页面" @@ -1749,3 +1757,12 @@ _deck: list: "列表" mentions: "提及" direct: "指定用户" + channel: 频道 +apps: 应用 +_messaging: + dms: 私信 + groups: 群组 +migration: 迁移 +_experiments: + title: 实验性功能 +license: 许可证 From ee1218b33612d53ce508c365903195f951edc02c Mon Sep 17 00:00:00 2001 From: Claire <baffling4945@outlook.com> Date: Sun, 2 Jul 2023 15:17:32 +0000 Subject: [PATCH 278/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 88.2% (1600 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 83 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 27a500a8f4..1dce98b2a8 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -16,7 +16,7 @@ enterUsername: "输入用户名" renotedBy: "由 {user} 转贴" noNotes: "没有帖文" noNotifications: "无通知" -instance: "实例" +instance: "服务器" settings: "设置" basicSettings: "基本设置" otherSettings: "其他设置" @@ -64,7 +64,7 @@ import: "导入" export: "导出" files: "文件" download: "下载" -driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会被删除。" +driveFileDeleteConfirm: "要删除文件「{name}」吗?它将被所有作为附件包含它的帖子中删除。" unfollowConfirm: "要取消对{name}的关注吗?" exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。" importRequested: "导入请求已提交,这可能需要花一点时间。" @@ -1766,3 +1766,82 @@ migration: 迁移 _experiments: title: 实验性功能 license: 许可证 +flagSpeakAsCatDescription: 在猫模式下你的帖子会喵化 +allowedInstances: 白名单服务器 +listsDesc: 列表可以让你创建含有指定用户的时间线,它们可以从时间线页面访问。 +flagSpeakAsCat: 像猫一样说话 +removeReaction: 移除你的回应 +expandOnNoteClick: 点击打开帖子 +expandOnNoteClickDesc: 如果禁用,你仍然可以在右键菜单中或通过点击时间戳打开帖子。 +sendPushNotificationReadMessage: 删除已阅读的推送通知 +customMOTD: 自定义 MOTD(闪屏消息) +sendPushNotificationReadMessageCaption: 短暂显示 "{emptyPushNotificationMessage}" 的通知,如果启用,可能会增加你的设备的耗电量。 +adminCustomCssWarn: 仅当你知道此设置的作用时才应使用它。输入不正确的值可能会导致每个人的客户端停止正常运行。请在用户设置中进行测试来确保您的 CSS + 正常工作。 +customMOTDDescription: 自定义MOTD(闪屏)消息,一行一个,每次用户加载/刷新页面时都会随机显示。 +customSplashIconsDescription: 用换行符隔开的自定义闪屏图标的URL,在用户每次加载/重新加载页面时随机显示。请确保图片是在一个静态的 + URL 上,最好全部调整为 192x192 的大小。 +recommendedInstancesDescription: 推荐的服务器以换行符分隔,它们将出现在推荐的时间线中。不要添加 "https://",仅添加域名。 +splash: 启动画面 +showUpdates: Calckey 更新后显示弹出窗口 +selectInstance: 选择一个服务器 +silencedInstances: 静默的服务器 +antennaInstancesDescription: 每行列出一个服务器主机 +pushNotification: 推送通知 +subscribePushNotification: 启用推送通知 +showAdminUpdates: 提示新的 Calckey 版本可用(仅对于管理员) +searchPlaceholder: 搜索 Calckey +addInstance: 添加一个服务器 +jumpToPrevious: 跳转至上一个 +silenceThisInstance: 使此服务器静音 +manageGroups: 管理群组 +antennasDesc: "天线会显示符合您设置条件的新帖子!\n可以从时间线页面访问它们。" +channelFederationWarn: 频道还没有与其他服务器联合 +seperateRenoteQuote: 单独的推荐和引用按钮 +customSplashIcons: 自定义闪屏图标(urls) +alt: 替代 +pushNotificationNotSupported: 你的浏览器或者服务器不支持推送通知 +showAds: 显示广告 +enterSendsMessage: 按回车键发送信息(关闭则是 Ctrl + Retun) +recommendedInstances: 推荐服务器 +updateAvailable: 可能有可用更新! +swipeOnMobile: 允许在页面之间滑动 +swipeOnDesktop: 允许在桌面端以移动设备方式滑动 +logoImageUrl: Logo 图像 URL +deleted: 已删除 +editNote: 编辑帖子 +edited: 于 {date} {time} 编辑 +selectChannel: 选择一个频道 +accountMoved: 用户已迁移至新账户: +silencedInstancesDescription: 列出你想静默的服务器的主机名。列出的服务器中的账户被视为 "静默",只能发出跟随请求,如果不被跟随,就不能提及本地账户。这不会影响被封锁的服务器。 +hiddenTags: 隐藏的哈希标签 +userSaysSomethingReason: '{name} 说 {reason}' +clipsDesc: 便签就像可共享的分类书签。您可以从各个帖子的菜单中创建便签。 +privateModeInfo: 当启用时,只有白名单上的服务器可以与你的服务器联合,所有的帖子都会对公共时间线隐藏。 +allowedInstancesDescription: 要列入联合白名单的服务器的主机名,一行一个(仅适用于私密模式)。 +breakFollowConfirm: 你确定要移除关注者吗? +caption: 自动显示说明文字 +newer: 更新的 +older: 更老的 +noInstances: 没有服务器 +silenced: 静默的 +accessibility: 无障碍 +secureMode: 安全模式(仅允许授权的拉取) +replayTutorial: 重播教程 +userSaysSomethingReasonReply: '{name} 回复了包含 {reason} 的帖子' +userSaysSomethingReasonQuote: '{name} 引用了一篇包含 {reason} 的帖子' +userSaysSomethingReasonRenote: '{name} 推荐了一个包含 {reason} 的帖子' +noThankYou: 不,谢谢 +secureModeInfo: 当向其他服务器请求时,不要在没有验证的情况下发回。 +privateMode: 私密模式 +instanceSecurity: 服务器安全 +image: 图像 +video: 视频 +audio: 音频 +cannotUploadBecauseExceedsFileSizeLimit: 无法上传此文件,因为它超出了允许的最大大小。 +unsubscribePushNotification: 禁用推送通知 +pushNotificationAlreadySubscribed: 推送通知已启用 +enableEmojiReactions: 启用 emoji 回应 +cw: 内容警告 +hiddenTagsDescription: 列出你想隐藏的话题标签(不带#)以避免在趋势和探索中显示。隐藏的标签仍然可以通过其他方式被发现。 +enableRecommendedTimeline: 启用推荐时间线 From 5ec419394d1267ca1ecc4e6b500a44c1b12c45f5 Mon Sep 17 00:00:00 2001 From: Poesty Li <poesty7450@gmail.com> Date: Sun, 2 Jul 2023 16:39:46 +0000 Subject: [PATCH 279/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 91.0% (1651 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 1dce98b2a8..50caa2818a 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -14,7 +14,7 @@ gotIt: "我明白了" cancel: "取消" enterUsername: "输入用户名" renotedBy: "由 {user} 转贴" -noNotes: "没有帖文" +noNotes: "没有帖子" noNotifications: "无通知" instance: "服务器" settings: "设置" @@ -186,14 +186,14 @@ jobQueue: "作业队列" cpuAndMemory: "CPU和内存" network: "网络" disk: "存储" -instanceInfo: "实例信息" +instanceInfo: "服务器信息" statistics: "统计" clearQueue: "清除队列" clearQueueConfirmTitle: "确定清除队列?" clearQueueConfirmText: "未送达的帖子将不会送达。 通常,您不需要这样做。" clearCachedFiles: "清除缓存" clearCachedFilesConfirm: "确定要清除缓存文件?" -blockedInstances: "被阻拦的实例" +blockedInstances: "已屏蔽的服务器" blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。" muteAndBlock: "屏蔽/拉黑" mutedUsers: "已屏蔽用户" @@ -309,8 +309,8 @@ unwatch: "取消关注" accept: "允许" reject: "拒绝" normal: "正常" -instanceName: "实例名称" -instanceDescription: "实例介绍" +instanceName: "服务器名称" +instanceDescription: "服务器简介" maintainerName: "管理员名称" maintainerEmail: "管理员电子邮箱" tosUrl: "服务条款URL" @@ -600,7 +600,7 @@ testEmail: "邮件发送测试" wordMute: "文字屏蔽" regexpError: "正则表达式错误" regexpErrorDescription: "{tab} 屏蔽文字的第 {line} 行的正则表达式有错误:" -instanceMute: "实例的屏蔽" +instanceMute: "服务器静音" userSaysSomething: "{name}说了什么" makeActive: "启用" display: "显示" @@ -701,7 +701,7 @@ showTitlebar: "显示标题栏" clearCache: "清除缓存" onlineUsersCount: "{n}人在线" nUsers: "{n}用户" -nNotes: "{n}帖子" +nNotes: "{n} 帖子" sendErrorReports: "发送错误报告" sendErrorReportsDescription: "启用后,如果出现问题,可以与Misskey共享详细的错误信息,从而帮助提高软件的质量。" myTheme: "我的主题" @@ -755,7 +755,7 @@ active: "活动" offline: "离线" notRecommended: "不推荐" botProtection: "Bot防御" -instanceBlocking: "被阻拦的实例" +instanceBlocking: "联邦管理" selectAccount: "选择账户" switchAccount: "切换账户" enabled: "已启用" @@ -1075,7 +1075,7 @@ _channel: owned: "管理中" following: "正在关注" usersCount: "有{n}人参与" - notesCount: "有{n}个帖子" + notesCount: "{n} 帖子" nameAndDescription: "名称与描述" nameOnly: "仅名称" _menuDisplay: @@ -1091,7 +1091,7 @@ _wordMute: hardDescription: "防止将具有指定条件的帖子添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。" soft: "软屏蔽" hard: "硬屏蔽" - mutedNotes: "被屏蔽的帖子" + mutedNotes: "已静音的帖子" _instanceMute: instanceMuteDescription: "屏蔽配置实例中的所有帖子和转帖,包括实例的用户回复。" instanceMuteDescription2: "设置时用换行符来分隔" @@ -1172,7 +1172,7 @@ _theme: accentLighten: "强调色(浅)" fgHighlighted: "高亮显示文本" _sfx: - note: "帖子" + note: "新的帖子" noteMy: "我的帖子" notification: "通知" chat: "聊天" @@ -1225,6 +1225,8 @@ _2fa: step3: "输入您的应用提供的动态口令以完成设置。" step4: "从现在开始,任何登录操作都将要求您提供动态口令。" securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。" + renewTOTPOk: 重新配置 + renewTOTPCancel: 取消 _permissions: "read:account": "查看账户信息" "write:account": "更改帐户信息" @@ -1799,7 +1801,7 @@ antennasDesc: "天线会显示符合您设置条件的新帖子!\n可以从时 channelFederationWarn: 频道还没有与其他服务器联合 seperateRenoteQuote: 单独的推荐和引用按钮 customSplashIcons: 自定义闪屏图标(urls) -alt: 替代 +alt: 替代文字 pushNotificationNotSupported: 你的浏览器或者服务器不支持推送通知 showAds: 显示广告 enterSendsMessage: 按回车键发送信息(关闭则是 Ctrl + Retun) @@ -1845,3 +1847,10 @@ enableEmojiReactions: 启用 emoji 回应 cw: 内容警告 hiddenTagsDescription: 列出你想隐藏的话题标签(不带#)以避免在趋势和探索中显示。隐藏的标签仍然可以通过其他方式被发现。 enableRecommendedTimeline: 启用推荐时间线 +_skinTones: + medium: 中等 + light: 浅色 + yellow: 黄色 + dark: 深色 +isModerator: 监察员 +isAdmin: 管理员 From 5567dbb3c3778241bb9d9fc70ad0c57af5409b26 Mon Sep 17 00:00:00 2001 From: Claire <baffling4945@outlook.com> Date: Sun, 2 Jul 2023 16:36:33 +0000 Subject: [PATCH 280/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 91.0% (1651 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 50caa2818a..6d84d1147e 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1854,3 +1854,28 @@ _skinTones: dark: 深色 isModerator: 监察员 isAdmin: 管理员 +findOtherInstance: 寻找其它服务器 +moveFromDescription: 这将为您的旧帐户设置一个别名,以便您可以从该旧帐户转移到当前帐户。在从旧帐户转移之前执行此操作。请输入格式如@person@server.com + 的帐户标签 +indexPosts: 索引帖子 +signupsDisabled: 该服务器目前关闭注册,但您随时可以在另一台服务器上注册!如果您有该服务器的邀请码,请在下面输入。 +silencedWarning: 显示这个页面是因为这些用户来自你的管理员设置的静默服务器,所以他们有可能是垃圾信息。 +isBot: 这个账户是一个机器人 +moveAccountDescription: 这个过程是不可逆的。在移动之前,请确保您已在新帐户上为当前帐户设置了别名。请输入格式如 @person@server.com + 帐户标签 +moveFromLabel: 您要移出的旧帐户: +preventAiLearning: 阻止 AI 机器人抓取 +preventAiLearningDescription: 请求第三方人工智能语言模型不要研究您上传的内容,例如帖子和图像。 +noGraze: 请禁用 "Graze for Mastodon" 浏览器扩展,因为它会干扰 Calckey。 +moveTo: 将当前帐户移至新帐户 +moveToLabel: 你要迁移到的目标帐户: +moveAccount: 移动账户! +migrationConfirm: "你确实确定要将帐户迁移到 {account} 吗?此操作无法撤消,并且你将无法再次正常使用旧账户。\n另外,请确保你已将此当前帐户设置为要移出的帐户。" +indexFromDescription: 留空以索引每个帖子 +noteId: 帖子 ID +moveFrom: 从旧帐户移至此帐户 +defaultReaction: 发出和收到的帖子的默认表情符号反应 +indexNotice: 现在开始索引。这可能需要一段时间,请至少一个小时内不要重新启动服务器。 +indexFrom: 从帖子 ID 开始的索引 +sendModMail: 发送审核通知 +isLocked: 该帐户设置了关注请求 From 90f4ab9739af67df51e7a54b20659539dd7811f0 Mon Sep 17 00:00:00 2001 From: Claire <baffling4945@outlook.com> Date: Sun, 2 Jul 2023 16:45:27 +0000 Subject: [PATCH 281/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 94.7% (1719 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 6d84d1147e..7577819cc8 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -984,6 +984,7 @@ _aboutMisskey: donate: "赞助Misskey" morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰" patrons: "支持者" + patronsList: 按时间顺序而不是捐赠金额排列。通过上面的链接捐款,让您的名字出现在这里! _nsfw: respect: "隐藏敏感内容" ignore: "不隐藏敏感内容" @@ -1058,6 +1059,20 @@ _mfm: scale: 缩放 position: 位置 fade: 渐淡 + advanced: 高级 MFM + background: 背景色 + fadeDescription: 内容淡入和淡出。 + warn: MFM 可能包含快速移动或华丽的动画 + advancedDescription: 如果禁用,则仅允许基本标记,除非正在播放动态 MFM + foreground: 前景色 + backgroundDescription: 更改文本的背景色。 + play: 播放 MFM + alwaysPlay: 始终自动播放所有动态的 MFM + stop: 停止播放 MFM + positionDescription: 将内容移动指定的量。 + cropDescription: 裁剪内容。 + scaleDescription: 按指定量缩放内容。 + foregroundDescription: 更改文本的前景色。 _instanceTicker: none: "不显示" remote: "仅远程用户" @@ -1066,6 +1081,7 @@ _serverDisconnectedBehavior: reload: "自动重载" dialog: "对话框警告" quiet: "安静警告" + nothing: 什么也不做 _channel: create: "创建频道" edit: "编辑频道" @@ -1227,6 +1243,19 @@ _2fa: securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。" renewTOTPOk: 重新配置 renewTOTPCancel: 取消 + token: 2FA 令牌 + renewTOTP: 重新配置身份验证器应用程序 + registerTOTPBeforeKey: 请设置一个认证器应用来注册一个安全或通行密钥。 + renewTOTPConfirm: 这将导致您之前的应用程序中的验证码停止工作 + step3Title: 输入验证码 + step2Click: 点击此二维码将允许您在安全密钥或手机验证器应用中注册 2FA。 + securityKeyNotSupported: 您的浏览器不支持安全密钥。 + securityKeyName: 输入密钥名称 + chromePasskeyNotSupported: 目前不支持 Chrome passkeys。 + tapSecurityKey: 请按照您的浏览器的指示注册安全或通行密钥 + removeKey: 移除安全密钥 + removeKeyConfirm: 真的要删除 {name} 密钥吗? + whyTOTPOnlyRenew: 只要注册了安全密钥,就无法删除身份验证器应用程序。 _permissions: "read:account": "查看账户信息" "write:account": "更改帐户信息" @@ -1267,12 +1296,15 @@ _auth: pleaseGoBack: "请返回到应用程序" callback: "回到应用程序" denied: "拒绝访问" + allPermissions: 完全的账户访问权限 + copyAsk: 请将以下授权码粘贴到应用程序中: _antennaSources: all: "所有帖子" homeTimeline: "已关注用户的帖子" users: "来自指定用户的帖子" userList: "来自指定列表中的帖子" userGroup: "来自指定群组中用户的帖子" + instances: 服务器上所有用户的帖子 _weekday: sunday: "星期日" monday: "星期一" @@ -1852,7 +1884,7 @@ _skinTones: light: 浅色 yellow: 黄色 dark: 深色 -isModerator: 监察员 +isModerator: 协作者 isAdmin: 管理员 findOtherInstance: 寻找其它服务器 moveFromDescription: 这将为您的旧帐户设置一个别名,以便您可以从该旧帐户转移到当前帐户。在从旧帐户转移之前执行此操作。请输入格式如@person@server.com @@ -1879,3 +1911,13 @@ indexNotice: 现在开始索引。这可能需要一段时间,请至少一个 indexFrom: 从帖子 ID 开始的索引 sendModMail: 发送审核通知 isLocked: 该帐户设置了关注请求 +_filters: + notesBefore: 在之前的帖子 + followingOnly: 仅关注中 + notesAfter: 在之后的帖子 + fromDomain: 来自域名 + withFile: 带有文件 + fromUser: 来自用户 + followersOnly: 仅关注者 +reactionPickerSkinTone: 首选的表情符号肤色 +isPatron: Calckey 赞助 From 196eaaa58015418a1b0059328b1da6736f546b3b Mon Sep 17 00:00:00 2001 From: Poesty Li <poesty7450@gmail.com> Date: Sun, 2 Jul 2023 16:45:01 +0000 Subject: [PATCH 282/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 94.7% (1719 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 7577819cc8..6870571be8 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1201,7 +1201,7 @@ _ago: secondsAgo: "{n}秒前" minutesAgo: "{n}分前" hoursAgo: "{n}小时前" - daysAgo: "{n}日前" + daysAgo: "{n}天前" weeksAgo: "{n}周前" monthsAgo: "{n}月前" yearsAgo: "{n}年前" @@ -1321,21 +1321,26 @@ _widgets: trends: "趋势" clock: "时钟" rss: "RSS阅读器" - rssTicker: "RSS Ticker" + rssTicker: "RSS滚动条" activity: "活动" photos: "照片" digitalClock: "数字时钟" unixClock: "UNIX时钟" federation: "联邦宇宙" - instanceCloud: "实例云" - postForm: "投稿窗口" + instanceCloud: "服务器云端" + postForm: "发布窗口" slideshow: "幻灯片展示" button: "按钮" onlineUsers: "在线用户" jobQueue: "作业队列" - serverMetric: "服务器监控" + serverMetric: "服务器指标" aiscript: "AiScript控制台" aichan: "小蓝" + userList: 用户列表 + meiliStatus: 服务器状态 + meiliIndexCount: 已索引的帖子 + meiliSize: 索引大小 + serverInfo: 服务器信息 _cw: hide: "隐藏" show: "查看更多" @@ -1775,9 +1780,9 @@ _deck: stackLeft: "向左折叠" popRight: "向右弹出" profile: "配置文件" - newProfile: "新建配置文件" + newProfile: "新建工作区" renameProfile: "重命名配置文件" - deleteProfile: "删除配置文件" + deleteProfile: "删除工作区" nameAlreadyExists: "该配置文件名已存在。" introduction: "将各列进行组合以创建您自己的界面!" introduction2: "您可以随时通过屏幕右侧的 + 来添加列" @@ -1790,7 +1795,7 @@ _deck: antenna: "天线" list: "列表" mentions: "提及" - direct: "指定用户" + direct: "私信" channel: 频道 apps: 应用 _messaging: From a41f537970d0dc70bcc2b4c4480b2edca872d971 Mon Sep 17 00:00:00 2001 From: Essem <smswessem@gmail.com> Date: Thu, 8 Jun 2023 10:27:44 -0500 Subject: [PATCH 283/309] Add aria labels to notification buttons --- packages/client/src/widgets/notifications.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/client/src/widgets/notifications.vue b/packages/client/src/widgets/notifications.vue index 48fb9278a9..82fb961686 100644 --- a/packages/client/src/widgets/notifications.vue +++ b/packages/client/src/widgets/notifications.vue @@ -12,10 +12,15 @@ <template #func ><button class="_button" + :aria-label="i18n.ts.markAllAsRead" @click="os.apiWithDialog('notifications/mark-all-as-read')" > <i class="ph-check ph-bold ph-lg"></i></button - ><button class="_button" @click="configureNotification()"> + ><button + class="_button" + :aria-label="i18n.ts.notificationSetting" + @click="configureNotification()" + > <i class="ph-gear-six ph-bold ph-lg"></i></button ></template> <div> From cd121790b9f725ccadab21bbd3f0bff2dc827249 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 2 Jul 2023 13:01:50 -0400 Subject: [PATCH 284/309] style: visible button w/out hovering in url preview --- packages/client/src/components/MkUrlPreview.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index f20d117259..ec6933c8fd 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -56,7 +56,7 @@ <span> <span :title="sitename || undefined"> <img v-if="icon" class="icon" :src="icon" /> - {{ sitename }}: + {{ sitename }} </span> {{ description }} </span> @@ -220,7 +220,7 @@ onUnmounted(() => { padding: 14px; border-radius: var(--radius); transform: scale(0.95); - opacity: 0; + opacity: 0.8; transition: transform 0.2s, opacity 0.2s, background 0.2s; } &:hover, From 63c193f9fc14e09a452eb66a8f7b73a6c97178a7 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 10:10:25 -0700 Subject: [PATCH 285/309] Revert "Merge pull request '[PR]: fix: use redis-based mutex to prevent memory leak' (#10389) from nmkj/calckey:fix-cache-leak into develop" This reverts commit 224b1d585bb1cb95531a9213cf4a69fc2f049e7d, reversing changes made to b5907fb86db2b9eacea633bb5d69547982326afa. --- packages/backend/package.json | 1 + packages/backend/src/misc/emoji-meta.ts | 36 ++++------ pnpm-lock.yaml | 94 ++++++------------------- 3 files changed, 36 insertions(+), 95 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index fd5b2c3b3d..b584a56910 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -43,6 +43,7 @@ "ajv": "8.12.0", "archiver": "5.3.1", "argon2": "^0.30.3", + "async-mutex": "^0.4.0", "autobind-decorator": "2.4.0", "autolinker": "4.0.0", "autwh": "0.1.0", diff --git a/packages/backend/src/misc/emoji-meta.ts b/packages/backend/src/misc/emoji-meta.ts index 3bcc4262bc..fd9d9baa5c 100644 --- a/packages/backend/src/misc/emoji-meta.ts +++ b/packages/backend/src/misc/emoji-meta.ts @@ -1,48 +1,42 @@ import probeImageSize from "probe-image-size"; -import { Mutex } from "redis-semaphore"; +import { Mutex, withTimeout } from "async-mutex"; import { FILE_TYPE_BROWSERSAFE } from "@/const.js"; import Logger from "@/services/logger.js"; -import { redisClient } from "@/db/redis.js"; +import { Cache } from "./cache.js"; export type Size = { width: number; height: number; }; -const logger = new Logger("emoji"); +const cache = new Cache<boolean>(1000 * 60 * 10); // once every 10 minutes for the same url +const mutex = withTimeout(new Mutex(), 1000); export async function getEmojiSize(url: string): Promise<Size> { - let attempted = true; + const logger = new Logger("emoji"); - const lock = new Mutex(redisClient, "getEmojiSize"); - await lock.acquire(); - try { - const key = `getEmojiSize:${url}`; - attempted = (await redisClient.get(key)) !== null; + await mutex.runExclusive(() => { + const attempted = cache.get(url); if (!attempted) { - await redisClient.set(key, "done", "EX", 60 * 10); + cache.set(url, true); + } else { + logger.warn(`Attempt limit exceeded: ${url}`); + throw new Error("Too many attempts"); } - } finally { - await lock.release(); - } - - if (attempted) { - logger.warn(`Attempt limit exceeded: ${url}`); - throw new Error("attempt limit exceeded"); - } + }); try { - logger.debug(`Retrieving emoji size from ${url}`); + logger.info(`Retrieving emoji size from ${url}`); const { width, height, mime } = await probeImageSize(url, { timeout: 5000, }); if (!(mime.startsWith("image/") && FILE_TYPE_BROWSERSAFE.includes(mime))) { - throw new Error("unsupported image type"); + throw new Error("Unsupported image type"); } return { width, height }; } catch (e) { - throw new Error(`unable to retrieve metadata: ${e}`); + throw new Error(`Unable to retrieve metadata: ${e}`); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7c0089ee9..1002a6f958 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,6 +132,9 @@ importers: argon2: specifier: ^0.30.3 version: 0.30.3 + async-mutex: + specifier: ^0.4.0 + version: 0.4.0 autobind-decorator: specifier: 2.4.0 version: 2.4.0 @@ -598,7 +601,7 @@ importers: version: 5.1.3 webpack: specifier: ^5.85.1 - version: 5.85.1(@swc/core@1.3.62) + version: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) ws: specifier: 8.13.0 version: 8.13.0 @@ -4493,6 +4496,12 @@ packages: stream-exhaust: 1.0.2 dev: true + /async-mutex@0.4.0: + resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} + dependencies: + tslib: 2.6.0 + dev: false + /async-settle@1.0.0: resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} engines: {node: '>= 0.10'} @@ -4637,7 +4646,7 @@ packages: /axios@0.24.0: resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) transitivePeerDependencies: - debug dev: false @@ -4653,7 +4662,7 @@ packages: /axios@1.2.2: resolution: {integrity: sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -4663,7 +4672,7 @@ packages: /axios@1.4.0: resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -6279,17 +6288,6 @@ packages: dependencies: ms: 2.0.0 - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: false - /debug@3.2.7(supports-color@8.1.1): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -6300,7 +6298,6 @@ packages: dependencies: ms: 2.1.3 supports-color: 8.1.1 - dev: true /debug@4.3.3: resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} @@ -7538,16 +7535,6 @@ packages: tabbable: 6.2.0 dev: true - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -7558,7 +7545,6 @@ packages: optional: true dependencies: debug: 4.3.4(supports-color@8.1.1) - dev: true /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -8469,7 +8455,7 @@ packages: engines: {node: '>= 4.5.0'} dependencies: agent-base: 4.3.0 - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: false @@ -9868,7 +9854,7 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.85.1(@swc/core@1.3.62) + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true /json5@2.2.3: @@ -10111,7 +10097,7 @@ packages: resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} engines: {node: '>= 7.6.0'} dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) koa-send: 5.0.1 transitivePeerDependencies: - supports-color @@ -11105,7 +11091,7 @@ packages: engines: {node: '>= 4.4.x'} hasBin: true dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) iconv-lite: 0.4.24 sax: 1.2.4 transitivePeerDependencies: @@ -14011,7 +13997,7 @@ packages: webpack: '>=2' dependencies: '@swc/core': 1.3.62 - webpack: 5.85.1(@swc/core@1.3.62) + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true /swiper@9.3.2: @@ -14132,7 +14118,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.18.2 - webpack: 5.85.1(@swc/core@1.3.62) + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true /terser@5.18.2: @@ -14432,7 +14418,7 @@ packages: micromatch: 4.0.5 semver: 7.5.1 typescript: 5.1.3 - webpack: 5.85.1(@swc/core@1.3.62) + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true /ts-node@10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3): @@ -15266,46 +15252,6 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.85.1(@swc/core@1.3.62): - resolution: {integrity: sha512-xTb7MRf4LY8Z5rzn7aIx4TDrwYJrjcHnIfU1TqtyZOoObyuGSpAUwIvVuqq5wPnv7WEgQr8UvO1q/dgoGG4HjA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.9.0 - acorn-import-assertions: 1.9.0(acorn@8.9.0) - browserslist: 4.21.9 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.62)(webpack@5.85.1) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - /webpack@5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3): resolution: {integrity: sha512-xTb7MRf4LY8Z5rzn7aIx4TDrwYJrjcHnIfU1TqtyZOoObyuGSpAUwIvVuqq5wPnv7WEgQr8UvO1q/dgoGG4HjA==} engines: {node: '>=10.13.0'} From 71ca2e631e108be6c5d3efbe183fee08217fdc03 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 10:18:36 -0700 Subject: [PATCH 286/309] =?UTF-8?q?chore:=20=F0=9F=91=A5=20patrons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index c2110a298e..54ea682713 100644 --- a/patrons.json +++ b/patrons.json @@ -78,6 +78,7 @@ "@Punko@calckey.social", "@joesbrat67@calckey.social", "@arth@calckey.social", + "@octofloofy@ck.octofloofy.ink", "\nInterkosmos Link" ] } From a147d56ae7f311a017e69b3f4b4e9549749bfa21 Mon Sep 17 00:00:00 2001 From: Essem <smswessem@gmail.com> Date: Sun, 25 Jun 2023 19:58:01 -0500 Subject: [PATCH 287/309] Render instance description as HTML --- packages/client/src/pages/about.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue index 9234273a65..205f86cd48 100644 --- a/packages/client/src/pages/about.vue +++ b/packages/client/src/pages/about.vue @@ -52,9 +52,9 @@ <MkKeyValue class="_formBlock"> <template #key>{{ i18n.ts.description }}</template> - <template #value>{{ - $instance.description - }}</template> + <template #value + ><div v-html="$instance.description"></div + ></template> </MkKeyValue> <FormSection> From 0cac6f018d3501b3417276dc0773b6579620aea0 Mon Sep 17 00:00:00 2001 From: Syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Jul 2023 16:20:40 -0700 Subject: [PATCH 288/309] =?UTF-8?q?refactor:=20=E2=9A=A1=20make=20identico?= =?UTF-8?q?ns=20and=20server=20metrics=20optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kainoa Kanter <kainoa@t1c.dev> --- locales/en-US.yml | 2 + locales/ja-JP.yml | 46 +++++++++--------- packages/backend/assets/avatar.png | Bin 0 -> 14059 bytes .../1688280713783-add-meta-options.js | 21 ++++++++ packages/backend/src/daemons/server-stats.ts | 4 ++ packages/backend/src/models/entities/meta.ts | 10 ++++ .../src/server/api/endpoints/admin/meta.ts | 12 +++++ .../src/server/api/endpoints/server-info.ts | 21 +++++++- packages/backend/src/server/index.ts | 15 ++++-- packages/client/src/pages/admin/settings.vue | 17 +++++++ .../src/widgets/server-metric/index.vue | 2 +- 11 files changed, 122 insertions(+), 28 deletions(-) create mode 100644 packages/backend/assets/avatar.png create mode 100644 packages/backend/migration/1688280713783-add-meta-options.js diff --git a/locales/en-US.yml b/locales/en-US.yml index d493f332f5..c6c442df7c 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1112,6 +1112,8 @@ isModerator: "Moderator" isAdmin: "Administrator" isPatron: "Calckey Patron" reactionPickerSkinTone: "Preferred emoji skin tone" +enableServerMachineStats: "Enable server hardware statistics" +enableIdenticonGeneration: "Enable Identicon generation" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fa3c3f1cc1..b3bfa6665a 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1,6 +1,6 @@ _lang_: "日本語" headlineMisskey: "ずっと無料でオープンソースの非中央集権型ソーシャルメディアプラットフォーム🚀" -introMisskey: "ようこそ!Calckeyは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n\ +introMisskey: "ようこそ!Firefishは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n\ 「リアクション」機能で、皆の投稿に素早く反応を追加できます👍\n新しい世界を探検しよう🚀" monthAndDay: "{month}月 {day}日" search: "検索" @@ -146,7 +146,7 @@ settingGuide: "おすすめ設定" cacheRemoteFiles: "リモートのファイルをキャッシュする" cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクします。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。" flagAsBot: "Botとして設定" -flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Calckeyのシステム上での扱いがBotに合ったものになります。" +flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Firefishのシステム上での扱いがBotに合ったものになります。" flagAsCat: "あなたは…猫?😺" flagAsCatDescription: "このアカウントが猫であることを示す猫モードを有効にするには、このフラグをオンにします。" flagSpeakAsCat: "猫語で話す" @@ -213,7 +213,7 @@ noInstances: "サーバーがありません" editProfile: "プロフィールを編集" noteDeleteConfirm: "この投稿を削除しますか?" pinLimitExceeded: "これ以上ピン留めできません" -intro: "Calckeyのインストールが完了しました!管理者アカウントを作成しましょう。" +intro: "Firefishのインストールが完了しました!管理者アカウントを作成しましょう。" done: "完了" processing: "処理中" preview: "プレビュー" @@ -396,7 +396,7 @@ exploreFediverse: "Fediverseを探索" popularTags: "人気のタグ" userList: "リスト" about: "情報" -aboutMisskey: "Calckeyについて" +aboutMisskey: "Firefishについて" administrator: "管理者" token: "トークン" twoStepAuthentication: "二段階認証" @@ -543,7 +543,7 @@ sort: "ソート" ascendingOrder: "昇順" descendingOrder: "降順" scratchpad: "スクラッチパッド" -scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Calckeyと対話するコードの記述、実行、結果の確認ができます。" +scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Firefishと対話するコードの記述、実行、結果の確認ができます。" output: "出力" script: "スクリプト" disablePagesScript: "ページのスクリプトを無効にする" @@ -672,7 +672,7 @@ createNewClip: "新しいクリップを作成" unclip: "クリップ解除" confirmToUnclipAlreadyClippedNote: "この投稿はすでにクリップ「{name}」に含まれています。投稿をこのクリップから除外しますか?" public: "公開" -i18nInfo: "Calckeyは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。" +i18nInfo: "Firefishは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。" manageAccessTokens: "アクセストークンの管理" accountInfo: "アカウント情報" notesCount: "投稿の数" @@ -723,7 +723,7 @@ onlineUsersCount: "{n}人がオンライン" nUsers: "{n}ユーザー" nNotes: "{n}投稿" sendErrorReports: "エラーリポートを送信" -sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がCalckeyに共有され、ソフトウェアの品質向上に役立てられます。\n\ +sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がFirefishに共有され、ソフトウェアの品質向上に役立てられます。\n\ エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。" myTheme: "マイテーマ" backgroundColor: "背景" @@ -824,7 +824,7 @@ hashtags: "ハッシュタグ" troubleshooting: "トラブルシューティング" useBlurEffect: "UIにぼかし効果を使用" learnMore: "詳しく" -misskeyUpdated: "Calckeyが更新されました!" +misskeyUpdated: "Firefishが更新されました!" whatIsNew: "更新情報を見る" translate: "翻訳" translatedFrom: "{x}から翻訳" @@ -944,7 +944,7 @@ customMOTDDescription: "ユーザがページをロード/リロードするた customSplashIcons: "カスタムスプラッシュスクリーンアイコン" customSplashIconsDescription: "ユーザがページをロード/リロードするたびにランダムに表示される、改行で区切られたカスタムスプラッシュスクリーンアイコンの URL。画像は静的なURLで、できればすべて192x192にリサイズしてください。" -showUpdates: "Calckeyの更新時にポップアップを表示する" +showUpdates: "Firefishの更新時にポップアップを表示する" recommendedInstances: "おすすめサーバー" recommendedInstancesDescription: "おすすめタイムラインに表示するサーバーを改行区切りで入力してください。`https://`は書かず、ドメインのみを入力してください。" caption: "自動キャプション" @@ -952,7 +952,7 @@ splash: "スプラッシュスクリーン" updateAvailable: "アップデートがありますよ!" swipeOnDesktop: "デスクトップでモバイルスタイルのスワイプを可能にする" logoImageUrl: "ロゴのURL" -showAdminUpdates: "新しいCalckeyのバージョンが利用可能なときに通知する(管理者のみ)" +showAdminUpdates: "新しいFirefishのバージョンが利用可能なときに通知する(管理者のみ)" replayTutorial: "もう一度チュートリアルを見る" migration: "アカウントの引っ越し" moveTo: "このアカウントを新しいアカウントに引っ越す" @@ -977,7 +977,9 @@ customKaTeXMacroDescription: "数式入力を楽にするためのマクロを enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" preventAiLearning: "AIによる学習を防止" preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。" -noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。" +noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Firefishの動作を妨げるため、無効にしてください。" +enableServerMachineStats: "サーバーのマシン情報を公開する" +enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" _sensitiveMediaDetection: description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" @@ -1054,12 +1056,12 @@ _registry: domain: "ドメイン" createKey: "キーを作成" _aboutMisskey: - about: "Calckeyは、2022年に生まれたThatOneCalculatorによるMisskeyのforkです。" + about: "Firefishは、2022年に生まれたThatOneCalculatorによるMisskeyのforkです。" contributors: "主なコントリビューター" allContributors: "全てのコントリビューター" source: "ソースコード" - translation: "Calckeyを翻訳" - donate: "Calckeyに寄付" + translation: "Firefishを翻訳" + donate: "Firefishに寄付" morePatrons: "他にも多くの方が支援してくれています。ありがとうございます! 🥰" patrons: "支援者" _nsfw: @@ -1068,8 +1070,8 @@ _nsfw: force: "常にメディアを隠す" _mfm: cheatSheet: "MFMチートシート" - intro: "MFMは、MisskeyやCalckey、Akkomaなどの様々な場所で使用できるマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。" - dummy: "CalckeyでFediverseの世界が広がります" + intro: "MFMは、MisskeyやFirefish、Akkomaなどの様々な場所で使用できるマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。" + dummy: "FirefishでFediverseの世界が広がります" mention: "メンション" mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示せます。" hashtag: "ハッシュタグ" @@ -1291,7 +1293,7 @@ _time: hour: "時間" day: "日" _tutorial: - title: "Calckeyの使い方" + title: "Firefishの使い方" step1_1: "ようこそ!" step1_2: "使い始める前に、いくつか設定を済ませましょう。すぐできますよ!" step2_1: "最初に、あなたのプロフィールを作りましょう。" @@ -1309,8 +1311,8 @@ _tutorial: step5_6: "おすすめ{icon}タイムラインでは、管理人がおすすめするサーバーの投稿を見られます。" step5_7: "グローバル{icon}タイムラインでは、接続している他のすべてのサーバーからの投稿を見られます。" step6_1: "じゃあ、ここはどんな場所なの?" - step6_2: "実は、あなたはただCalckeyに参加しただけではありません。ここは、何千もの相互接続されたサーバーが構成する Fediverse への入口です。" - step6_3: "それぞれのサーバーでは必ずしもCalckeyが使われているわけではなく、異なる動作をするサーバーもあります。しかし、あなたは他のサーバーのアカウントもフォローしたり、返信・ブーストができます。一見難しそうですが大丈夫!すぐ慣れます。" + step6_2: "実は、あなたはただFirefishに参加しただけではありません。ここは、何千もの相互接続されたサーバーが構成する Fediverse への入口です。" + step6_3: "それぞれのサーバーでは必ずしもFirefishが使われているわけではなく、異なる動作をするサーバーもあります。しかし、あなたは他のサーバーのアカウントもフォローしたり、返信・ブーストができます。一見難しそうですが大丈夫!すぐ慣れます。" step6_4: "これで完了です。お楽しみください!" _2fa: alreadyRegistered: "既に設定は完了しています。" @@ -1889,7 +1891,7 @@ apps: "アプリ" _experiments: title: 試験的な機能 postImportsCaption: - ユーザーが過去の投稿をCalckey・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。 + ユーザーが過去の投稿をFirefish・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。 enablePostImports: 投稿のインポートを有効にする sendModMail: モデレーション通知を送る deleted: 削除済み @@ -1904,7 +1906,7 @@ accessibility: アクセシビリティ jumpToPrevious: 前に戻る cw: 閲覧注意 silencedWarning: スパムの可能性があるため、これらのユーザーが所属するサーバーは管理者によりサイレンスされています。 -searchPlaceholder: Calckeyを検索 +searchPlaceholder: Firefishを検索 channelFederationWarn: 現時点では、チャンネルは他のサーバーへ連合しません listsDesc: リストでは指定したユーザーだけのタイムラインを作れます。リストには「タイムライン」のページからアクセスできます。 antennasDesc: "アンテナでは指定した条件に合致する投稿が表示されます。\nアンテナには「タイムライン」のページからアクセスできます。" @@ -1929,4 +1931,4 @@ video: 動画 isBot: このアカウントはBotです isLocked: このアカウントのフォローは承認制です isAdmin: 管理者 -isPatron: Calckey 後援者 +isPatron: Firefish 後援者 diff --git a/packages/backend/assets/avatar.png b/packages/backend/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..ee22bdb3c8e56d6e44c1a8eb3dec0d62bb427657 GIT binary patch literal 14059 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 NDa&ifRmoU}{|~xPiZcKJ literal 0 HcmV?d00001 diff --git a/packages/backend/migration/1688280713783-add-meta-options.js b/packages/backend/migration/1688280713783-add-meta-options.js new file mode 100644 index 0000000000..e97a95c423 --- /dev/null +++ b/packages/backend/migration/1688280713783-add-meta-options.js @@ -0,0 +1,21 @@ +export class AddMetaOptions1688280713783 { + name = "AddMetaOptions1688280713783"; + + async up(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`, + ); + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`, + ); + } + + async down(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`, + ); + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`, + ); + } +} diff --git a/packages/backend/src/daemons/server-stats.ts b/packages/backend/src/daemons/server-stats.ts index c936d619ab..ba74278762 100644 --- a/packages/backend/src/daemons/server-stats.ts +++ b/packages/backend/src/daemons/server-stats.ts @@ -1,6 +1,7 @@ import si from "systeminformation"; import Xev from "xev"; import * as osUtils from "os-utils"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import meilisearch from "../db/meilisearch.js"; const ev = new Xev(); @@ -20,6 +21,9 @@ export default function () { ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50)); }); + const meta = fetchMeta(); + if (!meta.enableServerMachineStats) return; + async function tick() { const cpu = await cpuUsage(); const memStats = await mem(); diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index dd3c5b3b72..200ef50552 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -546,4 +546,14 @@ export class Meta { default: {}, }) public experimentalFeatures: Record<string, unknown>; + + @Column("boolean", { + default: false, + }) + public enableServerMachineStats: boolean; + + @Column("boolean", { + default: true, + }) + public enableIdenticonGeneration: boolean; } diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 3193301275..50317d4a81 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -481,6 +481,16 @@ export const meta = { }, }, }, + enableServerMachineStats: { + type: "boolean", + optional: false, + nullable: false, + }, + enableIdenticonGeneration: { + type: "boolean", + optional: false, + nullable: false, + }, }, }, } as const; @@ -592,5 +602,7 @@ export default define(meta, paramDef, async (ps, me) => { enableIpLogging: instance.enableIpLogging, enableActiveEmailValidation: instance.enableActiveEmailValidation, experimentalFeatures: instance.experimentalFeatures, + enableServerMachineStats: instance.enableServerMachineStats, + enableIdenticonGeneration: instance.enableIdenticonGeneration, }; }); diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts index 81bb053db4..746eae6621 100644 --- a/packages/backend/src/server/api/endpoints/server-info.ts +++ b/packages/backend/src/server/api/endpoints/server-info.ts @@ -2,11 +2,13 @@ import * as os from "node:os"; import si from "systeminformation"; import define from "../define.js"; import meilisearch from "@/db/meilisearch.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { requireCredential: false, requireCredentialPrivateMode: true, - + allowGet: true, + cacheSec: 30, tags: ["meta"], } as const; @@ -29,6 +31,23 @@ export default define(meta, paramDef, async () => { } } + const instanceMeta = await fetchMeta(); + if (!instanceMeta.enableServerMachineStats) { + return { + machine: 'Not specified', + cpu: { + model: 'Not specified', + cores: 0, + }, + mem: { + total: 0, + }, + fs: { + total: 0, + used: 0, + }, + }; + } return { machine: os.hostname(), cpu: { diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 95d570eb3d..7f8d0ed718 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -16,6 +16,7 @@ import { IsNull } from "typeorm"; import config from "@/config/index.js"; import Logger from "@/services/logger.js"; import { UserProfiles, Users } from "@/models/index.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import { genIdenticon } from "@/misc/gen-identicon.js"; import { createTemp } from "@/misc/create-temp.js"; import { publishMainStream } from "@/services/stream.js"; @@ -125,10 +126,16 @@ router.get("/avatar/@:acct", async (ctx) => { }); router.get("/identicon/:x", async (ctx) => { - const [temp, cleanup] = await createTemp(); - await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); - ctx.set("Content-Type", "image/png"); - ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + const meta = await fetchMeta(); + if (meta.enableIdenticonGeneration) { + const [temp, cleanup] = await createTemp(); + await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); + ctx.set("Content-Type", "image/png"); + ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + } + else { + ctx.redirect("/static-assets/avatar.png") + } }); mastoRouter.get("/oauth/authorize", async (ctx) => { diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index e67c44b0a4..0e83250bac 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -343,6 +343,17 @@ </template> </FormSection> + <FormSection> + <template #label>Server Performance</template> + <FormSwitch v-model="enableServerMachineStats"> + <template #label>{{ i18n.ts.enableServerMachineStats }}</template> + </FormSwitch> + + <FormSwitch v-model="enableIdenticonGeneration"> + <template #label>{{ i18n.ts.enableIdenticonGeneration }}</template> + </FormSwitch> + </FormSection> + <FormSection> <template #label>DeepL Translation</template> @@ -442,6 +453,8 @@ let libreTranslateApiUrl: string = $ref(""); let libreTranslateApiKey: string = $ref(""); let defaultReaction: string = $ref(""); let defaultReactionCustom: string = $ref(""); +let enableServerMachineStats: boolean = $ref(false); +let enableIdenticonGeneration: boolean = $ref(false); async function init() { const meta = await os.api("admin/meta"); @@ -482,6 +495,8 @@ async function init() { defaultReactionCustom = ["⭐", "👍", "❤️"].includes(meta.defaultReaction) ? "" : meta.defaultReaction; + enableServerMachineStats = meta.enableServerMachineStats; + enableIdenticonGeneration = meta.enableIdenticonGeneration; } function save() { @@ -521,6 +536,8 @@ function save() { libreTranslateApiUrl, libreTranslateApiKey, defaultReaction, + enableServerMachineStats, + enableIdenticonGeneration, }).then(() => { fetchInstance(); }); diff --git a/packages/client/src/widgets/server-metric/index.vue b/packages/client/src/widgets/server-metric/index.vue index cf84212b1e..49dc59ea27 100644 --- a/packages/client/src/widgets/server-metric/index.vue +++ b/packages/client/src/widgets/server-metric/index.vue @@ -106,7 +106,7 @@ const { widgetProps, configure, save } = useWidgetPropsManager( const meta = ref(null); -os.api("server-info", {}).then((res) => { +os.apiGet("server-info", {}).then((res) => { meta.value = res; }); From 59650933265dc141fd7f33a175e3e80b27494f95 Mon Sep 17 00:00:00 2001 From: Claire <baffling4945@outlook.com> Date: Sun, 2 Jul 2023 17:03:48 +0000 Subject: [PATCH 289/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 96.8% (1757 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 6870571be8..fc508d6386 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1341,6 +1341,8 @@ _widgets: meiliIndexCount: 已索引的帖子 meiliSize: 索引大小 serverInfo: 服务器信息 + _userList: + chooseList: 选择一个列表 _cw: hide: "隐藏" show: "查看更多" @@ -1402,6 +1404,7 @@ _profile: metadataContent: "内容" changeAvatar: "修改头像" changeBanner: "修改横幅" + locationDescription: 如果你先输入你的城市,它将向其他用户显示您的当地时间。 _exportOrImport: allNotes: "所有帖子" followingList: "关注中" @@ -1768,6 +1771,9 @@ _notification: followBack: "回关" reply: "回复" renote: "转发" + reacted: 对你的帖子做出了回应 + voted: 在你的投票中投了票 + renoted: 推荐了你的帖子 _deck: alwaysShowMainColumn: "总是显示主列" columnAlign: "列对齐" @@ -1804,6 +1810,8 @@ _messaging: migration: 迁移 _experiments: title: 实验性功能 + postImportsCaption: 允许用户从过去的 Calckey、Misskey、Mastodon、Akkoma 和 Pleroma 帐户导入帖子。如果您的队列出现拥堵,则可能会导致加载速度减慢。 + enablePostImports: 启用帖子导入 license: 许可证 flagSpeakAsCatDescription: 在猫模式下你的帖子会喵化 allowedInstances: 白名单服务器 @@ -1813,11 +1821,11 @@ removeReaction: 移除你的回应 expandOnNoteClick: 点击打开帖子 expandOnNoteClickDesc: 如果禁用,你仍然可以在右键菜单中或通过点击时间戳打开帖子。 sendPushNotificationReadMessage: 删除已阅读的推送通知 -customMOTD: 自定义 MOTD(闪屏消息) +customMOTD: 自定义 MOTD(启动屏幕消息) sendPushNotificationReadMessageCaption: 短暂显示 "{emptyPushNotificationMessage}" 的通知,如果启用,可能会增加你的设备的耗电量。 adminCustomCssWarn: 仅当你知道此设置的作用时才应使用它。输入不正确的值可能会导致每个人的客户端停止正常运行。请在用户设置中进行测试来确保您的 CSS 正常工作。 -customMOTDDescription: 自定义MOTD(闪屏)消息,一行一个,每次用户加载/刷新页面时都会随机显示。 +customMOTDDescription: 自定义 MOTD(启动屏幕)消息,一行一个,每次用户加载/刷新页面时都会随机显示。 customSplashIconsDescription: 用换行符隔开的自定义闪屏图标的URL,在用户每次加载/重新加载页面时随机显示。请确保图片是在一个静态的 URL 上,最好全部调整为 192x192 的大小。 recommendedInstancesDescription: 推荐的服务器以换行符分隔,它们将出现在推荐的时间线中。不要添加 "https://",仅添加域名。 @@ -1889,6 +1897,8 @@ _skinTones: light: 浅色 yellow: 黄色 dark: 深色 + mediumLight: 中等偏淡 + mediumDark: 中等偏深 isModerator: 协作者 isAdmin: 管理员 findOtherInstance: 寻找其它服务器 @@ -1926,3 +1936,6 @@ _filters: followersOnly: 仅关注者 reactionPickerSkinTone: 首选的表情符号肤色 isPatron: Calckey 赞助 +_dialog: + charactersExceeded: 超出了最大字符数!当前:{current} / 限制:{max} + charactersBelow: 没有足够的字符!当前:{current} / 限制:{min} From b2932f77fa2963f0b562136c348571aad9e07c5d Mon Sep 17 00:00:00 2001 From: Poesty Li <poesty7450@gmail.com> Date: Sun, 2 Jul 2023 17:17:52 +0000 Subject: [PATCH 290/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 96.8% (1757 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index fc508d6386..6903f447d0 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -13,7 +13,7 @@ ok: "OK" gotIt: "我明白了" cancel: "取消" enterUsername: "输入用户名" -renotedBy: "由 {user} 转贴" +renotedBy: "转发自 {user}" noNotes: "没有帖子" noNotifications: "无通知" instance: "服务器" @@ -44,7 +44,7 @@ copyContent: "复制内容" copyLink: "复制链接" delete: "删除" deleteAndEdit: "删除并编辑" -deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。" +deleteAndEditConfirm: "要删除此帖子并再次编辑吗?对此帖子的所有回应、转发和回复也将被删除。" addToList: "添加至列表" sendMessage: "发送" copyUsername: "复制用户名" @@ -97,7 +97,7 @@ enterEmoji: "输入表情符号" renote: "转发" unrenote: "取消转发" renoted: "已转发。" -cantRenote: "该帖无法转发。" +cantRenote: "此帖子无法转发。" cantReRenote: "转发无法被再次转发。" quote: "引用" pinnedNote: "已置顶的帖子" @@ -111,7 +111,7 @@ enableEmojiReaction: "启用表情符号回应" showEmojisInReactionNotifications: "在回应通知中显示表情符号" reactionSetting: "在选择器中显示的回应" reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。" -rememberNoteVisibility: "保存上次设置的可见性" +rememberNoteVisibility: "保存帖子可见性设置" attachCancel: "删除附件" markAsSensitive: "标记为敏感内容" unmarkAsSensitive: "取消标记为敏感内容" @@ -141,7 +141,7 @@ emojiUrl: "表情符号地址" addEmoji: "添加表情符号" settingGuide: "推荐配置" cacheRemoteFiles: "远程文件缓存" -cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" +cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程服务器载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" flagAsBot: "这是一个机器人账号" flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。" flagAsCat: "将这个账户设定为一只猫" @@ -151,7 +151,7 @@ flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的 autoAcceptFollowed: "自动允许关注者的关注" addAccount: "添加账户" loginFailed: "登录失败" -showOnRemote: "转到所在实例显示" +showOnRemote: "转到所在服务器显示" general: "常规设置" wallpaper: "壁纸" setWallpaper: "设置壁纸" @@ -160,7 +160,7 @@ searchWith: "搜索:{q}" youHaveNoLists: "列表为空" followConfirm: "你确定要关注{name}吗?" proxyAccount: "代理账户" -proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户列出一个远程用户时,如果没有人跟随该列出的用户,则该活动将不会传递到该实例,因此将代之以代理账户。" +proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户列出一个远程用户时,如果没有人跟随该列出的用户,则该活动将不会传递到该服务器,因此将代之以代理账户。" host: "主机名" selectUser: "选择用户" recipient: "收件人" @@ -176,7 +176,7 @@ charts: "图表" perHour: "每小时" perDay: "每天" stopActivityDelivery: "停止发送活动" -blockThisInstance: "阻止此实例向本实例推流" +blockThisInstance: "屏蔽此服务器" operations: "操作" software: "软件" version: "版本" @@ -194,14 +194,14 @@ clearQueueConfirmText: "未送达的帖子将不会送达。 通常,您不需 clearCachedFiles: "清除缓存" clearCachedFilesConfirm: "确定要清除缓存文件?" blockedInstances: "已屏蔽的服务器" -blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。" +blockedInstancesDescription: "设定要屏蔽的服务器,以换行来进行分割。被屏蔽的服务器将无法与本服务器进行交换通讯。" muteAndBlock: "屏蔽/拉黑" mutedUsers: "已屏蔽用户" blockedUsers: "被拉黑的用户" noUsers: "无用户" editProfile: "编辑资料" noteDeleteConfirm: "要删除该帖子吗?" -pinLimitExceeded: "无法置顶更多了" +pinLimitExceeded: "无法置顶更多帖子了" intro: "Misskey的部署结束啦!填写管理员账号吧!" done: "完成" processing: "正在处理" @@ -217,9 +217,9 @@ all: "全部" subscribing: "已订阅" publishing: "直播中" notResponding: "没有响应" -instanceFollowing: "关注实例" -instanceFollowers: "关注实例" -instanceUsers: "实例用户" +instanceFollowing: "关注服务器" +instanceFollowers: "服务器的关注者" +instanceUsers: "此服务器的用户" changePassword: "修改密码" security: "安全" retypedNotMatch: "两次输入不一致!" @@ -340,7 +340,7 @@ basicInfo: "基本信息" pinnedUsers: "置顶用户" pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。" pinnedPages: "固定页面" -pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。" +pinnedPagesDescription: "输入您要固定到服务器首页的页面路径,以换行符分隔。" pinnedClipId: "置顶的便签ID" pinnedNotes: "已置顶的帖子" hcaptcha: "hCaptcha" @@ -424,7 +424,7 @@ text: "文本" enable: "启用" next: "下一个" retype: "重新输入" -noteOf: "{user}的帖子" +noteOf: "{user} 的帖子" inviteToGroup: "群组邀请" quoteAttached: "已引用" quoteQuestion: "是否引用此链接内容?" @@ -835,7 +835,7 @@ overridedDeviceKind: "设备类型" smartphone: "智能手机" tablet: "平板" auto: "自动" -themeColor: "主题颜色" +themeColor: "服务器滚动条颜色" size: "大小" numberOfColumn: "列数" searchByGoogle: "Google" From 703f28a1ab643e57290e5ae2d6df67e481e97560 Mon Sep 17 00:00:00 2001 From: Syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Jul 2023 16:20:40 -0700 Subject: [PATCH 291/309] =?UTF-8?q?refactor:=20=E2=9A=A1=20make=20identico?= =?UTF-8?q?ns=20and=20server=20metrics=20optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kainoa Kanter <kainoa@t1c.dev> --- locales/en-US.yml | 2 ++ locales/ja-JP.yml | 2 ++ packages/backend/assets/avatar.png | Bin 0 -> 14059 bytes .../1688280713783-add-meta-options.js | 21 ++++++++++++++++++ packages/backend/src/daemons/server-stats.ts | 4 ++++ packages/backend/src/models/entities/meta.ts | 10 +++++++++ .../src/server/api/endpoints/admin/meta.ts | 12 ++++++++++ .../src/server/api/endpoints/server-info.ts | 21 +++++++++++++++++- packages/backend/src/server/index.ts | 15 +++++++++---- packages/client/src/pages/admin/settings.vue | 17 ++++++++++++++ .../src/widgets/server-metric/index.vue | 2 +- 11 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 packages/backend/assets/avatar.png create mode 100644 packages/backend/migration/1688280713783-add-meta-options.js diff --git a/locales/en-US.yml b/locales/en-US.yml index d493f332f5..c6c442df7c 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1112,6 +1112,8 @@ isModerator: "Moderator" isAdmin: "Administrator" isPatron: "Calckey Patron" reactionPickerSkinTone: "Preferred emoji skin tone" +enableServerMachineStats: "Enable server hardware statistics" +enableIdenticonGeneration: "Enable Identicon generation" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fa3c3f1cc1..9f2f825e55 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -978,6 +978,8 @@ enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" preventAiLearning: "AIによる学習を防止" preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。" noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。" +enableServerMachineStats: "サーバーのマシン情報を公開する" +enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" _sensitiveMediaDetection: description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" diff --git a/packages/backend/assets/avatar.png b/packages/backend/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..ee22bdb3c8e56d6e44c1a8eb3dec0d62bb427657 GIT binary patch literal 14059 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 NDa&ifRmoU}{|~xPiZcKJ literal 0 HcmV?d00001 diff --git a/packages/backend/migration/1688280713783-add-meta-options.js b/packages/backend/migration/1688280713783-add-meta-options.js new file mode 100644 index 0000000000..e97a95c423 --- /dev/null +++ b/packages/backend/migration/1688280713783-add-meta-options.js @@ -0,0 +1,21 @@ +export class AddMetaOptions1688280713783 { + name = "AddMetaOptions1688280713783"; + + async up(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`, + ); + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`, + ); + } + + async down(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`, + ); + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`, + ); + } +} diff --git a/packages/backend/src/daemons/server-stats.ts b/packages/backend/src/daemons/server-stats.ts index c936d619ab..ba74278762 100644 --- a/packages/backend/src/daemons/server-stats.ts +++ b/packages/backend/src/daemons/server-stats.ts @@ -1,6 +1,7 @@ import si from "systeminformation"; import Xev from "xev"; import * as osUtils from "os-utils"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import meilisearch from "../db/meilisearch.js"; const ev = new Xev(); @@ -20,6 +21,9 @@ export default function () { ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50)); }); + const meta = fetchMeta(); + if (!meta.enableServerMachineStats) return; + async function tick() { const cpu = await cpuUsage(); const memStats = await mem(); diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index dd3c5b3b72..200ef50552 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -546,4 +546,14 @@ export class Meta { default: {}, }) public experimentalFeatures: Record<string, unknown>; + + @Column("boolean", { + default: false, + }) + public enableServerMachineStats: boolean; + + @Column("boolean", { + default: true, + }) + public enableIdenticonGeneration: boolean; } diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 3193301275..50317d4a81 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -481,6 +481,16 @@ export const meta = { }, }, }, + enableServerMachineStats: { + type: "boolean", + optional: false, + nullable: false, + }, + enableIdenticonGeneration: { + type: "boolean", + optional: false, + nullable: false, + }, }, }, } as const; @@ -592,5 +602,7 @@ export default define(meta, paramDef, async (ps, me) => { enableIpLogging: instance.enableIpLogging, enableActiveEmailValidation: instance.enableActiveEmailValidation, experimentalFeatures: instance.experimentalFeatures, + enableServerMachineStats: instance.enableServerMachineStats, + enableIdenticonGeneration: instance.enableIdenticonGeneration, }; }); diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts index 81bb053db4..746eae6621 100644 --- a/packages/backend/src/server/api/endpoints/server-info.ts +++ b/packages/backend/src/server/api/endpoints/server-info.ts @@ -2,11 +2,13 @@ import * as os from "node:os"; import si from "systeminformation"; import define from "../define.js"; import meilisearch from "@/db/meilisearch.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { requireCredential: false, requireCredentialPrivateMode: true, - + allowGet: true, + cacheSec: 30, tags: ["meta"], } as const; @@ -29,6 +31,23 @@ export default define(meta, paramDef, async () => { } } + const instanceMeta = await fetchMeta(); + if (!instanceMeta.enableServerMachineStats) { + return { + machine: 'Not specified', + cpu: { + model: 'Not specified', + cores: 0, + }, + mem: { + total: 0, + }, + fs: { + total: 0, + used: 0, + }, + }; + } return { machine: os.hostname(), cpu: { diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 95d570eb3d..7f8d0ed718 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -16,6 +16,7 @@ import { IsNull } from "typeorm"; import config from "@/config/index.js"; import Logger from "@/services/logger.js"; import { UserProfiles, Users } from "@/models/index.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import { genIdenticon } from "@/misc/gen-identicon.js"; import { createTemp } from "@/misc/create-temp.js"; import { publishMainStream } from "@/services/stream.js"; @@ -125,10 +126,16 @@ router.get("/avatar/@:acct", async (ctx) => { }); router.get("/identicon/:x", async (ctx) => { - const [temp, cleanup] = await createTemp(); - await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); - ctx.set("Content-Type", "image/png"); - ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + const meta = await fetchMeta(); + if (meta.enableIdenticonGeneration) { + const [temp, cleanup] = await createTemp(); + await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); + ctx.set("Content-Type", "image/png"); + ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + } + else { + ctx.redirect("/static-assets/avatar.png") + } }); mastoRouter.get("/oauth/authorize", async (ctx) => { diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index e67c44b0a4..0e83250bac 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -343,6 +343,17 @@ </template> </FormSection> + <FormSection> + <template #label>Server Performance</template> + <FormSwitch v-model="enableServerMachineStats"> + <template #label>{{ i18n.ts.enableServerMachineStats }}</template> + </FormSwitch> + + <FormSwitch v-model="enableIdenticonGeneration"> + <template #label>{{ i18n.ts.enableIdenticonGeneration }}</template> + </FormSwitch> + </FormSection> + <FormSection> <template #label>DeepL Translation</template> @@ -442,6 +453,8 @@ let libreTranslateApiUrl: string = $ref(""); let libreTranslateApiKey: string = $ref(""); let defaultReaction: string = $ref(""); let defaultReactionCustom: string = $ref(""); +let enableServerMachineStats: boolean = $ref(false); +let enableIdenticonGeneration: boolean = $ref(false); async function init() { const meta = await os.api("admin/meta"); @@ -482,6 +495,8 @@ async function init() { defaultReactionCustom = ["⭐", "👍", "❤️"].includes(meta.defaultReaction) ? "" : meta.defaultReaction; + enableServerMachineStats = meta.enableServerMachineStats; + enableIdenticonGeneration = meta.enableIdenticonGeneration; } function save() { @@ -521,6 +536,8 @@ function save() { libreTranslateApiUrl, libreTranslateApiKey, defaultReaction, + enableServerMachineStats, + enableIdenticonGeneration, }).then(() => { fetchInstance(); }); diff --git a/packages/client/src/widgets/server-metric/index.vue b/packages/client/src/widgets/server-metric/index.vue index cf84212b1e..49dc59ea27 100644 --- a/packages/client/src/widgets/server-metric/index.vue +++ b/packages/client/src/widgets/server-metric/index.vue @@ -106,7 +106,7 @@ const { widgetProps, configure, save } = useWidgetPropsManager( const meta = ref(null); -os.api("server-info", {}).then((res) => { +os.apiGet("server-info", {}).then((res) => { meta.value = res; }); From 947163fde2806649c597b4e023a33900edcbc28a Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sun, 2 Jul 2023 20:37:46 -0400 Subject: [PATCH 292/309] store cache values to redis --- packages/backend/package.json | 2 +- packages/backend/src/misc/cache.ts | 86 +++++++++++++------ packages/backend/src/misc/emoji-meta.ts | 34 +++++--- packages/backend/src/misc/populate-emojis.ts | 9 +- .../src/remote/activitypub/models/person.ts | 6 +- .../src/services/chart/charts/active-users.ts | 6 +- .../backend/src/services/instance-actor.ts | 6 +- .../register-or-fetch-instance-doc.ts | 12 +-- packages/backend/src/services/relay.ts | 2 +- packages/backend/src/services/user-cache.ts | 33 +++---- pnpm-lock.yaml | 23 +++-- 11 files changed, 131 insertions(+), 88 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index b584a56910..6f63441023 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -34,6 +34,7 @@ "@koa/cors": "3.4.3", "@koa/multer": "3.0.2", "@koa/router": "9.0.1", + "@msgpack/msgpack": "3.0.0-beta2", "@peertube/http-signature": "1.7.0", "@redocly/openapi-core": "1.0.0-beta.120", "@sinonjs/fake-timers": "9.1.2", @@ -43,7 +44,6 @@ "ajv": "8.12.0", "archiver": "5.3.1", "argon2": "^0.30.3", - "async-mutex": "^0.4.0", "autobind-decorator": "2.4.0", "autolinker": "4.0.0", "autwh": "0.1.0", diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts index 9abebc91cb..d790313d18 100644 --- a/packages/backend/src/misc/cache.ts +++ b/packages/backend/src/misc/cache.ts @@ -1,43 +1,75 @@ +import { redisClient } from "@/db/redis.js"; +import { nativeRandomStr } from "native-utils/built/index.js"; +import { encode, decode } from "@msgpack/msgpack"; +import { ChainableCommander } from "ioredis"; + export class Cache<T> { - public cache: Map<string | null, { date: number; value: T }>; - private lifetime: number; + private ttl: number; + private fingerprint: string; - constructor(lifetime: Cache<never>["lifetime"]) { - this.cache = new Map(); - this.lifetime = lifetime; + constructor(ttl: number) { + this.ttl = ttl; + this.fingerprint = `cache:${nativeRandomStr(32)}`; } - public set(key: string | null, value: T): void { - this.cache.set(key, { - date: Date.now(), - value, - }); + private prefixedKey(key: string | null): string { + return key ? `${this.fingerprint}:${key}` : this.fingerprint; } - public get(key: string | null): T | undefined { - const cached = this.cache.get(key); - if (cached == null) return undefined; - if (Date.now() - cached.date > this.lifetime) { - this.cache.delete(key); - return undefined; + public async set(key: string | null, value: T, transaction?: ChainableCommander): Promise<void> { + const _key = this.prefixedKey(key); + const _value = Buffer.from(encode(value)); + const commander = transaction ?? redisClient; + if (this.ttl === Infinity) { + await commander.set(_key, _value); + } else { + await commander.set(_key, _value, "PX", this.ttl); } - return cached.value; } - public delete(key: string | null) { - this.cache.delete(key); + public async get(key: string | null): Promise<T | undefined> { + const _key = this.prefixedKey(key); + const cached = await redisClient.getBuffer(_key); + if (cached === null) return undefined; + + return decode(cached) as T; + } + + public async getAll(): Promise<Map<string, T>> { + const keys = await redisClient.keys(`${this.fingerprint}*`); + const map = new Map<string, T>(); + if (keys.length === 0) { + return map; + } + const values = await redisClient.mgetBuffer(keys); + + for (const [i, key] of keys.entries()) { + const val = values[i]; + if (val !== null) { + map.set(key, decode(val) as T); + } + } + + return map; + } + + public async delete(...keys: (string | null)[]): Promise<void> { + if (keys.length > 0) { + const _keys = keys.map(this.prefixedKey); + await redisClient.del(_keys); + } } /** - * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します - * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします + * Returns if cached value exists. Otherwise, calls fetcher and caches. + * Overwrites cached value if invalidated by the optional validator. */ public async fetch( key: string | null, fetcher: () => Promise<T>, validator?: (cachedValue: T) => boolean, ): Promise<T> { - const cachedValue = this.get(key); + const cachedValue = await this.get(key); if (cachedValue !== undefined) { if (validator) { if (validator(cachedValue)) { @@ -52,20 +84,20 @@ export class Cache<T> { // Cache MISS const value = await fetcher(); - this.set(key, value); + await this.set(key, value); return value; } /** - * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します - * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします + * Returns if cached value exists. Otherwise, calls fetcher and caches if the fetcher returns a value. + * Overwrites cached value if invalidated by the optional validator. */ public async fetchMaybe( key: string | null, fetcher: () => Promise<T | undefined>, validator?: (cachedValue: T) => boolean, ): Promise<T | undefined> { - const cachedValue = this.get(key); + const cachedValue = await this.get(key); if (cachedValue !== undefined) { if (validator) { if (validator(cachedValue)) { @@ -81,7 +113,7 @@ export class Cache<T> { // Cache MISS const value = await fetcher(); if (value !== undefined) { - this.set(key, value); + await this.set(key, value); } return value; } diff --git a/packages/backend/src/misc/emoji-meta.ts b/packages/backend/src/misc/emoji-meta.ts index fd9d9baa5c..45364bdcbc 100644 --- a/packages/backend/src/misc/emoji-meta.ts +++ b/packages/backend/src/misc/emoji-meta.ts @@ -1,9 +1,10 @@ import probeImageSize from "probe-image-size"; -import { Mutex, withTimeout } from "async-mutex"; +import { Mutex } from "redis-semaphore"; import { FILE_TYPE_BROWSERSAFE } from "@/const.js"; import Logger from "@/services/logger.js"; import { Cache } from "./cache.js"; +import { redisClient } from "@/db/redis.js"; export type Size = { width: number; @@ -11,23 +12,30 @@ export type Size = { }; const cache = new Cache<boolean>(1000 * 60 * 10); // once every 10 minutes for the same url -const mutex = withTimeout(new Mutex(), 1000); +const logger = new Logger("emoji"); export async function getEmojiSize(url: string): Promise<Size> { - const logger = new Logger("emoji"); + let attempted = true; - await mutex.runExclusive(() => { - const attempted = cache.get(url); - if (!attempted) { - cache.set(url, true); - } else { - logger.warn(`Attempt limit exceeded: ${url}`); - throw new Error("Too many attempts"); - } - }); + const lock = new Mutex(redisClient, "getEmojiSize"); + await lock.acquire(); try { - logger.info(`Retrieving emoji size from ${url}`); + attempted = (await cache.get(url)) === true; + if (!attempted) { + await cache.set(url, true); + } + } finally { + await lock.release(); + } + + if (attempted) { + logger.warn(`Attempt limit exceeded: ${url}`); + throw new Error("Too many attempts"); + } + + try { + logger.debug(`Retrieving emoji size from ${url}`); const { width, height, mime } = await probeImageSize(url, { timeout: 5000, }); diff --git a/packages/backend/src/misc/populate-emojis.ts b/packages/backend/src/misc/populate-emojis.ts index 7aee4ec253..ce25dd5594 100644 --- a/packages/backend/src/misc/populate-emojis.ts +++ b/packages/backend/src/misc/populate-emojis.ts @@ -7,6 +7,7 @@ import { isSelfHost, toPunyNullable } from "./convert-host.js"; import { decodeReaction } from "./reaction-lib.js"; import config from "@/config/index.js"; import { query } from "@/prelude/url.js"; +import { redisClient } from "@/db/redis.js"; const cache = new Cache<Emoji | null>(1000 * 60 * 60 * 12); @@ -75,7 +76,7 @@ export async function populateEmoji( if (emoji && !(emoji.width && emoji.height)) { emoji = await queryOrNull(); - cache.set(cacheKey, emoji); + await cache.set(cacheKey, emoji); } if (emoji == null) return null; @@ -150,7 +151,7 @@ export async function prefetchEmojis( emojis: { name: string; host: string | null }[], ): Promise<void> { const notCachedEmojis = emojis.filter( - (emoji) => cache.get(`${emoji.name} ${emoji.host}`) == null, + async (emoji) => !(await cache.get(`${emoji.name} ${emoji.host}`)), ); const emojisQuery: any[] = []; const hosts = new Set(notCachedEmojis.map((e) => e.host)); @@ -169,7 +170,9 @@ export async function prefetchEmojis( select: ["name", "host", "originalUrl", "publicUrl"], }) : []; + const trans = redisClient.multi(); for (const emoji of _emojis) { - cache.set(`${emoji.name} ${emoji.host}`, emoji); + cache.set(`${emoji.name} ${emoji.host}`, emoji, trans); } + await trans.exec(); } diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index f8208e6d7b..c541e9ae50 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -135,14 +135,14 @@ export async function fetchPerson( ): Promise<CacheableUser | null> { if (typeof uri !== "string") throw new Error("uri is not string"); - const cached = uriPersonCache.get(uri); + const cached = await uriPersonCache.get(uri); if (cached) return cached; // Fetch from the database if the URI points to this server if (uri.startsWith(`${config.url}/`)) { const id = uri.split("/").pop(); const u = await Users.findOneBy({ id }); - if (u) uriPersonCache.set(uri, u); + if (u) await uriPersonCache.set(uri, u); return u; } @@ -150,7 +150,7 @@ export async function fetchPerson( const exist = await Users.findOneBy({ uri }); if (exist) { - uriPersonCache.set(uri, exist); + await uriPersonCache.set(uri, exist); return exist; } //#endregion diff --git a/packages/backend/src/services/chart/charts/active-users.ts b/packages/backend/src/services/chart/charts/active-users.ts index 7a0c45cfaf..15317e68b0 100644 --- a/packages/backend/src/services/chart/charts/active-users.ts +++ b/packages/backend/src/services/chart/charts/active-users.ts @@ -25,12 +25,12 @@ export default class ActiveUsersChart extends Chart<typeof schema> { return {}; } - public async read(user: { + public read(user: { id: User["id"]; host: null; createdAt: User["createdAt"]; - }): Promise<void> { - await this.commit({ + }) { + this.commit({ read: [user.id], registeredWithinWeek: Date.now() - user.createdAt.getTime() < week ? [user.id] : [], diff --git a/packages/backend/src/services/instance-actor.ts b/packages/backend/src/services/instance-actor.ts index 50ce227eba..9240f31073 100644 --- a/packages/backend/src/services/instance-actor.ts +++ b/packages/backend/src/services/instance-actor.ts @@ -9,7 +9,7 @@ const ACTOR_USERNAME = "instance.actor" as const; const cache = new Cache<ILocalUser>(Infinity); export async function getInstanceActor(): Promise<ILocalUser> { - const cached = cache.get(null); + const cached = await cache.get(null); if (cached) return cached; const user = (await Users.findOneBy({ @@ -18,11 +18,11 @@ export async function getInstanceActor(): Promise<ILocalUser> { })) as ILocalUser | undefined; if (user) { - cache.set(null, user); + await cache.set(null, user); return user; } else { const created = (await createSystemUser(ACTOR_USERNAME)) as ILocalUser; - cache.set(null, created); + await cache.set(null, created); return created; } } diff --git a/packages/backend/src/services/register-or-fetch-instance-doc.ts b/packages/backend/src/services/register-or-fetch-instance-doc.ts index 4c3570e907..ddb9ce2413 100644 --- a/packages/backend/src/services/register-or-fetch-instance-doc.ts +++ b/packages/backend/src/services/register-or-fetch-instance-doc.ts @@ -9,25 +9,25 @@ const cache = new Cache<Instance>(1000 * 60 * 60); export async function registerOrFetchInstanceDoc( host: string, ): Promise<Instance> { - host = toPuny(host); + const _host = toPuny(host); - const cached = cache.get(host); + const cached = await cache.get(_host); if (cached) return cached; - const index = await Instances.findOneBy({ host }); + const index = await Instances.findOneBy({ host: _host }); if (index == null) { const i = await Instances.insert({ id: genId(), - host, + host: _host, caughtAt: new Date(), lastCommunicatedAt: new Date(), }).then((x) => Instances.findOneByOrFail(x.identifiers[0])); - cache.set(host, i); + await cache.set(_host, i); return i; } else { - cache.set(host, index); + await cache.set(_host, index); return index; } } diff --git a/packages/backend/src/services/relay.ts b/packages/backend/src/services/relay.ts index bec4b1f86b..2325f76c69 100644 --- a/packages/backend/src/services/relay.ts +++ b/packages/backend/src/services/relay.ts @@ -90,7 +90,7 @@ async function updateRelaysCache() { const relays = await Relays.findBy({ status: "accepted", }); - relaysCache.set(null, relays); + await relaysCache.set(null, relays); } export async function relayRejected(id: string) { diff --git a/packages/backend/src/services/user-cache.ts b/packages/backend/src/services/user-cache.ts index 9492448554..373fb86869 100644 --- a/packages/backend/src/services/user-cache.ts +++ b/packages/backend/src/services/user-cache.ts @@ -6,7 +6,7 @@ import type { import { User } from "@/models/entities/user.js"; import { Users } from "@/models/index.js"; import { Cache } from "@/misc/cache.js"; -import { subscriber } from "@/db/redis.js"; +import { redisClient, subscriber } from "@/db/redis.js"; export const userByIdCache = new Cache<CacheableUser>(Infinity); export const localUserByNativeTokenCache = new Cache<CacheableLocalUser | null>( @@ -22,13 +22,12 @@ subscriber.on("message", async (_, data) => { const { type, body } = obj.message; switch (type) { case "localUserUpdated": { - userByIdCache.delete(body.id); - localUserByIdCache.delete(body.id); - localUserByNativeTokenCache.cache.forEach((v, k) => { - if (v.value?.id === body.id) { - localUserByNativeTokenCache.delete(k); - } - }); + await userByIdCache.delete(body.id); + await localUserByIdCache.delete(body.id); + const toDelete = Array.from(await localUserByNativeTokenCache.getAll()) + .filter((v) => v[1]?.id === body.id) + .map((v) => v[0]); + await localUserByNativeTokenCache.delete(...toDelete); break; } case "userChangeSuspendedState": @@ -36,15 +35,17 @@ subscriber.on("message", async (_, data) => { case "userChangeModeratorState": case "remoteUserUpdated": { const user = await Users.findOneByOrFail({ id: body.id }); - userByIdCache.set(user.id, user); - for (const [k, v] of uriPersonCache.cache.entries()) { - if (v.value?.id === user.id) { - uriPersonCache.set(k, user); + await userByIdCache.set(user.id, user); + const trans = redisClient.multi(); + for (const [k, v] of (await uriPersonCache.getAll()).entries()) { + if (v?.id === user.id) { + await uriPersonCache.set(k, user, trans); } } + await trans.exec(); if (Users.isLocalUser(user)) { - localUserByNativeTokenCache.set(user.token, user); - localUserByIdCache.set(user.id, user); + await localUserByNativeTokenCache.set(user.token, user); + await localUserByIdCache.set(user.id, user); } break; } @@ -52,8 +53,8 @@ subscriber.on("message", async (_, data) => { const user = (await Users.findOneByOrFail({ id: body.id, })) as ILocalUser; - localUserByNativeTokenCache.delete(body.oldToken); - localUserByNativeTokenCache.set(body.newToken, user); + await localUserByNativeTokenCache.delete(body.oldToken); + await localUserByNativeTokenCache.set(body.newToken, user); break; } default: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1002a6f958..560bb55a37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -105,6 +105,9 @@ importers: '@koa/router': specifier: 9.0.1 version: 9.0.1 + '@msgpack/msgpack': + specifier: 3.0.0-beta2 + version: 3.0.0-beta2 '@peertube/http-signature': specifier: 1.7.0 version: 1.7.0 @@ -132,9 +135,6 @@ importers: argon2: specifier: ^0.30.3 version: 0.30.3 - async-mutex: - specifier: ^0.4.0 - version: 0.4.0 autobind-decorator: specifier: 2.4.0 version: 2.4.0 @@ -786,7 +786,7 @@ importers: version: 2.30.0 emojilib: specifier: github:thatonecalculator/emojilib - version: github.com/thatonecalculator/emojilib/542fcc1a25003afad78f3248ceee8ac6980ddeb8 + version: github.com/thatonecalculator/emojilib/06944984a61ee799b7083894258f5fa318d932d1 escape-regexp: specifier: 0.0.1 version: 0.0.1 @@ -2277,6 +2277,11 @@ packages: os-filter-obj: 2.0.0 dev: true + /@msgpack/msgpack@3.0.0-beta2: + resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==} + engines: {node: '>= 14'} + dev: false + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} cpu: [arm64] @@ -4496,12 +4501,6 @@ packages: stream-exhaust: 1.0.2 dev: true - /async-mutex@0.4.0: - resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} - dependencies: - tslib: 2.6.0 - dev: false - /async-settle@1.0.0: resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} engines: {node: '>= 0.10'} @@ -15772,8 +15771,8 @@ packages: url-polyfill: 1.1.12 dev: true - github.com/thatonecalculator/emojilib/542fcc1a25003afad78f3248ceee8ac6980ddeb8: - resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/542fcc1a25003afad78f3248ceee8ac6980ddeb8} + github.com/thatonecalculator/emojilib/06944984a61ee799b7083894258f5fa318d932d1: + resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/06944984a61ee799b7083894258f5fa318d932d1} name: emojilib version: 3.0.10 dev: true From 76c9422d538bd28081bf952741b4b7c629afb809 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sun, 2 Jul 2023 20:55:20 -0400 Subject: [PATCH 293/309] add cache prefix --- packages/backend/src/misc/cache.ts | 11 +++++------ packages/backend/src/misc/check-hit-antenna.ts | 2 +- packages/backend/src/misc/emoji-meta.ts | 2 +- packages/backend/src/misc/keypair-store.ts | 2 +- packages/backend/src/misc/populate-emojis.ts | 2 +- packages/backend/src/models/repositories/user.ts | 2 +- .../backend/src/remote/activitypub/db-resolver.ts | 4 ++-- packages/backend/src/server/api/authenticate.ts | 2 +- packages/backend/src/server/nodeinfo.ts | 2 +- packages/backend/src/services/instance-actor.ts | 2 +- packages/backend/src/services/note/create.ts | 2 +- .../src/services/register-or-fetch-instance-doc.ts | 2 +- packages/backend/src/services/relay.ts | 2 +- packages/backend/src/services/user-cache.ts | 8 ++++---- 14 files changed, 22 insertions(+), 23 deletions(-) diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts index d790313d18..c2695aa789 100644 --- a/packages/backend/src/misc/cache.ts +++ b/packages/backend/src/misc/cache.ts @@ -1,19 +1,18 @@ import { redisClient } from "@/db/redis.js"; -import { nativeRandomStr } from "native-utils/built/index.js"; import { encode, decode } from "@msgpack/msgpack"; import { ChainableCommander } from "ioredis"; export class Cache<T> { private ttl: number; - private fingerprint: string; + private prefix: string; - constructor(ttl: number) { + constructor(prefix: string, ttl: number) { this.ttl = ttl; - this.fingerprint = `cache:${nativeRandomStr(32)}`; + this.prefix = `cache:${prefix}`; } private prefixedKey(key: string | null): string { - return key ? `${this.fingerprint}:${key}` : this.fingerprint; + return key ? `${this.prefix}:${key}` : this.prefix; } public async set(key: string | null, value: T, transaction?: ChainableCommander): Promise<void> { @@ -36,7 +35,7 @@ export class Cache<T> { } public async getAll(): Promise<Map<string, T>> { - const keys = await redisClient.keys(`${this.fingerprint}*`); + const keys = await redisClient.keys(`${this.prefix}*`); const map = new Map<string, T>(); if (keys.length === 0) { return map; diff --git a/packages/backend/src/misc/check-hit-antenna.ts b/packages/backend/src/misc/check-hit-antenna.ts index 358fba0f37..c422cca943 100644 --- a/packages/backend/src/misc/check-hit-antenna.ts +++ b/packages/backend/src/misc/check-hit-antenna.ts @@ -11,7 +11,7 @@ import * as Acct from "@/misc/acct.js"; import type { Packed } from "./schema.js"; import { Cache } from "./cache.js"; -const blockingCache = new Cache<User["id"][]>(1000 * 60 * 5); +const blockingCache = new Cache<User["id"][]>("blocking", 1000 * 60 * 5); // NOTE: フォローしているユーザーのノート、リストのユーザーのノート、グループのユーザーのノート指定はパフォーマンス上の理由で無効になっている diff --git a/packages/backend/src/misc/emoji-meta.ts b/packages/backend/src/misc/emoji-meta.ts index 45364bdcbc..d2d15411f7 100644 --- a/packages/backend/src/misc/emoji-meta.ts +++ b/packages/backend/src/misc/emoji-meta.ts @@ -11,7 +11,7 @@ export type Size = { height: number; }; -const cache = new Cache<boolean>(1000 * 60 * 10); // once every 10 minutes for the same url +const cache = new Cache<boolean>("emojiMeta",1000 * 60 * 10); // once every 10 minutes for the same url const logger = new Logger("emoji"); export async function getEmojiSize(url: string): Promise<Size> { diff --git a/packages/backend/src/misc/keypair-store.ts b/packages/backend/src/misc/keypair-store.ts index 4551bfd988..b0e07c4ab4 100644 --- a/packages/backend/src/misc/keypair-store.ts +++ b/packages/backend/src/misc/keypair-store.ts @@ -3,7 +3,7 @@ import type { User } from "@/models/entities/user.js"; import type { UserKeypair } from "@/models/entities/user-keypair.js"; import { Cache } from "./cache.js"; -const cache = new Cache<UserKeypair>(Infinity); +const cache = new Cache<UserKeypair>("keypairStore", Infinity); export async function getUserKeypair(userId: User["id"]): Promise<UserKeypair> { return await cache.fetch(userId, () => diff --git a/packages/backend/src/misc/populate-emojis.ts b/packages/backend/src/misc/populate-emojis.ts index ce25dd5594..e6e6c2fb90 100644 --- a/packages/backend/src/misc/populate-emojis.ts +++ b/packages/backend/src/misc/populate-emojis.ts @@ -9,7 +9,7 @@ import config from "@/config/index.js"; import { query } from "@/prelude/url.js"; import { redisClient } from "@/db/redis.js"; -const cache = new Cache<Emoji | null>(1000 * 60 * 60 * 12); +const cache = new Cache<Emoji | null>("populateEmojis", 1000 * 60 * 60 * 12); /** * 添付用絵文字情報 diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 48c8d75b3b..2bd8d4fbaa 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -40,7 +40,7 @@ import { } from "../index.js"; import type { Instance } from "../entities/instance.js"; -const userInstanceCache = new Cache<Instance | null>(1000 * 60 * 60 * 3); +const userInstanceCache = new Cache<Instance | null>("userInstance", 1000 * 60 * 60 * 3); type IsUserDetailed<Detailed extends boolean> = Detailed extends true ? Packed<"UserDetailed"> diff --git a/packages/backend/src/remote/activitypub/db-resolver.ts b/packages/backend/src/remote/activitypub/db-resolver.ts index 6e448d4b17..4b4ea96270 100644 --- a/packages/backend/src/remote/activitypub/db-resolver.ts +++ b/packages/backend/src/remote/activitypub/db-resolver.ts @@ -20,8 +20,8 @@ import type { IObject } from "./type.js"; import { getApId } from "./type.js"; import { resolvePerson } from "./models/person.js"; -const publicKeyCache = new Cache<UserPublickey | null>(Infinity); -const publicKeyByUserIdCache = new Cache<UserPublickey | null>(Infinity); +const publicKeyCache = new Cache<UserPublickey | null>("publicKey", Infinity); +const publicKeyByUserIdCache = new Cache<UserPublickey | null>("publicKeyByUserId", Infinity); export type UriParseResult = | { diff --git a/packages/backend/src/server/api/authenticate.ts b/packages/backend/src/server/api/authenticate.ts index 42274ad2a4..b6fa973eb2 100644 --- a/packages/backend/src/server/api/authenticate.ts +++ b/packages/backend/src/server/api/authenticate.ts @@ -9,7 +9,7 @@ import { localUserByNativeTokenCache, } from "@/services/user-cache.js"; -const appCache = new Cache<App>(Infinity); +const appCache = new Cache<App>("app", Infinity); export class AuthenticationError extends Error { constructor(message: string) { diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts index dbfb28ff6a..28cefd2cf7 100644 --- a/packages/backend/src/server/nodeinfo.ts +++ b/packages/backend/src/server/nodeinfo.ts @@ -100,7 +100,7 @@ const nodeinfo2 = async () => { }; }; -const cache = new Cache<Awaited<ReturnType<typeof nodeinfo2>>>(1000 * 60 * 10); +const cache = new Cache<Awaited<ReturnType<typeof nodeinfo2>>>("nodeinfo", 1000 * 60 * 10); router.get(nodeinfo2_1path, async (ctx) => { const base = await cache.fetch(null, () => nodeinfo2()); diff --git a/packages/backend/src/services/instance-actor.ts b/packages/backend/src/services/instance-actor.ts index 9240f31073..1822cb3c7c 100644 --- a/packages/backend/src/services/instance-actor.ts +++ b/packages/backend/src/services/instance-actor.ts @@ -6,7 +6,7 @@ import { IsNull } from "typeorm"; const ACTOR_USERNAME = "instance.actor" as const; -const cache = new Cache<ILocalUser>(Infinity); +const cache = new Cache<ILocalUser>("instanceActor", Infinity); export async function getInstanceActor(): Promise<ILocalUser> { const cached = await cache.get(null); diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index f00678ce22..ca0f05f2c3 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -73,7 +73,7 @@ import { Mutex } from "redis-semaphore"; const mutedWordsCache = new Cache< { userId: UserProfile["userId"]; mutedWords: UserProfile["mutedWords"] }[] ->(1000 * 60 * 5); +>("mutedWords", 1000 * 60 * 5); type NotificationType = "reply" | "renote" | "quote" | "mention"; diff --git a/packages/backend/src/services/register-or-fetch-instance-doc.ts b/packages/backend/src/services/register-or-fetch-instance-doc.ts index ddb9ce2413..e0c2880376 100644 --- a/packages/backend/src/services/register-or-fetch-instance-doc.ts +++ b/packages/backend/src/services/register-or-fetch-instance-doc.ts @@ -4,7 +4,7 @@ import { genId } from "@/misc/gen-id.js"; import { toPuny } from "@/misc/convert-host.js"; import { Cache } from "@/misc/cache.js"; -const cache = new Cache<Instance>(1000 * 60 * 60); +const cache = new Cache<Instance>("registerOrFetchInstanceDoc", 1000 * 60 * 60); export async function registerOrFetchInstanceDoc( host: string, diff --git a/packages/backend/src/services/relay.ts b/packages/backend/src/services/relay.ts index 2325f76c69..1ec2891e8a 100644 --- a/packages/backend/src/services/relay.ts +++ b/packages/backend/src/services/relay.ts @@ -15,7 +15,7 @@ import { createSystemUser } from "./create-system-user.js"; const ACTOR_USERNAME = "relay.actor" as const; -const relaysCache = new Cache<Relay[]>(1000 * 60 * 10); +const relaysCache = new Cache<Relay[]>("relay", 1000 * 60 * 10); export async function getRelayActor(): Promise<ILocalUser> { const user = await Users.findOneBy({ diff --git a/packages/backend/src/services/user-cache.ts b/packages/backend/src/services/user-cache.ts index 373fb86869..7fde21d873 100644 --- a/packages/backend/src/services/user-cache.ts +++ b/packages/backend/src/services/user-cache.ts @@ -3,17 +3,17 @@ import type { CacheableUser, ILocalUser, } from "@/models/entities/user.js"; -import { User } from "@/models/entities/user.js"; import { Users } from "@/models/index.js"; import { Cache } from "@/misc/cache.js"; import { redisClient, subscriber } from "@/db/redis.js"; -export const userByIdCache = new Cache<CacheableUser>(Infinity); +export const userByIdCache = new Cache<CacheableUser>("userById", Infinity); export const localUserByNativeTokenCache = new Cache<CacheableLocalUser | null>( + "localUserByNativeToken", Infinity, ); -export const localUserByIdCache = new Cache<CacheableLocalUser>(Infinity); -export const uriPersonCache = new Cache<CacheableUser | null>(Infinity); +export const localUserByIdCache = new Cache<CacheableLocalUser>("localUserByIdCache", Infinity); +export const uriPersonCache = new Cache<CacheableUser | null>("uriPerson", Infinity); subscriber.on("message", async (_, data) => { const obj = JSON.parse(data); From 355b1e0063ab7dea54ce1388f0eb3ad01137180b Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sun, 2 Jul 2023 22:10:33 -0400 Subject: [PATCH 294/309] no more infinity caches --- packages/backend/src/misc/cache.ts | 36 ++++++++++++------ .../backend/src/misc/check-hit-antenna.ts | 2 +- packages/backend/src/misc/emoji-meta.ts | 2 +- packages/backend/src/misc/keypair-store.ts | 8 ++-- packages/backend/src/misc/populate-emojis.ts | 2 +- .../backend/src/models/repositories/user.ts | 6 ++- .../src/remote/activitypub/db-resolver.ts | 38 ++++++++++++------- .../src/remote/activitypub/models/person.ts | 2 +- .../backend/src/server/api/authenticate.ts | 10 +++-- packages/backend/src/server/nodeinfo.ts | 5 ++- .../backend/src/services/instance-actor.ts | 4 +- packages/backend/src/services/note/create.ts | 7 +--- .../register-or-fetch-instance-doc.ts | 2 +- packages/backend/src/services/relay.ts | 2 +- packages/backend/src/services/user-cache.ts | 14 +++++-- 15 files changed, 89 insertions(+), 51 deletions(-) diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts index c2695aa789..588931ff1f 100644 --- a/packages/backend/src/misc/cache.ts +++ b/packages/backend/src/misc/cache.ts @@ -6,8 +6,8 @@ export class Cache<T> { private ttl: number; private prefix: string; - constructor(prefix: string, ttl: number) { - this.ttl = ttl; + constructor(prefix: string, ttlSeconds: number) { + this.ttl = ttlSeconds; this.prefix = `cache:${prefix}`; } @@ -15,26 +15,28 @@ export class Cache<T> { return key ? `${this.prefix}:${key}` : this.prefix; } - public async set(key: string | null, value: T, transaction?: ChainableCommander): Promise<void> { + public async set( + key: string | null, + value: T, + transaction?: ChainableCommander, + ): Promise<void> { const _key = this.prefixedKey(key); const _value = Buffer.from(encode(value)); const commander = transaction ?? redisClient; - if (this.ttl === Infinity) { - await commander.set(_key, _value); - } else { - await commander.set(_key, _value, "PX", this.ttl); - } + await commander.set(_key, _value, "EX", this.ttl); } - public async get(key: string | null): Promise<T | undefined> { + public async get(key: string | null, renew = false): Promise<T | undefined> { const _key = this.prefixedKey(key); const cached = await redisClient.getBuffer(_key); if (cached === null) return undefined; + if (renew) await redisClient.expire(_key, this.ttl); + return decode(cached) as T; } - public async getAll(): Promise<Map<string, T>> { + public async getAll(renew = false): Promise<Map<string, T>> { const keys = await redisClient.keys(`${this.prefix}*`); const map = new Map<string, T>(); if (keys.length === 0) { @@ -49,6 +51,14 @@ export class Cache<T> { } } + if (renew) { + const trans = redisClient.multi(); + for (const key of map.keys()) { + trans.expire(key, this.ttl); + } + await trans.exec(); + } + return map; } @@ -66,9 +76,10 @@ export class Cache<T> { public async fetch( key: string | null, fetcher: () => Promise<T>, + renew = false, validator?: (cachedValue: T) => boolean, ): Promise<T> { - const cachedValue = await this.get(key); + const cachedValue = await this.get(key, renew); if (cachedValue !== undefined) { if (validator) { if (validator(cachedValue)) { @@ -94,9 +105,10 @@ export class Cache<T> { public async fetchMaybe( key: string | null, fetcher: () => Promise<T | undefined>, + renew = false, validator?: (cachedValue: T) => boolean, ): Promise<T | undefined> { - const cachedValue = await this.get(key); + const cachedValue = await this.get(key, renew); if (cachedValue !== undefined) { if (validator) { if (validator(cachedValue)) { diff --git a/packages/backend/src/misc/check-hit-antenna.ts b/packages/backend/src/misc/check-hit-antenna.ts index c422cca943..1ff09d6299 100644 --- a/packages/backend/src/misc/check-hit-antenna.ts +++ b/packages/backend/src/misc/check-hit-antenna.ts @@ -11,7 +11,7 @@ import * as Acct from "@/misc/acct.js"; import type { Packed } from "./schema.js"; import { Cache } from "./cache.js"; -const blockingCache = new Cache<User["id"][]>("blocking", 1000 * 60 * 5); +const blockingCache = new Cache<User["id"][]>("blocking", 60 * 5); // NOTE: フォローしているユーザーのノート、リストのユーザーのノート、グループのユーザーのノート指定はパフォーマンス上の理由で無効になっている diff --git a/packages/backend/src/misc/emoji-meta.ts b/packages/backend/src/misc/emoji-meta.ts index d2d15411f7..2b9365b826 100644 --- a/packages/backend/src/misc/emoji-meta.ts +++ b/packages/backend/src/misc/emoji-meta.ts @@ -11,7 +11,7 @@ export type Size = { height: number; }; -const cache = new Cache<boolean>("emojiMeta",1000 * 60 * 10); // once every 10 minutes for the same url +const cache = new Cache<boolean>("emojiMeta", 60 * 10); // once every 10 minutes for the same url const logger = new Logger("emoji"); export async function getEmojiSize(url: string): Promise<Size> { diff --git a/packages/backend/src/misc/keypair-store.ts b/packages/backend/src/misc/keypair-store.ts index b0e07c4ab4..6255773599 100644 --- a/packages/backend/src/misc/keypair-store.ts +++ b/packages/backend/src/misc/keypair-store.ts @@ -3,10 +3,12 @@ import type { User } from "@/models/entities/user.js"; import type { UserKeypair } from "@/models/entities/user-keypair.js"; import { Cache } from "./cache.js"; -const cache = new Cache<UserKeypair>("keypairStore", Infinity); +const cache = new Cache<UserKeypair>("keypairStore", 60 * 30); export async function getUserKeypair(userId: User["id"]): Promise<UserKeypair> { - return await cache.fetch(userId, () => - UserKeypairs.findOneByOrFail({ userId: userId }), + return await cache.fetch( + userId, + () => UserKeypairs.findOneByOrFail({ userId: userId }), + true, ); } diff --git a/packages/backend/src/misc/populate-emojis.ts b/packages/backend/src/misc/populate-emojis.ts index e6e6c2fb90..795a267f91 100644 --- a/packages/backend/src/misc/populate-emojis.ts +++ b/packages/backend/src/misc/populate-emojis.ts @@ -9,7 +9,7 @@ import config from "@/config/index.js"; import { query } from "@/prelude/url.js"; import { redisClient } from "@/db/redis.js"; -const cache = new Cache<Emoji | null>("populateEmojis", 1000 * 60 * 60 * 12); +const cache = new Cache<Emoji | null>("populateEmojis", 60 * 60 * 12); /** * 添付用絵文字情報 diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 2bd8d4fbaa..5ca36e3d31 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -1,4 +1,3 @@ -import { URL } from "url"; import { In, Not } from "typeorm"; import Ajv from "ajv"; import type { ILocalUser, IRemoteUser } from "@/models/entities/user.js"; @@ -40,7 +39,10 @@ import { } from "../index.js"; import type { Instance } from "../entities/instance.js"; -const userInstanceCache = new Cache<Instance | null>("userInstance", 1000 * 60 * 60 * 3); +const userInstanceCache = new Cache<Instance | null>( + "userInstance", + 60 * 60 * 3, +); type IsUserDetailed<Detailed extends boolean> = Detailed extends true ? Packed<"UserDetailed"> diff --git a/packages/backend/src/remote/activitypub/db-resolver.ts b/packages/backend/src/remote/activitypub/db-resolver.ts index 4b4ea96270..a710b9f115 100644 --- a/packages/backend/src/remote/activitypub/db-resolver.ts +++ b/packages/backend/src/remote/activitypub/db-resolver.ts @@ -5,7 +5,6 @@ import type { CacheableRemoteUser, CacheableUser, } from "@/models/entities/user.js"; -import { User, IRemoteUser } from "@/models/entities/user.js"; import type { UserPublickey } from "@/models/entities/user-publickey.js"; import type { MessagingMessage } from "@/models/entities/messaging-message.js"; import { @@ -20,8 +19,11 @@ import type { IObject } from "./type.js"; import { getApId } from "./type.js"; import { resolvePerson } from "./models/person.js"; -const publicKeyCache = new Cache<UserPublickey | null>("publicKey", Infinity); -const publicKeyByUserIdCache = new Cache<UserPublickey | null>("publicKeyByUserId", Infinity); +const publicKeyCache = new Cache<UserPublickey | null>("publicKey", 60 * 30); +const publicKeyByUserIdCache = new Cache<UserPublickey | null>( + "publicKeyByUserId", + 60 * 30, +); export type UriParseResult = | { @@ -123,17 +125,23 @@ export default class DbResolver { if (parsed.type !== "users") return null; return ( - (await userByIdCache.fetchMaybe(parsed.id, () => - Users.findOneBy({ - id: parsed.id, - }).then((x) => x ?? undefined), + (await userByIdCache.fetchMaybe( + parsed.id, + () => + Users.findOneBy({ + id: parsed.id, + }).then((x) => x ?? undefined), + true, )) ?? null ); } else { - return await uriPersonCache.fetch(parsed.uri, () => - Users.findOneBy({ - uri: parsed.uri, - }), + return await uriPersonCache.fetch( + parsed.uri, + () => + Users.findOneBy({ + uri: parsed.uri, + }), + true, ); } } @@ -156,14 +164,17 @@ export default class DbResolver { return key; }, + true, (key) => key != null, ); if (key == null) return null; return { - user: (await userByIdCache.fetch(key.userId, () => - Users.findOneByOrFail({ id: key.userId }), + user: (await userByIdCache.fetch( + key.userId, + () => Users.findOneByOrFail({ id: key.userId }), + true, )) as CacheableRemoteUser, key, }; @@ -183,6 +194,7 @@ export default class DbResolver { const key = await publicKeyByUserIdCache.fetch( user.id, () => UserPublickeys.findOneBy({ userId: user.id }), + true, (v) => v != null, ); diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index c541e9ae50..c5519ba031 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -135,7 +135,7 @@ export async function fetchPerson( ): Promise<CacheableUser | null> { if (typeof uri !== "string") throw new Error("uri is not string"); - const cached = await uriPersonCache.get(uri); + const cached = await uriPersonCache.get(uri, true); if (cached) return cached; // Fetch from the database if the URI points to this server diff --git a/packages/backend/src/server/api/authenticate.ts b/packages/backend/src/server/api/authenticate.ts index b6fa973eb2..460a0ce84b 100644 --- a/packages/backend/src/server/api/authenticate.ts +++ b/packages/backend/src/server/api/authenticate.ts @@ -9,7 +9,7 @@ import { localUserByNativeTokenCache, } from "@/services/user-cache.js"; -const appCache = new Cache<App>("app", Infinity); +const appCache = new Cache<App>("app", 60 * 30); export class AuthenticationError extends Error { constructor(message: string) { @@ -49,6 +49,7 @@ export default async ( const user = await localUserByNativeTokenCache.fetch( token, () => Users.findOneBy({ token }) as Promise<ILocalUser | null>, + true, ); if (user == null) { @@ -82,11 +83,14 @@ export default async ( Users.findOneBy({ id: accessToken.userId, }) as Promise<ILocalUser>, + true, ); if (accessToken.appId) { - const app = await appCache.fetch(accessToken.appId, () => - Apps.findOneByOrFail({ id: accessToken.appId! }), + const app = await appCache.fetch( + accessToken.appId, + () => Apps.findOneByOrFail({ id: accessToken.appId! }), + true, ); return [ diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts index 28cefd2cf7..940ca2e135 100644 --- a/packages/backend/src/server/nodeinfo.ts +++ b/packages/backend/src/server/nodeinfo.ts @@ -100,7 +100,10 @@ const nodeinfo2 = async () => { }; }; -const cache = new Cache<Awaited<ReturnType<typeof nodeinfo2>>>("nodeinfo", 1000 * 60 * 10); +const cache = new Cache<Awaited<ReturnType<typeof nodeinfo2>>>( + "nodeinfo", + 60 * 10, +); router.get(nodeinfo2_1path, async (ctx) => { const base = await cache.fetch(null, () => nodeinfo2()); diff --git a/packages/backend/src/services/instance-actor.ts b/packages/backend/src/services/instance-actor.ts index 1822cb3c7c..a8b34ea57b 100644 --- a/packages/backend/src/services/instance-actor.ts +++ b/packages/backend/src/services/instance-actor.ts @@ -6,10 +6,10 @@ import { IsNull } from "typeorm"; const ACTOR_USERNAME = "instance.actor" as const; -const cache = new Cache<ILocalUser>("instanceActor", Infinity); +const cache = new Cache<ILocalUser>("instanceActor", 60 * 30); export async function getInstanceActor(): Promise<ILocalUser> { - const cached = await cache.get(null); + const cached = await cache.get(null, true); if (cached) return cached; const user = (await Users.findOneBy({ diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index ca0f05f2c3..095c75f427 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -29,17 +29,14 @@ import { Notes, Instances, UserProfiles, - Antennas, - Followings, MutedNotes, Channels, ChannelFollowings, - Blockings, NoteThreadMutings, } from "@/models/index.js"; import type { DriveFile } from "@/models/entities/drive-file.js"; import type { App } from "@/models/entities/app.js"; -import { Not, In, IsNull } from "typeorm"; +import { Not, In } from "typeorm"; import type { User, ILocalUser, IRemoteUser } from "@/models/entities/user.js"; import { genId } from "@/misc/gen-id.js"; import { @@ -73,7 +70,7 @@ import { Mutex } from "redis-semaphore"; const mutedWordsCache = new Cache< { userId: UserProfile["userId"]; mutedWords: UserProfile["mutedWords"] }[] ->("mutedWords", 1000 * 60 * 5); +>("mutedWords", 60 * 5); type NotificationType = "reply" | "renote" | "quote" | "mention"; diff --git a/packages/backend/src/services/register-or-fetch-instance-doc.ts b/packages/backend/src/services/register-or-fetch-instance-doc.ts index e0c2880376..c0ead08190 100644 --- a/packages/backend/src/services/register-or-fetch-instance-doc.ts +++ b/packages/backend/src/services/register-or-fetch-instance-doc.ts @@ -4,7 +4,7 @@ import { genId } from "@/misc/gen-id.js"; import { toPuny } from "@/misc/convert-host.js"; import { Cache } from "@/misc/cache.js"; -const cache = new Cache<Instance>("registerOrFetchInstanceDoc", 1000 * 60 * 60); +const cache = new Cache<Instance>("registerOrFetchInstanceDoc", 60 * 60); export async function registerOrFetchInstanceDoc( host: string, diff --git a/packages/backend/src/services/relay.ts b/packages/backend/src/services/relay.ts index 1ec2891e8a..6f7829c218 100644 --- a/packages/backend/src/services/relay.ts +++ b/packages/backend/src/services/relay.ts @@ -15,7 +15,7 @@ import { createSystemUser } from "./create-system-user.js"; const ACTOR_USERNAME = "relay.actor" as const; -const relaysCache = new Cache<Relay[]>("relay", 1000 * 60 * 10); +const relaysCache = new Cache<Relay[]>("relay", 60 * 10); export async function getRelayActor(): Promise<ILocalUser> { const user = await Users.findOneBy({ diff --git a/packages/backend/src/services/user-cache.ts b/packages/backend/src/services/user-cache.ts index 7fde21d873..ed700185df 100644 --- a/packages/backend/src/services/user-cache.ts +++ b/packages/backend/src/services/user-cache.ts @@ -7,13 +7,19 @@ import { Users } from "@/models/index.js"; import { Cache } from "@/misc/cache.js"; import { redisClient, subscriber } from "@/db/redis.js"; -export const userByIdCache = new Cache<CacheableUser>("userById", Infinity); +export const userByIdCache = new Cache<CacheableUser>("userById", 60 * 30); export const localUserByNativeTokenCache = new Cache<CacheableLocalUser | null>( "localUserByNativeToken", - Infinity, + 60 * 30, +); +export const localUserByIdCache = new Cache<CacheableLocalUser>( + "localUserByIdCache", + 60 * 30, +); +export const uriPersonCache = new Cache<CacheableUser | null>( + "uriPerson", + 60 * 30, ); -export const localUserByIdCache = new Cache<CacheableLocalUser>("localUserByIdCache", Infinity); -export const uriPersonCache = new Cache<CacheableUser | null>("uriPerson", Infinity); subscriber.on("message", async (_, data) => { const obj = JSON.parse(data); From f17c9837c572095a27f6ea9a83e1aadab15b6bb7 Mon Sep 17 00:00:00 2001 From: Syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Jul 2023 16:20:40 -0700 Subject: [PATCH 295/309] =?UTF-8?q?refactor:=20=E2=9A=A1=20make=20identico?= =?UTF-8?q?ns=20and=20server=20metrics=20optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kainoa Kanter <kainoa@t1c.dev> --- locales/en-US.yml | 2 ++ locales/ja-JP.yml | 2 ++ packages/backend/assets/avatar.png | Bin 0 -> 14059 bytes .../1688280713783-add-meta-options.js | 21 ++++++++++++++++++ packages/backend/src/daemons/server-stats.ts | 4 ++++ packages/backend/src/models/entities/meta.ts | 10 +++++++++ .../src/server/api/endpoints/admin/meta.ts | 12 ++++++++++ .../src/server/api/endpoints/server-info.ts | 21 +++++++++++++++++- packages/backend/src/server/index.ts | 15 +++++++++---- packages/client/src/pages/admin/settings.vue | 17 ++++++++++++++ .../src/widgets/server-metric/index.vue | 2 +- 11 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 packages/backend/assets/avatar.png create mode 100644 packages/backend/migration/1688280713783-add-meta-options.js diff --git a/locales/en-US.yml b/locales/en-US.yml index d493f332f5..c6c442df7c 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1112,6 +1112,8 @@ isModerator: "Moderator" isAdmin: "Administrator" isPatron: "Calckey Patron" reactionPickerSkinTone: "Preferred emoji skin tone" +enableServerMachineStats: "Enable server hardware statistics" +enableIdenticonGeneration: "Enable Identicon generation" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fa3c3f1cc1..9f2f825e55 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -978,6 +978,8 @@ enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" preventAiLearning: "AIによる学習を防止" preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。" noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。" +enableServerMachineStats: "サーバーのマシン情報を公開する" +enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" _sensitiveMediaDetection: description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" diff --git a/packages/backend/assets/avatar.png b/packages/backend/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..ee22bdb3c8e56d6e44c1a8eb3dec0d62bb427657 GIT binary patch literal 14059 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 NDa&ifRmoU}{|~xPiZcKJ literal 0 HcmV?d00001 diff --git a/packages/backend/migration/1688280713783-add-meta-options.js b/packages/backend/migration/1688280713783-add-meta-options.js new file mode 100644 index 0000000000..e97a95c423 --- /dev/null +++ b/packages/backend/migration/1688280713783-add-meta-options.js @@ -0,0 +1,21 @@ +export class AddMetaOptions1688280713783 { + name = "AddMetaOptions1688280713783"; + + async up(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`, + ); + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`, + ); + } + + async down(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`, + ); + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`, + ); + } +} diff --git a/packages/backend/src/daemons/server-stats.ts b/packages/backend/src/daemons/server-stats.ts index c936d619ab..ba74278762 100644 --- a/packages/backend/src/daemons/server-stats.ts +++ b/packages/backend/src/daemons/server-stats.ts @@ -1,6 +1,7 @@ import si from "systeminformation"; import Xev from "xev"; import * as osUtils from "os-utils"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import meilisearch from "../db/meilisearch.js"; const ev = new Xev(); @@ -20,6 +21,9 @@ export default function () { ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50)); }); + const meta = fetchMeta(); + if (!meta.enableServerMachineStats) return; + async function tick() { const cpu = await cpuUsage(); const memStats = await mem(); diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index dd3c5b3b72..200ef50552 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -546,4 +546,14 @@ export class Meta { default: {}, }) public experimentalFeatures: Record<string, unknown>; + + @Column("boolean", { + default: false, + }) + public enableServerMachineStats: boolean; + + @Column("boolean", { + default: true, + }) + public enableIdenticonGeneration: boolean; } diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 3193301275..50317d4a81 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -481,6 +481,16 @@ export const meta = { }, }, }, + enableServerMachineStats: { + type: "boolean", + optional: false, + nullable: false, + }, + enableIdenticonGeneration: { + type: "boolean", + optional: false, + nullable: false, + }, }, }, } as const; @@ -592,5 +602,7 @@ export default define(meta, paramDef, async (ps, me) => { enableIpLogging: instance.enableIpLogging, enableActiveEmailValidation: instance.enableActiveEmailValidation, experimentalFeatures: instance.experimentalFeatures, + enableServerMachineStats: instance.enableServerMachineStats, + enableIdenticonGeneration: instance.enableIdenticonGeneration, }; }); diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts index 81bb053db4..746eae6621 100644 --- a/packages/backend/src/server/api/endpoints/server-info.ts +++ b/packages/backend/src/server/api/endpoints/server-info.ts @@ -2,11 +2,13 @@ import * as os from "node:os"; import si from "systeminformation"; import define from "../define.js"; import meilisearch from "@/db/meilisearch.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { requireCredential: false, requireCredentialPrivateMode: true, - + allowGet: true, + cacheSec: 30, tags: ["meta"], } as const; @@ -29,6 +31,23 @@ export default define(meta, paramDef, async () => { } } + const instanceMeta = await fetchMeta(); + if (!instanceMeta.enableServerMachineStats) { + return { + machine: 'Not specified', + cpu: { + model: 'Not specified', + cores: 0, + }, + mem: { + total: 0, + }, + fs: { + total: 0, + used: 0, + }, + }; + } return { machine: os.hostname(), cpu: { diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 95d570eb3d..7f8d0ed718 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -16,6 +16,7 @@ import { IsNull } from "typeorm"; import config from "@/config/index.js"; import Logger from "@/services/logger.js"; import { UserProfiles, Users } from "@/models/index.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import { genIdenticon } from "@/misc/gen-identicon.js"; import { createTemp } from "@/misc/create-temp.js"; import { publishMainStream } from "@/services/stream.js"; @@ -125,10 +126,16 @@ router.get("/avatar/@:acct", async (ctx) => { }); router.get("/identicon/:x", async (ctx) => { - const [temp, cleanup] = await createTemp(); - await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); - ctx.set("Content-Type", "image/png"); - ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + const meta = await fetchMeta(); + if (meta.enableIdenticonGeneration) { + const [temp, cleanup] = await createTemp(); + await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); + ctx.set("Content-Type", "image/png"); + ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + } + else { + ctx.redirect("/static-assets/avatar.png") + } }); mastoRouter.get("/oauth/authorize", async (ctx) => { diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index e67c44b0a4..0e83250bac 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -343,6 +343,17 @@ </template> </FormSection> + <FormSection> + <template #label>Server Performance</template> + <FormSwitch v-model="enableServerMachineStats"> + <template #label>{{ i18n.ts.enableServerMachineStats }}</template> + </FormSwitch> + + <FormSwitch v-model="enableIdenticonGeneration"> + <template #label>{{ i18n.ts.enableIdenticonGeneration }}</template> + </FormSwitch> + </FormSection> + <FormSection> <template #label>DeepL Translation</template> @@ -442,6 +453,8 @@ let libreTranslateApiUrl: string = $ref(""); let libreTranslateApiKey: string = $ref(""); let defaultReaction: string = $ref(""); let defaultReactionCustom: string = $ref(""); +let enableServerMachineStats: boolean = $ref(false); +let enableIdenticonGeneration: boolean = $ref(false); async function init() { const meta = await os.api("admin/meta"); @@ -482,6 +495,8 @@ async function init() { defaultReactionCustom = ["⭐", "👍", "❤️"].includes(meta.defaultReaction) ? "" : meta.defaultReaction; + enableServerMachineStats = meta.enableServerMachineStats; + enableIdenticonGeneration = meta.enableIdenticonGeneration; } function save() { @@ -521,6 +536,8 @@ function save() { libreTranslateApiUrl, libreTranslateApiKey, defaultReaction, + enableServerMachineStats, + enableIdenticonGeneration, }).then(() => { fetchInstance(); }); diff --git a/packages/client/src/widgets/server-metric/index.vue b/packages/client/src/widgets/server-metric/index.vue index cf84212b1e..49dc59ea27 100644 --- a/packages/client/src/widgets/server-metric/index.vue +++ b/packages/client/src/widgets/server-metric/index.vue @@ -106,7 +106,7 @@ const { widgetProps, configure, save } = useWidgetPropsManager( const meta = ref(null); -os.api("server-info", {}).then((res) => { +os.apiGet("server-info", {}).then((res) => { meta.value = res; }); From af4797bb8e9d69f3452f5d19c92220f700b70e9a Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sun, 2 Jul 2023 22:21:19 -0400 Subject: [PATCH 296/309] throw error if failed --- .../backend/src/server/api/endpoints/admin/emoji/add.ts | 9 ++------- .../backend/src/server/api/endpoints/admin/emoji/copy.ts | 9 ++------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts index 7d40816135..4366406ec3 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts @@ -6,7 +6,7 @@ import { ApiError } from "../../../error.js"; import rndstr from "rndstr"; import { publishBroadcastStream } from "@/services/stream.js"; import { db } from "@/db/postgre.js"; -import { type Size, getEmojiSize } from "@/misc/emoji-meta.js"; +import { getEmojiSize } from "@/misc/emoji-meta.js"; export const meta = { tags: ["admin"], @@ -40,12 +40,7 @@ export default define(meta, paramDef, async (ps, me) => { ? file.name.split(".")[0] : `_${rndstr("a-z0-9", 8)}_`; - let size: Size = { width: 0, height: 0 }; - try { - size = await getEmojiSize(file.url); - } catch { - /* skip if any error happens */ - } + const size = await getEmojiSize(file.url); const emoji = await Emojis.insert({ id: genId(), diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts index 45cb9464db..c90e606335 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts @@ -6,7 +6,7 @@ import type { DriveFile } from "@/models/entities/drive-file.js"; import { uploadFromUrl } from "@/services/drive/upload-from-url.js"; import { publishBroadcastStream } from "@/services/stream.js"; import { db } from "@/db/postgre.js"; -import { type Size, getEmojiSize } from "@/misc/emoji-meta.js"; +import { getEmojiSize } from "@/misc/emoji-meta.js"; export const meta = { tags: ["admin"], @@ -65,12 +65,7 @@ export default define(meta, paramDef, async (ps, me) => { throw new ApiError(); } - let size: Size = { width: 0, height: 0 }; - try { - size = await getEmojiSize(driveFile.url); - } catch { - /* skip if any error happens */ - } + const size = await getEmojiSize(driveFile.url); const copied = await Emojis.insert({ id: genId(), From 3434c23ae6a63b9bf472dbb55dd7ec59a13ffefd Mon Sep 17 00:00:00 2001 From: Poesty Li <poesty7450@gmail.com> Date: Mon, 3 Jul 2023 01:25:50 +0000 Subject: [PATCH 297/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 97.4% (1769 of 1816 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 6903f447d0..110149d737 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -10,7 +10,7 @@ password: "密码" forgotPassword: "忘记密码" fetchingAsApObject: "正在联邦宇宙查询中" ok: "OK" -gotIt: "我明白了" +gotIt: "知道了!" cancel: "取消" enterUsername: "输入用户名" renotedBy: "转发自 {user}" @@ -78,7 +78,7 @@ followsYou: "正在关注你" createList: "创建列表" manageLists: "管理列表" error: "错误" -somethingHappened: "出现了一些问题!" +somethingHappened: "发生了一个错误" retry: "重试" pageLoadError: "页面加载失败。" pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。" @@ -202,7 +202,7 @@ noUsers: "无用户" editProfile: "编辑资料" noteDeleteConfirm: "要删除该帖子吗?" pinLimitExceeded: "无法置顶更多帖子了" -intro: "Misskey的部署结束啦!填写管理员账号吧!" +intro: "Calckey安装完成!请创建一个管理员用户。" done: "完成" processing: "正在处理" preview: "预览" @@ -222,10 +222,10 @@ instanceFollowers: "服务器的关注者" instanceUsers: "此服务器的用户" changePassword: "修改密码" security: "安全" -retypedNotMatch: "两次输入不一致!" +retypedNotMatch: "两次输入不匹配。" currentPassword: "现在的密码" newPassword: "新密码" -newPasswordRetype: "重新输入密码:" +newPasswordRetype: "重新输入新密码" attachFile: "插入附件" more: "更多!" featured: "热门" @@ -391,7 +391,7 @@ nUsersMentioned: "{n} 被提到" securityKey: "安全密钥" securityKeyName: "密钥名称" registerSecurityKey: "注册硬件安全密钥" -lastUsed: "最后使用:" +lastUsed: "上次使用" unregister: "删除账户" passwordLessLogin: "无密码登录" resetPassword: "重置密码" @@ -639,7 +639,7 @@ openInNewTab: "在新标签页中打开" openInSideView: "在侧边栏中打开" defaultNavigationBehaviour: "默认导航" editTheseSettingsMayBreakAccount: "编辑这些设置可以会损坏您的账号" -instanceTicker: "帖子的实例信息" +instanceTicker: "帖子的服务器信息" waitingFor: "等待{x}" random: "随机" system: "系统" @@ -759,7 +759,7 @@ instanceBlocking: "联邦管理" selectAccount: "选择账户" switchAccount: "切换账户" enabled: "已启用" -disabled: "已禁用 " +disabled: "已禁用" quickAction: "快捷操作" user: "用户" administration: "管理" @@ -875,7 +875,7 @@ statusbar: "状态栏" pleaseSelect: "请选择" reverse: "翻转" colored: "彩色" -refreshInterval: "刷新间隔" +refreshInterval: "更新间隔 " label: "标签" type: "类型" speed: "速度" @@ -1220,17 +1220,17 @@ _tutorial: step3_2: "你的主页和社交馈送是基于你所关注的人,所以试着先关注几个账户。{n点击个人资料右上角的加号圈就可以关注它。" step4_1: "让我们出去找你。" step4_2: "对于他们的第一条信息,有些人喜欢做{introduction}或一个简单的 \"hello world!\"" - step5_1: "时间限制,到处是时间限制!" - step5_2: "您的实例已启用各种时间线的{timelines}。" - step5_3: "主{icon}时间线是你可以看到你的订阅者的帖子的时间线。" - step5_4: "本地{icon}时间线是你可以看到实例中所有其他用户的信息的时间线。" - step5_5: "推荐的{icon}时间线 - 是时间轴,你可以看到管理员推荐的实例的信息" - step5_6: "社交{icon}时间线显示来自你的订阅者朋友的信息。" - step5_7: "全球{icon}时间线是你可以看到来自所有其他连接的实例的消息。" + step5_1: "时间线,无处不在的时间线!" + step5_2: "您的服务器已启用{timelines}种不同的时间线。" + step5_3: "主页{icon}时间线是你可以看到你关注账户的帖子的时间线。" + step5_4: "本地{icon}时间线是你可以看到此服务器上其它用户的帖子的时间线。" + step5_5: "社交{icon}时间线是主页和本地时间线的结合。" + step5_6: "推荐{icon}时间线是你可以看到管理员推荐服务器的帖子的时间线。" + step5_7: "全球{icon}时间线是你可以看到来自其它所有互联服务器的帖子的时间线。" step6_1: "那么,这里是什么地方?" - step6_2: "好吧,你不只是加入卡尔基。你已经加入了Fediverse的一个门户,这是一个由成千上万台服务器组成的互联网络,被称为 \"实例\"" + step6_2: "好吧,你不只是加入Calckey。你已经加入了Fediverse的一个门户,这是一个由成千上万台服务器组成的互联网络。" step6_3: "每个服务器的工作方式不同,并不是所有的服务器都运行Calckey。但这个人确实如此! 这有点复杂,但你很快就会明白的。" - step6_4: "现在去学习并享受乐趣!" + step6_4: "现在,去吧,去探索,去享受乐趣吧!" _2fa: alreadyRegistered: "此设备已被注册" registerTOTP: "注册设备" @@ -1292,7 +1292,7 @@ _permissions: _auth: shareAccess: "您要授权允许“{name}”访问您的帐户吗?" shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?" - permissionAsk: "这个应用程序需要以下权限" + permissionAsk: "此应用程序请求以下权限:" pleaseGoBack: "请返回到应用程序" callback: "回到应用程序" denied: "拒绝访问" @@ -1433,7 +1433,7 @@ _instanceCharts: usersTotal: "用户总计" notes: "帖子:增加/减少" notesTotal: "帖子总计" - ff: "关注/被关注:数量变化" + ff: "被关注用户/关注者的数量差异 " ffTotal: "关注/被关注者总计" cacheSize: "缓存大小:增加/减少" cacheSizeTotal: "缓存大小总计" @@ -1939,3 +1939,5 @@ isPatron: Calckey 赞助 _dialog: charactersExceeded: 超出了最大字符数!当前:{current} / 限制:{max} charactersBelow: 没有足够的字符!当前:{current} / 限制:{min} +enableIdenticonGeneration: 启用Identicon生成 +enableServerMachineStats: 启用服务器硬件统计 From 722ccf04f9041cf9fcb68c6cc87411318ea0c8c4 Mon Sep 17 00:00:00 2001 From: Namekuji <nmkj@waah.day> Date: Sun, 2 Jul 2023 23:14:28 -0400 Subject: [PATCH 298/309] rename arg --- packages/backend/src/misc/cache.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts index 588931ff1f..fe68908e57 100644 --- a/packages/backend/src/misc/cache.ts +++ b/packages/backend/src/misc/cache.ts @@ -6,9 +6,9 @@ export class Cache<T> { private ttl: number; private prefix: string; - constructor(prefix: string, ttlSeconds: number) { + constructor(name: string, ttlSeconds: number) { this.ttl = ttlSeconds; - this.prefix = `cache:${prefix}`; + this.prefix = `cache:${name}`; } private prefixedKey(key: string | null): string { From ac51ce005156a73ff183080e29e17ae43802b004 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Sun, 2 Jul 2023 23:41:38 -0400 Subject: [PATCH 299/309] refactor: combine MediaVideo & MediaImage components --- .../{MkMediaImage.vue => MkMedia.vue} | 96 ++++++++-- .../client/src/components/MkMediaList.vue | 26 +-- .../client/src/components/MkMediaVideo.vue | 169 ------------------ 3 files changed, 85 insertions(+), 206 deletions(-) rename packages/client/src/components/{MkMediaImage.vue => MkMedia.vue} (63%) delete mode 100644 packages/client/src/components/MkMediaVideo.vue diff --git a/packages/client/src/components/MkMediaImage.vue b/packages/client/src/components/MkMedia.vue similarity index 63% rename from packages/client/src/components/MkMediaImage.vue rename to packages/client/src/components/MkMedia.vue index cbd5c0515e..36e52ef429 100644 --- a/packages/client/src/components/MkMediaImage.vue +++ b/packages/client/src/components/MkMedia.vue @@ -1,9 +1,9 @@ <template> <button v-if="hide" class="qjewsnkg" @click="hide = false"> <ImgWithBlurhash - :hash="image.blurhash" - :title="image.comment" - :alt="image.comment" + :hash="media.blurhash" + :title="media.comment" + :alt="media.comment" /> <div class="text"> <div class="wrapper"> @@ -15,20 +15,51 @@ </div> </div> </button> - <div v-else class="gqnyydlz"> - <a :href="image.url"> + <div v-else class="gqnyydlz media" :class="{ mini: plyrMini }"> + <a + v-if="media.type.startsWith('image')" + :href="media.url" + > <ImgWithBlurhash - :hash="image.blurhash" + :hash="media.blurhash" :src="url" - :alt="image.comment" - :type="image.type" + :alt="media.comment" + :type="media.type" :cover="false" /> - <div v-if="image.type === 'image/gif'" class="gif">GIF</div> + <div v-if="media.type === 'image/gif'" class="gif">GIF</div> </a> + <VuePlyr + v-if="media.type.startsWith('video')" + ref="plyr" + :options="{ + controls: [ + 'play-large', + 'play', + 'progress', + 'current-time', + 'mute', + 'volume', + 'pip', + 'download', + 'fullscreen', + ], + disableContextMenu: false, + }" + > + <video + :poster="media.thumbnailUrl" + :aria-label="media.comment" + preload="none" + controls + @contextmenu.stop + > + <source :src="media.url" :type="media.type" /> + </video> + </VuePlyr> <div class="buttons"> <button - v-if="image.comment" + v-if="media.comment" v-tooltip="i18n.ts.alt" class="_button" @click.stop="captionPopup" @@ -47,7 +78,9 @@ </template> <script lang="ts" setup> -import { watch } from "vue"; +import { watch, ref, onMounted } from "vue"; +import VuePlyr from "vue-plyr"; +import "vue-plyr/dist/vue-plyr.css"; import type * as misskey from "calckey-js"; import { getStaticImageUrl } from "@/scripts/get-static-image-url"; import ImgWithBlurhash from "@/components/MkImgWithBlurhash.vue"; @@ -56,34 +89,37 @@ import { i18n } from "@/i18n"; import * as os from "@/os"; const props = defineProps<{ - image: misskey.entities.DriveFile; + media: misskey.entities.DriveFile; raw?: boolean; }>(); let hide = $ref(true); +const plyr = ref(); +const plyrMini = ref(false); + const url = props.raw || defaultStore.state.loadRawImages - ? props.image.url + ? props.media.url : defaultStore.state.disableShowingAnimatedImages - ? getStaticImageUrl(props.image.thumbnailUrl) - : props.image.thumbnailUrl; + ? getStaticImageUrl(props.media.thumbnailUrl) + : props.media.thumbnailUrl; function captionPopup() { os.alert({ type: "info", - text: props.image.comment, + text: props.media.comment, }); } // Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする watch( - () => props.image, + () => props.media, () => { hide = defaultStore.state.nsfw === "force" ? true - : props.image.isSensitive && + : props.media.isSensitive && defaultStore.state.nsfw !== "ignore"; }, { @@ -91,6 +127,17 @@ watch( immediate: true, } ); + +onMounted(() => { + if (props.media.type.startsWith('video')) { + plyrMini.value = plyr.value.player.media.scrollWidth < 300; + if (plyrMini.value) { + plyr.value.player.on("play", () => { + plyr.value.player.fullscreen.enter(); + }); + } + } +}); </script> <style lang="scss" scoped> @@ -123,7 +170,7 @@ watch( } } -.gqnyydlz { +.media { position: relative; background: var(--bg); @@ -175,5 +222,16 @@ watch( pointer-events: none; } } + &.mini { + :deep(.plyr:not(:fullscreen)) { + min-width: unset !important; + .plyr__control--overlaid, + .plyr__progress__container, + .plyr__volume, + [data-plyr="fullscreen"] { + display: none; + } + } + } } </style> diff --git a/packages/client/src/components/MkMediaList.vue b/packages/client/src/components/MkMediaList.vue index c01ccd5d81..83b4122789 100644 --- a/packages/client/src/components/MkMediaList.vue +++ b/packages/client/src/components/MkMediaList.vue @@ -12,25 +12,16 @@ :class="{ dmWidth: inDm }" > <div ref="gallery" @click.stop> - <template + <XMedia v-for="media in mediaList.filter((media) => previewable(media) )" - > - <XVideo - v-if="media.type.startsWith('video')" - :key="media.id" - :video="media" - /> - <XImage - v-else-if="media.type.startsWith('image')" - :key="media.id" - class="image" - :data-id="media.id" - :image="media" - :raw="raw" - /> - </template> + :key="media.id" + :class="{ image: media.type.startsWith('image') }" + :data-id="media.id" + :media="media" + :raw="raw" + /> </div> </div> </div> @@ -43,8 +34,7 @@ import PhotoSwipeLightbox from "photoswipe/lightbox"; import PhotoSwipe from "photoswipe"; import "photoswipe/style.css"; import XBanner from "@/components/MkMediaBanner.vue"; -import XImage from "@/components/MkMediaImage.vue"; -import XVideo from "@/components/MkMediaVideo.vue"; +import XMedia from "@/components/MkMedia.vue"; import * as os from "@/os"; import { FILE_TYPE_BROWSERSAFE } from "@/const"; import { defaultStore } from "@/store"; diff --git a/packages/client/src/components/MkMediaVideo.vue b/packages/client/src/components/MkMediaVideo.vue deleted file mode 100644 index 53dc6a8ab8..0000000000 --- a/packages/client/src/components/MkMediaVideo.vue +++ /dev/null @@ -1,169 +0,0 @@ -<template> - <div - v-if="hide" - class="icozogqfvdetwohsdglrbswgrejoxbdj" - @click="hide = false" - > - <div> - <b - ><i class="ph-warning ph-bold ph-lg"></i> - {{ i18n.ts.sensitive }}</b - > - <span>{{ i18n.ts.clickToShow }}</span> - </div> - </div> - <div v-else class="video" :class="{ mini }"> - <VuePlyr - ref="plyr" - :options="{ - controls: [ - 'play-large', - 'play', - 'progress', - 'current-time', - 'mute', - 'volume', - 'pip', - 'download', - 'fullscreen', - ], - disableContextMenu: false, - }" - > - <video - :poster="video.thumbnailUrl" - :aria-label="video.comment" - preload="none" - controls - @contextmenu.stop - > - <source :src="video.url" :type="video.type" /> - </video> - </VuePlyr> - <div class="buttons"> - <button - v-if="video.comment" - v-tooltip="i18n.ts.alt" - class="_button" - @click.stop="captionPopup" - > - <i class="ph-subtitles ph-bold ph-lg"></i> - </button> - <button - v-tooltip="i18n.ts.hide" - class="_button" - @click="hide = true" - > - <i class="ph-eye-slash ph-bold ph-lg"></i> - </button> - </div> - </div> -</template> - -<script lang="ts" setup> -import { onMounted, ref } from "vue"; -import VuePlyr from "vue-plyr"; -import type * as misskey from "calckey-js"; -import { defaultStore } from "@/store"; -import "vue-plyr/dist/vue-plyr.css"; -import { i18n } from "@/i18n"; -import * as os from "@/os"; - -const props = defineProps<{ - video: misskey.entities.DriveFile; -}>(); - -const plyr = ref(); -const mini = ref(false); - -const hide = ref( - defaultStore.state.nsfw === "force" - ? true - : props.video.isSensitive && defaultStore.state.nsfw !== "ignore" -); - -function captionPopup() { - os.alert({ - type: "info", - text: props.video.comment, - }); -} - -onMounted(() => { - mini.value = plyr.value.player.media.scrollWidth < 300; - if (mini.value) { - plyr.value.player.on("play", () => { - plyr.value.player.fullscreen.enter(); - }); - } -}); -</script> - -<style lang="scss" scoped> -.video { - position: relative; - --plyr-color-main: var(--accent); - - > .buttons { - display: flex; - gap: 4px; - position: absolute; - border-radius: 6px; - overflow: hidden; - top: 12px; - right: 12px; - > * { - background-color: var(--accentedBg); - -webkit-backdrop-filter: var(--blur, blur(15px)); - backdrop-filter: var(--blur, blur(15px)); - color: var(--accent); - font-size: 0.8em; - padding: 6px 8px; - text-align: center; - } - } - - > video { - display: flex; - justify-content: center; - align-items: center; - - font-size: 3.5em; - overflow: hidden; - background-position: center; - background-size: cover; - width: 100%; - height: 100%; - } - - &.mini { - :deep(.plyr:not(:fullscreen)) { - min-width: unset !important; - .plyr__control--overlaid, - .plyr__progress__container, - .plyr__volume, - [data-plyr="fullscreen"] { - display: none; - } - } - } -} - -.icozogqfvdetwohsdglrbswgrejoxbdj { - display: flex; - justify-content: center; - align-items: center; - background: #111; - color: #fff; - - > div { - display: table-cell; - text-align: center; - font-size: 12px; - - > b { - display: block; - } - } -} -</style> From b37ba33c125f085716e75f9d54784b91cacc5ee2 Mon Sep 17 00:00:00 2001 From: freeplay <freeplay@duck.com> Date: Mon, 3 Jul 2023 00:02:36 -0400 Subject: [PATCH 300/309] feat: show alt button even when content hidden --- packages/client/src/components/MkMedia.vue | 115 +++++++++++---------- 1 file changed, 60 insertions(+), 55 deletions(-) diff --git a/packages/client/src/components/MkMedia.vue b/packages/client/src/components/MkMedia.vue index 36e52ef429..990ec752d8 100644 --- a/packages/client/src/components/MkMedia.vue +++ b/packages/client/src/components/MkMedia.vue @@ -1,62 +1,64 @@ <template> - <button v-if="hide" class="qjewsnkg" @click="hide = false"> - <ImgWithBlurhash - :hash="media.blurhash" - :title="media.comment" - :alt="media.comment" - /> - <div class="text"> - <div class="wrapper"> - <b style="display: block" - ><i class="ph-warning ph-bold ph-lg"></i> - {{ i18n.ts.sensitive }}</b - > - <span style="display: block">{{ i18n.ts.clickToShow }}</span> - </div> - </div> - </button> - <div v-else class="gqnyydlz media" :class="{ mini: plyrMini }"> - <a - v-if="media.type.startsWith('image')" - :href="media.url" - > + <div class="media" :class="{ mini: plyrMini }"> + <button v-if="hide" class="hidden" @click="hide = false"> <ImgWithBlurhash :hash="media.blurhash" - :src="url" + :title="media.comment" :alt="media.comment" - :type="media.type" - :cover="false" /> - <div v-if="media.type === 'image/gif'" class="gif">GIF</div> - </a> - <VuePlyr - v-if="media.type.startsWith('video')" - ref="plyr" - :options="{ - controls: [ - 'play-large', - 'play', - 'progress', - 'current-time', - 'mute', - 'volume', - 'pip', - 'download', - 'fullscreen', - ], - disableContextMenu: false, - }" - > - <video - :poster="media.thumbnailUrl" - :aria-label="media.comment" - preload="none" - controls - @contextmenu.stop + <div class="text"> + <div class="wrapper"> + <b style="display: block" + ><i class="ph-warning ph-bold ph-lg"></i> + {{ i18n.ts.sensitive }}</b + > + <span style="display: block">{{ i18n.ts.clickToShow }}</span> + </div> + </div> + </button> + <template v-else> + <a + v-if="media.type.startsWith('image')" + :href="media.url" > - <source :src="media.url" :type="media.type" /> - </video> - </VuePlyr> + <ImgWithBlurhash + :hash="media.blurhash" + :src="url" + :alt="media.comment" + :type="media.type" + :cover="false" + /> + <div v-if="media.type === 'image/gif'" class="gif">GIF</div> + </a> + <VuePlyr + v-if="media.type.startsWith('video')" + ref="plyr" + :options="{ + controls: [ + 'play-large', + 'play', + 'progress', + 'current-time', + 'mute', + 'volume', + 'pip', + 'download', + 'fullscreen', + ], + disableContextMenu: false, + }" + > + <video + :poster="media.thumbnailUrl" + :aria-label="media.comment" + preload="none" + controls + @contextmenu.stop + > + <source :src="media.url" :type="media.type" /> + </video> + </VuePlyr> + </template> <div class="buttons"> <button v-if="media.comment" @@ -67,9 +69,10 @@ <i class="ph-subtitles ph-bold ph-lg"></i> </button> <button + v-if="!hide" v-tooltip="i18n.ts.hide" class="_button" - @click="hide = true" + @click.stop="hide = true" > <i class="ph-eye-slash ph-bold ph-lg"></i> </button> @@ -141,9 +144,11 @@ onMounted(() => { </script> <style lang="scss" scoped> -.qjewsnkg { +.hidden { all: unset; position: relative; + width: 100%; + height: 100%; > .text { position: relative; From 4c09522f764ff0abfd1deab15e2d80b1dc2dca38 Mon Sep 17 00:00:00 2001 From: Claire <baffling4945@outlook.com> Date: Mon, 3 Jul 2023 04:10:24 +0000 Subject: [PATCH 301/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1816 of 1816 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 52 +++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 110149d737..a5693f8c26 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1,5 +1,5 @@ _lang_: "简体中文" -headlineMisskey: "通过帖子连接在一起的网络" +headlineMisskey: "一个开源、去中心化的社交媒体平台,永远免费!🚀" introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n\ 来探索新的世界吧!🚀" monthAndDay: "{month}月 {day}日" @@ -359,7 +359,7 @@ antennaSource: "接收来源" antennaKeywords: "包含关键字" antennaExcludeKeywords: "排除关键字" antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范" -notifyAntenna: "开启通知" +notifyAntenna: "新帖子通知" withFileAntenna: "仅带有附件的帖子" enableServiceworker: "启用ServiceWorker" antennaUsersDescription: "指定用户名,用换行符分隔" @@ -535,7 +535,7 @@ updateRemoteUser: "更新远程用户信息" deleteAllFiles: "删除所有文件" deleteAllFilesConfirm: "要删除所有文件吗?" removeAllFollowing: "取消所有关注" -removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。" +removeAllFollowingDescription: "取消 {host} 的所有关注者。如果服务器已不存在,请执行它。" userSuspended: "该用户已被冻结。" userSilenced: "该用户已被禁言。" yourAccountSuspendedTitle: "账户已被冻结" @@ -626,13 +626,13 @@ sample: "示例" abuseReports: "举报" reportAbuse: "举报" reportAbuseOf: "举报{name}" -fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写URL地址。" +fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写 URL 地址。" abuseReported: "内容已发送。感谢您提交信息。" reporter: "举报者" reporteeOrigin: "举报来源" reporterOrigin: "举报者来源" -forwardReport: "将该举报信息转发给远程实例" -forwardReportIsAnonymous: "勾选则在远程实例上显示的举报者是匿名的系统账号,而不是您的账号。" +forwardReport: "将该举报信息转发给远程服务器" +forwardReportIsAnonymous: "勾选则在远程服务器上显示的举报者是匿名的系统账号,而不是您的账号。" send: "发送" abuseMarkAsResolved: "处理完毕" openInNewTab: "在新标签页中打开" @@ -650,16 +650,16 @@ createNew: "新建" optional: "可选" createNewClip: "新建便签" unclip: "移除便签" -confirmToUnclipAlreadyClippedNote: "本帖已包含在便签\"{name}\"里。您想要将本帖从该便签中移除吗?" +confirmToUnclipAlreadyClippedNote: "本帖已包含在便签 \"{name}\" 里。您想要将本帖从该便签中移除吗?" public: "公开" i18nInfo: "Calckey已经被志愿者们翻译成了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。" manageAccessTokens: "管理 Access Tokens" accountInfo: "账户信息" notesCount: "帖子数量" repliesCount: "回复数量" -renotesCount: "转帖数量" +renotesCount: "推贴数量" repliedCount: "回复数" -renotedCount: "转发数" +renotedCount: "收到的推贴数" followingCount: "正在关注数量" followersCount: "关注者数量" sentReactionsCount: "发送回应数" @@ -703,7 +703,7 @@ onlineUsersCount: "{n}人在线" nUsers: "{n}用户" nNotes: "{n} 帖子" sendErrorReports: "发送错误报告" -sendErrorReportsDescription: "启用后,如果出现问题,可以与Misskey共享详细的错误信息,从而帮助提高软件的质量。" +sendErrorReportsDescription: "启用后,如果出现问题,可以与 Misskey 共享详细的错误信息,从而帮助提高软件的质量。" myTheme: "我的主题" backgroundColor: "背景" accentColor: "强调色" @@ -727,7 +727,7 @@ capacity: "容量" inUse: "已使用" editCode: "编辑代码" apply: "应用" -receiveAnnouncementFromInstance: "从实例接收通知" +receiveAnnouncementFromInstance: "从服务器接收通知" emailNotification: "邮件通知" publish: "发布" inChannelSearch: "频道内搜索" @@ -839,8 +839,8 @@ themeColor: "服务器滚动条颜色" size: "大小" numberOfColumn: "列数" searchByGoogle: "Google" -instanceDefaultLightTheme: "实例默认浅色主题" -instanceDefaultDarkTheme: "实例默认深色主题" +instanceDefaultLightTheme: "服务器默认浅色主题" +instanceDefaultDarkTheme: "服务器默认深色主题" instanceDefaultThemeDescription: "以对象格式键入主题代码" mutePeriod: "屏蔽期限" indefinitely: "永久" @@ -863,7 +863,7 @@ check: "检查" driveCapOverrideLabel: "變更此用戶的雲端硬碟容量上限" driveCapOverrideCaption: "设定为 0 以下则会解除此限制。" requireAdminForView: "需要使用管理员账户登录才能查看。" -isSystemAccount: "该账号由系统自动创建和管理。" +isSystemAccount: "该账号由系统自动创建和管理。请不要修改、编辑、删除或以其他方式篡改这个账户,否则可能会破坏你的服务器。" typeToConfirm: "输入 {x} 以确认操作。" deleteAccount: "删除账户" document: "文档" @@ -889,7 +889,7 @@ cannotUploadBecauseInappropriate: "因为可能含有不适宜的内容,无法 cannotUploadBecauseNoFreeSpace: "因为已无可用空间,无法上传。" beta: "测试" enableAutoSensitive: "自动 NSFW 识别" -enableAutoSensitiveDescription: "如果可用,请使用机器学习在媒体上自动设置 NSFW 标志。即使关闭此功能,也可能会根据实例自动设置。" +enableAutoSensitiveDescription: "如果可用,请使用机器学习在媒体上自动设置 NSFW 标志。即使关闭此功能,也可能会根据服务器自动设置。" activeEmailValidationDescription: "积极地验证用户的电子邮件地址,判断它是一次性的电子邮件地址,还是可以实际通信的地址。关闭时,则只检查字符串是否正确。" navbar: "导航栏" shuffle: "随机" @@ -935,8 +935,8 @@ _ad: reduceFrequencyOfThisAd: "减少此广告的频率" _forgotPassword: enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。" - ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。" - contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。" + ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系服务器管理员。" + contactAdmin: "该服务器不支持发送电子邮件。如果您想重设密码,请联系管理员。" _gallery: my: "我的图库" liked: "喜欢的图片" @@ -1109,10 +1109,10 @@ _wordMute: hard: "硬屏蔽" mutedNotes: "已静音的帖子" _instanceMute: - instanceMuteDescription: "屏蔽配置实例中的所有帖子和转帖,包括实例的用户回复。" + instanceMuteDescription: "屏蔽列出服务器中的所有帖子和转帖,包括服务器的用户回复。" instanceMuteDescription2: "设置时用换行符来分隔" - title: "隐藏实例已设置的帖子。" - heading: "屏蔽实例" + title: "隐藏服务器已设置的帖子。" + heading: "要静音的服务器列表" _theme: explore: "寻找主题" install: "安装主题" @@ -1215,11 +1215,11 @@ _tutorial: step1_1: "欢迎!" step1_2: "让我们把你安排好。你很快就会启动并运行!" step2_1: "首先,请完成您的个人资料。" - step2_2: "通过提供一些关于你自己的信息,其他人会更容易了解他们是否想看到你的帖子或关注你。" - step3_1: "现在是时候跟随一些人了!" + step2_2: "提供一些关于你的信息,让其他人更容易知道他们是否想看你的帖子或关注你。" + step3_1: "现在是时候关注一些人了!" step3_2: "你的主页和社交馈送是基于你所关注的人,所以试着先关注几个账户。{n点击个人资料右上角的加号圈就可以关注它。" step4_1: "让我们出去找你。" - step4_2: "对于他们的第一条信息,有些人喜欢做{introduction}或一个简单的 \"hello world!\"" + step4_2: "对于第一条帖子,可以做一个 {introduction} 或一个简单的 \"hello world!\"" step5_1: "时间线,无处不在的时间线!" step5_2: "您的服务器已启用{timelines}种不同的时间线。" step5_3: "主页{icon}时间线是你可以看到你关注账户的帖子的时间线。" @@ -1372,11 +1372,11 @@ _poll: remainingSeconds: "{s}秒后截止" _visibility: public: "公开" - publicDescription: "您的帖子将出现在全局时间线上" + publicDescription: "您的帖子将出现在公共时间线上" home: "不公开" homeDescription: "仅发送至首页的时间线" followers: "仅关注者" - followersDescription: "仅发送至关注者" + followersDescription: "仅对你的关注者和提及的用户可见" specified: "指定用户" specifiedDescription: "仅发送至指定用户" localOnly: "仅限本地" @@ -1522,7 +1522,7 @@ _pages: note: "嵌入的帖子" _note: id: "帖子ID" - idDescription: "您也可以通过粘贴帖子的URL来进行设置。" + idDescription: "你也可以将帖子 URL 粘贴到此处。" detailed: "显示详细信息" switch: "开关" _switch: From c0d1f76f6f70a96e4f88b300ffa1bcf4131ade4e Mon Sep 17 00:00:00 2001 From: wuhang2003 <i@zwh.moe> Date: Mon, 3 Jul 2023 04:18:27 +0000 Subject: [PATCH 302/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1816 of 1816 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index a5693f8c26..6c4854f26a 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1,6 +1,6 @@ _lang_: "简体中文" headlineMisskey: "一个开源、去中心化的社交媒体平台,永远免费!🚀" -introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n\ +introMisskey: "欢迎!Calckey 是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n\ 来探索新的世界吧!🚀" monthAndDay: "{month}月 {day}日" search: "搜索" From 1f3f0720f86197683c596a79df16bc5a3e7c9ac9 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 23:06:25 -0700 Subject: [PATCH 303/309] fix: :lipstick: form switch padding --- packages/client/src/pages/admin/settings.vue | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index 0e83250bac..5108c06965 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -345,12 +345,22 @@ <FormSection> <template #label>Server Performance</template> - <FormSwitch v-model="enableServerMachineStats"> - <template #label>{{ i18n.ts.enableServerMachineStats }}</template> + <FormSwitch + v-model="enableServerMachineStats" + class="_formBlock" + > + <template #label>{{ + i18n.ts.enableServerMachineStats + }}</template> </FormSwitch> - <FormSwitch v-model="enableIdenticonGeneration"> - <template #label>{{ i18n.ts.enableIdenticonGeneration }}</template> + <FormSwitch + v-model="enableIdenticonGeneration" + class="_formBlock" + > + <template #label>{{ + i18n.ts.enableIdenticonGeneration + }}</template> </FormSwitch> </FormSection> From c392697b4cdd91fdb8735ea4e6ffcc07c6f14b42 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 23:08:33 -0700 Subject: [PATCH 304/309] chore: :art: format --- .../src/server/api/endpoints/patrons.ts | 10 +- .../src/server/api/endpoints/server-info.ts | 4 +- packages/backend/src/server/index.ts | 5 +- packages/backend/src/server/web/feed.ts | 99 +++++++++++++------ packages/backend/src/server/web/index.ts | 50 ++++++++-- .../src/services/chart/charts/active-users.ts | 2 +- packages/client/src/components/MkMedia.vue | 11 +-- packages/client/src/pages/about-calckey.vue | 2 +- packages/client/src/pages/user/home.vue | 2 +- 9 files changed, 130 insertions(+), 55 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/patrons.ts b/packages/backend/src/server/api/endpoints/patrons.ts index 353cba1dc0..be89c571fb 100644 --- a/packages/backend/src/server/api/endpoints/patrons.ts +++ b/packages/backend/src/server/api/endpoints/patrons.ts @@ -24,14 +24,14 @@ export default define(meta, paramDef, async (ps) => { patrons = JSON.parse(cachedPatrons); } else { AbortSignal.timeout ??= function timeout(ms) { - const ctrl = new AbortController() - setTimeout(() => ctrl.abort(), ms) - return ctrl.signal - } + const ctrl = new AbortController(); + setTimeout(() => ctrl.abort(), ms); + return ctrl.signal; + }; patrons = await fetch( "https://codeberg.org/calckey/calckey/raw/branch/develop/patrons.json", - { signal: AbortSignal.timeout(2000) } + { signal: AbortSignal.timeout(2000) }, ) .then((response) => response.json()) .catch(() => { diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts index 746eae6621..87132758fe 100644 --- a/packages/backend/src/server/api/endpoints/server-info.ts +++ b/packages/backend/src/server/api/endpoints/server-info.ts @@ -34,9 +34,9 @@ export default define(meta, paramDef, async () => { const instanceMeta = await fetchMeta(); if (!instanceMeta.enableServerMachineStats) { return { - machine: 'Not specified', + machine: "Not specified", cpu: { - model: 'Not specified', + model: "Not specified", cores: 0, }, mem: { diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 7f8d0ed718..cd2d132199 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -132,9 +132,8 @@ router.get("/identicon/:x", async (ctx) => { await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); ctx.set("Content-Type", "image/png"); ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); - } - else { - ctx.redirect("/static-assets/avatar.png") + } else { + ctx.redirect("/static-assets/avatar.png"); } }); diff --git a/packages/backend/src/server/web/feed.ts b/packages/backend/src/server/web/feed.ts index 1d24345024..004745901d 100644 --- a/packages/backend/src/server/web/feed.ts +++ b/packages/backend/src/server/web/feed.ts @@ -4,18 +4,25 @@ import config from "@/config/index.js"; import type { User } from "@/models/entities/user.js"; import { Notes, DriveFiles, UserProfiles, Users } from "@/models/index.js"; -export default async function (user: User, threadDepth = 5, history = 20, noteintitle = false, renotes = true, replies = true) { +export default async function ( + user: User, + threadDepth = 5, + history = 20, + noteintitle = false, + renotes = true, + replies = true, +) { const author = { link: `${config.url}/@${user.username}`, email: `${user.username}@${config.host}`, - name: user.name || user.username + name: user.name || user.username, }; const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); const searchCriteria = { userId: user.id, - visibility: In(['public', 'home']), + visibility: In(["public", "home"]), }; if (!renotes) { @@ -36,8 +43,12 @@ export default async function (user: User, threadDepth = 5, history = 20, notein id: author.link, title: `${author.name} (@${user.username}@${config.host})`, updated: notes[0].createdAt, - generator: 'Calckey', - description: `${user.notesCount} Notes, ${profile.ffVisibility === 'public' ? user.followingCount : '?'} Following, ${profile.ffVisibility === 'public' ? user.followersCount : '?'} Followers${profile.description ? ` · ${profile.description}` : ''}`, + generator: "Calckey", + description: `${user.notesCount} Notes, ${ + profile.ffVisibility === "public" ? user.followingCount : "?" + } Following, ${ + profile.ffVisibility === "public" ? user.followersCount : "?" + } Followers${profile.description ? ` · ${profile.description}` : ""}`, link: author.link, image: await Users.getAvatarUrl(user), feedLinks: { @@ -61,59 +72,87 @@ export default async function (user: User, threadDepth = 5, history = 20, notein let title = `${author.name} `; if (note.renoteId) { - title += 'renotes'; + title += "renotes"; } else if (note.replyId) { - title += 'replies'; + title += "replies"; } else { - title += 'says'; + title += "says"; } if (noteintitle) { const content = note.cw ?? note.text; if (content) { title += `: ${content}`; } else { - title += 'something'; + title += "something"; } } feed.addItem({ - title: title.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, '').substring(0,100), + title: title + .replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, "") + .substring(0, 100), link: `${config.url}/notes/${note.id}`, date: note.createdAt, - description: note.cw ? note.cw.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, '') : undefined, - content: contentStr.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, '') + description: note.cw + ? note.cw.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, "") + : undefined, + content: contentStr.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, ""), }); } - async function noteToString (note, isTheNote = false) { - const author = isTheNote ? null : await Users.findOneBy({ id: note.userId }); - let outstr = author ? `${author.name}(@${author.username}@${author.host ? author.host : config.host}) ${(note.renoteId ? 'renotes' : (note.replyId ? 'replies' : 'says'))}: <br>` : ''; - const files = note.fileIds.length > 0 ? await DriveFiles.findBy({ - id: In(note.fileIds), - }) : []; - let fileEle = ''; + async function noteToString(note, isTheNote = false) { + const author = isTheNote + ? null + : await Users.findOneBy({ id: note.userId }); + let outstr = author + ? `${author.name}(@${author.username}@${ + author.host ? author.host : config.host + }) ${ + note.renoteId ? "renotes" : note.replyId ? "replies" : "says" + }: <br>` + : ""; + const files = + note.fileIds.length > 0 + ? await DriveFiles.findBy({ + id: In(note.fileIds), + }) + : []; + let fileEle = ""; for (const file of files) { - if (file.type.startsWith('image/')) { + if (file.type.startsWith("image/")) { fileEle += ` <br><img src="${DriveFiles.getPublicUrl(file)}">`; - } else if (file.type.startsWith('audio/')) { - fileEle += ` <br><audio controls src="${DriveFiles.getPublicUrl(file)}" type="${file.type}">`; - } else if (file.type.startsWith('video/')) { - fileEle += ` <br><video controls src="${DriveFiles.getPublicUrl(file)}" type="${file.type}">`; + } else if (file.type.startsWith("audio/")) { + fileEle += ` <br><audio controls src="${DriveFiles.getPublicUrl( + file, + )}" type="${file.type}">`; + } else if (file.type.startsWith("video/")) { + fileEle += ` <br><video controls src="${DriveFiles.getPublicUrl( + file, + )}" type="${file.type}">`; } else { - fileEle += ` <br><a href="${DriveFiles.getPublicUrl(file)}" download="${file.name}">${file.name}</a>`; + fileEle += ` <br><a href="${DriveFiles.getPublicUrl(file)}" download="${ + file.name + }">${file.name}</a>`; } } - outstr += `${note.cw ? note.cw + '<br>' : ''}${note.text || ''}${fileEle}`; + outstr += `${note.cw ? note.cw + "<br>" : ""}${note.text || ""}${fileEle}`; if (isTheNote) { - outstr += ` <span class="${(note.renoteId ? 'renote_note' : (note.replyId ? 'reply_note' : 'new_note'))} ${(fileEle.indexOf('img src') !== -1 ? 'with_img' : 'without_img')}"></span>`; + outstr += ` <span class="${ + note.renoteId ? "renote_note" : note.replyId ? "reply_note" : "new_note" + } ${ + fileEle.indexOf("img src") !== -1 ? "with_img" : "without_img" + }"></span>`; } return outstr; } - async function findById (id) { - let text = ''; + async function findById(id) { + let text = ""; let next = null; - const findings = await Notes.findOneBy({ id: id, visibility: In(['public', 'home']) }); + const findings = await Notes.findOneBy({ + id: id, + visibility: In(["public", "home"]), + }); if (findings) { text += `<hr>`; text += await noteToString(findings); diff --git a/packages/backend/src/server/web/index.ts b/packages/backend/src/server/web/index.ts index f54d1f495b..a2ccf872fc 100644 --- a/packages/backend/src/server/web/index.ts +++ b/packages/backend/src/server/web/index.ts @@ -247,7 +247,14 @@ router.get("/api.json", async (ctx) => { ctx.body = genOpenapiSpec(); }); -const getFeed = async (acct: string, threadDepth:string, historyCount:string, noteInTitle:string, noRenotes:string, noReplies:string) => { +const getFeed = async ( + acct: string, + threadDepth: string, + historyCount: string, + noteInTitle: string, + noRenotes: string, + noReplies: string, +) => { const meta = await fetchMeta(); if (meta.privateMode) { return; @@ -257,7 +264,7 @@ const getFeed = async (acct: string, threadDepth:string, historyCount:string, no usernameLower: username.toLowerCase(), host: host ?? IsNull(), isSuspended: false, - isLocked:false, + isLocked: false, }); if (!user) { return; @@ -271,7 +278,17 @@ const getFeed = async (acct: string, threadDepth:string, historyCount:string, no if (isNaN(history) || history <= 0 || history > 30) { history = 20; } - return user && await packFeed(user, thread, history, !isNaN(noteInTitle), isNaN(noRenotes), isNaN(noReplies)); + return ( + user && + (await packFeed( + user, + thread, + history, + !isNaN(noteInTitle), + isNaN(noRenotes), + isNaN(noReplies), + )) + ); }; // As the /@user[.json|.rss|.atom]/sub endpoint is complicated, we will use a regex to switch between them. @@ -313,7 +330,14 @@ router.get(reUser, async (ctx, next) => { // Atom const atomFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user, ctx.query.thread, ctx.query.history, ctx.query.noteintitle, ctx.query.norenotes, ctx.query.noreplies); + const feed = await getFeed( + ctx.params.user, + ctx.query.thread, + ctx.query.history, + ctx.query.noteintitle, + ctx.query.norenotes, + ctx.query.noreplies, + ); if (feed) { ctx.set("Content-Type", "application/atom+xml; charset=utf-8"); @@ -325,7 +349,14 @@ const atomFeed: Router.Middleware = async (ctx) => { // RSS const rssFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user, ctx.query.thread, ctx.query.history, ctx.query.noteintitle, ctx.query.norenotes, ctx.query.noreplies); + const feed = await getFeed( + ctx.params.user, + ctx.query.thread, + ctx.query.history, + ctx.query.noteintitle, + ctx.query.norenotes, + ctx.query.noreplies, + ); if (feed) { ctx.set("Content-Type", "application/rss+xml; charset=utf-8"); @@ -337,7 +368,14 @@ const rssFeed: Router.Middleware = async (ctx) => { // JSON const jsonFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user, ctx.query.thread, ctx.query.history, ctx.query.noteintitle, ctx.query.norenotes, ctx.query.noreplies); + const feed = await getFeed( + ctx.params.user, + ctx.query.thread, + ctx.query.history, + ctx.query.noteintitle, + ctx.query.norenotes, + ctx.query.noreplies, + ); if (feed) { ctx.set("Content-Type", "application/json; charset=utf-8"); diff --git a/packages/backend/src/services/chart/charts/active-users.ts b/packages/backend/src/services/chart/charts/active-users.ts index 15317e68b0..322bfd25bc 100644 --- a/packages/backend/src/services/chart/charts/active-users.ts +++ b/packages/backend/src/services/chart/charts/active-users.ts @@ -29,7 +29,7 @@ export default class ActiveUsersChart extends Chart<typeof schema> { id: User["id"]; host: null; createdAt: User["createdAt"]; - }) { + }) { this.commit({ read: [user.id], registeredWithinWeek: diff --git a/packages/client/src/components/MkMedia.vue b/packages/client/src/components/MkMedia.vue index 990ec752d8..ad4bca0e02 100644 --- a/packages/client/src/components/MkMedia.vue +++ b/packages/client/src/components/MkMedia.vue @@ -12,15 +12,14 @@ ><i class="ph-warning ph-bold ph-lg"></i> {{ i18n.ts.sensitive }}</b > - <span style="display: block">{{ i18n.ts.clickToShow }}</span> + <span style="display: block">{{ + i18n.ts.clickToShow + }}</span> </div> </div> </button> <template v-else> - <a - v-if="media.type.startsWith('image')" - :href="media.url" - > + <a v-if="media.type.startsWith('image')" :href="media.url"> <ImgWithBlurhash :hash="media.blurhash" :src="url" @@ -132,7 +131,7 @@ watch( ); onMounted(() => { - if (props.media.type.startsWith('video')) { + if (props.media.type.startsWith("video")) { plyrMini.value = plyr.value.player.media.scrollWidth < 300; if (plyrMini.value) { plyr.value.player.on("play", () => { diff --git a/packages/client/src/pages/about-calckey.vue b/packages/client/src/pages/about-calckey.vue index 0a22dca4da..6899c4de0f 100644 --- a/packages/client/src/pages/about-calckey.vue +++ b/packages/client/src/pages/about-calckey.vue @@ -174,7 +174,7 @@ let patrons = []; try { patrons = await os.api("patrons", { forceUpdate: true }); } catch { - console.error("Codeberg's down.") + console.error("Codeberg's down."); } let easterEggReady = false; diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index 317656b662..84aa3868cd 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -455,7 +455,7 @@ let patrons = []; try { patrons = await os.api("patrons"); } catch { - console.error("Codeberg's down.") + console.error("Codeberg's down."); } function parallaxLoop() { From 5847f95da23f9b27d18ba83b09dd5c766919a8a3 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Sun, 2 Jul 2023 23:37:44 -0700 Subject: [PATCH 305/309] chore: :busts_in_silhouette: patrons --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index 54ea682713..58cbb45306 100644 --- a/patrons.json +++ b/patrons.json @@ -79,6 +79,7 @@ "@joesbrat67@calckey.social", "@arth@calckey.social", "@octofloofy@ck.octofloofy.ink", + "@pauliehedron@infosec.town", "\nInterkosmos Link" ] } From b94f527d9a8b4ddd661da35b32f77bda7bfb8e73 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter <kainoa@t1c.dev> Date: Mon, 3 Jul 2023 09:02:14 +0000 Subject: [PATCH 306/309] =?UTF-8?q?chore:=20=F0=9F=91=A5=20patrons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index 58cbb45306..24258da0b7 100644 --- a/patrons.json +++ b/patrons.json @@ -80,6 +80,7 @@ "@arth@calckey.social", "@octofloofy@ck.octofloofy.ink", "@pauliehedron@infosec.town", + "@soulthunk@lethallava.land", "\nInterkosmos Link" ] } From 9283b2d92c2ff1cc78ec67bd6af133598b0fc16d Mon Sep 17 00:00:00 2001 From: jolupa <jolupameister@gmail.com> Date: Mon, 3 Jul 2023 05:22:37 +0000 Subject: [PATCH 307/309] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1816 of 1816 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index a269a0d008..6cda10f969 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -2142,3 +2142,5 @@ _skinTones: dark: Fosc yellow: Groc swipeOnMobile: Permet lliscar entre pàgines +enableIdenticonGeneration: Habilitar la generació d'Identicon +enableServerMachineStats: Habilitar les estadístiques del maquinari del servidor From da299f06041de241fa6a276dda385e60f5011b26 Mon Sep 17 00:00:00 2001 From: Claire <baffling4945@outlook.com> Date: Mon, 3 Jul 2023 09:04:24 +0000 Subject: [PATCH 308/309] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1816 of 1816 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 661 +++++++++++++++++++++++----------------------- 1 file changed, 332 insertions(+), 329 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 6c4854f26a..e6f14b3f0a 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1,15 +1,14 @@ _lang_: "简体中文" headlineMisskey: "一个开源、去中心化的社交媒体平台,永远免费!🚀" -introMisskey: "欢迎!Calckey 是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n\ - 来探索新的世界吧!🚀" -monthAndDay: "{month}月 {day}日" +introMisskey: "欢迎! Calckey 是一个开源、去中心化的社交媒体平台,永久免费!🚀" +monthAndDay: "{month} 月 {day} 日" search: "搜索" notifications: "通知" username: "用户名" password: "密码" forgotPassword: "忘记密码" -fetchingAsApObject: "正在联邦宇宙查询中" -ok: "OK" +fetchingAsApObject: "正在从联邦宇宙查询" +ok: "好" gotIt: "知道了!" cancel: "取消" enterUsername: "输入用户名" @@ -23,12 +22,12 @@ otherSettings: "其他设置" openInWindow: "在新窗口中打开" profile: "个人资料" timeline: "时间线" -noAccountDescription: "这个人很懒,没有写自我介绍" +noAccountDescription: "这个人很懒,没有写自我介绍。" login: "登录" loggingIn: "正在登录..." logout: "登出" signup: "新用户注册" -uploading: "正在上传" +uploading: "正在上传..." save: "保存" users: "用户" addUser: "添加用户" @@ -50,22 +49,22 @@ sendMessage: "发送" copyUsername: "复制用户名" searchUser: "搜索用户" reply: "回复" -loadMore: "查看更多" +loadMore: "载入更多" showMore: "查看更多" showLess: "关闭" -youGotNewFollower: "你有新的关注者" -receiveFollowRequest: "您收到了关注请求" +youGotNewFollower: "关注了你" +receiveFollowRequest: "收到了关注请求" followRequestAccepted: "您的关注请求被通过了" mention: "提及" mentions: "提及" directNotes: "私信" -importAndExport: "导入和导出" +importAndExport: "导入和导出数据" import: "导入" export: "导出" files: "文件" download: "下载" -driveFileDeleteConfirm: "要删除文件「{name}」吗?它将被所有作为附件包含它的帖子中删除。" -unfollowConfirm: "要取消对{name}的关注吗?" +driveFileDeleteConfirm: "要删除文件「{name}」吗?它将从所有作为附件包含它的帖子中删除。" +unfollowConfirm: "要取消关注 {name} 吗?" exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。" importRequested: "导入请求已提交,这可能需要花一点时间。" lists: "列表" @@ -80,8 +79,8 @@ manageLists: "管理列表" error: "错误" somethingHappened: "发生了一个错误" retry: "重试" -pageLoadError: "页面加载失败。" -pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。" +pageLoadError: "页面加载时发生错误。" +pageLoadErrorDescription: "这通常是由于网络错误或浏览器缓存的原因。请清除缓存或等待片刻后重试。" serverIsDead: "服务器没有响应。 请稍等片刻,然后重试。" youShouldUpgradeClient: "请重新加载并使用新版本的客户端查看此页面。" enterListName: "输入列表名称" @@ -92,24 +91,24 @@ follow: "关注" followRequest: "关注申请" followRequests: "关注申请" unfollow: "取消关注" -followRequestPending: "发送关注请求" +followRequestPending: "关注请求待批准" enterEmoji: "输入表情符号" renote: "转发" unrenote: "取消转发" renoted: "已转发。" -cantRenote: "此帖子无法转发。" +cantRenote: "此帖子无法被转发。" cantReRenote: "转发无法被再次转发。" quote: "引用" pinnedNote: "已置顶的帖子" pinned: "置顶" -you: "您" +you: "你" clickToShow: "点击以显示" sensitive: "敏感内容" add: "添加" reaction: "回应" enableEmojiReaction: "启用表情符号回应" showEmojisInReactionNotifications: "在回应通知中显示表情符号" -reactionSetting: "在选择器中显示的回应" +reactionSetting: "在回应选择器中显示的回应" reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。" rememberNoteVisibility: "保存帖子可见性设置" attachCancel: "删除附件" @@ -125,30 +124,31 @@ unblock: "取消拉黑" suspend: "冻结" unsuspend: "解除冻结" blockConfirm: "确定要拉黑吗?" -unblockConfirm: "确定要解除拉黑吗?" -suspendConfirm: "要冻结吗?" -unsuspendConfirm: "要解除冻结吗?" +unblockConfirm: "确定要取消拉黑吗?" +suspendConfirm: "确定要冻结吗?" +unsuspendConfirm: "确定要解除冻结吗?" selectList: "选择列表" selectAntenna: "选择天线" -selectWidget: "选择小工具" +selectWidget: "选择小部件" editWidgets: "编辑部件" editWidgetsExit: "完成编辑" customEmojis: "自定义表情符号" emoji: "表情符号" emojis: "表情符号" emojiName: "表情符号名称" -emojiUrl: "表情符号地址" +emojiUrl: "表情符号 URL" addEmoji: "添加表情符号" settingGuide: "推荐配置" -cacheRemoteFiles: "远程文件缓存" +cacheRemoteFiles: "缓存远程文件" cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程服务器载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" flagAsBot: "这是一个机器人账号" -flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。" -flagAsCat: "将这个账户设定为一只猫" -flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。\n开启后,会在您的头像上出现猫耳朵,并将你的帖子中的「na」替换为「nya」,日文同理。" +flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让 Calckey + 的内部系统将此帐户识别为机器人。" +flagAsCat: "将这个账户设定为一只猫😺" +flagAsCatDescription: "你会长出猫耳朵并像猫一样说话!" flagShowTimelineReplies: "在时间线上显示帖子的回复" -flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的帖子外,还会显示其他用户对帖子的回复。" -autoAcceptFollowed: "自动允许关注者的关注" +flagShowTimelineRepliesDescription: "启用后,时间线除了显示用户的帖子外,还会显示其他用户对帖子的回复。" +autoAcceptFollowed: "自动批准来自关注者的关注请求" addAccount: "添加账户" loginFailed: "登录失败" showOnRemote: "转到所在服务器显示" @@ -156,18 +156,18 @@ general: "常规设置" wallpaper: "壁纸" setWallpaper: "设置壁纸" removeWallpaper: "移除壁纸" -searchWith: "搜索:{q}" +searchWith: "搜索:{q}" youHaveNoLists: "列表为空" -followConfirm: "你确定要关注{name}吗?" +followConfirm: "你确定要关注 {name} 吗?" proxyAccount: "代理账户" -proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户列出一个远程用户时,如果没有人跟随该列出的用户,则该活动将不会传递到该服务器,因此将代之以代理账户。" +proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户添加一个远程用户为代理账户时,如果没有本地用户关注该用户,远程用户的活动将不会被传递到服务器,因此代理账户将被关注。" host: "主机名" selectUser: "选择用户" recipient: "收件人" annotation: "注解" federation: "联合" instances: "服务器" -registeredAt: "初次观测" +registeredAt: "初次观测于" latestRequestSentAt: "上次发送的请求" latestRequestReceivedAt: "上次收到的请求" latestStatus: "最后状态" @@ -183,38 +183,38 @@ version: "版本" metadata: "元数据" monitor: "服务器状态" jobQueue: "作业队列" -cpuAndMemory: "CPU和内存" +cpuAndMemory: "CPU 和内存" network: "网络" disk: "存储" instanceInfo: "服务器信息" statistics: "统计" clearQueue: "清除队列" clearQueueConfirmTitle: "确定清除队列?" -clearQueueConfirmText: "未送达的帖子将不会送达。 通常,您不需要这样做。" +clearQueueConfirmText: "队列中任何未送达的帖子将不会发送。 通常,您不需要这样做。" clearCachedFiles: "清除缓存" -clearCachedFilesConfirm: "确定要清除缓存文件?" +clearCachedFilesConfirm: "确定要删除所有缓存的远程文件?" blockedInstances: "已屏蔽的服务器" -blockedInstancesDescription: "设定要屏蔽的服务器,以换行来进行分割。被屏蔽的服务器将无法与本服务器进行交换通讯。" +blockedInstancesDescription: "设定要屏蔽的服务器,一行一个。被屏蔽的服务器将无法与本服务器进行交换通讯。" muteAndBlock: "屏蔽/拉黑" -mutedUsers: "已屏蔽用户" +mutedUsers: "已屏蔽的用户" blockedUsers: "被拉黑的用户" noUsers: "无用户" -editProfile: "编辑资料" -noteDeleteConfirm: "要删除该帖子吗?" +editProfile: "编辑个人资料" +noteDeleteConfirm: "确定要删除该帖子吗?" pinLimitExceeded: "无法置顶更多帖子了" -intro: "Calckey安装完成!请创建一个管理员用户。" +intro: "Calckey 安装完成!请创建一个管理员用户。" done: "完成" processing: "正在处理" preview: "预览" default: "默认" -defaultValueIs: "默认值: {value}" +defaultValueIs: "默认值:{value}" noCustomEmojis: "没有自定义表情符号" noJobs: "没有任务" federating: "联合中" blocked: "已拉黑" suspended: "停止推流" all: "全部" -subscribing: "已订阅" +subscribing: "订阅中" publishing: "直播中" notResponding: "没有响应" instanceFollowing: "关注服务器" @@ -229,41 +229,41 @@ newPasswordRetype: "重新输入新密码" attachFile: "插入附件" more: "更多!" featured: "热门" -usernameOrUserId: "用户名或用户ID" +usernameOrUserId: "用户名或用户 ID" noSuchUser: "用户不存在" lookup: "查询" announcements: "公告" -imageUrl: "图片URL" +imageUrl: "图片 URL" remove: "删除" removed: "已删除" -removeAreYouSure: "要删掉「{x}」吗?" -deleteAreYouSure: "要删掉「{x}」吗?" -resetAreYouSure: "恢复默认设置?" +removeAreYouSure: "确定要删除「{x}」吗?" +deleteAreYouSure: "确定要删除「{x}」吗?" +resetAreYouSure: "确定重置为默认设置?" saved: "已保存" messaging: "聊天" upload: "本地上传" keepOriginalUploading: "保留原图" -keepOriginalUploadingDescription: "上传图片时保留原始图片。关闭时,浏览器会在上传时生成一张用于web发布的图片。" +keepOriginalUploadingDescription: "上传图片时保留原始图片。如果关闭,会在上传时生成一张用于 web 发布的图片。" fromDrive: "从网盘中" fromUrl: "从 URL" -uploadFromUrl: "从网址上传" -uploadFromUrlDescription: "输入文件的URL" -uploadFromUrlRequested: "请求上传" +uploadFromUrl: "从 URL 上传" +uploadFromUrlDescription: "输入文件的 URL" +uploadFromUrlRequested: "已请求上传" uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。" explore: "发现" messageRead: "已读" noMoreHistory: "没有更多的历史记录" -startMessaging: "添加聊天" -nUsersRead: "{n}人已读" -agreeTo: "勾选则表示已阅读并同意{0}" +startMessaging: "开始聊天" +nUsersRead: "{n} 人已读" +agreeTo: "我同意 {0}" tos: "服务条款" start: "开始" home: "首页" -remoteUserCaution: "由于此用户来自其它实例,显示的信息可能不完整。" +remoteUserCaution: "由于此用户来自其它服务器,显示的信息可能不完整。" activity: "活动" images: "图片" birthday: "生日" -yearsOld: "{age}岁" +yearsOld: "{age} 岁" registeredDate: "注册于" location: "位置" theme: "主题" @@ -273,9 +273,9 @@ light: "浅色" dark: "深色" lightThemes: "浅色主题" darkThemes: "深色主题" -syncDeviceDarkMode: "将深色模式与设备设置同步" +syncDeviceDarkMode: "将深色模式设置与设备同步" drive: "网盘" -fileName: "文件名称" +fileName: "文件名" selectFile: "选择文件" selectFiles: "选择文件" selectFolder: "选择文件夹" @@ -306,20 +306,20 @@ doNothing: "关闭弹窗" reloadConfirm: "确定要重新加载吗?" watch: "关注" unwatch: "取消关注" -accept: "允许" +accept: "接受" reject: "拒绝" normal: "正常" instanceName: "服务器名称" instanceDescription: "服务器简介" maintainerName: "管理员名称" maintainerEmail: "管理员电子邮箱" -tosUrl: "服务条款URL" +tosUrl: "服务条款 URL" thisYear: "今年" thisMonth: "本月" today: "今天" -dayX: "{day}日" -monthX: "{month}月" -yearX: "{year}年" +dayX: "{day} 日" +monthX: "{month} 月" +yearX: "{year} 年" pages: "页面" integration: "整合" connectService: "连接" @@ -333,41 +333,41 @@ invite: "邀请" driveCapacityPerLocalAccount: "每个用户的网盘空间" driveCapacityPerRemoteAccount: "每个远程用户的网盘容量" inMb: "以兆字节(MegaByte)为单位" -iconUrl: "图标URL" -bannerUrl: "横幅URL" -backgroundImageUrl: "背景图URL" +iconUrl: "图标 URL" +bannerUrl: "横幅 URL" +backgroundImageUrl: "背景图 URL" basicInfo: "基本信息" pinnedUsers: "置顶用户" -pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。" +pinnedUsersDescription: "列出要在「发现」页面中置顶的用户,一行一个。" pinnedPages: "固定页面" -pinnedPagesDescription: "输入您要固定到服务器首页的页面路径,以换行符分隔。" -pinnedClipId: "置顶的便签ID" +pinnedPagesDescription: "输入您要固定到服务器首页的页面路径,一行一个。" +pinnedClipId: "置顶的便签 ID" pinnedNotes: "已置顶的帖子" hcaptcha: "hCaptcha" enableHcaptcha: "启用 hCaptcha" -hcaptchaSiteKey: "网站密钥" -hcaptchaSecretKey: "密钥" +hcaptchaSiteKey: "网站密钥 (Site key)" +hcaptchaSecretKey: "密钥 (Secret key)" recaptcha: "reCAPTCHA" -enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)" -recaptchaSiteKey: "网站密钥" -recaptchaSecretKey: "reCAPTCHA 密钥" -avoidMultiCaptchaConfirm: "使用多种验证方式可能会造成干扰,您要禁用其他验证方式吗?您可以按“取消”按钮,仍然保持启用多种验证方式。" +enableRecaptcha: "启用 reCAPTCHA\n(请注意,reCAPTCHA 在中国大陆无法访问,如果启用,可能导致无法正常使用登录或注册等功能)" +recaptchaSiteKey: "网站密钥 (Site key)" +recaptchaSecretKey: "密钥 (Secret key)" +avoidMultiCaptchaConfirm: "使用多种验证方式可能会造成干扰,您要禁用其他验证方式吗?如果你希望它们继续被启用,请点击 「取消」。" antennas: "天线" -manageAntennas: "天线管理" +manageAntennas: "管理天线" name: "名称" antennaSource: "接收来源" antennaKeywords: "包含关键字" antennaExcludeKeywords: "排除关键字" -antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范" +antennaKeywordsDescription: "AND 条件用空格分隔,OR 条件用换行符分隔。" notifyAntenna: "新帖子通知" -withFileAntenna: "仅带有附件的帖子" -enableServiceworker: "启用ServiceWorker" -antennaUsersDescription: "指定用户名,用换行符分隔" +withFileAntenna: "仅显示带有附件的帖子" +enableServiceworker: "为浏览器启用推送通知 (ServiceWorker)" +antennaUsersDescription: "指定用户名,一行一个" caseSensitive: "区分大小写" withReplies: "包括回复" connectedTo: "您的账号已连到接以下第三方账号" notesAndReplies: "帖子与回复" -withFiles: "附件" +withFiles: "包含文件" silence: "禁言" silenceConfirm: "确认要禁言吗?" unsilence: "解除禁言" @@ -376,37 +376,37 @@ popularUsers: "热门用户" recentlyUpdatedUsers: "最近投稿的用户" recentlyRegisteredUsers: "最近登录的用户" recentlyDiscoveredUsers: "最近发现的用户" -exploreUsersCount: "有{count}个用户" +exploreUsersCount: "有 {count} 个用户" exploreFediverse: "探索联邦宇宙" popularTags: "热门标签" userList: "列表" about: "关于" -aboutMisskey: "关于 Misskey" +aboutMisskey: "关于 Calckey" administrator: "管理员" token: "Token (令牌)" twoStepAuthentication: "两步验证" -moderator: "监察员" +moderator: "协作者" moderation: "管理" -nUsersMentioned: "{n} 被提到" +nUsersMentioned: "被 {n} 人提到" securityKey: "安全密钥" securityKeyName: "密钥名称" -registerSecurityKey: "注册硬件安全密钥" +registerSecurityKey: "注册安全密钥" lastUsed: "上次使用" unregister: "删除账户" passwordLessLogin: "无密码登录" resetPassword: "重置密码" -newPasswordIs: "新的密码是「{password}」" -reduceUiAnimation: "减少UI动画" +newPasswordIs: "新的密码是 {password}" +reduceUiAnimation: "减少 UI 动画" share: "分享" notFound: "未找到" -notFoundDescription: "没有与指定URL对应的页面。" +notFoundDescription: "没有与指定 URL 对应的页面。" uploadFolder: "默认上传文件夹" cacheClear: "清空缓存" markAsReadAllNotifications: "将所有通知标为已读" markAsReadAllUnreadNotes: "将所有帖子标记为已读" markAsReadAllTalkMessages: "将所有聊天标记为已读" help: "帮助" -inputMessageHere: "在此键入信息" +inputMessageHere: "在此输入信息" close: "关闭" group: "群组" groups: "群组" @@ -417,8 +417,8 @@ invites: "邀请" groupName: "群组名" members: "成员" transfer: "转让" -messagingWithUser: "与用户聊天" -messagingWithGroup: "与群组聊天" +messagingWithUser: "私聊" +messagingWithGroup: "群聊" title: "标题" text: "文本" enable: "启用" @@ -427,27 +427,27 @@ retype: "重新输入" noteOf: "{user} 的帖子" inviteToGroup: "群组邀请" quoteAttached: "已引用" -quoteQuestion: "是否引用此链接内容?" -noMessagesYet: "现在没有新的聊天" +quoteQuestion: "是否引用?" +noMessagesYet: "现在没有新的消息" newMessageExists: "新信息" onlyOneFileCanBeAttached: "只能添加一个附件" signinRequired: "请先登录" invitations: "邀请" invitationCode: "邀请码" -checking: "正在确认" +checking: "正在确认..." available: "可用" unavailable: "不可用" usernameInvalidFormat: "可使用大小写英文字母、数字和下划线。" -tooShort: "过短" -tooLong: "过长" +tooShort: "太短" +tooLong: "太长" weakPassword: "密码强度:弱" normalPassword: "密码强度:中等" strongPassword: "密码强度:强" passwordMatched: "密码一致" passwordNotMatched: "密码不一致" -signinWith: "以{x}登录" +signinWith: "以 {x} 登录" signinFailed: "无法登录,请检查您的用户名和密码是否正确。" -tapSecurityKey: "轻触硬件安全密钥" +tapSecurityKey: "轻触你的安全密钥" or: "或者" language: "语言" uiLanguage: "显示语言" @@ -459,8 +459,8 @@ youHaveNoGroups: "没有群组" joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。" noHistory: "没有历史记录" signinHistory: "登录历史" -disableAnimatedMfm: "禁用MFM动画" -doing: "正在进行" +disableAnimatedMfm: "禁用 MFM 动画" +doing: "正在处理…" category: "类别" tags: "标签" docSource: "文件来源" @@ -468,7 +468,7 @@ createAccount: "注册账户" existingAccount: "现有的账户" regenerate: "重新生成" fontSize: "字体大小" -noFollowRequests: "没有关注申请" +noFollowRequests: "没有待批准的关注申请" openImageInNewTab: "在新标签页中打开图片" dashboard: "管理面板" local: "本地" @@ -487,20 +487,22 @@ showFeaturedNotesInTimeline: "在时间线上显示热门推荐" objectStorage: "对象存储" useObjectStorage: "使用对象存储" objectStorageBaseUrl: "Base URL" -objectStorageBaseUrlDesc: "用于引用的URL。如果您正在使用CDN或反向代理,请指定其URL,例如S3:“https://<bucket>.s3.amazonaws.com”,GCS:“https://storage.googleapis.com/<bucket>”" +objectStorageBaseUrlDesc: "用于引用的 URL。如果您正在使用 CDN 或反向代理,请指定其 URL,例如S3:“https://<bucket>.s3.amazonaws.com”,GCS:“https://storage.googleapis.com/<bucket>”" objectStorageBucket: "存储桶" objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。" objectStoragePrefix: "前缀" objectStoragePrefixDesc: "文件将存储在此前缀的目录下。" -objectStorageEndpoint: "端点" -objectStorageEndpointDesc: "如果你使用AWS S3请留空。否则请根据你使用的服务商的说明来进行设置,指定端点形式为“<host>”或“<host>:<port>”。" +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "如果你使用 AWS S3 请留空。否则请根据你使用的服务商的说明来进行设置,指定 Endpoint 形式为 + \"<host>\" 或 \"<host>:<port>\"。" objectStorageRegion: "可用区" -objectStorageRegionDesc: "指定一个可用区,例如“xx-east-1”。 如果您的对象存储服务没有可用区概念,请将其留空或填写“us-east-1”。" -objectStorageUseSSL: "使用SSL" -objectStorageUseSSLDesc: "如果不使用https进行API连接,请关闭。" +objectStorageRegionDesc: "指定一个可用区,例如 \"xx-east-1\"。 如果您的对象存储服务没有可用区概念,请将其留空或填写 \"\ + us-east-1\"。\n对于 Cloudflare R2,可以填为 \"auto\"" +objectStorageUseSSL: "使用 SSL" +objectStorageUseSSLDesc: "如果不使用 HTTPS 进行 API 连接,请关闭" objectStorageUseProxy: "使用代理" -objectStorageUseProxyDesc: "如果您不使用代理进行API连接,请将其关闭。" -objectStorageSetPublicRead: "上传时设置为public-read" +objectStorageUseProxyDesc: "如果您不使用代理进行 API 连接,请将其关闭" +objectStorageSetPublicRead: "上传时设置为 public-read" serverLogs: "服务器日志" deleteAll: "全部删除" showFixedPostForm: "在时间线顶部显示发帖框" @@ -526,14 +528,14 @@ state: "状态" sort: "排序" ascendingOrder: "升序" descendingOrder: "降序" -scratchpad: "AiScript控制台" -scratchpadDescription: "AiScript控制台为AiScript提供了实验环境。您可以编写代码以与Misskey交互,运行它并查看结果。" +scratchpad: "AiScript 控制台" +scratchpadDescription: "AiScript 控制台为 AiScript 提供了实验环境。您可以编写代码以与 Calckey 交互,运行它并查看结果。" output: "输出" script: "脚本" -disablePagesScript: "禁用页面脚本" +disablePagesScript: "在页面中禁用 AiScript" updateRemoteUser: "更新远程用户信息" deleteAllFiles: "删除所有文件" -deleteAllFilesConfirm: "要删除所有文件吗?" +deleteAllFilesConfirm: "确定要删除所有文件吗?" removeAllFollowing: "取消所有关注" removeAllFollowingDescription: "取消 {host} 的所有关注者。如果服务器已不存在,请执行它。" userSuspended: "该用户已被冻结。" @@ -547,10 +549,10 @@ relays: "中继" addRelay: "添加中继" inboxUrl: "Inbox URL" addedRelays: "已添加的中继" -serviceworkerInfo: "您需要启用推送通知" +serviceworkerInfo: "需要启用推送通知。" deletedNote: "已删除的帖子" invisibleNote: "隐藏的帖子" -enableInfiniteScroll: "启用自动滚动页面模式" +enableInfiniteScroll: "滚动页面以载入更多内容" visibility: "可见性" poll: "调查问卷" useCw: "隐藏内容" @@ -567,9 +569,9 @@ manage: "管理" plugins: "插件" preferencesBackups: "备份设置" deck: "Deck" -undeck: "取消Deck" +undeck: "取消 Deck" useBlurEffectForModal: "对话框使用模糊效果" -useFullReactionPicker: "使用全功能的回应工具栏" +useFullReactionPicker: "使用全尺寸的回应选择栏" width: "宽度" height: "高度" large: "大" @@ -580,7 +582,7 @@ permission: "权限" enableAll: "启用全部" disableAll: "禁用全部" tokenRequested: "允许访问账户" -pluginTokenRequestedDescription: "此插件将能够拥有此处设置的权限" +pluginTokenRequestedDescription: "此插件将能够拥有这里设置的权限。" notificationType: "通知类型" edit: "编辑" emailServer: "邮件服务器" @@ -588,20 +590,20 @@ enableEmail: "启用发送邮件功能" emailConfigInfo: "用于确认电子邮件和密码重置" email: "邮箱" emailAddress: "电子邮件地址" -smtpConfig: "SMTP服务器设置" +smtpConfig: "SMTP 服务器设置" smtpHost: "主机名" smtpPort: "端口" smtpUser: "用户名" smtpPass: "密码" -emptyToDisableSmtpAuth: "用户名和密码留空可以禁用SMTP验证" +emptyToDisableSmtpAuth: "留空用户名和密码以禁用 SMTP 验证" smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS" -smtpSecureInfo: "使用STARTTLS时关闭。" +smtpSecureInfo: "使用 STARTTLS 时关闭" testEmail: "邮件发送测试" wordMute: "文字屏蔽" regexpError: "正则表达式错误" regexpErrorDescription: "{tab} 屏蔽文字的第 {line} 行的正则表达式有错误:" instanceMute: "服务器静音" -userSaysSomething: "{name}说了什么" +userSaysSomething: "{name} 说了什么" makeActive: "启用" display: "显示" copy: "复制" @@ -620,12 +622,12 @@ other: "其他" regenerateLoginToken: "重新生成登录令牌" regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通常您不需要这样做。重新生成后,您将在所有设备上登出。" setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。" -fileIdOrUrl: "文件ID或者URL" +fileIdOrUrl: "文件 ID 或者 URL" behavior: "行为" sample: "示例" abuseReports: "举报" reportAbuse: "举报" -reportAbuseOf: "举报{name}" +reportAbuseOf: "举报 {name}" fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写 URL 地址。" abuseReported: "内容已发送。感谢您提交信息。" reporter: "举报者" @@ -638,9 +640,9 @@ abuseMarkAsResolved: "处理完毕" openInNewTab: "在新标签页中打开" openInSideView: "在侧边栏中打开" defaultNavigationBehaviour: "默认导航" -editTheseSettingsMayBreakAccount: "编辑这些设置可以会损坏您的账号" -instanceTicker: "帖子的服务器信息" -waitingFor: "等待{x}" +editTheseSettingsMayBreakAccount: "编辑这些设置可能会损坏你的账号。" +instanceTicker: "帖子所在的服务器信息" +waitingFor: "等待 {x}" random: "随机" system: "系统" switchUi: "界面" @@ -652,14 +654,14 @@ createNewClip: "新建便签" unclip: "移除便签" confirmToUnclipAlreadyClippedNote: "本帖已包含在便签 \"{name}\" 里。您想要将本帖从该便签中移除吗?" public: "公开" -i18nInfo: "Calckey已经被志愿者们翻译成了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。" +i18nInfo: "Calckey 已经被志愿者们翻译成了各种语言。如果你也有兴趣,可以通过 {link} 帮助翻译。" manageAccessTokens: "管理 Access Tokens" accountInfo: "账户信息" notesCount: "帖子数量" repliesCount: "回复数量" -renotesCount: "推贴数量" +renotesCount: "转发数量" repliedCount: "回复数" -renotedCount: "收到的推贴数" +renotedCount: "转发数量" followingCount: "正在关注数量" followersCount: "关注者数量" sentReactionsCount: "发送回应数" @@ -674,9 +676,9 @@ noCrawle: "要求搜索引擎不索引该用户" noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。" lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。" alwaysMarkSensitive: "默认将媒体文件标记为敏感内容" -loadRawImages: "添加附件图像的缩略图时使用原始图像质量" +loadRawImages: "加载原始图像而不是显示缩略图" disableShowingAnimatedImages: "不播放动画" -verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。" +verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成验证。" notSet: "未设置" emailVerified: "电子邮件地址已验证" noteFavoritesCount: "收藏的帖子数" @@ -687,27 +689,28 @@ useSystemFont: "使用系统默认字体" clips: "便签" experimentalFeatures: "实验性功能" developer: "开发者" -makeExplorable: "使账号可见。" +makeExplorable: "使账号在“发现”中可见" makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。" -showGapBetweenNotesInTimeline: "时间线上的帖子分开显示。" +showGapBetweenNotesInTimeline: "时间线上的帖子分开显示" duplicate: "复制" left: "左" center: "中央" wide: "宽" narrow: "窄" reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?" -needReloadToApply: "重启后应用才会生效。" +needReloadToApply: "需要重新加载才能生效。" showTitlebar: "显示标题栏" clearCache: "清除缓存" -onlineUsersCount: "{n}人在线" -nUsers: "{n}用户" +onlineUsersCount: "{n} 人在线" +nUsers: "{n} 用户" nNotes: "{n} 帖子" sendErrorReports: "发送错误报告" -sendErrorReportsDescription: "启用后,如果出现问题,可以与 Misskey 共享详细的错误信息,从而帮助提高软件的质量。" +sendErrorReportsDescription: "启用后,如果出现问题,可以与 Calckey 共享详细的错误信息,从而帮助提高软件的质量。\n这将包括您的操作系统版本、您使用的浏览器、您在 + Calckey 中的活动等信息。" myTheme: "我的主题" backgroundColor: "背景" accentColor: "强调色" -textColor: "文本" +textColor: "文本颜色" saveAs: "另存为" advanced: "高级" value: "值" @@ -732,7 +735,7 @@ emailNotification: "邮件通知" publish: "发布" inChannelSearch: "频道内搜索" useReactionPickerForContextMenu: "单击右键打开回应工具栏" -typingUsers: "{users}正在输入" +typingUsers: "{users} 正在输入" jumpToSpecifiedDate: "跳转到特定日期" showingPastTimeline: "显示过去的时间线" clear: "清除" @@ -754,8 +757,8 @@ online: "在线" active: "活动" offline: "离线" notRecommended: "不推荐" -botProtection: "Bot防御" -instanceBlocking: "联邦管理" +botProtection: "Bot 防御" +instanceBlocking: "联合管理" selectAccount: "选择账户" switchAccount: "切换账户" enabled: "已启用" @@ -765,8 +768,8 @@ user: "用户" administration: "管理" accounts: "账户" switch: "切换" -noMaintainerInformationWarning: "管理人员信息未设置。" -noBotProtectionWarning: "Bot保护未设置。" +noMaintainerInformationWarning: "管理员信息未设置。" +noBotProtectionWarning: "Bot 防御未设置。" configure: "设置" postToGallery: "发送到图库" gallery: "图库" @@ -784,7 +787,7 @@ emailNotConfiguredWarning: "电子邮件地址未设置。" ratio: "比率" previewNoteText: "预览文本" customCss: "自定义 CSS" -customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!" +customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用。" global: "全局" squareAvatars: "显示方形头像图标" sent: "发送" @@ -792,17 +795,17 @@ received: "收取" searchResult: "搜索结果" hashtags: "话题标签" troubleshooting: "故障排除" -useBlurEffect: "在UI上使用模糊效果" +useBlurEffect: "在 UI 上使用模糊效果" learnMore: "更多信息" -misskeyUpdated: "Misskey更新完成!" +misskeyUpdated: "Calckey 更新完成!" whatIsNew: "显示更新信息" translate: "翻译" translatedFrom: "从 {x} 翻译" accountDeletionInProgress: "正在删除账户" usernameInfo: "在服务器上唯一标识您的帐户的名称。您可以使用字母 (a ~ z, A ~ Z)、数字 (0 ~ 9) 和下划线 (_)。用户名以后不能更改。" aiChanMode: "小蓝模式" -keepCw: "保留CW" -pubSub: "Pub/Sub账户" +keepCw: "保留 CW" +pubSub: "推送(Pub)/订阅(Sub) 账户" lastCommunication: "最近通信" resolved: "已解决" unresolved: "未解决" @@ -817,14 +820,14 @@ manageAccounts: "管理账户" makeReactionsPublic: "将回应设置为公开" makeReactionsPublicDescription: "将您发表过的回应设置成公开可见。" classic: "居中" -muteThread: "屏蔽帖子列表" -unmuteThread: "取消屏蔽帖子列表" -ffVisibility: "连接的可见范围" -ffVisibilityDescription: "您可以设置您的关注/关注者信息的公开范围" +muteThread: "屏蔽帖子串" +unmuteThread: "取消屏蔽帖子串" +ffVisibility: "关注/关注者 可见性" +ffVisibilityDescription: "你可以设置谁可以看到你的关注/关注者信息。" continueThread: "查看更多帖子" -deleteAccountConfirm: "将要删除账户。是否确认?" +deleteAccountConfirm: "将要删除账户。是否继续?" incorrectPassword: "密码错误" -voteConfirm: "确定投给“{choice}” ?" +voteConfirm: "确定投给 “{choice}” ?" hide: "隐藏" leaveGroup: "离开群组" leaveGroupConfirm: "确定离开「{name}」?" @@ -841,30 +844,30 @@ numberOfColumn: "列数" searchByGoogle: "Google" instanceDefaultLightTheme: "服务器默认浅色主题" instanceDefaultDarkTheme: "服务器默认深色主题" -instanceDefaultThemeDescription: "以对象格式键入主题代码" -mutePeriod: "屏蔽期限" +instanceDefaultThemeDescription: "以对象格式键入主题代码。" +mutePeriod: "屏蔽时长" indefinitely: "永久" tenMinutes: "10分钟" -oneHour: "1小时" -oneDay: "1天" -oneWeek: "1周" +oneHour: "1 小时" +oneDay: "1 天" +oneWeek: "1 周" reflectMayTakeTime: "可能需要一些时间才能体现出效果。" failedToFetchAccountInformation: "获取账户信息失败" -rateLimitExceeded: "已超過速率限制" +rateLimitExceeded: "已超过速率限制" cropImage: "剪裁图像" -cropImageAsk: "是否要裁剪图像?" +cropImageAsk: "你想要裁剪图像吗?" file: "文件" -recentNHours: "最近{n}小时" -recentNDays: "最近{n}天" +recentNHours: "最近 {n} 小时" +recentNDays: "最近 {n} 天" noEmailServerWarning: "电子邮件服务器未设置。" -thereIsUnresolvedAbuseReportWarning: "有未解决的报告" +thereIsUnresolvedAbuseReportWarning: "有未处理的举报。" recommended: "推荐" check: "检查" -driveCapOverrideLabel: "變更此用戶的雲端硬碟容量上限" +driveCapOverrideLabel: "修改这个用户的网盘容量上限" driveCapOverrideCaption: "设定为 0 以下则会解除此限制。" requireAdminForView: "需要使用管理员账户登录才能查看。" isSystemAccount: "该账号由系统自动创建和管理。请不要修改、编辑、删除或以其他方式篡改这个账户,否则可能会破坏你的服务器。" -typeToConfirm: "输入 {x} 以确认操作。" +typeToConfirm: "输入 {x} 以确认操作" deleteAccount: "删除账户" document: "文档" numberOfPageCache: "缓存页数" @@ -881,16 +884,16 @@ type: "类型" speed: "速度" slow: "慢" fast: "快" -sensitiveMediaDetection: "检测到敏感媒体" +sensitiveMediaDetection: "检测到敏感媒体内容" localOnly: "仅限本地" remoteOnly: "仅远程" failedToUpload: "上传失败" -cannotUploadBecauseInappropriate: "因为可能含有不适宜的内容,无法上传。" -cannotUploadBecauseNoFreeSpace: "因为已无可用空间,无法上传。" +cannotUploadBecauseInappropriate: "这个文件无法上传,因为可能含有不适宜的内容。" +cannotUploadBecauseNoFreeSpace: "由于已无可用网盘空间,无法上传。" beta: "测试" -enableAutoSensitive: "自动 NSFW 识别" -enableAutoSensitiveDescription: "如果可用,请使用机器学习在媒体上自动设置 NSFW 标志。即使关闭此功能,也可能会根据服务器自动设置。" -activeEmailValidationDescription: "积极地验证用户的电子邮件地址,判断它是一次性的电子邮件地址,还是可以实际通信的地址。关闭时,则只检查字符串是否正确。" +enableAutoSensitive: "自动 NSFW 标记" +enableAutoSensitiveDescription: "允许通过机器学习对媒体文件自动设置 NSFW 标志。即使关闭此功能,也可能会根据服务器自动设置。" +activeEmailValidationDescription: "启用更严格的电子邮件地址验证,包括判断它是一次性的电子邮件地址还是可以实际通信的地址。关闭时,则只检查字符串是否正确。" navbar: "导航栏" shuffle: "随机" account: "账户" @@ -910,18 +913,18 @@ _sensitiveMediaDetection: analyzeVideos: "启用对视频的检测" analyzeVideosDescription: "除了静止图像之外,还对视频进行分析。服务器负载会略微增加。" _emailUnavailable: - used: "已经被使用过" + used: "这个电子邮件地址已经被使用过" format: "无效的格式" - disposable: "不是永久可用的地址" + disposable: "不得使用一次性电子邮件地址" mx: "邮件服务器不正确" smtp: "邮件服务器没有响应" _ffVisibility: - public: "发布" - followers: "只有关注你的用户能看到" - private: "私密" + public: "公开" + followers: "仅对关注者可见" + private: "私信" _signup: almostThere: "即将完成" - emailAddressInfo: "请输入您所使用的电子邮件地址" + emailAddressInfo: "请输入您所使用的电子邮件地址,它不会公开显示。" emailSent: "已将确认邮件发送至您输入的电子邮件地址 ({email})。请访问电子邮件中的链接以完成帐户创建。" _accountDelete: accountDelete: "删除帐户" @@ -934,8 +937,8 @@ _ad: back: "返回" reduceFrequencyOfThisAd: "减少此广告的频率" _forgotPassword: - enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。" - ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系服务器管理员。" + enterEmail: "请输入您注册账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。" + ifNoEmail: "如果您在注册时没有输入电子邮件地址,请联系服务器管理员。" contactAdmin: "该服务器不支持发送电子邮件。如果您想重设密码,请联系管理员。" _gallery: my: "我的图库" @@ -946,61 +949,61 @@ _email: _follow: title: "你有新的关注者" _receiveFollowRequest: - title: "收到了关注请求" + title: "你收到了关注请求" _plugin: install: "安装插件" installWarn: "请不要安装不可信的插件。" - manage: "管理插件..." + manage: "管理插件" _preferencesBackups: list: "已创建的备份" saveNew: "另存为" - loadFile: "导入文件" + loadFile: "从文件导入" apply: "应用于本设备" save: "覆盖存档" inputName: "请输入备份的名称" - cannotSave: "无法保存" - nameAlreadyExists: "备份名称\"{name}\"已经存在,请指定其他名称。" - applyConfirm: "您是否要将备份\"{name}\"应用到当前设备上?当前设备现有配置将被丢弃。" + cannotSave: "保存失败" + nameAlreadyExists: "备份名称 \"{name}\" 已经存在,请指定其他名称。" + applyConfirm: "您是否要将备份 \"{name}\" 应用到当前设备上?当前设备现有配置将被丢弃。" saveConfirm: "您确定要覆盖保存 {name} 吗?" deleteConfirm: "您确定要删除 {name} 吗?" - renameConfirm: "您确定要把“{old}”改为“{new}”吗?" - noBackups: "当前没有备份,“另存为”允许您在服务器上保存当前客户端的配置。" + renameConfirm: "您确定要把 \"{old}\" 改为 \"{new}\" 吗?" + noBackups: "没有备份。你可以使用“创建新的备份”来备份你在该服务器上的客户设置。" createdAt: "创建日期:{date} {time}" updatedAt: "更新日期:{date} {time}" cannotLoad: "无法加载" - invalidFile: "无效的的文件格式。" + invalidFile: "无效的的文件格式" _registry: scope: "范围" - key: "主要" - keys: "主要" + key: "键" + keys: "键" domain: "域" createKey: "创建键" _aboutMisskey: - about: "Misskey是由syuilo于2014年开发的开源软件。" + about: "Calckey 是由 ThatOneCalculator 创建的 Misskey 的一个分支,自 2022 年开始开发。" contributors: "主要贡献者" allContributors: "全体贡献者" source: "源代码" - translation: "翻译Misskey" - donate: "赞助Misskey" + translation: "翻译 Calckey" + donate: "赞助 Calckey" morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰" - patrons: "支持者" + patrons: "Calckey 赞助者" patronsList: 按时间顺序而不是捐赠金额排列。通过上面的链接捐款,让您的名字出现在这里! _nsfw: respect: "隐藏敏感内容" ignore: "不隐藏敏感内容" force: "总是隐藏内容" _mfm: - cheatSheet: "MFM代码速查表" - intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。" - dummy: "通过Misskey扩展联邦宇宙的世界" + cheatSheet: "MFM 代码速查表" + intro: "MFM 是一种在 Misskey、Calckey、Akkoma 中使用的标记语言,可以在很多地方使用。您可以在此处查看所有可用的 MFM 语法的列表。" + dummy: "通过 Calckey 扩展联邦宇宙的世界" mention: "提及" - mentionDescription: "可以使用 @+用户名 来指示特定用户" + mentionDescription: "可以使用 @+用户名 来指示特定用户。" hashtag: "话题标签" hashtagDescription: "可以使用井号+文字来表示话题标签。" url: "URL" - urlDescription: "可以表示URL地址。" + urlDescription: "可以表示 URL 地址。" link: "链接" - linkDescription: "可以将部分文字和URL关联起来。" + linkDescription: "可以将部分文字和 URL 关联起来。" bold: "粗体" boldDescription: "可以将文字显示为粗体来表示强调。" small: "缩小" @@ -1012,11 +1015,11 @@ _mfm: blockCode: "代码(块)" blockCodeDescription: "语法高亮显示整块程序代码。" inlineMath: "数学公式(内嵌)" - inlineMathDescription: "显示内嵌的KaTeX公式。" + inlineMathDescription: "显示内嵌的 KaTeX 公式" blockMath: "数学公式(块)" - blockMathDescription: "显示整块的KaTeX数学公式。" + blockMathDescription: "显示整块的 KaTeX 数学公式" quote: "引用" - quoteDescription: "可以用来表示引用的内容。" + quoteDescription: "将内容显示为引用。" emoji: "自定义表情符号" emojiDescription: "可以将自定义表情符号使用冒号括起来,就可以显示自定义表情符号了。" search: "搜索" @@ -1090,7 +1093,7 @@ _channel: featured: "热点" owned: "管理中" following: "正在关注" - usersCount: "有{n}人参与" + usersCount: "有 {n} 人参与" notesCount: "{n} 帖子" nameAndDescription: "名称与描述" nameOnly: "仅名称" @@ -1101,18 +1104,18 @@ _menuDisplay: hide: "隐藏" _wordMute: muteWords: "禁用词" - muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。" + muteWordsDescription: "AND 条件用空格分隔,OR 条件用换行符分隔。" muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。" softDescription: "隐藏时间线中指定条件的帖子。" - hardDescription: "防止将具有指定条件的帖子添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。" + hardDescription: "防止将具有指定条件的帖子添加到时间线。 即使您更改条件,原先未添加的帖文也会被排除在外。" soft: "软屏蔽" hard: "硬屏蔽" mutedNotes: "已静音的帖子" _instanceMute: instanceMuteDescription: "屏蔽列出服务器中的所有帖子和转帖,包括服务器的用户回复。" instanceMuteDescription2: "设置时用换行符来分隔" - title: "隐藏服务器已设置的帖子。" - heading: "要静音的服务器列表" + title: "隐藏列出的服务器中的帖子。" + heading: "要屏蔽的服务器列表" _theme: explore: "寻找主题" install: "安装主题" @@ -1142,7 +1145,7 @@ _theme: lighten: "浅色" inputConstantName: "请输入常量名称" importInfo: "您可以在此处粘贴主题代码,将其导入到编辑器中" - deleteConstantConfirm: "确定要删除常量{const}吗?" + deleteConstantConfirm: "确定要删除常量 {const} 吗?" keys: accent: "强调色" bg: "背景" @@ -1160,7 +1163,7 @@ _theme: link: "链接" hashtag: "话题标签" mention: "提及" - mentionMe: "提及" + mentionMe: "提及(自己)" renote: "转发" modalBg: "对话框背景" divider: "分割线" @@ -1174,8 +1177,8 @@ _theme: cwBg: "CW 按钮背景" cwFg: "CW 按钮文本" cwHoverBg: "CW 按钮背景(悬停)" - toastBg: "Toast通知背景" - toastFg: "Toast通知文本" + toastBg: "Toast 通知背景" + toastFg: "Toast 通知文本" buttonBg: "按钮背景" buttonHoverBg: "按钮背景(悬停)" inputBorder: "输入框边框" @@ -1198,49 +1201,49 @@ _sfx: _ago: future: "未来" justNow: "最近" - secondsAgo: "{n}秒前" - minutesAgo: "{n}分前" - hoursAgo: "{n}小时前" - daysAgo: "{n}天前" - weeksAgo: "{n}周前" - monthsAgo: "{n}月前" - yearsAgo: "{n}年前" + secondsAgo: "{n} 秒前" + minutesAgo: "{n} 分前" + hoursAgo: "{n} 小时前" + daysAgo: "{n} 天前" + weeksAgo: "{n} 周前" + monthsAgo: "{n} 月前" + yearsAgo: "{n} 年前" _time: second: "秒" minute: "分" hour: "小时" day: "日" _tutorial: - title: "如何使用Calckey" + title: "如何使用 Calckey" step1_1: "欢迎!" - step1_2: "让我们把你安排好。你很快就会启动并运行!" + step1_2: "让我们帮您设置一下。您很快就能开始畅游联邦宇宙!" step2_1: "首先,请完成您的个人资料。" step2_2: "提供一些关于你的信息,让其他人更容易知道他们是否想看你的帖子或关注你。" step3_1: "现在是时候关注一些人了!" - step3_2: "你的主页和社交馈送是基于你所关注的人,所以试着先关注几个账户。{n点击个人资料右上角的加号圈就可以关注它。" - step4_1: "让我们出去找你。" + step3_2: "你的主页和社交馈送是基于你所关注的人,所以试着先关注几个账户。\n点击个人资料右上角的加号圈就可以关注它。" + step4_1: "让我们出发把。" step4_2: "对于第一条帖子,可以做一个 {introduction} 或一个简单的 \"hello world!\"" step5_1: "时间线,无处不在的时间线!" - step5_2: "您的服务器已启用{timelines}种不同的时间线。" - step5_3: "主页{icon}时间线是你可以看到你关注账户的帖子的时间线。" - step5_4: "本地{icon}时间线是你可以看到此服务器上其它用户的帖子的时间线。" - step5_5: "社交{icon}时间线是主页和本地时间线的结合。" - step5_6: "推荐{icon}时间线是你可以看到管理员推荐服务器的帖子的时间线。" - step5_7: "全球{icon}时间线是你可以看到来自其它所有互联服务器的帖子的时间线。" + step5_2: "您的服务器已启用 {timelines} 种不同的时间线。" + step5_3: "主页 {icon} 时间线是你可以看到你关注账户的帖子的时间线。" + step5_4: "本地 {icon} 时间线是你可以看到此服务器上其它用户的帖子的时间线。" + step5_5: "社交 {icon} 时间线是主页和本地时间线的结合。" + step5_6: "推荐 {icon} 时间线是你可以看到管理员推荐服务器的帖子的时间线。" + step5_7: "全球 {icon} 时间线是你可以看到来自其它所有互联服务器的帖子的时间线。" step6_1: "那么,这里是什么地方?" - step6_2: "好吧,你不只是加入Calckey。你已经加入了Fediverse的一个门户,这是一个由成千上万台服务器组成的互联网络。" - step6_3: "每个服务器的工作方式不同,并不是所有的服务器都运行Calckey。但这个人确实如此! 这有点复杂,但你很快就会明白的。" + step6_2: "好吧,你不只是加入 Calckey。你已经加入了 Fediverse 的一个门户,这是一个由成千上万台服务器组成的互联网络。" + step6_3: "每个服务器的工作方式不同,并不是所有的服务器都运行 Calckey。但这个服务器是的! 这有点复杂,但你很快就会明白的。" step6_4: "现在,去吧,去探索,去享受乐趣吧!" _2fa: - alreadyRegistered: "此设备已被注册" - registerTOTP: "注册设备" + alreadyRegistered: "您已经注册了两步验证设备。" + registerTOTP: "注册认证器应用" registerSecurityKey: "注册密钥" - step1: "首先,在您的设备上安装验证应用,例如{a}或{b}。" + step1: "首先,在您的设备上安装验证应用,例如 {a} 或 {b}。" step2: "然后,扫描屏幕上显示的二维码。" step2Url: "在桌面应用程序中输入以下URL:" step3: "输入您的应用提供的动态口令以完成设置。" step4: "从现在开始,任何登录操作都将要求您提供动态口令。" - securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。" + securityKeyInfo: "除了指纹或 PIN 身份验证外,您还可以通过支持 FIDO2 的硬件安全密钥设置身份验证,以进一步保护您的帐户。" renewTOTPOk: 重新配置 renewTOTPCancel: 取消 token: 2FA 令牌 @@ -1259,38 +1262,38 @@ _2fa: _permissions: "read:account": "查看账户信息" "write:account": "更改帐户信息" - "read:blocks": "查看黑名单" - "write:blocks": "编辑黑名单" + "read:blocks": "查看拉黑名单" + "write:blocks": "编辑拉黑名单" "read:drive": "查看网盘" "write:drive": "管理网盘文件" "read:favorites": "查看收藏夹" "write:favorites": "编辑收藏夹" "read:following": "查看关注信息" - "write:following": "关注/取消关注" - "read:messaging": "查看消息" - "write:messaging": "撰写或删除消息" - "read:mutes": "查看屏蔽列表" - "write:mutes": "编辑屏蔽列表" + "write:following": "关注/取消关注其它账户" + "read:messaging": "查看聊天消息" + "write:messaging": "撰写或删除聊天消息" + "read:mutes": "查看屏蔽用户列表" + "write:mutes": "编辑屏蔽用户列表" "write:notes": "撰写或删除帖子" "read:notifications": "查看通知" "write:notifications": "管理通知" "read:reactions": "查看回应" - "write:reactions": "回应操作" + "write:reactions": "编辑回应" "write:votes": "投票" "read:pages": "查看页面" - "write:pages": "操作页面" - "read:page-likes": "查看喜欢的页面" - "write:page-likes": "操作喜欢的页面" + "write:pages": "编辑或删除页面" + "read:page-likes": "查看页面上的喜欢" + "write:page-likes": "编辑页面上的喜欢" "read:user-groups": "查看用户组" "write:user-groups": "操作用户组" "read:channels": "查看频道" "write:channels": "管理频道" "read:gallery": "浏览图库" - "write:gallery": "操作图库" + "write:gallery": "编辑图库" "read:gallery-likes": "读取喜欢的图片" - "write:gallery-likes": "操作喜欢的图片" + "write:gallery-likes": "编辑喜欢的图片" _auth: - shareAccess: "您要授权允许“{name}”访问您的帐户吗?" + shareAccess: "您要授权允许 \"{name}\" 访问您的帐户吗?" shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?" permissionAsk: "此应用程序请求以下权限:" pleaseGoBack: "请返回到应用程序" @@ -1320,12 +1323,12 @@ _widgets: calendar: "日历" trends: "趋势" clock: "时钟" - rss: "RSS阅读器" - rssTicker: "RSS滚动条" + rss: "RSS 阅读器" + rssTicker: "RSS 滚动条" activity: "活动" photos: "照片" digitalClock: "数字时钟" - unixClock: "UNIX时钟" + unixClock: "UNIX 时钟" federation: "联邦宇宙" instanceCloud: "服务器云端" postForm: "发布窗口" @@ -1334,7 +1337,7 @@ _widgets: onlineUsers: "在线用户" jobQueue: "作业队列" serverMetric: "服务器指标" - aiscript: "AiScript控制台" + aiscript: "AiScript 控制台" aichan: "小蓝" userList: 用户列表 meiliStatus: 服务器状态 @@ -1342,15 +1345,15 @@ _widgets: meiliSize: 索引大小 serverInfo: 服务器信息 _userList: - chooseList: 选择一个列表 + chooseList: 选择列表 _cw: hide: "隐藏" show: "查看更多" - chars: "{count}个字符" + chars: "{count} 个字符" files: "{count} 个文件" _poll: noOnlyOneChoice: "需要至少两个选项" - choiceN: "选择{n}" + choiceN: "选择 {n}" noMore: "无法再添加更多了" canMultipleVote: "允许多个投票" expiration: "截止时间" @@ -1360,21 +1363,21 @@ _poll: deadlineDate: "截止日期" deadlineTime: "小时" duration: "时长" - votesCount: "{n}票" - totalVotes: "总票数{n}" + votesCount: "{n} 票" + totalVotes: "总票数 {n}" vote: "投票" showResult: "显示结果" voted: "已投票" closed: "已截止" - remainingDays: "{d}天{h}小时后截止" - remainingHours: "{h}小时{m}分后截止" - remainingMinutes: "{m}分{s}秒后截止" - remainingSeconds: "{s}秒后截止" + remainingDays: "{d} 天 {h} 小时后截止" + remainingHours: "{h} 小时 {m} 分后截止" + remainingMinutes: "{m} 分 {s} 秒后截止" + remainingSeconds: "{s} 秒后截止" _visibility: public: "公开" publicDescription: "您的帖子将出现在公共时间线上" home: "不公开" - homeDescription: "仅发送至首页的时间线" + homeDescription: "仅发送至首页时间线" followers: "仅关注者" followersDescription: "仅对你的关注者和提及的用户可见" specified: "指定用户" @@ -1396,10 +1399,10 @@ _profile: name: "昵称" username: "用户名" description: "个人简介" - youCanIncludeHashtags: "您可以包含一个哈希标签。" + youCanIncludeHashtags: "您可以包含一个话题标签。" metadata: "附加信息" metadataEdit: "附加信息编辑" - metadataDescription: "最多可以在个人资料中以表格形式显示四条其他信息。" + metadataDescription: "使用这些,您可以在您的个人资料中显示其他信息字段。" metadataLabel: "标签" metadataContent: "内容" changeAvatar: "修改头像" @@ -1453,8 +1456,8 @@ _pages: updated: "页面已更新" deleted: "该页面已被删除" pageSetting: "页面设置" - nameAlreadyExists: "该页面URL已存在" - invalidNameTitle: "无效的页面URL" + nameAlreadyExists: "该页面 URL 已存在" + invalidNameTitle: "无效的页面 URL" invalidNameText: "请确认该项不为空" editThisPage: "编辑此页面" viewSource: "查看源代码" @@ -1469,7 +1472,7 @@ _pages: content: "页面内容" variables: "变量" title: "标题" - url: "页面URL" + url: "页面 URL" summary: "页面摘要" alignCenter: "居中" hideTitleWhenPinned: "置顶时隐藏标题" @@ -1498,7 +1501,7 @@ _pages: _post: text: "内容" attachCanvasImage: "附加画布图像" - canvasId: "画布ID" + canvasId: "画布 ID" textInput: "文本输入" _textInput: name: "变量名" @@ -1516,12 +1519,12 @@ _pages: default: "默认值" canvas: "画布" _canvas: - id: "画布ID" + id: "画布 ID" width: "宽度" height: "高度" note: "嵌入的帖子" _note: - id: "帖子ID" + id: "帖子 ID" idDescription: "你也可以将帖子 URL 粘贴到此处。" detailed: "显示详细信息" switch: "开关" @@ -1549,7 +1552,7 @@ _pages: message: "按下时显示的消息" variable: "发送的变量" no-variable: "空" - callAiScript: "调用AiScript" + callAiScript: "调用 AiScript" _callAiScript: functionName: "函数名" radioButton: "选择项" @@ -1618,35 +1621,35 @@ _pages: round: "四舍五入" _round: arg1: "数值" - eq: "A和B相等" + eq: "A 和 B 相等" _eq: arg1: "A" arg2: "B" - notEq: "A和B不等" + notEq: "A 和 B 不等" _notEq: arg1: "A" arg2: "B" - and: "A和B" + and: "A 和 B" _and: arg1: "A" arg2: "B" - or: "A或B" + or: "A 或 B" _or: arg1: "A" arg2: "B" - lt: "< A小于B" + lt: "< A 小于 B" _lt: arg1: "A" arg2: "B" - gt: "> A大于B" + gt: "> A 大于 B" _gt: arg1: "A" arg2: "B" - ltEq: "<= A小于等于B" + ltEq: "<= A 小于等于 B" _ltEq: arg1: "A" arg2: "B" - gtEq: ">= A大于等于B" + gtEq: ">= A 大于等于 B" _gtEq: arg1: "A" arg2: "B" @@ -1712,7 +1715,7 @@ _pages: _splitStrByLine: arg1: "文本" ref: "变量" - aiScriptVar: "AiScript变量" + aiScriptVar: "AiScript 变量" fn: "函数" _fn: slots: "槽函数" @@ -1722,8 +1725,8 @@ _pages: _for: arg1: "次数" arg2: "处理" - typeError: "槽函数{slot}需要传入“{expect}”,但是实际传入为“{actual}”!" - thereIsEmptySlot: "槽函数{slot}为空!" + typeError: "槽函数 {slot} 需要传入 \"{expect}\",但是实际传入为 \"{actual}\"!" + thereIsEmptySlot: "槽函数 {slot} 为空!" types: string: "文字" number: "数值" @@ -1740,22 +1743,22 @@ _relayStatus: rejected: "已拒绝" _notification: fileUploaded: "文件已上传" - youGotMention: "来自{name}的提及" - youGotReply: "来自{name}的回复" - youGotQuote: "来自{name}的引用" - youRenoted: "来自{name}的转发" - youGotPoll: "来自{name}的投票" - youGotMessagingMessageFromUser: "来自{name}的聊天" - youGotMessagingMessageFromGroup: "来自{name}的群聊" - youWereFollowed: "关注了你。" - youReceivedFollowRequest: "您有新的关注请求" + youGotMention: "来自 {name} 的提及" + youGotReply: "来自 {name} 的回复" + youGotQuote: "来自 {name} 的引用" + youRenoted: "来自 {name} 的转发" + youGotPoll: "来自 {name} 的投票" + youGotMessagingMessageFromUser: "来自 {name} 的聊天" + youGotMessagingMessageFromGroup: "来自 {name} 的群聊" + youWereFollowed: "关注了你" + youReceivedFollowRequest: "你有新的关注请求" yourFollowRequestAccepted: "您的关注请求已通过" youWereInvitedToGroup: "您有新的群组邀请" - pollEnded: "问卷调查结果已生成。" + pollEnded: "问卷调查结果已生成" emptyPushNotificationMessage: "推送通知已更新" _types: all: "全部" - follow: "关注中" + follow: "新关注者" mention: "提及" reply: "回复" renote: "转发" @@ -1772,8 +1775,8 @@ _notification: reply: "回复" renote: "转发" reacted: 对你的帖子做出了回应 - voted: 在你的投票中投了票 - renoted: 推荐了你的帖子 + voted: 在你的问卷调查中投了票 + renoted: 转发了你的帖子 _deck: alwaysShowMainColumn: "总是显示主列" columnAlign: "列对齐" @@ -1791,8 +1794,8 @@ _deck: deleteProfile: "删除工作区" nameAlreadyExists: "该配置文件名已存在。" introduction: "将各列进行组合以创建您自己的界面!" - introduction2: "您可以随时通过屏幕右侧的 + 来添加列" - widgetsIntroduction: "从列菜单中,选择“小工具编辑”来添加小工具" + introduction2: "您可以随时通过屏幕右侧的 + 来添加列。" + widgetsIntroduction: "从列菜单中,选择“小工具编辑”来添加小工具。" _columns: main: "主列" widgets: "小工具" @@ -1820,36 +1823,36 @@ flagSpeakAsCat: 像猫一样说话 removeReaction: 移除你的回应 expandOnNoteClick: 点击打开帖子 expandOnNoteClickDesc: 如果禁用,你仍然可以在右键菜单中或通过点击时间戳打开帖子。 -sendPushNotificationReadMessage: 删除已阅读的推送通知 +sendPushNotificationReadMessage: 已读后删除推送通知 customMOTD: 自定义 MOTD(启动屏幕消息) -sendPushNotificationReadMessageCaption: 短暂显示 "{emptyPushNotificationMessage}" 的通知,如果启用,可能会增加你的设备的耗电量。 +sendPushNotificationReadMessageCaption: 会短暂显示 "{emptyPushNotificationMessage}" 的通知,如果启用,可能会增加你的设备的耗电量。 adminCustomCssWarn: 仅当你知道此设置的作用时才应使用它。输入不正确的值可能会导致每个人的客户端停止正常运行。请在用户设置中进行测试来确保您的 CSS 正常工作。 customMOTDDescription: 自定义 MOTD(启动屏幕)消息,一行一个,每次用户加载/刷新页面时都会随机显示。 -customSplashIconsDescription: 用换行符隔开的自定义闪屏图标的URL,在用户每次加载/重新加载页面时随机显示。请确保图片是在一个静态的 +customSplashIconsDescription: 用换行符隔开的自定义启动屏幕图标的 URL,在用户每次加载/重新载入页面时随机显示。请确保图片是在一个静态的 URL 上,最好全部调整为 192x192 的大小。 -recommendedInstancesDescription: 推荐的服务器以换行符分隔,它们将出现在推荐的时间线中。不要添加 "https://",仅添加域名。 +recommendedInstancesDescription: 推荐的服务器一行一个,它们将出现在推荐的时间线中。不要添加 "https://",仅添加域名。 splash: 启动画面 showUpdates: Calckey 更新后显示弹出窗口 -selectInstance: 选择一个服务器 -silencedInstances: 静默的服务器 -antennaInstancesDescription: 每行列出一个服务器主机 +selectInstance: 选择服务器 +silencedInstances: 禁言的服务器 +antennaInstancesDescription: 列出服务器主机名,一行一个 pushNotification: 推送通知 subscribePushNotification: 启用推送通知 showAdminUpdates: 提示新的 Calckey 版本可用(仅对于管理员) searchPlaceholder: 搜索 Calckey addInstance: 添加一个服务器 jumpToPrevious: 跳转至上一个 -silenceThisInstance: 使此服务器静音 +silenceThisInstance: 禁言此服务器 manageGroups: 管理群组 antennasDesc: "天线会显示符合您设置条件的新帖子!\n可以从时间线页面访问它们。" channelFederationWarn: 频道还没有与其他服务器联合 -seperateRenoteQuote: 单独的推荐和引用按钮 -customSplashIcons: 自定义闪屏图标(urls) +seperateRenoteQuote: 单独的转发和引用按钮 +customSplashIcons: 自定义启动屏幕图标(urls) alt: 替代文字 pushNotificationNotSupported: 你的浏览器或者服务器不支持推送通知 showAds: 显示广告 -enterSendsMessage: 按回车键发送信息(关闭则是 Ctrl + Retun) +enterSendsMessage: 按回车键发送信息(关闭则是 Ctrl + Retun 发送) recommendedInstances: 推荐服务器 updateAvailable: 可能有可用更新! swipeOnMobile: 允许在页面之间滑动 @@ -1860,24 +1863,24 @@ editNote: 编辑帖子 edited: 于 {date} {time} 编辑 selectChannel: 选择一个频道 accountMoved: 用户已迁移至新账户: -silencedInstancesDescription: 列出你想静默的服务器的主机名。列出的服务器中的账户被视为 "静默",只能发出跟随请求,如果不被跟随,就不能提及本地账户。这不会影响被封锁的服务器。 -hiddenTags: 隐藏的哈希标签 -userSaysSomethingReason: '{name} 说 {reason}' +silencedInstancesDescription: 列出你想禁言的服务器的主机名。列出的服务器中的账户被视为 "禁言",只能发出关注请求,如果不被关注,就不能提及本地账户。这不会影响被屏蔽的服务器。 +hiddenTags: 隐藏的话题标签 +userSaysSomethingReason: '{name} 说了 {reason}' clipsDesc: 便签就像可共享的分类书签。您可以从各个帖子的菜单中创建便签。 privateModeInfo: 当启用时,只有白名单上的服务器可以与你的服务器联合,所有的帖子都会对公共时间线隐藏。 allowedInstancesDescription: 要列入联合白名单的服务器的主机名,一行一个(仅适用于私密模式)。 -breakFollowConfirm: 你确定要移除关注者吗? +breakFollowConfirm: 确定要移除关注者吗? caption: 自动显示说明文字 newer: 更新的 older: 更老的 noInstances: 没有服务器 -silenced: 静默的 +silenced: 禁言的 accessibility: 无障碍 secureMode: 安全模式(仅允许授权的拉取) replayTutorial: 重播教程 userSaysSomethingReasonReply: '{name} 回复了包含 {reason} 的帖子' userSaysSomethingReasonQuote: '{name} 引用了一篇包含 {reason} 的帖子' -userSaysSomethingReasonRenote: '{name} 推荐了一个包含 {reason} 的帖子' +userSaysSomethingReasonRenote: '{name} 转发了一个包含 {reason} 的帖子' noThankYou: 不,谢谢 secureModeInfo: 当向其他服务器请求时,不要在没有验证的情况下发回。 privateMode: 私密模式 @@ -1888,8 +1891,8 @@ audio: 音频 cannotUploadBecauseExceedsFileSizeLimit: 无法上传此文件,因为它超出了允许的最大大小。 unsubscribePushNotification: 禁用推送通知 pushNotificationAlreadySubscribed: 推送通知已启用 -enableEmojiReactions: 启用 emoji 回应 -cw: 内容警告 +enableEmojiReactions: 启用表情符号回应 +cw: 敏感内容警告 hiddenTagsDescription: 列出你想隐藏的话题标签(不带#)以避免在趋势和探索中显示。隐藏的标签仍然可以通过其他方式被发现。 enableRecommendedTimeline: 启用推荐时间线 _skinTones: @@ -1906,9 +1909,9 @@ moveFromDescription: 这将为您的旧帐户设置一个别名,以便您可 的帐户标签 indexPosts: 索引帖子 signupsDisabled: 该服务器目前关闭注册,但您随时可以在另一台服务器上注册!如果您有该服务器的邀请码,请在下面输入。 -silencedWarning: 显示这个页面是因为这些用户来自你的管理员设置的静默服务器,所以他们有可能是垃圾信息。 +silencedWarning: 显示这个页面是因为这些用户来自你的管理员设置的禁言服务器,所以他们有可能是垃圾信息。 isBot: 这个账户是一个机器人 -moveAccountDescription: 这个过程是不可逆的。在移动之前,请确保您已在新帐户上为当前帐户设置了别名。请输入格式如 @person@server.com +moveAccountDescription: 这个过程是不可逆的。在迁移之前,请确保您已在新帐户上为当前帐户设置了别名。请输入格式如 @person@server.com 帐户标签 moveFromLabel: 您要移出的旧帐户: preventAiLearning: 阻止 AI 机器人抓取 @@ -1916,20 +1919,20 @@ preventAiLearningDescription: 请求第三方人工智能语言模型不要研 noGraze: 请禁用 "Graze for Mastodon" 浏览器扩展,因为它会干扰 Calckey。 moveTo: 将当前帐户移至新帐户 moveToLabel: 你要迁移到的目标帐户: -moveAccount: 移动账户! +moveAccount: 迁移账户! migrationConfirm: "你确实确定要将帐户迁移到 {account} 吗?此操作无法撤消,并且你将无法再次正常使用旧账户。\n另外,请确保你已将此当前帐户设置为要移出的帐户。" indexFromDescription: 留空以索引每个帖子 noteId: 帖子 ID moveFrom: 从旧帐户移至此帐户 -defaultReaction: 发出和收到的帖子的默认表情符号反应 +defaultReaction: 发出和收到帖子的默认表情符号反应 indexNotice: 现在开始索引。这可能需要一段时间,请至少一个小时内不要重新启动服务器。 indexFrom: 从帖子 ID 开始的索引 sendModMail: 发送审核通知 isLocked: 该帐户设置了关注请求 _filters: - notesBefore: 在之前的帖子 + notesBefore: 帖子早于 followingOnly: 仅关注中 - notesAfter: 在之后的帖子 + notesAfter: 帖子晚于 fromDomain: 来自域名 withFile: 带有文件 fromUser: 来自用户 @@ -1939,5 +1942,5 @@ isPatron: Calckey 赞助 _dialog: charactersExceeded: 超出了最大字符数!当前:{current} / 限制:{max} charactersBelow: 没有足够的字符!当前:{current} / 限制:{min} -enableIdenticonGeneration: 启用Identicon生成 +enableIdenticonGeneration: 启用 Identicon 生成 enableServerMachineStats: 启用服务器硬件统计 From e603745f970f067cc5d822b5b87ee96dd880b8b3 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator <kainoa@t1c.dev> Date: Mon, 3 Jul 2023 10:29:52 -0700 Subject: [PATCH 309/309] fix: :zap: immediately fail jobs with invalid signature --- packages/backend/src/queue/processors/inbox.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/queue/processors/inbox.ts b/packages/backend/src/queue/processors/inbox.ts index b319fbd381..09a69b25cb 100644 --- a/packages/backend/src/queue/processors/inbox.ts +++ b/packages/backend/src/queue/processors/inbox.ts @@ -35,8 +35,11 @@ export default async (job: Bull.Job<InboxJobData>): Promise<string> => { info["@context"] = undefined; logger.debug(JSON.stringify(info, null, 2)); - if (!signature?.keyId) return `Invalid signature: ${signature}`; - + if (!signature?.keyId) { + const err = `Invalid signature: ${signature}`; + job.moveToFailed({message: err}); + return err; + } //#endregion const host = toPuny(new URL(signature.keyId).hostname);