├── .dev.vars ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode └── extensions.json ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── form.html ├── html.d.ts └── index.ts ├── tsconfig.json └── wrangler.toml /.dev.vars: -------------------------------------------------------------------------------- 1 | WORKERLINKS_SECRET=mysecret -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /dist 3 | **/*.rs.bk 4 | Cargo.lock 5 | bin/ 6 | pkg/ 7 | wasm-pack.log 8 | worker/ 9 | node_modules/ 10 | .cargo-ok 11 | wrangler.prod.toml 12 | .mf 13 | .wrangler/ 14 | .idea/ -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false, 4 | "trailingComma": "all", 5 | "useTabs": true, 6 | "printWidth": 80, 7 | "overrides": [ 8 | { 9 | "files": "src/*.html", 10 | "options": { 11 | "printWidth": 140 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["tamasfe.even-better-toml"] 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021 Erisa A. 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Worker Links (URL Shortener) 2 | 3 | A simple URL Shortener for Cloudflare Workers, using Workers KV. Redirect short URLs at the edge of the Cloudflare network to keep latency down and access fast! 4 | 5 | I run this code in production on [erisa.link](https://erisa.link/example), though the root name redirects and without the secret it doesn't make a very good demo. 6 | 7 | It was made for my personal use but is available publicly in the hopes that it may be useful to someone somewhere. 8 | 9 | ## Deploy (simple) 10 | 11 | Wrangler 2 is required now, but should be handled automatically for `npm run` commands. 12 | To run manual wrangler commands, try `npx wrangler`. 13 | 14 | Simple steps: 15 | 16 | - `npm install` 17 | - `npm run addsecret` 18 | - `npm run createkv` (follow `wrangler.toml` instructions) 19 | - `npm run deploy` 20 | 21 | ## Deploy (More involved) 22 | 23 | To deploy to your Cloudflare Workers account, edit the relevant entries in `wrangler.toml`, add a secret with `wrangler secret put WORKERLINKS_SECRET` and use `wrangler publish`. 24 | 25 | ## Debugging 26 | 27 | For debuggging, you can use `npm run dev` (Which runs `wrangler dev --local`). To change the secret used in this mode, edit the `.dev.vars` file. 28 | 29 | You can also debug on the edge with `wrangler dev`, though you will need to first configure a prepview namespace in `wrangler.toml` and add the `WORKERLINKS_SECRET` secret to the Worker. 30 | 31 | ## (Optional) User Interface 32 | 33 | If `ENABLE_INDEX_FORM` is enabled in `wrangler.toml`, an optional UI form is available when visiting the Worker in a browser, allowing easy creation of links: 34 | 35 |  36 | 37 | ## Usage 38 | 39 | Once deployed, interacting with the API should be rather simple. It's based on headers, specifically with the `Authorization` and `URL` headers. 40 | 41 | To create a short URL with a random URL, send a `POST` to `/` with `Authorization` and `URL` headers: 42 | 43 | ```json 44 | erisa@Tuturu:~$ curl -X POST -H "Authorization: mysecret" -H "URL: https://erisa.uk" https://erisa.link/ 45 | { 46 | "message": "URL created succesfully.", 47 | "key": "q2w083eq", 48 | "shorturl": "https://erisa.link/q2w083eq", 49 | "longurl": "https://erisa.uk" 50 | } 51 | ``` 52 | 53 | And you can test it worked if you wish: 54 | 55 | ```http 56 | erisa@Tuturu:~$ curl https://erisa.link/q2w083eq -D- 57 | HTTP/2 302 58 | date: Fri, 11 Sep 2020 12:43:04 GMT 59 | content-length: 0 60 | location: https://erisa.uk 61 | server: cloudflare 62 | ..other ephemeral headers.. 63 | ``` 64 | 65 | To create or update a custom short URL, send a `PUT` to the intended target URL: 66 | 67 | ```json 68 | erisa@Tuturu:~$ curl -X PUT -H "Authorization: mysecret" -H "URL: https://erisa.uk" https://erisa.link/mywebsite 69 | { 70 | "message": "URL created succesfully.", 71 | "key": "mywebsite", 72 | "shorturl": "https://erisa.link/mywebsite", 73 | "longurl": "https://erisa.uk" 74 | } 75 | ``` 76 | 77 | And to delete an existing shortlink, send a `DELETE` to it with only the `Authorization` header: 78 | 79 | ```json 80 | erisa@Tuturu:~$ curl -X DELETE -H "Authorization: mysecret" https://erisa.link/keytodelete 81 | { 82 | "message": "Short URL deleted succesfully.", 83 | "key": "keytodelete", 84 | "shorturl": "https://erisa.link/keytodelete", 85 | "longurl": "https://erisa.uk" 86 | } 87 | ``` 88 | 89 | You can also bulk create multiple shortlinks at once by sending a `POST` to `/` with no `URL` header and with a JSON body instead: 90 | 91 | ```json 92 | erisa@Tuturu:~$ curl -X POST -H "Authorization: mysecret" https://erisa.link/ \ 93 | -H 'Content-Type: application/json' \ 94 | -d '{ "/short1": "https://example.com", "/mywebsite": "https://erisa.uk" }' 95 | { 96 | "message": "URLs created successfully", 97 | "entries": [ 98 | { 99 | "key": "short1", 100 | "shorturl": "https://erisa.link/short1", 101 | "longurl": "https://example.com" 102 | }, 103 | { 104 | "key": "mywebsite", 105 | "shorturl": "http://erisa.link/mywebsite", 106 | "longurl": "https://erisa.uk" 107 | } 108 | ] 109 | } 110 | ``` 111 | 112 | You can list all URLs by sending a `GET` to `/` (with the `Authorization` header set to your secret, of course). 113 | 114 | ```json 115 | kot@Starry:~$ curl -H "Authorization: mysecret" "https://erisa.link/?prefix=%2F&limit=1" 116 | { 117 | "list_complete": false, 118 | "cursor": "AAAAAJhOXekucRAqut7Xs7Q2f09GCZyStWBfONvq6u5JP05Bg-z5FM5gf7krRaDrsvyxqfDuvFWUHIZp2n9OZ7Au92h-x68xwg8-bwerIoPd7fesG5w-ZB6f6oXopZHNXDCscmVUQ0OIaDEOx_6pruyEcCKfD3WpOstj6lO_sYJG_zQKdBgmYvLoMFQpK-cK7t8mCLWQA2t351xc9sJ08SM0JniY73t7bOdSxF3ADVTV6ihMSti0Z6svhpknfCn9VHjT", 119 | "links": [ 120 | { 121 | "key": "/0031qr7q7" 122 | }, 123 | { 124 | "key": "/00ybqita" 125 | }, 126 | { 127 | "key": "/02ji9wlg" 128 | } 129 | ] 130 | } 131 | ``` 132 | 133 | The endpoint is paginated by default (1000/page). Just send `cursor` in the query string to access the next page. 134 | 135 | You can set `limit` in the query string to `0` to retrieve all URLs. 136 | 137 | You can also view URLs from your Cloudflare Dashboard: 138 | `Cloudflare Dashboard -> Workers -> KV -> View` on the namespace. 139 | 140 | ## ShareX 141 | 142 | To use worker-links as a URL Shortener in ShareX, create a file with a `.sxcu` extension (ex. `worker-links.sxcu`) and copy-paste the following: 143 | 144 | ```json 145 | { 146 | "Version": "15.0.0", 147 | "Name": "worker-links", 148 | "DestinationType": "URLShortener", 149 | "RequestMethod": "POST", 150 | "RequestURL": "https://erisa.link", 151 | "Headers": { 152 | "Authorization": "mysecret", 153 | "URL": "{input}" 154 | }, 155 | "Body": "JSON", 156 | "URL": "{json:shorturl}" 157 | } 158 | ``` 159 | 160 | Replace `RequestURL` with the URL of your choice and `Authorization` with your worker link's secret. 161 | 162 | Now open the `.sxcu` file. It should make worker-links as your active custom URL Shortener. 163 | If not, click on **Destinations** -> **URL Shortener** and choose **Custom URL Shortener**. 164 | 165 | ## Plausible Analytics 166 | 167 | To get statistics for your short URLs with Plausible Analytics, define a `PLAUSIBLE_HOST` secret set to the URL of your Plausible instance. For example, `https://plausible.io/`. 168 | 169 | ## Security 170 | 171 | This code is relatively simple but still, if you find any security issues that can be exploited publicly, please reach out to me via email: `erisa (at) erisa.uk` with any relevant details. 172 | 173 | If you don't have access to Workers KV you're welcome to test these issues on my live `erisa.link`, provided you don't send excessive (constant) requests or delete/modify any keys except ones created by you or the `/sample` key. 174 | 175 | If I don't respond to your email for whatever reason please feel free to publicly open an issue. 176 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "worker-links", 3 | "version": "2.3.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "worker-links", 9 | "version": "2.3.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "hono": "^4.6.5", 13 | "simple-runtypes": "^7.1.3" 14 | }, 15 | "devDependencies": { 16 | "@cloudflare/workers-types": "^4.20231121.0", 17 | "prettier": "^3.2.5", 18 | "wrangler": "^3.44.0" 19 | } 20 | }, 21 | "node_modules/@cloudflare/kv-asset-handler": { 22 | "version": "0.3.1", 23 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.1.tgz", 24 | "integrity": "sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==", 25 | "dev": true, 26 | "dependencies": { 27 | "mime": "^3.0.0" 28 | } 29 | }, 30 | "node_modules/@cloudflare/workerd-darwin-64": { 31 | "version": "1.20240329.0", 32 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240329.0.tgz", 33 | "integrity": "sha512-/raHmsHrYjoC5am84wqyiZIDCRrrYN6YDFb4zchwWQzJ0ZHleUeY6IzNdjujrS/gYey/+Db9oyl2PD1xAZt4gA==", 34 | "cpu": [ 35 | "x64" 36 | ], 37 | "dev": true, 38 | "optional": true, 39 | "os": [ 40 | "darwin" 41 | ], 42 | "engines": { 43 | "node": ">=16" 44 | } 45 | }, 46 | "node_modules/@cloudflare/workerd-darwin-arm64": { 47 | "version": "1.20240329.0", 48 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240329.0.tgz", 49 | "integrity": "sha512-3wnwVdfFDt+JUhlA6NWW+093ryGNF0HMuBmkOh0PG6j4GMRH8Y+EDsqzqrzT3ZoGGXbI9x1H7k15VKb3LAN/KA==", 50 | "cpu": [ 51 | "arm64" 52 | ], 53 | "dev": true, 54 | "optional": true, 55 | "os": [ 56 | "darwin" 57 | ], 58 | "engines": { 59 | "node": ">=16" 60 | } 61 | }, 62 | "node_modules/@cloudflare/workerd-linux-64": { 63 | "version": "1.20240329.0", 64 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240329.0.tgz", 65 | "integrity": "sha512-E909ZIXgjdr2iuq5bF/vq02elizDlPQoYRiKojdvODC7w8rbnpwnuptajS4xK5kmKh4XBiU2o9NDhut/W1kfyw==", 66 | "cpu": [ 67 | "x64" 68 | ], 69 | "dev": true, 70 | "optional": true, 71 | "os": [ 72 | "linux" 73 | ], 74 | "engines": { 75 | "node": ">=16" 76 | } 77 | }, 78 | "node_modules/@cloudflare/workerd-linux-arm64": { 79 | "version": "1.20240329.0", 80 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240329.0.tgz", 81 | "integrity": "sha512-PELA3FVW75pKchsSI5o40oiClFY2Uiq+KUx/f/srwz2pIJoM5YWLmFrv+s8feKoEwuabxIGSzHxy7QA++HyprQ==", 82 | "cpu": [ 83 | "arm64" 84 | ], 85 | "dev": true, 86 | "optional": true, 87 | "os": [ 88 | "linux" 89 | ], 90 | "engines": { 91 | "node": ">=16" 92 | } 93 | }, 94 | "node_modules/@cloudflare/workerd-windows-64": { 95 | "version": "1.20240329.0", 96 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240329.0.tgz", 97 | "integrity": "sha512-/T+AcjVqTuqAeGBQmjAF4TOTm8sv3BSO/NtUPa1ghCvsp1sb03L6/c3wFc9ZonSdRYeBb0XDX7PnenGCvjr/Tw==", 98 | "cpu": [ 99 | "x64" 100 | ], 101 | "dev": true, 102 | "optional": true, 103 | "os": [ 104 | "win32" 105 | ], 106 | "engines": { 107 | "node": ">=16" 108 | } 109 | }, 110 | "node_modules/@cloudflare/workers-types": { 111 | "version": "4.20240402.0", 112 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240402.0.tgz", 113 | "integrity": "sha512-GEtg71Gs5iBIQBQB0sBkEOJrmJGpenT2XAODwbvfWADwQpDxgEQfGrcOhaJfLPCfvNpKaMxcBlH9cekWwQEsLQ==", 114 | "dev": true 115 | }, 116 | "node_modules/@cspotcode/source-map-support": { 117 | "version": "0.8.1", 118 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 119 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 120 | "dev": true, 121 | "dependencies": { 122 | "@jridgewell/trace-mapping": "0.3.9" 123 | }, 124 | "engines": { 125 | "node": ">=12" 126 | } 127 | }, 128 | "node_modules/@esbuild-plugins/node-globals-polyfill": { 129 | "version": "0.2.3", 130 | "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", 131 | "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", 132 | "dev": true, 133 | "peerDependencies": { 134 | "esbuild": "*" 135 | } 136 | }, 137 | "node_modules/@esbuild-plugins/node-modules-polyfill": { 138 | "version": "0.2.2", 139 | "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", 140 | "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", 141 | "dev": true, 142 | "dependencies": { 143 | "escape-string-regexp": "^4.0.0", 144 | "rollup-plugin-node-polyfills": "^0.2.1" 145 | }, 146 | "peerDependencies": { 147 | "esbuild": "*" 148 | } 149 | }, 150 | "node_modules/@esbuild/android-arm": { 151 | "version": "0.17.19", 152 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", 153 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", 154 | "cpu": [ 155 | "arm" 156 | ], 157 | "dev": true, 158 | "optional": true, 159 | "os": [ 160 | "android" 161 | ], 162 | "engines": { 163 | "node": ">=12" 164 | } 165 | }, 166 | "node_modules/@esbuild/android-arm64": { 167 | "version": "0.17.19", 168 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", 169 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", 170 | "cpu": [ 171 | "arm64" 172 | ], 173 | "dev": true, 174 | "optional": true, 175 | "os": [ 176 | "android" 177 | ], 178 | "engines": { 179 | "node": ">=12" 180 | } 181 | }, 182 | "node_modules/@esbuild/android-x64": { 183 | "version": "0.17.19", 184 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", 185 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", 186 | "cpu": [ 187 | "x64" 188 | ], 189 | "dev": true, 190 | "optional": true, 191 | "os": [ 192 | "android" 193 | ], 194 | "engines": { 195 | "node": ">=12" 196 | } 197 | }, 198 | "node_modules/@esbuild/darwin-arm64": { 199 | "version": "0.17.19", 200 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", 201 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", 202 | "cpu": [ 203 | "arm64" 204 | ], 205 | "dev": true, 206 | "optional": true, 207 | "os": [ 208 | "darwin" 209 | ], 210 | "engines": { 211 | "node": ">=12" 212 | } 213 | }, 214 | "node_modules/@esbuild/darwin-x64": { 215 | "version": "0.17.19", 216 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", 217 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", 218 | "cpu": [ 219 | "x64" 220 | ], 221 | "dev": true, 222 | "optional": true, 223 | "os": [ 224 | "darwin" 225 | ], 226 | "engines": { 227 | "node": ">=12" 228 | } 229 | }, 230 | "node_modules/@esbuild/freebsd-arm64": { 231 | "version": "0.17.19", 232 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", 233 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", 234 | "cpu": [ 235 | "arm64" 236 | ], 237 | "dev": true, 238 | "optional": true, 239 | "os": [ 240 | "freebsd" 241 | ], 242 | "engines": { 243 | "node": ">=12" 244 | } 245 | }, 246 | "node_modules/@esbuild/freebsd-x64": { 247 | "version": "0.17.19", 248 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", 249 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", 250 | "cpu": [ 251 | "x64" 252 | ], 253 | "dev": true, 254 | "optional": true, 255 | "os": [ 256 | "freebsd" 257 | ], 258 | "engines": { 259 | "node": ">=12" 260 | } 261 | }, 262 | "node_modules/@esbuild/linux-arm": { 263 | "version": "0.17.19", 264 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", 265 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", 266 | "cpu": [ 267 | "arm" 268 | ], 269 | "dev": true, 270 | "optional": true, 271 | "os": [ 272 | "linux" 273 | ], 274 | "engines": { 275 | "node": ">=12" 276 | } 277 | }, 278 | "node_modules/@esbuild/linux-arm64": { 279 | "version": "0.17.19", 280 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", 281 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", 282 | "cpu": [ 283 | "arm64" 284 | ], 285 | "dev": true, 286 | "optional": true, 287 | "os": [ 288 | "linux" 289 | ], 290 | "engines": { 291 | "node": ">=12" 292 | } 293 | }, 294 | "node_modules/@esbuild/linux-ia32": { 295 | "version": "0.17.19", 296 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", 297 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", 298 | "cpu": [ 299 | "ia32" 300 | ], 301 | "dev": true, 302 | "optional": true, 303 | "os": [ 304 | "linux" 305 | ], 306 | "engines": { 307 | "node": ">=12" 308 | } 309 | }, 310 | "node_modules/@esbuild/linux-loong64": { 311 | "version": "0.17.19", 312 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", 313 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", 314 | "cpu": [ 315 | "loong64" 316 | ], 317 | "dev": true, 318 | "optional": true, 319 | "os": [ 320 | "linux" 321 | ], 322 | "engines": { 323 | "node": ">=12" 324 | } 325 | }, 326 | "node_modules/@esbuild/linux-mips64el": { 327 | "version": "0.17.19", 328 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", 329 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", 330 | "cpu": [ 331 | "mips64el" 332 | ], 333 | "dev": true, 334 | "optional": true, 335 | "os": [ 336 | "linux" 337 | ], 338 | "engines": { 339 | "node": ">=12" 340 | } 341 | }, 342 | "node_modules/@esbuild/linux-ppc64": { 343 | "version": "0.17.19", 344 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", 345 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", 346 | "cpu": [ 347 | "ppc64" 348 | ], 349 | "dev": true, 350 | "optional": true, 351 | "os": [ 352 | "linux" 353 | ], 354 | "engines": { 355 | "node": ">=12" 356 | } 357 | }, 358 | "node_modules/@esbuild/linux-riscv64": { 359 | "version": "0.17.19", 360 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", 361 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", 362 | "cpu": [ 363 | "riscv64" 364 | ], 365 | "dev": true, 366 | "optional": true, 367 | "os": [ 368 | "linux" 369 | ], 370 | "engines": { 371 | "node": ">=12" 372 | } 373 | }, 374 | "node_modules/@esbuild/linux-s390x": { 375 | "version": "0.17.19", 376 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", 377 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", 378 | "cpu": [ 379 | "s390x" 380 | ], 381 | "dev": true, 382 | "optional": true, 383 | "os": [ 384 | "linux" 385 | ], 386 | "engines": { 387 | "node": ">=12" 388 | } 389 | }, 390 | "node_modules/@esbuild/linux-x64": { 391 | "version": "0.17.19", 392 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", 393 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", 394 | "cpu": [ 395 | "x64" 396 | ], 397 | "dev": true, 398 | "optional": true, 399 | "os": [ 400 | "linux" 401 | ], 402 | "engines": { 403 | "node": ">=12" 404 | } 405 | }, 406 | "node_modules/@esbuild/netbsd-x64": { 407 | "version": "0.17.19", 408 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", 409 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", 410 | "cpu": [ 411 | "x64" 412 | ], 413 | "dev": true, 414 | "optional": true, 415 | "os": [ 416 | "netbsd" 417 | ], 418 | "engines": { 419 | "node": ">=12" 420 | } 421 | }, 422 | "node_modules/@esbuild/openbsd-x64": { 423 | "version": "0.17.19", 424 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", 425 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", 426 | "cpu": [ 427 | "x64" 428 | ], 429 | "dev": true, 430 | "optional": true, 431 | "os": [ 432 | "openbsd" 433 | ], 434 | "engines": { 435 | "node": ">=12" 436 | } 437 | }, 438 | "node_modules/@esbuild/sunos-x64": { 439 | "version": "0.17.19", 440 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", 441 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", 442 | "cpu": [ 443 | "x64" 444 | ], 445 | "dev": true, 446 | "optional": true, 447 | "os": [ 448 | "sunos" 449 | ], 450 | "engines": { 451 | "node": ">=12" 452 | } 453 | }, 454 | "node_modules/@esbuild/win32-arm64": { 455 | "version": "0.17.19", 456 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", 457 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", 458 | "cpu": [ 459 | "arm64" 460 | ], 461 | "dev": true, 462 | "optional": true, 463 | "os": [ 464 | "win32" 465 | ], 466 | "engines": { 467 | "node": ">=12" 468 | } 469 | }, 470 | "node_modules/@esbuild/win32-ia32": { 471 | "version": "0.17.19", 472 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", 473 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", 474 | "cpu": [ 475 | "ia32" 476 | ], 477 | "dev": true, 478 | "optional": true, 479 | "os": [ 480 | "win32" 481 | ], 482 | "engines": { 483 | "node": ">=12" 484 | } 485 | }, 486 | "node_modules/@esbuild/win32-x64": { 487 | "version": "0.17.19", 488 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 489 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 490 | "cpu": [ 491 | "x64" 492 | ], 493 | "dev": true, 494 | "optional": true, 495 | "os": [ 496 | "win32" 497 | ], 498 | "engines": { 499 | "node": ">=12" 500 | } 501 | }, 502 | "node_modules/@fastify/busboy": { 503 | "version": "2.1.1", 504 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 505 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 506 | "dev": true, 507 | "engines": { 508 | "node": ">=14" 509 | } 510 | }, 511 | "node_modules/@jridgewell/resolve-uri": { 512 | "version": "3.1.2", 513 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 514 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 515 | "dev": true, 516 | "engines": { 517 | "node": ">=6.0.0" 518 | } 519 | }, 520 | "node_modules/@jridgewell/sourcemap-codec": { 521 | "version": "1.4.15", 522 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 523 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 524 | "dev": true 525 | }, 526 | "node_modules/@jridgewell/trace-mapping": { 527 | "version": "0.3.9", 528 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 529 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 530 | "dev": true, 531 | "dependencies": { 532 | "@jridgewell/resolve-uri": "^3.0.3", 533 | "@jridgewell/sourcemap-codec": "^1.4.10" 534 | } 535 | }, 536 | "node_modules/@types/node": { 537 | "version": "20.12.3", 538 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.3.tgz", 539 | "integrity": "sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==", 540 | "dev": true, 541 | "dependencies": { 542 | "undici-types": "~5.26.4" 543 | } 544 | }, 545 | "node_modules/@types/node-forge": { 546 | "version": "1.3.11", 547 | "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", 548 | "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", 549 | "dev": true, 550 | "dependencies": { 551 | "@types/node": "*" 552 | } 553 | }, 554 | "node_modules/acorn": { 555 | "version": "8.11.3", 556 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", 557 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", 558 | "dev": true, 559 | "bin": { 560 | "acorn": "bin/acorn" 561 | }, 562 | "engines": { 563 | "node": ">=0.4.0" 564 | } 565 | }, 566 | "node_modules/acorn-walk": { 567 | "version": "8.3.2", 568 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 569 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 570 | "dev": true, 571 | "engines": { 572 | "node": ">=0.4.0" 573 | } 574 | }, 575 | "node_modules/anymatch": { 576 | "version": "3.1.3", 577 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 578 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 579 | "dev": true, 580 | "dependencies": { 581 | "normalize-path": "^3.0.0", 582 | "picomatch": "^2.0.4" 583 | }, 584 | "engines": { 585 | "node": ">= 8" 586 | } 587 | }, 588 | "node_modules/as-table": { 589 | "version": "1.0.55", 590 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 591 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 592 | "dev": true, 593 | "dependencies": { 594 | "printable-characters": "^1.0.42" 595 | } 596 | }, 597 | "node_modules/binary-extensions": { 598 | "version": "2.2.0", 599 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 600 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 601 | "dev": true, 602 | "engines": { 603 | "node": ">=8" 604 | } 605 | }, 606 | "node_modules/blake3-wasm": { 607 | "version": "2.1.5", 608 | "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", 609 | "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", 610 | "dev": true 611 | }, 612 | "node_modules/braces": { 613 | "version": "3.0.3", 614 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 615 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 616 | "dev": true, 617 | "dependencies": { 618 | "fill-range": "^7.1.1" 619 | }, 620 | "engines": { 621 | "node": ">=8" 622 | } 623 | }, 624 | "node_modules/capnp-ts": { 625 | "version": "0.7.0", 626 | "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", 627 | "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", 628 | "dev": true, 629 | "dependencies": { 630 | "debug": "^4.3.1", 631 | "tslib": "^2.2.0" 632 | } 633 | }, 634 | "node_modules/chokidar": { 635 | "version": "3.5.3", 636 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 637 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 638 | "dev": true, 639 | "funding": [ 640 | { 641 | "type": "individual", 642 | "url": "https://paulmillr.com/funding/" 643 | } 644 | ], 645 | "dependencies": { 646 | "anymatch": "~3.1.2", 647 | "braces": "~3.0.2", 648 | "glob-parent": "~5.1.2", 649 | "is-binary-path": "~2.1.0", 650 | "is-glob": "~4.0.1", 651 | "normalize-path": "~3.0.0", 652 | "readdirp": "~3.6.0" 653 | }, 654 | "engines": { 655 | "node": ">= 8.10.0" 656 | }, 657 | "optionalDependencies": { 658 | "fsevents": "~2.3.2" 659 | } 660 | }, 661 | "node_modules/cookie": { 662 | "version": "0.7.2", 663 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 664 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 665 | "dev": true, 666 | "engines": { 667 | "node": ">= 0.6" 668 | } 669 | }, 670 | "node_modules/data-uri-to-buffer": { 671 | "version": "2.0.2", 672 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 673 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 674 | "dev": true 675 | }, 676 | "node_modules/debug": { 677 | "version": "4.3.4", 678 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 679 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 680 | "dev": true, 681 | "dependencies": { 682 | "ms": "2.1.2" 683 | }, 684 | "engines": { 685 | "node": ">=6.0" 686 | }, 687 | "peerDependenciesMeta": { 688 | "supports-color": { 689 | "optional": true 690 | } 691 | } 692 | }, 693 | "node_modules/esbuild": { 694 | "version": "0.17.19", 695 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 696 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 697 | "dev": true, 698 | "hasInstallScript": true, 699 | "bin": { 700 | "esbuild": "bin/esbuild" 701 | }, 702 | "engines": { 703 | "node": ">=12" 704 | }, 705 | "optionalDependencies": { 706 | "@esbuild/android-arm": "0.17.19", 707 | "@esbuild/android-arm64": "0.17.19", 708 | "@esbuild/android-x64": "0.17.19", 709 | "@esbuild/darwin-arm64": "0.17.19", 710 | "@esbuild/darwin-x64": "0.17.19", 711 | "@esbuild/freebsd-arm64": "0.17.19", 712 | "@esbuild/freebsd-x64": "0.17.19", 713 | "@esbuild/linux-arm": "0.17.19", 714 | "@esbuild/linux-arm64": "0.17.19", 715 | "@esbuild/linux-ia32": "0.17.19", 716 | "@esbuild/linux-loong64": "0.17.19", 717 | "@esbuild/linux-mips64el": "0.17.19", 718 | "@esbuild/linux-ppc64": "0.17.19", 719 | "@esbuild/linux-riscv64": "0.17.19", 720 | "@esbuild/linux-s390x": "0.17.19", 721 | "@esbuild/linux-x64": "0.17.19", 722 | "@esbuild/netbsd-x64": "0.17.19", 723 | "@esbuild/openbsd-x64": "0.17.19", 724 | "@esbuild/sunos-x64": "0.17.19", 725 | "@esbuild/win32-arm64": "0.17.19", 726 | "@esbuild/win32-ia32": "0.17.19", 727 | "@esbuild/win32-x64": "0.17.19" 728 | } 729 | }, 730 | "node_modules/escape-string-regexp": { 731 | "version": "4.0.0", 732 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 733 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 734 | "dev": true, 735 | "engines": { 736 | "node": ">=10" 737 | }, 738 | "funding": { 739 | "url": "https://github.com/sponsors/sindresorhus" 740 | } 741 | }, 742 | "node_modules/estree-walker": { 743 | "version": "0.6.1", 744 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 745 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 746 | "dev": true 747 | }, 748 | "node_modules/exit-hook": { 749 | "version": "2.2.1", 750 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 751 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 752 | "dev": true, 753 | "engines": { 754 | "node": ">=6" 755 | }, 756 | "funding": { 757 | "url": "https://github.com/sponsors/sindresorhus" 758 | } 759 | }, 760 | "node_modules/fill-range": { 761 | "version": "7.1.1", 762 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 763 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 764 | "dev": true, 765 | "dependencies": { 766 | "to-regex-range": "^5.0.1" 767 | }, 768 | "engines": { 769 | "node": ">=8" 770 | } 771 | }, 772 | "node_modules/fsevents": { 773 | "version": "2.3.3", 774 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 775 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 776 | "dev": true, 777 | "hasInstallScript": true, 778 | "optional": true, 779 | "os": [ 780 | "darwin" 781 | ], 782 | "engines": { 783 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 784 | } 785 | }, 786 | "node_modules/function-bind": { 787 | "version": "1.1.2", 788 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 789 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 790 | "dev": true, 791 | "funding": { 792 | "url": "https://github.com/sponsors/ljharb" 793 | } 794 | }, 795 | "node_modules/get-source": { 796 | "version": "2.0.12", 797 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 798 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 799 | "dev": true, 800 | "dependencies": { 801 | "data-uri-to-buffer": "^2.0.0", 802 | "source-map": "^0.6.1" 803 | } 804 | }, 805 | "node_modules/glob-parent": { 806 | "version": "5.1.2", 807 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 808 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 809 | "dev": true, 810 | "dependencies": { 811 | "is-glob": "^4.0.1" 812 | }, 813 | "engines": { 814 | "node": ">= 6" 815 | } 816 | }, 817 | "node_modules/glob-to-regexp": { 818 | "version": "0.4.1", 819 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 820 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 821 | "dev": true 822 | }, 823 | "node_modules/hasown": { 824 | "version": "2.0.2", 825 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 826 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 827 | "dev": true, 828 | "dependencies": { 829 | "function-bind": "^1.1.2" 830 | }, 831 | "engines": { 832 | "node": ">= 0.4" 833 | } 834 | }, 835 | "node_modules/hono": { 836 | "version": "4.6.5", 837 | "resolved": "https://registry.npmjs.org/hono/-/hono-4.6.5.tgz", 838 | "integrity": "sha512-qsmN3V5fgtwdKARGLgwwHvcdLKursMd+YOt69eGpl1dUCJb8mCd7hZfyZnBYjxCegBG7qkJRQRUy2oO25yHcyQ==", 839 | "engines": { 840 | "node": ">=16.9.0" 841 | } 842 | }, 843 | "node_modules/is-binary-path": { 844 | "version": "2.1.0", 845 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 846 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 847 | "dev": true, 848 | "dependencies": { 849 | "binary-extensions": "^2.0.0" 850 | }, 851 | "engines": { 852 | "node": ">=8" 853 | } 854 | }, 855 | "node_modules/is-core-module": { 856 | "version": "2.13.1", 857 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 858 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 859 | "dev": true, 860 | "dependencies": { 861 | "hasown": "^2.0.0" 862 | }, 863 | "funding": { 864 | "url": "https://github.com/sponsors/ljharb" 865 | } 866 | }, 867 | "node_modules/is-extglob": { 868 | "version": "2.1.1", 869 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 870 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 871 | "dev": true, 872 | "engines": { 873 | "node": ">=0.10.0" 874 | } 875 | }, 876 | "node_modules/is-glob": { 877 | "version": "4.0.3", 878 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 879 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 880 | "dev": true, 881 | "dependencies": { 882 | "is-extglob": "^2.1.1" 883 | }, 884 | "engines": { 885 | "node": ">=0.10.0" 886 | } 887 | }, 888 | "node_modules/is-number": { 889 | "version": "7.0.0", 890 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 891 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 892 | "dev": true, 893 | "engines": { 894 | "node": ">=0.12.0" 895 | } 896 | }, 897 | "node_modules/magic-string": { 898 | "version": "0.25.9", 899 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 900 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 901 | "dev": true, 902 | "dependencies": { 903 | "sourcemap-codec": "^1.4.8" 904 | } 905 | }, 906 | "node_modules/mime": { 907 | "version": "3.0.0", 908 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 909 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 910 | "dev": true, 911 | "bin": { 912 | "mime": "cli.js" 913 | }, 914 | "engines": { 915 | "node": ">=10.0.0" 916 | } 917 | }, 918 | "node_modules/miniflare": { 919 | "version": "3.20240329.0", 920 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240329.0.tgz", 921 | "integrity": "sha512-kdHlMwhV241kck5oh8uyKPIhCusP1BL4+iOSeJZgcJ46EATA6crWtYqlARNU9t/iYXhzKhXOlOPJjjlCJuOgTA==", 922 | "dev": true, 923 | "dependencies": { 924 | "@cspotcode/source-map-support": "0.8.1", 925 | "acorn": "^8.8.0", 926 | "acorn-walk": "^8.2.0", 927 | "capnp-ts": "^0.7.0", 928 | "exit-hook": "^2.2.1", 929 | "glob-to-regexp": "^0.4.1", 930 | "stoppable": "^1.1.0", 931 | "undici": "^5.28.2", 932 | "workerd": "1.20240329.0", 933 | "ws": "^8.11.0", 934 | "youch": "^3.2.2", 935 | "zod": "^3.20.6" 936 | }, 937 | "bin": { 938 | "miniflare": "bootstrap.js" 939 | }, 940 | "engines": { 941 | "node": ">=16.13" 942 | } 943 | }, 944 | "node_modules/ms": { 945 | "version": "2.1.2", 946 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 947 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 948 | "dev": true 949 | }, 950 | "node_modules/mustache": { 951 | "version": "4.2.0", 952 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 953 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 954 | "dev": true, 955 | "bin": { 956 | "mustache": "bin/mustache" 957 | } 958 | }, 959 | "node_modules/nanoid": { 960 | "version": "3.3.7", 961 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 962 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 963 | "dev": true, 964 | "funding": [ 965 | { 966 | "type": "github", 967 | "url": "https://github.com/sponsors/ai" 968 | } 969 | ], 970 | "bin": { 971 | "nanoid": "bin/nanoid.cjs" 972 | }, 973 | "engines": { 974 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 975 | } 976 | }, 977 | "node_modules/node-forge": { 978 | "version": "1.3.1", 979 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", 980 | "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", 981 | "dev": true, 982 | "engines": { 983 | "node": ">= 6.13.0" 984 | } 985 | }, 986 | "node_modules/normalize-path": { 987 | "version": "3.0.0", 988 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 989 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 990 | "dev": true, 991 | "engines": { 992 | "node": ">=0.10.0" 993 | } 994 | }, 995 | "node_modules/path-parse": { 996 | "version": "1.0.7", 997 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 998 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 999 | "dev": true 1000 | }, 1001 | "node_modules/path-to-regexp": { 1002 | "version": "6.2.1", 1003 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", 1004 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", 1005 | "dev": true 1006 | }, 1007 | "node_modules/picomatch": { 1008 | "version": "2.3.1", 1009 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1010 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1011 | "dev": true, 1012 | "engines": { 1013 | "node": ">=8.6" 1014 | }, 1015 | "funding": { 1016 | "url": "https://github.com/sponsors/jonschlinkert" 1017 | } 1018 | }, 1019 | "node_modules/prettier": { 1020 | "version": "3.2.5", 1021 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", 1022 | "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", 1023 | "dev": true, 1024 | "bin": { 1025 | "prettier": "bin/prettier.cjs" 1026 | }, 1027 | "engines": { 1028 | "node": ">=14" 1029 | }, 1030 | "funding": { 1031 | "url": "https://github.com/prettier/prettier?sponsor=1" 1032 | } 1033 | }, 1034 | "node_modules/printable-characters": { 1035 | "version": "1.0.42", 1036 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 1037 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 1038 | "dev": true 1039 | }, 1040 | "node_modules/readdirp": { 1041 | "version": "3.6.0", 1042 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1043 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1044 | "dev": true, 1045 | "dependencies": { 1046 | "picomatch": "^2.2.1" 1047 | }, 1048 | "engines": { 1049 | "node": ">=8.10.0" 1050 | } 1051 | }, 1052 | "node_modules/resolve": { 1053 | "version": "1.22.8", 1054 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1055 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1056 | "dev": true, 1057 | "dependencies": { 1058 | "is-core-module": "^2.13.0", 1059 | "path-parse": "^1.0.7", 1060 | "supports-preserve-symlinks-flag": "^1.0.0" 1061 | }, 1062 | "bin": { 1063 | "resolve": "bin/resolve" 1064 | }, 1065 | "funding": { 1066 | "url": "https://github.com/sponsors/ljharb" 1067 | } 1068 | }, 1069 | "node_modules/resolve.exports": { 1070 | "version": "2.0.2", 1071 | "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", 1072 | "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", 1073 | "dev": true, 1074 | "engines": { 1075 | "node": ">=10" 1076 | } 1077 | }, 1078 | "node_modules/rollup-plugin-inject": { 1079 | "version": "3.0.2", 1080 | "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", 1081 | "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", 1082 | "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", 1083 | "dev": true, 1084 | "dependencies": { 1085 | "estree-walker": "^0.6.1", 1086 | "magic-string": "^0.25.3", 1087 | "rollup-pluginutils": "^2.8.1" 1088 | } 1089 | }, 1090 | "node_modules/rollup-plugin-node-polyfills": { 1091 | "version": "0.2.1", 1092 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", 1093 | "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", 1094 | "dev": true, 1095 | "dependencies": { 1096 | "rollup-plugin-inject": "^3.0.0" 1097 | } 1098 | }, 1099 | "node_modules/rollup-pluginutils": { 1100 | "version": "2.8.2", 1101 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 1102 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 1103 | "dev": true, 1104 | "dependencies": { 1105 | "estree-walker": "^0.6.1" 1106 | } 1107 | }, 1108 | "node_modules/selfsigned": { 1109 | "version": "2.4.1", 1110 | "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", 1111 | "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", 1112 | "dev": true, 1113 | "dependencies": { 1114 | "@types/node-forge": "^1.3.0", 1115 | "node-forge": "^1" 1116 | }, 1117 | "engines": { 1118 | "node": ">=10" 1119 | } 1120 | }, 1121 | "node_modules/simple-runtypes": { 1122 | "version": "7.1.3", 1123 | "resolved": "https://registry.npmjs.org/simple-runtypes/-/simple-runtypes-7.1.3.tgz", 1124 | "integrity": "sha512-NDxAtKPHQplTyfdt2nAUuTV7RVwEBIRFZT7Z+g4eso5JGI5AwllpRcU9ibmxs+8vKKNrhebgK5zvCX3j8DoHhw==" 1125 | }, 1126 | "node_modules/source-map": { 1127 | "version": "0.6.1", 1128 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1129 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1130 | "dev": true, 1131 | "engines": { 1132 | "node": ">=0.10.0" 1133 | } 1134 | }, 1135 | "node_modules/sourcemap-codec": { 1136 | "version": "1.4.8", 1137 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1138 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1139 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 1140 | "dev": true 1141 | }, 1142 | "node_modules/stacktracey": { 1143 | "version": "2.1.8", 1144 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 1145 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 1146 | "dev": true, 1147 | "dependencies": { 1148 | "as-table": "^1.0.36", 1149 | "get-source": "^2.0.12" 1150 | } 1151 | }, 1152 | "node_modules/stoppable": { 1153 | "version": "1.1.0", 1154 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 1155 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 1156 | "dev": true, 1157 | "engines": { 1158 | "node": ">=4", 1159 | "npm": ">=6" 1160 | } 1161 | }, 1162 | "node_modules/supports-preserve-symlinks-flag": { 1163 | "version": "1.0.0", 1164 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1165 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1166 | "dev": true, 1167 | "engines": { 1168 | "node": ">= 0.4" 1169 | }, 1170 | "funding": { 1171 | "url": "https://github.com/sponsors/ljharb" 1172 | } 1173 | }, 1174 | "node_modules/to-regex-range": { 1175 | "version": "5.0.1", 1176 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1177 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1178 | "dev": true, 1179 | "dependencies": { 1180 | "is-number": "^7.0.0" 1181 | }, 1182 | "engines": { 1183 | "node": ">=8.0" 1184 | } 1185 | }, 1186 | "node_modules/tslib": { 1187 | "version": "2.6.2", 1188 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 1189 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 1190 | "dev": true 1191 | }, 1192 | "node_modules/undici": { 1193 | "version": "5.28.5", 1194 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", 1195 | "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", 1196 | "dev": true, 1197 | "license": "MIT", 1198 | "dependencies": { 1199 | "@fastify/busboy": "^2.0.0" 1200 | }, 1201 | "engines": { 1202 | "node": ">=14.0" 1203 | } 1204 | }, 1205 | "node_modules/undici-types": { 1206 | "version": "5.26.5", 1207 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1208 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1209 | "dev": true 1210 | }, 1211 | "node_modules/workerd": { 1212 | "version": "1.20240329.0", 1213 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240329.0.tgz", 1214 | "integrity": "sha512-6wWuMOwWsp3K6447XsI/MZYFq0KlpV2zVbbNFEkv3N7UgJJKaHGwL/hilr6RlS4UFLU4co8nrF2lc5uR781HKg==", 1215 | "dev": true, 1216 | "hasInstallScript": true, 1217 | "bin": { 1218 | "workerd": "bin/workerd" 1219 | }, 1220 | "engines": { 1221 | "node": ">=16" 1222 | }, 1223 | "optionalDependencies": { 1224 | "@cloudflare/workerd-darwin-64": "1.20240329.0", 1225 | "@cloudflare/workerd-darwin-arm64": "1.20240329.0", 1226 | "@cloudflare/workerd-linux-64": "1.20240329.0", 1227 | "@cloudflare/workerd-linux-arm64": "1.20240329.0", 1228 | "@cloudflare/workerd-windows-64": "1.20240329.0" 1229 | } 1230 | }, 1231 | "node_modules/wrangler": { 1232 | "version": "3.44.0", 1233 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.44.0.tgz", 1234 | "integrity": "sha512-7tMJslGQX3f2zD18k7oPY1YcE+mYe93DSX9XXuusf/lxOPgaaSaS01qXL3zYlOIn+3wG1LkxPH/0CqUk4jZarQ==", 1235 | "dev": true, 1236 | "dependencies": { 1237 | "@cloudflare/kv-asset-handler": "0.3.1", 1238 | "@esbuild-plugins/node-globals-polyfill": "^0.2.3", 1239 | "@esbuild-plugins/node-modules-polyfill": "^0.2.2", 1240 | "blake3-wasm": "^2.1.5", 1241 | "chokidar": "^3.5.3", 1242 | "esbuild": "0.17.19", 1243 | "miniflare": "3.20240329.0", 1244 | "nanoid": "^3.3.3", 1245 | "path-to-regexp": "^6.2.0", 1246 | "resolve": "^1.22.8", 1247 | "resolve.exports": "^2.0.2", 1248 | "selfsigned": "^2.0.1", 1249 | "source-map": "0.6.1", 1250 | "xxhash-wasm": "^1.0.1" 1251 | }, 1252 | "bin": { 1253 | "wrangler": "bin/wrangler.js", 1254 | "wrangler2": "bin/wrangler.js" 1255 | }, 1256 | "engines": { 1257 | "node": ">=16.17.0" 1258 | }, 1259 | "optionalDependencies": { 1260 | "fsevents": "~2.3.2" 1261 | }, 1262 | "peerDependencies": { 1263 | "@cloudflare/workers-types": "^4.20240320.1" 1264 | }, 1265 | "peerDependenciesMeta": { 1266 | "@cloudflare/workers-types": { 1267 | "optional": true 1268 | } 1269 | } 1270 | }, 1271 | "node_modules/ws": { 1272 | "version": "8.17.1", 1273 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", 1274 | "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", 1275 | "dev": true, 1276 | "engines": { 1277 | "node": ">=10.0.0" 1278 | }, 1279 | "peerDependencies": { 1280 | "bufferutil": "^4.0.1", 1281 | "utf-8-validate": ">=5.0.2" 1282 | }, 1283 | "peerDependenciesMeta": { 1284 | "bufferutil": { 1285 | "optional": true 1286 | }, 1287 | "utf-8-validate": { 1288 | "optional": true 1289 | } 1290 | } 1291 | }, 1292 | "node_modules/xxhash-wasm": { 1293 | "version": "1.0.2", 1294 | "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", 1295 | "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", 1296 | "dev": true 1297 | }, 1298 | "node_modules/youch": { 1299 | "version": "3.3.4", 1300 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", 1301 | "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", 1302 | "dev": true, 1303 | "dependencies": { 1304 | "cookie": "^0.7.1", 1305 | "mustache": "^4.2.0", 1306 | "stacktracey": "^2.1.8" 1307 | } 1308 | }, 1309 | "node_modules/zod": { 1310 | "version": "3.22.4", 1311 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", 1312 | "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", 1313 | "dev": true, 1314 | "funding": { 1315 | "url": "https://github.com/sponsors/colinhacks" 1316 | } 1317 | } 1318 | } 1319 | } 1320 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "worker-links", 3 | "version": "2.3.0", 4 | "description": "Simple link shortener for Cloudflare Workers.", 5 | "author": "Erisa A", 6 | "license": "MIT", 7 | "scripts": { 8 | "format": "prettier --write '**/*.{ts,js,css,json,md,html}'", 9 | "deploy": "wrangler deploy", 10 | "dev": "wrangler dev", 11 | "addsecret": "wrangler secret put WORKERLINKS_SECRET", 12 | "createkv": "wrangler kv:namespace create KV && echo '^^^ Replace the binding on line 12 of wrangler.toml with this' ^^^", 13 | "build": "wrangler publish --dry-run --outdir=./dist" 14 | }, 15 | "dependencies": { 16 | "hono": "^4.6.5", 17 | "simple-runtypes": "^7.1.3" 18 | }, 19 | "devDependencies": { 20 | "@cloudflare/workers-types": "^4.20231121.0", 21 | "prettier": "^3.2.5", 22 | "wrangler": "^3.44.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |