├── .github └── workflows │ └── deploy-to-workers.yml ├── .gitignore ├── MIT-LICENSE ├── README.md ├── images ├── done.png ├── triggers.png ├── workers-pages.png ├── workers-visit.png └── www.proxysites.ai.serp.ing.png ├── index.js ├── package-lock.json ├── package.json ├── workers.dev ├── README.md ├── images │ ├── create1.png │ ├── create2.png │ ├── deploy.png │ ├── done.png │ ├── edit.png │ └── edit2.png └── index.js └── wrangler.toml /.github/workflows/deploy-to-workers.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Worker 2 | on: 3 | push: 4 | branches: 5 | - main 6 | jobs: 7 | deploy_production: 8 | runs-on: ubuntu-latest 9 | timeout-minutes: 60 10 | environment: 11 | name: production 12 | steps: 13 | - uses: actions/checkout@v4 14 | - name: Build & Deploy Worker 15 | uses: cloudflare/wrangler-action@v3 16 | with: 17 | wranglerVersion: "3.57.0" 18 | apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} 19 | accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} 20 | environment: production -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | 3 | logs 4 | _.log 5 | npm-debug.log_ 6 | yarn-debug.log* 7 | yarn-error.log* 8 | lerna-debug.log* 9 | .pnpm-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | 13 | report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json 14 | 15 | # Runtime data 16 | 17 | pids 18 | _.pid 19 | _.seed 20 | \*.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | 28 | coverage 29 | \*.lcov 30 | 31 | # nyc test coverage 32 | 33 | .nyc_output 34 | 35 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 36 | 37 | .grunt 38 | 39 | # Bower dependency directory (https://bower.io/) 40 | 41 | bower_components 42 | 43 | # node-waf configuration 44 | 45 | .lock-wscript 46 | 47 | # Compiled binary addons (https://nodejs.org/api/addons.html) 48 | 49 | build/Release 50 | 51 | # Dependency directories 52 | 53 | node_modules/ 54 | jspm_packages/ 55 | 56 | # Snowpack dependency directory (https://snowpack.dev/) 57 | 58 | web_modules/ 59 | 60 | # TypeScript cache 61 | 62 | \*.tsbuildinfo 63 | 64 | # Optional npm cache directory 65 | 66 | .npm 67 | 68 | # Optional eslint cache 69 | 70 | .eslintcache 71 | 72 | # Optional stylelint cache 73 | 74 | .stylelintcache 75 | 76 | # Microbundle cache 77 | 78 | .rpt2_cache/ 79 | .rts2_cache_cjs/ 80 | .rts2_cache_es/ 81 | .rts2_cache_umd/ 82 | 83 | # Optional REPL history 84 | 85 | .node_repl_history 86 | 87 | # Output of 'npm pack' 88 | 89 | \*.tgz 90 | 91 | # Yarn Integrity file 92 | 93 | .yarn-integrity 94 | 95 | # dotenv environment variable files 96 | 97 | .env 98 | .env.development.local 99 | .env.test.local 100 | .env.production.local 101 | .env.local 102 | 103 | # parcel-bundler cache (https://parceljs.org/) 104 | 105 | .cache 106 | .parcel-cache 107 | 108 | # Next.js build output 109 | 110 | .next 111 | out 112 | 113 | # Nuxt.js build / generate output 114 | 115 | .nuxt 116 | dist 117 | 118 | # Gatsby files 119 | 120 | .cache/ 121 | 122 | # Comment in the public line in if your project uses Gatsby and not Next.js 123 | 124 | # https://nextjs.org/blog/next-9-1#public-directory-support 125 | 126 | # public 127 | 128 | # vuepress build output 129 | 130 | .vuepress/dist 131 | 132 | # vuepress v2.x temp and cache directory 133 | 134 | .temp 135 | .cache 136 | 137 | # Docusaurus cache and generated files 138 | 139 | .docusaurus 140 | 141 | # Serverless directories 142 | 143 | .serverless/ 144 | 145 | # FuseBox cache 146 | 147 | .fusebox/ 148 | 149 | # DynamoDB Local files 150 | 151 | .dynamodb/ 152 | 153 | # TernJS port file 154 | 155 | .tern-port 156 | 157 | # Stores VSCode versions used for testing VSCode extensions 158 | 159 | .vscode-test 160 | 161 | # yarn v2 162 | 163 | .yarn/cache 164 | .yarn/unplugged 165 | .yarn/build-state.yml 166 | .yarn/install-state.gz 167 | .pnp.\* 168 | 169 | # wrangler project 170 | 171 | .dev.vars 172 | .wrangler/ 173 | -------------------------------------------------------------------------------- /MIT-LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2024 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cloudflare Proxy Sites 2 | 3 | A powerful and easy-to-use website mirroring tool based on Cloudflare Workers. 4 | 5 | ## Proxy Sites: Vercel Version 6 | 7 | https://github.com/seadfeng/vercel-proxy-sites 8 | 9 | ## 🌟 Key Features 10 | 11 | - 🆓 Free to use 12 | - 🌐 Mirror any website with ease 13 | - 🚀 Quick deployment using Wrangler 14 | - 🔗 Support for multiple domains 15 | - 🤖 Automated deployment via GitHub Actions 16 | - 🛡️ Enhanced privacy and security 17 | - 🌍 Bypass geographical restrictions 18 | - ⚡ Improved access speed 19 | 20 | 21 | ## Two Types of Proxy Modes 22 | 23 | - Single-Site Reverse Proxy 24 | - Multi-Site Reverse Proxy 25 | 26 | 27 | ### Single-Site 28 | 29 | You can use the workers.dev subdomain to access without needing your own domain. When deploying, configure the `targetDomain` variable. 30 | 31 | ```js 32 | // workers.dev/index.js 33 | // replace to your target site domain 34 | const targetDomain = 'example.com'; 35 | ``` 36 | 37 | Code: [workers.dev/index.js](workers.dev/index.js) 38 | 39 | ### Multi-Site 40 | 41 | You need to have your own domain. The proxy site will be automatically recognized based on the domain name. After deployment, you only need to add custom domains according to the rules. Configure the `ownDomain` variable when deploying. 42 | 43 | ```js 44 | // index.js 45 | // replace to your domain 46 | const ownDomain = "example.com"; 47 | ``` 48 | 49 | The domain consists of two parts: target domain and own domain. For example: 50 | 51 | Proxy site address: [https://www.proxysites.ai.serp.ing](https://www.proxysites.ai.serp.ing) 52 | 53 | - **target domain**: www.proxysites.ai 54 | 55 | - **own domain**: serp.ing 56 | 57 | Code: [index.js](index.js) 58 | 59 | ![www.proxysites.ai.serp.ing.png](images/www.proxysites.ai.serp.ing.png) 60 | 61 | ## Local Deploy 62 | 63 | ### 1. install `wrangler` 64 | 65 | ```sh 66 | npm i -g wrangler 67 | ``` 68 | 69 | ### 2. Configure your own domain - **Important!** 70 | 71 | ```js 72 | // index.js 73 | // replace to your domain 74 | const ownDomain = "example.com"; 75 | ``` 76 | 77 | #### Use workers.dev default domain? 78 | 79 | This method only support single domain reverse proxy. 80 | 81 | Here is the code: 82 | 83 | [workers.dev/index.js](workers.dev/index.js) 84 | 85 | ```js 86 | // workers.dev/index.js 87 | // replace to your target site domain 88 | const targetDomain = 'example.com'; 89 | ``` 90 | 91 | Get your workers.dev visit: 92 | 93 | ![workers.dev domain](images/workers-visit.png) 94 | 95 | ### 3. deploy to workers 96 | 97 | ```sh 98 | # Login 99 | wrangler login 100 | 101 | # Deploy 102 | wrangler deploy 103 | ``` 104 | 105 | 106 | ## Or Deploy by Workflows 107 | 108 | To automate your deployment process, you can use GitHub Actions or a similar CI/CD tool. Below are the steps to set up your deployment workflow and the necessary GitHub secrets: 109 | 110 | ### Configure GitHub Secrets 111 | 112 | #### Add GitHub Secrets 113 | 114 | Store sensitive information as secrets in your GitHub repository. Navigate to your repository settings and add the following secrets: 115 | 116 | - **`CLOUDFLARE_API_TOKEN`**: Your Cloudflare **API token**. This token should have permissions to deploy and manage your Cloudflare Workers. 117 | - **`CLOUDFLARE_ACCOUNT_ID`**: Your Cloudflare account ID. 118 | 119 | 120 | #### To add secrets: 121 | 122 | - Go to your repository on GitHub. 123 | - Click on "Settings" in the top menu. 124 | - Select "Secrets" from the sidebar. 125 | - Click on "New repository secret" to add each secret. 126 | 127 | ## Manual Cloudflare Setup 128 | 129 | For detailed instructions, see [this guide](workers.dev/README.md) 130 | 131 | ## Configure Workers for Proxy Site 132 | 133 | eg. 134 | 135 | My root domain is `serp.ing`, 136 | 137 | proxy sites [www.proxysites.ai](https://www.proxysites.ai), [www.serpchecking.com](https://www.serpchecking.com) 138 | 139 | - [https://www.proxysites.ai.serp.ing](https://www.proxysites.ai.serp.ing) 140 | - [https://www.serpchecking.com.serp.ing](https://www.serpchecking.com.serp.ing) 141 | 142 | ### 1. Go Workers & Pages 143 | 144 | Make sure you have deployed to Workers 145 | 146 | ![Workers & Pages](images/workers-pages.png) 147 | 148 | ### 2. Add a custom domain for your Worker. 149 | 150 | Support multiple domain names, the following only set up a as an example 151 | 152 | ![Add a custom domain](images/triggers.png) 153 | 154 | 155 | ### 3. Done 156 | 157 | Ensure the certificate is active. 158 | 159 | ![Domain config ](images/done.png) 160 | 161 | 162 | ## 🤖 robots.txt Configuration 163 | 164 | Default configuration (recommended for privacy): 165 | 166 | ```js 167 | // index.js 168 | const robots = `User-agent: * 169 | Disallow: / 170 | `; 171 | ``` 172 | 173 | ⚠️ **Warning**: Modifying this may affect the indexed content of the mirrored site. 174 | 175 | ## 📜 Disclaimer 176 | 177 | This tool is for educational and personal use only. Users are responsible for complying with all applicable laws and regulations. The developers are not liable for any misuse or legal consequences. 178 | 179 | ## 🤝 Contributing 180 | 181 | Contributions are welcome! Feel free to submit issues or pull requests. 182 | -------------------------------------------------------------------------------- /images/done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/images/done.png -------------------------------------------------------------------------------- /images/triggers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/images/triggers.png -------------------------------------------------------------------------------- /images/workers-pages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/images/workers-pages.png -------------------------------------------------------------------------------- /images/workers-visit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/images/workers-visit.png -------------------------------------------------------------------------------- /images/www.proxysites.ai.serp.ing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/images/www.proxysites.ai.serp.ing.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | addEventListener('fetch', event => { 2 | event.respondWith(handleRequest(event.request)); 3 | }); 4 | 5 | const getTargetDomain = (host, rootDomain) => { 6 | return host.split(`.${rootDomain}`)[0]; 7 | } 8 | 9 | const ownDomain = "serp.ing"; 10 | 11 | async function handleRequest(request) { 12 | const url = new URL(request.url); 13 | const { host, pathname } = url; 14 | 15 | if (pathname === '/robots.txt') { 16 | const robots = `User-agent: * 17 | Disallow: / 18 | `; 19 | return new Response(robots,{ status: 200 }); 20 | } 21 | 22 | const targetDomain = getTargetDomain(host, ownDomain); 23 | const origin = `https://${targetDomain}`; 24 | const actualUrl = new URL(`${origin}${pathname}${url.search}${url.hash}`); 25 | 26 | const modifiedRequestInit = { 27 | method: request.method, 28 | headers: request.headers, 29 | redirect: 'follow' 30 | }; 31 | 32 | if (!['GET', 'HEAD'].includes(request.method)) { 33 | const requestBody = await request.clone().arrayBuffer(); 34 | modifiedRequestInit.body = requestBody; 35 | } 36 | 37 | const modifiedRequest = new Request(actualUrl, modifiedRequestInit); 38 | 39 | const response = await fetch(modifiedRequest); 40 | 41 | let body = await response.arrayBuffer(); 42 | const contentType = response.headers.get('content-type'); 43 | 44 | // Check if the 'content-type' exists and matches JavaScript or any text/* types (e.g., text/html, text/xml) 45 | if (contentType && ( /^(application\/x-javascript|text\/)/i.test(contentType))) { 46 | let text = new TextDecoder('utf-8').decode(body); 47 | 48 | // Replace all instances of the proxy site domain with the current host domain in the text 49 | text = text.replace(new RegExp( `(//|https?://)${targetDomain}`, 'g'), `$1${host}` ); 50 | body = new TextEncoder().encode(text).buffer; 51 | } 52 | 53 | const modifiedResponse = new Response(body, response); 54 | modifiedResponse.headers.set('Access-Control-Allow-Origin', '*'); 55 | return modifiedResponse; 56 | 57 | } 58 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare-proxy-sites", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "cloudflare-proxy-sites", 9 | "version": "0.0.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "wrangler": "^3.68.0" 13 | } 14 | }, 15 | "node_modules/@cloudflare/kv-asset-handler": { 16 | "version": "0.3.4", 17 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", 18 | "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", 19 | "dev": true, 20 | "dependencies": { 21 | "mime": "^3.0.0" 22 | }, 23 | "engines": { 24 | "node": ">=16.13" 25 | } 26 | }, 27 | "node_modules/@cloudflare/workerd-darwin-64": { 28 | "version": "1.20240725.0", 29 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240725.0.tgz", 30 | "integrity": "sha512-KpE7eycdZ9ON+tKBuTyqZh8SdFWHGrh2Ru9LcbpeFwb7O9gDQv9ceSdoV/T598qlT0a0yVKM62R6xa5ec0UOWA==", 31 | "cpu": [ 32 | "x64" 33 | ], 34 | "dev": true, 35 | "optional": true, 36 | "os": [ 37 | "darwin" 38 | ], 39 | "engines": { 40 | "node": ">=16" 41 | } 42 | }, 43 | "node_modules/@cloudflare/workerd-darwin-arm64": { 44 | "version": "1.20240725.0", 45 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240725.0.tgz", 46 | "integrity": "sha512-/UQlI04FdXLpPlDzzsWGz8TuKrMZKLowTo+8PkxgEiWIaBhE4DIDM5bwj3jM4Bs8yOLiL2ovQNpld5CnAKqA8g==", 47 | "cpu": [ 48 | "arm64" 49 | ], 50 | "dev": true, 51 | "optional": true, 52 | "os": [ 53 | "darwin" 54 | ], 55 | "engines": { 56 | "node": ">=16" 57 | } 58 | }, 59 | "node_modules/@cloudflare/workerd-linux-64": { 60 | "version": "1.20240725.0", 61 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240725.0.tgz", 62 | "integrity": "sha512-Z5t12qYLvHz0b3ZRBBm2HQ93RiHrAnjFfdhtjMcgJypAGkiWpOCEn2xar/WqDhMfqnk0sa8aYiYAbMAlP1WN6w==", 63 | "cpu": [ 64 | "x64" 65 | ], 66 | "dev": true, 67 | "optional": true, 68 | "os": [ 69 | "linux" 70 | ], 71 | "engines": { 72 | "node": ">=16" 73 | } 74 | }, 75 | "node_modules/@cloudflare/workerd-linux-arm64": { 76 | "version": "1.20240725.0", 77 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240725.0.tgz", 78 | "integrity": "sha512-j9gYXLOwOyNehLMzP7KxQ+Y6/nxcL9i6LTDJC6RChoaxLRbm0Y/9Otu+hfyzeNeRpt31ip6vqXZ1QQk6ygzI8A==", 79 | "cpu": [ 80 | "arm64" 81 | ], 82 | "dev": true, 83 | "optional": true, 84 | "os": [ 85 | "linux" 86 | ], 87 | "engines": { 88 | "node": ">=16" 89 | } 90 | }, 91 | "node_modules/@cloudflare/workerd-windows-64": { 92 | "version": "1.20240725.0", 93 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240725.0.tgz", 94 | "integrity": "sha512-fkrJLWNN6rrPjZ0eKJx328NVMo4BsainKxAfqaPMEd6uRwjOM8uN8V4sSLsXXP8GQMAx6hAG2hU86givS4GItg==", 95 | "cpu": [ 96 | "x64" 97 | ], 98 | "dev": true, 99 | "optional": true, 100 | "os": [ 101 | "win32" 102 | ], 103 | "engines": { 104 | "node": ">=16" 105 | } 106 | }, 107 | "node_modules/@cspotcode/source-map-support": { 108 | "version": "0.8.1", 109 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 110 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 111 | "dev": true, 112 | "dependencies": { 113 | "@jridgewell/trace-mapping": "0.3.9" 114 | }, 115 | "engines": { 116 | "node": ">=12" 117 | } 118 | }, 119 | "node_modules/@esbuild-plugins/node-globals-polyfill": { 120 | "version": "0.2.3", 121 | "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", 122 | "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", 123 | "dev": true, 124 | "peerDependencies": { 125 | "esbuild": "*" 126 | } 127 | }, 128 | "node_modules/@esbuild-plugins/node-modules-polyfill": { 129 | "version": "0.2.2", 130 | "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", 131 | "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", 132 | "dev": true, 133 | "dependencies": { 134 | "escape-string-regexp": "^4.0.0", 135 | "rollup-plugin-node-polyfills": "^0.2.1" 136 | }, 137 | "peerDependencies": { 138 | "esbuild": "*" 139 | } 140 | }, 141 | "node_modules/@esbuild/android-arm": { 142 | "version": "0.17.19", 143 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", 144 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", 145 | "cpu": [ 146 | "arm" 147 | ], 148 | "dev": true, 149 | "optional": true, 150 | "os": [ 151 | "android" 152 | ], 153 | "engines": { 154 | "node": ">=12" 155 | } 156 | }, 157 | "node_modules/@esbuild/android-arm64": { 158 | "version": "0.17.19", 159 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", 160 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", 161 | "cpu": [ 162 | "arm64" 163 | ], 164 | "dev": true, 165 | "optional": true, 166 | "os": [ 167 | "android" 168 | ], 169 | "engines": { 170 | "node": ">=12" 171 | } 172 | }, 173 | "node_modules/@esbuild/android-x64": { 174 | "version": "0.17.19", 175 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", 176 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", 177 | "cpu": [ 178 | "x64" 179 | ], 180 | "dev": true, 181 | "optional": true, 182 | "os": [ 183 | "android" 184 | ], 185 | "engines": { 186 | "node": ">=12" 187 | } 188 | }, 189 | "node_modules/@esbuild/darwin-arm64": { 190 | "version": "0.17.19", 191 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", 192 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", 193 | "cpu": [ 194 | "arm64" 195 | ], 196 | "dev": true, 197 | "optional": true, 198 | "os": [ 199 | "darwin" 200 | ], 201 | "engines": { 202 | "node": ">=12" 203 | } 204 | }, 205 | "node_modules/@esbuild/darwin-x64": { 206 | "version": "0.17.19", 207 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", 208 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", 209 | "cpu": [ 210 | "x64" 211 | ], 212 | "dev": true, 213 | "optional": true, 214 | "os": [ 215 | "darwin" 216 | ], 217 | "engines": { 218 | "node": ">=12" 219 | } 220 | }, 221 | "node_modules/@esbuild/freebsd-arm64": { 222 | "version": "0.17.19", 223 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", 224 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", 225 | "cpu": [ 226 | "arm64" 227 | ], 228 | "dev": true, 229 | "optional": true, 230 | "os": [ 231 | "freebsd" 232 | ], 233 | "engines": { 234 | "node": ">=12" 235 | } 236 | }, 237 | "node_modules/@esbuild/freebsd-x64": { 238 | "version": "0.17.19", 239 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", 240 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", 241 | "cpu": [ 242 | "x64" 243 | ], 244 | "dev": true, 245 | "optional": true, 246 | "os": [ 247 | "freebsd" 248 | ], 249 | "engines": { 250 | "node": ">=12" 251 | } 252 | }, 253 | "node_modules/@esbuild/linux-arm": { 254 | "version": "0.17.19", 255 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", 256 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", 257 | "cpu": [ 258 | "arm" 259 | ], 260 | "dev": true, 261 | "optional": true, 262 | "os": [ 263 | "linux" 264 | ], 265 | "engines": { 266 | "node": ">=12" 267 | } 268 | }, 269 | "node_modules/@esbuild/linux-arm64": { 270 | "version": "0.17.19", 271 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", 272 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", 273 | "cpu": [ 274 | "arm64" 275 | ], 276 | "dev": true, 277 | "optional": true, 278 | "os": [ 279 | "linux" 280 | ], 281 | "engines": { 282 | "node": ">=12" 283 | } 284 | }, 285 | "node_modules/@esbuild/linux-ia32": { 286 | "version": "0.17.19", 287 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", 288 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", 289 | "cpu": [ 290 | "ia32" 291 | ], 292 | "dev": true, 293 | "optional": true, 294 | "os": [ 295 | "linux" 296 | ], 297 | "engines": { 298 | "node": ">=12" 299 | } 300 | }, 301 | "node_modules/@esbuild/linux-loong64": { 302 | "version": "0.17.19", 303 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", 304 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", 305 | "cpu": [ 306 | "loong64" 307 | ], 308 | "dev": true, 309 | "optional": true, 310 | "os": [ 311 | "linux" 312 | ], 313 | "engines": { 314 | "node": ">=12" 315 | } 316 | }, 317 | "node_modules/@esbuild/linux-mips64el": { 318 | "version": "0.17.19", 319 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", 320 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", 321 | "cpu": [ 322 | "mips64el" 323 | ], 324 | "dev": true, 325 | "optional": true, 326 | "os": [ 327 | "linux" 328 | ], 329 | "engines": { 330 | "node": ">=12" 331 | } 332 | }, 333 | "node_modules/@esbuild/linux-ppc64": { 334 | "version": "0.17.19", 335 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", 336 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", 337 | "cpu": [ 338 | "ppc64" 339 | ], 340 | "dev": true, 341 | "optional": true, 342 | "os": [ 343 | "linux" 344 | ], 345 | "engines": { 346 | "node": ">=12" 347 | } 348 | }, 349 | "node_modules/@esbuild/linux-riscv64": { 350 | "version": "0.17.19", 351 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", 352 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", 353 | "cpu": [ 354 | "riscv64" 355 | ], 356 | "dev": true, 357 | "optional": true, 358 | "os": [ 359 | "linux" 360 | ], 361 | "engines": { 362 | "node": ">=12" 363 | } 364 | }, 365 | "node_modules/@esbuild/linux-s390x": { 366 | "version": "0.17.19", 367 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", 368 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", 369 | "cpu": [ 370 | "s390x" 371 | ], 372 | "dev": true, 373 | "optional": true, 374 | "os": [ 375 | "linux" 376 | ], 377 | "engines": { 378 | "node": ">=12" 379 | } 380 | }, 381 | "node_modules/@esbuild/linux-x64": { 382 | "version": "0.17.19", 383 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", 384 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", 385 | "cpu": [ 386 | "x64" 387 | ], 388 | "dev": true, 389 | "optional": true, 390 | "os": [ 391 | "linux" 392 | ], 393 | "engines": { 394 | "node": ">=12" 395 | } 396 | }, 397 | "node_modules/@esbuild/netbsd-x64": { 398 | "version": "0.17.19", 399 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", 400 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", 401 | "cpu": [ 402 | "x64" 403 | ], 404 | "dev": true, 405 | "optional": true, 406 | "os": [ 407 | "netbsd" 408 | ], 409 | "engines": { 410 | "node": ">=12" 411 | } 412 | }, 413 | "node_modules/@esbuild/openbsd-x64": { 414 | "version": "0.17.19", 415 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", 416 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", 417 | "cpu": [ 418 | "x64" 419 | ], 420 | "dev": true, 421 | "optional": true, 422 | "os": [ 423 | "openbsd" 424 | ], 425 | "engines": { 426 | "node": ">=12" 427 | } 428 | }, 429 | "node_modules/@esbuild/sunos-x64": { 430 | "version": "0.17.19", 431 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", 432 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", 433 | "cpu": [ 434 | "x64" 435 | ], 436 | "dev": true, 437 | "optional": true, 438 | "os": [ 439 | "sunos" 440 | ], 441 | "engines": { 442 | "node": ">=12" 443 | } 444 | }, 445 | "node_modules/@esbuild/win32-arm64": { 446 | "version": "0.17.19", 447 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", 448 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", 449 | "cpu": [ 450 | "arm64" 451 | ], 452 | "dev": true, 453 | "optional": true, 454 | "os": [ 455 | "win32" 456 | ], 457 | "engines": { 458 | "node": ">=12" 459 | } 460 | }, 461 | "node_modules/@esbuild/win32-ia32": { 462 | "version": "0.17.19", 463 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", 464 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", 465 | "cpu": [ 466 | "ia32" 467 | ], 468 | "dev": true, 469 | "optional": true, 470 | "os": [ 471 | "win32" 472 | ], 473 | "engines": { 474 | "node": ">=12" 475 | } 476 | }, 477 | "node_modules/@esbuild/win32-x64": { 478 | "version": "0.17.19", 479 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 480 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 481 | "cpu": [ 482 | "x64" 483 | ], 484 | "dev": true, 485 | "optional": true, 486 | "os": [ 487 | "win32" 488 | ], 489 | "engines": { 490 | "node": ">=12" 491 | } 492 | }, 493 | "node_modules/@fastify/busboy": { 494 | "version": "2.1.1", 495 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 496 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 497 | "dev": true, 498 | "engines": { 499 | "node": ">=14" 500 | } 501 | }, 502 | "node_modules/@jridgewell/resolve-uri": { 503 | "version": "3.1.2", 504 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 505 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 506 | "dev": true, 507 | "engines": { 508 | "node": ">=6.0.0" 509 | } 510 | }, 511 | "node_modules/@jridgewell/sourcemap-codec": { 512 | "version": "1.5.0", 513 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 514 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 515 | "dev": true 516 | }, 517 | "node_modules/@jridgewell/trace-mapping": { 518 | "version": "0.3.9", 519 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 520 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 521 | "dev": true, 522 | "dependencies": { 523 | "@jridgewell/resolve-uri": "^3.0.3", 524 | "@jridgewell/sourcemap-codec": "^1.4.10" 525 | } 526 | }, 527 | "node_modules/@types/node": { 528 | "version": "22.1.0", 529 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", 530 | "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", 531 | "dev": true, 532 | "dependencies": { 533 | "undici-types": "~6.13.0" 534 | } 535 | }, 536 | "node_modules/@types/node-forge": { 537 | "version": "1.3.11", 538 | "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", 539 | "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", 540 | "dev": true, 541 | "dependencies": { 542 | "@types/node": "*" 543 | } 544 | }, 545 | "node_modules/acorn": { 546 | "version": "8.12.1", 547 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 548 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 549 | "dev": true, 550 | "bin": { 551 | "acorn": "bin/acorn" 552 | }, 553 | "engines": { 554 | "node": ">=0.4.0" 555 | } 556 | }, 557 | "node_modules/acorn-walk": { 558 | "version": "8.3.3", 559 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", 560 | "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", 561 | "dev": true, 562 | "dependencies": { 563 | "acorn": "^8.11.0" 564 | }, 565 | "engines": { 566 | "node": ">=0.4.0" 567 | } 568 | }, 569 | "node_modules/anymatch": { 570 | "version": "3.1.3", 571 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 572 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 573 | "dev": true, 574 | "dependencies": { 575 | "normalize-path": "^3.0.0", 576 | "picomatch": "^2.0.4" 577 | }, 578 | "engines": { 579 | "node": ">= 8" 580 | } 581 | }, 582 | "node_modules/as-table": { 583 | "version": "1.0.55", 584 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 585 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 586 | "dev": true, 587 | "dependencies": { 588 | "printable-characters": "^1.0.42" 589 | } 590 | }, 591 | "node_modules/binary-extensions": { 592 | "version": "2.3.0", 593 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 594 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 595 | "dev": true, 596 | "engines": { 597 | "node": ">=8" 598 | }, 599 | "funding": { 600 | "url": "https://github.com/sponsors/sindresorhus" 601 | } 602 | }, 603 | "node_modules/blake3-wasm": { 604 | "version": "2.1.5", 605 | "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", 606 | "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", 607 | "dev": true 608 | }, 609 | "node_modules/braces": { 610 | "version": "3.0.3", 611 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 612 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 613 | "dev": true, 614 | "dependencies": { 615 | "fill-range": "^7.1.1" 616 | }, 617 | "engines": { 618 | "node": ">=8" 619 | } 620 | }, 621 | "node_modules/capnp-ts": { 622 | "version": "0.7.0", 623 | "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", 624 | "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", 625 | "dev": true, 626 | "dependencies": { 627 | "debug": "^4.3.1", 628 | "tslib": "^2.2.0" 629 | } 630 | }, 631 | "node_modules/chokidar": { 632 | "version": "3.6.0", 633 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 634 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 635 | "dev": true, 636 | "dependencies": { 637 | "anymatch": "~3.1.2", 638 | "braces": "~3.0.2", 639 | "glob-parent": "~5.1.2", 640 | "is-binary-path": "~2.1.0", 641 | "is-glob": "~4.0.1", 642 | "normalize-path": "~3.0.0", 643 | "readdirp": "~3.6.0" 644 | }, 645 | "engines": { 646 | "node": ">= 8.10.0" 647 | }, 648 | "funding": { 649 | "url": "https://paulmillr.com/funding/" 650 | }, 651 | "optionalDependencies": { 652 | "fsevents": "~2.3.2" 653 | } 654 | }, 655 | "node_modules/consola": { 656 | "version": "3.2.3", 657 | "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", 658 | "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", 659 | "dev": true, 660 | "engines": { 661 | "node": "^14.18.0 || >=16.10.0" 662 | } 663 | }, 664 | "node_modules/cookie": { 665 | "version": "0.5.0", 666 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 667 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 668 | "dev": true, 669 | "engines": { 670 | "node": ">= 0.6" 671 | } 672 | }, 673 | "node_modules/data-uri-to-buffer": { 674 | "version": "2.0.2", 675 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 676 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 677 | "dev": true 678 | }, 679 | "node_modules/date-fns": { 680 | "version": "3.6.0", 681 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", 682 | "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", 683 | "dev": true, 684 | "funding": { 685 | "type": "github", 686 | "url": "https://github.com/sponsors/kossnocorp" 687 | } 688 | }, 689 | "node_modules/debug": { 690 | "version": "4.3.6", 691 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 692 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 693 | "dev": true, 694 | "dependencies": { 695 | "ms": "2.1.2" 696 | }, 697 | "engines": { 698 | "node": ">=6.0" 699 | }, 700 | "peerDependenciesMeta": { 701 | "supports-color": { 702 | "optional": true 703 | } 704 | } 705 | }, 706 | "node_modules/defu": { 707 | "version": "6.1.4", 708 | "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 709 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 710 | "dev": true 711 | }, 712 | "node_modules/esbuild": { 713 | "version": "0.17.19", 714 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 715 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 716 | "dev": true, 717 | "hasInstallScript": true, 718 | "bin": { 719 | "esbuild": "bin/esbuild" 720 | }, 721 | "engines": { 722 | "node": ">=12" 723 | }, 724 | "optionalDependencies": { 725 | "@esbuild/android-arm": "0.17.19", 726 | "@esbuild/android-arm64": "0.17.19", 727 | "@esbuild/android-x64": "0.17.19", 728 | "@esbuild/darwin-arm64": "0.17.19", 729 | "@esbuild/darwin-x64": "0.17.19", 730 | "@esbuild/freebsd-arm64": "0.17.19", 731 | "@esbuild/freebsd-x64": "0.17.19", 732 | "@esbuild/linux-arm": "0.17.19", 733 | "@esbuild/linux-arm64": "0.17.19", 734 | "@esbuild/linux-ia32": "0.17.19", 735 | "@esbuild/linux-loong64": "0.17.19", 736 | "@esbuild/linux-mips64el": "0.17.19", 737 | "@esbuild/linux-ppc64": "0.17.19", 738 | "@esbuild/linux-riscv64": "0.17.19", 739 | "@esbuild/linux-s390x": "0.17.19", 740 | "@esbuild/linux-x64": "0.17.19", 741 | "@esbuild/netbsd-x64": "0.17.19", 742 | "@esbuild/openbsd-x64": "0.17.19", 743 | "@esbuild/sunos-x64": "0.17.19", 744 | "@esbuild/win32-arm64": "0.17.19", 745 | "@esbuild/win32-ia32": "0.17.19", 746 | "@esbuild/win32-x64": "0.17.19" 747 | } 748 | }, 749 | "node_modules/escape-string-regexp": { 750 | "version": "4.0.0", 751 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 752 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 753 | "dev": true, 754 | "engines": { 755 | "node": ">=10" 756 | }, 757 | "funding": { 758 | "url": "https://github.com/sponsors/sindresorhus" 759 | } 760 | }, 761 | "node_modules/estree-walker": { 762 | "version": "0.6.1", 763 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 764 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 765 | "dev": true 766 | }, 767 | "node_modules/exit-hook": { 768 | "version": "2.2.1", 769 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 770 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 771 | "dev": true, 772 | "engines": { 773 | "node": ">=6" 774 | }, 775 | "funding": { 776 | "url": "https://github.com/sponsors/sindresorhus" 777 | } 778 | }, 779 | "node_modules/fill-range": { 780 | "version": "7.1.1", 781 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 782 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 783 | "dev": true, 784 | "dependencies": { 785 | "to-regex-range": "^5.0.1" 786 | }, 787 | "engines": { 788 | "node": ">=8" 789 | } 790 | }, 791 | "node_modules/fsevents": { 792 | "version": "2.3.3", 793 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 794 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 795 | "dev": true, 796 | "hasInstallScript": true, 797 | "optional": true, 798 | "os": [ 799 | "darwin" 800 | ], 801 | "engines": { 802 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 803 | } 804 | }, 805 | "node_modules/function-bind": { 806 | "version": "1.1.2", 807 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 808 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 809 | "dev": true, 810 | "funding": { 811 | "url": "https://github.com/sponsors/ljharb" 812 | } 813 | }, 814 | "node_modules/get-source": { 815 | "version": "2.0.12", 816 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 817 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 818 | "dev": true, 819 | "dependencies": { 820 | "data-uri-to-buffer": "^2.0.0", 821 | "source-map": "^0.6.1" 822 | } 823 | }, 824 | "node_modules/glob-parent": { 825 | "version": "5.1.2", 826 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 827 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 828 | "dev": true, 829 | "dependencies": { 830 | "is-glob": "^4.0.1" 831 | }, 832 | "engines": { 833 | "node": ">= 6" 834 | } 835 | }, 836 | "node_modules/glob-to-regexp": { 837 | "version": "0.4.1", 838 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 839 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 840 | "dev": true 841 | }, 842 | "node_modules/hasown": { 843 | "version": "2.0.2", 844 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 845 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 846 | "dev": true, 847 | "dependencies": { 848 | "function-bind": "^1.1.2" 849 | }, 850 | "engines": { 851 | "node": ">= 0.4" 852 | } 853 | }, 854 | "node_modules/is-binary-path": { 855 | "version": "2.1.0", 856 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 857 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 858 | "dev": true, 859 | "dependencies": { 860 | "binary-extensions": "^2.0.0" 861 | }, 862 | "engines": { 863 | "node": ">=8" 864 | } 865 | }, 866 | "node_modules/is-core-module": { 867 | "version": "2.15.0", 868 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", 869 | "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", 870 | "dev": true, 871 | "dependencies": { 872 | "hasown": "^2.0.2" 873 | }, 874 | "engines": { 875 | "node": ">= 0.4" 876 | }, 877 | "funding": { 878 | "url": "https://github.com/sponsors/ljharb" 879 | } 880 | }, 881 | "node_modules/is-extglob": { 882 | "version": "2.1.1", 883 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 884 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 885 | "dev": true, 886 | "engines": { 887 | "node": ">=0.10.0" 888 | } 889 | }, 890 | "node_modules/is-glob": { 891 | "version": "4.0.3", 892 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 893 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 894 | "dev": true, 895 | "dependencies": { 896 | "is-extglob": "^2.1.1" 897 | }, 898 | "engines": { 899 | "node": ">=0.10.0" 900 | } 901 | }, 902 | "node_modules/is-number": { 903 | "version": "7.0.0", 904 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 905 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 906 | "dev": true, 907 | "engines": { 908 | "node": ">=0.12.0" 909 | } 910 | }, 911 | "node_modules/magic-string": { 912 | "version": "0.25.9", 913 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 914 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 915 | "dev": true, 916 | "dependencies": { 917 | "sourcemap-codec": "^1.4.8" 918 | } 919 | }, 920 | "node_modules/mime": { 921 | "version": "3.0.0", 922 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 923 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 924 | "dev": true, 925 | "bin": { 926 | "mime": "cli.js" 927 | }, 928 | "engines": { 929 | "node": ">=10.0.0" 930 | } 931 | }, 932 | "node_modules/miniflare": { 933 | "version": "3.20240725.0", 934 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240725.0.tgz", 935 | "integrity": "sha512-n9NTLI8J9Xt0Cls6dRpqoIPkVFnxD9gMnU/qDkDX9diKfN16HyxpAdA5mto/hKuRpjW19TxnTMcxBo90vZXemw==", 936 | "dev": true, 937 | "dependencies": { 938 | "@cspotcode/source-map-support": "0.8.1", 939 | "acorn": "^8.8.0", 940 | "acorn-walk": "^8.2.0", 941 | "capnp-ts": "^0.7.0", 942 | "exit-hook": "^2.2.1", 943 | "glob-to-regexp": "^0.4.1", 944 | "stoppable": "^1.1.0", 945 | "undici": "^5.28.4", 946 | "workerd": "1.20240725.0", 947 | "ws": "^8.17.1", 948 | "youch": "^3.2.2", 949 | "zod": "^3.22.3" 950 | }, 951 | "bin": { 952 | "miniflare": "bootstrap.js" 953 | }, 954 | "engines": { 955 | "node": ">=16.13" 956 | } 957 | }, 958 | "node_modules/ms": { 959 | "version": "2.1.2", 960 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 961 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 962 | "dev": true 963 | }, 964 | "node_modules/mustache": { 965 | "version": "4.2.0", 966 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 967 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 968 | "dev": true, 969 | "bin": { 970 | "mustache": "bin/mustache" 971 | } 972 | }, 973 | "node_modules/nanoid": { 974 | "version": "3.3.7", 975 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 976 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 977 | "dev": true, 978 | "funding": [ 979 | { 980 | "type": "github", 981 | "url": "https://github.com/sponsors/ai" 982 | } 983 | ], 984 | "bin": { 985 | "nanoid": "bin/nanoid.cjs" 986 | }, 987 | "engines": { 988 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 989 | } 990 | }, 991 | "node_modules/node-fetch-native": { 992 | "version": "1.6.4", 993 | "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", 994 | "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", 995 | "dev": true 996 | }, 997 | "node_modules/node-forge": { 998 | "version": "1.3.1", 999 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", 1000 | "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", 1001 | "dev": true, 1002 | "engines": { 1003 | "node": ">= 6.13.0" 1004 | } 1005 | }, 1006 | "node_modules/normalize-path": { 1007 | "version": "3.0.0", 1008 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1009 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1010 | "dev": true, 1011 | "engines": { 1012 | "node": ">=0.10.0" 1013 | } 1014 | }, 1015 | "node_modules/path-parse": { 1016 | "version": "1.0.7", 1017 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1018 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1019 | "dev": true 1020 | }, 1021 | "node_modules/path-to-regexp": { 1022 | "version": "6.2.2", 1023 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", 1024 | "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", 1025 | "dev": true 1026 | }, 1027 | "node_modules/pathe": { 1028 | "version": "1.1.2", 1029 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", 1030 | "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", 1031 | "dev": true 1032 | }, 1033 | "node_modules/picomatch": { 1034 | "version": "2.3.1", 1035 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1036 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1037 | "dev": true, 1038 | "engines": { 1039 | "node": ">=8.6" 1040 | }, 1041 | "funding": { 1042 | "url": "https://github.com/sponsors/jonschlinkert" 1043 | } 1044 | }, 1045 | "node_modules/printable-characters": { 1046 | "version": "1.0.42", 1047 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 1048 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 1049 | "dev": true 1050 | }, 1051 | "node_modules/readdirp": { 1052 | "version": "3.6.0", 1053 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1054 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1055 | "dev": true, 1056 | "dependencies": { 1057 | "picomatch": "^2.2.1" 1058 | }, 1059 | "engines": { 1060 | "node": ">=8.10.0" 1061 | } 1062 | }, 1063 | "node_modules/resolve": { 1064 | "version": "1.22.8", 1065 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1066 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1067 | "dev": true, 1068 | "dependencies": { 1069 | "is-core-module": "^2.13.0", 1070 | "path-parse": "^1.0.7", 1071 | "supports-preserve-symlinks-flag": "^1.0.0" 1072 | }, 1073 | "bin": { 1074 | "resolve": "bin/resolve" 1075 | }, 1076 | "funding": { 1077 | "url": "https://github.com/sponsors/ljharb" 1078 | } 1079 | }, 1080 | "node_modules/resolve.exports": { 1081 | "version": "2.0.2", 1082 | "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", 1083 | "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", 1084 | "dev": true, 1085 | "engines": { 1086 | "node": ">=10" 1087 | } 1088 | }, 1089 | "node_modules/rollup-plugin-inject": { 1090 | "version": "3.0.2", 1091 | "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", 1092 | "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", 1093 | "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", 1094 | "dev": true, 1095 | "dependencies": { 1096 | "estree-walker": "^0.6.1", 1097 | "magic-string": "^0.25.3", 1098 | "rollup-pluginutils": "^2.8.1" 1099 | } 1100 | }, 1101 | "node_modules/rollup-plugin-node-polyfills": { 1102 | "version": "0.2.1", 1103 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", 1104 | "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", 1105 | "dev": true, 1106 | "dependencies": { 1107 | "rollup-plugin-inject": "^3.0.0" 1108 | } 1109 | }, 1110 | "node_modules/rollup-pluginutils": { 1111 | "version": "2.8.2", 1112 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 1113 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 1114 | "dev": true, 1115 | "dependencies": { 1116 | "estree-walker": "^0.6.1" 1117 | } 1118 | }, 1119 | "node_modules/selfsigned": { 1120 | "version": "2.4.1", 1121 | "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", 1122 | "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", 1123 | "dev": true, 1124 | "dependencies": { 1125 | "@types/node-forge": "^1.3.0", 1126 | "node-forge": "^1" 1127 | }, 1128 | "engines": { 1129 | "node": ">=10" 1130 | } 1131 | }, 1132 | "node_modules/source-map": { 1133 | "version": "0.6.1", 1134 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1135 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1136 | "dev": true, 1137 | "engines": { 1138 | "node": ">=0.10.0" 1139 | } 1140 | }, 1141 | "node_modules/sourcemap-codec": { 1142 | "version": "1.4.8", 1143 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1144 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1145 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 1146 | "dev": true 1147 | }, 1148 | "node_modules/stacktracey": { 1149 | "version": "2.1.8", 1150 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 1151 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 1152 | "dev": true, 1153 | "dependencies": { 1154 | "as-table": "^1.0.36", 1155 | "get-source": "^2.0.12" 1156 | } 1157 | }, 1158 | "node_modules/stoppable": { 1159 | "version": "1.1.0", 1160 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 1161 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 1162 | "dev": true, 1163 | "engines": { 1164 | "node": ">=4", 1165 | "npm": ">=6" 1166 | } 1167 | }, 1168 | "node_modules/supports-preserve-symlinks-flag": { 1169 | "version": "1.0.0", 1170 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1171 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1172 | "dev": true, 1173 | "engines": { 1174 | "node": ">= 0.4" 1175 | }, 1176 | "funding": { 1177 | "url": "https://github.com/sponsors/ljharb" 1178 | } 1179 | }, 1180 | "node_modules/to-regex-range": { 1181 | "version": "5.0.1", 1182 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1183 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1184 | "dev": true, 1185 | "dependencies": { 1186 | "is-number": "^7.0.0" 1187 | }, 1188 | "engines": { 1189 | "node": ">=8.0" 1190 | } 1191 | }, 1192 | "node_modules/tslib": { 1193 | "version": "2.6.3", 1194 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 1195 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", 1196 | "dev": true 1197 | }, 1198 | "node_modules/ufo": { 1199 | "version": "1.5.4", 1200 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", 1201 | "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", 1202 | "dev": true 1203 | }, 1204 | "node_modules/undici": { 1205 | "version": "5.28.4", 1206 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", 1207 | "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", 1208 | "dev": true, 1209 | "dependencies": { 1210 | "@fastify/busboy": "^2.0.0" 1211 | }, 1212 | "engines": { 1213 | "node": ">=14.0" 1214 | } 1215 | }, 1216 | "node_modules/undici-types": { 1217 | "version": "6.13.0", 1218 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", 1219 | "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", 1220 | "dev": true 1221 | }, 1222 | "node_modules/unenv": { 1223 | "name": "unenv-nightly", 1224 | "version": "1.10.0-1717606461.a117952", 1225 | "resolved": "https://registry.npmjs.org/unenv-nightly/-/unenv-nightly-1.10.0-1717606461.a117952.tgz", 1226 | "integrity": "sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==", 1227 | "dev": true, 1228 | "dependencies": { 1229 | "consola": "^3.2.3", 1230 | "defu": "^6.1.4", 1231 | "mime": "^3.0.0", 1232 | "node-fetch-native": "^1.6.4", 1233 | "pathe": "^1.1.2", 1234 | "ufo": "^1.5.3" 1235 | } 1236 | }, 1237 | "node_modules/workerd": { 1238 | "version": "1.20240725.0", 1239 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240725.0.tgz", 1240 | "integrity": "sha512-VZwgejRcHsQ9FEPtc7v25ebINLAR+stL3q1hC1xByE+quskdoWpTXHkZwZ3IdSgvm9vPVbCbJw9p5mGnDByW2A==", 1241 | "dev": true, 1242 | "hasInstallScript": true, 1243 | "bin": { 1244 | "workerd": "bin/workerd" 1245 | }, 1246 | "engines": { 1247 | "node": ">=16" 1248 | }, 1249 | "optionalDependencies": { 1250 | "@cloudflare/workerd-darwin-64": "1.20240725.0", 1251 | "@cloudflare/workerd-darwin-arm64": "1.20240725.0", 1252 | "@cloudflare/workerd-linux-64": "1.20240725.0", 1253 | "@cloudflare/workerd-linux-arm64": "1.20240725.0", 1254 | "@cloudflare/workerd-windows-64": "1.20240725.0" 1255 | } 1256 | }, 1257 | "node_modules/wrangler": { 1258 | "version": "3.68.0", 1259 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.68.0.tgz", 1260 | "integrity": "sha512-gsIeglkh5nOn1mHJs0bf1pOq/DvIt+umjO/5a867IYYXaN4j/ar5cRR1+F5ue3S7uEjYCLIZZjs8ESiPTSEt+Q==", 1261 | "dev": true, 1262 | "dependencies": { 1263 | "@cloudflare/kv-asset-handler": "0.3.4", 1264 | "@esbuild-plugins/node-globals-polyfill": "^0.2.3", 1265 | "@esbuild-plugins/node-modules-polyfill": "^0.2.2", 1266 | "blake3-wasm": "^2.1.5", 1267 | "chokidar": "^3.5.3", 1268 | "date-fns": "^3.6.0", 1269 | "esbuild": "0.17.19", 1270 | "miniflare": "3.20240725.0", 1271 | "nanoid": "^3.3.3", 1272 | "path-to-regexp": "^6.2.0", 1273 | "resolve": "^1.22.8", 1274 | "resolve.exports": "^2.0.2", 1275 | "selfsigned": "^2.0.1", 1276 | "source-map": "^0.6.1", 1277 | "unenv": "npm:unenv-nightly@1.10.0-1717606461.a117952", 1278 | "workerd": "1.20240725.0", 1279 | "xxhash-wasm": "^1.0.1" 1280 | }, 1281 | "bin": { 1282 | "wrangler": "bin/wrangler.js", 1283 | "wrangler2": "bin/wrangler.js" 1284 | }, 1285 | "engines": { 1286 | "node": ">=16.17.0" 1287 | }, 1288 | "optionalDependencies": { 1289 | "fsevents": "~2.3.2" 1290 | }, 1291 | "peerDependencies": { 1292 | "@cloudflare/workers-types": "^4.20240725.0" 1293 | }, 1294 | "peerDependenciesMeta": { 1295 | "@cloudflare/workers-types": { 1296 | "optional": true 1297 | } 1298 | } 1299 | }, 1300 | "node_modules/ws": { 1301 | "version": "8.18.0", 1302 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 1303 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 1304 | "dev": true, 1305 | "engines": { 1306 | "node": ">=10.0.0" 1307 | }, 1308 | "peerDependencies": { 1309 | "bufferutil": "^4.0.1", 1310 | "utf-8-validate": ">=5.0.2" 1311 | }, 1312 | "peerDependenciesMeta": { 1313 | "bufferutil": { 1314 | "optional": true 1315 | }, 1316 | "utf-8-validate": { 1317 | "optional": true 1318 | } 1319 | } 1320 | }, 1321 | "node_modules/xxhash-wasm": { 1322 | "version": "1.0.2", 1323 | "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", 1324 | "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", 1325 | "dev": true 1326 | }, 1327 | "node_modules/youch": { 1328 | "version": "3.3.3", 1329 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", 1330 | "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", 1331 | "dev": true, 1332 | "dependencies": { 1333 | "cookie": "^0.5.0", 1334 | "mustache": "^4.2.0", 1335 | "stacktracey": "^2.1.8" 1336 | } 1337 | }, 1338 | "node_modules/zod": { 1339 | "version": "3.23.8", 1340 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 1341 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 1342 | "dev": true, 1343 | "funding": { 1344 | "url": "https://github.com/sponsors/colinhacks" 1345 | } 1346 | } 1347 | } 1348 | } 1349 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare-proxy-sites", 3 | "version": "0.0.0", 4 | "private": true, 5 | "license": "MIT", 6 | "author": "Sead Feng", 7 | "scripts": { 8 | "deploy": "wrangler deploy", 9 | "dev": "wrangler dev", 10 | "start": "wrangler dev" 11 | }, 12 | "devDependencies": { 13 | "wrangler": "^3.68.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /workers.dev/README.md: -------------------------------------------------------------------------------- 1 | # Manual Cloudflare Setup 2 | 3 | ## 1. Open Workers & Pages 4 | 5 | ![Open Workers & Pages](images/create1.png) 6 | 7 | 8 | ## 2. Create Worker 9 | 10 | ![Create Worker](images/create2.png) 11 | 12 | 13 | ## 3. Deploy Worker 14 | 15 | ![Deploy Worker](images/deploy.png) 16 | 17 | 18 | ## 4. Edit Code 19 | 20 | ![Edit Code 1](images/edit.png) 21 | 22 | 23 | Copy your code to editor [workers.dev/index.js](index.js) or [index.js](../index.js) 24 | 25 | ### workers.dev/index.js 26 | 27 | Only support for single domain 28 | 29 | In this case, you will need change the code: 30 | 31 | ```js 32 | // workers.dev/index.js 33 | // replace to your target site domain 34 | const targetDomain = 'example.com'; 35 | ``` 36 | 37 | ### index.js 38 | 39 | Support for multiple domains 40 | 41 | ![Edit Code 2](images/edit2.png) 42 | 43 | 44 | ## Done and Preview 45 | 46 | 47 | ![Done and Preview](images/done.png) -------------------------------------------------------------------------------- /workers.dev/images/create1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/workers.dev/images/create1.png -------------------------------------------------------------------------------- /workers.dev/images/create2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/workers.dev/images/create2.png -------------------------------------------------------------------------------- /workers.dev/images/deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/workers.dev/images/deploy.png -------------------------------------------------------------------------------- /workers.dev/images/done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/workers.dev/images/done.png -------------------------------------------------------------------------------- /workers.dev/images/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/workers.dev/images/edit.png -------------------------------------------------------------------------------- /workers.dev/images/edit2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seadfeng/cloudflare-proxy-sites/b40d7ca1e0558d3431e823f4e5087efac9ebd11e/workers.dev/images/edit2.png -------------------------------------------------------------------------------- /workers.dev/index.js: -------------------------------------------------------------------------------- 1 | // workers.dev/index.js 2 | addEventListener('fetch', event => { 3 | event.respondWith(handleRequest(event.request)); 4 | }); 5 | 6 | async function handleRequest(request) { 7 | const url = new URL(request.url); 8 | const { host, pathname } = url; 9 | 10 | if (pathname === '/robots.txt') { 11 | const robots = `User-agent: * 12 | Disallow: / 13 | `; 14 | return new Response(robots,{ status: 200 }); 15 | } 16 | 17 | const targetDomain = 'www.proxysites.ai'; 18 | const origin = `https://${targetDomain}`; 19 | const actualUrl = new URL(`${origin}${pathname}${url.search}${url.hash}`); 20 | 21 | const modifiedRequestInit = { 22 | method: request.method, 23 | headers: request.headers, 24 | redirect: 'follow' 25 | }; 26 | 27 | if (!['GET', 'HEAD'].includes(request.method)) { 28 | const requestBody = await request.clone().arrayBuffer(); 29 | modifiedRequestInit.body = requestBody; 30 | } 31 | 32 | const modifiedRequest = new Request(actualUrl, modifiedRequestInit); 33 | 34 | const response = await fetch(modifiedRequest); 35 | 36 | let body = await response.arrayBuffer(); 37 | const contentType = response.headers.get('content-type'); 38 | 39 | // Check if the 'content-type' exists and matches JavaScript or any text/* types (e.g., text/html, text/xml) 40 | if (contentType && ( /^(application\/x-javascript|text\/)/i.test(contentType))) { 41 | let text = new TextDecoder('utf-8').decode(body); 42 | 43 | // Replace all instances of the proxy site domain with the current host domain in the text 44 | text = text.replace(new RegExp( `(//|https?://)${targetDomain}`, 'g'), `$1${host}` ); 45 | body = new TextEncoder().encode(text).buffer; 46 | } 47 | 48 | const modifiedResponse = new Response(body, response); 49 | modifiedResponse.headers.set('Access-Control-Allow-Origin', '*'); 50 | return modifiedResponse; 51 | 52 | } -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "proxysites" 2 | main = "index.js" 3 | compatibility_date = "2024-05-24" 4 | node_compat = true --------------------------------------------------------------------------------