├── .editorconfig ├── .gitignore ├── .vpc └── dev.js ├── README.md ├── api.postman_collection.json ├── package.json ├── pnpm-lock.yaml ├── src ├── routes │ ├── auth │ │ ├── authorize.ts │ │ ├── login.ts │ │ └── profile.ts │ ├── hack │ │ ├── adjustvote.ts │ │ └── votes.ts │ ├── repl │ │ ├── create.ts │ │ ├── delete.ts │ │ ├── get.ts │ │ ├── index.ts │ │ ├── list.ts │ │ ├── patch.ts │ │ ├── transfer.ts │ │ └── update.ts │ ├── solidex │ │ ├── links.ts │ │ ├── list.ts │ │ ├── submit.ts │ │ └── types.ts │ └── status.ts ├── util │ ├── metadata.ts │ ├── token.ts │ └── util.ts └── worker.ts ├── tsconfig.json ├── types.d.ts └── wrangler.toml /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | end_of_line = lf 4 | indent_style = space 5 | indent_size = 2 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | max_line_length = 80 9 | 10 | [*.md] 11 | max_line_length=off 12 | trim_trailing_whitespace = true 13 | insert_final_newline = true 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/macos,node 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos,node 3 | 4 | ### macOS ### 5 | # General 6 | .DS_Store 7 | .AppleDouble 8 | .LSOverride 9 | 10 | # Icon must end with two \r 11 | Icon 12 | 13 | 14 | # Thumbnails 15 | ._* 16 | 17 | # Files that might appear in the root of a volume 18 | .DocumentRevisions-V100 19 | .fseventsd 20 | .Spotlight-V100 21 | .TemporaryItems 22 | .Trashes 23 | .VolumeIcon.icns 24 | .com.apple.timemachine.donotpresent 25 | 26 | # Directories potentially created on remote AFP share 27 | .AppleDB 28 | .AppleDesktop 29 | Network Trash Folder 30 | Temporary Items 31 | .apdisk 32 | 33 | ### macOS Patch ### 34 | # iCloud generated files 35 | *.icloud 36 | 37 | ### Node ### 38 | # Logs 39 | logs 40 | *.log 41 | npm-debug.log* 42 | yarn-debug.log* 43 | yarn-error.log* 44 | lerna-debug.log* 45 | .pnpm-debug.log* 46 | 47 | # Diagnostic reports (https://nodejs.org/api/report.html) 48 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 49 | 50 | # Runtime data 51 | pids 52 | *.pid 53 | *.seed 54 | *.pid.lock 55 | 56 | # Directory for instrumented libs generated by jscoverage/JSCover 57 | lib-cov 58 | 59 | # Coverage directory used by tools like istanbul 60 | coverage 61 | *.lcov 62 | 63 | # nyc test coverage 64 | .nyc_output 65 | 66 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 67 | .grunt 68 | 69 | # Bower dependency directory (https://bower.io/) 70 | bower_components 71 | 72 | # node-waf configuration 73 | .lock-wscript 74 | 75 | # Compiled binary addons (https://nodejs.org/api/addons.html) 76 | build/Release 77 | 78 | # Dependency directories 79 | node_modules/ 80 | jspm_packages/ 81 | 82 | # Snowpack dependency directory (https://snowpack.dev/) 83 | web_modules/ 84 | 85 | # TypeScript cache 86 | *.tsbuildinfo 87 | 88 | # Optional npm cache directory 89 | .npm 90 | 91 | # Optional eslint cache 92 | .eslintcache 93 | 94 | # Optional stylelint cache 95 | .stylelintcache 96 | 97 | # Microbundle cache 98 | .rpt2_cache/ 99 | .rts2_cache_cjs/ 100 | .rts2_cache_es/ 101 | .rts2_cache_umd/ 102 | 103 | # Optional REPL history 104 | .node_repl_history 105 | 106 | # Output of 'npm pack' 107 | *.tgz 108 | 109 | # Yarn Integrity file 110 | .yarn-integrity 111 | 112 | # dotenv environment variable files 113 | .env 114 | .env.development.local 115 | .env.test.local 116 | .env.production.local 117 | .env.local 118 | 119 | # parcel-bundler cache (https://parceljs.org/) 120 | .cache 121 | .parcel-cache 122 | 123 | # Next.js build output 124 | .next 125 | out 126 | 127 | # Nuxt.js build / generate output 128 | .nuxt 129 | dist 130 | 131 | # Gatsby files 132 | .cache/ 133 | # Comment in the public line in if your project uses Gatsby and not Next.js 134 | # https://nextjs.org/blog/next-9-1#public-directory-support 135 | # public 136 | 137 | # vuepress build output 138 | .vuepress/dist 139 | 140 | # vuepress v2.x temp and cache directory 141 | .temp 142 | 143 | # Docusaurus cache and generated files 144 | .docusaurus 145 | 146 | # Serverless directories 147 | .serverless/ 148 | 149 | # FuseBox cache 150 | .fusebox/ 151 | 152 | # DynamoDB Local files 153 | .dynamodb/ 154 | 155 | # TernJS port file 156 | .tern-port 157 | 158 | # Stores VSCode versions used for testing VSCode extensions 159 | .vscode-test 160 | 161 | # yarn v2 162 | .yarn/cache 163 | .yarn/unplugged 164 | .yarn/build-state.yml 165 | .yarn/install-state.gz 166 | .pnp.* 167 | 168 | ### Node Patch ### 169 | # Serverless Webpack directories 170 | .webpack/ 171 | 172 | # Optional stylelint cache 173 | 174 | # SvelteKit build / generate output 175 | .svelte-kit 176 | 177 | # End of https://www.toptal.com/developers/gitignore/api/macos,node -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Solid Service API 3 |

4 | 5 | # Solid Service API 6 | 7 | The Service API runs at api.solidjs.com and acts as a central datastore for critical SolidJS.com and supporting service operations. The API srevices REPL, SolidHack and has a general authentication system using GitHub OAuth powered by the wonderful folks at Stytch. 8 | 9 | Our services runs on Cloudflare Workers. The following code base is meant to be minimal and extendable. This is a high-throughput services so keeping is 10 | 11 | ## Development 12 | 13 | ### Dependencies 14 | 15 | 1. Stytch API 16 | 2. Supabase JS API & Client 17 | 3. Cloudflare Workers 18 | 19 | ### Install 20 | 21 | 1. Clone the project locally: `git clone https://github.com/solidjs/solid-service-api` 22 | 2. Change directory into your local copy: `cd solid-service-api` 23 | 3. Install the dependencies: `yarn install` 24 | 25 | ### Available commands 26 | 27 | - `yarn install`: Install the dependencies 28 | - `yarn dev`: Start the dev server using Miniflare 29 | - `yarn build`: Builds the entire package using vite-plugin-cloudflare 30 | - `yarn format`: Format the whole project with prettier 31 | - `yarn deploy`: Deploys the service via Wrangler 32 | 33 | ### Environment Setup 34 | 35 | In order to run the API successfully you'll need to setup a local .env file with the necessary configuration details. The following env should be copy and pasted into the root then populated with proper credentials: 36 | 37 | ``` 38 | STYTCH_PROJECT_ID= 39 | STYTCH_SECRET= 40 | STYTCH_API= 41 | STYTCH_URL= 42 | ENVIRONMENT= 43 | SUPABASE_URL= 44 | SUPABASE_KEY= 45 | ``` 46 | 47 | Once that's done you should be able to run `yarn dev` to initialize the service locally with Miniflare. 48 | 49 | ## Authentication 50 | 51 | The API uses a Bearer token to authenticate secure endpoints. Once you complete the login process and retain a JWT token (see login) all further requests to the API should contained the `Authorization` hearer with `Bearer [jwt token]`. The JWT is signed with our Stytch secret. The JWT is encoded with a minimal amount of user information. 52 | 53 | ## Errors 54 | 55 | The API endpoints use standard HTTP status codes for errors and a consistent error response structure: 56 | 57 | ```json 58 | { 59 | "status_code": "SOME_ERROR", 60 | "status_message": "A descriptive error response." 61 | } 62 | ``` 63 | 64 | ## Endpoints 65 | 66 | The following is an outline of endpoints that the service provides. Note that you may find a Postman collection set in the root of the directory. This should help with quickly getting setup and making calls 67 | 68 | ### Auth 69 | 70 | #### [GET] /auth/login?redirect=[...] 71 | 72 | This endpoint is used to trigger the OAuth login process. A redirect querystring value is necessary to ensure the user is sent back to the current location. You should link a user directly to this endpoint which will in turn redirect to Stytch for GitHub authentication, back to the authorize callback endpoint and then finally to the redirect path in the query. The querystring of the last redirect will contain a token value with a JWT for accessing this service. 73 | 74 | #### [GET] /auth/profile 75 | 76 | Retrieves the current users profile and responds with basic information: 77 | 78 | ```json 79 | { 80 | "id": "MDQ6VsdfklcjExNjgzOTc=", 81 | "display": "foobar", 82 | "avatar": "https://avatars.githubusercontent.com/u/9277648?v=4", 83 | "github_register": "2010-11-02T21:13:42Z" 84 | } 85 | ``` 86 | 87 | ### REPL 88 | 89 | This REPL collection enables endpoints to manage repl listings and powers the Solid Playground. REPL records have a set of basic information: `REPL data`, `labels`, `Solid version`, `size in bytes`, `creation date` and `updated date`. 90 | 91 | Note that the following API uses a constant structure for describing a REPL file. It uses the following shape: 92 | 93 | ```ts 94 | { 95 | "name": "main.tsx", 96 | "content": "import { createSignal, onCleanup } from \"solid-js\";\r\nimport { render } from \"solid-js\/web\";\r\n\r\nconst CountingComponent = () => {\r\n\tconst [count, setCount] = createSignal(0);\r\n\tconst interval = setInterval(\r\n\t\t() => setCount(c => c + 1),\r\n\t\t1000\r\n\t);\r\n\tonCleanup(() => clearInterval(interval));\r\n\treturn
Count value is {count()}<\/div>;\r\n};\r\n\r\nrender(() => , document.getElementById(\"app\"));" 97 | } 98 | ``` 99 | 100 | The REPL endpoint supports authenticated REPL and anonymous creation. Since anonymous REPLs have no user associated this API issues a special token keyed to the REPL record. This token is only issued on record creation and can never be retrieved afterwards. The token is to be supplied during update/patching of the REPL record in the future. 101 | 102 | #### List [GET] /repl?{&limit}{&offset}{&asc} 103 | 104 | #### List User REPLs [GET] /repl/[:githubHandle]/?{&limit}{&offset}{&asc} 105 | 106 | Returns a list of REPLs owned by the current user. The endpoint is paginated and can potentially support filters. The List and List User REPLs endpoints work the same. If the user requests/repl/davedbase it will show only that users public list. 107 | 108 | ```json 109 | { 110 | "total": 1, 111 | "list": [ 112 | { 113 | "id": "77aa5eec-19bd-471c-8b49-bd11a07c6544", 114 | "title": "Counter Example", 115 | "labels": ["examples", "basic"], 116 | "files": [], 117 | "version": "1.0", 118 | "public": true, 119 | "size": 54, 120 | "created_at": "2022-04-13T15:09:54.671307+00:00", 121 | "updated_at": null 122 | } 123 | ] 124 | } 125 | ``` 126 | 127 | #### Create [POST] /repl 128 | 129 | Creates a new REPL record for the user. The REPL creation endpoint supports anonymous content as well. When a user token isn't supplied the service will create the record without any user association and return a `write_token` property. This may be used in place of the Bearer token in the `PATCH` and `PUT` endpoints. 130 | 131 | Request: 132 | 133 | ```json 134 | { 135 | "title": "Counter Example", 136 | "version": "1.0", 137 | "public": true, 138 | "labels": ["examples", "basic"], 139 | "files": [] 140 | } 141 | ``` 142 | 143 | Response: 144 | 145 | ```json 146 | { 147 | "id": "77aa5eec-19bd-471c-8b49-bd11a07c6547" 148 | } 149 | ``` 150 | 151 | #### Transfer [POST] /repl/[:id]/transfer 152 | 153 | Transfers a REPL from one user to another. Transfers of anonymous REPLs are also by supplying a write_token. The following example shows a request with a token. 154 | 155 | Request: 156 | 157 | ```json 158 | { 159 | "write_token": "...." 160 | } 161 | ``` 162 | 163 | Response: 164 | 165 | ```json 166 | {} 167 | ``` 168 | 169 | #### Update [PUT] /repl/[:id] 170 | 171 | Update a new REPL record for the user. This endpoint accepts `write_token` in the body in place of the Bearer token if an anonymous REPL is to be edited. This token is issued on REPL creation. 172 | 173 | Request: 174 | 175 | ```json 176 | { 177 | "title": "Counter Example", 178 | "version": "1.0", 179 | "public": true, 180 | "labels": ["examples", "basic"], 181 | "files": [] 182 | } 183 | ``` 184 | 185 | Response: 186 | 187 | ```json 188 | { 189 | "id": "77aa5eec-19bd-471c-8b49-bd11a07c6547" 190 | } 191 | ``` 192 | 193 | #### Retrieve [GET] /repl/[:id] 194 | 195 | Retrieves a REPL based on the UUID. 196 | 197 | ```json 198 | { 199 | "title": "Counter Example", 200 | "user_id": "DDQ6VDKNlcjExNjgzOTc=", 201 | "version": "1.0", 202 | "labels": ["examples", "basic"], 203 | "public": true, 204 | "files": [], 205 | "created_at": "2022-04-15T16:41:24.918092+00:00", 206 | "updated_at": null 207 | } 208 | ``` 209 | 210 | #### Delete [DELETE] /repl/[:id] 211 | 212 | Delets a REPL based on the UUID. Successful deletions will return a status 200. Note that the service uses soft deletes. They are not retrievable via the API but are marked in the database itself. 213 | 214 | ### Solidex 215 | 216 | #### List [GET] /solidex/[:type] 217 | 218 | Retrieves a full list of Solid ecosystem packages. The type property can currently be `packages` or `resources`. 219 | 220 | ```json 221 | [ 222 | { 223 | "author": "Maksim Ivanov", 224 | "author_url": "https://www.youtube.com/user/satansdeer1", 225 | "categories": ["educational"], 226 | "description": "Maksim Ivanov walks us through Solid.js and how to use it.", 227 | "keywords": [""], 228 | "link": "https://www.youtube.com/watch?v=wu6HvLoi9VQ", 229 | "published_at": 1628532062000, 230 | "title": "How To Convert React Application To SolidJS", 231 | "type": "video" 232 | } 233 | ] 234 | ``` 235 | 236 | #### Submit [GET] /solidex 237 | 238 | Allows an external user to submit a new Solidex entry for approval. This endpoint is not fully complete and will return only dummy data. It's request body looks like the following, it's return result should be a record UUID. 239 | 240 | ```json 241 | { 242 | "author": "Maksim Ivanov", 243 | "author_url": "https://www.youtube.com/user/satansdeer1", 244 | "categories": ["educational"], 245 | "description": "Maksim Ivanov walks us through Solid.js and how to use it.", 246 | "keywords": [""], 247 | "link": "https://www.youtube.com/watch?v=wu6HvLoi9VQ", 248 | "published_at": 1628532062000, 249 | "title": "How To Convert React Application To SolidJS", 250 | "type": "video" 251 | } 252 | ``` 253 | 254 | ## Changelog 255 | 256 | ### Version 1.0.1 (April 15, 2022) 257 | 258 | - Ability to have public/private REPL storage 259 | - Added validation for REPL file format (based on our original .json structure) 260 | - Adjusted get endpoint to return public REPL without auth token 261 | 262 | ### Version 1.0.9 (October 6, 2022) 263 | 264 | - Added anonymous REPL creation + write_token for patch and update 265 | 266 | ### Version 1.0.10 (October 15, 2022) 267 | 268 | - Improved error responses for invalid token/user on write update/patch 269 | - Added REPL transfer mechanism 270 | 271 | ## TO-Do & Ideas 272 | 273 | - [x] Add better validation for certain endpoints 274 | - [x] Parse and validate REPLs with more granular detail (refer to Solid REPL output) 275 | - [x] Private/public mode for REPL 276 | - [x] Retrieve public REPLs 277 | - [x] Add endpoint for requesting other user REPLs 278 | - [x] Anonymous REPL creation 279 | - [x] Transfer REPLs between users 280 | - [ ] Handle request where application/json isn't sent as body type 281 | - [ ] Make REPL searchable 282 | - [ ] Add revision history and ability to retrieve 283 | - [ ] Add ability to fork a REPL 284 | - [ ] Enable user blocking options 285 | - [ ] Add ability to save REPL to a gist 286 | - [ ] Add ability to create a repository of an example 287 | - [ ] Move REPL packaging and zipping to the API 288 | 289 | ## Contributors 290 | 291 | A special thank you to to Christian Hansen [ch99q](https://github.com/ch99q) for initially setting up the foundations of this project and sorting out the Stytch integration. A big thank you to M. Bagher Abiat [Aslemammad](https://github.com/Aslemammad) who made vite-plugin-cloudflare which is one of the best utilities we've seen for working with Cloudflare. 292 | -------------------------------------------------------------------------------- /api.postman_collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "_postman_id": "d8e46ece-6e20-4114-a9d7-bfbb42801d00", 4 | "name": "Solid Services API", 5 | "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", 6 | "_exporter_id": "19697305" 7 | }, 8 | "item": [ 9 | { 10 | "name": "Get Profile", 11 | "request": { 12 | "method": "GET", 13 | "header": [ 14 | { 15 | "key": "Authorization", 16 | "value": "Bearer {{token}}", 17 | "type": "text" 18 | } 19 | ], 20 | "url": { 21 | "raw": "localhost:8787/profile", 22 | "host": [ 23 | "localhost" 24 | ], 25 | "port": "8787", 26 | "path": [ 27 | "profile" 28 | ] 29 | } 30 | }, 31 | "response": [] 32 | }, 33 | { 34 | "name": "Create REPL", 35 | "request": { 36 | "method": "POST", 37 | "header": [ 38 | { 39 | "key": "Authorization", 40 | "value": "Bearer {{token}}", 41 | "type": "text" 42 | }, 43 | { 44 | "key": "Content-Type", 45 | "value": "application/json", 46 | "type": "text" 47 | } 48 | ], 49 | "body": { 50 | "mode": "raw", 51 | "raw": "{\n \"title\": \"Counting Component\",\n \"version\": \"1.0\",\n \"public\": true,\n \"labels\": [\n \"counting\",\n \"example\"\n ],\n \"files\": [\n {\n \"name\": \"main.tsx\",\n \"content\": \"import { createSignal, onCleanup } from \\\"solid-js\\\";\\r\\nimport { render } from \\\"solid-js\\/web\\\";\\r\\n\\r\\nconst CountingComponent = () => {\\r\\n\\tconst [count, setCount] = createSignal(0);\\r\\n\\tconst interval = setInterval(\\r\\n\\t\\t() => setCount(c => c + 1),\\r\\n\\t\\t1000\\r\\n\\t);\\r\\n\\tonCleanup(() => clearInterval(interval));\\r\\n\\treturn
Count value is {count()}<\\/div>;\\r\\n};\\r\\n\\r\\nrender(() => , document.getElementById(\\\"app\\\"));\"\n \n }\n ]\n}", 52 | "options": { 53 | "raw": { 54 | "language": "json" 55 | } 56 | } 57 | }, 58 | "url": { 59 | "raw": "localhost:8787/repl", 60 | "host": [ 61 | "localhost" 62 | ], 63 | "port": "8787", 64 | "path": [ 65 | "repl" 66 | ] 67 | } 68 | }, 69 | "response": [] 70 | }, 71 | { 72 | "name": "List REPLs", 73 | "protocolProfileBehavior": { 74 | "disableBodyPruning": true 75 | }, 76 | "request": { 77 | "method": "GET", 78 | "header": [ 79 | { 80 | "key": "Authorization", 81 | "value": "Bearer {{token}}", 82 | "type": "text" 83 | }, 84 | { 85 | "key": "Content-Type", 86 | "value": "application/json", 87 | "type": "text" 88 | } 89 | ], 90 | "body": { 91 | "mode": "raw", 92 | "raw": "{\n \"title\": \"My repl name\",\n \"labels\": [\"test\", \"test\", \"test\"],\n \"data\": \"sdfkshjdfkjshdfkjhsdkjfhskjdfhskjdhfksjdhfkjsdhfkjshdf\"\n}", 93 | "options": { 94 | "raw": { 95 | "language": "json" 96 | } 97 | } 98 | }, 99 | "url": { 100 | "raw": "localhost:8787/repl", 101 | "host": [ 102 | "localhost" 103 | ], 104 | "port": "8787", 105 | "path": [ 106 | "repl" 107 | ] 108 | } 109 | }, 110 | "response": [] 111 | }, 112 | { 113 | "name": "List Public User REPLs", 114 | "protocolProfileBehavior": { 115 | "disableBodyPruning": true 116 | }, 117 | "request": { 118 | "method": "GET", 119 | "header": [ 120 | { 121 | "key": "Content-Type", 122 | "value": "application/json", 123 | "type": "text" 124 | } 125 | ], 126 | "body": { 127 | "mode": "raw", 128 | "raw": "{\n \"title\": \"My repl name\",\n \"labels\": [\"test\", \"test\", \"test\"],\n \"data\": \"sdfkshjdfkjshdfkjhsdkjfhskjdfhskjdhfksjdhfkjsdhfkjshdf\"\n}", 129 | "options": { 130 | "raw": { 131 | "language": "json" 132 | } 133 | } 134 | }, 135 | "url": { 136 | "raw": "localhost:8787/repl/davedbase/list", 137 | "host": [ 138 | "localhost" 139 | ], 140 | "port": "8787", 141 | "path": [ 142 | "repl", 143 | "davedbase", 144 | "list" 145 | ] 146 | } 147 | }, 148 | "response": [] 149 | }, 150 | { 151 | "name": "Put REPLs", 152 | "request": { 153 | "method": "PUT", 154 | "header": [ 155 | { 156 | "key": "Authorization", 157 | "value": "Bearer {{token}}", 158 | "type": "text" 159 | }, 160 | { 161 | "key": "Content-Type", 162 | "value": "application/json", 163 | "type": "text" 164 | } 165 | ], 166 | "body": { 167 | "mode": "raw", 168 | "raw": "{\n \"title\": \"Counting Component\",\n \"version\": \"1.0\",\n \"public\": true,\n \"labels\": [\n \"counting\",\n \"example\"\n ],\n \"files\": [\n {\n \"name\": \"main.tsx\",\n \"content\": [\n \"import { createSignal, onCleanup } from \\\"solid-js\\\";\",\n \"import { render } from \\\"solid-js/web\\\";\",\n \"\",\n \"const CountingComponent = () => {\",\n \"\\tconst [count, setCount] = createSignal(0);\",\n \"\\tconst interval = setInterval(\",\n \"\\t\\t() => setCount(c => c + 1),\",\n \"\\t\\t1000\",\n \"\\t);\",\n \"\\tonCleanup(() => clearInterval(interval));\",\n \"\\treturn
Count value is {count()}
;\",\n \"};\",\n \"\",\n \"render(() => , document.getElementById(\\\"app\\\"));\"\n ]\n }\n ]\n}", 169 | "options": { 170 | "raw": { 171 | "language": "json" 172 | } 173 | } 174 | }, 175 | "url": { 176 | "raw": "localhost:8787/repl/ae7ad0bc-3fc1-4eb8-bdf7-a024aa5a1e80", 177 | "host": [ 178 | "localhost" 179 | ], 180 | "port": "8787", 181 | "path": [ 182 | "repl", 183 | "ae7ad0bc-3fc1-4eb8-bdf7-a024aa5a1e80" 184 | ] 185 | } 186 | }, 187 | "response": [] 188 | }, 189 | { 190 | "name": "Delete REPL", 191 | "request": { 192 | "method": "DELETE", 193 | "header": [ 194 | { 195 | "key": "Authorization", 196 | "value": "Bearer {{token}}", 197 | "type": "text" 198 | }, 199 | { 200 | "key": "Content-Type", 201 | "value": "application/json", 202 | "type": "text" 203 | } 204 | ], 205 | "body": { 206 | "mode": "raw", 207 | "raw": "{\n \"title\": \"My repl Create a new name name\",\n \"labels\": [\"test\", \"test\", \"test\"],\n \"data\": \"sdfkshjdfkjshdfkjhsdkjfhskjdfhskjdhfksjdhfkjsdhfkjshdf\"\n}", 208 | "options": { 209 | "raw": { 210 | "language": "json" 211 | } 212 | } 213 | }, 214 | "url": { 215 | "raw": "localhost:8787/repl/d5943629-3fcc-4984-9fa7-f273d766f847", 216 | "host": [ 217 | "localhost" 218 | ], 219 | "port": "8787", 220 | "path": [ 221 | "repl", 222 | "d5943629-3fcc-4984-9fa7-f273d766f847" 223 | ] 224 | } 225 | }, 226 | "response": [] 227 | }, 228 | { 229 | "name": "Get REPL", 230 | "protocolProfileBehavior": { 231 | "disableBodyPruning": true 232 | }, 233 | "request": { 234 | "method": "GET", 235 | "header": [ 236 | { 237 | "key": "Authorization", 238 | "value": "Bearer {{token}}", 239 | "type": "text" 240 | }, 241 | { 242 | "key": "Content-Type", 243 | "value": "application/json", 244 | "type": "text" 245 | } 246 | ], 247 | "body": { 248 | "mode": "raw", 249 | "raw": "{\n \"title\": \"My repl Create a new name name\",\n \"labels\": [\"test\", \"test\", \"test\"],\n \"data\": \"sdfkshjdfkjshdfkjhsdkjfhskjdfhskjdhfksjdhfkjsdhfkjshdf\"\n}", 250 | "options": { 251 | "raw": { 252 | "language": "json" 253 | } 254 | } 255 | }, 256 | "url": { 257 | "raw": "localhost:8787/repl/ae7ad0bc-3fc1-4eb8-bdf7-a024aa5a1e80", 258 | "host": [ 259 | "localhost" 260 | ], 261 | "port": "8787", 262 | "path": [ 263 | "repl", 264 | "ae7ad0bc-3fc1-4eb8-bdf7-a024aa5a1e80" 265 | ] 266 | } 267 | }, 268 | "response": [] 269 | }, 270 | { 271 | "name": "Get Public REPL", 272 | "protocolProfileBehavior": { 273 | "disableBodyPruning": true 274 | }, 275 | "request": { 276 | "method": "GET", 277 | "header": [ 278 | { 279 | "key": "Content-Type", 280 | "value": "application/json", 281 | "type": "text" 282 | } 283 | ], 284 | "body": { 285 | "mode": "raw", 286 | "raw": "{\n \"title\": \"My repl Create a new name name\",\n \"labels\": [\"test\", \"test\", \"test\"],\n \"data\": \"sdfkshjdfkjshdfkjhsdkjfhskjdfhskjdhfksjdhfkjsdhfkjshdf\"\n}", 287 | "options": { 288 | "raw": { 289 | "language": "json" 290 | } 291 | } 292 | }, 293 | "url": { 294 | "raw": "localhost:8787/repl/ae7ad0bc-3fc1-4eb8-bdf7-a024aa5a1e80", 295 | "host": [ 296 | "localhost" 297 | ], 298 | "port": "8787", 299 | "path": [ 300 | "repl", 301 | "ae7ad0bc-3fc1-4eb8-bdf7-a024aa5a1e80" 302 | ] 303 | } 304 | }, 305 | "response": [] 306 | }, 307 | { 308 | "name": "Status", 309 | "protocolProfileBehavior": { 310 | "disableBodyPruning": true 311 | }, 312 | "request": { 313 | "method": "GET", 314 | "header": [ 315 | { 316 | "key": "Authorization", 317 | "value": "Bearer {{token}}", 318 | "type": "text" 319 | }, 320 | { 321 | "key": "Content-Type", 322 | "value": "application/json", 323 | "type": "text" 324 | } 325 | ], 326 | "body": { 327 | "mode": "raw", 328 | "raw": "{\n \"title\": \"My repl Create a new name name\",\n \"labels\": [\"test\", \"test\", \"test\"],\n \"data\": \"sdfkshjdfkjshdfkjhsdkjfhskjdfhskjdhfksjdhfkjsdhfkjshdf\"\n}", 329 | "options": { 330 | "raw": { 331 | "language": "json" 332 | } 333 | } 334 | }, 335 | "url": { 336 | "raw": "localhost:8787/status", 337 | "host": [ 338 | "localhost" 339 | ], 340 | "port": "8787", 341 | "path": [ 342 | "status" 343 | ] 344 | } 345 | }, 346 | "response": [] 347 | }, 348 | { 349 | "name": "Solidex Links", 350 | "protocolProfileBehavior": { 351 | "disableBodyPruning": true 352 | }, 353 | "request": { 354 | "method": "GET", 355 | "header": [ 356 | { 357 | "key": "Authorization", 358 | "value": "Bearer {{token}}", 359 | "type": "text" 360 | }, 361 | { 362 | "key": "Content-Type", 363 | "value": "application/json", 364 | "type": "text" 365 | } 366 | ], 367 | "body": { 368 | "mode": "raw", 369 | "raw": "{\n \"title\": \"My repl name\",\n \"labels\": [\"test\", \"test\", \"test\"],\n \"data\": \"sdfkshjdfkjshdfkjhsdkjfhskjdfhskjdhfksjdhfkjsdhfkjshdf\"\n}", 370 | "options": { 371 | "raw": { 372 | "language": "json" 373 | } 374 | } 375 | }, 376 | "url": { 377 | "raw": "localhost:8787/solidex/links?url=https://dev.to/this-is-learning/patterns-for-building-javascript-websites-in-2022-5a93", 378 | "host": [ 379 | "localhost" 380 | ], 381 | "port": "8787", 382 | "path": [ 383 | "solidex", 384 | "links" 385 | ], 386 | "query": [ 387 | { 388 | "key": "url", 389 | "value": "https://dev.to/this-is-learning/patterns-for-building-javascript-websites-in-2022-5a93" 390 | } 391 | ] 392 | } 393 | }, 394 | "response": [] 395 | }, 396 | { 397 | "name": "Solidex Submit", 398 | "request": { 399 | "method": "POST", 400 | "header": [ 401 | { 402 | "key": "Authorization", 403 | "value": "Bearer {{token}}", 404 | "type": "text" 405 | }, 406 | { 407 | "key": "Content-Type", 408 | "value": "application/json", 409 | "type": "text" 410 | } 411 | ], 412 | "body": { 413 | "mode": "raw", 414 | "raw": "{\n \"title\": \"Test\",\n \"link\": \"https://www.youtube.com\",\n \"author\": \"David\",\n \"author_url\": \"https://www.david.com\",\n \"description\": \"Hello\",\n \"type\": \"article\",\n \"categories\": [\"starters\"],\n \"keywords\": [\"test\"],\n \"official\": false,\n \"published_at\": 1654926042000\n}", 415 | "options": { 416 | "raw": { 417 | "language": "json" 418 | } 419 | } 420 | }, 421 | "url": { 422 | "raw": "localhost:8787/solidex", 423 | "host": [ 424 | "localhost" 425 | ], 426 | "port": "8787", 427 | "path": [ 428 | "solidex" 429 | ] 430 | } 431 | }, 432 | "response": [] 433 | } 434 | ] 435 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solid-service-api", 3 | "version": "1.0.5", 4 | "main": "dist/worker.js", 5 | "description": "Source code that powers api.solidjs.com.", 6 | "private": true, 7 | "contributors": [ 8 | { 9 | "name": "David Di Biase (davedbase)", 10 | "url": "https://github.com/davedbase" 11 | }, 12 | { 13 | "name": "Christian Hansen (ch99q)", 14 | "url": "https://github.com/ch99q" 15 | } 16 | ], 17 | "scripts": { 18 | "dev": "miniflare --live-reload --watch --verbose", 19 | "build": "tsc && vpc build -m src/worker.ts dist/worker.js", 20 | "test": "echo \"Error: no test specified\" && exit 1", 21 | "format": "prettier --write '**/*.{ts,css,json,md}'", 22 | "deploy": "wrangler publish dist/worker.js" 23 | }, 24 | "devDependencies": { 25 | "@cloudflare/workers-types": "^3.11.0", 26 | "@miniflare/kv": "^2.5.0", 27 | "@types/cookie": "^0.5.1", 28 | "@types/itty-router-extras": "^0.4.0", 29 | "@types/jsonwebtoken": "^8.5.8", 30 | "@types/uuid": "^8.3.4", 31 | "miniflare": "^2.5.0", 32 | "prettier": "^2.6.2", 33 | "typescript": "^4.7.3", 34 | "vite": "^2.9.12", 35 | "vite-plugin-cloudflare": "^0.1.3" 36 | }, 37 | "dependencies": { 38 | "@amoutonbrady/lz-string": "^0.0.1", 39 | "@octokit/core": "^3.6.0", 40 | "@solid.js/solidex": "^1.0.0", 41 | "@supabase/supabase-js": "^1.35.3", 42 | "@tsndr/cloudflare-worker-jwt": "^1.4.2", 43 | "cheerio": "^1.0.0-rc.11", 44 | "cookie": "^0.5.0", 45 | "fetch": "^1.1.0", 46 | "itty-router": "^2.6.6", 47 | "itty-router-extras": "^0.4.2", 48 | "metascraper": "^5.29.8", 49 | "octokit-plugin-create-pull-request": "^3.11.0", 50 | "uuid": "^8.3.2", 51 | "wrangler": "^2.1.10", 52 | "zod": "^3.17.3" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@amoutonbrady/lz-string': ^0.0.1 5 | '@cloudflare/workers-types': ^3.11.0 6 | '@miniflare/kv': ^2.5.0 7 | '@octokit/core': ^3.6.0 8 | '@solid.js/solidex': ^1.0.0 9 | '@supabase/supabase-js': ^1.35.3 10 | '@tsndr/cloudflare-worker-jwt': ^1.4.2 11 | '@types/cookie': ^0.5.1 12 | '@types/itty-router-extras': ^0.4.0 13 | '@types/jsonwebtoken': ^8.5.8 14 | '@types/uuid': ^8.3.4 15 | cheerio: ^1.0.0-rc.11 16 | cookie: ^0.5.0 17 | fetch: ^1.1.0 18 | itty-router: ^2.6.6 19 | itty-router-extras: ^0.4.2 20 | metascraper: ^5.29.8 21 | miniflare: ^2.5.0 22 | octokit-plugin-create-pull-request: ^3.11.0 23 | prettier: ^2.6.2 24 | typescript: ^4.7.3 25 | uuid: ^8.3.2 26 | vite: ^2.9.12 27 | vite-plugin-cloudflare: ^0.1.3 28 | wrangler: ^2.1.10 29 | zod: ^3.17.3 30 | 31 | dependencies: 32 | '@amoutonbrady/lz-string': 0.0.1 33 | '@octokit/core': 3.6.0 34 | '@solid.js/solidex': 1.0.0 35 | '@supabase/supabase-js': 1.35.7 36 | '@tsndr/cloudflare-worker-jwt': 1.4.4 37 | cheerio: 1.0.0-rc.12 38 | cookie: 0.5.0 39 | fetch: 1.1.0 40 | itty-router: 2.6.6 41 | itty-router-extras: 0.4.2 42 | metascraper: 5.31.1 43 | octokit-plugin-create-pull-request: 3.13.1 44 | uuid: 8.3.2 45 | wrangler: 2.1.11 46 | zod: 3.19.1 47 | 48 | devDependencies: 49 | '@cloudflare/workers-types': 3.17.0 50 | '@miniflare/kv': 2.10.0 51 | '@types/cookie': 0.5.1 52 | '@types/itty-router-extras': 0.4.0 53 | '@types/jsonwebtoken': 8.5.9 54 | '@types/uuid': 8.3.4 55 | miniflare: 2.10.0 56 | prettier: 2.7.1 57 | typescript: 4.8.4 58 | vite: 2.9.15 59 | vite-plugin-cloudflare: 0.1.3_avsti35k5pvcdqpmrtlurw25nu 60 | 61 | packages: 62 | 63 | /@amoutonbrady/lz-string/0.0.1: 64 | resolution: {integrity: sha512-crH4ovRiiTg9y1lDTEtMwTdD4s/aYoz4EemUD3p+9GvHMOeJ3tUXQ/DQM1Mw9/wc9Od4jG97w0m9+gZmLysGFQ==} 65 | dev: false 66 | 67 | /@cloudflare/kv-asset-handler/0.2.0: 68 | resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} 69 | dependencies: 70 | mime: 3.0.0 71 | dev: false 72 | 73 | /@cloudflare/workers-types/3.17.0: 74 | resolution: {integrity: sha512-u0cUQ4ntWFFwn5jx0ETa2ItvwvfOMjyaKF2fX2vFVujrSgNES/PnvRzPAhdt9CMYAMidInm0MGkIjxHRsFBaeg==} 75 | dev: true 76 | 77 | /@esbuild-plugins/node-globals-polyfill/0.1.1_esbuild@0.14.51: 78 | resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} 79 | peerDependencies: 80 | esbuild: '*' 81 | dependencies: 82 | esbuild: 0.14.51 83 | dev: false 84 | 85 | /@esbuild-plugins/node-modules-polyfill/0.1.4_esbuild@0.14.51: 86 | resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==} 87 | peerDependencies: 88 | esbuild: '*' 89 | dependencies: 90 | esbuild: 0.14.51 91 | escape-string-regexp: 4.0.0 92 | rollup-plugin-node-polyfills: 0.2.1 93 | dev: false 94 | 95 | /@esbuild/linux-loong64/0.14.54: 96 | resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} 97 | engines: {node: '>=12'} 98 | cpu: [loong64] 99 | os: [linux] 100 | requiresBuild: true 101 | dev: true 102 | optional: true 103 | 104 | /@gar/promisify/1.1.3: 105 | resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} 106 | dev: false 107 | 108 | /@iarna/toml/2.2.5: 109 | resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} 110 | 111 | /@metascraper/helpers/5.31.1: 112 | resolution: {integrity: sha512-sf38YSf8HL41+7hzvMJM+fzUeoZabpBSNEKD6qnyGh8RNZs59pqLbsT2aNEOpYdaGrej+nlpNTyjQGFH3ViimQ==} 113 | engines: {node: '>= 12'} 114 | dependencies: 115 | audio-extensions: 0.0.0 116 | chrono-node: 2.4.1 117 | condense-whitespace: 2.0.0 118 | entities: 4.4.0 119 | file-extension: 4.0.5 120 | has-values: 2.0.1 121 | image-extensions: 1.1.0 122 | is-relative-url: 3.0.0 123 | is-uri: 1.2.4 124 | iso-639-3: 2.2.0 125 | isostring: 0.0.1 126 | jsdom: 20.0.1 127 | lodash: 4.17.21 128 | memoize-one: 6.0.0 129 | microsoft-capitalize: 1.0.5 130 | mime: 3.0.0 131 | normalize-url: 6.1.0 132 | re2: 1.17.7 133 | smartquotes: 2.3.2 134 | url-regex-safe: 3.0.0_re2@1.17.7 135 | video-extensions: 1.2.0 136 | transitivePeerDependencies: 137 | - bluebird 138 | - bufferutil 139 | - canvas 140 | - supports-color 141 | - utf-8-validate 142 | dev: false 143 | 144 | /@miniflare/cache/2.10.0: 145 | resolution: {integrity: sha512-nzEqFVPnD7Yf0HMDv7gCPpf4NSXfjhc+zg3gSwUS4Dad5bWV10B1ujTZW6HxQulW3CBHIg616mTjXIiaimVuEQ==} 146 | engines: {node: '>=16.13'} 147 | dependencies: 148 | '@miniflare/core': 2.10.0 149 | '@miniflare/shared': 2.10.0 150 | http-cache-semantics: 4.1.0 151 | undici: 5.9.1 152 | dev: true 153 | 154 | /@miniflare/cache/2.9.0: 155 | resolution: {integrity: sha512-lriPxUEva9TJ01vU9P7pI60s3SsFnb4apWkNwZ+D7CRqyXPipSbapY8BWI2FUIwkEG7xap6UhzeTS76NettCXQ==} 156 | engines: {node: '>=16.13'} 157 | dependencies: 158 | '@miniflare/core': 2.9.0 159 | '@miniflare/shared': 2.9.0 160 | http-cache-semantics: 4.1.0 161 | undici: 5.9.1 162 | dev: false 163 | 164 | /@miniflare/cli-parser/2.10.0: 165 | resolution: {integrity: sha512-NAiCtqlHTUKCmV+Jl9af+ixGmMhiGhIyIfr/vCdbismNEBxEsrQGg3sQYTNfvCkdHtODurQqayQreFq21OuEow==} 166 | engines: {node: '>=16.13'} 167 | dependencies: 168 | '@miniflare/shared': 2.10.0 169 | kleur: 4.1.5 170 | dev: true 171 | 172 | /@miniflare/cli-parser/2.9.0: 173 | resolution: {integrity: sha512-gu8Z7NWNcYw6514/yOvajaj3GmebRucx+EEt3p1vKirO+gvFgKAt/puyUN3p7u8ZZmLuLF/B+wVnH3lj8BWKlg==} 174 | engines: {node: '>=16.13'} 175 | dependencies: 176 | '@miniflare/shared': 2.9.0 177 | kleur: 4.1.5 178 | dev: false 179 | 180 | /@miniflare/core/2.10.0: 181 | resolution: {integrity: sha512-Jx1M5oXQua0jzsJVdZSq07baVRmGC/6JkglrPQGAlZ7gQ1sunVZzq9fjxFqj0bqfEuYS0Wy6+lvK4rOAHISIjw==} 182 | engines: {node: '>=16.13'} 183 | dependencies: 184 | '@iarna/toml': 2.2.5 185 | '@miniflare/queues': 2.10.0 186 | '@miniflare/shared': 2.10.0 187 | '@miniflare/watcher': 2.10.0 188 | busboy: 1.6.0 189 | dotenv: 10.0.0 190 | kleur: 4.1.5 191 | set-cookie-parser: 2.5.1 192 | undici: 5.9.1 193 | urlpattern-polyfill: 4.0.3 194 | dev: true 195 | 196 | /@miniflare/core/2.9.0: 197 | resolution: {integrity: sha512-QqSwF6oHvgrFvN5lnrLc6EEagFlZWW+UMU8QdrE8305cNGHrIOxKCA2nte4PVFZUVw/Ts13a0tVhUk3a2fAyxQ==} 198 | engines: {node: '>=16.13'} 199 | dependencies: 200 | '@iarna/toml': 2.2.5 201 | '@miniflare/queues': 2.9.0 202 | '@miniflare/shared': 2.9.0 203 | '@miniflare/watcher': 2.9.0 204 | busboy: 1.6.0 205 | dotenv: 10.0.0 206 | kleur: 4.1.5 207 | set-cookie-parser: 2.5.1 208 | undici: 5.9.1 209 | urlpattern-polyfill: 4.0.3 210 | dev: false 211 | 212 | /@miniflare/d1/2.10.0: 213 | resolution: {integrity: sha512-mOYZSmpTthH0tmFTQ+O9G0Q+iDAd7oiUtoIBianlKa9QiqYAoO7EBUPy6kUgDHXapOcN5Ri1u3J5UTpxXvw3qg==} 214 | engines: {node: '>=16.7'} 215 | dependencies: 216 | '@miniflare/core': 2.10.0 217 | '@miniflare/shared': 2.10.0 218 | dev: true 219 | 220 | /@miniflare/d1/2.9.0: 221 | resolution: {integrity: sha512-swK9nzxw1SvVh/4cH3bRR1SBuHQU/YsB8WvuHojxufmgviAD1xhms3XO3rkpAzfKoGM5Oy6DovMe0xUXV/GS0w==} 222 | engines: {node: '>=16.7'} 223 | dependencies: 224 | '@miniflare/core': 2.9.0 225 | '@miniflare/shared': 2.9.0 226 | dev: false 227 | 228 | /@miniflare/durable-objects/2.10.0: 229 | resolution: {integrity: sha512-gU45f52gveFtCasm0ixYnt0mHI1lHrPomtmF+89oZGKBzOqUfO5diDs6wmoRSnovOWZCwtmwQGRoorAQN7AmoA==} 230 | engines: {node: '>=16.13'} 231 | dependencies: 232 | '@miniflare/core': 2.10.0 233 | '@miniflare/shared': 2.10.0 234 | '@miniflare/storage-memory': 2.10.0 235 | undici: 5.9.1 236 | dev: true 237 | 238 | /@miniflare/durable-objects/2.9.0: 239 | resolution: {integrity: sha512-7uTvfEUXS7xqwrsWOwWrFUuKc4EiMpVkAWPeYGLB/0TJaJ6N+sZMpYYymdW79TQwPIDfgtpfkIy93MRydqpnrw==} 240 | engines: {node: '>=16.13'} 241 | dependencies: 242 | '@miniflare/core': 2.9.0 243 | '@miniflare/shared': 2.9.0 244 | '@miniflare/storage-memory': 2.9.0 245 | undici: 5.9.1 246 | dev: false 247 | 248 | /@miniflare/html-rewriter/2.10.0: 249 | resolution: {integrity: sha512-hCdG99L8+Ros4dn3B5H37PlQPBH0859EoRslzNTd4jzGIkwdiawpJvrvesL8056GjbUjeJN1zh7OPBRuMgyGLw==} 250 | engines: {node: '>=16.13'} 251 | dependencies: 252 | '@miniflare/core': 2.10.0 253 | '@miniflare/shared': 2.10.0 254 | html-rewriter-wasm: 0.4.1 255 | undici: 5.9.1 256 | dev: true 257 | 258 | /@miniflare/html-rewriter/2.9.0: 259 | resolution: {integrity: sha512-K5OB70PtkMo7M+tU46s/cX/j/qtjD9AlJ0hecYswrxVsfrT/YWyrCQJevmShFfJ92h7jPNigbeC3Od3JiVb6QA==} 260 | engines: {node: '>=16.13'} 261 | dependencies: 262 | '@miniflare/core': 2.9.0 263 | '@miniflare/shared': 2.9.0 264 | html-rewriter-wasm: 0.4.1 265 | undici: 5.9.1 266 | dev: false 267 | 268 | /@miniflare/http-server/2.10.0: 269 | resolution: {integrity: sha512-cm6hwkONucll93yoY8dteMp//Knvmb7n6zAgeHrtuNYKn//lAL6bRY//VLTttrMmfWxZFi1C7WpOeCv8Mn6/ug==} 270 | engines: {node: '>=16.13'} 271 | dependencies: 272 | '@miniflare/core': 2.10.0 273 | '@miniflare/shared': 2.10.0 274 | '@miniflare/web-sockets': 2.10.0 275 | kleur: 4.1.5 276 | selfsigned: 2.1.1 277 | undici: 5.9.1 278 | ws: 8.9.0 279 | youch: 2.2.2 280 | transitivePeerDependencies: 281 | - bufferutil 282 | - utf-8-validate 283 | dev: true 284 | 285 | /@miniflare/http-server/2.9.0: 286 | resolution: {integrity: sha512-IVJMkFfMpecq9WiCTvATEKhMuKPK9fMs2E6zmgexaefr3u1VlNtj2QxBxoPUXkT9xMJQlT5sSKstlRR1XKDz9Q==} 287 | engines: {node: '>=16.13'} 288 | dependencies: 289 | '@miniflare/core': 2.9.0 290 | '@miniflare/shared': 2.9.0 291 | '@miniflare/web-sockets': 2.9.0 292 | kleur: 4.1.5 293 | selfsigned: 2.1.1 294 | undici: 5.9.1 295 | ws: 8.9.0 296 | youch: 2.2.2 297 | transitivePeerDependencies: 298 | - bufferutil 299 | - utf-8-validate 300 | dev: false 301 | 302 | /@miniflare/kv/2.10.0: 303 | resolution: {integrity: sha512-3+u1lO77FnlS0lQ6b1VgM1E/ZgQ/zy/FU+SdBG5LUOIiv3x522VYHOApeJLnSEo0KtZUB22Ni0fWQM6DgpaREg==} 304 | engines: {node: '>=16.13'} 305 | dependencies: 306 | '@miniflare/shared': 2.10.0 307 | dev: true 308 | 309 | /@miniflare/kv/2.9.0: 310 | resolution: {integrity: sha512-EqG51okY5rDtgjYs2Ny6j6IUVdTlJzDjwBKBIuW+wOV9NsAAzEchKVdYAXc8CyxvkggpYX481HydTD2OzK3INQ==} 311 | engines: {node: '>=16.13'} 312 | dependencies: 313 | '@miniflare/shared': 2.9.0 314 | dev: false 315 | 316 | /@miniflare/queues/2.10.0: 317 | resolution: {integrity: sha512-WKdO6qI9rfS96KlCjazzPFf+qj6DPov4vONyf18+jzbRjRJh/xwWSk1/1h5A+gDPwVNG8TsNRPh9DW5OKBGNjw==} 318 | engines: {node: '>=16.7'} 319 | dependencies: 320 | '@miniflare/shared': 2.10.0 321 | dev: true 322 | 323 | /@miniflare/queues/2.9.0: 324 | resolution: {integrity: sha512-cAHWIlLF57rxQaJl19AzXw1k0SOM/uLTlx8r2PylHajZ/RRSs7CkCox3oKA6E5zKyfyxk2M64bmsAFZ9RCA0gw==} 325 | engines: {node: '>=16.7'} 326 | dependencies: 327 | '@miniflare/shared': 2.9.0 328 | dev: false 329 | 330 | /@miniflare/r2/2.10.0: 331 | resolution: {integrity: sha512-uC1CCWbwM1t8DdpZgrveg6+CkZLfTq+wUMqs20BC5rCT8u8UyRv6ZVRQ7pTPiswLyt1oYDTXsZJK7tjV0U0zew==} 332 | engines: {node: '>=16.13'} 333 | dependencies: 334 | '@miniflare/shared': 2.10.0 335 | undici: 5.9.1 336 | dev: true 337 | 338 | /@miniflare/r2/2.9.0: 339 | resolution: {integrity: sha512-aMFWxxciAE3YsVok2OLy3A7hP5+2j/NaK7txmadgoe1CA8HYZyNuvv7v6bn8HKM5gWnJdT8sk4yEbMbBQ7Jv/A==} 340 | engines: {node: '>=16.13'} 341 | dependencies: 342 | '@miniflare/shared': 2.9.0 343 | undici: 5.9.1 344 | dev: false 345 | 346 | /@miniflare/runner-vm/2.10.0: 347 | resolution: {integrity: sha512-oTsHitQdQ1B1kT3G/6n9AEXsMd/sT1D8tLGzc7Xr79ZrxYxwRO0ATF3cdkxk4dUjUqg/RUqvOJV4YjJGyqvctg==} 348 | engines: {node: '>=16.13'} 349 | dependencies: 350 | '@miniflare/shared': 2.10.0 351 | dev: true 352 | 353 | /@miniflare/runner-vm/2.9.0: 354 | resolution: {integrity: sha512-vewP+Fy7Czb261GmB9x/YtQkoDs/QP9B5LbP0YfJ35bI2C2j940eJLm8JP72IHV7ILtWNOqMc3Ure8uAbpf9NQ==} 355 | engines: {node: '>=16.13'} 356 | dependencies: 357 | '@miniflare/shared': 2.9.0 358 | dev: false 359 | 360 | /@miniflare/scheduler/2.10.0: 361 | resolution: {integrity: sha512-eGt2cZFE/yo585nT8xINQwdbTotZfeRIh6FUWmZkbva1i5SW0zTiOojr5a95vAGBF3TzwWGsUuzJpLhBB69a/g==} 362 | engines: {node: '>=16.13'} 363 | dependencies: 364 | '@miniflare/core': 2.10.0 365 | '@miniflare/shared': 2.10.0 366 | cron-schedule: 3.0.6 367 | dev: true 368 | 369 | /@miniflare/scheduler/2.9.0: 370 | resolution: {integrity: sha512-eodSCGkJYi4Z+Imbx/bNScDfDSt5HOypVSYjbFHj+hA2aNOdkGw6a1b6mzwx49jJD3GadIkonZAKD0S114yWMA==} 371 | engines: {node: '>=16.13'} 372 | dependencies: 373 | '@miniflare/core': 2.9.0 374 | '@miniflare/shared': 2.9.0 375 | cron-schedule: 3.0.6 376 | dev: false 377 | 378 | /@miniflare/shared/2.10.0: 379 | resolution: {integrity: sha512-GDSweEhJ3nNtStGm6taZGUNytM0QTQ/sjZSedAKyF1/aHRaZUcD9cuKAMgIbSpKfvgGdLMNS7Bhd8jb249TO7g==} 380 | engines: {node: '>=16.13'} 381 | dependencies: 382 | '@types/better-sqlite3': 7.6.2 383 | kleur: 4.1.5 384 | npx-import: 1.1.4 385 | picomatch: 2.3.1 386 | dev: true 387 | 388 | /@miniflare/shared/2.9.0: 389 | resolution: {integrity: sha512-5Ew/Ph0cHDQqKvOlmN70kz+qZW0hdgE9fQBStKLY3vDYhnBEhopbCUChSS+FCcL7WtxVJJVE7iB6J09NQTnQ/A==} 390 | engines: {node: '>=16.13'} 391 | dependencies: 392 | '@types/better-sqlite3': 7.6.2 393 | kleur: 4.1.5 394 | npx-import: 1.1.4 395 | picomatch: 2.3.1 396 | dev: false 397 | 398 | /@miniflare/sites/2.10.0: 399 | resolution: {integrity: sha512-1NVAT6+JS2OubL+pOOR5E/6MMddxQHWMi/yIDSumyyfXmj7Sm7n5dE1FvNPetggMP4f8+AjoyT9AYvdd1wkspQ==} 400 | engines: {node: '>=16.13'} 401 | dependencies: 402 | '@miniflare/kv': 2.10.0 403 | '@miniflare/shared': 2.10.0 404 | '@miniflare/storage-file': 2.10.0 405 | dev: true 406 | 407 | /@miniflare/sites/2.9.0: 408 | resolution: {integrity: sha512-+tWf7znxSQqXWGzPup8Xqkl8EmLmx+HaLC+UBtWPNnaJZrsjbbVxKwHpmGIdm+wZasEGfQk/82R21gUs9wdZnw==} 409 | engines: {node: '>=16.13'} 410 | dependencies: 411 | '@miniflare/kv': 2.9.0 412 | '@miniflare/shared': 2.9.0 413 | '@miniflare/storage-file': 2.9.0 414 | dev: false 415 | 416 | /@miniflare/storage-file/2.10.0: 417 | resolution: {integrity: sha512-K/cRIWiTl4+Z+VO6tl4VfuYXA3NLJgvGPV+BCRYD7uTKuPYHqDMErtD1BI1I7nc3WJhwIXfzJrAR3XXhSKKWQQ==} 418 | engines: {node: '>=16.13'} 419 | dependencies: 420 | '@miniflare/shared': 2.10.0 421 | '@miniflare/storage-memory': 2.10.0 422 | dev: true 423 | 424 | /@miniflare/storage-file/2.9.0: 425 | resolution: {integrity: sha512-HZHtHfJaLoDzQFddoIMcDGgAJ3/Nee98gwUYusQam7rj9pbEXnWmk54dzjzsDlkQpB/3MBFQNbtN5Bj1NIt0pg==} 426 | engines: {node: '>=16.13'} 427 | dependencies: 428 | '@miniflare/shared': 2.9.0 429 | '@miniflare/storage-memory': 2.9.0 430 | dev: false 431 | 432 | /@miniflare/storage-memory/2.10.0: 433 | resolution: {integrity: sha512-ZATU+qZtJ9yG0umgTrOEUi9SU//YyDb8nYXMgqT4JHODYA3RTz1SyyiQSOOz589upJPdu1LN+0j8W24WGRwwxQ==} 434 | engines: {node: '>=16.13'} 435 | dependencies: 436 | '@miniflare/shared': 2.10.0 437 | dev: true 438 | 439 | /@miniflare/storage-memory/2.9.0: 440 | resolution: {integrity: sha512-p2yrr0omQhv6teDbdzhdBKzoQAFmUBMLEx+PtrO7CJHX15ICD08/pFAFAp96IcljNwZZDchU20Z3AcbldMj6Tw==} 441 | engines: {node: '>=16.13'} 442 | dependencies: 443 | '@miniflare/shared': 2.9.0 444 | dev: false 445 | 446 | /@miniflare/watcher/2.10.0: 447 | resolution: {integrity: sha512-X9CFYYyszfSYDzs07KhbWC2i08Dpyh3D60fPonYZcoZAfa5h9eATHUdRGvNCdax7awYp4b8bvU8upAI//OPlMg==} 448 | engines: {node: '>=16.13'} 449 | dependencies: 450 | '@miniflare/shared': 2.10.0 451 | dev: true 452 | 453 | /@miniflare/watcher/2.9.0: 454 | resolution: {integrity: sha512-Yqz8Q1He/2chebXvmCft8sMamuUiDQ4FIn0bwiF0+GBP2vvGCmy6SejXZY4ZD4REluPqQSis3CLKcIOWlHnIsw==} 455 | engines: {node: '>=16.13'} 456 | dependencies: 457 | '@miniflare/shared': 2.9.0 458 | dev: false 459 | 460 | /@miniflare/web-sockets/2.10.0: 461 | resolution: {integrity: sha512-W+PrapdQqNEEFeD+amENgPQWcETGDp7OEh6JAoSzCRhHA0OoMe8DG0xb5a5+2FjGW/J7FFKsv84wkURpmFT4dQ==} 462 | engines: {node: '>=16.13'} 463 | dependencies: 464 | '@miniflare/core': 2.10.0 465 | '@miniflare/shared': 2.10.0 466 | undici: 5.9.1 467 | ws: 8.9.0 468 | transitivePeerDependencies: 469 | - bufferutil 470 | - utf-8-validate 471 | dev: true 472 | 473 | /@miniflare/web-sockets/2.9.0: 474 | resolution: {integrity: sha512-Nob9e84m78qeQCka6OQf/JdNOmMkKCkX+i3rg+TYKSSITiMVuyzWp3vz3Ma184lAZiLg44lxBF4ZzENEdi99Kg==} 475 | engines: {node: '>=16.13'} 476 | dependencies: 477 | '@miniflare/core': 2.9.0 478 | '@miniflare/shared': 2.9.0 479 | undici: 5.9.1 480 | ws: 8.9.0 481 | transitivePeerDependencies: 482 | - bufferutil 483 | - utf-8-validate 484 | dev: false 485 | 486 | /@npmcli/fs/2.1.2: 487 | resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} 488 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 489 | dependencies: 490 | '@gar/promisify': 1.1.3 491 | semver: 7.3.8 492 | dev: false 493 | 494 | /@npmcli/move-file/2.0.1: 495 | resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} 496 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 497 | dependencies: 498 | mkdirp: 1.0.4 499 | rimraf: 3.0.2 500 | dev: false 501 | 502 | /@octokit/auth-token/2.5.0: 503 | resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} 504 | dependencies: 505 | '@octokit/types': 6.41.0 506 | dev: false 507 | 508 | /@octokit/core/3.6.0: 509 | resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} 510 | dependencies: 511 | '@octokit/auth-token': 2.5.0 512 | '@octokit/graphql': 4.8.0 513 | '@octokit/request': 5.6.3 514 | '@octokit/request-error': 2.1.0 515 | '@octokit/types': 6.41.0 516 | before-after-hook: 2.2.3 517 | universal-user-agent: 6.0.0 518 | transitivePeerDependencies: 519 | - encoding 520 | dev: false 521 | 522 | /@octokit/endpoint/6.0.12: 523 | resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} 524 | dependencies: 525 | '@octokit/types': 6.41.0 526 | is-plain-object: 5.0.0 527 | universal-user-agent: 6.0.0 528 | dev: false 529 | 530 | /@octokit/graphql/4.8.0: 531 | resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} 532 | dependencies: 533 | '@octokit/request': 5.6.3 534 | '@octokit/types': 6.41.0 535 | universal-user-agent: 6.0.0 536 | transitivePeerDependencies: 537 | - encoding 538 | dev: false 539 | 540 | /@octokit/openapi-types/12.11.0: 541 | resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} 542 | dev: false 543 | 544 | /@octokit/request-error/2.1.0: 545 | resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} 546 | dependencies: 547 | '@octokit/types': 6.41.0 548 | deprecation: 2.3.1 549 | once: 1.4.0 550 | dev: false 551 | 552 | /@octokit/request/5.6.3: 553 | resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} 554 | dependencies: 555 | '@octokit/endpoint': 6.0.12 556 | '@octokit/request-error': 2.1.0 557 | '@octokit/types': 6.41.0 558 | is-plain-object: 5.0.0 559 | node-fetch: 2.6.7 560 | universal-user-agent: 6.0.0 561 | transitivePeerDependencies: 562 | - encoding 563 | dev: false 564 | 565 | /@octokit/types/6.41.0: 566 | resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} 567 | dependencies: 568 | '@octokit/openapi-types': 12.11.0 569 | dev: false 570 | 571 | /@solid.js/solidex/1.0.0: 572 | resolution: {integrity: sha512-XinpUK6UImdNT1bkd3FneWd2hsEBDkmRS4J8erSwGKfq4JuPucpgM0sprVrM1ZRUasbn2ZkACAZS+vneipBzLg==} 573 | dependencies: 574 | global: 4.4.0 575 | dev: false 576 | 577 | /@supabase/functions-js/1.3.4: 578 | resolution: {integrity: sha512-yYVgkECjv7IZEBKBI3EB5Q7R1p0FJ10g8Q9N7SWKIHUU6i6DnbEGHIMFLyQRm1hmiNWD8fL7bRVEYacmTRJhHw==} 579 | dependencies: 580 | cross-fetch: 3.1.5 581 | transitivePeerDependencies: 582 | - encoding 583 | dev: false 584 | 585 | /@supabase/gotrue-js/1.24.0: 586 | resolution: {integrity: sha512-6PVv7mHCFOxLm6TSBfR7hsq/y3CMKpvzePVR+ZWtlFBTjJ2J87g2OYE9bgC61P5TNeZopUXKw93H92yz0MTALw==} 587 | dependencies: 588 | cross-fetch: 3.1.5 589 | transitivePeerDependencies: 590 | - encoding 591 | dev: false 592 | 593 | /@supabase/postgrest-js/0.37.4: 594 | resolution: {integrity: sha512-x+c2rk1fz9s6f1PrGxCJ0QTUgXPDI0G3ngIqD5sSiXhhCyfl8Q5V92mXl2EYtlDhkiUkjFNrOZFhXVbXOHgvDw==} 595 | dependencies: 596 | cross-fetch: 3.1.5 597 | transitivePeerDependencies: 598 | - encoding 599 | dev: false 600 | 601 | /@supabase/realtime-js/1.7.5: 602 | resolution: {integrity: sha512-nXuoxt7NE1NTI+G8WBim1K2gkUC8YE3e9evBUG+t6xwd9Sq+sSOrjcE0qJ8/Y631BCnLzlhX6yhFYQFh1oQDOg==} 603 | dependencies: 604 | '@types/phoenix': 1.5.4 605 | websocket: 1.0.34 606 | transitivePeerDependencies: 607 | - supports-color 608 | dev: false 609 | 610 | /@supabase/storage-js/1.7.3: 611 | resolution: {integrity: sha512-jnIZWqOc9TGclOozgX9v/RWGFCgJAyW/yvmauexgRZhWknUXoA4b2i8tj7vfwE0WTvNRuA5JpXID98rfJeSG7Q==} 612 | dependencies: 613 | cross-fetch: 3.1.5 614 | transitivePeerDependencies: 615 | - encoding 616 | dev: false 617 | 618 | /@supabase/supabase-js/1.35.7: 619 | resolution: {integrity: sha512-X+qCzmj5sH0dozagbLoK7LzysBaWoivO0gsAUAPPBQkQupQWuBfaOqG18gKhlfL0wp2PL888QzhQNScp/IwUfA==} 620 | dependencies: 621 | '@supabase/functions-js': 1.3.4 622 | '@supabase/gotrue-js': 1.24.0 623 | '@supabase/postgrest-js': 0.37.4 624 | '@supabase/realtime-js': 1.7.5 625 | '@supabase/storage-js': 1.7.3 626 | transitivePeerDependencies: 627 | - encoding 628 | - supports-color 629 | dev: false 630 | 631 | /@tootallnate/once/2.0.0: 632 | resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 633 | engines: {node: '>= 10'} 634 | dev: false 635 | 636 | /@tsndr/cloudflare-worker-jwt/1.4.4: 637 | resolution: {integrity: sha512-6mIfAsB06bw1ittXsXgluXExcOqWyB6IsPg36rsrTWjwcudLnXXgVaxgdZ8SEGDO6sZ+lhTtD6JRiTU7O+yIKA==} 638 | dev: false 639 | 640 | /@types/better-sqlite3/7.6.2: 641 | resolution: {integrity: sha512-RgmaapusqTq6IMAr4McMyAsC6RshYTCjXCnzwVV59WctUxC8bNPyUfT9t5F81lKcU41lLurhjqjoMHfauzfqGg==} 642 | dependencies: 643 | '@types/node': 18.11.0 644 | 645 | /@types/cookie/0.5.1: 646 | resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} 647 | dev: true 648 | 649 | /@types/itty-router-extras/0.4.0: 650 | resolution: {integrity: sha512-IcXmXB8vVbjWy4McZjKzo+3sdQyzMpyHi5mQ4iViu6yX9cS/SVlGR+6H/AgzfG32svaQJeOhl2gfXYwf1AKEgg==} 651 | dependencies: 652 | itty-router: 2.6.6 653 | dev: true 654 | 655 | /@types/jsonwebtoken/8.5.9: 656 | resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} 657 | dependencies: 658 | '@types/node': 18.11.0 659 | dev: true 660 | 661 | /@types/node/18.11.0: 662 | resolution: {integrity: sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==} 663 | 664 | /@types/phoenix/1.5.4: 665 | resolution: {integrity: sha512-L5eZmzw89eXBKkiqVBcJfU1QGx9y+wurRIEgt0cuLH0hwNtVUxtx+6cu0R2STwWj468sjXyBYPYDtGclUd1kjQ==} 666 | dev: false 667 | 668 | /@types/stack-trace/0.0.29: 669 | resolution: {integrity: sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==} 670 | 671 | /@types/uuid/8.3.4: 672 | resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} 673 | dev: true 674 | 675 | /abab/2.0.6: 676 | resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} 677 | dev: false 678 | 679 | /abbrev/1.1.1: 680 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 681 | dev: false 682 | 683 | /abstract-leveldown/0.12.4: 684 | resolution: {integrity: sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==} 685 | dependencies: 686 | xtend: 3.0.0 687 | dev: true 688 | 689 | /acorn-globals/7.0.1: 690 | resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} 691 | dependencies: 692 | acorn: 8.8.0 693 | acorn-walk: 8.2.0 694 | dev: false 695 | 696 | /acorn-walk/8.2.0: 697 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 698 | engines: {node: '>=0.4.0'} 699 | dev: false 700 | 701 | /acorn/5.7.4: 702 | resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} 703 | engines: {node: '>=0.4.0'} 704 | hasBin: true 705 | dev: true 706 | 707 | /acorn/8.8.0: 708 | resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} 709 | engines: {node: '>=0.4.0'} 710 | hasBin: true 711 | dev: false 712 | 713 | /agent-base/6.0.2: 714 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 715 | engines: {node: '>= 6.0.0'} 716 | dependencies: 717 | debug: 4.3.4 718 | transitivePeerDependencies: 719 | - supports-color 720 | dev: false 721 | 722 | /agentkeepalive/4.2.1: 723 | resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} 724 | engines: {node: '>= 8.0.0'} 725 | dependencies: 726 | debug: 4.3.4 727 | depd: 1.1.2 728 | humanize-ms: 1.2.1 729 | transitivePeerDependencies: 730 | - supports-color 731 | dev: false 732 | 733 | /aggregate-error/3.1.0: 734 | resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} 735 | engines: {node: '>=8'} 736 | dependencies: 737 | clean-stack: 2.2.0 738 | indent-string: 4.0.0 739 | dev: false 740 | 741 | /ansi-regex/5.0.1: 742 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 743 | engines: {node: '>=8'} 744 | dev: false 745 | 746 | /anymatch/3.1.2: 747 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 748 | engines: {node: '>= 8'} 749 | dependencies: 750 | normalize-path: 3.0.0 751 | picomatch: 2.3.1 752 | dev: false 753 | 754 | /aproba/2.0.0: 755 | resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} 756 | dev: false 757 | 758 | /are-we-there-yet/3.0.1: 759 | resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} 760 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 761 | dependencies: 762 | delegates: 1.0.0 763 | readable-stream: 3.6.0 764 | dev: false 765 | 766 | /asn1.js/5.4.1: 767 | resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} 768 | dependencies: 769 | bn.js: 4.12.0 770 | inherits: 2.0.4 771 | minimalistic-assert: 1.0.1 772 | safer-buffer: 2.1.2 773 | dev: true 774 | 775 | /asynckit/0.4.0: 776 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 777 | dev: false 778 | 779 | /audio-extensions/0.0.0: 780 | resolution: {integrity: sha512-yj9C819u3ED3/OyRd9mLKMXGy8wsElaf6bkkv6OqZEKrNAT461TjiznS4IfPBy8Mmh6DWaXCQCVYSq3+VHkpjQ==} 781 | engines: {node: '>=0.10.0'} 782 | dev: false 783 | 784 | /balanced-match/1.0.2: 785 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 786 | dev: false 787 | 788 | /before-after-hook/2.2.3: 789 | resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} 790 | dev: false 791 | 792 | /binary-extensions/2.2.0: 793 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 794 | engines: {node: '>=8'} 795 | dev: false 796 | 797 | /biskviit/1.0.1: 798 | resolution: {integrity: sha512-VGCXdHbdbpEkFgtjkeoBN8vRlbj1ZRX2/mxhE8asCCRalUx2nBzOomLJv8Aw/nRt5+ccDb+tPKidg4XxcfGW4w==} 799 | engines: {node: '>=1.0.0'} 800 | dependencies: 801 | psl: 1.9.0 802 | dev: false 803 | 804 | /bl/0.8.2: 805 | resolution: {integrity: sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==} 806 | dependencies: 807 | readable-stream: 1.0.34 808 | dev: true 809 | 810 | /blake3-wasm/2.1.5: 811 | resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 812 | dev: false 813 | 814 | /bn.js/4.12.0: 815 | resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} 816 | dev: true 817 | 818 | /bn.js/5.2.1: 819 | resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} 820 | dev: true 821 | 822 | /boolbase/1.0.0: 823 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 824 | dev: false 825 | 826 | /brace-expansion/1.1.11: 827 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 828 | dependencies: 829 | balanced-match: 1.0.2 830 | concat-map: 0.0.1 831 | dev: false 832 | 833 | /brace-expansion/2.0.1: 834 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 835 | dependencies: 836 | balanced-match: 1.0.2 837 | dev: false 838 | 839 | /braces/3.0.2: 840 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 841 | engines: {node: '>=8'} 842 | dependencies: 843 | fill-range: 7.0.1 844 | dev: false 845 | 846 | /brorand/1.1.0: 847 | resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} 848 | dev: true 849 | 850 | /browserify-aes/1.2.0: 851 | resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} 852 | dependencies: 853 | buffer-xor: 1.0.3 854 | cipher-base: 1.0.4 855 | create-hash: 1.2.0 856 | evp_bytestokey: 1.0.3 857 | inherits: 2.0.4 858 | safe-buffer: 5.2.1 859 | dev: true 860 | 861 | /browserify-cipher/1.0.1: 862 | resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} 863 | dependencies: 864 | browserify-aes: 1.2.0 865 | browserify-des: 1.0.2 866 | evp_bytestokey: 1.0.3 867 | dev: true 868 | 869 | /browserify-des/1.0.2: 870 | resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} 871 | dependencies: 872 | cipher-base: 1.0.4 873 | des.js: 1.0.1 874 | inherits: 2.0.4 875 | safe-buffer: 5.2.1 876 | dev: true 877 | 878 | /browserify-fs/1.0.0: 879 | resolution: {integrity: sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==} 880 | dependencies: 881 | level-filesystem: 1.2.0 882 | level-js: 2.2.4 883 | levelup: 0.18.6 884 | dev: true 885 | 886 | /browserify-rsa/4.1.0: 887 | resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} 888 | dependencies: 889 | bn.js: 5.2.1 890 | randombytes: 2.1.0 891 | dev: true 892 | 893 | /browserify-sign/4.2.1: 894 | resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} 895 | dependencies: 896 | bn.js: 5.2.1 897 | browserify-rsa: 4.1.0 898 | create-hash: 1.2.0 899 | create-hmac: 1.1.7 900 | elliptic: 6.5.4 901 | inherits: 2.0.4 902 | parse-asn1: 5.1.6 903 | readable-stream: 3.6.0 904 | safe-buffer: 5.2.1 905 | dev: true 906 | 907 | /buffer-es6/4.9.3: 908 | resolution: {integrity: sha512-Ibt+oXxhmeYJSsCkODPqNpPmyegefiD8rfutH1NYGhMZQhSp95Rz7haemgnJ6dxa6LT+JLLbtgOMORRluwKktw==} 909 | dev: true 910 | 911 | /buffer-from/1.1.2: 912 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 913 | 914 | /buffer-xor/1.0.3: 915 | resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} 916 | dev: true 917 | 918 | /bufferutil/4.0.6: 919 | resolution: {integrity: sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==} 920 | engines: {node: '>=6.14.2'} 921 | requiresBuild: true 922 | dependencies: 923 | node-gyp-build: 4.5.0 924 | dev: false 925 | 926 | /builtin-status-codes/3.0.0: 927 | resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} 928 | dev: true 929 | 930 | /builtins/5.0.1: 931 | resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} 932 | dependencies: 933 | semver: 7.3.8 934 | 935 | /busboy/1.6.0: 936 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 937 | engines: {node: '>=10.16.0'} 938 | dependencies: 939 | streamsearch: 1.1.0 940 | 941 | /cac/6.7.14: 942 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 943 | engines: {node: '>=8'} 944 | dev: true 945 | 946 | /cacache/16.1.3: 947 | resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} 948 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 949 | dependencies: 950 | '@npmcli/fs': 2.1.2 951 | '@npmcli/move-file': 2.0.1 952 | chownr: 2.0.0 953 | fs-minipass: 2.1.0 954 | glob: 8.0.3 955 | infer-owner: 1.0.4 956 | lru-cache: 7.14.0 957 | minipass: 3.3.4 958 | minipass-collect: 1.0.2 959 | minipass-flush: 1.0.5 960 | minipass-pipeline: 1.2.4 961 | mkdirp: 1.0.4 962 | p-map: 4.0.0 963 | promise-inflight: 1.0.1 964 | rimraf: 3.0.2 965 | ssri: 9.0.1 966 | tar: 6.1.11 967 | unique-filename: 2.0.1 968 | transitivePeerDependencies: 969 | - bluebird 970 | dev: false 971 | 972 | /cheerio-select/2.1.0: 973 | resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} 974 | dependencies: 975 | boolbase: 1.0.0 976 | css-select: 5.1.0 977 | css-what: 6.1.0 978 | domelementtype: 2.3.0 979 | domhandler: 5.0.3 980 | domutils: 3.0.1 981 | dev: false 982 | 983 | /cheerio/1.0.0-rc.12: 984 | resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} 985 | engines: {node: '>= 6'} 986 | dependencies: 987 | cheerio-select: 2.1.0 988 | dom-serializer: 2.0.0 989 | domhandler: 5.0.3 990 | domutils: 3.0.1 991 | htmlparser2: 8.0.1 992 | parse5: 7.1.1 993 | parse5-htmlparser2-tree-adapter: 7.0.0 994 | dev: false 995 | 996 | /chokidar/3.5.3: 997 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 998 | engines: {node: '>= 8.10.0'} 999 | dependencies: 1000 | anymatch: 3.1.2 1001 | braces: 3.0.2 1002 | glob-parent: 5.1.2 1003 | is-binary-path: 2.1.0 1004 | is-glob: 4.0.3 1005 | normalize-path: 3.0.0 1006 | readdirp: 3.6.0 1007 | optionalDependencies: 1008 | fsevents: 2.3.2 1009 | dev: false 1010 | 1011 | /chownr/2.0.0: 1012 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 1013 | engines: {node: '>=10'} 1014 | dev: false 1015 | 1016 | /chrono-node/2.4.1: 1017 | resolution: {integrity: sha512-23lqpMF2i0lr6dAVpVyYmvVGgX/EtkHBEIgFUd6LQiP7CHLzYeROYvl5X59ZBK73KAV+FGPo4rQv0Fym8CIktw==} 1018 | dependencies: 1019 | dayjs: 1.11.5 1020 | dev: false 1021 | 1022 | /cipher-base/1.0.4: 1023 | resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} 1024 | dependencies: 1025 | inherits: 2.0.4 1026 | safe-buffer: 5.2.1 1027 | dev: true 1028 | 1029 | /clean-stack/2.2.0: 1030 | resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} 1031 | engines: {node: '>=6'} 1032 | dev: false 1033 | 1034 | /clean-stack/3.0.1: 1035 | resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} 1036 | engines: {node: '>=10'} 1037 | dependencies: 1038 | escape-string-regexp: 4.0.0 1039 | dev: false 1040 | 1041 | /clone/0.1.19: 1042 | resolution: {integrity: sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==} 1043 | dev: true 1044 | 1045 | /color-support/1.1.3: 1046 | resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} 1047 | hasBin: true 1048 | dev: false 1049 | 1050 | /combined-stream/1.0.8: 1051 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 1052 | engines: {node: '>= 0.8'} 1053 | dependencies: 1054 | delayed-stream: 1.0.0 1055 | dev: false 1056 | 1057 | /concat-map/0.0.1: 1058 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1059 | dev: false 1060 | 1061 | /concat-stream/1.6.2: 1062 | resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} 1063 | engines: {'0': node >= 0.8} 1064 | dependencies: 1065 | buffer-from: 1.1.2 1066 | inherits: 2.0.4 1067 | readable-stream: 2.3.7 1068 | typedarray: 0.0.6 1069 | dev: true 1070 | 1071 | /condense-whitespace/2.0.0: 1072 | resolution: {integrity: sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw==} 1073 | engines: {node: '>=8'} 1074 | dev: false 1075 | 1076 | /console-control-strings/1.1.0: 1077 | resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 1078 | dev: false 1079 | 1080 | /cookie/0.4.2: 1081 | resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} 1082 | engines: {node: '>= 0.6'} 1083 | 1084 | /cookie/0.5.0: 1085 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1086 | engines: {node: '>= 0.6'} 1087 | dev: false 1088 | 1089 | /core-util-is/1.0.3: 1090 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 1091 | dev: true 1092 | 1093 | /create-ecdh/4.0.4: 1094 | resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} 1095 | dependencies: 1096 | bn.js: 4.12.0 1097 | elliptic: 6.5.4 1098 | dev: true 1099 | 1100 | /create-hash/1.2.0: 1101 | resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} 1102 | dependencies: 1103 | cipher-base: 1.0.4 1104 | inherits: 2.0.4 1105 | md5.js: 1.3.5 1106 | ripemd160: 2.0.2 1107 | sha.js: 2.4.11 1108 | dev: true 1109 | 1110 | /create-hmac/1.1.7: 1111 | resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} 1112 | dependencies: 1113 | cipher-base: 1.0.4 1114 | create-hash: 1.2.0 1115 | inherits: 2.0.4 1116 | ripemd160: 2.0.2 1117 | safe-buffer: 5.2.1 1118 | sha.js: 2.4.11 1119 | dev: true 1120 | 1121 | /cron-schedule/3.0.6: 1122 | resolution: {integrity: sha512-izfGgKyzzIyLaeb1EtZ3KbglkS6AKp9cv7LxmiyoOu+fXfol1tQDC0Cof0enVZGNtudTHW+3lfuW9ZkLQss4Wg==} 1123 | 1124 | /cross-fetch/3.1.5: 1125 | resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} 1126 | dependencies: 1127 | node-fetch: 2.6.7 1128 | transitivePeerDependencies: 1129 | - encoding 1130 | dev: false 1131 | 1132 | /cross-spawn/7.0.3: 1133 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1134 | engines: {node: '>= 8'} 1135 | dependencies: 1136 | path-key: 3.1.1 1137 | shebang-command: 2.0.0 1138 | which: 2.0.2 1139 | 1140 | /crypto-browserify/3.12.0: 1141 | resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} 1142 | dependencies: 1143 | browserify-cipher: 1.0.1 1144 | browserify-sign: 4.2.1 1145 | create-ecdh: 4.0.4 1146 | create-hash: 1.2.0 1147 | create-hmac: 1.1.7 1148 | diffie-hellman: 5.0.3 1149 | inherits: 2.0.4 1150 | pbkdf2: 3.1.2 1151 | public-encrypt: 4.0.3 1152 | randombytes: 2.1.0 1153 | randomfill: 1.0.4 1154 | dev: true 1155 | 1156 | /css-select/5.1.0: 1157 | resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} 1158 | dependencies: 1159 | boolbase: 1.0.0 1160 | css-what: 6.1.0 1161 | domhandler: 5.0.3 1162 | domutils: 3.0.1 1163 | nth-check: 2.1.1 1164 | dev: false 1165 | 1166 | /css-what/6.1.0: 1167 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 1168 | engines: {node: '>= 6'} 1169 | dev: false 1170 | 1171 | /cssom/0.3.8: 1172 | resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} 1173 | dev: false 1174 | 1175 | /cssom/0.5.0: 1176 | resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} 1177 | dev: false 1178 | 1179 | /cssstyle/2.3.0: 1180 | resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} 1181 | engines: {node: '>=8'} 1182 | dependencies: 1183 | cssom: 0.3.8 1184 | dev: false 1185 | 1186 | /d/1.0.1: 1187 | resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} 1188 | dependencies: 1189 | es5-ext: 0.10.62 1190 | type: 1.2.0 1191 | dev: false 1192 | 1193 | /data-urls/3.0.2: 1194 | resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} 1195 | engines: {node: '>=12'} 1196 | dependencies: 1197 | abab: 2.0.6 1198 | whatwg-mimetype: 3.0.0 1199 | whatwg-url: 11.0.0 1200 | dev: false 1201 | 1202 | /dayjs/1.11.5: 1203 | resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==} 1204 | dev: false 1205 | 1206 | /debug/2.6.9: 1207 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 1208 | peerDependencies: 1209 | supports-color: '*' 1210 | peerDependenciesMeta: 1211 | supports-color: 1212 | optional: true 1213 | dependencies: 1214 | ms: 2.0.0 1215 | dev: false 1216 | 1217 | /debug/4.3.4: 1218 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1219 | engines: {node: '>=6.0'} 1220 | peerDependencies: 1221 | supports-color: '*' 1222 | peerDependenciesMeta: 1223 | supports-color: 1224 | optional: true 1225 | dependencies: 1226 | ms: 2.1.2 1227 | dev: false 1228 | 1229 | /decimal.js/10.4.2: 1230 | resolution: {integrity: sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==} 1231 | dev: false 1232 | 1233 | /deep-is/0.1.4: 1234 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1235 | dev: false 1236 | 1237 | /deferred-leveldown/0.2.0: 1238 | resolution: {integrity: sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==} 1239 | dependencies: 1240 | abstract-leveldown: 0.12.4 1241 | dev: true 1242 | 1243 | /delayed-stream/1.0.0: 1244 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 1245 | engines: {node: '>=0.4.0'} 1246 | dev: false 1247 | 1248 | /delegates/1.0.0: 1249 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 1250 | dev: false 1251 | 1252 | /depd/1.1.2: 1253 | resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} 1254 | engines: {node: '>= 0.6'} 1255 | dev: false 1256 | 1257 | /deprecation/2.3.1: 1258 | resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} 1259 | dev: false 1260 | 1261 | /des.js/1.0.1: 1262 | resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} 1263 | dependencies: 1264 | inherits: 2.0.4 1265 | minimalistic-assert: 1.0.1 1266 | dev: true 1267 | 1268 | /diffie-hellman/5.0.3: 1269 | resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} 1270 | dependencies: 1271 | bn.js: 4.12.0 1272 | miller-rabin: 4.0.1 1273 | randombytes: 2.1.0 1274 | dev: true 1275 | 1276 | /dom-serializer/2.0.0: 1277 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 1278 | dependencies: 1279 | domelementtype: 2.3.0 1280 | domhandler: 5.0.3 1281 | entities: 4.4.0 1282 | dev: false 1283 | 1284 | /dom-walk/0.1.2: 1285 | resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} 1286 | dev: false 1287 | 1288 | /domelementtype/2.3.0: 1289 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 1290 | dev: false 1291 | 1292 | /domexception/4.0.0: 1293 | resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} 1294 | engines: {node: '>=12'} 1295 | dependencies: 1296 | webidl-conversions: 7.0.0 1297 | dev: false 1298 | 1299 | /domhandler/5.0.3: 1300 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 1301 | engines: {node: '>= 4'} 1302 | dependencies: 1303 | domelementtype: 2.3.0 1304 | dev: false 1305 | 1306 | /domutils/3.0.1: 1307 | resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} 1308 | dependencies: 1309 | dom-serializer: 2.0.0 1310 | domelementtype: 2.3.0 1311 | domhandler: 5.0.3 1312 | dev: false 1313 | 1314 | /dotenv/10.0.0: 1315 | resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} 1316 | engines: {node: '>=10'} 1317 | 1318 | /elliptic/6.5.4: 1319 | resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} 1320 | dependencies: 1321 | bn.js: 4.12.0 1322 | brorand: 1.1.0 1323 | hash.js: 1.1.7 1324 | hmac-drbg: 1.0.1 1325 | inherits: 2.0.4 1326 | minimalistic-assert: 1.0.1 1327 | minimalistic-crypto-utils: 1.0.1 1328 | dev: true 1329 | 1330 | /emoji-regex/8.0.0: 1331 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1332 | dev: false 1333 | 1334 | /encoding/0.1.12: 1335 | resolution: {integrity: sha512-bl1LAgiQc4ZWr++pNYUdRe/alecaHFeHxIJ/pNciqGdKXghaTCOwKkbKp6ye7pKZGu/GcaSXFk8PBVhgs+dJdA==} 1336 | dependencies: 1337 | iconv-lite: 0.4.24 1338 | dev: false 1339 | 1340 | /encoding/0.1.13: 1341 | resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} 1342 | requiresBuild: true 1343 | dependencies: 1344 | iconv-lite: 0.6.3 1345 | dev: false 1346 | optional: true 1347 | 1348 | /entities/4.4.0: 1349 | resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} 1350 | engines: {node: '>=0.12'} 1351 | dev: false 1352 | 1353 | /env-paths/2.2.1: 1354 | resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} 1355 | engines: {node: '>=6'} 1356 | dev: false 1357 | 1358 | /err-code/2.0.3: 1359 | resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 1360 | dev: false 1361 | 1362 | /errno/0.1.8: 1363 | resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} 1364 | hasBin: true 1365 | dependencies: 1366 | prr: 1.0.1 1367 | dev: true 1368 | 1369 | /es5-ext/0.10.62: 1370 | resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} 1371 | engines: {node: '>=0.10'} 1372 | requiresBuild: true 1373 | dependencies: 1374 | es6-iterator: 2.0.3 1375 | es6-symbol: 3.1.3 1376 | next-tick: 1.1.0 1377 | dev: false 1378 | 1379 | /es6-iterator/2.0.3: 1380 | resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} 1381 | dependencies: 1382 | d: 1.0.1 1383 | es5-ext: 0.10.62 1384 | es6-symbol: 3.1.3 1385 | dev: false 1386 | 1387 | /es6-symbol/3.1.3: 1388 | resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} 1389 | dependencies: 1390 | d: 1.0.1 1391 | ext: 1.7.0 1392 | dev: false 1393 | 1394 | /esbuild-android-64/0.14.51: 1395 | resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==} 1396 | engines: {node: '>=12'} 1397 | cpu: [x64] 1398 | os: [android] 1399 | requiresBuild: true 1400 | dev: false 1401 | optional: true 1402 | 1403 | /esbuild-android-64/0.14.54: 1404 | resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} 1405 | engines: {node: '>=12'} 1406 | cpu: [x64] 1407 | os: [android] 1408 | requiresBuild: true 1409 | dev: true 1410 | optional: true 1411 | 1412 | /esbuild-android-arm64/0.14.51: 1413 | resolution: {integrity: sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==} 1414 | engines: {node: '>=12'} 1415 | cpu: [arm64] 1416 | os: [android] 1417 | requiresBuild: true 1418 | dev: false 1419 | optional: true 1420 | 1421 | /esbuild-android-arm64/0.14.54: 1422 | resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} 1423 | engines: {node: '>=12'} 1424 | cpu: [arm64] 1425 | os: [android] 1426 | requiresBuild: true 1427 | dev: true 1428 | optional: true 1429 | 1430 | /esbuild-darwin-64/0.14.51: 1431 | resolution: {integrity: sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==} 1432 | engines: {node: '>=12'} 1433 | cpu: [x64] 1434 | os: [darwin] 1435 | requiresBuild: true 1436 | dev: false 1437 | optional: true 1438 | 1439 | /esbuild-darwin-64/0.14.54: 1440 | resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} 1441 | engines: {node: '>=12'} 1442 | cpu: [x64] 1443 | os: [darwin] 1444 | requiresBuild: true 1445 | dev: true 1446 | optional: true 1447 | 1448 | /esbuild-darwin-arm64/0.14.51: 1449 | resolution: {integrity: sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==} 1450 | engines: {node: '>=12'} 1451 | cpu: [arm64] 1452 | os: [darwin] 1453 | requiresBuild: true 1454 | dev: false 1455 | optional: true 1456 | 1457 | /esbuild-darwin-arm64/0.14.54: 1458 | resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} 1459 | engines: {node: '>=12'} 1460 | cpu: [arm64] 1461 | os: [darwin] 1462 | requiresBuild: true 1463 | dev: true 1464 | optional: true 1465 | 1466 | /esbuild-freebsd-64/0.14.51: 1467 | resolution: {integrity: sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==} 1468 | engines: {node: '>=12'} 1469 | cpu: [x64] 1470 | os: [freebsd] 1471 | requiresBuild: true 1472 | dev: false 1473 | optional: true 1474 | 1475 | /esbuild-freebsd-64/0.14.54: 1476 | resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} 1477 | engines: {node: '>=12'} 1478 | cpu: [x64] 1479 | os: [freebsd] 1480 | requiresBuild: true 1481 | dev: true 1482 | optional: true 1483 | 1484 | /esbuild-freebsd-arm64/0.14.51: 1485 | resolution: {integrity: sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==} 1486 | engines: {node: '>=12'} 1487 | cpu: [arm64] 1488 | os: [freebsd] 1489 | requiresBuild: true 1490 | dev: false 1491 | optional: true 1492 | 1493 | /esbuild-freebsd-arm64/0.14.54: 1494 | resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} 1495 | engines: {node: '>=12'} 1496 | cpu: [arm64] 1497 | os: [freebsd] 1498 | requiresBuild: true 1499 | dev: true 1500 | optional: true 1501 | 1502 | /esbuild-linux-32/0.14.51: 1503 | resolution: {integrity: sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==} 1504 | engines: {node: '>=12'} 1505 | cpu: [ia32] 1506 | os: [linux] 1507 | requiresBuild: true 1508 | dev: false 1509 | optional: true 1510 | 1511 | /esbuild-linux-32/0.14.54: 1512 | resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} 1513 | engines: {node: '>=12'} 1514 | cpu: [ia32] 1515 | os: [linux] 1516 | requiresBuild: true 1517 | dev: true 1518 | optional: true 1519 | 1520 | /esbuild-linux-64/0.14.51: 1521 | resolution: {integrity: sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==} 1522 | engines: {node: '>=12'} 1523 | cpu: [x64] 1524 | os: [linux] 1525 | requiresBuild: true 1526 | dev: false 1527 | optional: true 1528 | 1529 | /esbuild-linux-64/0.14.54: 1530 | resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} 1531 | engines: {node: '>=12'} 1532 | cpu: [x64] 1533 | os: [linux] 1534 | requiresBuild: true 1535 | dev: true 1536 | optional: true 1537 | 1538 | /esbuild-linux-arm/0.14.51: 1539 | resolution: {integrity: sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==} 1540 | engines: {node: '>=12'} 1541 | cpu: [arm] 1542 | os: [linux] 1543 | requiresBuild: true 1544 | dev: false 1545 | optional: true 1546 | 1547 | /esbuild-linux-arm/0.14.54: 1548 | resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} 1549 | engines: {node: '>=12'} 1550 | cpu: [arm] 1551 | os: [linux] 1552 | requiresBuild: true 1553 | dev: true 1554 | optional: true 1555 | 1556 | /esbuild-linux-arm64/0.14.51: 1557 | resolution: {integrity: sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==} 1558 | engines: {node: '>=12'} 1559 | cpu: [arm64] 1560 | os: [linux] 1561 | requiresBuild: true 1562 | dev: false 1563 | optional: true 1564 | 1565 | /esbuild-linux-arm64/0.14.54: 1566 | resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} 1567 | engines: {node: '>=12'} 1568 | cpu: [arm64] 1569 | os: [linux] 1570 | requiresBuild: true 1571 | dev: true 1572 | optional: true 1573 | 1574 | /esbuild-linux-mips64le/0.14.51: 1575 | resolution: {integrity: sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==} 1576 | engines: {node: '>=12'} 1577 | cpu: [mips64el] 1578 | os: [linux] 1579 | requiresBuild: true 1580 | dev: false 1581 | optional: true 1582 | 1583 | /esbuild-linux-mips64le/0.14.54: 1584 | resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} 1585 | engines: {node: '>=12'} 1586 | cpu: [mips64el] 1587 | os: [linux] 1588 | requiresBuild: true 1589 | dev: true 1590 | optional: true 1591 | 1592 | /esbuild-linux-ppc64le/0.14.51: 1593 | resolution: {integrity: sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==} 1594 | engines: {node: '>=12'} 1595 | cpu: [ppc64] 1596 | os: [linux] 1597 | requiresBuild: true 1598 | dev: false 1599 | optional: true 1600 | 1601 | /esbuild-linux-ppc64le/0.14.54: 1602 | resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} 1603 | engines: {node: '>=12'} 1604 | cpu: [ppc64] 1605 | os: [linux] 1606 | requiresBuild: true 1607 | dev: true 1608 | optional: true 1609 | 1610 | /esbuild-linux-riscv64/0.14.51: 1611 | resolution: {integrity: sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==} 1612 | engines: {node: '>=12'} 1613 | cpu: [riscv64] 1614 | os: [linux] 1615 | requiresBuild: true 1616 | dev: false 1617 | optional: true 1618 | 1619 | /esbuild-linux-riscv64/0.14.54: 1620 | resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} 1621 | engines: {node: '>=12'} 1622 | cpu: [riscv64] 1623 | os: [linux] 1624 | requiresBuild: true 1625 | dev: true 1626 | optional: true 1627 | 1628 | /esbuild-linux-s390x/0.14.51: 1629 | resolution: {integrity: sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==} 1630 | engines: {node: '>=12'} 1631 | cpu: [s390x] 1632 | os: [linux] 1633 | requiresBuild: true 1634 | dev: false 1635 | optional: true 1636 | 1637 | /esbuild-linux-s390x/0.14.54: 1638 | resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} 1639 | engines: {node: '>=12'} 1640 | cpu: [s390x] 1641 | os: [linux] 1642 | requiresBuild: true 1643 | dev: true 1644 | optional: true 1645 | 1646 | /esbuild-netbsd-64/0.14.51: 1647 | resolution: {integrity: sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==} 1648 | engines: {node: '>=12'} 1649 | cpu: [x64] 1650 | os: [netbsd] 1651 | requiresBuild: true 1652 | dev: false 1653 | optional: true 1654 | 1655 | /esbuild-netbsd-64/0.14.54: 1656 | resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} 1657 | engines: {node: '>=12'} 1658 | cpu: [x64] 1659 | os: [netbsd] 1660 | requiresBuild: true 1661 | dev: true 1662 | optional: true 1663 | 1664 | /esbuild-openbsd-64/0.14.51: 1665 | resolution: {integrity: sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==} 1666 | engines: {node: '>=12'} 1667 | cpu: [x64] 1668 | os: [openbsd] 1669 | requiresBuild: true 1670 | dev: false 1671 | optional: true 1672 | 1673 | /esbuild-openbsd-64/0.14.54: 1674 | resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} 1675 | engines: {node: '>=12'} 1676 | cpu: [x64] 1677 | os: [openbsd] 1678 | requiresBuild: true 1679 | dev: true 1680 | optional: true 1681 | 1682 | /esbuild-sunos-64/0.14.51: 1683 | resolution: {integrity: sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==} 1684 | engines: {node: '>=12'} 1685 | cpu: [x64] 1686 | os: [sunos] 1687 | requiresBuild: true 1688 | dev: false 1689 | optional: true 1690 | 1691 | /esbuild-sunos-64/0.14.54: 1692 | resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} 1693 | engines: {node: '>=12'} 1694 | cpu: [x64] 1695 | os: [sunos] 1696 | requiresBuild: true 1697 | dev: true 1698 | optional: true 1699 | 1700 | /esbuild-windows-32/0.14.51: 1701 | resolution: {integrity: sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==} 1702 | engines: {node: '>=12'} 1703 | cpu: [ia32] 1704 | os: [win32] 1705 | requiresBuild: true 1706 | dev: false 1707 | optional: true 1708 | 1709 | /esbuild-windows-32/0.14.54: 1710 | resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} 1711 | engines: {node: '>=12'} 1712 | cpu: [ia32] 1713 | os: [win32] 1714 | requiresBuild: true 1715 | dev: true 1716 | optional: true 1717 | 1718 | /esbuild-windows-64/0.14.51: 1719 | resolution: {integrity: sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==} 1720 | engines: {node: '>=12'} 1721 | cpu: [x64] 1722 | os: [win32] 1723 | requiresBuild: true 1724 | dev: false 1725 | optional: true 1726 | 1727 | /esbuild-windows-64/0.14.54: 1728 | resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} 1729 | engines: {node: '>=12'} 1730 | cpu: [x64] 1731 | os: [win32] 1732 | requiresBuild: true 1733 | dev: true 1734 | optional: true 1735 | 1736 | /esbuild-windows-arm64/0.14.51: 1737 | resolution: {integrity: sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==} 1738 | engines: {node: '>=12'} 1739 | cpu: [arm64] 1740 | os: [win32] 1741 | requiresBuild: true 1742 | dev: false 1743 | optional: true 1744 | 1745 | /esbuild-windows-arm64/0.14.54: 1746 | resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} 1747 | engines: {node: '>=12'} 1748 | cpu: [arm64] 1749 | os: [win32] 1750 | requiresBuild: true 1751 | dev: true 1752 | optional: true 1753 | 1754 | /esbuild/0.14.51: 1755 | resolution: {integrity: sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==} 1756 | engines: {node: '>=12'} 1757 | hasBin: true 1758 | requiresBuild: true 1759 | optionalDependencies: 1760 | esbuild-android-64: 0.14.51 1761 | esbuild-android-arm64: 0.14.51 1762 | esbuild-darwin-64: 0.14.51 1763 | esbuild-darwin-arm64: 0.14.51 1764 | esbuild-freebsd-64: 0.14.51 1765 | esbuild-freebsd-arm64: 0.14.51 1766 | esbuild-linux-32: 0.14.51 1767 | esbuild-linux-64: 0.14.51 1768 | esbuild-linux-arm: 0.14.51 1769 | esbuild-linux-arm64: 0.14.51 1770 | esbuild-linux-mips64le: 0.14.51 1771 | esbuild-linux-ppc64le: 0.14.51 1772 | esbuild-linux-riscv64: 0.14.51 1773 | esbuild-linux-s390x: 0.14.51 1774 | esbuild-netbsd-64: 0.14.51 1775 | esbuild-openbsd-64: 0.14.51 1776 | esbuild-sunos-64: 0.14.51 1777 | esbuild-windows-32: 0.14.51 1778 | esbuild-windows-64: 0.14.51 1779 | esbuild-windows-arm64: 0.14.51 1780 | dev: false 1781 | 1782 | /esbuild/0.14.54: 1783 | resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} 1784 | engines: {node: '>=12'} 1785 | hasBin: true 1786 | requiresBuild: true 1787 | optionalDependencies: 1788 | '@esbuild/linux-loong64': 0.14.54 1789 | esbuild-android-64: 0.14.54 1790 | esbuild-android-arm64: 0.14.54 1791 | esbuild-darwin-64: 0.14.54 1792 | esbuild-darwin-arm64: 0.14.54 1793 | esbuild-freebsd-64: 0.14.54 1794 | esbuild-freebsd-arm64: 0.14.54 1795 | esbuild-linux-32: 0.14.54 1796 | esbuild-linux-64: 0.14.54 1797 | esbuild-linux-arm: 0.14.54 1798 | esbuild-linux-arm64: 0.14.54 1799 | esbuild-linux-mips64le: 0.14.54 1800 | esbuild-linux-ppc64le: 0.14.54 1801 | esbuild-linux-riscv64: 0.14.54 1802 | esbuild-linux-s390x: 0.14.54 1803 | esbuild-netbsd-64: 0.14.54 1804 | esbuild-openbsd-64: 0.14.54 1805 | esbuild-sunos-64: 0.14.54 1806 | esbuild-windows-32: 0.14.54 1807 | esbuild-windows-64: 0.14.54 1808 | esbuild-windows-arm64: 0.14.54 1809 | dev: true 1810 | 1811 | /escape-string-regexp/4.0.0: 1812 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1813 | engines: {node: '>=10'} 1814 | dev: false 1815 | 1816 | /escodegen/2.0.0: 1817 | resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} 1818 | engines: {node: '>=6.0'} 1819 | hasBin: true 1820 | dependencies: 1821 | esprima: 4.0.1 1822 | estraverse: 5.3.0 1823 | esutils: 2.0.3 1824 | optionator: 0.8.3 1825 | optionalDependencies: 1826 | source-map: 0.6.1 1827 | dev: false 1828 | 1829 | /esprima/4.0.1: 1830 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1831 | engines: {node: '>=4'} 1832 | hasBin: true 1833 | dev: false 1834 | 1835 | /estraverse/5.3.0: 1836 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1837 | engines: {node: '>=4.0'} 1838 | dev: false 1839 | 1840 | /estree-walker/0.5.2: 1841 | resolution: {integrity: sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==} 1842 | dev: true 1843 | 1844 | /estree-walker/0.6.1: 1845 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 1846 | 1847 | /esutils/2.0.3: 1848 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1849 | engines: {node: '>=0.10.0'} 1850 | dev: false 1851 | 1852 | /evp_bytestokey/1.0.3: 1853 | resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} 1854 | dependencies: 1855 | md5.js: 1.3.5 1856 | safe-buffer: 5.2.1 1857 | dev: true 1858 | 1859 | /execa/6.1.0: 1860 | resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} 1861 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1862 | dependencies: 1863 | cross-spawn: 7.0.3 1864 | get-stream: 6.0.1 1865 | human-signals: 3.0.1 1866 | is-stream: 3.0.0 1867 | merge-stream: 2.0.0 1868 | npm-run-path: 5.1.0 1869 | onetime: 6.0.0 1870 | signal-exit: 3.0.7 1871 | strip-final-newline: 3.0.0 1872 | 1873 | /ext/1.7.0: 1874 | resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} 1875 | dependencies: 1876 | type: 2.7.2 1877 | dev: false 1878 | 1879 | /fast-levenshtein/2.0.6: 1880 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1881 | dev: false 1882 | 1883 | /fetch/1.1.0: 1884 | resolution: {integrity: sha512-5O8TwrGzoNblBG/jtK4NFuZwNCkZX6s5GfRNOaGtm+QGJEuNakSC/i2RW0R93KX6E0jVjNXm6O3CRN4Ql3K+yA==} 1885 | dependencies: 1886 | biskviit: 1.0.1 1887 | encoding: 0.1.12 1888 | dev: false 1889 | 1890 | /file-extension/4.0.5: 1891 | resolution: {integrity: sha512-l0rOL3aKkoi6ea7MNZe6OHgqYYpn48Qfflr8Pe9G9JPPTx5A+sfboK91ZufzIs59/lPqh351l0eb6iKU9J5oGg==} 1892 | engines: {node: '>=4'} 1893 | dev: false 1894 | 1895 | /fill-range/7.0.1: 1896 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1897 | engines: {node: '>=8'} 1898 | dependencies: 1899 | to-regex-range: 5.0.1 1900 | dev: false 1901 | 1902 | /foreach/2.0.6: 1903 | resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} 1904 | dev: true 1905 | 1906 | /form-data/4.0.0: 1907 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 1908 | engines: {node: '>= 6'} 1909 | dependencies: 1910 | asynckit: 0.4.0 1911 | combined-stream: 1.0.8 1912 | mime-types: 2.1.35 1913 | dev: false 1914 | 1915 | /fs-minipass/2.1.0: 1916 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 1917 | engines: {node: '>= 8'} 1918 | dependencies: 1919 | minipass: 3.3.4 1920 | dev: false 1921 | 1922 | /fs.realpath/1.0.0: 1923 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1924 | dev: false 1925 | 1926 | /fsevents/2.3.2: 1927 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1928 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1929 | os: [darwin] 1930 | requiresBuild: true 1931 | optional: true 1932 | 1933 | /function-bind/1.1.1: 1934 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1935 | dev: true 1936 | 1937 | /fwd-stream/1.0.4: 1938 | resolution: {integrity: sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==} 1939 | dependencies: 1940 | readable-stream: 1.0.34 1941 | dev: true 1942 | 1943 | /gauge/4.0.4: 1944 | resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} 1945 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1946 | dependencies: 1947 | aproba: 2.0.0 1948 | color-support: 1.1.3 1949 | console-control-strings: 1.1.0 1950 | has-unicode: 2.0.1 1951 | signal-exit: 3.0.7 1952 | string-width: 4.2.3 1953 | strip-ansi: 6.0.1 1954 | wide-align: 1.1.5 1955 | dev: false 1956 | 1957 | /get-stream/6.0.1: 1958 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1959 | engines: {node: '>=10'} 1960 | 1961 | /glob-parent/5.1.2: 1962 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1963 | engines: {node: '>= 6'} 1964 | dependencies: 1965 | is-glob: 4.0.3 1966 | dev: false 1967 | 1968 | /glob/7.2.3: 1969 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1970 | dependencies: 1971 | fs.realpath: 1.0.0 1972 | inflight: 1.0.6 1973 | inherits: 2.0.4 1974 | minimatch: 3.1.2 1975 | once: 1.4.0 1976 | path-is-absolute: 1.0.1 1977 | dev: false 1978 | 1979 | /glob/8.0.3: 1980 | resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} 1981 | engines: {node: '>=12'} 1982 | dependencies: 1983 | fs.realpath: 1.0.0 1984 | inflight: 1.0.6 1985 | inherits: 2.0.4 1986 | minimatch: 5.1.0 1987 | once: 1.4.0 1988 | dev: false 1989 | 1990 | /global/4.4.0: 1991 | resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} 1992 | dependencies: 1993 | min-document: 2.19.0 1994 | process: 0.11.10 1995 | dev: false 1996 | 1997 | /graceful-fs/4.2.10: 1998 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 1999 | dev: false 2000 | 2001 | /has-unicode/2.0.1: 2002 | resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 2003 | dev: false 2004 | 2005 | /has-values/2.0.1: 2006 | resolution: {integrity: sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w==} 2007 | engines: {node: '>=6'} 2008 | dependencies: 2009 | kind-of: 6.0.3 2010 | dev: false 2011 | 2012 | /has/1.0.3: 2013 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 2014 | engines: {node: '>= 0.4.0'} 2015 | dependencies: 2016 | function-bind: 1.1.1 2017 | dev: true 2018 | 2019 | /hash-base/3.1.0: 2020 | resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} 2021 | engines: {node: '>=4'} 2022 | dependencies: 2023 | inherits: 2.0.4 2024 | readable-stream: 3.6.0 2025 | safe-buffer: 5.2.1 2026 | dev: true 2027 | 2028 | /hash.js/1.1.7: 2029 | resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} 2030 | dependencies: 2031 | inherits: 2.0.4 2032 | minimalistic-assert: 1.0.1 2033 | dev: true 2034 | 2035 | /hmac-drbg/1.0.1: 2036 | resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} 2037 | dependencies: 2038 | hash.js: 1.1.7 2039 | minimalistic-assert: 1.0.1 2040 | minimalistic-crypto-utils: 1.0.1 2041 | dev: true 2042 | 2043 | /html-encoding-sniffer/3.0.0: 2044 | resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} 2045 | engines: {node: '>=12'} 2046 | dependencies: 2047 | whatwg-encoding: 2.0.0 2048 | dev: false 2049 | 2050 | /html-rewriter-wasm/0.4.1: 2051 | resolution: {integrity: sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==} 2052 | 2053 | /htmlparser2/8.0.1: 2054 | resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} 2055 | dependencies: 2056 | domelementtype: 2.3.0 2057 | domhandler: 5.0.3 2058 | domutils: 3.0.1 2059 | entities: 4.4.0 2060 | dev: false 2061 | 2062 | /http-cache-semantics/4.1.0: 2063 | resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} 2064 | 2065 | /http-proxy-agent/5.0.0: 2066 | resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} 2067 | engines: {node: '>= 6'} 2068 | dependencies: 2069 | '@tootallnate/once': 2.0.0 2070 | agent-base: 6.0.2 2071 | debug: 4.3.4 2072 | transitivePeerDependencies: 2073 | - supports-color 2074 | dev: false 2075 | 2076 | /https-proxy-agent/5.0.1: 2077 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 2078 | engines: {node: '>= 6'} 2079 | dependencies: 2080 | agent-base: 6.0.2 2081 | debug: 4.3.4 2082 | transitivePeerDependencies: 2083 | - supports-color 2084 | dev: false 2085 | 2086 | /human-signals/3.0.1: 2087 | resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} 2088 | engines: {node: '>=12.20.0'} 2089 | 2090 | /humanize-ms/1.2.1: 2091 | resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} 2092 | dependencies: 2093 | ms: 2.1.3 2094 | dev: false 2095 | 2096 | /iconv-lite/0.4.24: 2097 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 2098 | engines: {node: '>=0.10.0'} 2099 | dependencies: 2100 | safer-buffer: 2.1.2 2101 | dev: false 2102 | 2103 | /iconv-lite/0.6.3: 2104 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 2105 | engines: {node: '>=0.10.0'} 2106 | dependencies: 2107 | safer-buffer: 2.1.2 2108 | dev: false 2109 | 2110 | /idb-wrapper/1.7.2: 2111 | resolution: {integrity: sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==} 2112 | dev: true 2113 | 2114 | /image-extensions/1.1.0: 2115 | resolution: {integrity: sha512-P0t7ByhK8Jk9TU05ct/7+f7h8dNuXq5OY4m0IO/T+1aga/qHkpC0Wf472x3FLdq/zFDG17pgapCM3JDTxwZzow==} 2116 | engines: {node: '>=0.10.0'} 2117 | dev: false 2118 | 2119 | /imurmurhash/0.1.4: 2120 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 2121 | engines: {node: '>=0.8.19'} 2122 | dev: false 2123 | 2124 | /indent-string/4.0.0: 2125 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 2126 | engines: {node: '>=8'} 2127 | dev: false 2128 | 2129 | /indexof/0.0.1: 2130 | resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} 2131 | dev: true 2132 | 2133 | /infer-owner/1.0.4: 2134 | resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} 2135 | dev: false 2136 | 2137 | /inflight/1.0.6: 2138 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 2139 | dependencies: 2140 | once: 1.4.0 2141 | wrappy: 1.0.2 2142 | dev: false 2143 | 2144 | /inherits/2.0.4: 2145 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 2146 | 2147 | /install-artifact-from-github/1.3.1: 2148 | resolution: {integrity: sha512-3l3Bymg2eKDsN5wQuMfgGEj2x6l5MCAv0zPL6rxHESufFVlEAKW/6oY9F1aGgvY/EgWm5+eWGRjINveL4X7Hgg==} 2149 | hasBin: true 2150 | dev: false 2151 | 2152 | /ip-regex/4.3.0: 2153 | resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} 2154 | engines: {node: '>=8'} 2155 | dev: false 2156 | 2157 | /ip/2.0.0: 2158 | resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} 2159 | dev: false 2160 | 2161 | /is-absolute-url/3.0.3: 2162 | resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} 2163 | engines: {node: '>=8'} 2164 | dev: false 2165 | 2166 | /is-binary-path/2.1.0: 2167 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 2168 | engines: {node: '>=8'} 2169 | dependencies: 2170 | binary-extensions: 2.2.0 2171 | dev: false 2172 | 2173 | /is-core-module/2.10.0: 2174 | resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} 2175 | dependencies: 2176 | has: 1.0.3 2177 | dev: true 2178 | 2179 | /is-extglob/2.1.1: 2180 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 2181 | engines: {node: '>=0.10.0'} 2182 | dev: false 2183 | 2184 | /is-fullwidth-code-point/3.0.0: 2185 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 2186 | engines: {node: '>=8'} 2187 | dev: false 2188 | 2189 | /is-glob/4.0.3: 2190 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 2191 | engines: {node: '>=0.10.0'} 2192 | dependencies: 2193 | is-extglob: 2.1.1 2194 | dev: false 2195 | 2196 | /is-lambda/1.0.1: 2197 | resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} 2198 | dev: false 2199 | 2200 | /is-number/7.0.0: 2201 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 2202 | engines: {node: '>=0.12.0'} 2203 | dev: false 2204 | 2205 | /is-object/0.1.2: 2206 | resolution: {integrity: sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==} 2207 | dev: true 2208 | 2209 | /is-plain-object/5.0.0: 2210 | resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} 2211 | engines: {node: '>=0.10.0'} 2212 | dev: false 2213 | 2214 | /is-potential-custom-element-name/1.0.1: 2215 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 2216 | dev: false 2217 | 2218 | /is-relative-url/3.0.0: 2219 | resolution: {integrity: sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA==} 2220 | engines: {node: '>=8'} 2221 | dependencies: 2222 | is-absolute-url: 3.0.3 2223 | dev: false 2224 | 2225 | /is-stream/3.0.0: 2226 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 2227 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2228 | 2229 | /is-typedarray/1.0.0: 2230 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 2231 | dev: false 2232 | 2233 | /is-uri/1.2.4: 2234 | resolution: {integrity: sha512-8sHi5gEARwpMYwJD9uSAkU9Bb7YkSagcM10EYqSe+osqOErXln4VL+EgLSG40e9lVTpcpygpvb9Z6ohZpECDGA==} 2235 | engines: {node: '>= 4'} 2236 | dependencies: 2237 | parse-uri: 1.0.7 2238 | punycode2: 1.0.1 2239 | dev: false 2240 | 2241 | /is/0.2.7: 2242 | resolution: {integrity: sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==} 2243 | dev: true 2244 | 2245 | /isarray/0.0.1: 2246 | resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} 2247 | dev: true 2248 | 2249 | /isarray/1.0.0: 2250 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 2251 | dev: true 2252 | 2253 | /isbuffer/0.0.0: 2254 | resolution: {integrity: sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==} 2255 | dev: true 2256 | 2257 | /isexe/2.0.0: 2258 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2259 | 2260 | /iso-639-3/2.2.0: 2261 | resolution: {integrity: sha512-v9w/U4XDSfXCrXxf4E6ertGC/lTRX8MLLv7XC1j6N5oL3ympe38jp77zgeyMsn3MbufuAAoGeVzDJbOXnPTMhQ==} 2262 | dev: false 2263 | 2264 | /isostring/0.0.1: 2265 | resolution: {integrity: sha512-wRcdJtXCe2LGtXnD14fXMkduWVdbeGkzBIKg8WcKeEOi6SIc+hRjYYw76WNx3v5FebhUWZrBTWB0NOl3/sagdQ==} 2266 | dev: false 2267 | 2268 | /itty-router-extras/0.4.2: 2269 | resolution: {integrity: sha512-ppHaBzcTXs7idFSDISehG+8kif2/4aqLCfyY/Y/uIZv79sfEfNmTq9G+rDeqblun/VZRBiXZD8ztYmMS8EOsKw==} 2270 | dev: false 2271 | 2272 | /itty-router/2.6.6: 2273 | resolution: {integrity: sha512-hIPHtXGymCX7Lzb2I4G6JgZFE4QEEQwst9GORK7sMYUpJvLfy4yZJr95r04e8DzoAnj6HcxM2m4TbK+juu+18g==} 2274 | 2275 | /jsdom/20.0.1: 2276 | resolution: {integrity: sha512-pksjj7Rqoa+wdpkKcLzQRHhJCEE42qQhl/xLMUKHgoSejaKOdaXEAnqs6uDNwMl/fciHTzKeR8Wm8cw7N+g98A==} 2277 | engines: {node: '>=14'} 2278 | peerDependencies: 2279 | canvas: ^2.5.0 2280 | peerDependenciesMeta: 2281 | canvas: 2282 | optional: true 2283 | dependencies: 2284 | abab: 2.0.6 2285 | acorn: 8.8.0 2286 | acorn-globals: 7.0.1 2287 | cssom: 0.5.0 2288 | cssstyle: 2.3.0 2289 | data-urls: 3.0.2 2290 | decimal.js: 10.4.2 2291 | domexception: 4.0.0 2292 | escodegen: 2.0.0 2293 | form-data: 4.0.0 2294 | html-encoding-sniffer: 3.0.0 2295 | http-proxy-agent: 5.0.0 2296 | https-proxy-agent: 5.0.1 2297 | is-potential-custom-element-name: 1.0.1 2298 | nwsapi: 2.2.2 2299 | parse5: 7.1.1 2300 | saxes: 6.0.0 2301 | symbol-tree: 3.2.4 2302 | tough-cookie: 4.1.2 2303 | w3c-xmlserializer: 3.0.0 2304 | webidl-conversions: 7.0.0 2305 | whatwg-encoding: 2.0.0 2306 | whatwg-mimetype: 3.0.0 2307 | whatwg-url: 11.0.0 2308 | ws: 8.9.0 2309 | xml-name-validator: 4.0.0 2310 | transitivePeerDependencies: 2311 | - bufferutil 2312 | - supports-color 2313 | - utf-8-validate 2314 | dev: false 2315 | 2316 | /kind-of/6.0.3: 2317 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 2318 | engines: {node: '>=0.10.0'} 2319 | dev: false 2320 | 2321 | /kleur/4.1.5: 2322 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 2323 | engines: {node: '>=6'} 2324 | 2325 | /level-blobs/0.1.7: 2326 | resolution: {integrity: sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==} 2327 | dependencies: 2328 | level-peek: 1.0.6 2329 | once: 1.4.0 2330 | readable-stream: 1.1.14 2331 | dev: true 2332 | 2333 | /level-filesystem/1.2.0: 2334 | resolution: {integrity: sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==} 2335 | dependencies: 2336 | concat-stream: 1.6.2 2337 | errno: 0.1.8 2338 | fwd-stream: 1.0.4 2339 | level-blobs: 0.1.7 2340 | level-peek: 1.0.6 2341 | level-sublevel: 5.2.3 2342 | octal: 1.0.0 2343 | once: 1.4.0 2344 | xtend: 2.2.0 2345 | dev: true 2346 | 2347 | /level-fix-range/1.0.2: 2348 | resolution: {integrity: sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==} 2349 | dev: true 2350 | 2351 | /level-fix-range/2.0.0: 2352 | resolution: {integrity: sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==} 2353 | dependencies: 2354 | clone: 0.1.19 2355 | dev: true 2356 | 2357 | /level-hooks/4.5.0: 2358 | resolution: {integrity: sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==} 2359 | dependencies: 2360 | string-range: 1.2.2 2361 | dev: true 2362 | 2363 | /level-js/2.2.4: 2364 | resolution: {integrity: sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==} 2365 | dependencies: 2366 | abstract-leveldown: 0.12.4 2367 | idb-wrapper: 1.7.2 2368 | isbuffer: 0.0.0 2369 | ltgt: 2.2.1 2370 | typedarray-to-buffer: 1.0.4 2371 | xtend: 2.1.2 2372 | dev: true 2373 | 2374 | /level-peek/1.0.6: 2375 | resolution: {integrity: sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==} 2376 | dependencies: 2377 | level-fix-range: 1.0.2 2378 | dev: true 2379 | 2380 | /level-sublevel/5.2.3: 2381 | resolution: {integrity: sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==} 2382 | dependencies: 2383 | level-fix-range: 2.0.0 2384 | level-hooks: 4.5.0 2385 | string-range: 1.2.2 2386 | xtend: 2.0.6 2387 | dev: true 2388 | 2389 | /levelup/0.18.6: 2390 | resolution: {integrity: sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==} 2391 | dependencies: 2392 | bl: 0.8.2 2393 | deferred-leveldown: 0.2.0 2394 | errno: 0.1.8 2395 | prr: 0.0.0 2396 | readable-stream: 1.0.34 2397 | semver: 2.3.2 2398 | xtend: 3.0.0 2399 | dev: true 2400 | 2401 | /levn/0.3.0: 2402 | resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} 2403 | engines: {node: '>= 0.8.0'} 2404 | dependencies: 2405 | prelude-ls: 1.1.2 2406 | type-check: 0.3.2 2407 | dev: false 2408 | 2409 | /lodash/4.17.21: 2410 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2411 | dev: false 2412 | 2413 | /lru-cache/6.0.0: 2414 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2415 | engines: {node: '>=10'} 2416 | dependencies: 2417 | yallist: 4.0.0 2418 | 2419 | /lru-cache/7.14.0: 2420 | resolution: {integrity: sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==} 2421 | engines: {node: '>=12'} 2422 | dev: false 2423 | 2424 | /ltgt/2.2.1: 2425 | resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} 2426 | dev: true 2427 | 2428 | /magic-string/0.22.5: 2429 | resolution: {integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==} 2430 | dependencies: 2431 | vlq: 0.2.3 2432 | dev: true 2433 | 2434 | /magic-string/0.25.9: 2435 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 2436 | dependencies: 2437 | sourcemap-codec: 1.4.8 2438 | dev: false 2439 | 2440 | /make-fetch-happen/10.2.1: 2441 | resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} 2442 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 2443 | dependencies: 2444 | agentkeepalive: 4.2.1 2445 | cacache: 16.1.3 2446 | http-cache-semantics: 4.1.0 2447 | http-proxy-agent: 5.0.0 2448 | https-proxy-agent: 5.0.1 2449 | is-lambda: 1.0.1 2450 | lru-cache: 7.14.0 2451 | minipass: 3.3.4 2452 | minipass-collect: 1.0.2 2453 | minipass-fetch: 2.1.2 2454 | minipass-flush: 1.0.5 2455 | minipass-pipeline: 1.2.4 2456 | negotiator: 0.6.3 2457 | promise-retry: 2.0.1 2458 | socks-proxy-agent: 7.0.0 2459 | ssri: 9.0.1 2460 | transitivePeerDependencies: 2461 | - bluebird 2462 | - supports-color 2463 | dev: false 2464 | 2465 | /md5.js/1.3.5: 2466 | resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} 2467 | dependencies: 2468 | hash-base: 3.1.0 2469 | inherits: 2.0.4 2470 | safe-buffer: 5.2.1 2471 | dev: true 2472 | 2473 | /memoize-one/6.0.0: 2474 | resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} 2475 | dev: false 2476 | 2477 | /merge-stream/2.0.0: 2478 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2479 | 2480 | /metascraper/5.31.1: 2481 | resolution: {integrity: sha512-x3yOXOcoe4A0Xab7HvNTLfk+kw4j0PA/MtjQ64UGZNNdHAxBzsrUWCber6G/iwPjrvkIp/V9DPhtICAsF+DTFQ==} 2482 | engines: {node: '>= 12'} 2483 | dependencies: 2484 | '@metascraper/helpers': 5.31.1 2485 | cheerio: 1.0.0-rc.12 2486 | lodash: 4.17.21 2487 | whoops: 4.1.2 2488 | transitivePeerDependencies: 2489 | - bluebird 2490 | - bufferutil 2491 | - canvas 2492 | - supports-color 2493 | - utf-8-validate 2494 | dev: false 2495 | 2496 | /microsoft-capitalize/1.0.5: 2497 | resolution: {integrity: sha512-iqDMU9J643BHg8Zp7EMZNLTp6Pgs2f1S2SMnCW2VlUqMs17xCZ5vwVjalBJEGVcUfG+/1ePqeEGcMW3VfzHK5A==} 2498 | engines: {node: '>= 10'} 2499 | dev: false 2500 | 2501 | /miller-rabin/4.0.1: 2502 | resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} 2503 | hasBin: true 2504 | dependencies: 2505 | bn.js: 4.12.0 2506 | brorand: 1.1.0 2507 | dev: true 2508 | 2509 | /mime-db/1.52.0: 2510 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2511 | engines: {node: '>= 0.6'} 2512 | dev: false 2513 | 2514 | /mime-types/2.1.35: 2515 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2516 | engines: {node: '>= 0.6'} 2517 | dependencies: 2518 | mime-db: 1.52.0 2519 | dev: false 2520 | 2521 | /mime/3.0.0: 2522 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 2523 | engines: {node: '>=10.0.0'} 2524 | hasBin: true 2525 | dev: false 2526 | 2527 | /mimic-fn/3.1.0: 2528 | resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} 2529 | engines: {node: '>=8'} 2530 | dev: false 2531 | 2532 | /mimic-fn/4.0.0: 2533 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 2534 | engines: {node: '>=12'} 2535 | 2536 | /min-document/2.19.0: 2537 | resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} 2538 | dependencies: 2539 | dom-walk: 0.1.2 2540 | dev: false 2541 | 2542 | /miniflare/2.10.0: 2543 | resolution: {integrity: sha512-WPveqChVDdmDGv+wFqXjFqEZlZ5/aBlAKX37h/e4TAjl2XsK5nPfQATP8jZXwNDEC5iE29bYZymOqeZkp+t7OA==} 2544 | engines: {node: '>=16.13'} 2545 | hasBin: true 2546 | peerDependencies: 2547 | '@miniflare/storage-redis': 2.10.0 2548 | cron-schedule: ^3.0.4 2549 | ioredis: ^4.27.9 2550 | peerDependenciesMeta: 2551 | '@miniflare/storage-redis': 2552 | optional: true 2553 | cron-schedule: 2554 | optional: true 2555 | ioredis: 2556 | optional: true 2557 | dependencies: 2558 | '@miniflare/cache': 2.10.0 2559 | '@miniflare/cli-parser': 2.10.0 2560 | '@miniflare/core': 2.10.0 2561 | '@miniflare/d1': 2.10.0 2562 | '@miniflare/durable-objects': 2.10.0 2563 | '@miniflare/html-rewriter': 2.10.0 2564 | '@miniflare/http-server': 2.10.0 2565 | '@miniflare/kv': 2.10.0 2566 | '@miniflare/queues': 2.10.0 2567 | '@miniflare/r2': 2.10.0 2568 | '@miniflare/runner-vm': 2.10.0 2569 | '@miniflare/scheduler': 2.10.0 2570 | '@miniflare/shared': 2.10.0 2571 | '@miniflare/sites': 2.10.0 2572 | '@miniflare/storage-file': 2.10.0 2573 | '@miniflare/storage-memory': 2.10.0 2574 | '@miniflare/web-sockets': 2.10.0 2575 | kleur: 4.1.5 2576 | semiver: 1.1.0 2577 | source-map-support: 0.5.21 2578 | undici: 5.9.1 2579 | transitivePeerDependencies: 2580 | - bufferutil 2581 | - utf-8-validate 2582 | dev: true 2583 | 2584 | /miniflare/2.9.0: 2585 | resolution: {integrity: sha512-HBGQ5Jj6sMU1B1hX6G3ML46ThtUvu1nvxgXjDDmhp2RhWKYj0XvcohW/nPPL/MTP1gpvfT880De9EHmobVsDsw==} 2586 | engines: {node: '>=16.13'} 2587 | hasBin: true 2588 | peerDependencies: 2589 | '@miniflare/storage-redis': 2.9.0 2590 | cron-schedule: ^3.0.4 2591 | ioredis: ^4.27.9 2592 | peerDependenciesMeta: 2593 | '@miniflare/storage-redis': 2594 | optional: true 2595 | cron-schedule: 2596 | optional: true 2597 | ioredis: 2598 | optional: true 2599 | dependencies: 2600 | '@miniflare/cache': 2.9.0 2601 | '@miniflare/cli-parser': 2.9.0 2602 | '@miniflare/core': 2.9.0 2603 | '@miniflare/d1': 2.9.0 2604 | '@miniflare/durable-objects': 2.9.0 2605 | '@miniflare/html-rewriter': 2.9.0 2606 | '@miniflare/http-server': 2.9.0 2607 | '@miniflare/kv': 2.9.0 2608 | '@miniflare/queues': 2.9.0 2609 | '@miniflare/r2': 2.9.0 2610 | '@miniflare/runner-vm': 2.9.0 2611 | '@miniflare/scheduler': 2.9.0 2612 | '@miniflare/shared': 2.9.0 2613 | '@miniflare/sites': 2.9.0 2614 | '@miniflare/storage-file': 2.9.0 2615 | '@miniflare/storage-memory': 2.9.0 2616 | '@miniflare/web-sockets': 2.9.0 2617 | kleur: 4.1.5 2618 | semiver: 1.1.0 2619 | source-map-support: 0.5.21 2620 | undici: 5.9.1 2621 | transitivePeerDependencies: 2622 | - bufferutil 2623 | - utf-8-validate 2624 | dev: false 2625 | 2626 | /minimalistic-assert/1.0.1: 2627 | resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} 2628 | dev: true 2629 | 2630 | /minimalistic-crypto-utils/1.0.1: 2631 | resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} 2632 | dev: true 2633 | 2634 | /minimatch/3.1.2: 2635 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2636 | dependencies: 2637 | brace-expansion: 1.1.11 2638 | dev: false 2639 | 2640 | /minimatch/5.1.0: 2641 | resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} 2642 | engines: {node: '>=10'} 2643 | dependencies: 2644 | brace-expansion: 2.0.1 2645 | dev: false 2646 | 2647 | /minipass-collect/1.0.2: 2648 | resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} 2649 | engines: {node: '>= 8'} 2650 | dependencies: 2651 | minipass: 3.3.4 2652 | dev: false 2653 | 2654 | /minipass-fetch/2.1.2: 2655 | resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} 2656 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 2657 | dependencies: 2658 | minipass: 3.3.4 2659 | minipass-sized: 1.0.3 2660 | minizlib: 2.1.2 2661 | optionalDependencies: 2662 | encoding: 0.1.13 2663 | dev: false 2664 | 2665 | /minipass-flush/1.0.5: 2666 | resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} 2667 | engines: {node: '>= 8'} 2668 | dependencies: 2669 | minipass: 3.3.4 2670 | dev: false 2671 | 2672 | /minipass-pipeline/1.2.4: 2673 | resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} 2674 | engines: {node: '>=8'} 2675 | dependencies: 2676 | minipass: 3.3.4 2677 | dev: false 2678 | 2679 | /minipass-sized/1.0.3: 2680 | resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} 2681 | engines: {node: '>=8'} 2682 | dependencies: 2683 | minipass: 3.3.4 2684 | dev: false 2685 | 2686 | /minipass/3.3.4: 2687 | resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} 2688 | engines: {node: '>=8'} 2689 | dependencies: 2690 | yallist: 4.0.0 2691 | dev: false 2692 | 2693 | /minizlib/2.1.2: 2694 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 2695 | engines: {node: '>= 8'} 2696 | dependencies: 2697 | minipass: 3.3.4 2698 | yallist: 4.0.0 2699 | dev: false 2700 | 2701 | /mkdirp/1.0.4: 2702 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 2703 | engines: {node: '>=10'} 2704 | hasBin: true 2705 | dev: false 2706 | 2707 | /mlly/0.3.19: 2708 | resolution: {integrity: sha512-zMq5n3cOf4fOzA4WoeulxagbAgMChdev3MgP6K51k7M0u2whTXxupfIY4VVzws4vxkiWhwH1rVQcsw7zDGfRhA==} 2709 | dev: true 2710 | 2711 | /ms/2.0.0: 2712 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 2713 | dev: false 2714 | 2715 | /ms/2.1.2: 2716 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2717 | dev: false 2718 | 2719 | /ms/2.1.3: 2720 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2721 | dev: false 2722 | 2723 | /mustache/4.2.0: 2724 | resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} 2725 | hasBin: true 2726 | 2727 | /nan/2.17.0: 2728 | resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} 2729 | dev: false 2730 | 2731 | /nanoid/3.3.4: 2732 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 2733 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2734 | hasBin: true 2735 | 2736 | /negotiator/0.6.3: 2737 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 2738 | engines: {node: '>= 0.6'} 2739 | dev: false 2740 | 2741 | /next-tick/1.1.0: 2742 | resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} 2743 | dev: false 2744 | 2745 | /node-fetch/2.6.7: 2746 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 2747 | engines: {node: 4.x || >=6.0.0} 2748 | peerDependencies: 2749 | encoding: ^0.1.0 2750 | peerDependenciesMeta: 2751 | encoding: 2752 | optional: true 2753 | dependencies: 2754 | whatwg-url: 5.0.0 2755 | dev: false 2756 | 2757 | /node-forge/1.3.1: 2758 | resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} 2759 | engines: {node: '>= 6.13.0'} 2760 | 2761 | /node-gyp-build/4.5.0: 2762 | resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} 2763 | hasBin: true 2764 | dev: false 2765 | 2766 | /node-gyp/9.3.0: 2767 | resolution: {integrity: sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==} 2768 | engines: {node: ^12.22 || ^14.13 || >=16} 2769 | hasBin: true 2770 | dependencies: 2771 | env-paths: 2.2.1 2772 | glob: 7.2.3 2773 | graceful-fs: 4.2.10 2774 | make-fetch-happen: 10.2.1 2775 | nopt: 6.0.0 2776 | npmlog: 6.0.2 2777 | rimraf: 3.0.2 2778 | semver: 7.3.8 2779 | tar: 6.1.11 2780 | which: 2.0.2 2781 | transitivePeerDependencies: 2782 | - bluebird 2783 | - supports-color 2784 | dev: false 2785 | 2786 | /nopt/6.0.0: 2787 | resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} 2788 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 2789 | hasBin: true 2790 | dependencies: 2791 | abbrev: 1.1.1 2792 | dev: false 2793 | 2794 | /normalize-path/3.0.0: 2795 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2796 | engines: {node: '>=0.10.0'} 2797 | dev: false 2798 | 2799 | /normalize-url/6.1.0: 2800 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} 2801 | engines: {node: '>=10'} 2802 | dev: false 2803 | 2804 | /npm-run-path/5.1.0: 2805 | resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} 2806 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2807 | dependencies: 2808 | path-key: 4.0.0 2809 | 2810 | /npmlog/6.0.2: 2811 | resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} 2812 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 2813 | dependencies: 2814 | are-we-there-yet: 3.0.1 2815 | console-control-strings: 1.1.0 2816 | gauge: 4.0.4 2817 | set-blocking: 2.0.0 2818 | dev: false 2819 | 2820 | /npx-import/1.1.4: 2821 | resolution: {integrity: sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==} 2822 | dependencies: 2823 | execa: 6.1.0 2824 | parse-package-name: 1.0.0 2825 | semver: 7.3.8 2826 | validate-npm-package-name: 4.0.0 2827 | 2828 | /nth-check/2.1.1: 2829 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 2830 | dependencies: 2831 | boolbase: 1.0.0 2832 | dev: false 2833 | 2834 | /nwsapi/2.2.2: 2835 | resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} 2836 | dev: false 2837 | 2838 | /object-keys/0.2.0: 2839 | resolution: {integrity: sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==} 2840 | deprecated: Please update to the latest object-keys 2841 | dependencies: 2842 | foreach: 2.0.6 2843 | indexof: 0.0.1 2844 | is: 0.2.7 2845 | dev: true 2846 | 2847 | /object-keys/0.4.0: 2848 | resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} 2849 | dev: true 2850 | 2851 | /octal/1.0.0: 2852 | resolution: {integrity: sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==} 2853 | dev: true 2854 | 2855 | /octokit-plugin-create-pull-request/3.13.1: 2856 | resolution: {integrity: sha512-nsWZRn7NrqZvqGl3E0VcDDyyS/4xbNNvwWM2yk65TViLdEBoOhIU5SqKdfqANa+WPwv5DwHsO3T10DK1qMg72w==} 2857 | dependencies: 2858 | '@octokit/types': 6.41.0 2859 | dev: false 2860 | 2861 | /once/1.4.0: 2862 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2863 | dependencies: 2864 | wrappy: 1.0.2 2865 | 2866 | /onetime/6.0.0: 2867 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 2868 | engines: {node: '>=12'} 2869 | dependencies: 2870 | mimic-fn: 4.0.0 2871 | 2872 | /optionator/0.8.3: 2873 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} 2874 | engines: {node: '>= 0.8.0'} 2875 | dependencies: 2876 | deep-is: 0.1.4 2877 | fast-levenshtein: 2.0.6 2878 | levn: 0.3.0 2879 | prelude-ls: 1.1.2 2880 | type-check: 0.3.2 2881 | word-wrap: 1.2.3 2882 | dev: false 2883 | 2884 | /p-map/4.0.0: 2885 | resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} 2886 | engines: {node: '>=10'} 2887 | dependencies: 2888 | aggregate-error: 3.1.0 2889 | dev: false 2890 | 2891 | /parse-asn1/5.1.6: 2892 | resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} 2893 | dependencies: 2894 | asn1.js: 5.4.1 2895 | browserify-aes: 1.2.0 2896 | evp_bytestokey: 1.0.3 2897 | pbkdf2: 3.1.2 2898 | safe-buffer: 5.2.1 2899 | dev: true 2900 | 2901 | /parse-package-name/1.0.0: 2902 | resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==} 2903 | 2904 | /parse-uri/1.0.7: 2905 | resolution: {integrity: sha512-eWuZCMKNlVkXrEoANdXxbmqhu2SQO9jUMCSpdbJDObin0JxISn6e400EWsSRbr/czdKvWKkhZnMKEGUwf/Plmg==} 2906 | engines: {node: '>= 0.10'} 2907 | dev: false 2908 | 2909 | /parse5-htmlparser2-tree-adapter/7.0.0: 2910 | resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} 2911 | dependencies: 2912 | domhandler: 5.0.3 2913 | parse5: 7.1.1 2914 | dev: false 2915 | 2916 | /parse5/7.1.1: 2917 | resolution: {integrity: sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==} 2918 | dependencies: 2919 | entities: 4.4.0 2920 | dev: false 2921 | 2922 | /path-is-absolute/1.0.1: 2923 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2924 | engines: {node: '>=0.10.0'} 2925 | dev: false 2926 | 2927 | /path-key/3.1.1: 2928 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2929 | engines: {node: '>=8'} 2930 | 2931 | /path-key/4.0.0: 2932 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 2933 | engines: {node: '>=12'} 2934 | 2935 | /path-parse/1.0.7: 2936 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2937 | dev: true 2938 | 2939 | /path-to-regexp/6.2.1: 2940 | resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} 2941 | dev: false 2942 | 2943 | /pbkdf2/3.1.2: 2944 | resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} 2945 | engines: {node: '>=0.12'} 2946 | dependencies: 2947 | create-hash: 1.2.0 2948 | create-hmac: 1.1.7 2949 | ripemd160: 2.0.2 2950 | safe-buffer: 5.2.1 2951 | sha.js: 2.4.11 2952 | dev: true 2953 | 2954 | /picocolors/1.0.0: 2955 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2956 | dev: true 2957 | 2958 | /picomatch/2.3.1: 2959 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2960 | engines: {node: '>=8.6'} 2961 | 2962 | /postcss/8.4.18: 2963 | resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} 2964 | engines: {node: ^10 || ^12 || >=14} 2965 | dependencies: 2966 | nanoid: 3.3.4 2967 | picocolors: 1.0.0 2968 | source-map-js: 1.0.2 2969 | dev: true 2970 | 2971 | /prelude-ls/1.1.2: 2972 | resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} 2973 | engines: {node: '>= 0.8.0'} 2974 | dev: false 2975 | 2976 | /prettier/2.7.1: 2977 | resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} 2978 | engines: {node: '>=10.13.0'} 2979 | hasBin: true 2980 | dev: true 2981 | 2982 | /process-es6/0.11.6: 2983 | resolution: {integrity: sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA==} 2984 | dev: true 2985 | 2986 | /process-nextick-args/2.0.1: 2987 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 2988 | dev: true 2989 | 2990 | /process/0.11.10: 2991 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 2992 | engines: {node: '>= 0.6.0'} 2993 | dev: false 2994 | 2995 | /promise-inflight/1.0.1: 2996 | resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} 2997 | peerDependencies: 2998 | bluebird: '*' 2999 | peerDependenciesMeta: 3000 | bluebird: 3001 | optional: true 3002 | dev: false 3003 | 3004 | /promise-retry/2.0.1: 3005 | resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} 3006 | engines: {node: '>=10'} 3007 | dependencies: 3008 | err-code: 2.0.3 3009 | retry: 0.12.0 3010 | dev: false 3011 | 3012 | /prr/0.0.0: 3013 | resolution: {integrity: sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==} 3014 | dev: true 3015 | 3016 | /prr/1.0.1: 3017 | resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} 3018 | dev: true 3019 | 3020 | /psl/1.9.0: 3021 | resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} 3022 | dev: false 3023 | 3024 | /public-encrypt/4.0.3: 3025 | resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} 3026 | dependencies: 3027 | bn.js: 4.12.0 3028 | browserify-rsa: 4.1.0 3029 | create-hash: 1.2.0 3030 | parse-asn1: 5.1.6 3031 | randombytes: 2.1.0 3032 | safe-buffer: 5.2.1 3033 | dev: true 3034 | 3035 | /punycode/2.1.1: 3036 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 3037 | engines: {node: '>=6'} 3038 | dev: false 3039 | 3040 | /punycode2/1.0.1: 3041 | resolution: {integrity: sha512-+TXpd9YRW4YUZZPoRHJ3DILtWwootGc2DsgvfHmklQ8It1skINAuqSdqizt5nlTaBmwrYACHkHApCXjc9gHk2Q==} 3042 | engines: {node: '>=0.10'} 3043 | dev: false 3044 | 3045 | /querystringify/2.2.0: 3046 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 3047 | dev: false 3048 | 3049 | /randombytes/2.1.0: 3050 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 3051 | dependencies: 3052 | safe-buffer: 5.2.1 3053 | dev: true 3054 | 3055 | /randomfill/1.0.4: 3056 | resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} 3057 | dependencies: 3058 | randombytes: 2.1.0 3059 | safe-buffer: 5.2.1 3060 | dev: true 3061 | 3062 | /re2/1.17.7: 3063 | resolution: {integrity: sha512-X8GSuiBoVWwcjuppqSjsIkRxNUKDdjhkO9SBekQbZ2ksqWUReCy7DQPWOVpoTnpdtdz5PIpTTxTFzvJv5UMfjA==} 3064 | requiresBuild: true 3065 | dependencies: 3066 | install-artifact-from-github: 1.3.1 3067 | nan: 2.17.0 3068 | node-gyp: 9.3.0 3069 | transitivePeerDependencies: 3070 | - bluebird 3071 | - supports-color 3072 | dev: false 3073 | 3074 | /readable-stream/1.0.34: 3075 | resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} 3076 | dependencies: 3077 | core-util-is: 1.0.3 3078 | inherits: 2.0.4 3079 | isarray: 0.0.1 3080 | string_decoder: 0.10.31 3081 | dev: true 3082 | 3083 | /readable-stream/1.1.14: 3084 | resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} 3085 | dependencies: 3086 | core-util-is: 1.0.3 3087 | inherits: 2.0.4 3088 | isarray: 0.0.1 3089 | string_decoder: 0.10.31 3090 | dev: true 3091 | 3092 | /readable-stream/2.3.7: 3093 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 3094 | dependencies: 3095 | core-util-is: 1.0.3 3096 | inherits: 2.0.4 3097 | isarray: 1.0.0 3098 | process-nextick-args: 2.0.1 3099 | safe-buffer: 5.1.2 3100 | string_decoder: 1.1.1 3101 | util-deprecate: 1.0.2 3102 | dev: true 3103 | 3104 | /readable-stream/3.6.0: 3105 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 3106 | engines: {node: '>= 6'} 3107 | dependencies: 3108 | inherits: 2.0.4 3109 | string_decoder: 1.3.0 3110 | util-deprecate: 1.0.2 3111 | 3112 | /readdirp/3.6.0: 3113 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 3114 | engines: {node: '>=8.10.0'} 3115 | dependencies: 3116 | picomatch: 2.3.1 3117 | dev: false 3118 | 3119 | /requires-port/1.0.0: 3120 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 3121 | dev: false 3122 | 3123 | /resolve/1.22.1: 3124 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 3125 | hasBin: true 3126 | dependencies: 3127 | is-core-module: 2.10.0 3128 | path-parse: 1.0.7 3129 | supports-preserve-symlinks-flag: 1.0.0 3130 | dev: true 3131 | 3132 | /retry/0.12.0: 3133 | resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 3134 | engines: {node: '>= 4'} 3135 | dev: false 3136 | 3137 | /rimraf/3.0.2: 3138 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 3139 | hasBin: true 3140 | dependencies: 3141 | glob: 7.2.3 3142 | dev: false 3143 | 3144 | /ripemd160/2.0.2: 3145 | resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} 3146 | dependencies: 3147 | hash-base: 3.1.0 3148 | inherits: 2.0.4 3149 | dev: true 3150 | 3151 | /rollup-plugin-inject/3.0.2: 3152 | resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} 3153 | deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. 3154 | dependencies: 3155 | estree-walker: 0.6.1 3156 | magic-string: 0.25.9 3157 | rollup-pluginutils: 2.8.2 3158 | dev: false 3159 | 3160 | /rollup-plugin-node-builtins/2.1.2: 3161 | resolution: {integrity: sha512-bxdnJw8jIivr2yEyt8IZSGqZkygIJOGAWypXvHXnwKAbUcN4Q/dGTx7K0oAJryC/m6aq6tKutltSeXtuogU6sw==} 3162 | dependencies: 3163 | browserify-fs: 1.0.0 3164 | buffer-es6: 4.9.3 3165 | crypto-browserify: 3.12.0 3166 | process-es6: 0.11.6 3167 | dev: true 3168 | 3169 | /rollup-plugin-node-globals/1.4.0: 3170 | resolution: {integrity: sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g==} 3171 | dependencies: 3172 | acorn: 5.7.4 3173 | buffer-es6: 4.9.3 3174 | estree-walker: 0.5.2 3175 | magic-string: 0.22.5 3176 | process-es6: 0.11.6 3177 | rollup-pluginutils: 2.8.2 3178 | dev: true 3179 | 3180 | /rollup-plugin-node-polyfills/0.2.1: 3181 | resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} 3182 | dependencies: 3183 | rollup-plugin-inject: 3.0.2 3184 | dev: false 3185 | 3186 | /rollup-pluginutils/2.8.2: 3187 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 3188 | dependencies: 3189 | estree-walker: 0.6.1 3190 | 3191 | /rollup/2.77.3: 3192 | resolution: {integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==} 3193 | engines: {node: '>=10.0.0'} 3194 | hasBin: true 3195 | optionalDependencies: 3196 | fsevents: 2.3.2 3197 | dev: true 3198 | 3199 | /safe-buffer/5.1.2: 3200 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 3201 | dev: true 3202 | 3203 | /safe-buffer/5.2.1: 3204 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 3205 | 3206 | /safer-buffer/2.1.2: 3207 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 3208 | 3209 | /saxes/6.0.0: 3210 | resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} 3211 | engines: {node: '>=v12.22.7'} 3212 | dependencies: 3213 | xmlchars: 2.2.0 3214 | dev: false 3215 | 3216 | /selfsigned/2.1.1: 3217 | resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} 3218 | engines: {node: '>=10'} 3219 | dependencies: 3220 | node-forge: 1.3.1 3221 | 3222 | /semiver/1.1.0: 3223 | resolution: {integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==} 3224 | engines: {node: '>=6'} 3225 | 3226 | /semver/2.3.2: 3227 | resolution: {integrity: sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==} 3228 | hasBin: true 3229 | dev: true 3230 | 3231 | /semver/7.3.8: 3232 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 3233 | engines: {node: '>=10'} 3234 | hasBin: true 3235 | dependencies: 3236 | lru-cache: 6.0.0 3237 | 3238 | /set-blocking/2.0.0: 3239 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 3240 | dev: false 3241 | 3242 | /set-cookie-parser/2.5.1: 3243 | resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} 3244 | 3245 | /sha.js/2.4.11: 3246 | resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} 3247 | hasBin: true 3248 | dependencies: 3249 | inherits: 2.0.4 3250 | safe-buffer: 5.2.1 3251 | dev: true 3252 | 3253 | /shebang-command/2.0.0: 3254 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 3255 | engines: {node: '>=8'} 3256 | dependencies: 3257 | shebang-regex: 3.0.0 3258 | 3259 | /shebang-regex/3.0.0: 3260 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 3261 | engines: {node: '>=8'} 3262 | 3263 | /signal-exit/3.0.7: 3264 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 3265 | 3266 | /smart-buffer/4.2.0: 3267 | resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} 3268 | engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} 3269 | dev: false 3270 | 3271 | /smartquotes/2.3.2: 3272 | resolution: {integrity: sha512-0R6YJ5hLpDH4mZR7N5eZ12oCMLspvGOHL9A9SEm2e3b/CQmQidekW4SWSKEmor/3x6m3NCBBEqLzikcZC9VJNQ==} 3273 | engines: {node: '>=4.0.0'} 3274 | dev: false 3275 | 3276 | /socks-proxy-agent/7.0.0: 3277 | resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} 3278 | engines: {node: '>= 10'} 3279 | dependencies: 3280 | agent-base: 6.0.2 3281 | debug: 4.3.4 3282 | socks: 2.7.1 3283 | transitivePeerDependencies: 3284 | - supports-color 3285 | dev: false 3286 | 3287 | /socks/2.7.1: 3288 | resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} 3289 | engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} 3290 | dependencies: 3291 | ip: 2.0.0 3292 | smart-buffer: 4.2.0 3293 | dev: false 3294 | 3295 | /source-map-js/1.0.2: 3296 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 3297 | engines: {node: '>=0.10.0'} 3298 | dev: true 3299 | 3300 | /source-map-support/0.5.21: 3301 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 3302 | dependencies: 3303 | buffer-from: 1.1.2 3304 | source-map: 0.6.1 3305 | 3306 | /source-map/0.6.1: 3307 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 3308 | engines: {node: '>=0.10.0'} 3309 | 3310 | /source-map/0.7.4: 3311 | resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 3312 | engines: {node: '>= 8'} 3313 | dev: false 3314 | 3315 | /sourcemap-codec/1.4.8: 3316 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 3317 | dev: false 3318 | 3319 | /ssri/9.0.1: 3320 | resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} 3321 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3322 | dependencies: 3323 | minipass: 3.3.4 3324 | dev: false 3325 | 3326 | /stack-trace/0.0.10: 3327 | resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 3328 | 3329 | /stream-http/3.2.0: 3330 | resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} 3331 | dependencies: 3332 | builtin-status-codes: 3.0.0 3333 | inherits: 2.0.4 3334 | readable-stream: 3.6.0 3335 | xtend: 4.0.2 3336 | dev: true 3337 | 3338 | /streamsearch/1.1.0: 3339 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 3340 | engines: {node: '>=10.0.0'} 3341 | 3342 | /string-range/1.2.2: 3343 | resolution: {integrity: sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==} 3344 | dev: true 3345 | 3346 | /string-width/4.2.3: 3347 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 3348 | engines: {node: '>=8'} 3349 | dependencies: 3350 | emoji-regex: 8.0.0 3351 | is-fullwidth-code-point: 3.0.0 3352 | strip-ansi: 6.0.1 3353 | dev: false 3354 | 3355 | /string_decoder/0.10.31: 3356 | resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} 3357 | dev: true 3358 | 3359 | /string_decoder/1.1.1: 3360 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 3361 | dependencies: 3362 | safe-buffer: 5.1.2 3363 | dev: true 3364 | 3365 | /string_decoder/1.3.0: 3366 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 3367 | dependencies: 3368 | safe-buffer: 5.2.1 3369 | 3370 | /strip-ansi/6.0.1: 3371 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3372 | engines: {node: '>=8'} 3373 | dependencies: 3374 | ansi-regex: 5.0.1 3375 | dev: false 3376 | 3377 | /strip-final-newline/3.0.0: 3378 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 3379 | engines: {node: '>=12'} 3380 | 3381 | /supports-preserve-symlinks-flag/1.0.0: 3382 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 3383 | engines: {node: '>= 0.4'} 3384 | dev: true 3385 | 3386 | /symbol-tree/3.2.4: 3387 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 3388 | dev: false 3389 | 3390 | /tar/6.1.11: 3391 | resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} 3392 | engines: {node: '>= 10'} 3393 | dependencies: 3394 | chownr: 2.0.0 3395 | fs-minipass: 2.1.0 3396 | minipass: 3.3.4 3397 | minizlib: 2.1.2 3398 | mkdirp: 1.0.4 3399 | yallist: 4.0.0 3400 | dev: false 3401 | 3402 | /tlds/1.233.0: 3403 | resolution: {integrity: sha512-K05dY1r4lkXk+eE/j2UqHhGWp1bFn+17eYcJP7OepkmI3obLOgan3ZIpmml++wZ4LTIx4r9var373ztO2xb27A==} 3404 | hasBin: true 3405 | dev: false 3406 | 3407 | /to-regex-range/5.0.1: 3408 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3409 | engines: {node: '>=8.0'} 3410 | dependencies: 3411 | is-number: 7.0.0 3412 | dev: false 3413 | 3414 | /tough-cookie/4.1.2: 3415 | resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} 3416 | engines: {node: '>=6'} 3417 | dependencies: 3418 | psl: 1.9.0 3419 | punycode: 2.1.1 3420 | universalify: 0.2.0 3421 | url-parse: 1.5.10 3422 | dev: false 3423 | 3424 | /tr46/0.0.3: 3425 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 3426 | dev: false 3427 | 3428 | /tr46/3.0.0: 3429 | resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} 3430 | engines: {node: '>=12'} 3431 | dependencies: 3432 | punycode: 2.1.1 3433 | dev: false 3434 | 3435 | /type-check/0.3.2: 3436 | resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} 3437 | engines: {node: '>= 0.8.0'} 3438 | dependencies: 3439 | prelude-ls: 1.1.2 3440 | dev: false 3441 | 3442 | /type/1.2.0: 3443 | resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} 3444 | dev: false 3445 | 3446 | /type/2.7.2: 3447 | resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} 3448 | dev: false 3449 | 3450 | /typedarray-to-buffer/1.0.4: 3451 | resolution: {integrity: sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==} 3452 | dev: true 3453 | 3454 | /typedarray-to-buffer/3.1.5: 3455 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 3456 | dependencies: 3457 | is-typedarray: 1.0.0 3458 | dev: false 3459 | 3460 | /typedarray/0.0.6: 3461 | resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 3462 | dev: true 3463 | 3464 | /typescript/4.8.4: 3465 | resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} 3466 | engines: {node: '>=4.2.0'} 3467 | hasBin: true 3468 | dev: true 3469 | 3470 | /undici/5.9.1: 3471 | resolution: {integrity: sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg==} 3472 | engines: {node: '>=12.18'} 3473 | 3474 | /unique-filename/2.0.1: 3475 | resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} 3476 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3477 | dependencies: 3478 | unique-slug: 3.0.0 3479 | dev: false 3480 | 3481 | /unique-slug/3.0.0: 3482 | resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} 3483 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3484 | dependencies: 3485 | imurmurhash: 0.1.4 3486 | dev: false 3487 | 3488 | /universal-user-agent/6.0.0: 3489 | resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} 3490 | dev: false 3491 | 3492 | /universalify/0.2.0: 3493 | resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} 3494 | engines: {node: '>= 4.0.0'} 3495 | dev: false 3496 | 3497 | /url-parse/1.5.10: 3498 | resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} 3499 | dependencies: 3500 | querystringify: 2.2.0 3501 | requires-port: 1.0.0 3502 | dev: false 3503 | 3504 | /url-regex-safe/3.0.0_re2@1.17.7: 3505 | resolution: {integrity: sha512-+2U40NrcmtWFVjuxXVt9bGRw6c7/MgkGKN9xIfPrT/2RX0LTkkae6CCEDp93xqUN0UKm/rr821QnHd2dHQmN3A==} 3506 | engines: {node: '>= 10.12.0'} 3507 | peerDependencies: 3508 | re2: ^1.17.2 3509 | peerDependenciesMeta: 3510 | re2: 3511 | optional: true 3512 | dependencies: 3513 | ip-regex: 4.3.0 3514 | re2: 1.17.7 3515 | tlds: 1.233.0 3516 | dev: false 3517 | 3518 | /urlpattern-polyfill/4.0.3: 3519 | resolution: {integrity: sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==} 3520 | 3521 | /utf-8-validate/5.0.9: 3522 | resolution: {integrity: sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==} 3523 | engines: {node: '>=6.14.2'} 3524 | requiresBuild: true 3525 | dependencies: 3526 | node-gyp-build: 4.5.0 3527 | dev: false 3528 | 3529 | /util-deprecate/1.0.2: 3530 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 3531 | 3532 | /uuid/8.3.2: 3533 | resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} 3534 | hasBin: true 3535 | dev: false 3536 | 3537 | /validate-npm-package-name/4.0.0: 3538 | resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} 3539 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3540 | dependencies: 3541 | builtins: 5.0.1 3542 | 3543 | /video-extensions/1.2.0: 3544 | resolution: {integrity: sha512-TriMl18BHEsh2KuuSA065tbu4SNAC9fge7k8uKoTTofTq89+Xsg4K1BGbmSVETwUZhqSjd9KwRCNwXAW/buXMg==} 3545 | engines: {node: '>=0.10.0'} 3546 | dev: false 3547 | 3548 | /vite-plugin-cloudflare/0.1.3_avsti35k5pvcdqpmrtlurw25nu: 3549 | resolution: {integrity: sha512-w74aqMK4Ikk+guV50fJqIc+aL2EegF18j9lz8jdrNAiXjo6JhTcmI7Qt15HYbHvSux/vW2Zm8ENfvfjjCmx6Fw==} 3550 | engines: {node: '>=14.0.0'} 3551 | hasBin: true 3552 | peerDependencies: 3553 | miniflare: '*' 3554 | vite: '*' 3555 | dependencies: 3556 | buffer-es6: 4.9.3 3557 | cac: 6.7.14 3558 | esbuild: 0.14.54 3559 | miniflare: 2.10.0 3560 | mlly: 0.3.19 3561 | picocolors: 1.0.0 3562 | process-es6: 0.11.6 3563 | rollup-plugin-node-builtins: 2.1.2 3564 | rollup-plugin-node-globals: 1.4.0 3565 | stream-http: 3.2.0 3566 | vite: 2.9.15 3567 | xhr2: 0.2.1 3568 | dev: true 3569 | 3570 | /vite/2.9.15: 3571 | resolution: {integrity: sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==} 3572 | engines: {node: '>=12.2.0'} 3573 | hasBin: true 3574 | peerDependencies: 3575 | less: '*' 3576 | sass: '*' 3577 | stylus: '*' 3578 | peerDependenciesMeta: 3579 | less: 3580 | optional: true 3581 | sass: 3582 | optional: true 3583 | stylus: 3584 | optional: true 3585 | dependencies: 3586 | esbuild: 0.14.54 3587 | postcss: 8.4.18 3588 | resolve: 1.22.1 3589 | rollup: 2.77.3 3590 | optionalDependencies: 3591 | fsevents: 2.3.2 3592 | dev: true 3593 | 3594 | /vlq/0.2.3: 3595 | resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} 3596 | dev: true 3597 | 3598 | /w3c-xmlserializer/3.0.0: 3599 | resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} 3600 | engines: {node: '>=12'} 3601 | dependencies: 3602 | xml-name-validator: 4.0.0 3603 | dev: false 3604 | 3605 | /webidl-conversions/3.0.1: 3606 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 3607 | dev: false 3608 | 3609 | /webidl-conversions/7.0.0: 3610 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 3611 | engines: {node: '>=12'} 3612 | dev: false 3613 | 3614 | /websocket/1.0.34: 3615 | resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} 3616 | engines: {node: '>=4.0.0'} 3617 | dependencies: 3618 | bufferutil: 4.0.6 3619 | debug: 2.6.9 3620 | es5-ext: 0.10.62 3621 | typedarray-to-buffer: 3.1.5 3622 | utf-8-validate: 5.0.9 3623 | yaeti: 0.0.6 3624 | transitivePeerDependencies: 3625 | - supports-color 3626 | dev: false 3627 | 3628 | /whatwg-encoding/2.0.0: 3629 | resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} 3630 | engines: {node: '>=12'} 3631 | dependencies: 3632 | iconv-lite: 0.6.3 3633 | dev: false 3634 | 3635 | /whatwg-mimetype/3.0.0: 3636 | resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} 3637 | engines: {node: '>=12'} 3638 | dev: false 3639 | 3640 | /whatwg-url/11.0.0: 3641 | resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} 3642 | engines: {node: '>=12'} 3643 | dependencies: 3644 | tr46: 3.0.0 3645 | webidl-conversions: 7.0.0 3646 | dev: false 3647 | 3648 | /whatwg-url/5.0.0: 3649 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 3650 | dependencies: 3651 | tr46: 0.0.3 3652 | webidl-conversions: 3.0.1 3653 | dev: false 3654 | 3655 | /which/2.0.2: 3656 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3657 | engines: {node: '>= 8'} 3658 | hasBin: true 3659 | dependencies: 3660 | isexe: 2.0.0 3661 | 3662 | /whoops/4.1.2: 3663 | resolution: {integrity: sha512-QITkghBnjbKGOtOrJOGrHnupWDX/AHFlcTXL3/A0B5rx2DacLrpuIpcFVmwYb0IOWZ0G3sxYkS8LBSZ4J/ezng==} 3664 | engines: {node: '>= 8'} 3665 | dependencies: 3666 | clean-stack: 3.0.1 3667 | mimic-fn: 3.1.0 3668 | dev: false 3669 | 3670 | /wide-align/1.1.5: 3671 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 3672 | dependencies: 3673 | string-width: 4.2.3 3674 | dev: false 3675 | 3676 | /word-wrap/1.2.3: 3677 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 3678 | engines: {node: '>=0.10.0'} 3679 | dev: false 3680 | 3681 | /wrangler/2.1.11: 3682 | resolution: {integrity: sha512-zXydDzU+KKOwYDD9IX+XdSZMFEPWTghzTN/CiZc+pxHGIjTuQBtbk97trY3i9YKeih/QOSlo+H7Clfoq+6rZLw==} 3683 | engines: {node: '>=16.13.0'} 3684 | hasBin: true 3685 | dependencies: 3686 | '@cloudflare/kv-asset-handler': 0.2.0 3687 | '@esbuild-plugins/node-globals-polyfill': 0.1.1_esbuild@0.14.51 3688 | '@esbuild-plugins/node-modules-polyfill': 0.1.4_esbuild@0.14.51 3689 | '@miniflare/core': 2.9.0 3690 | '@miniflare/d1': 2.9.0 3691 | '@miniflare/durable-objects': 2.9.0 3692 | blake3-wasm: 2.1.5 3693 | chokidar: 3.5.3 3694 | esbuild: 0.14.51 3695 | miniflare: 2.9.0 3696 | nanoid: 3.3.4 3697 | path-to-regexp: 6.2.1 3698 | selfsigned: 2.1.1 3699 | source-map: 0.7.4 3700 | xxhash-wasm: 1.0.1 3701 | optionalDependencies: 3702 | fsevents: 2.3.2 3703 | transitivePeerDependencies: 3704 | - '@miniflare/storage-redis' 3705 | - bufferutil 3706 | - cron-schedule 3707 | - ioredis 3708 | - utf-8-validate 3709 | dev: false 3710 | 3711 | /wrappy/1.0.2: 3712 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 3713 | 3714 | /ws/8.9.0: 3715 | resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==} 3716 | engines: {node: '>=10.0.0'} 3717 | peerDependencies: 3718 | bufferutil: ^4.0.1 3719 | utf-8-validate: ^5.0.2 3720 | peerDependenciesMeta: 3721 | bufferutil: 3722 | optional: true 3723 | utf-8-validate: 3724 | optional: true 3725 | 3726 | /xhr2/0.2.1: 3727 | resolution: {integrity: sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==} 3728 | engines: {node: '>= 6'} 3729 | dev: true 3730 | 3731 | /xml-name-validator/4.0.0: 3732 | resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 3733 | engines: {node: '>=12'} 3734 | dev: false 3735 | 3736 | /xmlchars/2.2.0: 3737 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 3738 | dev: false 3739 | 3740 | /xtend/2.0.6: 3741 | resolution: {integrity: sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==} 3742 | engines: {node: '>=0.4'} 3743 | dependencies: 3744 | is-object: 0.1.2 3745 | object-keys: 0.2.0 3746 | dev: true 3747 | 3748 | /xtend/2.1.2: 3749 | resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} 3750 | engines: {node: '>=0.4'} 3751 | dependencies: 3752 | object-keys: 0.4.0 3753 | dev: true 3754 | 3755 | /xtend/2.2.0: 3756 | resolution: {integrity: sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==} 3757 | engines: {node: '>=0.4'} 3758 | dev: true 3759 | 3760 | /xtend/3.0.0: 3761 | resolution: {integrity: sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==} 3762 | engines: {node: '>=0.4'} 3763 | dev: true 3764 | 3765 | /xtend/4.0.2: 3766 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 3767 | engines: {node: '>=0.4'} 3768 | dev: true 3769 | 3770 | /xxhash-wasm/1.0.1: 3771 | resolution: {integrity: sha512-Lc9CTvDrH2vRoiaUzz25q7lRaviMhz90pkx6YxR9EPYtF99yOJnv2cB+CQ0hp/TLoqrUsk8z/W2EN31T568Azw==} 3772 | dev: false 3773 | 3774 | /yaeti/0.0.6: 3775 | resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} 3776 | engines: {node: '>=0.10.32'} 3777 | dev: false 3778 | 3779 | /yallist/4.0.0: 3780 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 3781 | 3782 | /youch/2.2.2: 3783 | resolution: {integrity: sha512-/FaCeG3GkuJwaMR34GHVg0l8jCbafZLHiFowSjqLlqhC6OMyf2tPJBu8UirF7/NI9X/R5ai4QfEKUCOxMAGxZQ==} 3784 | dependencies: 3785 | '@types/stack-trace': 0.0.29 3786 | cookie: 0.4.2 3787 | mustache: 4.2.0 3788 | stack-trace: 0.0.10 3789 | 3790 | /zod/3.19.1: 3791 | resolution: {integrity: sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==} 3792 | dev: false 3793 | -------------------------------------------------------------------------------- /src/routes/auth/authorize.ts: -------------------------------------------------------------------------------- 1 | import { parse } from "cookie"; 2 | import { 3 | failure, 4 | cors, 5 | request, 6 | createSupabase, 7 | createSession, 8 | } from "../../util/util"; 9 | 10 | const DEFAULT_REDIRECT = "https://www.solidjs.com"; 11 | 12 | // Validates the Stytch token and redirects the user to their intended path 13 | export default async function (req: Request) { 14 | const url = new URL(req.url); 15 | const token = url.searchParams.get("token") || ""; 16 | const { 17 | status_code, 18 | error_message, 19 | session: { idp } = { idp: undefined }, 20 | } = await request("/oauth/authenticate", { 21 | body: JSON.stringify({ 22 | token, 23 | session_management_type: "idp", 24 | }), 25 | }); 26 | if (status_code !== 200) { 27 | return failure(status_code, error_message); 28 | } 29 | // Collect the profile information 30 | let profile: Profile; 31 | try { 32 | profile = await fetch("https://api.github.com/user", { 33 | headers: { 34 | "User-Agent": "api.solidjs.com", 35 | Authorization: `token ${idp?.access_token}`, 36 | }, 37 | }).then((res) => res.json()); 38 | } catch (error) { 39 | return failure(500, "Couldn't fetch profile information"); 40 | } 41 | // Create the session 42 | const session = await createSession(req, "session"); 43 | // Populate the session 44 | session.data = { 45 | id: profile.node_id, 46 | display: profile.login, 47 | avatar: profile.avatar_url, 48 | github_register: profile.created_at, 49 | }; 50 | const redirect = parse(req.headers.get("cookie") || ""); 51 | const expires_at = Date.now() + 1000 * 60 * 60 * 24 * 90; // 90 days 52 | const jwt = await session.commit(session, expires_at); 53 | 54 | // Upsert the user in the dataaset 55 | const db = createSupabase(); 56 | await db.from("users").insert( 57 | [ 58 | { 59 | id: profile.node_id, 60 | handle: profile.name, 61 | profile, 62 | provider: "github", 63 | lastlogin_at: "NOW()", 64 | }, 65 | ], 66 | { upsert: true } 67 | ); 68 | 69 | return new Response(null, { 70 | status: 302, 71 | headers: { 72 | ...cors(req), 73 | Location: (redirect.redirect || DEFAULT_REDIRECT) + `&token=${jwt}`, 74 | }, 75 | }); 76 | } 77 | -------------------------------------------------------------------------------- /src/routes/auth/login.ts: -------------------------------------------------------------------------------- 1 | import { serialize } from "cookie"; 2 | import { success, failure } from "../../util/util"; 3 | 4 | /** 5 | * Sets the redirect cookie and directs the user to the top of authentication process. 6 | */ 7 | export default async function (request: Request) { 8 | const { searchParams } = new URL(request.url); 9 | if (!searchParams.has("redirect")) { 10 | return failure(401, "Redirect not supplied"); 11 | } 12 | const maxAge = (Date.now() + 1000 * 60 * 60 * 24 * 1 - Date.now()) / 1000; 13 | return success(null, { 14 | status: 302, 15 | headers: { 16 | "Set-Cookie": serialize("redirect", searchParams.get("redirect")!, { 17 | httpOnly: true, 18 | sameSite: "lax", 19 | path: "/", 20 | maxAge, // 1 day expiry 21 | }), 22 | Location: STYTCH_URL, 23 | }, 24 | }); 25 | } 26 | -------------------------------------------------------------------------------- /src/routes/auth/profile.ts: -------------------------------------------------------------------------------- 1 | import { failure, success } from "../../util/util"; 2 | 3 | /** 4 | * Decodes session information and replies with current user's profile. 5 | */ 6 | export default async function (request: AuthenticatedRequest) { 7 | // Verify the session 8 | if (!(await request.session.verify())) { 9 | return failure(401, "Unauthenticated request, please supply a valid user token.", "UNAUTHORIZED_ACCESS"); 10 | } 11 | const registered = new Date(request.session.data.github_register); 12 | const max = new Date("2022-01-07T00:00:42Z"); 13 | return success({ 14 | id: request.session.data.id, 15 | display: request.session.data.display, 16 | avatar: request.session.data.avatar, 17 | github_register: request.session.data.github_register, 18 | allowed: registered < max, 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /src/routes/hack/adjustvote.ts: -------------------------------------------------------------------------------- 1 | import { failure, success, createSupabase } from "../../util/util"; 2 | import { queryVoteCount } from "./votes"; 3 | import z from "zod"; 4 | 5 | const validate = z.object({ 6 | category: z.enum(["best_app", "best_ecosystem", "best_student_project"]), 7 | selection: z.string().max(200).min(3), 8 | }); 9 | 10 | /** 11 | * An endpoint allowing users to adjust their hackathon votes 12 | */ 13 | export default async function ( 14 | request: AuthenticatedRequest & { 15 | content: { 16 | category: string; 17 | selection: string; 18 | }; 19 | } 20 | ) { 21 | const content = request.content; 22 | // Validate the incoming request 23 | try { 24 | validate.parse(content); 25 | } catch (err) { 26 | return failure(400, "Invalid content supplied"); 27 | } 28 | const registered = new Date(request.session.data.github_register); 29 | const max = new Date("2022-01-07T00:00:42Z"); 30 | 31 | // Disallow users registered after the competition start 32 | if (registered > max) { 33 | return failure(400, "Registration date."); 34 | } 35 | 36 | // Toggle the vote in the database 37 | const db = createSupabase(); 38 | const votes = await queryVoteCount(request.session.data.id, db); 39 | // Insert the vote 40 | if (!votes[content.category].selections.includes(content.selection)) { 41 | // Ensure the user isn't over voting 42 | if ( 43 | votes[content.category].selections.length >= votes[content.category].total 44 | ) { 45 | return failure(400, "Maximum votes reached."); 46 | } 47 | await db.from("solidhack_votes").insert([ 48 | { 49 | user_id: request.session.data.id, 50 | category: content.category, 51 | selection: content.selection, 52 | }, 53 | ]); 54 | votes[content.category].selections.push(content.selection); 55 | // Remove the vote 56 | } else { 57 | await db 58 | .from("solidhack_votes") 59 | .delete() 60 | .eq("user_id", request.session.data.id) 61 | .eq("category", content.category) 62 | .eq("selection", content.selection); 63 | const position = votes[content.category].selections.indexOf( 64 | content.category 65 | ); 66 | votes[content.category].selections.splice(position); 67 | } 68 | return success(votes); 69 | } 70 | -------------------------------------------------------------------------------- /src/routes/hack/votes.ts: -------------------------------------------------------------------------------- 1 | import { 2 | failure, 3 | success, 4 | createSession, 5 | createSupabase, 6 | } from "../../util/util"; 7 | import { SupabaseClient } from "@supabase/supabase-js"; 8 | 9 | /** 10 | * Determines the vote count for the current user. 11 | * 12 | * @param user_id {string} User identifier 13 | * @param db {SupebaseClient} Database client to use 14 | * @returns {object} Structured vote information 15 | */ 16 | export async function queryVoteCount(user_id: string, db: SupabaseClient) { 17 | const { data } = await db 18 | .from("solidhack_votes") 19 | .select("category,selection") 20 | .eq("user_id", user_id); 21 | 22 | return data?.reduce( 23 | (memo, row) => { 24 | memo[row.category].selections.push(row.selection); 25 | return memo; 26 | }, 27 | { 28 | best_student_project: { 29 | total: 3, 30 | selections: [], 31 | }, 32 | best_app: { 33 | total: 3, 34 | selections: [], 35 | }, 36 | best_ecosystem: { 37 | total: 3, 38 | selections: [], 39 | }, 40 | } 41 | ); 42 | } 43 | 44 | /** 45 | * Queries the users current vote count. 46 | */ 47 | export default async function votes(request: Request) { 48 | const session = await createSession(request, "session"); 49 | // Verify the session 50 | if (!(await session.verify())) { 51 | return failure(401, "Unauthenticated"); 52 | } 53 | const votes = await queryVoteCount(session.data.id, createSupabase()); 54 | return success(votes); 55 | } 56 | -------------------------------------------------------------------------------- /src/routes/repl/create.ts: -------------------------------------------------------------------------------- 1 | import { 2 | failure, 3 | success, 4 | createSupabase, 5 | lengthInUtf8Bytes, 6 | } from "../../util/util"; 7 | import { validateREPLFiles } from "."; 8 | import generateToken from "../../util/token"; 9 | 10 | /** 11 | * Creates a new REPL for the user and replies with the ID. 12 | */ 13 | export default async function ( 14 | request: AuthenticatedRequest & { 15 | content: { 16 | title: string; 17 | labels: string[]; 18 | version: string; 19 | public: boolean; 20 | files: REPLFile[]; 21 | }; 22 | params: { 23 | id: string; 24 | }; 25 | } 26 | ) { 27 | const anonymous = request.session ? true : false; 28 | let write_token; 29 | let user_id; 30 | // Set user value or lookup token if anonymous REPL 31 | if (anonymous) { 32 | user_id = request.session.data.id; 33 | } else { 34 | write_token = generateToken(100); 35 | } 36 | const content = request.content; 37 | // Basic file validation 38 | const fileErrors = validateREPLFiles(content.files); 39 | if (fileErrors !== null) { 40 | return failure(404, fileErrors, "FILE_FORMAT_ERROR"); 41 | } 42 | const db = createSupabase(); 43 | const { data: repls, error } = await db.from("repls").insert([ 44 | { 45 | user_id, 46 | title: content.title, 47 | version: content.version, 48 | labels: content.labels, 49 | public: content.public, 50 | files: content.files, 51 | write_token, 52 | size: lengthInUtf8Bytes(JSON.stringify(content.files)), 53 | }, 54 | ]); 55 | if (error !== null) { 56 | console.log(error); 57 | return failure(404, "Internal or unknown error detected", "INTERNAL_ERROR"); 58 | } 59 | return success({ id: repls[0].id, write_token }); 60 | } 61 | -------------------------------------------------------------------------------- /src/routes/repl/delete.ts: -------------------------------------------------------------------------------- 1 | import { failure, success, createSupabase } from "../../util/util"; 2 | 3 | /** 4 | * Soft deletes a users REPL 5 | */ 6 | export default async function ( 7 | request: AuthenticatedRequest & { 8 | params: { 9 | id: string; 10 | }; 11 | } 12 | ) { 13 | // Check if the record exists 14 | const db = createSupabase(); 15 | const { count, error } = await db 16 | .from("repls") 17 | .select("*", { count: "exact" }) 18 | .eq("id", request.params.id) 19 | .eq("user_id", request.session.data.id) 20 | .is("deleted_at", null); 21 | 22 | if (error !== null) { 23 | return failure(404, "Internal or unknown error detected", "INTERNAL_ERROR"); 24 | } 25 | if (count == 0) { 26 | return failure( 27 | 404, 28 | "An invalid or unowned REPL ID was supplied", 29 | "INVALID_REPL_ID" 30 | ); 31 | } 32 | // Soft delete the record 33 | await db 34 | .from("repls") 35 | .update({ deleted_at: "NOW()" }) 36 | .eq("id", request.params.id); 37 | 38 | return success({}); 39 | } 40 | -------------------------------------------------------------------------------- /src/routes/repl/get.ts: -------------------------------------------------------------------------------- 1 | import { 2 | failure, 3 | success, 4 | createSupabase, 5 | lengthInUtf8Bytes, 6 | internalError, 7 | } from "../../util/util"; 8 | import { decompressFromURL } from "@amoutonbrady/lz-string"; 9 | import { v4 as uuid } from "uuid"; 10 | import z from "zod"; 11 | 12 | const ID = z.string().uuid(); 13 | 14 | // Build the invalid resposnse message 15 | const invalidItem = () => 16 | failure(404, "An invalid or unowned REPL ID was supplied", "INVALID_REPL_ID"); 17 | 18 | /** 19 | * Retrieves a users REPL from the database. 20 | */ 21 | export default async function ( 22 | request: AuthenticatedRequest & { 23 | params: { 24 | id: string; 25 | }; 26 | } 27 | ) { 28 | // If the ID is not a UUID then it's likely a legacy hash, attempt 29 | // to request from legacy worker, parse and output it. 30 | const parseUuid = ID.safeParse(request.params.id); 31 | if (!parseUuid.success) { 32 | return await handleLegacyRepl(request.params.id); 33 | } 34 | const db = createSupabase(); 35 | const user_id = request.session ? request.session.data.id : "null"; 36 | const { data: repls, error } = await db 37 | .from("repls") 38 | .select( 39 | "id,user_id,title,labels,public,version,size,files,created_at,updated_at" 40 | ) 41 | .eq("id", request.params.id) 42 | .is("deleted_at", null) 43 | .or(`public.eq.true,user_id.eq.${user_id}`); 44 | 45 | if (error !== null) return internalError(); 46 | if (repls.length == 0 || repls === null) return invalidItem(); 47 | return success(repls[0]); 48 | } 49 | 50 | // Handles requesting legacy REPL values from the proxy and merging into 51 | // new Supabase dataset. Note that this method is meant to be removed within 52 | // 6 months. This is a temporary stop-gap solution between KV and Supabase. 53 | const handleLegacyRepl = async (id: string) => { 54 | // Find related REPL before proxying to the user 55 | const db = createSupabase(); 56 | const { data: repls, error } = await db 57 | .from("repls") 58 | .select( 59 | "id,user_id,title,labels,public,version,size,files,created_at,updated_at" 60 | ) 61 | .eq("guid", id) 62 | .is("deleted_at", null) 63 | .or(`public.eq.true`); 64 | 65 | if (error === null && repls.length !== 0) { 66 | return success(repls[0]); 67 | } 68 | 69 | // Retrieve REPL from legacy worker cache 70 | const body = await fetch( 71 | `https://workers-kv-migrate.pilotio.workers.dev?id=${id}` 72 | ); 73 | if (body.status !== 200) { 74 | return invalidItem(); 75 | } 76 | const json: { version: string; data: string } = await body.json(); 77 | const decompressed = JSON.parse(decompressFromURL(json.data)!); 78 | const files = (decompressed || []).map( 79 | (file: { name: string; source: string, type: string }) => { 80 | return { 81 | name: `${file.name}.${file.type}`, 82 | content: file.source, 83 | }; 84 | } 85 | ); 86 | let payload = { 87 | id: uuid(), 88 | title: "Imported legacy REPL", 89 | guid: id, 90 | labels: ["legacy"], 91 | user_id: null, 92 | public: true, 93 | version: json.version, 94 | size: lengthInUtf8Bytes(JSON.stringify(json.data)), 95 | files, 96 | created_at: new Date(), 97 | updated_at: null, 98 | }; 99 | // Load the record into the cache 100 | const { error: insertError } = await db.from("repls").insert([payload]); 101 | if (insertError !== null) return internalError(); 102 | return success(payload); 103 | }; 104 | -------------------------------------------------------------------------------- /src/routes/repl/index.ts: -------------------------------------------------------------------------------- 1 | import { SupabaseClient } from "@supabase/supabase-js"; 2 | import z, { ZodIssue } from "zod"; 3 | import { APIError } from "../../util/util"; 4 | 5 | const File = z.array( 6 | z.object({ 7 | name: z.string().min(3).max(50), 8 | content: z.string(), 9 | }) 10 | ); 11 | 12 | /** 13 | * Parses a list of incoming REPL files if they are valid or not. 14 | * 15 | * @param files {Array} A list of REPL files. 16 | * @returns Returns a list of Zod formatted issues 17 | */ 18 | export function validateREPLFiles(files: REPLFile[]): ZodIssue[] | null { 19 | const data = File.safeParse(files); 20 | if (!data.success) { 21 | return data.error.issues; 22 | } 23 | return null; 24 | } 25 | 26 | /** 27 | * Validates REPL ownership based on incoming values. 28 | * 29 | * @param id {string} UUID of the REPL to validate. 30 | * @param user_id {string} Identifier of the owning user. 31 | * @param write_token {string} One off write token of the user. 32 | * @returns Returns true of ownership can be confirmed 33 | */ 34 | export async function validateREPLOwnership( 35 | db: SupabaseClient, 36 | id: string, 37 | user_id?: string | null, 38 | write_token? : string, 39 | ): Promise { 40 | console.log(user_id, write_token); 41 | if (!user_id && !write_token) { 42 | throw new APIError("Write token or user auth token required", "AUTHORIZATION_ERROR", 403); 43 | } 44 | const { data: repl, error } = await db 45 | .from("repls") 46 | .select("user_id, write_token") 47 | .eq("id", id); 48 | if (error !== null || repl.length == 0) { 49 | throw new APIError("Referenced REPL does not exist", "INVALID_REPL", 400); 50 | } else if (write_token && repl[0].write_token !== write_token) { 51 | throw new APIError("An invalid write token was supplied", "INVALID_WRITE_TOKEN", 401); 52 | } else if (user_id && repl[0].user_id !== user_id) { 53 | throw new APIError("Identified user does not own REPL", "INVALID_OWNER", 403); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/routes/repl/list.ts: -------------------------------------------------------------------------------- 1 | import { 2 | failure, 3 | success, 4 | createSupabase, 5 | internalError, 6 | } from "../../util/util"; 7 | 8 | type CreateREPL = { 9 | title: string; 10 | labels: string[]; 11 | data: string; 12 | }; 13 | 14 | // Lists all available repls 15 | export default async function ( 16 | request: AuthenticatedRequest & { 17 | content: CreateREPL; 18 | params?: { 19 | user?: string; 20 | }; 21 | } 22 | ) { 23 | let id; 24 | let publicValues = "(true,false)"; 25 | const url = new URL(request.url); 26 | const limit = url.searchParams.get("limit"); 27 | const offset = url.searchParams.get("offset"); 28 | const ascending = url.searchParams.get("asc"); 29 | const userHandle = request?.params?.user; 30 | 31 | // Count the listings 32 | const db = createSupabase(); 33 | 34 | // Handle the case where a user param is supplied 35 | if (userHandle) { 36 | const { data: users, error } = await db 37 | .from("users") 38 | .select("id") 39 | .eq("profile->>login", userHandle); 40 | if (error || users.length == 0) { 41 | return failure(404, "Invalid user specified", "INVALID_USER"); 42 | } 43 | id = users[0].id; 44 | publicValues = "(true)"; 45 | } else { 46 | id = request.session.data.id; 47 | } 48 | 49 | const { count } = await db 50 | .from("repls") 51 | .select("*", { count: "exact" }) 52 | .eq("user_id", id) 53 | .is("deleted_at", null) 54 | .filter("public", "in", publicValues); 55 | 56 | const { data: repls, error } = await db 57 | .from("repls") 58 | .select("id,title,public,labels,version,size,created_at,updated_at") 59 | .eq("user_id", id) 60 | .range(offset ? parseInt(offset) : 0, limit ? parseInt(limit) : 25) 61 | .order("created_at", { ascending: ascending ? true : false }) 62 | .is("deleted_at", null) 63 | .filter("public", "in", publicValues); 64 | 65 | if (error !== null) return internalError(); 66 | return success({ 67 | total: count, 68 | list: repls, 69 | }); 70 | } 71 | -------------------------------------------------------------------------------- /src/routes/repl/patch.ts: -------------------------------------------------------------------------------- 1 | import { 2 | failure, 3 | success, 4 | createSupabase, 5 | lengthInUtf8Bytes, 6 | internalError, 7 | } from "../../util/util"; 8 | import { validateREPLOwnership, validateREPLFiles } from "."; 9 | 10 | /** 11 | * Updates the REPL with newly supplied information. 12 | */ 13 | export default async function ( 14 | request: AuthenticatedRequest & { 15 | content: { 16 | write_token?: string; 17 | title?: string; 18 | labels?: string[]; 19 | version?: string; 20 | public?: boolean; 21 | files?: REPLFile[]; 22 | }; 23 | params: { 24 | id: string; 25 | }; 26 | } 27 | ) { 28 | const content = request.content; 29 | const db = createSupabase(); 30 | // Check ownership of the REPL 31 | try { 32 | await validateREPLOwnership( 33 | db, 34 | request.params.id, 35 | request.session?.data?.id, 36 | content.write_token, 37 | ); 38 | } catch (error: any) { 39 | return failure( 40 | error.status_code, 41 | error.message, 42 | error.status, 43 | ); 44 | } 45 | // Validate REPL structure 46 | if (content.files) { 47 | const fileErrors = validateREPLFiles(content.files); 48 | if (fileErrors !== null) { 49 | return failure(404, fileErrors, "FILE_FORMAT_ERROR"); 50 | } 51 | } 52 | // If an ID param is supplied then ensure it exists 53 | const { data } = await db 54 | .from("repls") 55 | .select("*") 56 | .eq("id", request.params.id); 57 | 58 | if (data == null) { 59 | return failure( 60 | 404, 61 | "An invalid or unowned REPL ID was supplied", 62 | "INVALID_REPL_ID" 63 | ); 64 | } 65 | const { error } = await db 66 | .from("repls") 67 | .update({ 68 | title: content.title ?? data[0].title, 69 | version: content.version ?? data[0].version, 70 | user_id: request.session.data.id ?? data[0].user_id, 71 | labels: content.labels ?? data[0].labels, 72 | public: content.public ?? data[0].public, 73 | files: content.files ?? data[0].files, 74 | updated_at: "NOW()", 75 | size: content.files 76 | ? lengthInUtf8Bytes(JSON.stringify(content.files)) 77 | : data[0].size, 78 | }) 79 | .match({ id: request.params.id }); 80 | 81 | if (error !== null) return internalError(); 82 | return success({}); 83 | } 84 | -------------------------------------------------------------------------------- /src/routes/repl/transfer.ts: -------------------------------------------------------------------------------- 1 | import { 2 | failure, 3 | success, 4 | createSupabase, 5 | internalError, 6 | } from "../../util/util"; 7 | import { validateREPLOwnership } from "."; 8 | 9 | /** 10 | * Transfers a REPL to a user. 11 | */ 12 | export default async function ( 13 | request: AuthenticatedRequest & { 14 | content: { 15 | write_token?: string; 16 | }; 17 | params: { 18 | id: string; 19 | }; 20 | } 21 | ) { 22 | const content = request.content; 23 | const db = createSupabase(); 24 | // Check ownership of the REPL 25 | try { 26 | await validateREPLOwnership( 27 | db, 28 | request.params.id, 29 | null, 30 | content.write_token, 31 | ); 32 | } catch (error: any) { 33 | return failure( 34 | error.status_code, 35 | error.message, 36 | error.status, 37 | ); 38 | } 39 | const { error } = await db 40 | .from("repls") 41 | .update({ 42 | user_id: request.session.data.id, 43 | transferred_at: new Date() 44 | }) 45 | .match({ id: request.params.id }); 46 | 47 | if (error !== null) return internalError(); 48 | return success({}); 49 | } 50 | -------------------------------------------------------------------------------- /src/routes/repl/update.ts: -------------------------------------------------------------------------------- 1 | import { 2 | failure, 3 | success, 4 | createSupabase, 5 | lengthInUtf8Bytes, 6 | internalError, 7 | } from "../../util/util"; 8 | import { validateREPLOwnership, validateREPLFiles } from "."; 9 | 10 | /** 11 | * Updates the REPL with newly supplied information. 12 | */ 13 | export default async function ( 14 | request: AuthenticatedRequest & { 15 | content: { 16 | write_token?: string; 17 | title: string; 18 | labels: string[]; 19 | version: string; 20 | public: boolean; 21 | files: REPLFile[]; 22 | }; 23 | params: { 24 | id: string; 25 | }; 26 | } 27 | ) { 28 | // Basic file validation 29 | const content = request.content; 30 | const db = createSupabase(); 31 | // Check ownership of the REPL 32 | try { 33 | await validateREPLOwnership( 34 | db, 35 | request.params.id, 36 | request.session?.data?.id, 37 | content.write_token, 38 | ); 39 | } catch (error: any) { 40 | return failure( 41 | error.status_code, 42 | error.message, 43 | error.status, 44 | ); 45 | } 46 | // Validate REPL structure 47 | const fileErrors = validateREPLFiles(content.files); 48 | if (fileErrors !== null) { 49 | return failure(404, fileErrors, "FILE_FORMAT_ERROR"); 50 | } 51 | const { error } = await db 52 | .from("repls") 53 | .update({ 54 | title: content.title, 55 | version: content.version, 56 | labels: content.labels, 57 | public: content.public, 58 | files: content.files, 59 | updated_at: "NOW()", 60 | size: lengthInUtf8Bytes(JSON.stringify(content.files)), 61 | }) 62 | .match({ id: request.params.id }); 63 | 64 | if (error !== null) internalError(); 65 | return success({}); 66 | } 67 | -------------------------------------------------------------------------------- /src/routes/solidex/links.ts: -------------------------------------------------------------------------------- 1 | import { failure, success } from "../../util/util"; 2 | import getMetaTags from "../../util/metadata"; 3 | 4 | // Validates and collects OpenGraph data of a URL for use in a submission 5 | export default async function (request: AuthenticatedRequest) { 6 | const urlParse = new URL(request.url); 7 | const link = urlParse.searchParams.get("url") || ""; 8 | if (link == "") { 9 | return failure( 10 | 404, 11 | "You must supply a URL in the url query string to parse", 12 | "MISSING_URL" 13 | ); 14 | } 15 | // Typical browser headers should be set else sites such as dev.to wont reply at all 16 | try { 17 | const { meta, og, links, $ } = await getMetaTags(link, { 18 | headers: { 19 | "user-agent": 20 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36", 21 | "accept-encoding": "gzip, deflate, br", 22 | referer: "https://www.solidjs.com/", 23 | accept: 24 | "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", 25 | "accept-language": "en-US;q=0.8", 26 | }, 27 | }); 28 | // Sanitize and standardize the response body 29 | let response = { 30 | title: og?.title || meta?.title || null, 31 | site_name: og?.site_name || null, 32 | type: og?.type || null, 33 | url: og?.url || meta?.url || null, 34 | description: og?.description || meta?.description || null, 35 | image: og?.image || null, 36 | author: links?.name || null, 37 | author_url: links?.url || null, 38 | published_at: meta?.startDate || meta?.datePublished || null, 39 | }; 40 | // dev.to 41 | if ($ && link.includes("dev.to/")) { 42 | response["published_at"] = $("time").attr("datetime") || null; 43 | const article = $("article"); 44 | response["author"] = article.attr("data-author-name") || null; 45 | } 46 | // github.com 47 | if (link.includes("github.com/")) { 48 | const path = link.replace("https://", ""); 49 | response["author"] = path.split("/")[1]; 50 | response["author_url"] = `https://www.github.com/${response["author"]}`; 51 | } 52 | return success(response); 53 | } catch (err) { 54 | return failure( 55 | 404, 56 | "Failed to parse the supplied URL, sorry", 57 | "INTERNAL_ERROR" 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/routes/solidex/list.ts: -------------------------------------------------------------------------------- 1 | import { success } from "../../util/util"; 2 | import { Resource } from "./types"; 3 | import videos from "@solid.js/solidex/dist/videos.json"; 4 | import podcasts from "@solid.js/solidex/dist/podcasts.json"; 5 | import articles from "@solid.js/solidex/dist/articles.json"; 6 | import packages from "@solid.js/solidex/dist/packages.json"; 7 | 8 | // Lists all available repls 9 | export default async function ( 10 | request: AuthenticatedRequest & { 11 | params: { 12 | type: string; 13 | }; 14 | } 15 | ) { 16 | let list: Array = []; 17 | switch (request.params.type) { 18 | case "resources": 19 | list = [...videos, ...articles, ...podcasts]; 20 | break; 21 | case "packages": 22 | list = packages; 23 | break; 24 | } 25 | return success(list); 26 | } 27 | -------------------------------------------------------------------------------- /src/routes/solidex/submit.ts: -------------------------------------------------------------------------------- 1 | import { failure, success } from "../../util/util"; 2 | import { z } from "zod"; 3 | import { Octokit } from "@octokit/core"; 4 | import { ResourceType, ResourceCategory } from "./types"; 5 | import { createPullRequest } from "octokit-plugin-create-pull-request"; 6 | 7 | interface GithubFileStructure { 8 | content: string; 9 | encoding: BufferEncoding; 10 | } 11 | 12 | // Add the PR plugin to Octokit 13 | const OctokitWithPlugin = Octokit.plugin(createPullRequest); 14 | 15 | // Validation sets 16 | const submission = z.object({ 17 | link: z.string().url(), 18 | title: z.string().max(200), 19 | description: z.string(), 20 | author: z.string().max(100), 21 | author_url: z.string().url().optional(), 22 | keywords: z.array(z.string()).max(10).min(3), 23 | type: z.enum(["article", "video", "podcast", "package"]), 24 | official: z.boolean(), 25 | categories: z.array( 26 | z.enum([ 27 | "primitive", 28 | "router", 29 | "data", 30 | "ui", 31 | "plugin", 32 | "starters", 33 | "build_utility", 34 | "add_on", 35 | "testing", 36 | "educational", 37 | ]) 38 | ), 39 | published_at: z.number(), 40 | }); 41 | 42 | // Lists all available repls 43 | export default async function ( 44 | request: AuthenticatedRequest & { 45 | content: { 46 | title: string; 47 | link: string; 48 | author: string; 49 | author_url: string; 50 | description: string; 51 | type: typeof ResourceType; 52 | categories: typeof ResourceCategory[]; 53 | keywords: string[]; 54 | official: boolean; 55 | published_at: number; 56 | }; 57 | } 58 | ) { 59 | // Perform validations 60 | try { 61 | submission.parse(request.content); 62 | } catch (err) { 63 | if (err instanceof z.ZodError) { 64 | return failure(404, err.issues, "VALIDATION_ERROR"); 65 | } 66 | } 67 | // Handle inserting the submission 68 | const files = { 69 | [`resources/${request.content.type}s.ts`]: (file: GithubFileStructure) => { 70 | // @TODO: Determine a safe way to add the submission to the TS file 71 | const content = file.content; 72 | return Buffer.from(content, file.encoding) 73 | .toString("utf-8") 74 | .toUpperCase(); 75 | }, 76 | }; 77 | const octokit = new OctokitWithPlugin({ 78 | auth: GITHUB_TOKEN, 79 | }); 80 | const pr = await octokit.createPullRequest({ 81 | owner: "solidjs", 82 | repo: "solidex", 83 | title: `${request.content.type} Submission: ${request.content.title}`, 84 | body: "This pull request was submitted via the Solid Site request form.", 85 | base: "main", 86 | head: "pull-request-branch-name", 87 | changes: [ 88 | { 89 | files, 90 | commit: `Adding ${request.content.title} submission to filesets`, 91 | }, 92 | ], 93 | }); 94 | if (pr == null) { 95 | return failure( 96 | 404, 97 | "Could not complete sending your submission", 98 | "INTERNAL_ERROR" 99 | ); 100 | } 101 | return success(pr); 102 | } 103 | -------------------------------------------------------------------------------- /src/routes/solidex/types.ts: -------------------------------------------------------------------------------- 1 | export interface Resource { 2 | title: string; 3 | link: string; 4 | author?: string; 5 | author_url?: string; 6 | description?: string; 7 | type: string; 8 | categories: string[]; 9 | official?: boolean; // If the resource is an official Solid resource 10 | keywords?: string[]; 11 | published_at?: number; 12 | } 13 | 14 | export const ResourceType = { 15 | Article: "article", 16 | Video: "video", 17 | Podcast: "podcast", 18 | Library: "library", 19 | Package: "package", 20 | }; 21 | export const ResourceCategory = { 22 | Primitives: "primitive", 23 | Routers: "router", 24 | Data: "data", 25 | UI: "ui", 26 | Plugins: "plugin", 27 | Starters: "starters", 28 | BuildUtilities: "build_utility", 29 | AddOn: "add_on", 30 | Testing: "testing", 31 | Educational: "educational", 32 | }; 33 | -------------------------------------------------------------------------------- /src/routes/status.ts: -------------------------------------------------------------------------------- 1 | import { success } from "../util/util"; 2 | 3 | /** 4 | * Queries the users current vote count. 5 | */ 6 | export default async function votes() { 7 | return success({ 8 | version: "1.0.11", 9 | available: true, 10 | message: null, 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /src/util/metadata.ts: -------------------------------------------------------------------------------- 1 | import * as cheerio from "cheerio/lib/slim"; 2 | 3 | type Meta = { [key: string]: string | undefined }; 4 | 5 | const readMetatag = (el: any, name: string) => { 6 | const prop = el.attr("name") || el.attr("property") || el.attr("itemprop"); 7 | return prop == name ? el.attr("content") : null; 8 | }; 9 | 10 | const readLink = (el: any, name: string) => { 11 | const prop = el.attr("name") || el.attr("property") || el.attr("itemprop"); 12 | if (prop == name) { 13 | if (el.attr("content")) { 14 | return el.attr("content"); 15 | } 16 | if (el.attr("href")) { 17 | return el.attr("href"); 18 | } 19 | } 20 | return null; 21 | }; 22 | 23 | const getMetaTags = async ( 24 | url: string, 25 | requestInit?: Request | RequestInit | undefined 26 | ) => { 27 | if (!/(^http(s?):\/\/[^\s$.?#].[^\s]*)/i.test(url)) return {}; 28 | const response = await fetch(url, requestInit); 29 | const body = await response.text(); 30 | const $ = cheerio.load(body); 31 | const title = $("title"); 32 | let og: Meta = {}, 33 | meta: Meta = {}, 34 | links: Meta = {}; 35 | if (title) meta.title = $(title).text(); 36 | const canonical = $("link[rel=canonical]"); 37 | if (canonical) meta.url = canonical.attr("href"); 38 | // Parse meta tag values 39 | const metas = $("meta"); 40 | for (let i = 0; i < metas.length; i++) { 41 | const el = metas[i]; 42 | [ 43 | "title", 44 | "description", 45 | "image", 46 | "datePublished", 47 | "genre", 48 | "startDate", 49 | ].forEach((s) => { 50 | const val = readMetatag($(el), s); 51 | if (val) meta[s] = val; 52 | }); 53 | [ 54 | "og:title", 55 | "og:description", 56 | "og:image", 57 | "og:url", 58 | "og:site_name", 59 | "og:type", 60 | ].forEach((s) => { 61 | const val = readMetatag($(el), s); 62 | if (val) og[s.split(":")[1]] = val; 63 | }); 64 | } 65 | // Parse link values 66 | const link = $("link"); 67 | for (let i = 0; i < link.length; i++) { 68 | const el = link[i]; 69 | ["name", "url"].forEach((s) => { 70 | const val = readLink($(el), s); 71 | if (val) links[s] = val; 72 | }); 73 | } 74 | return { meta, og, links, $ }; 75 | }; 76 | 77 | export default getMetaTags; 78 | -------------------------------------------------------------------------------- /src/util/token.ts: -------------------------------------------------------------------------------- 1 | 2 | const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 3 | 4 | export default function generateToken(n: number) { 5 | let token = ''; 6 | for(var i = 0; i < n; i++) { 7 | token += chars[Math.floor(Math.random() * chars.length)]; 8 | } 9 | return token; 10 | } 11 | -------------------------------------------------------------------------------- /src/util/util.ts: -------------------------------------------------------------------------------- 1 | import * as jwt from "@tsndr/cloudflare-worker-jwt"; 2 | import { createClient } from "@supabase/supabase-js"; 3 | 4 | /** 5 | * Creates a new database client 6 | * 7 | * @returns Returns a new initialized Supabase client 8 | */ 9 | export function createSupabase() { 10 | return createClient(SUPABASE_URL, SUPABASE_KEY, { 11 | fetch, 12 | }); 13 | } 14 | 15 | /** 16 | * Sends a structured success response to the user. 17 | * 18 | * @param data {object|string} Data to send back as serialized response 19 | * @param init {object} Response initialization values 20 | * @returns Response object to send back 21 | */ 22 | export function success(data: object | string | null, init?: ResponseInit) { 23 | return new Response(data ? JSON.stringify(data) : null, { 24 | ...init, 25 | headers: { 26 | ...cors(), 27 | ...init?.headers, 28 | }, 29 | }); 30 | } 31 | 32 | /** 33 | * Sends a failure response to the user. 34 | * 35 | * @param code {number} HTTP Status code 36 | * @param message {string} Message of the error 37 | * @returns Response object to send back 38 | */ 39 | export function failure( 40 | code: number, 41 | message: string | object, 42 | status_code: string | undefined = undefined 43 | ) { 44 | return new Response( 45 | JSON.stringify({ 46 | status_code, 47 | status_message: message, 48 | }), 49 | { 50 | status: code, 51 | statusText: typeof message === "string" ? message : "ERROR", 52 | headers: { 53 | ...cors(), 54 | }, 55 | } 56 | ); 57 | } 58 | 59 | /** 60 | * Handles preflight OPTION requests. 61 | * 62 | * @param request {Request} Request object 63 | * @returns Properly structured preflight response 64 | */ 65 | export function handleOptions(request: Request) { 66 | let headers = request.headers; 67 | if ( 68 | headers.get("Origin") !== null && 69 | headers.get("Access-Control-Request-Method") !== null && 70 | headers.get("Access-Control-Request-Headers") !== null 71 | ) { 72 | return new Response(null, { 73 | headers: { 74 | ...cors(request), 75 | }, 76 | }); 77 | } else { 78 | return new Response(null, { 79 | headers: { 80 | Allow: "GET, HEAD, POST, OPTIONS, PUT, DELETE, PATCH", 81 | }, 82 | }); 83 | } 84 | } 85 | 86 | /** 87 | * CORs output generator based on dynamic request. 88 | * 89 | * @param _request {Request} Incoming request object 90 | * @returns A set of default cors headers to reply with. 91 | */ 92 | export function cors(_request?: Request) { 93 | return { 94 | "Content-Type": "application/json", 95 | "Access-Control-Allow-Origin": "*", 96 | "Access-Control-Allow-Credentials": "true", 97 | "Access-Control-Allow-Headers": "Content-Type, Authorization", 98 | "Access-Control-Allow-Methods": "GET,HEAD,POST,PUT,OPTIONS,DELETE,PATCH", 99 | "Access-Control-Max-Age": "86400", 100 | }; 101 | } 102 | 103 | // Helpful request function 104 | export function request(url: string, options: any): Promise { 105 | return fetch(`${STYTCH_API}${url}`, { 106 | ...options, 107 | method: options.method || "POST", 108 | headers: { 109 | Authorization: "Basic " + btoa(`${STYTCH_PROJECT_ID}:${STYTCH_SECRET}`), 110 | "Content-Type": "application/json", 111 | ...options.headers, 112 | }, 113 | }).then((res) => res.json()); 114 | } 115 | 116 | /** 117 | * General session management utility for handling JWTs. 118 | * 119 | * @param request {Request} The incoming request object 120 | * @param session_id {string} Session identifier 121 | * @param initial_data {object} Initial data for the session 122 | * @returns {object.id} Session identifier 123 | * @returns {object.data} Session data object 124 | * @returns {object.commit} Function for commiting/serializing the session 125 | * @returns {object.verify} Helper function to verify the session 126 | */ 127 | export async function createSession( 128 | request: Request, 129 | session_id: string, 130 | initial_data: T = {} as T 131 | ): Promise> { 132 | let session_token = request.headers.get("authorization"); 133 | if (session_token) { 134 | session_token = session_token.substring(7); 135 | } 136 | const token_data: any | undefined = session_token 137 | ? jwt.decode(session_token)?.payload 138 | : undefined; 139 | const session_data: T = Object.assign( 140 | {}, 141 | initial_data, 142 | token_data?.payload ?? {} 143 | ); 144 | const commit = async (session: Session, expires_at: number) => { 145 | return await jwt.sign( 146 | { 147 | payload: session.data, 148 | exp: expires_at, 149 | }, 150 | STYTCH_SECRET 151 | ); 152 | }; 153 | const verify = async (): Promise => { 154 | return ( 155 | typeof session_token === "string" && 156 | (await jwt.verify(session_token, STYTCH_SECRET)) && 157 | (jwt.decode(session_token).payload as any).exp > Date.now() 158 | ); 159 | }; 160 | return { 161 | id: session_id, 162 | data: session_data, 163 | commit, 164 | verify, 165 | ...(session_token ? { expires_at: token_data?.exp } : {}), 166 | }; 167 | } 168 | 169 | /** 170 | * String size calculator that returns length in bytes. 171 | * 172 | * @param str {string} String to be measured 173 | * @returns {number} Size of the string in bytes 174 | */ 175 | export function lengthInUtf8Bytes(str: string): number { 176 | // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence. 177 | var m = encodeURIComponent(str).match(/%[89ABab]/g); 178 | return str.length + (m ? m.length : 0); 179 | } 180 | 181 | /** 182 | * Authentication middleware to validate the incoming user. 183 | * 184 | * @param request {Request} Request coming into the API. 185 | */ 186 | export async function withAuth(request: AuthenticatedRequest) { 187 | try { 188 | const session = await createSession(request, "session"); 189 | if (!(await session.verify())) { 190 | return failure( 191 | 401, 192 | "Your request could not be properly authenticated.", 193 | "AUTHORIZATION_FAILURE" 194 | ); 195 | } 196 | request.session = session; 197 | } catch (err) { 198 | return failure( 199 | 401, 200 | "Your request could not be properly authenticated.", 201 | "UNAUTHENTICATED" 202 | ); 203 | } 204 | return undefined; 205 | } 206 | 207 | /** 208 | * Authentication middleware to validate the incoming user. 209 | * 210 | * @param request {Request} Request coming into the API. 211 | */ 212 | export async function withOptionalAuth(request: AuthenticatedRequest) { 213 | if ( 214 | request.headers.get("authorization") && 215 | request.headers.get("authorization") !== "" 216 | ) { 217 | return withAuth(request); 218 | } 219 | return undefined; 220 | } 221 | 222 | /** 223 | * Returns a failure notice as a standard internal error message. 224 | */ 225 | export const internalError = () => 226 | failure(404, "Internal or unknown error detected", "INTERNAL_ERROR"); 227 | 228 | /** 229 | * API specific error message. 230 | */ 231 | export class APIError extends Error { 232 | public status: string; 233 | public status_code: number; 234 | constructor(message: string, status: string, status_code: number) { 235 | super(message); 236 | this.status_code = status_code; 237 | this.status = status; 238 | this.name = "ValidationError"; 239 | } 240 | } 241 | -------------------------------------------------------------------------------- /src/worker.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "itty-router"; 2 | import { withContent } from "itty-router-extras"; 3 | import { handleOptions, withAuth, withOptionalAuth } from "./util/util"; 4 | 5 | import login from "./routes/auth/login"; 6 | import profile from "./routes/auth/profile"; 7 | import authorize from "./routes/auth/authorize"; 8 | 9 | // import votes from "./routes/hack/votes"; 10 | // import adjustvote from "./routes/hack/adjustvote"; 11 | 12 | import createRepl from "./routes/repl/create"; 13 | import updateRepl from "./routes/repl/update"; 14 | import listRepls from "./routes/repl/list"; 15 | import deleteRepl from "./routes/repl/delete"; 16 | import transferRepl from "./routes/repl/transfer"; 17 | import getRepl from "./routes/repl/get"; 18 | import patchRepl from "./routes/repl/patch"; 19 | import listSolidex from "./routes/solidex/list"; 20 | import linksSolidex from "./routes/solidex/links"; 21 | import submitSolidex from "./routes/solidex/submit"; 22 | 23 | import status from "./routes/status"; 24 | 25 | const router = Router(); 26 | 27 | // Routes 28 | router.get("/profile", withAuth, profile); 29 | router.get("/auth/login", login); 30 | router.get("/auth/callback", authorize); 31 | 32 | // REPL 33 | router.get("/repl/:id", withOptionalAuth, withContent, getRepl); 34 | router.get("/repl/:user/list", listRepls); 35 | router.get("/repl", withAuth, listRepls); 36 | router.put("/repl/:id", withOptionalAuth, withContent, updateRepl); 37 | router.post("/repl/:id/transfer", withAuth, withContent, transferRepl); 38 | router.patch("/repl/:id", withOptionalAuth, withContent, patchRepl); 39 | router.post("/repl", withOptionalAuth, withContent, createRepl); 40 | router.delete("/repl/:id", withAuth, deleteRepl); 41 | 42 | // Solidex 43 | router.get("/solidex/links", linksSolidex); 44 | router.get("/solidex/:type", listSolidex); 45 | router.post("/solidex", withContent, submitSolidex); 46 | 47 | // SolidHack 48 | // router.get("/hack/votes", withAuth, votes); 49 | // router.post("/hack/votes", withAuth, withContent, adjustvote); 50 | 51 | router.get("/status", status); 52 | router.all("*", status); 53 | 54 | addEventListener("fetch", (event: FetchEvent) => { 55 | if (event.request.method === "OPTIONS") { 56 | return event.respondWith(handleOptions(event.request)); 57 | } 58 | return event.respondWith(router.handle(event.request)); 59 | }); 60 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "allowSyntheticDefaultImports": true, 6 | "module": "CommonJS", 7 | "lib": ["ES2020"], 8 | "moduleResolution": "Node", 9 | "skipLibCheck": true, 10 | "strict": true, 11 | "sourceMap": true, 12 | "resolveJsonModule": true, 13 | "esModuleInterop": true, 14 | "noEmit": true, 15 | "noUnusedLocals": true, 16 | "noUnusedParameters": true, 17 | "noImplicitReturns": true, 18 | "types": ["vite/client", "@cloudflare/workers-types"] 19 | }, 20 | "include": ["src", "types.d.ts"], 21 | "exclude": ["node_modules"] 22 | } 23 | -------------------------------------------------------------------------------- /types.d.ts: -------------------------------------------------------------------------------- 1 | declare; 2 | { 3 | var ENVIRONMENT: "production" | "development"; 4 | var STYTCH_PROJECT_ID: string; 5 | var STYTCH_SECRET: string; 6 | var STYTCH_API: string; 7 | var STYTCH_URL: string; 8 | var SUPABASE_URL: string; 9 | var SUPABASE_KEY: string; 10 | var GITHUB_TOKEN: string; 11 | } 12 | 13 | type Profile = { 14 | id: number; 15 | login: string; 16 | node_id: string; 17 | avatar_url: string; 18 | gravatar_id: string; 19 | url: string; 20 | html_url: string; 21 | followers_url: string; 22 | following_url: string; 23 | gists_url: string; 24 | starred_url: string; 25 | subscriptions_url: string; 26 | organizations_url: string; 27 | repos_url: string; 28 | events_url: string; 29 | received_events_url: string; 30 | type: string; 31 | site_admin: boolean; 32 | name: string; 33 | company: string; 34 | blog: string; 35 | location: string; 36 | email: string; 37 | hireable: boolean; 38 | bio: string; 39 | twitter_username: string; 40 | public_repos: number; 41 | public_gists: number; 42 | followers: number; 43 | following: number; 44 | created_at: string; 45 | updated_at: string; 46 | }; 47 | 48 | type REPLFile = { 49 | main: string; 50 | content: string[]; 51 | }; 52 | 53 | interface AuthenticatedRequest extends Request { 54 | session: Session; 55 | } 56 | 57 | type AuthSession = { 58 | id: string; 59 | display: string; 60 | avatar: string; 61 | github_register: string; 62 | }; 63 | 64 | type Session = { 65 | readonly id: string; 66 | readonly expires_at?: number; 67 | data: T; 68 | commit(session: Session, expires_at: number): Promise; 69 | verify(): Promise; 70 | }; 71 | -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "solid-api" 2 | workers_dev = true 3 | account_id = "fa2a5e3787deead800c822a0e1171763" 4 | compatibility_date = "2022-04-05" 5 | 6 | [build] 7 | command = "npm run build" 8 | 9 | [vars] 10 | ENVIORNMENT = "production" 11 | STYTCH_PROJECT_ID = "" 12 | STYTCH_SECRET = "" 13 | STYTCH_URL = "" 14 | STYTCH_API = "" 15 | SUPABASE_URL = "" 16 | SUPABASE_KEY = "" 17 | --------------------------------------------------------------------------------