From d6b6e9cade433a7bb98ea39f7a94fc3895f7a63d Mon Sep 17 00:00:00 2001 From: Jason Caldwell Date: Wed, 13 Mar 2024 21:22:49 -0400 Subject: [PATCH] Project update. [p][robotic] --- .browserslistrc | 2 +- .dockerignore | 2 +- .env.vault | 8 +- .gitattributes | 2 +- .gitignore | 2 +- .npmignore | 2 +- .prettierignore | 2 +- .vscode/settings.json | 2 +- .vscodeignore | 2 +- package-lock.json | 524 +++++++++++++++++++++--------------------- package.json | 4 +- src/cfw.ts | 320 ++++++++++++++++---------- src/proxy.ts | 35 ++- tsconfig.json | 2 +- wrangler.toml | 2 +- 15 files changed, 506 insertions(+), 405 deletions(-) diff --git a/.browserslistrc b/.browserslistrc index 95f01c3..d163262 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 12, 2024 8:33 AM UTC. +# Last generated Mar 14, 2024 1:22 AM UTC. [production] node >= 20.9.0 diff --git a/.dockerignore b/.dockerignore index c44e107..9a9bb85 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 12, 2024 8:33 AM UTC. +# Last generated Mar 14, 2024 1:22 AM UTC. # Locals diff --git a/.env.vault b/.env.vault index b0c30c7..db3941b 100644 --- a/.env.vault +++ b/.env.vault @@ -8,12 +8,12 @@ DOTENV_VAULT_MAIN="3rfi+ClkONvfHPiU9FTBcC1+Um/L8QeM9dRw1jFzEqzZXw==" DOTENV_VAULT_MAIN_VERSION=1 # dev -DOTENV_VAULT_DEV="yxHlPqBrMXcridlCo+s9/GdN3btNva/bSm0x3S5PdJg/56n7p/xJu1XIVXIGbSC4s7BleA/1TxQ7R03xZb1VCP8G32UDdvpWF5aRJYVh/j83orxfrKG7x5ZQ15jSi3ndpzSd9Xn4OhtgmJ4CWXS2ABNJqicLZKwd9bMttQjnf6Usw/+/aTKLLDqUOZSnQFY3t63aPJCisOo8ZfeSV8PLI8u/fJv/eFG0bRQRQIbWzafC1tS+cZTmShKFIs4Gu5IOHoIcYpme5lPAnFEo328gozwmhSCxuu0HalnVnTk3B+hgBh6bcc55t+juRjHMfc2BvDVFWINpqg0phlDDXw04uTVuFUjw5UAJOU+/cgmU/K8prWxxOJw+gZFsLScbXr05c+5gdfI6t04CMDfUMBitKoDbS0aFU+uQzU9mS+iz2IIuKfvfOTOuHDgY6ED6llyAoeXZ8CgKDrRDknDqwRRS0I6Ea+i9VAUkyHTv4Hvo7MH1k7TKXdzz2QqfSkdYAN6D24V4ww6tOS/J52kFnpO9/dfptMcBQn5kWreqo2kfAX5uQYEbsVf3F3+0lDcZvoFpUPW7EKx1x1QokHKMuyHBkypuKI1Ez+qnl6eNzRTNQPxaw4fHTglsGw9ZcNLkpr0Edme2CxF1bSmXKgT9o/hOVpmU1I0XGp07XyOK6mWybwDuuhKTjaSCUvbvEfvnUiuO/tTsjsaLO6vqCR9fqXTNKTcYyOxXlBDmIHSP0bYkl4Xwse0WolDk45/ppx1m6eFQo8VP1olYJ2l9h0DALz7NEyLl0rwO82dHc74b1onF9cYlpgWa7Fi03NeNeRZ2jNZ1KDA6H4BAh77t9UaLyIUea67dnHy/yJl/+6egKV8IMR6IldA4m+626CRf3Plg" -DOTENV_VAULT_DEV_VERSION=281 +DOTENV_VAULT_DEV="vlsz32K2C/khOr1OQImLrUJj4ck46i35qgEME/tFDfjTBxKZbi5eEyqlQJUFyd9W3VETllZvdBrRrwlNYxUTx97LsbY+rfKZcAJJUfnjnYMq1qv9leWTuPdSXv7NSib22g7/7VPwEU/+CnpXl5RTnz/Ea4Yr+Ejgms6dzKhXiHDwTYE21ygOzn7PJ68x3DBZAfqC0GqntIRXNhP85Pn4AWuCpoo8r3V0bwTYjM3d4CkSioDxHQ2il8fNgbXwLfoCz0BoFldcCMPOWgcCvtbjRs5f/b9nu32yQ9v4TZkgnPq9oM9MVeT7vBmlyU64tVBCuozYAtPh9VLGjWT2WBwQoM4Oqgw0K1fti/IOeP7P+ccBEabFKB/5adMyt72U/WQmMbLRxJ4hzzLqkPfLa4GRNc25FPj/EBAPxxgPxdqPraaDAvaD9NAJChUvtwXKl6w8TgjZKE2lXEpy0WXewMD/3pnYj2idrlB45ubqWSX/oHIoSAvIHJtsnfcAMF4zISBNSqSafjQY+tUq7P5xZBFlFOj0kFic5Pdgf6QhetG36r+dSdK3N+2+la7/hwUCuFCiB3zC7OUp8VEesHeiLGO3s6TC6SYxzHigVqUDBLVAyS/HOQOtAEWeepHwOItrvYQg9zO1BP9SBrX6oThiR7FJx264aA/+qztZAD4BqhLAJCPrq4YWDVQigG5g4Z8ClEdksOMql5WrifQjmvrdY92l06DWrov1XQp2RuDc6bbno0esOBr3uT4ntN4pVr/XQ5Z6TojD8pg84rsYaxjnvtBpGZ/OGOEfpkky8cv2W8SwmG1Wat5FumvlX9LpDvuQ4EpC+kbnLrVlHNof9pLQeYNDbg8F4GKnMRQKN2JrbKtbCV6kKx8d73HpZsiFEjlx" +DOTENV_VAULT_DEV_VERSION=283 # ci -DOTENV_VAULT_CI="SVe0sBHDYVQ+82VEuuQJTSHWYUgjXKRoutFWDnPNSnyoofzzgewRupPleGIIeIHjdcU/jD/lYiw5bLUKsB5PYG5z2hr9ZyBnIzoKmyBxduLOKsBleOe0hBAelQLJ5oETq3aNfwCMhVDmkpl+QvNxe+miUQw1vhz4juxjDtaQhVg0SnYsVJuElhlACi21sI+Lb1X+oklVjvbW102sk6tSwsQtG27/RqpS6hOFAS+fKGVVKElpJeBTb7pGpEYPQalVZMS5rwOpNkDw43WT8HJG1ftgMNr0QWjH+2X45FADevFFvXXggjfDLkM77TpsjDqGjqeSeE2HSOwN0zqa0S6OMsyidaDY9xCeNNrj8WUMImHVZwVEnmqF9RgORxM8iWpMYaDdXqP3X0e/iJ3xqaKNKc1qawTEMvh0azJCRFT/EBBaAFFV3NwCmVAy0Q+UiBWexizZJ7jaSLh3jDy3dOvKXizn+VsnftI7Vc+KLU72gD3CAO9NYTky3iwsf5LFKHPUTOKQy53fnvHvaO3ZirwBWAgbxvl4heyWw4MjhG+D2EE0G844im3l8V/gMwZqvGyGOb95w1f70yjEIbC5+/0r7hnAVL7O3ZR2nIbRoQ6YZlt8lsQxai+w/Cd7khZyzij83L/ban+m7rSRAkgZBwTiuJDBkEs3FcAIBoYMcCzI1nsU0s2wDKvDe/qYEdz03IL9K+CuAezwkBJZuXLBFX4WdbQDs2A0tyqTHZtOBuUdm560Gbqkw0NQVCVbrdVe63abKixpZjiSN9cngV0+r7BgBXlqMY3QXvRFth14GAAiUsbAxGTGcL9jYMABqe6A+VnKKfdJcu+6tFPa4fGk07h0Fzq7APQdWO46n/1QCA/RV0kd+Vt+GMvqjMAkRtHw" -DOTENV_VAULT_CI_VERSION=281 +DOTENV_VAULT_CI="/oGJkRFPWmmUyPAE7tz66N1n4qO6yiHBI/XzyoapKD9IL4MxC60uovan9uPTR08GvYmzzbN1O4dqA/k8KLpbGMZFuT+uTp7kL73O3DTkaVyr67xU851tczePT14OoQ8HICRM+wdgwJEyI1/Z5Ad+Dam1nsz70jl54TO3L+I+8f9Gm/Mx2F72FRcX6XbqZ++IES+fPseiJSNsKhbCkrPe4ARNalkHQxx9Th59vHUCgtR5V/0Hm7erkB2U4PkxGfe+5D5wKWADLHdi+3b8VSSD1QuwVPfkN7yrv6RcmEKC0/3QDzyqK4S7MWI9ddwK1m6/7QIITQdqWEHPZg2FHSrWvDCoZI/aghMxtTu5WiVLXBVWOenXgSzQIlv3gxXaxxxZMlGzEpqWXRsvK+YcIreMLQkCEGxhHIoeCDJKin94CUk5kqmS7yMwBYIRuR20PGuVJYvtp9zagcY6xvkgS5Ez7EEQBqu3asO5R78FEyU74qe9Cwxh1EyTyX8BFo6UaWxX3nh9zokE3BbUPOEET2jaQLb51fxV+4n+K3z3kHa3kQ1UNs+irupiMHmq0W1cnKQA/10DppFDi6I0rGFh5jlEQp/nKvevhG0KqbijoVToZPym/NZAkvj8ZJRu+erD6byLNSwEKQObt8SXQ4/BSeATixzi54EqyKsqYu8jOCESA5XvmcVG8c6PZwBAuz7f8SGA5gTqNFyWEbuBpdwlckkf4/3pZZ32X1p466LxLnJlHYCXK95BrzJz57TUMkdBP5g9IqN0MrMWa6nmwP6dnyzyvLWyRBpEod6Y9wCoJorJQGZ1mNON84DHv36Ox3EO8jm77mkLLksx608KS+/eUZH768gfwWsIq4A6lMx3m2NVx7W7iA7zuyFiMpJ3+oo8" +DOTENV_VAULT_CI_VERSION=283 # stage DOTENV_VAULT_STAGE="bfqZYD8oVLWMZ0JR5LICV+sB/btaXavszxZLxTfwSH8U5fg=" diff --git a/.gitattributes b/.gitattributes index 2140864..0466a63 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 12, 2024 8:33 AM UTC. +# Last generated Mar 14, 2024 1:22 AM UTC. # Default diff --git a/.gitignore b/.gitignore index 270515a..58000fc 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 12, 2024 8:33 AM UTC. +# Last generated Mar 14, 2024 1:22 AM UTC. # Locals diff --git a/.npmignore b/.npmignore index 265dbd7..797c146 100644 --- a/.npmignore +++ b/.npmignore @@ -25,7 +25,7 @@ # Generated data. # -# Last generated Mar 12, 2024 8:33 AM UTC. +# Last generated Mar 14, 2024 1:22 AM UTC. # Locals diff --git a/.prettierignore b/.prettierignore index 112a109..c558381 100644 --- a/.prettierignore +++ b/.prettierignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 12, 2024 8:33 AM UTC. +# Last generated Mar 14, 2024 1:22 AM UTC. # Packages diff --git a/.vscode/settings.json b/.vscode/settings.json index f953035..64a4dbe 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,7 +7,7 @@ * @note This entire file will be updated automatically. * @note Instead of editing here, please review `./settings.mjs`. * - * Last generated using `./settings.mjs` Mar 12, 2024 8:33 AM UTC. + * Last generated using `./settings.mjs` Mar 14, 2024 1:22 AM UTC. */ { "editor.formatOnType": false, diff --git a/.vscodeignore b/.vscodeignore index 67fff18..23adc96 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 12, 2024 8:33 AM UTC. +# Last generated Mar 14, 2024 1:22 AM UTC. # Locals diff --git a/package-lock.json b/package-lock.json index bd88002..283bd1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@clevercanyon/utilities.cfw", - "version": "1.0.293", + "version": "1.0.294", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@clevercanyon/utilities.cfw", - "version": "1.0.293", + "version": "1.0.294", "cpu": [ "x64", "arm64" @@ -27,7 +27,7 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.902", + "@clevercanyon/utilities": "^1.0.911", "@cloudflare/ai": "1.0.53", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0" @@ -995,9 +995,9 @@ } }, "node_modules/@clevercanyon/split-cmd.fork": { - "version": "1.0.134", - "resolved": "https://registry.npmjs.org/@clevercanyon/split-cmd.fork/-/split-cmd.fork-1.0.134.tgz", - "integrity": "sha512-n7tvNNOmUy9S5OX+b1s5HKbibm0LBh0wvP7vui/nc9O54CfpVuu1WTwdYBeT5AInHV+W5SHq7WCcpDVbjqweiQ==", + "version": "1.0.135", + "resolved": "https://registry.npmjs.org/@clevercanyon/split-cmd.fork/-/split-cmd.fork-1.0.135.tgz", + "integrity": "sha512-ucFDI0xO/QU3MuqVvS8RoS2fOJ+ebdovLO6hCh/YnzRrJrdpBogiC1WDbc2DNaeIBBDsS/Wis8D6ex7RGWEtaA==", "cpu": [ "x64", "arm64" @@ -1017,9 +1017,9 @@ } }, "node_modules/@clevercanyon/utilities": { - "version": "1.0.902", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities/-/utilities-1.0.902.tgz", - "integrity": "sha512-yFlWVRJLegxuke6Lb79BAmkGir7d0elfFHpgJLskYWX9bOm7xGNX2LO2gLFMN5iBuH9Gf+K+1AAWeS+eR9Z1rg==", + "version": "1.0.911", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities/-/utilities-1.0.911.tgz", + "integrity": "sha512-2ReIO/1KTVPXNFdZg06RoDCknHe1c5VHnk6olUCfDdNJxfMaN+a7hwEwGlr7RMcnwTmeHp4CfQxetLrPJ0zX7A==", "cpu": [ "x64", "arm64" @@ -1052,9 +1052,9 @@ } }, "node_modules/@clevercanyon/utilities.bash": { - "version": "1.0.203", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.bash/-/utilities.bash-1.0.203.tgz", - "integrity": "sha512-Ivsg3ciHLdLfAL+6WUJRSqrnsaL9uAcKkmVbqU1jGSHQ8JnDeu227GueCdZ1A+1YzCZhnWA2qEr0r5hg6ESYVA==", + "version": "1.0.204", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.bash/-/utilities.bash-1.0.204.tgz", + "integrity": "sha512-JmIq4YtybV9p8j1HjZKo1gQY5DtQvrH+omHF/KZNo040qyGoMW/7fk5LyRDwB5yboSzJOy/9HwyneurSEKh49Q==", "cpu": [ "x64", "arm64" @@ -1072,14 +1072,14 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.882", + "@clevercanyon/utilities": "^1.0.902", "@clevercanyon/utilities.node": "^1.0.198" } }, "node_modules/@clevercanyon/utilities.cfp": { - "version": "1.0.238", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfp/-/utilities.cfp-1.0.238.tgz", - "integrity": "sha512-bRJrlajvUfGWNexU3rAm7lX9WWAe8rVGUgxQgby9yUTovpj08QgvOMTlAwUH1V1cl4bpFmPelgJd+pvDxxmLCQ==", + "version": "1.0.239", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfp/-/utilities.cfp-1.0.239.tgz", + "integrity": "sha512-eQtGR4UP8466nnCH+QNOcvgUTV+/vGXh9NEACf9XrSLBtA3N5HaetbvqLtC0mOR62UQOd6Z4UeeVOzxW9qLfYQ==", "cpu": [ "x64", "arm64" @@ -1097,15 +1097,15 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.901", - "@clevercanyon/utilities.cfw": "^1.0.293", + "@clevercanyon/utilities": "^1.0.902", + "@clevercanyon/utilities.cfw": "^1.0.294", "@clevercanyon/utilities.web": "^1.0.152" } }, "node_modules/@clevercanyon/utilities.cfw": { - "version": "1.0.293", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfw/-/utilities.cfw-1.0.293.tgz", - "integrity": "sha512-s6Ne9V2uKDrYjSKqGzOMwkIIHvPffFvrJGwwG0L7+VNpDlf+Ks82oiXtxvIU7upjkrKMu2obGdUzh/Hkjk1AzA==", + "version": "1.0.294", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfw/-/utilities.cfw-1.0.294.tgz", + "integrity": "sha512-Upp2bt+giJDxh7wJI3uj5h9y6o3ek3PaAxQTPqJb8FNMoBX2w/YkIOkgz0HaQosY0DTQOtbpSttwG0Vd3qsg6Q==", "cpu": [ "x64", "arm64" @@ -1124,16 +1124,16 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.901", + "@clevercanyon/utilities": "^1.0.902", "@cloudflare/ai": "1.0.53", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0" } }, "node_modules/@clevercanyon/utilities.node": { - "version": "1.0.198", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.node/-/utilities.node-1.0.198.tgz", - "integrity": "sha512-79oG+xXEfwelgvOKmf6UdAG5rezdE76Y3IV7ioxEyvR9zc56E18K7v7aB2hc7V3681Jyf2DcRX2zJjpvo4TrRg==", + "version": "1.0.199", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.node/-/utilities.node-1.0.199.tgz", + "integrity": "sha512-HuH51sEFcuVPq0vF6VYel8+DVODLWFe4IExueiEpuHQ8NqmqHSBj11ozKHl3Worw8LedA9a+PkS0dZ95XrqSew==", "cpu": [ "x64", "arm64" @@ -1152,7 +1152,7 @@ }, "peerDependencies": { "@clevercanyon/split-cmd.fork": "^1.0.134", - "@clevercanyon/utilities": "^1.0.882", + "@clevercanyon/utilities": "^1.0.902", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0", "archiver": "6.0.1", @@ -1165,16 +1165,16 @@ "globby": "14.0.0", "prettier": "3.1.0", "shescape": "2.0.2", - "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.128", + "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.129", "term-img": "6.0.0", "yargs": "17.7.2", "yargs-parser": "21.1.1" } }, "node_modules/@clevercanyon/utilities.web": { - "version": "1.0.152", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.web/-/utilities.web-1.0.152.tgz", - "integrity": "sha512-VTGM2uqScH9Z+xaUtGpW8MeTrEilFkaN1aZf7Iut/lN2PKjd1kZVdUy1sK1AtlQug8/n3pclq0O+VtJT+ZmwJQ==", + "version": "1.0.153", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.web/-/utilities.web-1.0.153.tgz", + "integrity": "sha512-uYKHDC3uyCVORUhptP6aCzNUeJDYf4VVTCX/SKJYL8F+jhn9CWI5PFp6mfOqRdi4sMLfXyh4io4IVfDMIreKKg==", "cpu": [ "x64", "arm64" @@ -1193,7 +1193,7 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.882" + "@clevercanyon/utilities": "^1.0.902" } }, "node_modules/@cloudflare/ai": { @@ -1332,9 +1332,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.8.tgz", - "integrity": "sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.9.tgz", + "integrity": "sha512-RRqNjxTZDUhx7pxYOBG/AkCVmPS3zYzfE47GEhIGkFuWFTQGJBgWOUUkKNo5MfxIfjDz5/1L3F3rF1oIsYaIpw==", "dev": true, "funding": [ { @@ -1350,8 +1350,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/color-helpers": { @@ -1374,9 +1374,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.1.7.tgz", - "integrity": "sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.0.tgz", + "integrity": "sha512-iQqIW5vDPqQdLx07/atCuNKDprhIWjB0b8XRhUyXZWBZYUG+9mNyFwyu30rypX84WLevVo25NYW2ipxR8WyseQ==", "dev": true, "funding": [ { @@ -1392,14 +1392,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/css-color-parser": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.5.2.tgz", - "integrity": "sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.6.0.tgz", + "integrity": "sha512-Wc1X6jZvGhT8Bii4jUF6tC3Je3wgDFg7D/SvGKndrnakDsCPk4TMxtt4AQHyWdMBrBJ1hLjXbppaXgP1DUIpBw==", "dev": true, "funding": [ { @@ -1413,20 +1413,20 @@ ], "dependencies": { "@csstools/color-helpers": "^4.0.0", - "@csstools/css-calc": "^1.1.7" + "@csstools/css-calc": "^1.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.0.tgz", - "integrity": "sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", + "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", "dev": true, "funding": [ { @@ -1442,13 +1442,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz", - "integrity": "sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", + "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", "dev": true, "funding": [ { @@ -1465,9 +1465,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.8.tgz", - "integrity": "sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", + "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", "dev": true, "funding": [ { @@ -1483,8 +1483,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/postcss-cascade-layers": { @@ -1536,9 +1536,9 @@ } }, "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -1549,9 +1549,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.10.tgz", - "integrity": "sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.11.tgz", + "integrity": "sha512-z53Pp2tsemiIq72PKu4vjD0CtcQlXdvA22elEHuDOvCIlqphNjd5ZD5HBns/ZjaJF7BjPls2zaAT58hfLyS0MQ==", "dev": true, "funding": [ { @@ -1564,10 +1564,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -1578,9 +1578,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.10.tgz", - "integrity": "sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.11.tgz", + "integrity": "sha512-Jz1R5ZXxpT5FIY95F3VSJtwQYWCYOtCBUBS/ShDxS+fUtd3sAdAtD3a9tAdz3FG3BvkmqtlURyoIhJRu/wfo/A==", "dev": true, "funding": [ { @@ -1593,10 +1593,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -1607,9 +1607,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.4.tgz", - "integrity": "sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.5.tgz", + "integrity": "sha512-7S7I7KgwHWQYzJJAoIjRtUf7DQs1dxipeg1A6ikZr0PYapNJX7UHz0evlpE67SQqYj1xBs70gpG7xUv3uLp4PA==", "dev": true, "funding": [ { @@ -1622,9 +1622,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -1660,9 +1660,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.3.tgz", - "integrity": "sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.4.tgz", + "integrity": "sha512-jjHP44awnSijgddNJpZEFfmb8csFx+BiYYpX+ydyScWwLzSpve5eLXneu4uIhZmKom+WXLXWc4y7CvOfVLQ2VQ==", "dev": true, "funding": [ { @@ -1675,9 +1675,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -1687,9 +1687,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.11.tgz", - "integrity": "sha512-LFom5jCVUfzF+iuiOZvhvX7RRN8vc+tKpcKo9s4keEBAU2mPwV5/Fgz5iylEfXP/DZbEdq2C0At20urMi/lupw==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.12.tgz", + "integrity": "sha512-F1mOb6MuIMAV7qq9dYLhi2tlmmQn+osCVl+VdDNI+4AO6y3l6dTWmc7XVQMsVxIZCKEZMie9KLtE0PRp3i1UyQ==", "dev": true, "funding": [ { @@ -1702,10 +1702,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -1716,9 +1716,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.9.tgz", - "integrity": "sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.10.tgz", + "integrity": "sha512-wYyhFLQ1zkirAhfRxh5BK9WRIJGBb7jtE9H9a2wPOf20kGbS/PmqxHtGmE+o1vSz/MaBIbW+6lqyS16yEzjQJA==", "dev": true, "funding": [ { @@ -1731,10 +1731,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -1745,9 +1745,9 @@ } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.4.tgz", - "integrity": "sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.5.tgz", + "integrity": "sha512-9CriM/zvKXa/lDARlxs/MgeyKE6ZmmX4V77VLD7VUxKLVSt0Go3NCy/gRMbwGzxbrk3iaHFXnFbc2lNw+/7jcg==", "dev": true, "funding": [ { @@ -1760,7 +1760,7 @@ } ], "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -1842,9 +1842,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -1946,9 +1946,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.6.tgz", - "integrity": "sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.7.tgz", + "integrity": "sha512-L4G3zsp/bnU0+WXUyysihCUH14LkfMgUJsS9vKz3vCYbVobOTqQRoNXnEPpyNp8WYyolLqAWbGGJhVu8J6u2OQ==", "dev": true, "funding": [ { @@ -1961,7 +1961,7 @@ } ], "dependencies": { - "@csstools/css-tokenizer": "^2.2.3", + "@csstools/css-tokenizer": "^2.2.4", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -1972,9 +1972,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.3.tgz", - "integrity": "sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.4.tgz", + "integrity": "sha512-xl/PIO3TUbXO1ZA4SA6HCw+Q9UGe2cgeRKx3lHCzoNig2D4bT5vfVCOrwhxjUb09oHihc9eI3I0iIfVPiXaN1A==", "dev": true, "funding": [ { @@ -1987,10 +1987,10 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/css-calc": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2000,9 +2000,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.6.tgz", - "integrity": "sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.7.tgz", + "integrity": "sha512-HBDAQw1K0NilcHGMUHv8jzf2mpOtcWTVKtuY3AeZ5TS1uyWWNVi5/yuA/tREPLU9WifNdqHQ+rfbsV/8zTIkTg==", "dev": true, "funding": [ { @@ -2015,9 +2015,9 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2078,9 +2078,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.10.tgz", - "integrity": "sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.11.tgz", + "integrity": "sha512-nIeOZqTFn/zJXSb70JwUcyUBb9658FED7saZlaZNEEhQ3GYxjRhdlV7hgflNi0FDdqNqaEeeI/B/BqnPG9+Q/Q==", "dev": true, "funding": [ { @@ -2093,10 +2093,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2107,9 +2107,9 @@ } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.1.0.tgz", - "integrity": "sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.1.1.tgz", + "integrity": "sha512-cx/bZgj+MK8SpRZNTu2zGeVFMCQfhsaeuDhukAhfA53yykvIXaTIwLi5shW9hfkvPrkqBeFoiRAzq/qogxeHTA==", "dev": true, "funding": [ { @@ -2132,9 +2132,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.10.tgz", - "integrity": "sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.11.tgz", + "integrity": "sha512-YmYGwGLoqZp71wXqjyFuG+JApL+CoZqUZ+MJshlokdqqryKX/zj/NrSrwMTAwB4xSx2DgHJUQK3iWumUse8rXw==", "dev": true, "funding": [ { @@ -2147,10 +2147,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2186,9 +2186,9 @@ } }, "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -2199,9 +2199,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.5.tgz", - "integrity": "sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.6.tgz", + "integrity": "sha512-rnyp8tWRuBXERTHVdB5hjUlif5dQgPcyN+BX55wUnYpZ3LN9QPfK2Z3/HUZymwyou8Gg6vhd6X2W+g1pLq1jYg==", "dev": true, "funding": [ { @@ -2214,9 +2214,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2252,9 +2252,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.5.tgz", - "integrity": "sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.6.tgz", + "integrity": "sha512-i5Zd0bMJooZAn+ZcDmPij2WCkcOJJJ6opzK+QeDjxbMrYmoGQl0CY8FDHdeQyBF1Nly+Q0Fq3S7QfdNLKBBaCg==", "dev": true, "funding": [ { @@ -2267,9 +2267,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -3612,9 +3612,9 @@ } }, "node_modules/@mdn/browser-compat-data": { - "version": "5.5.14", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.14.tgz", - "integrity": "sha512-K7e35i4XtNWpiOr+aPiy3UccAhFop0HsfVz9RSzlcgaaHb2aD/nN0J3uPPLedyTokMiebxN0gxkL/WXpzNQuKg==", + "version": "5.5.15", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.15.tgz", + "integrity": "sha512-BWm+TMK60HSepXOZcu39bDs/2sJZVetHO5w0mkuxhpkZvz0G5yGAoyimfaru8g5nK6LXXUIeX6Uk/SWzOfph3g==", "dev": true }, "node_modules/@mdx-js/esbuild": { @@ -7018,9 +7018,9 @@ "dev": true }, "node_modules/@wooorm/starry-night": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@wooorm/starry-night/-/starry-night-3.2.0.tgz", - "integrity": "sha512-SDIMYfhmfJXUzfXfG/0b8WuPLVmPVmx18sE3Q+Udm8M1yCm2rnAEN5OafFmAb7rwOf4W3SDR8fEFHzrE9AyYkA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@wooorm/starry-night/-/starry-night-3.3.0.tgz", + "integrity": "sha512-7PmyIDWz3/Yj7vd6eqVlbyaWyZmrERtxx1mwHDucnrQeSKFr3Grr8iqUbmd01pREG72HL4DPFQP9mw9U6jbjvA==", "dev": true, "dependencies": { "@types/hast": "^3.0.0", @@ -7881,9 +7881,9 @@ }, "node_modules/braces": { "name": "@clevercanyon/braces.fork", - "version": "3.0.132", - "resolved": "https://registry.npmjs.org/@clevercanyon/braces.fork/-/braces.fork-3.0.132.tgz", - "integrity": "sha512-IJFinmxLQ+2aHPRouSTGpgXuco07ruZzncJEFUiPQHfc5RsxWcuPG6uiWG0JBpvI4iKot+ka++2ZV2FPgCBsrA==", + "version": "3.0.133", + "resolved": "https://registry.npmjs.org/@clevercanyon/braces.fork/-/braces.fork-3.0.133.tgz", + "integrity": "sha512-JaK0e67lk1NEBiw+yBmx5F4bz8DolVuitKBsHYb2rDSO1ZoGXwVf4fSEEHZXPrq9OcGvohI4+8x3maDlSMs4MQ==", "cpu": [ "x64", "arm64" @@ -8880,9 +8880,9 @@ } }, "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -8951,9 +8951,9 @@ } }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -9518,9 +9518,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.701", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", - "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==", + "version": "1.4.704", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.704.tgz", + "integrity": "sha512-OK01+86Qvby1V6cTiowVbhp25aX4DLZnwar+NocAOXdzKAByd+jq5156bmo4kHwevWMknznW18Y/Svfk2dU91A==", "dev": true }, "node_modules/emittery": { @@ -12653,9 +12653,9 @@ }, "node_modules/fill-range": { "name": "@clevercanyon/fill-range.fork", - "version": "7.0.131", - "resolved": "https://registry.npmjs.org/@clevercanyon/fill-range.fork/-/fill-range.fork-7.0.131.tgz", - "integrity": "sha512-uPi2TOLlos0Hh/1DBairfum1yUBGe7+YveYXc4JlACgeMJcIlcn0rWCRoZMCuAOnj6uiaPxBXUCaJohAWPDomg==", + "version": "7.0.132", + "resolved": "https://registry.npmjs.org/@clevercanyon/fill-range.fork/-/fill-range.fork-7.0.132.tgz", + "integrity": "sha512-2snh+Fanf024Qxcyp2oungZI+4Z0XN5EDdNIXCpRuNY7v9CtOEDpatZUReUdyZmc1QXbu+jtfDOPoW5BK4makg==", "cpu": [ "x64", "arm64" @@ -12665,7 +12665,7 @@ "linux" ], "dependencies": { - "to-regex-range": "npm:@clevercanyon/to-regex-range.fork@^5.0.131" + "to-regex-range": "npm:@clevercanyon/to-regex-range.fork@^5.0.132" }, "engines": { "node": "^20.5.0 || ^20.9.0 || ^21.6.2", @@ -14233,9 +14233,9 @@ }, "node_modules/is-number": { "name": "@clevercanyon/is-number.fork", - "version": "7.0.134", - "resolved": "https://registry.npmjs.org/@clevercanyon/is-number.fork/-/is-number.fork-7.0.134.tgz", - "integrity": "sha512-pPap566SoQieAWipencKH5yMlwmsNxLV3X3zJfpRZBHA9/3Z/KUz1SLxD1Nb3mCafO3jU5dAqA4XoI/IpTVzqQ==", + "version": "7.0.135", + "resolved": "https://registry.npmjs.org/@clevercanyon/is-number.fork/-/is-number.fork-7.0.135.tgz", + "integrity": "sha512-++KBfFTvPK4lyCyxpOc6LvZ3PFwRm4JsoT8r5cyefcWrSJjADqmnyW5UKMtv0TEkS7Feox7bVk3oDyX8ISQyqA==", "cpu": [ "x64", "arm64" @@ -18523,9 +18523,9 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.1.tgz", - "integrity": "sha512-Di63TQEHbiApe6CFp/qQXCORHMHnmW2JFdr5PYH57LuEIPjijRHicAmL5wQu+B0/Q4p0qJaEOE1EkhiwxiNmAQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -21338,9 +21338,9 @@ } }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -21366,9 +21366,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.5.tgz", - "integrity": "sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.6.tgz", + "integrity": "sha512-2GENDVgEk1dt+OdVhPO+zO4Dzj31Xs9EuKgQLbY9RSkKS3jUqnbTAh33bUhKce5JM1ZmsXm0azCb7Bh8j6W6Nw==", "dev": true, "funding": [ { @@ -21381,10 +21381,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -21447,9 +21447,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.3.tgz", - "integrity": "sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.4.tgz", + "integrity": "sha512-Ubs7O3wj2prghaKRa68VHBvuy3KnTQ0zbGwqDYY1mntxJD0QL2AeiAy+AMfl3HBedTCVr2IcFNktwty9YpSskA==", "dev": true, "funding": [ { @@ -21462,10 +21462,10 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/cascade-layer-name-parser": "^1.0.9", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9" }, "engines": { "node": "^14 || ^16 || >=18" @@ -21475,9 +21475,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "13.3.5", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.5.tgz", - "integrity": "sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==", + "version": "13.3.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.6.tgz", + "integrity": "sha512-vVVIwQbJiIz+PBLMIWA6XMi53Zg66/f474KolA7x0Das6EwkATc/9ZvM6zZx2gs7ZhcgVHjmWBbHkK9FlCgLeA==", "dev": true, "funding": [ { @@ -21490,9 +21490,9 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", + "@csstools/cascade-layer-name-parser": "^1.0.9", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -21504,9 +21504,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.7.tgz", - "integrity": "sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==", + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.8.tgz", + "integrity": "sha512-fqDkGSEsO7+oQaqdRdR8nwwqH+N2uk6LE/2g4myVJJYz/Ly418lHKEleKTdV/GzjBjFcG4n0dbfuH/Pd2BE8YA==", "dev": true, "funding": [ { @@ -21519,9 +21519,9 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", + "@csstools/cascade-layer-name-parser": "^1.0.9", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -21532,9 +21532,9 @@ } }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -21570,9 +21570,9 @@ } }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -21583,9 +21583,9 @@ } }, "node_modules/postcss-double-position-gradients": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.4.tgz", - "integrity": "sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.5.tgz", + "integrity": "sha512-26Tx4BfoxMNO9C89Nk56bfGv4jAwdDVgrQOyHZOP/6/D+xuOBf306KzTjHC2oBzaIIVtX+famOWHv4raxMjJMQ==", "dev": true, "funding": [ { @@ -21598,7 +21598,7 @@ } ], "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -21635,9 +21635,9 @@ } }, "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -21673,9 +21673,9 @@ } }, "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -21777,9 +21777,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.10.tgz", - "integrity": "sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.11.tgz", + "integrity": "sha512-toTAozTlBBhqSynSJ32O6ssukZFphS58AAQcVqMA8kG/E04+v+e7E5OKRqq68M/VJaWIeMdpyeBEO51buMrdvw==", "dev": true, "funding": [ { @@ -21792,10 +21792,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -21922,9 +21922,9 @@ } }, "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -22005,9 +22005,9 @@ } }, "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -22208,9 +22208,9 @@ } }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -22313,9 +22313,9 @@ } }, "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -27833,9 +27833,9 @@ } }, "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -27928,9 +27928,9 @@ } }, "node_modules/stylelint/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -28314,9 +28314,9 @@ } }, "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -29940,9 +29940,9 @@ } }, "node_modules/unplugin": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.9.0.tgz", - "integrity": "sha512-14PslvMY3gNbXnQtNIRB566Q057L5Fe7f5LDEamxVi0QQVxoz5hrveBwwZLcKyHtZ09ysmipxRRj5Lv+BGz2Iw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.0.tgz", + "integrity": "sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==", "dev": true, "dependencies": { "acorn": "^8.11.3", diff --git a/package.json b/package.json index 4b228b1..b0d9656 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.294", + "version": "1.0.295", "license": "GPL-3.0-or-later", "name": "@clevercanyon/utilities.cfw", "description": "Utilities for JavaScript apps running in a Cloudflare Worker environment.", @@ -69,7 +69,7 @@ }, "dependencies": {}, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.902", + "@clevercanyon/utilities": "^1.0.911", "@cloudflare/ai": "1.0.53", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0" diff --git a/src/cfw.ts b/src/cfw.ts index 74db6fe..0ec1e36 100644 --- a/src/cfw.ts +++ b/src/cfw.ts @@ -15,19 +15,17 @@ import type { SessionOptions as AiSessionOptions } from '@cloudflare/ai/dist/ses * Defines types. */ export type ScheduledEvent = $type.$cfw.ScheduledEvent & Readonly<{}>; + export type ExecutionContext = $type.$cfw.ExecutionContext & Readonly<$type.cfw.ExecutionContext>; export type Environment = $type.$cfw.Environment & Readonly<{}>; -export type Route = ((rcData: RequestContextData) => Promise<$type.cfw.Response>) & { - config?: Required<$http.RouteConfig>; -}; +export type Route = $type.$cfw.Route; export type Routes = Readonly<{ subpathGlobs: { [x: string]: Route } }>; export type InitialRequestContextData = Readonly<{ scheduledEvent?: ScheduledEvent; ctx: ExecutionContext; env: Environment; - request: $type.cfw.Request; routes: Routes; }>; @@ -103,7 +101,6 @@ export const handleFetchEvent = async (ircData: InitialRequestContextData): Prom consentLogger = baseConsentLogger.withContext({}, { request }), rcData = rcDataPrepare({ scheduledEvent, - ctx, env, @@ -113,7 +110,6 @@ export const handleFetchEvent = async (ircData: InitialRequestContextData): Prom fetch, caches, - auditLogger, consentLogger, subrequestCounter, @@ -122,7 +118,7 @@ export const handleFetchEvent = async (ircData: InitialRequestContextData): Prom for (const [subpathGlob, route] of Object.entries(routes.subpathGlobs)) if ($mm.test(url.pathname, $url.pathFromAppBase('./') + subpathGlob)) { - response = handleFetchCache(rcData, route); + response = handleRouteCache(rcData, route); break; // Route found; stop here. } response ??= $http.prepareResponse(request, { status: 404 }) as Promise<$type.cfw.Response>; @@ -292,125 +288,14 @@ export const serviceBindingRequest = async ( }; /** - * Logs a heartbeat for monitoring purposes. - * - * @param rcData Request context data. - * @param id Heartbeat ID; e.g., `JGndBRX5LXN79q5q1GkpsmaQ`. - */ -export const heartbeat = async (rcData: $type.$cfw.RequestContextData, id: string): Promise => { - await $http.heartbeat(id, { cfw: rcData }); // Uses `ctx.waitUntil()`. -}; - -// --- -// Misc utilities. - -/** - * Proxies a resource binding for the purpose of counting subrequests. - * - * @param target A target object. - * @param subrequestCounter Subrequest counter. - * - * @returns A proxied target object of {@see Type}. - * - * @throws If input `target` is not a supported object type. - */ -const subrequestCounterProxy = (target: Type, subrequestCounter: $type.$cfw.SubrequestCounter): Type => { - const targetC9rName = $obj.c9r(target)?.name || ''; - - if (target === cfw.fetch) { - const cfwFetch = cfw.fetch.bind(cfw); - return ((...args: Parameters): ReturnType => { - subrequestCounter.value++; - return cfwFetch(...args); - }) as Type; - } - if (!['CacheStorage', 'Fetcher', 'D1Database', 'D1PreparedStatement', 'R2Bucket', 'R2MultipartUpload', 'KvNamespace', 'WorkerQueue'].includes(targetC9rName)) { - throw Error('3V2Rw38X'); // Unexpected object type. - } - return new Proxy(target, { - get(target: Type, property: $type.ObjectKey, receiver: unknown): unknown { - const value = (target as $type.Keyable)[property]; - if (!$is.function(value)) return value; - - return function (this: unknown, ...args: unknown[]): unknown { - const fn = value; // For the sake of added clarity. - let fnRtnValue = fn.apply(this === receiver ? target : this, args); - - if ($is.object(fnRtnValue)) { - if ( - ('CacheStorage' === targetC9rName && 'Cache' === $obj.c9r(fnRtnValue)?.name) || - (['D1Database', 'D1PreparedStatement'].includes(targetC9rName) && 'D1PreparedStatement' === $obj.c9r(fnRtnValue)?.name) || - ('R2Bucket' === targetC9rName && 'R2MultipartUpload' === $obj.c9r(fnRtnValue)?.name) - ) { - return subrequestCounterProxy(fnRtnValue, subrequestCounter); - } - } - if ($is.string(property)) - switch (targetC9rName) { - case 'Cache': { - if (['put', 'match', 'delete'].includes(property)) { - subrequestCounter.value++; - } - break; - } - case 'Fetcher': { - if (['fetch'].includes(property)) { - subrequestCounter.value++; - } - break; - } - case 'D1Database': { - if (['dump', 'exec', 'batch'].includes(property)) { - subrequestCounter.value++; - } - break; - } - case 'D1PreparedStatement': { - if (['all', 'raw', 'first', 'run'].includes(property)) { - subrequestCounter.value++; - } - break; - } - case 'R2Bucket': { - if (['head', 'get', 'put', 'delete', 'list'].includes(property)) { - subrequestCounter.value++; - } - break; - } - case 'R2MultipartUpload': { - if (['uploadPart', 'complete'].includes(property)) { - subrequestCounter.value++; - } - break; - } - case 'KvNamespace': { - if (['get', 'getWithMetadata', 'list', 'put', 'delete'].includes(property)) { - subrequestCounter.value++; - } - break; - } - case 'WorkerQueue': { - if (['send', 'sendBatch'].includes(property)) { - subrequestCounter.value++; - } - break; - } - } - return fnRtnValue; - }; - }, - }); -}; - -/** - * Handles fetch caching. + * Handles route caching. * * @param rcData Request context data. - * @param route Route handler. + * @param route Route; {@see $type.$cfw.Route}. * * @returns Promise of a {@see $type.cfw.Response}. */ -const handleFetchCache = async (rcData: RequestContextData, route: Route): Promise<$type.cfw.Response> => { +export const handleRouteCache = async (rcData: Type, route: $type.$cfw.Route): Promise<$type.cfw.Response> => { const { Request } = cfw, { ctx, url, request, caches } = rcData; @@ -471,3 +356,196 @@ const handleFetchCache = async (rcData: RequestContextData, route: Route): Promi } return response; // Potentially cached async via `waitUntil()`. }; + +// --- +// Misc utilities. + +/** + * Proxies {@see cfw.fetch()} and/or a resource binding. + * + * @param target {@see cfw.fetch()} or a resource binding. + * @param subrequestCounter Subrequest counter; {@see $type.$cfw.SubrequestCounter}. + * + * @returns A proxied {@see cfw.fetch()} function, or a proxied resource binding. + * + * @throws If `target` object type is not supported; i.e., as detected using constructor names. + */ +const subrequestCounterProxy = (target: Type, subrequestCounter: $type.$cfw.SubrequestCounter): Type => { + if (target === cfw.fetch) { + return subrequestCountryProxyꓺfetch(subrequestCounter) as Type; + } + const targetC9rName = $obj.c9r(target)?.name, + supportedTargetC9rNames = [ + 'CacheStorage', // + 'Cache', + 'Fetcher', + 'D1Database', + 'D1PreparedStatement', + 'R2Bucket', + 'R2MultipartUpload', + 'KvNamespace', + 'WorkerQueue', + ]; + if (!targetC9rName || !supportedTargetC9rNames.includes(targetC9rName)) { + throw Error('QGySmpVX'); // Unexpected object type. + } + return new Proxy(target, { + get(target: Type, property: $type.ObjectKey, receiver: unknown): unknown { + const value = (target as $type.Keyable)[property]; + + if ('CacheStorage' === targetC9rName && 'Cache' === $obj.c9r(value)?.name) { + return subrequestCounterProxy(value as object, subrequestCounter); + } + if ($is.function(value)) + return function (this: unknown, ...args: unknown[]): unknown { + const fn = value, // For the sake of added clarity. + fnRtnValue = fn.apply(this === receiver ? target : this, args); + + if ($is.promise(fnRtnValue)) { + return fnRtnValue.then((fnRtnValue: unknown): unknown => { + return subrequestCounterProxyꓺfnRtnValue(targetC9rName, property, fnRtnValue, subrequestCounter); + }); + } + return subrequestCounterProxyꓺfnRtnValue(targetC9rName, property, fnRtnValue, subrequestCounter); + }; + return value; + }, + }); +}; + +/** + * Helps proxy {@see cfw.fetch()} for the purpose of counting subrequests. + * + * @param subrequestCounter Subrequest counter; {@see $type.$cfw.SubrequestCounter}. + * + * @returns Proxied {@see cfw.fetch()} function. + */ +const subrequestCountryProxyꓺfetch = (subrequestCounter: $type.$cfw.SubrequestCounter): Type => { + const { fetch, Request } = cfw; + + return new Proxy(fetch.bind(cfw) as Type, { + apply(target, thisArg, args: Parameters) { + const maxRedirects = 20, + redirectCounter = { value: 0 }; + + let request = new Request(args[0], args[1]), + url = $url.tryParse(request.url); + + const redirect = request.redirect || 'follow'; + + if ('manual' !== request.redirect) { + request = new Request(request, { redirect: 'manual' }); + } + subrequestCounter.value++; // Increments counter on initial fetch. + + return target.apply(thisArg, [request]).then((response): $type.cfw.Response | Promise<$type.cfw.Response> => { + if (url && [301, 302, 303, 307, 308].includes(response.status) && 'follow' === redirect) { + if (response.headers.has('location') && redirectCounter.value + 1 <= maxRedirects) { + const location = response.headers.get('location') || '', + redirectURL = location ? $url.tryParse(location, url) : undefined; + + if (redirectURL && redirectURL.toString() !== url.toString()) { + let redirectRequest = new Request(redirectURL, request); + + if (url.protocol !== redirectURL.protocol || $url.rootHost(url) !== $url.rootHost(redirectURL)) + for (const protectedCrossDomainHeader of $http.protectedCrossDomainHeaderNames()) { + redirectRequest.headers.delete(protectedCrossDomainHeader); + } + if (([301, 302].includes(response.status) && 'POST' === request.method) || 303 === response.status) { + redirectRequest = new Request(redirectRequest, { method: 'GET', body: null }); + redirectRequest.headers.delete('content-type'); + redirectRequest.headers.delete('content-length'); + redirectRequest.headers.delete('content-encoding'); + redirectRequest.headers.delete('transfer-encoding'); + } + if (response.headers.get('referrer-policy')) { + redirectRequest.headers.set('referrer-policy', response.headers.get('referrer-policy') as string); + } + $http.prepareRefererHeader(redirectRequest.headers, url, redirectURL); + redirectCounter.value++, subrequestCounter.value++; // Increments counters. + + return target.apply(thisArg, [redirectRequest]); + } + } + } + return response; + }); + }, + }); +}; + +/** + * Helps proxy a resource binding for the purpose of counting subrequests. + * + * @param targetC9rName The target object’s constructor name; i.e., object type. + * @param fnProperty Requested property on target object, that returned a function. + * @param fnRtnValue Resolved return value of requested property’s function invocation. + * @param subrequestCounter Subrequest counter; {@see $type.$cfw.SubrequestCounter}. + * + * @returns Function return value, which is potentially another proxied subtarget; i.e., as a branch + * of the original target. Prior to returning, this utility also handles subrequest counter incrementation. + */ +const subrequestCounterProxyꓺfnRtnValue = (targetC9rName: string, fnProperty: $type.ObjectKey, fnRtnValue: unknown, subrequestCounter: $type.$cfw.SubrequestCounter): unknown => { + if ($is.object(fnRtnValue)) { + const fnRtnValueC9rName = $obj.c9r(fnRtnValue)?.name; + if ( + ('CacheStorage' === targetC9rName && 'Cache' === fnRtnValueC9rName) || + (['D1Database', 'D1PreparedStatement'].includes(targetC9rName) && 'D1PreparedStatement' === fnRtnValueC9rName) || + ('R2Bucket' === targetC9rName && 'R2MultipartUpload' === fnRtnValueC9rName) + ) { + return subrequestCounterProxy(fnRtnValue, subrequestCounter); + } + } + if ($is.string(fnProperty)) + switch (targetC9rName) { + case 'Cache': { + if (['put', 'match', 'delete'].includes(fnProperty)) { + subrequestCounter.value++; + } + break; + } + case 'Fetcher': { + if (['fetch'].includes(fnProperty)) { + subrequestCounter.value++; + } + break; + } + case 'D1Database': { + if (['dump', 'exec', 'batch'].includes(fnProperty)) { + subrequestCounter.value++; + } + break; + } + case 'D1PreparedStatement': { + if (['all', 'raw', 'first', 'run'].includes(fnProperty)) { + subrequestCounter.value++; + } + break; + } + case 'R2Bucket': { + if (['head', 'get', 'put', 'delete', 'list'].includes(fnProperty)) { + subrequestCounter.value++; + } + break; + } + case 'R2MultipartUpload': { + if (['uploadPart', 'complete'].includes(fnProperty)) { + subrequestCounter.value++; + } + break; + } + case 'KvNamespace': { + if (['get', 'getWithMetadata', 'list', 'put', 'delete'].includes(fnProperty)) { + subrequestCounter.value++; + } + break; + } + case 'WorkerQueue': { + if (['send', 'sendBatch'].includes(fnProperty)) { + subrequestCounter.value++; + } + break; + } + } + return fnRtnValue; +}; diff --git a/src/proxy.ts b/src/proxy.ts index 5dc5158..653da94 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -17,10 +17,12 @@ export type FetchOptions = { username?: string; password?: string; }; - method?: 'HEAD' | 'GET'; + method?: 'OPTIONS' | 'HEAD' | 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'; headers?: $type.cfw.HeadersInit; + body?: string | null | undefined; uaBotAppend?: string; + redirect?: 'follow' | 'manual'; maxRedirects?: number; timeout?: number; // In milliseconds. }; @@ -53,8 +55,10 @@ export const fetch = async (rcData: $type.$cfw.RequestContextData, parseable: $t }, method: 'GET', headers: {}, + body: null, uaBotAppend: '', + redirect: 'follow', maxRedirects: 3, timeout: $time.secondInMilliseconds * 15, }) as RequiredFetchOptions; @@ -139,7 +143,7 @@ const fetchꓺwaitTimeout = async (rcData: $type.$cfw.RequestContextData, opts: * @returns Promise of HTTP response. */ const fetchꓺviaSocket = async (rcData: $type.$cfw.RequestContextData, url: $type.cfw.URL, opts: RequiredFetchOptions, redirects: number = 0): Promise<$type.cfw.Response> => { - const { Blob, Response } = cfw, + const { Blob, Headers, Response } = cfw, { auditLogger, subrequestCounter } = rcData, sockets = await import('cloudflare:sockets'); @@ -172,7 +176,8 @@ const fetchꓺviaSocket = async (rcData: $type.$cfw.RequestContextData, url: $ty await writer.write( $str.textEncode( opts.method + ' ' + url.toString() + ' HTTP/1.0\r\n' + - [...headers].join('\r\n') + '\r\n\r\n', + [...headers].join('\r\n') + '\r\n\r\n' + + (opts.body || ''), ), // prettier-ignore ); // --- @@ -238,16 +243,34 @@ const fetchꓺviaSocket = async (rcData: $type.$cfw.RequestContextData, url: $ty statusText: $http.responseStatusText(421), headers: { 'content-type': $mime.contentType('.txt') }, }); - if ([301, 302, 303, 307, 308].includes(responseStatus) && ['HEAD', 'GET'].includes(opts.method)) + if ([301, 302, 303, 307, 308].includes(responseStatus) && 'follow' === opts.redirect) { if (responseHeaders.has('location') && redirects + 1 <= opts.maxRedirects) { const location = responseHeaders.get('location') || '', redirectURL = location ? $url.tryParse(location, url) : undefined; - // Follows redirects, but only when URL actually changes. if (redirectURL && redirectURL.toString() !== url.toString()) { - return fetchꓺviaSocket(rcData, redirectURL, opts, redirects + 1); + const redirectOpts = { ...opts, headers: new Headers(opts.headers) }; + + if (url.protocol !== redirectURL.protocol || $url.rootHost(url) !== $url.rootHost(redirectURL)) + for (const protectedCrossDomainHeader of $http.protectedCrossDomainHeaderNames()) { + redirectOpts.headers.delete(protectedCrossDomainHeader); + } + if (([301, 302].includes(responseStatus) && 'POST' === opts.method) || 303 === responseStatus) { + (redirectOpts.method = 'GET'), (redirectOpts.body = null); + redirectOpts.headers.delete('content-type'); + redirectOpts.headers.delete('content-length'); + redirectOpts.headers.delete('content-encoding'); + redirectOpts.headers.delete('transfer-encoding'); + } + if (responseHeaders.get('referrer-policy')) { + redirectOpts.headers.set('referrer-policy', responseHeaders.get('referrer-policy') as string); + } + $http.prepareRefererHeader(redirectOpts.headers, url, redirectURL); + + return fetchꓺviaSocket(rcData, redirectURL, redirectOpts, redirects + 1); } } + } return new Response(responseBody, { status: responseStatus, statusText: $http.responseStatusText(responseStatus), diff --git a/tsconfig.json b/tsconfig.json index 16c066a..3e4a137 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ * @note This entire file will be updated automatically. * @note Instead of editing here, please review `./tsconfig.mjs`. * - * Last generated using `./tsconfig.mjs` Mar 12, 2024 8:33 AM UTC. + * Last generated using `./tsconfig.mjs` Mar 14, 2024 1:22 AM UTC. */ { "include": ["./src/**/*", "./dev-types.d.ts"], diff --git a/wrangler.toml b/wrangler.toml index f72c7b1..43e8cd6 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -7,7 +7,7 @@ # @note This entire file will be updated automatically. # @note Instead of editing here, please review `./wrangler.mjs`. # -# Last generated using `./wrangler.mjs` Mar 12, 2024 8:33 AM UTC. +# Last generated using `./wrangler.mjs` Mar 14, 2024 1:22 AM UTC. ## send_metrics = false