├── .gitignore ├── .editorconfig ├── tsconfig.json ├── package.json ├── wrangler.toml ├── License.txt ├── Readme.md ├── src └── index.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /dist 3 | **/*.rs.bk 4 | Cargo.lock 5 | bin/ 6 | pkg/ 7 | wasm-pack.log 8 | worker/ 9 | node_modules/ 10 | .cargo-ok 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | indent_size = 4 9 | indent_style = space 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "lib": ["esnext", "webworker"], 5 | "strict": true, 6 | "moduleResolution": "node", 7 | "skipLibCheck": true, 8 | "esModuleInterop": true, 9 | "types": [ 10 | "@cloudflare/workers-types", 11 | "@types/service-worker-mock" 12 | ], 13 | }, 14 | } 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "KonomiTV-API", 3 | "version": "1.0.0", 4 | "private": true, 5 | "module": "./dist/worker.mjs", 6 | "scripts": { 7 | "build": "node build.mjs", 8 | "dev": "miniflare --watch --debug --port 8787", 9 | "publish-worker": "cross-env NODE_ENV=production wrangler publish" 10 | }, 11 | "devDependencies": { 12 | "@cloudflare/workers-types": "^4.20221111.1", 13 | "@types/service-worker-mock": "^2.0.1", 14 | "cross-env": "^7.0.3", 15 | "esbuild": "^0.16.16", 16 | "miniflare": "^2.11.0", 17 | "typescript": "^4.9.4" 18 | }, 19 | "engines": { 20 | "node": ">=14" 21 | }, 22 | "dependencies": { 23 | "itty-router": "^3.0.11" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | 2 | # Cloudflare Workers の設定 3 | # ref: https://developers.cloudflare.com/workers/wrangler/configuration/ 4 | 5 | # Worker スクリプトの名前 6 | name = 'konomitv-api' 7 | 8 | # Worker としてアップロードされる JavaScript ファイルのパス 9 | main = 'dist/worker.mjs' 10 | 11 | # Worker の動作に互換性を持たせる日付 12 | ## この日付より前に行われた Cloudflare Workers の変更がすべて有効化される 13 | ## この日付より後に行われた Cloudflare Workers の変更は日付を更新しない限り有効化されない 14 | ## ref: https://developers.cloudflare.com/workers/platform/compatibility-dates 15 | compatibility_date = '2022-11-30' 16 | 17 | # Worker を *.workers.dev にデプロイするかどうかを指定するフラグ 18 | workers_dev = false 19 | 20 | # Worker を実行する Zone 上の、URLパターンで指定されたルート 21 | # アスタリスク (*) で複数の URL に一致する動的パターンを作成できる 22 | route = 'app.konomi.tv/api/*' 23 | 24 | # ビルドコマンド 25 | [build] 26 | command = 'yarn build' 27 | -------------------------------------------------------------------------------- /License.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2022 tsukumi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | # KonomiTV-API 3 | 4 | [KonomiTV](https://github.com/tsukumijima/KonomiTV) に関連する小さな API です。 5 | 6 | この API は [Cloudflare Workers](https://workers.cloudflare.com/) 向けに書かれています。https://app.konomi.tv/api/ で稼働中です。 7 | 8 | ## 概要 9 | 10 | [gmencz/cloudflare-workers-typescript-esbuild-esm](https://github.com/gmencz/cloudflare-workers-typescript-esbuild-esm) を参考にして開発しました。 11 | 12 | 現時点では、Twitter API / ニコニコ API のコールバック URL を、KonomiTV サーバーにクエリごと 302 リダイレクトする API を実装しています。 13 | ちょっと URL を修正してリダイレクトするだけの API のためだけにサーバーを立てたくなかったので、無料枠の大きい Cloudflare Workers を採用しました。 14 | 15 | OAuth の認証では、コールバック先の URL を、事前にサービスのデベロッパーダッシュボードなどで設定しておく必要があります。 16 | 一方、KonomiTV サーバーの URL (プライベート IP アドレス) は環境によってまちまちで、コールバックする URL を一意に決められません。 17 | 18 | > コールバック URL はほとんどのサービスで複数設定できるものの、考えられるすべての URL を指定するのは非現実的…。 19 | 20 | そこで、一旦この API にコールバック URL を集約してから、サービスからのリダイレクト結果をそれぞれの KonomiTV サーバーに振り分けることにしました。 21 | 22 | Twitter API では、クエリの "server" パラメーターで指定された、KonomiTV サーバーの URL へ振り分けます。 23 | それ以外の API では、クエリの "state" パラメーターの JSON (Base64 エンコードされている) 内の "server" プロパティで指定された、KonomiTV サーバーの URL へ振り分けます。 24 | 25 | 最後に KonomiTV サーバーがこの API からのリダイレクトを受け取ることで、コールバック対象の URL が定まらなくても、OAuth 連携ができるようになります。 26 | 27 | ## 開発 28 | 29 | ### 環境構築 30 | 31 | ```bash 32 | $ npm install -g @cloudflare/wrangler 33 | ``` 34 | 35 | 事前に [wrangler](https://github.com/cloudflare/wrangler) をインストールしてください。当然 Cloudflare アカウントも必要です。 36 | 37 | ```bash 38 | $ yarn install 39 | ``` 40 | 41 | 依存パッケージをインストールします。 42 | 43 | そのあと、wrangler.toml を編集します。 44 | 自分のアカウントやドメインで動かしたい場合は、少なくとも route, account_id, zone_id を変更する必要があります。 45 | 46 | ### ビルド 47 | 48 | ```bash 49 | $ yarn build 50 | ``` 51 | 52 | dist/worker.mjs にビルド済みの JS ファイルが出力されます。 53 | このファイルが Cloudflare Workers にデプロイされます。 54 | 55 | ### 開発サーバーの起動 56 | 57 | ```bash 58 | $ yarn dev 59 | ``` 60 | 61 | [Miniflare](https://github.com/cloudflare/miniflare) を使い、ローカル内だけで開発できるように設定しています。 62 | 開発サーバーは http://localhost:8787/api/ でリッスンされます。 63 | 64 | ### デプロイ 65 | 66 | ```bash 67 | $ yarn publish-worker 68 | ``` 69 | 70 | ビルドとデプロイが同時に行われます。 71 | デプロイした worker.mjs は、10 秒ほどで Cloudflare Workers に反映されます。 72 | 73 | > yarn だと publish が内蔵のコマンドと被ってしまうため、`-worker` の Suffix を付けざるを得ない… 74 | 75 | ## License 76 | 77 | [MIT License](License.txt) 78 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | 2 | import { Router } from 'itty-router'; 3 | 4 | 5 | // API のベースを指定してルーターを初期化 6 | // 実際にどのサブディレクトリにデプロイされるかは関係なく、URL 上のルート (example.com/) から解析されるらしい 7 | // ref: https://github.com/kwhitley/itty-router 8 | const router = Router({base: '/api'}); 9 | 10 | 11 | /** 12 | * Twitter API (OAuth 1.0a) のコールバック URL の実装 13 | * クエリの "server" パラメーターで指定された KonomiTV サーバーに、クエリごと 302 リダイレクトする API 14 | * KonomiTV サーバーの URL は環境によってまちまちでコールバック URL を一意に決められないため、一旦ここに集約した上でリダイレクトするようにした 15 | * KonomiTV サーバーは oauth_verifier さえ取れれば、OAuth 認証を続行できる 16 | */ 17 | router.get('/redirect/twitter', (request) => { 18 | 19 | // リクエストされる URL の例 20 | // https://app.konomi.tv/api/redirect/twitter?server=https://192-168-1-11.local.konomi.tv/&oauth_verifier=YOUR_OAUTH_VERIFIER 21 | // http://localhost:8787/api/redirect/twitter?server=https://192-168-1-11.local.konomi.tv/&oauth_verifier=YOUR_OAUTH_VERIFIER (開発環境) 22 | 23 | // KonomiTV サーバーの URL 24 | // https://192-168-1-11.local.konomi.tv/ のようなフォーマット 25 | const server_url = request.query?.server as string | undefined; 26 | 27 | // "server" パラメーターが設定されていない 28 | if (server_url === undefined) { 29 | return new Response(JSON.stringify({'detail': 'URL query does not have "server" parameter'}), { 30 | headers: {'content-type': 'application/json'}, 31 | status: 400, 32 | }); 33 | } 34 | 35 | // "server" パラメーターが URL ではない 36 | // ref: https://qiita.com/nagimaruxxx/items/c2f186a2df5e32233122 37 | if (server_url.match(/https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g) === null) { 38 | return new Response(JSON.stringify({'detail': '"server" parameter is not URL'}), { 39 | headers: {'content-type': 'application/json'}, 40 | status: 400, 41 | }); 42 | } 43 | 44 | // "server" パラメーター以外のクエリを再構築 45 | let redirect_url_query = ''; 46 | for (const [param_key, param_value] of Object.entries(request.query as {[key: string]: string})) { 47 | 48 | // "server" パラメーターはもう不要なので追加しない 49 | if (param_key === 'server') continue; 50 | 51 | // key=value の組を追加 52 | redirect_url_query += `${param_key}=${param_value}&`; 53 | } 54 | 55 | // リダイレクト先の URL を組み立てる 56 | // それぞれ末尾の / (URL) と & (クエリ) を除去 57 | const redirect_url = `${server_url.replace(/\/$/, '')}/api/twitter/callback?${redirect_url_query.replace(/\&$/, '')}`; 58 | console.log(`Redirect to: ${redirect_url}`); 59 | 60 | // 302 リダイレクトを行う 61 | return Response.redirect(redirect_url, 302); 62 | }); 63 | 64 | 65 | /** 66 | * ニコニコ API (OAuth 2.0) のコールバック URL の実装 67 | * クエリの "state" パラメーター内の JSON で指定された KonomiTV サーバーに、クエリごと 302 リダイレクトする API 68 | * KonomiTV サーバーの URL は環境によってまちまちでコールバック URL を一意に決められないため、一旦ここに集約した上でリダイレクトするようにした 69 | * KonomiTV サーバーは認証コードとユーザーの JWT アクセストークンさえ取れれば、OAuth 認証を続行できる 70 | */ 71 | router.get('/redirect/niconico', (request) => { 72 | 73 | // "state" パラメーターが設定されていない 74 | if (request.query?.state === undefined) { 75 | return new Response(JSON.stringify({'detail': 'URL query does not have "state" parameter'}), { 76 | headers: {'content-type': 'application/json'}, 77 | status: 400, 78 | }); 79 | } 80 | 81 | // "state" パラメーターをデコード 82 | // まず Base64 デコードし、さらに JSON デコードしてオブジェクトにする 83 | let state: {[key: string]: string}; 84 | try { 85 | state = JSON.parse(atob(request.query?.state as string)); 86 | } catch (error) { 87 | return new Response(JSON.stringify({'detail': '"state" parameter is invalid'}), { 88 | headers: {'content-type': 'application/json'}, 89 | status: 400, 90 | }); 91 | } 92 | 93 | // KonomiTV サーバーの URL 94 | // https://192-168-1-11.local.konomi.tv/ のようなフォーマット 95 | const server_url = state['server'] 96 | 97 | // "server" プロパティが URL ではない 98 | // ref: https://qiita.com/nagimaruxxx/items/c2f186a2df5e32233122 99 | if (server_url.match(/https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g) === null) { 100 | return new Response(JSON.stringify({'detail': '"server" property is not URL'}), { 101 | headers: {'content-type': 'application/json'}, 102 | status: 400, 103 | }); 104 | } 105 | 106 | // "state" パラメーター以外のクエリを再構築 107 | let redirect_url_query = ''; 108 | for (const [param_key, param_value] of Object.entries(request.query as {[key: string]: string})) { 109 | 110 | // "state" パラメーターはもう不要なので追加しない 111 | if (param_key === 'state') continue; 112 | 113 | // key=value の組を追加 114 | redirect_url_query += `${param_key}=${param_value}&`; 115 | } 116 | 117 | // "state" パラメーター内の JSON の "server" プロパティ以外のプロパティをクエリに追加 118 | for (const [param_key, param_value] of Object.entries(state)) { 119 | 120 | // "server" プロパティはもう不要なので追加しない 121 | if (param_key === 'server') continue; 122 | 123 | // key=value の組を追加 124 | redirect_url_query += `${param_key}=${param_value}&`; 125 | } 126 | 127 | // リダイレクト先の URL を組み立てる 128 | const redirect_url = `${server_url.replace(/\/$/, '')}/api/niconico/callback?${redirect_url_query}`; 129 | console.log(`Redirect to: ${redirect_url}`); 130 | 131 | // 302 リダイレクトを行う 132 | return Response.redirect(redirect_url, 302); 133 | }); 134 | 135 | 136 | /** 137 | * どのルートにも当てはまらなかったときのルート 138 | * 404 Not Found を返す 139 | */ 140 | router.get('/*', () => { 141 | return new Response(JSON.stringify({'detail': 'Not Found'}), { 142 | headers: {'content-type': 'application/json'}, 143 | status: 404, 144 | }); 145 | }); 146 | 147 | 148 | // ES Modules 構文の Worker を定義 149 | // まだ普及していないけど、とりあえず動くのでヨシ!(このあたりで散々試行錯誤した) 150 | // ref: https://developers.cloudflare.com/workers/cli-wrangler/configuration/#modules 151 | // ref: https://github.com/gmencz/cloudflare-workers-typescript-esbuild-esm 152 | export default { 153 | async fetch(request: Request, env: {[key: string]: any}, context: ExecutionContext) { 154 | 155 | // ルーターに Request を投げ、Response (あるいは undefined) を受け取る 156 | // ref: https://github.com/kwhitley/itty-router 157 | const response = await router.handle(request); 158 | 159 | // Response が返ってこなかった場合(基本的にはないが、念のため) 160 | // 422 Unprocessable Entity を返す 161 | if (response === undefined) { 162 | return new Response(JSON.stringify({'detail': 'Unprocessable Entity'}), { 163 | headers: {'content-type': 'application/json'}, 164 | status: 422, 165 | }); 166 | } 167 | 168 | // 取得した Response を返す 169 | return response; 170 | } 171 | }; 172 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cloudflare/workers-types@^4.20221111.1": 6 | version "4.20221111.1" 7 | resolved "https://registry.yarnpkg.com/@cloudflare/workers-types/-/workers-types-4.20221111.1.tgz#c3dbb5ef52cf5fab275803ece0424b205c78ad3e" 8 | integrity sha512-BNV2wN8V6Zduvo7UzxcdjBbLQ906D2KhS804PDufLgx/sanGJCHVJMOIaLvS/b61JKtot1U7P/l1fjrjZ7/E3A== 9 | 10 | "@esbuild/android-arm64@0.16.16": 11 | version "0.16.16" 12 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.16.tgz#833184b8a0a96f9c85105c53d0a67e6d3c5c3f07" 13 | integrity sha512-hFHVAzUKp9Tf8psGq+bDVv+6hTy1bAOoV/jJMUWwhUnIHsh6WbFMhw0ZTkqDuh7TdpffFoHOiIOIxmHc7oYRBQ== 14 | 15 | "@esbuild/android-arm@0.16.16": 16 | version "0.16.16" 17 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.16.tgz#23761b2fd1dfa4806161dbfc9e0824f04061cb95" 18 | integrity sha512-BUuWMlt4WSXod1HSl7aGK8fJOsi+Tab/M0IDK1V1/GstzoOpqc/v3DqmN8MkuapPKQ9Br1WtLAN4uEgWR8x64A== 19 | 20 | "@esbuild/android-x64@0.16.16": 21 | version "0.16.16" 22 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.16.tgz#ffa09f04c0ffea5b594ab7655fc9ca1220365e9b" 23 | integrity sha512-9WhxJpeb6XumlfivldxqmkJepEcELekmSw3NkGrs+Edq6sS5KRxtUBQuKYDD7KqP59dDkxVbaoPIQFKWQG0KLg== 24 | 25 | "@esbuild/darwin-arm64@0.16.16": 26 | version "0.16.16" 27 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.16.tgz#62ed2b4bfab594b9e5e708580361f1d059b53b26" 28 | integrity sha512-8Z+wld+vr/prHPi2O0X7o1zQOfMbXWGAw9hT0jEyU/l/Yrg+0Z3FO9pjPho72dVkZs4ewZk0bDOFLdZHm8jEfw== 29 | 30 | "@esbuild/darwin-x64@0.16.16": 31 | version "0.16.16" 32 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.16.tgz#e9756d34cd9b3737a5354e89ca0fdca32d8df64c" 33 | integrity sha512-CYkxVvkZzGCqFrt7EgjFxQKhlUPyDkuR9P0Y5wEcmJqVI8ncerOIY5Kej52MhZyzOBXkYrJgZeVZC9xXXoEg9A== 34 | 35 | "@esbuild/freebsd-arm64@0.16.16": 36 | version "0.16.16" 37 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.16.tgz#db7bce444d372e5a213a3f359c42aee3acc0dd45" 38 | integrity sha512-fxrw4BYqQ39z/3Ja9xj/a1gMsVq0xEjhSyI4a9MjfvDDD8fUV8IYliac96i7tzZc3+VytyXX+XNsnpEk5sw5Wg== 39 | 40 | "@esbuild/freebsd-x64@0.16.16": 41 | version "0.16.16" 42 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.16.tgz#02e8a81b7e56040b5eb883896de445a6cd3501f0" 43 | integrity sha512-8p3v1D+du2jiDvSoNVimHhj7leSfST9YlKsAEO7etBfuqjaBMndo0fmjNLp0JCMld+XIx9L80tooOkyUv1a1PQ== 44 | 45 | "@esbuild/linux-arm64@0.16.16": 46 | version "0.16.16" 47 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.16.tgz#ea8c3df172644fa6437f0083c2a38b50f89e5b98" 48 | integrity sha512-N3u6BBbCVY3xeP2D8Db7QY8I+nZ+2AgOopUIqk+5yCoLnsWkcVxD2ay5E9iIdvApFi1Vg1lZiiwaVp8bOpAc4A== 49 | 50 | "@esbuild/linux-arm@0.16.16": 51 | version "0.16.16" 52 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.16.tgz#c1c2e97e67bb7247e6f60e2644de057bfedb8cbb" 53 | integrity sha512-bYaocE1/PTMRmkgSckZ0D0Xn2nox8v2qlk+MVVqm+VECNKDdZvghVZtH41dNtBbwADSvA6qkCHGYeWm9LrNCBw== 54 | 55 | "@esbuild/linux-ia32@0.16.16": 56 | version "0.16.16" 57 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.16.tgz#9a0b0e926926f891a3e7f7c50bb38e3db49c2c9a" 58 | integrity sha512-dxjqLKUW8GqGemoRT9v8IgHk+T4tRm1rn1gUcArsp26W9EkK/27VSjBVUXhEG5NInHZ92JaQ3SSMdTwv/r9a2A== 59 | 60 | "@esbuild/linux-loong64@0.16.16": 61 | version "0.16.16" 62 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.16.tgz#c5a50ff5981d457ed45f42c3f06a60086759c79b" 63 | integrity sha512-MdUFggHjRiCCwNE9+1AibewoNq6wf94GLB9Q9aXwl+a75UlRmbRK3h6WJyrSGA6ZstDJgaD2wiTSP7tQNUYxwA== 64 | 65 | "@esbuild/linux-mips64el@0.16.16": 66 | version "0.16.16" 67 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.16.tgz#e85b7e3c25000be2ae373e5208e55e282a9763e0" 68 | integrity sha512-CO3YmO7jYMlGqGoeFeKzdwx/bx8Vtq/SZaMAi+ZLDUnDUdfC7GmGwXzIwDJ70Sg+P9pAemjJyJ1icKJ9R3q/Fg== 69 | 70 | "@esbuild/linux-ppc64@0.16.16": 71 | version "0.16.16" 72 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.16.tgz#24a0013bf727830df44fece571172ebe31b5c5e6" 73 | integrity sha512-DSl5Czh5hCy/7azX0Wl9IdzPHX2H8clC6G87tBnZnzUpNgRxPFhfmArbaHoAysu4JfqCqbB/33u/GL9dUgCBAw== 74 | 75 | "@esbuild/linux-riscv64@0.16.16": 76 | version "0.16.16" 77 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.16.tgz#b080998d8d0480e8235f1384c585ae505e98a19d" 78 | integrity sha512-sSVVMEXsqf1fQu0j7kkhXMViroixU5XoaJXl1u/u+jbXvvhhCt9YvA/B6VM3aM/77HuRQ94neS5bcisijGnKFQ== 79 | 80 | "@esbuild/linux-s390x@0.16.16": 81 | version "0.16.16" 82 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.16.tgz#5042de05b9b653dfd134f05e1b37b61704c14c42" 83 | integrity sha512-jRqBCre9gZGoCdCN/UWCCMwCMsOg65IpY9Pyj56mKCF5zXy9d60kkNRdDN6YXGjr3rzcC4DXnS/kQVCGcC4yPQ== 84 | 85 | "@esbuild/linux-x64@0.16.16": 86 | version "0.16.16" 87 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.16.tgz#b7c0750f2276c9dcf41f0f2229adca46ef22f698" 88 | integrity sha512-G1+09TopOzo59/55lk5Q0UokghYLyHTKKzD5lXsAOOlGDbieGEFJpJBr3BLDbf7cz89KX04sBeExAR/pL/26sA== 89 | 90 | "@esbuild/netbsd-x64@0.16.16": 91 | version "0.16.16" 92 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.16.tgz#e2a0ee181fbbe834174d26e24ce1b258232bb3eb" 93 | integrity sha512-xwjGJB5wwDEujLaJIrSMRqWkbigALpBNcsF9SqszoNKc+wY4kPTdKrSxiY5ik3IatojePP+WV108MvF6q6np4w== 94 | 95 | "@esbuild/openbsd-x64@0.16.16": 96 | version "0.16.16" 97 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.16.tgz#87a84c1932e00f52ab3380c31facf0e48086ffb9" 98 | integrity sha512-yeERkoxG2nR2oxO5n+Ms7MsCeNk23zrby2GXCqnfCpPp7KNc0vxaaacIxb21wPMfXXRhGBrNP4YLIupUBrWdlg== 99 | 100 | "@esbuild/sunos-x64@0.16.16": 101 | version "0.16.16" 102 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.16.tgz#996bcd2603cd345733c3aa5f52bfd5b8fa7d1d36" 103 | integrity sha512-nHfbEym0IObXPhtX6Va3H5GaKBty2kdhlAhKmyCj9u255ktAj0b1YACUs9j5H88NRn9cJCthD1Ik/k9wn8YKVg== 104 | 105 | "@esbuild/win32-arm64@0.16.16": 106 | version "0.16.16" 107 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.16.tgz#404a9411d12533d0f2ce0a85df6ddb32e851ef04" 108 | integrity sha512-pdD+M1ZOFy4hE15ZyPX09fd5g4DqbbL1wXGY90YmleVS6Y5YlraW4BvHjim/X/4yuCpTsAFvsT4Nca2lbyDH/A== 109 | 110 | "@esbuild/win32-ia32@0.16.16": 111 | version "0.16.16" 112 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.16.tgz#bb5655a48f5f87fee870061883411f5149bc5e44" 113 | integrity sha512-IPEMfU9p0c3Vb8PqxaPX6BM9rYwlTZGYOf9u+kMdhoILZkVKEjq6PKZO0lB+isojWwAnAqh4ZxshD96njTXajg== 114 | 115 | "@esbuild/win32-x64@0.16.16": 116 | version "0.16.16" 117 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.16.tgz#ee22fed0b2e0c00ce895cdfae9d32ef069a12e04" 118 | integrity sha512-1YYpoJ39WV/2bnShPwgdzJklc+XS0bysN6Tpnt1cWPdeoKOG4RMEY1g7i534QxXX/rPvNx/NLJQTTCeORYzipg== 119 | 120 | "@iarna/toml@^2.2.5": 121 | version "2.2.5" 122 | resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" 123 | integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== 124 | 125 | "@miniflare/cache@2.11.0": 126 | version "2.11.0" 127 | resolved "https://registry.yarnpkg.com/@miniflare/cache/-/cache-2.11.0.tgz#e13f4a860ebe01fc67f0169e76be93350c29d7ff" 128 | integrity sha512-L/kc9AzidPwFuk2fwHpAEePi0kNBk6FWUq3ln+9beRCDrPEpfVrDRFpNleF1NFZz5//oeVMuo8F0IVUQGzR7+Q== 129 | dependencies: 130 | "@miniflare/core" "2.11.0" 131 | "@miniflare/shared" "2.11.0" 132 | http-cache-semantics "^4.1.0" 133 | undici "5.9.1" 134 | 135 | "@miniflare/cli-parser@2.11.0": 136 | version "2.11.0" 137 | resolved "https://registry.yarnpkg.com/@miniflare/cli-parser/-/cli-parser-2.11.0.tgz#47f517731791c9e652e9849d590fde3235737529" 138 | integrity sha512-JUmyRzEGAS6CouvXJwBh8p44onfw3KRpfq5JGXEuHModOGjTp6li7PQyCTNPV2Hv/7StAXWnTFGXeAqyDHuTig== 139 | dependencies: 140 | "@miniflare/shared" "2.11.0" 141 | kleur "^4.1.4" 142 | 143 | "@miniflare/core@2.11.0": 144 | version "2.11.0" 145 | resolved "https://registry.yarnpkg.com/@miniflare/core/-/core-2.11.0.tgz#68efb7c9bab0d56bdf284b704089b035cd0b1a28" 146 | integrity sha512-UFMFiCG0co36VpZkgFrSBnrxo71uf1x+cjlzzJi3khmMyDlnLu4RuIQsAqvKbYom6fi3G9Q8lTgM7JuOXFyjhw== 147 | dependencies: 148 | "@iarna/toml" "^2.2.5" 149 | "@miniflare/queues" "2.11.0" 150 | "@miniflare/shared" "2.11.0" 151 | "@miniflare/watcher" "2.11.0" 152 | busboy "^1.6.0" 153 | dotenv "^10.0.0" 154 | kleur "^4.1.4" 155 | set-cookie-parser "^2.4.8" 156 | undici "5.9.1" 157 | urlpattern-polyfill "^4.0.3" 158 | 159 | "@miniflare/d1@2.11.0": 160 | version "2.11.0" 161 | resolved "https://registry.yarnpkg.com/@miniflare/d1/-/d1-2.11.0.tgz#1c340abe1c50cce27432b100d78b345b45e60b10" 162 | integrity sha512-aDdBVQZ2C0Zs3+Y9ZbRctmuQxozPfpumwJ/6NG6fBadANvune/hW7ddEoxyteIEU9W3IgzVj8s4by4VvasX90A== 163 | dependencies: 164 | "@miniflare/core" "2.11.0" 165 | "@miniflare/shared" "2.11.0" 166 | 167 | "@miniflare/durable-objects@2.11.0": 168 | version "2.11.0" 169 | resolved "https://registry.yarnpkg.com/@miniflare/durable-objects/-/durable-objects-2.11.0.tgz#4c53c27a939e022a1de47ee338cec395cbb9e24d" 170 | integrity sha512-0cKJaMgraTEU1b4kqK8cjD2oTeOjA6QU3Y+lWiZT/k1PMHZULovrSFnjii7qZ8npf4VHSIN6XYPxhyxRyEM65Q== 171 | dependencies: 172 | "@miniflare/core" "2.11.0" 173 | "@miniflare/shared" "2.11.0" 174 | "@miniflare/storage-memory" "2.11.0" 175 | undici "5.9.1" 176 | 177 | "@miniflare/html-rewriter@2.11.0": 178 | version "2.11.0" 179 | resolved "https://registry.yarnpkg.com/@miniflare/html-rewriter/-/html-rewriter-2.11.0.tgz#5e5e1292876feca3002b3a729dd8f892f7ef0d0c" 180 | integrity sha512-olTqmuYTHnoTNtiA0vjQ/ixRfbwgPzDrAUbtXDCYW45VFbHfDVJrJGZX3Jg0HpSlxy86Zclle1SUxGbVDzxsBg== 181 | dependencies: 182 | "@miniflare/core" "2.11.0" 183 | "@miniflare/shared" "2.11.0" 184 | html-rewriter-wasm "^0.4.1" 185 | undici "5.9.1" 186 | 187 | "@miniflare/http-server@2.11.0": 188 | version "2.11.0" 189 | resolved "https://registry.yarnpkg.com/@miniflare/http-server/-/http-server-2.11.0.tgz#76d2e2c6549528d965e5f48a8ddc3448c28d4569" 190 | integrity sha512-sMLcrDFzqqAvnQmAUH0hRTo8sBjW79VZYfnIH5FAGSGcKX6kdAGs9RStdYZ4CftQCBAEQScX0KBsMx5FwJRe9Q== 191 | dependencies: 192 | "@miniflare/core" "2.11.0" 193 | "@miniflare/shared" "2.11.0" 194 | "@miniflare/web-sockets" "2.11.0" 195 | kleur "^4.1.4" 196 | selfsigned "^2.0.0" 197 | undici "5.9.1" 198 | ws "^8.2.2" 199 | youch "^2.2.2" 200 | 201 | "@miniflare/kv@2.11.0": 202 | version "2.11.0" 203 | resolved "https://registry.yarnpkg.com/@miniflare/kv/-/kv-2.11.0.tgz#af162567e2d49ae533be60bca29eaf9486408a68" 204 | integrity sha512-3m9dL2HBBN170V1JvwjjucR5zl4G3mlcsV6C1E7A2wLl2Z2TWvIx/tSY9hrhkD96dFnejwJ9qmPMbXMMuynhjg== 205 | dependencies: 206 | "@miniflare/shared" "2.11.0" 207 | 208 | "@miniflare/queues@2.11.0": 209 | version "2.11.0" 210 | resolved "https://registry.yarnpkg.com/@miniflare/queues/-/queues-2.11.0.tgz#feb48d1934b4f98d9bc605d0967140f8e70cc5be" 211 | integrity sha512-fLHjdrNLKhn0LZM/aii/9GsAttFd+lWlGzK8HOg1R0vhfKBwEub4zntjMmOfFbDm1ntc21tdMK7n3ldUphwh5w== 212 | dependencies: 213 | "@miniflare/shared" "2.11.0" 214 | 215 | "@miniflare/r2@2.11.0": 216 | version "2.11.0" 217 | resolved "https://registry.yarnpkg.com/@miniflare/r2/-/r2-2.11.0.tgz#52f19d22b63b4d5e72d2b96ee514333a810dce7a" 218 | integrity sha512-MKuyJ/gGNsK3eWbGdygvozqcyaZhM3C6NGHvoaZwH503dwN569j5DpatTWiHGFeDeSu64VqcIsGehz05GDUaag== 219 | dependencies: 220 | "@miniflare/shared" "2.11.0" 221 | undici "5.9.1" 222 | 223 | "@miniflare/runner-vm@2.11.0": 224 | version "2.11.0" 225 | resolved "https://registry.yarnpkg.com/@miniflare/runner-vm/-/runner-vm-2.11.0.tgz#801c16ddbd360c3c8fcca84c43faaecfd2d4ef70" 226 | integrity sha512-bkVSuvCf5+VylqN8lTiLxIYqYcKFbl+BywZGwGQndPC/3wh42J00mM0jw4hRbvXgwuBhlUyCVpEXtYlftFFT/g== 227 | dependencies: 228 | "@miniflare/shared" "2.11.0" 229 | 230 | "@miniflare/scheduler@2.11.0": 231 | version "2.11.0" 232 | resolved "https://registry.yarnpkg.com/@miniflare/scheduler/-/scheduler-2.11.0.tgz#2568d44f571e73355369be6a6da4481aa4af25c8" 233 | integrity sha512-DPdzINhdWeS99eIicGoluMsD4pLTTAWNQbgCv3CTwgdKA3dxdvMSCkNqZzQLiALzvk9+rSfj46FlH++HE7o7/w== 234 | dependencies: 235 | "@miniflare/core" "2.11.0" 236 | "@miniflare/shared" "2.11.0" 237 | cron-schedule "^3.0.4" 238 | 239 | "@miniflare/shared@2.11.0": 240 | version "2.11.0" 241 | resolved "https://registry.yarnpkg.com/@miniflare/shared/-/shared-2.11.0.tgz#12905f4b4310bdcc28169667d024ca6fab35a035" 242 | integrity sha512-fWMqq3ZkWAg+k7CnyzMV/rZHugwn+/JxvVzCxrtvxzwotTN547THlOxgZe8JAP23U9BiTxOfpTfnLvFEjAmegw== 243 | dependencies: 244 | "@types/better-sqlite3" "^7.6.0" 245 | kleur "^4.1.4" 246 | npx-import "^1.1.3" 247 | picomatch "^2.3.1" 248 | 249 | "@miniflare/sites@2.11.0": 250 | version "2.11.0" 251 | resolved "https://registry.yarnpkg.com/@miniflare/sites/-/sites-2.11.0.tgz#f7849ed6cc13fd3a96a329b815828ed5e4f22df3" 252 | integrity sha512-qbefKdWZUJgsdLf+kCw03sn3h/92LZgJAbkOpP6bCrfWkXlJ37EQXO4KWdhn4Ghc7A6GwU1s1I/mdB64B3AewQ== 253 | dependencies: 254 | "@miniflare/kv" "2.11.0" 255 | "@miniflare/shared" "2.11.0" 256 | "@miniflare/storage-file" "2.11.0" 257 | 258 | "@miniflare/storage-file@2.11.0": 259 | version "2.11.0" 260 | resolved "https://registry.yarnpkg.com/@miniflare/storage-file/-/storage-file-2.11.0.tgz#eaa30899d6a369f9a0dca32859ff1b36db1f0bac" 261 | integrity sha512-beWF/lTX74x7AiaSB+xQxywPSNdhtEKvqDkRui8eOJ5kqN2o4UaleLKQGgqmCw3WyHRIsckV7If1qpbNiLtWMw== 262 | dependencies: 263 | "@miniflare/shared" "2.11.0" 264 | "@miniflare/storage-memory" "2.11.0" 265 | 266 | "@miniflare/storage-memory@2.11.0": 267 | version "2.11.0" 268 | resolved "https://registry.yarnpkg.com/@miniflare/storage-memory/-/storage-memory-2.11.0.tgz#24b6ba299435a96dbe8929308c49cdd2346d2d25" 269 | integrity sha512-s0AhPww7fq/Jz80NbPb+ffhcVRKnfPi7H1dHTRTre2Ud23EVJjAWl2gat42x8NOT/Fu3/o/7A72DWQQJqfO98A== 270 | dependencies: 271 | "@miniflare/shared" "2.11.0" 272 | 273 | "@miniflare/watcher@2.11.0": 274 | version "2.11.0" 275 | resolved "https://registry.yarnpkg.com/@miniflare/watcher/-/watcher-2.11.0.tgz#4cfe96ed8131118de31287d7b2690758925f4505" 276 | integrity sha512-RUfjz2iYcsQXLcGySemJl98CJ2iierbWsPGWZhIVZI+NNhROkEy77g/Q+lvP2ATwexG3/dUSfdJ3P8aH+sI4Ig== 277 | dependencies: 278 | "@miniflare/shared" "2.11.0" 279 | 280 | "@miniflare/web-sockets@2.11.0": 281 | version "2.11.0" 282 | resolved "https://registry.yarnpkg.com/@miniflare/web-sockets/-/web-sockets-2.11.0.tgz#1d4ef353c618a971c882efcc33ed37df9fa01af1" 283 | integrity sha512-NC8RKrmxrO0hZmwpzn5g4hPGA2VblnFTIBobmWoxuK95eW49zfs7dtE/PyFs+blsGv3CjTIjHVSQ782K+C6HFA== 284 | dependencies: 285 | "@miniflare/core" "2.11.0" 286 | "@miniflare/shared" "2.11.0" 287 | undici "5.9.1" 288 | ws "^8.2.2" 289 | 290 | "@types/better-sqlite3@^7.6.0": 291 | version "7.6.3" 292 | resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.3.tgz#117c3c182e300799b84d1b7e1781c27d8d536505" 293 | integrity sha512-YS64N9SNDT/NAvou3QNdzAu3E2om/W/0dhORimtPGLef+zSK5l1vDzfsWb4xgXOgfhtOI5ZDTRxnvRPb22AIVQ== 294 | dependencies: 295 | "@types/node" "*" 296 | 297 | "@types/node@*": 298 | version "18.11.18" 299 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" 300 | integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== 301 | 302 | "@types/service-worker-mock@^2.0.1": 303 | version "2.0.1" 304 | resolved "https://registry.yarnpkg.com/@types/service-worker-mock/-/service-worker-mock-2.0.1.tgz#4857b2024318c395294a02eda5050ac083f41e56" 305 | integrity sha512-LqaP0QmgppRF7YEaqx4amoazHNXaX5bIFDAu62LnWIc5ku0HbgqlPKroQstAu8WsdmWIqEfI9VGlP8Skkq+m5A== 306 | 307 | "@types/stack-trace@0.0.29": 308 | version "0.0.29" 309 | resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d" 310 | integrity sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g== 311 | 312 | buffer-from@^1.0.0: 313 | version "1.1.2" 314 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 315 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 316 | 317 | builtins@^5.0.0: 318 | version "5.0.1" 319 | resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" 320 | integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== 321 | dependencies: 322 | semver "^7.0.0" 323 | 324 | busboy@^1.6.0: 325 | version "1.6.0" 326 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" 327 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 328 | dependencies: 329 | streamsearch "^1.1.0" 330 | 331 | cookie@^0.4.1: 332 | version "0.4.2" 333 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" 334 | integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== 335 | 336 | cron-schedule@^3.0.4: 337 | version "3.0.6" 338 | resolved "https://registry.yarnpkg.com/cron-schedule/-/cron-schedule-3.0.6.tgz#7d0a3ad9154112fc3720fe43238a43d50e8465e7" 339 | integrity sha512-izfGgKyzzIyLaeb1EtZ3KbglkS6AKp9cv7LxmiyoOu+fXfol1tQDC0Cof0enVZGNtudTHW+3lfuW9ZkLQss4Wg== 340 | 341 | cross-env@^7.0.3: 342 | version "7.0.3" 343 | resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" 344 | integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== 345 | dependencies: 346 | cross-spawn "^7.0.1" 347 | 348 | cross-spawn@^7.0.1, cross-spawn@^7.0.3: 349 | version "7.0.3" 350 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 351 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 352 | dependencies: 353 | path-key "^3.1.0" 354 | shebang-command "^2.0.0" 355 | which "^2.0.1" 356 | 357 | dotenv@^10.0.0: 358 | version "10.0.0" 359 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" 360 | integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== 361 | 362 | esbuild@^0.16.16: 363 | version "0.16.16" 364 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.16.tgz#e8a27820a30cc1449066f9bbe8916b145dbc9046" 365 | integrity sha512-24JyKq10KXM5EBIgPotYIJ2fInNWVVqflv3gicIyQqfmUqi4HvDW1VR790cBgLJHCl96Syy7lhoz7tLFcmuRmg== 366 | optionalDependencies: 367 | "@esbuild/android-arm" "0.16.16" 368 | "@esbuild/android-arm64" "0.16.16" 369 | "@esbuild/android-x64" "0.16.16" 370 | "@esbuild/darwin-arm64" "0.16.16" 371 | "@esbuild/darwin-x64" "0.16.16" 372 | "@esbuild/freebsd-arm64" "0.16.16" 373 | "@esbuild/freebsd-x64" "0.16.16" 374 | "@esbuild/linux-arm" "0.16.16" 375 | "@esbuild/linux-arm64" "0.16.16" 376 | "@esbuild/linux-ia32" "0.16.16" 377 | "@esbuild/linux-loong64" "0.16.16" 378 | "@esbuild/linux-mips64el" "0.16.16" 379 | "@esbuild/linux-ppc64" "0.16.16" 380 | "@esbuild/linux-riscv64" "0.16.16" 381 | "@esbuild/linux-s390x" "0.16.16" 382 | "@esbuild/linux-x64" "0.16.16" 383 | "@esbuild/netbsd-x64" "0.16.16" 384 | "@esbuild/openbsd-x64" "0.16.16" 385 | "@esbuild/sunos-x64" "0.16.16" 386 | "@esbuild/win32-arm64" "0.16.16" 387 | "@esbuild/win32-ia32" "0.16.16" 388 | "@esbuild/win32-x64" "0.16.16" 389 | 390 | execa@^6.1.0: 391 | version "6.1.0" 392 | resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" 393 | integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== 394 | dependencies: 395 | cross-spawn "^7.0.3" 396 | get-stream "^6.0.1" 397 | human-signals "^3.0.1" 398 | is-stream "^3.0.0" 399 | merge-stream "^2.0.0" 400 | npm-run-path "^5.1.0" 401 | onetime "^6.0.0" 402 | signal-exit "^3.0.7" 403 | strip-final-newline "^3.0.0" 404 | 405 | get-stream@^6.0.1: 406 | version "6.0.1" 407 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 408 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 409 | 410 | html-rewriter-wasm@^0.4.1: 411 | version "0.4.1" 412 | resolved "https://registry.yarnpkg.com/html-rewriter-wasm/-/html-rewriter-wasm-0.4.1.tgz#235e3d96c1aa4bfd2182661ee13881e290ff5ff2" 413 | integrity sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q== 414 | 415 | http-cache-semantics@^4.1.0: 416 | version "4.1.0" 417 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 418 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 419 | 420 | human-signals@^3.0.1: 421 | version "3.0.1" 422 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" 423 | integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== 424 | 425 | is-stream@^3.0.0: 426 | version "3.0.0" 427 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" 428 | integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== 429 | 430 | isexe@^2.0.0: 431 | version "2.0.0" 432 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 433 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 434 | 435 | itty-router@^3.0.11: 436 | version "3.0.11" 437 | resolved "https://registry.yarnpkg.com/itty-router/-/itty-router-3.0.11.tgz#256c2ef0a12721a839656f49db640d40ed2fb308" 438 | integrity sha512-vWsoHBi2CmU15YzyUeHjRfjdySL2jqZQKA9jP1LXkBcLJAo0KQNVlQMvhtzG0mzABhVYifeBF97UkrrpuTCWYQ== 439 | 440 | kleur@^4.1.4: 441 | version "4.1.4" 442 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" 443 | integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== 444 | 445 | lru-cache@^6.0.0: 446 | version "6.0.0" 447 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 448 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 449 | dependencies: 450 | yallist "^4.0.0" 451 | 452 | merge-stream@^2.0.0: 453 | version "2.0.0" 454 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 455 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 456 | 457 | mimic-fn@^4.0.0: 458 | version "4.0.0" 459 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" 460 | integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== 461 | 462 | miniflare@^2.11.0: 463 | version "2.11.0" 464 | resolved "https://registry.yarnpkg.com/miniflare/-/miniflare-2.11.0.tgz#36c575e1e75451c416f136d188b744896becc352" 465 | integrity sha512-QA18I1VQXdCo4nBtPJUcUDxW8c9xbc5ex5F61jwhkGVOISSnYdEheolESmjr8MYk28xwi0XD1ozS4rLaTONd+w== 466 | dependencies: 467 | "@miniflare/cache" "2.11.0" 468 | "@miniflare/cli-parser" "2.11.0" 469 | "@miniflare/core" "2.11.0" 470 | "@miniflare/d1" "2.11.0" 471 | "@miniflare/durable-objects" "2.11.0" 472 | "@miniflare/html-rewriter" "2.11.0" 473 | "@miniflare/http-server" "2.11.0" 474 | "@miniflare/kv" "2.11.0" 475 | "@miniflare/queues" "2.11.0" 476 | "@miniflare/r2" "2.11.0" 477 | "@miniflare/runner-vm" "2.11.0" 478 | "@miniflare/scheduler" "2.11.0" 479 | "@miniflare/shared" "2.11.0" 480 | "@miniflare/sites" "2.11.0" 481 | "@miniflare/storage-file" "2.11.0" 482 | "@miniflare/storage-memory" "2.11.0" 483 | "@miniflare/web-sockets" "2.11.0" 484 | kleur "^4.1.4" 485 | semiver "^1.1.0" 486 | source-map-support "^0.5.20" 487 | undici "5.9.1" 488 | 489 | mustache@^4.2.0: 490 | version "4.2.0" 491 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" 492 | integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== 493 | 494 | node-forge@^1: 495 | version "1.3.1" 496 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" 497 | integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== 498 | 499 | npm-run-path@^5.1.0: 500 | version "5.1.0" 501 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" 502 | integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== 503 | dependencies: 504 | path-key "^4.0.0" 505 | 506 | npx-import@^1.1.3: 507 | version "1.1.4" 508 | resolved "https://registry.yarnpkg.com/npx-import/-/npx-import-1.1.4.tgz#0ee9a27484c633255528f7ec2e4c2adeaa1fcda3" 509 | integrity sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA== 510 | dependencies: 511 | execa "^6.1.0" 512 | parse-package-name "^1.0.0" 513 | semver "^7.3.7" 514 | validate-npm-package-name "^4.0.0" 515 | 516 | onetime@^6.0.0: 517 | version "6.0.0" 518 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" 519 | integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== 520 | dependencies: 521 | mimic-fn "^4.0.0" 522 | 523 | parse-package-name@^1.0.0: 524 | version "1.0.0" 525 | resolved "https://registry.yarnpkg.com/parse-package-name/-/parse-package-name-1.0.0.tgz#1a108757e4ffc6889d5e78bcc4932a97c097a5a7" 526 | integrity sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg== 527 | 528 | path-key@^3.1.0: 529 | version "3.1.1" 530 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 531 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 532 | 533 | path-key@^4.0.0: 534 | version "4.0.0" 535 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" 536 | integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== 537 | 538 | picomatch@^2.3.1: 539 | version "2.3.1" 540 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 541 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 542 | 543 | selfsigned@^2.0.0: 544 | version "2.1.1" 545 | resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" 546 | integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== 547 | dependencies: 548 | node-forge "^1" 549 | 550 | semiver@^1.1.0: 551 | version "1.1.0" 552 | resolved "https://registry.yarnpkg.com/semiver/-/semiver-1.1.0.tgz#9c97fb02c21c7ce4fcf1b73e2c7a24324bdddd5f" 553 | integrity sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg== 554 | 555 | semver@^7.0.0, semver@^7.3.7: 556 | version "7.3.8" 557 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" 558 | integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== 559 | dependencies: 560 | lru-cache "^6.0.0" 561 | 562 | set-cookie-parser@^2.4.8: 563 | version "2.5.1" 564 | resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" 565 | integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== 566 | 567 | shebang-command@^2.0.0: 568 | version "2.0.0" 569 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 570 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 571 | dependencies: 572 | shebang-regex "^3.0.0" 573 | 574 | shebang-regex@^3.0.0: 575 | version "3.0.0" 576 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 577 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 578 | 579 | signal-exit@^3.0.7: 580 | version "3.0.7" 581 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 582 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 583 | 584 | source-map-support@^0.5.20: 585 | version "0.5.21" 586 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 587 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 588 | dependencies: 589 | buffer-from "^1.0.0" 590 | source-map "^0.6.0" 591 | 592 | source-map@^0.6.0: 593 | version "0.6.1" 594 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 595 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 596 | 597 | stack-trace@0.0.10: 598 | version "0.0.10" 599 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 600 | integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= 601 | 602 | streamsearch@^1.1.0: 603 | version "1.1.0" 604 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" 605 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 606 | 607 | strip-final-newline@^3.0.0: 608 | version "3.0.0" 609 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" 610 | integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== 611 | 612 | typescript@^4.9.4: 613 | version "4.9.4" 614 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" 615 | integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== 616 | 617 | undici@5.9.1: 618 | version "5.9.1" 619 | resolved "https://registry.yarnpkg.com/undici/-/undici-5.9.1.tgz#fc9fd85dd488f965f153314a63d9426a11f3360b" 620 | integrity sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg== 621 | 622 | urlpattern-polyfill@^4.0.3: 623 | version "4.0.3" 624 | resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-4.0.3.tgz#c1fa7a73eb4e6c6a1ffb41b24cf31974f7392d3b" 625 | integrity sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ== 626 | 627 | validate-npm-package-name@^4.0.0: 628 | version "4.0.0" 629 | resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" 630 | integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== 631 | dependencies: 632 | builtins "^5.0.0" 633 | 634 | which@^2.0.1: 635 | version "2.0.2" 636 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 637 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 638 | dependencies: 639 | isexe "^2.0.0" 640 | 641 | ws@^8.2.2: 642 | version "8.12.0" 643 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" 644 | integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== 645 | 646 | yallist@^4.0.0: 647 | version "4.0.0" 648 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 649 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 650 | 651 | youch@^2.2.2: 652 | version "2.2.2" 653 | resolved "https://registry.yarnpkg.com/youch/-/youch-2.2.2.tgz#cb87a359a5c524ebd35eb07ca3a1521dbc7e1a3e" 654 | integrity sha512-/FaCeG3GkuJwaMR34GHVg0l8jCbafZLHiFowSjqLlqhC6OMyf2tPJBu8UirF7/NI9X/R5ai4QfEKUCOxMAGxZQ== 655 | dependencies: 656 | "@types/stack-trace" "0.0.29" 657 | cookie "^0.4.1" 658 | mustache "^4.2.0" 659 | stack-trace "0.0.10" 660 | --------------------------------------------------------------------------------