project setup
8 files changed,  +1441, -0
A .gitignore
+11, -0
 1@@ -0,0 +1,11 @@
 2+# Devenv
 3+.devenv*
 4+devenv.local.nix
 5+devenv.local.yaml
 6+
 7+# direnv
 8+.direnv
 9+
10+# pre-commit
11+.pre-commit-config.yaml
12+node_modules
A DESIGN.md
+11, -0
 1@@ -0,0 +1,11 @@
 2+This is a simple application monitoring webapp that uses Cloudflare workers and durable objects to monitor health endpoints for my deployed apps.  Health endpoints look like a list of URLs: https://mymood.at/healthz, https://infra.sovrn.at/healthz.  These endpoints return a JSON object with details about the health of their services and use status codes to indicate issues that need attention.
 3+
 4+The app should create several durable objects in different regions: western north america, eastern north america, eastern europe, western europe, asia pacific.  Using Durable Object alarms, each should wake up every 3 minutes (configurable), send GET requests to the list of monitoring endpoints, and save the status code, time of response, request duration, and JSON response to the local Sqlite storage.  A trigger on the Sqlite database deletes rows older than 14 days.
 5+
 6+A status code of 200 from a health endpoint indicates that everything is fine for that application.  Any other status or a failed response due to a timeout indicates an issue with that application, and the durable object should use Cloudflare's email service to send an alert email to [email protected] (allowed destination address) with the status response and the JSON payload in the body of the email.
 7+
 8+A homepage available on https://monitor.rtw.run should contact each durable object via RPC stub and retrieve the lateststatus available, presented in a table with the status, time of response, and request duration (latency).  Each should be similar to a details/summary element, where clicking the row opens more information about the response, which shows the most recent JSON response pretty-printed.  A link at the end of each row allows opening a separate page to that particular health endpoint that shows paginated responses, with optional filters to show only non-200 responses.  All pages are protected with basic auth.
 9+
10+Design aesthetics are not important, but UX is a priority and it should work on both desktop and mobile screens.  You may use any framework except React to build the UI.  Simplicity is paramount: the goal is a robust application that requires little maintenance (fewer dependencies is better).  You must use Cloudflare services and deploy via wrangler (already installed in this environment and logged in).
11+
12+You should discuss your design choices and present options with a rationale before building anything.
A devenv.lock
+238, -0
  1@@ -0,0 +1,238 @@
  2+{
  3+  "nodes": {
  4+    "bug": {
  5+      "inputs": {
  6+        "flake-utils": "flake-utils",
  7+        "nixpkgs": "nixpkgs"
  8+      },
  9+      "locked": {
 10+        "lastModified": 1789299135,
 11+        "narHash": "sha256-eU2EKLWUG7+LOdd6xlLELcXaK9yGyS4Hi1NWWuJPyj0=",
 12+        "ref": "refs/heads/main",
 13+        "rev": "c150b552f4b084877dd7386a5543934d7ad0c7e9",
 14+        "revCount": 12,
 15+        "type": "git",
 16+        "url": "https://git.kilimanjaro.io/bug"
 17+      },
 18+      "original": {
 19+        "type": "git",
 20+        "url": "https://git.kilimanjaro.io/bug"
 21+      }
 22+    },
 23+    "devenv": {
 24+      "locked": {
 25+        "dir": "src/modules",
 26+        "lastModified": 1791549372,
 27+        "narHash": "sha256-5Vu2oKeImB5wQWLFSEcWXsF0Oajm4/5MV7UlnOdelmg=",
 28+        "owner": "cachix",
 29+        "repo": "devenv",
 30+        "rev": "a73c5b84c9527760f009232988466763068f9f61",
 31+        "type": "github"
 32+      },
 33+      "original": {
 34+        "dir": "src/modules",
 35+        "owner": "cachix",
 36+        "repo": "devenv",
 37+        "type": "github"
 38+      }
 39+    },
 40+    "flake-utils": {
 41+      "inputs": {
 42+        "systems": "systems"
 43+      },
 44+      "locked": {
 45+        "lastModified": 1731533236,
 46+        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
 47+        "owner": "numtide",
 48+        "repo": "flake-utils",
 49+        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
 50+        "type": "github"
 51+      },
 52+      "original": {
 53+        "owner": "numtide",
 54+        "repo": "flake-utils",
 55+        "type": "github"
 56+      }
 57+    },
 58+    "flake-utils_2": {
 59+      "inputs": {
 60+        "systems": "systems_2"
 61+      },
 62+      "locked": {
 63+        "lastModified": 1731533236,
 64+        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
 65+        "owner": "numtide",
 66+        "repo": "flake-utils",
 67+        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
 68+        "type": "github"
 69+      },
 70+      "original": {
 71+        "owner": "numtide",
 72+        "repo": "flake-utils",
 73+        "type": "github"
 74+      }
 75+    },
 76+    "local-code-review": {
 77+      "inputs": {
 78+        "nixpkgs": "nixpkgs_2"
 79+      },
 80+      "locked": {
 81+        "lastModified": 1790664642,
 82+        "narHash": "sha256-Pl7zVsnoxxrbrg/up/5Ue2a9ajtROQptM4AOuo7AYts=",
 83+        "ref": "refs/heads/main",
 84+        "rev": "95ae244a839007c6aa89fa5230be193d878ee56e",
 85+        "revCount": 17,
 86+        "type": "git",
 87+        "url": "https://git.kilimanjaro.io/local-code-review"
 88+      },
 89+      "original": {
 90+        "type": "git",
 91+        "url": "https://git.kilimanjaro.io/local-code-review"
 92+      }
 93+    },
 94+    "nixpkgs": {
 95+      "locked": {
 96+        "lastModified": 1789149629,
 97+        "narHash": "sha256-H6GwaZzZf+4npqv0tph94w9tZddSjFjmQrVsW0z78uk=",
 98+        "owner": "NixOS",
 99+        "repo": "nixpkgs",
100+        "rev": "eaad089433ca2bb662274377d33df3d0e51ef28b",
101+        "type": "github"
102+      },
103+      "original": {
104+        "owner": "NixOS",
105+        "ref": "nixos-unstable",
106+        "repo": "nixpkgs",
107+        "type": "github"
108+      }
109+    },
110+    "nixpkgs-src": {
111+      "flake": false,
112+      "locked": {
113+        "lastModified": 1789370336,
114+        "narHash": "sha256-6RSEDHIWQtesQKWSu5qRai8L2h4KgCgMEfJHstW99G4=",
115+        "owner": "NixOS",
116+        "repo": "nixpkgs",
117+        "rev": "c7def046b9a883d46974757852106483d741586f",
118+        "type": "github"
119+      },
120+      "original": {
121+        "owner": "NixOS",
122+        "ref": "nixpkgs-unstable",
123+        "repo": "nixpkgs",
124+        "type": "github"
125+      }
126+    },
127+    "nixpkgs_2": {
128+      "locked": {
129+        "lastModified": 1790323409,
130+        "narHash": "sha256-VVTPf+Hyd5ebpjBMHmrLMSBIeW6ls48Bqtosj7CNKLA=",
131+        "owner": "NixOS",
132+        "repo": "nixpkgs",
133+        "rev": "e94cb152ed51bd6e24eb4a41f1460252beb52cd2",
134+        "type": "github"
135+      },
136+      "original": {
137+        "owner": "NixOS",
138+        "ref": "nixos-unstable",
139+        "repo": "nixpkgs",
140+        "type": "github"
141+      }
142+    },
143+    "nixpkgs_3": {
144+      "inputs": {
145+        "nixpkgs-src": "nixpkgs-src"
146+      },
147+      "locked": {
148+        "lastModified": 1789506231,
149+        "narHash": "sha256-vNkJbtmqyBfFhn/HnzQo4ROuoyYWuy/allqTfJb4kMY=",
150+        "owner": "cachix",
151+        "repo": "devenv-nixpkgs",
152+        "rev": "c2f38fe7f9e04d9aadd354d380f2bd40531d9737",
153+        "type": "github"
154+      },
155+      "original": {
156+        "owner": "cachix",
157+        "ref": "rolling",
158+        "repo": "devenv-nixpkgs",
159+        "type": "github"
160+      }
161+    },
162+    "nixpkgs_4": {
163+      "locked": {
164+        "lastModified": 1790578696,
165+        "narHash": "sha256-ZoxIApko70jCdbH3l20HWXOBaT2HZd87orzd2yJ9dVE=",
166+        "owner": "NixOS",
167+        "repo": "nixpkgs",
168+        "rev": "7a0f122f5090cf4c2ade2a13a0e229d4e19ba71f",
169+        "type": "github"
170+      },
171+      "original": {
172+        "owner": "NixOS",
173+        "ref": "nixos-unstable",
174+        "repo": "nixpkgs",
175+        "type": "github"
176+      }
177+    },
178+    "root": {
179+      "inputs": {
180+        "bug": "bug",
181+        "devenv": "devenv",
182+        "local-code-review": "local-code-review",
183+        "nixpkgs": "nixpkgs_3",
184+        "secrets": "secrets"
185+      }
186+    },
187+    "secrets": {
188+      "inputs": {
189+        "flake-utils": "flake-utils_2",
190+        "nixpkgs": "nixpkgs_4"
191+      },
192+      "locked": {
193+        "lastModified": 1790680131,
194+        "narHash": "sha256-p3xPff0d3O4T8AW0Zbv7sZDZcJk61f5LEHRKcSTRF58=",
195+        "ref": "refs/heads/main",
196+        "rev": "96a2b2da934d769c76c19073e89e19e231964868",
197+        "revCount": 1,
198+        "type": "git",
199+        "url": "https://git.kilimanjaro.io/secrets"
200+      },
201+      "original": {
202+        "type": "git",
203+        "url": "https://git.kilimanjaro.io/secrets"
204+      }
205+    },
206+    "systems": {
207+      "locked": {
208+        "lastModified": 1681028828,
209+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
210+        "owner": "nix-systems",
211+        "repo": "default",
212+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
213+        "type": "github"
214+      },
215+      "original": {
216+        "owner": "nix-systems",
217+        "repo": "default",
218+        "type": "github"
219+      }
220+    },
221+    "systems_2": {
222+      "locked": {
223+        "lastModified": 1681028828,
224+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
225+        "owner": "nix-systems",
226+        "repo": "default",
227+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
228+        "type": "github"
229+      },
230+      "original": {
231+        "owner": "nix-systems",
232+        "repo": "default",
233+        "type": "github"
234+      }
235+    }
236+  },
237+  "root": "root",
238+  "version": 7
239+}
A devenv.nix
+83, -0
 1@@ -0,0 +1,83 @@
 2+{
 3+  pkgs,
 4+  lib,
 5+  config,
 6+  inputs,
 7+  ...
 8+}:
 9+
10+{
11+  # https://devenv.sh/basics/
12+  env.GREET = "devenv";
13+
14+  # https://devenv.sh/packages/
15+  packages = [
16+    pkgs.git
17+    pkgs.bash
18+    pkgs.bash-completion
19+    pkgs.bashInteractive
20+    pkgs.just
21+    pkgs.curl
22+    pkgs.jq
23+
24+    # custom tools
25+    inputs.bug.packages.${pkgs.system}.bug
26+    inputs.local-code-review.packages.${pkgs.system}.default
27+    inputs.secrets.packages.${pkgs.system}.default
28+  ];
29+
30+  # https://devenv.sh/languages/
31+  languages.javascript.enable = true;
32+  languages.javascript.corepack.enable = true;
33+
34+  # https://devenv.sh/processes/
35+  # processes.dev.exec = "${lib.getExe pkgs.watchexec} -n -- ls -la";
36+
37+  # https://devenv.sh/services/
38+  # services.postgres.enable = true;
39+
40+
41+  enterShell = ''
42+    # Configure bash with fish-like features
43+    bind 'set completion-ignore-case on'  # Case-insensitive completion
44+    bind 'set show-all-if-ambiguous on'   # Show all completions on first tab
45+    bind 'set menu-complete-display-prefix on'
46+    bind 'TAB:menu-complete'              # Tab cycles through completions
47+    bind '\e[A:history-search-backward'   # Up arrow searches history
48+    bind '\e[B:history-search-forward'    # Down arrow searches history
49+    bind 'set colored-completion-prefix on'  # Color the completion prefix
50+    bind 'set colored-stats on'           # Color the completion stats
51+
52+    # Enable bash-completion if available
53+    if [ -f ${pkgs.bash-completion}/etc/profile.d/bash_completion.sh ]; then
54+      source ${pkgs.bash-completion}/etc/profile.d/bash_completion.sh
55+    fi
56+
57+    # Better directory navigation
58+    shopt -s autocd 2>/dev/null          # Type directory name to cd
59+    shopt -s dirspell 2>/dev/null        # Correct spelling of dir names
60+    shopt -s cdspell 2>/dev/null         # Correct spelling of cd args
61+
62+    # Enable ** globbing for recursive directory matching
63+    shopt -s globstar 2>/dev/null
64+
65+    # Use correct Cloudflare context
66+    export CF_ACCOUNT_ID=$(secrets decrypt cloudflare/account_id)
67+    export CLOUDFLARE_API_TOKEN=$(secrets decrypt cloudflare/workers_api_key)
68+  '';
69+
70+# https://devenv.sh/tasks/
71+  # tasks = {
72+  #   "myproj:setup".exec = "mytool build";
73+  #   "devenv:enterShell".after = [ "myproj:setup" ];
74+  # };
75+
76+  # https://devenv.sh/tests/
77+  enterTest = ''
78+  '';
79+
80+  # https://devenv.sh/git-hooks/
81+  # git-hooks.hooks.shellcheck.enable = true;
82+
83+  # See full reference at https://devenv.sh/reference/options/
84+}
A devenv.yaml
+24, -0
 1@@ -0,0 +1,24 @@
 2+# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
 3+inputs:
 4+  nixpkgs:
 5+    url: github:cachix/devenv-nixpkgs/rolling
 6+  bug:
 7+    url: git+https://git.kilimanjaro.io/bug
 8+  local-code-review:
 9+    url: git+https://git.kilimanjaro.io/local-code-review
10+  secrets:
11+    url: git+https://git.kilimanjaro.io/secrets
12+reload: false
13+# If you're using non-OSS software, you can set allow_unfree to true.
14+# allow_unfree: true
15+
16+# If you're not willing to allow unsupported packages:
17+# allow_unsupported_system: false
18+
19+# If you're willing to use a package that's vulnerable
20+# permitted_insecure_packages:
21+#  - "openssl-1.1.1w"
22+
23+# If you have more than one devenv you can merge them
24+#imports:
25+# - ./backend
A package.json
+17, -0
 1@@ -0,0 +1,17 @@
 2+{
 3+    "name": "monitor",
 4+    "version": "1.0.0",
 5+    "description": "",
 6+    "main": "index.js",
 7+    "scripts": {
 8+        "test": "echo \"Error: no test specified\" && exit 1"
 9+    },
10+    "keywords": [],
11+    "author": "",
12+    "license": "ISC",
13+    "packageManager": "[email protected]+sha512.ba40a37eb1a370d60fea8c4cf1d364c13bcccef518e98ad2bcee954f539d38da37458e58261a3fa55e06523450ea0ffff9f497b135be41f2c15c1642bacace6c",
14+    "type": "module",
15+    "devDependencies": {
16+        "wrangler": "^4.149.0"
17+    }
18+}
A pnpm-lock.yaml
+1053, -0
   1@@ -0,0 +1,1053 @@
   2+---
   3+lockfileVersion: '9.0'
   4+
   5+importers:
   6+
   7+  .:
   8+    configDependencies: {}
   9+    packageManagerDependencies:
  10+      pnpm:
  11+        specifier: 12.10.1
  12+        version: 12.10.1
  13+
  14+packages:
  15+
  16+  '@pnpm/[email protected]':
  17+    resolution: {integrity: sha512-CVTlHPwNvadQCJD9bGSMzWIhFX8QpjtqC2c27dhdnn/9iKzEjZ3qL62o3gHpKbIuo6qn4WxTKRoaokgNdReBig==}
  18+    cpu: [arm64]
  19+    os: [android]
  20+
  21+  '@pnpm/[email protected]':
  22+    resolution: {integrity: sha512-NFiYLIaodY7da0XIebwcU3JoP7IK/lzF7zgKSSP+9H+QcFnQ1GDfBkuBKCYJzZ+Xu0WH54neIPLBBCaOjaaauA==}
  23+    cpu: [x64]
  24+    os: [android]
  25+
  26+  '@pnpm/[email protected]':
  27+    resolution: {integrity: sha512-0O8tdQ8ijlPJudXspLMTcitMkdBEz6uUflazL5uQE0WMs85oQIp0U+5hfEktMFB64QqEhjqlvvujTwbzdr9oMg==}
  28+    cpu: [arm64]
  29+    os: [darwin]
  30+
  31+  '@pnpm/[email protected]':
  32+    resolution: {integrity: sha512-ud+1/uZOKEo8P/AsPynOJc/LNwfI0j6WwCElibj71rU9l4nIBnsSn+wWTIPZPkZ4BBSH5+82azSnAARMyJ1lNA==}
  33+    cpu: [x64]
  34+    os: [darwin]
  35+
  36+  '@pnpm/[email protected]':
  37+    resolution: {integrity: sha512-mj9PE5rf8uAfQQ2K66HSATMSut+lNiB4eSqFd5+azFVCMnxNSy/32xpZQJT21PhnN3Y4qbK+iKHe5nWAxSuRhw==}
  38+    cpu: [x64]
  39+    os: [freebsd]
  40+
  41+  '@pnpm/[email protected]':
  42+    resolution: {integrity: sha512-xba+00wZJ8Um6rBJJjWl88uJj0tydB8dtomvjlCLvi0uL32vpa9CRP8Vv26FIXvbiZ1bo2RCzYt/eChxJVV52w==}
  43+    cpu: [arm64]
  44+    os: [linux]
  45+    libc: [musl]
  46+
  47+  '@pnpm/[email protected]':
  48+    resolution: {integrity: sha512-oBdMp69ScC9UnniG4qZAQVr2fBDSXjm4yk/72vkEVyrlwS23yMxcRQl7Qdo3sgXPAygY6TWnPRKm4rXzjoyW7w==}
  49+    cpu: [arm64]
  50+    os: [linux]
  51+    libc: [glibc]
  52+
  53+  '@pnpm/[email protected]':
  54+    resolution: {integrity: sha512-Yyb3wu09h3c7mLme270uHFiVaAIUHC411Ru9LIU2BKUIstrGlXa9OqqVWoXaRgYRdFdOFknkwG7GNn6ygwLbnw==}
  55+    cpu: [ppc64]
  56+    os: [linux]
  57+    libc: [glibc]
  58+
  59+  '@pnpm/[email protected]':
  60+    resolution: {integrity: sha512-PdkeUFFkybknnGkWP0H22eMpIiS4OZXL5BcQzF4lh+vmrW3IaC2HOkbANKgot/PKO0Kl77pzA/6PKFxgbgfXIQ==}
  61+    cpu: [riscv64]
  62+    os: [linux]
  63+    libc: [glibc]
  64+
  65+  '@pnpm/[email protected]':
  66+    resolution: {integrity: sha512-1okKuHKJwJPAbofDxfhZWAUxEWtee4ZSf7Pah8kcvocaJkf2WxFJ5KVTiNIvDml5GLidDQsgf7Pcf/WHbCak7Q==}
  67+    cpu: [s390x]
  68+    os: [linux]
  69+    libc: [glibc]
  70+
  71+  '@pnpm/[email protected]':
  72+    resolution: {integrity: sha512-e6IqzVNkPa7srFKJKnY23uWJ+qz0LaRWiTUo/sHfFXRRMRzB5uNOr6qWWip/jqhdGwU91n9J7LrEYZ6e0tRczw==}
  73+    cpu: [x64]
  74+    os: [linux]
  75+    libc: [musl]
  76+
  77+  '@pnpm/[email protected]':
  78+    resolution: {integrity: sha512-ZByV0DRgWzGaDSjT5ddRBASdwz+r/qPMYh7o6RGmPQjtRGNFbSl94xY2DcAM8mqCOZJUUDtAXQ+wpBXcdpKlkg==}
  79+    cpu: [x64]
  80+    os: [linux]
  81+    libc: [glibc]
  82+
  83+  '@pnpm/[email protected]':
  84+    resolution: {integrity: sha512-I7QZHcjioG7orFeCRUFUHByJ1G0zFPnAlaGGyrUvb6MGkv5oeNwNPl7t+Gp+7zHfnMcgLGJ1a+Wfim0IDw3lOw==}
  85+    cpu: [arm64]
  86+    os: [win32]
  87+
  88+  '@pnpm/[email protected]':
  89+    resolution: {integrity: sha512-4WJFdp58EKlCj0zLobrXU0vpszSZIr4X/3y/uNbAQqGW0zE+VdruZB0gFc3L2kzsUzVwTYbaCn+XEhnCYSAlTg==}
  90+    cpu: [x64]
  91+    os: [win32]
  92+
  93+  [email protected]:
  94+    resolution: {integrity: sha512-ukCjfrGjcNYP6oxM8dNkwTvMzvUY6YrSvO6VT1OdONo3RY5YJho/pV4GUjRQ6g//+fSXsTW+QfLBXBZCusrObA==}
  95+    engines: {node: '>=18.*'}
  96+    hasBin: true
  97+
  98+snapshots:
  99+
 100+  '@pnpm/[email protected]':
 101+    optional: true
 102+
 103+  '@pnpm/[email protected]':
 104+    optional: true
 105+
 106+  '@pnpm/[email protected]':
 107+    optional: true
 108+
 109+  '@pnpm/[email protected]':
 110+    optional: true
 111+
 112+  '@pnpm/[email protected]':
 113+    optional: true
 114+
 115+  '@pnpm/[email protected]':
 116+    optional: true
 117+
 118+  '@pnpm/[email protected]':
 119+    optional: true
 120+
 121+  '@pnpm/[email protected]':
 122+    optional: true
 123+
 124+  '@pnpm/[email protected]':
 125+    optional: true
 126+
 127+  '@pnpm/[email protected]':
 128+    optional: true
 129+
 130+  '@pnpm/[email protected]':
 131+    optional: true
 132+
 133+  '@pnpm/[email protected]':
 134+    optional: true
 135+
 136+  '@pnpm/[email protected]':
 137+    optional: true
 138+
 139+  '@pnpm/[email protected]':
 140+    optional: true
 141+
 142+  [email protected]:
 143+    optionalDependencies:
 144+      '@pnpm/exe.android-arm64': 12.10.1
 145+      '@pnpm/exe.android-x64': 12.10.1
 146+      '@pnpm/exe.darwin-arm64': 12.10.1
 147+      '@pnpm/exe.darwin-x64': 12.10.1
 148+      '@pnpm/exe.freebsd-x64': 12.10.1
 149+      '@pnpm/exe.linux-arm64': 12.10.1
 150+      '@pnpm/exe.linux-arm64-musl': 12.10.1
 151+      '@pnpm/exe.linux-ppc64': 12.10.1
 152+      '@pnpm/exe.linux-riscv64': 12.10.1
 153+      '@pnpm/exe.linux-s390x': 12.10.1
 154+      '@pnpm/exe.linux-x64': 12.10.1
 155+      '@pnpm/exe.linux-x64-musl': 12.10.1
 156+      '@pnpm/exe.win32-arm64': 12.10.1
 157+      '@pnpm/exe.win32-x64': 12.10.1
 158+
 159+---
 160+lockfileVersion: '9.0'
 161+
 162+settings:
 163+  autoInstallPeers: true
 164+  excludeLinksFromLockfile: false
 165+
 166+importers:
 167+
 168+  .:
 169+    devDependencies:
 170+      wrangler:
 171+        specifier: ^4.149.0
 172+        version: 4.149.0
 173+
 174+packages:
 175+
 176+  '@cloudflare/[email protected]':
 177+    resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==}
 178+    engines: {node: '>=22.0.0'}
 179+
 180+  '@cloudflare/[email protected]':
 181+    resolution: {integrity: sha512-JBP1+Z7ZSNG/d4mRP+y8VC5dka3tZVMLEZRvS+rzQ4DGV1EoxRFQckcJTTkXbHSQiTj0DtNI01Zwb/V2fX0mvQ==}
 182+    peerDependencies:
 183+      unenv: 2.0.0-rc.24
 184+      workerd: '>1.20260305.0 <2.0.0-0'
 185+    peerDependenciesMeta:
 186+      workerd:
 187+        optional: true
 188+
 189+  '@cloudflare/[email protected]':
 190+    resolution: {integrity: sha512-lCX6avJO2It9AyDEYitjmOtJRVp/xmaW0TziyoLAnfxlzozyyRbSFfIIMMCiDx/sTP1++E4VLbV+7BHSD33f0Q==}
 191+    engines: {node: '>=16'}
 192+    cpu: [x64]
 193+    os: [darwin]
 194+
 195+  '@cloudflare/[email protected]':
 196+    resolution: {integrity: sha512-PyFGjOaldtppnLuKsdkoYWXfLVpDjuf8u+uoykX+1Xvxo2EPmCVViq0iDKm+U7c7PRno85ehS3/MPVXyk2HwHw==}
 197+    engines: {node: '>=16'}
 198+    cpu: [arm64]
 199+    os: [darwin]
 200+
 201+  '@cloudflare/[email protected]':
 202+    resolution: {integrity: sha512-Ntf9S8eesmVufdjaT2kzWlz6Ng9XGYTc6cHQVRKAg59lFufwsIabGeMT6U4KkrpEeSIxgHq8aPtuLbZXE19tCA==}
 203+    engines: {node: '>=16'}
 204+    cpu: [x64]
 205+    os: [linux]
 206+
 207+  '@cloudflare/[email protected]':
 208+    resolution: {integrity: sha512-JyeDBymVWw5tVRebSsVE8ojDYxd6UlZrAseHU8G+NpIyd5wF61tXlF/axLeCUqu0pOhBFHb8I5QKi0jwrCK41Q==}
 209+    engines: {node: '>=16'}
 210+    cpu: [arm64]
 211+    os: [linux]
 212+
 213+  '@cloudflare/[email protected]':
 214+    resolution: {integrity: sha512-nWP0URNqOBN9fa/gZ7eh/w051DwjOXN8j4lDZDYVXyQPsux6sV3DfyYZT+CjR/rt9nKBSmJT9QE9/bWT18+84w==}
 215+    engines: {node: '>=16'}
 216+    cpu: [x64]
 217+    os: [win32]
 218+
 219+  '@cspotcode/[email protected]':
 220+    resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
 221+    engines: {node: '>=12'}
 222+
 223+  '@emnapi/[email protected]':
 224+    resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
 225+
 226+  '@esbuild/[email protected]':
 227+    resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
 228+    engines: {node: '>=18'}
 229+    cpu: [ppc64]
 230+    os: [aix]
 231+
 232+  '@esbuild/[email protected]':
 233+    resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
 234+    engines: {node: '>=18'}
 235+    cpu: [arm64]
 236+    os: [android]
 237+
 238+  '@esbuild/[email protected]':
 239+    resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
 240+    engines: {node: '>=18'}
 241+    cpu: [arm]
 242+    os: [android]
 243+
 244+  '@esbuild/[email protected]':
 245+    resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
 246+    engines: {node: '>=18'}
 247+    cpu: [x64]
 248+    os: [android]
 249+
 250+  '@esbuild/[email protected]':
 251+    resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
 252+    engines: {node: '>=18'}
 253+    cpu: [arm64]
 254+    os: [darwin]
 255+
 256+  '@esbuild/[email protected]':
 257+    resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
 258+    engines: {node: '>=18'}
 259+    cpu: [x64]
 260+    os: [darwin]
 261+
 262+  '@esbuild/[email protected]':
 263+    resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
 264+    engines: {node: '>=18'}
 265+    cpu: [arm64]
 266+    os: [freebsd]
 267+
 268+  '@esbuild/[email protected]':
 269+    resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
 270+    engines: {node: '>=18'}
 271+    cpu: [x64]
 272+    os: [freebsd]
 273+
 274+  '@esbuild/[email protected]':
 275+    resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
 276+    engines: {node: '>=18'}
 277+    cpu: [arm64]
 278+    os: [linux]
 279+
 280+  '@esbuild/[email protected]':
 281+    resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
 282+    engines: {node: '>=18'}
 283+    cpu: [arm]
 284+    os: [linux]
 285+
 286+  '@esbuild/[email protected]':
 287+    resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
 288+    engines: {node: '>=18'}
 289+    cpu: [ia32]
 290+    os: [linux]
 291+
 292+  '@esbuild/[email protected]':
 293+    resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
 294+    engines: {node: '>=18'}
 295+    cpu: [loong64]
 296+    os: [linux]
 297+
 298+  '@esbuild/[email protected]':
 299+    resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
 300+    engines: {node: '>=18'}
 301+    cpu: [mips64el]
 302+    os: [linux]
 303+
 304+  '@esbuild/[email protected]':
 305+    resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
 306+    engines: {node: '>=18'}
 307+    cpu: [ppc64]
 308+    os: [linux]
 309+
 310+  '@esbuild/[email protected]':
 311+    resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
 312+    engines: {node: '>=18'}
 313+    cpu: [riscv64]
 314+    os: [linux]
 315+
 316+  '@esbuild/[email protected]':
 317+    resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
 318+    engines: {node: '>=18'}
 319+    cpu: [s390x]
 320+    os: [linux]
 321+
 322+  '@esbuild/[email protected]':
 323+    resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
 324+    engines: {node: '>=18'}
 325+    cpu: [x64]
 326+    os: [linux]
 327+
 328+  '@esbuild/[email protected]':
 329+    resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
 330+    engines: {node: '>=18'}
 331+    cpu: [arm64]
 332+    os: [netbsd]
 333+
 334+  '@esbuild/[email protected]':
 335+    resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
 336+    engines: {node: '>=18'}
 337+    cpu: [x64]
 338+    os: [netbsd]
 339+
 340+  '@esbuild/[email protected]':
 341+    resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
 342+    engines: {node: '>=18'}
 343+    cpu: [arm64]
 344+    os: [openbsd]
 345+
 346+  '@esbuild/[email protected]':
 347+    resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
 348+    engines: {node: '>=18'}
 349+    cpu: [x64]
 350+    os: [openbsd]
 351+
 352+  '@esbuild/[email protected]':
 353+    resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
 354+    engines: {node: '>=18'}
 355+    cpu: [arm64]
 356+    os: [openharmony]
 357+
 358+  '@esbuild/[email protected]':
 359+    resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
 360+    engines: {node: '>=18'}
 361+    cpu: [x64]
 362+    os: [sunos]
 363+
 364+  '@esbuild/[email protected]':
 365+    resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
 366+    engines: {node: '>=18'}
 367+    cpu: [arm64]
 368+    os: [win32]
 369+
 370+  '@esbuild/[email protected]':
 371+    resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
 372+    engines: {node: '>=18'}
 373+    cpu: [ia32]
 374+    os: [win32]
 375+
 376+  '@esbuild/[email protected]':
 377+    resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
 378+    engines: {node: '>=18'}
 379+    cpu: [x64]
 380+    os: [win32]
 381+
 382+  '@img/[email protected]':
 383+    resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
 384+    engines: {node: '>=18'}
 385+
 386+  '@img/[email protected]':
 387+    resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==}
 388+    engines: {node: '>=20.9.0'}
 389+    cpu: [arm64]
 390+    os: [darwin]
 391+
 392+  '@img/[email protected]':
 393+    resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==}
 394+    engines: {node: '>=20.9.0'}
 395+    cpu: [x64]
 396+    os: [darwin]
 397+
 398+  '@img/[email protected]':
 399+    resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==}
 400+    engines: {node: '>=20.9.0'}
 401+    os: [freebsd]
 402+
 403+  '@img/[email protected]':
 404+    resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==}
 405+    cpu: [arm64]
 406+    os: [darwin]
 407+
 408+  '@img/[email protected]':
 409+    resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==}
 410+    cpu: [x64]
 411+    os: [darwin]
 412+
 413+  '@img/[email protected]':
 414+    resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==}
 415+    cpu: [arm64]
 416+    os: [linux]
 417+    libc: [glibc]
 418+
 419+  '@img/[email protected]':
 420+    resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==}
 421+    cpu: [arm]
 422+    os: [linux]
 423+    libc: [glibc]
 424+
 425+  '@img/[email protected]':
 426+    resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==}
 427+    cpu: [ppc64]
 428+    os: [linux]
 429+    libc: [glibc]
 430+
 431+  '@img/[email protected]':
 432+    resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==}
 433+    cpu: [riscv64]
 434+    os: [linux]
 435+    libc: [glibc]
 436+
 437+  '@img/[email protected]':
 438+    resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==}
 439+    cpu: [s390x]
 440+    os: [linux]
 441+    libc: [glibc]
 442+
 443+  '@img/[email protected]':
 444+    resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==}
 445+    cpu: [x64]
 446+    os: [linux]
 447+    libc: [glibc]
 448+
 449+  '@img/[email protected]':
 450+    resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==}
 451+    cpu: [arm64]
 452+    os: [linux]
 453+    libc: [musl]
 454+
 455+  '@img/[email protected]':
 456+    resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==}
 457+    cpu: [x64]
 458+    os: [linux]
 459+    libc: [musl]
 460+
 461+  '@img/[email protected]':
 462+    resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==}
 463+    engines: {node: '>=20.9.0'}
 464+    cpu: [arm64]
 465+    os: [linux]
 466+    libc: [glibc]
 467+
 468+  '@img/[email protected]':
 469+    resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==}
 470+    engines: {node: '>=20.9.0'}
 471+    cpu: [arm]
 472+    os: [linux]
 473+    libc: [glibc]
 474+
 475+  '@img/[email protected]':
 476+    resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==}
 477+    engines: {node: '>=20.9.0'}
 478+    cpu: [ppc64]
 479+    os: [linux]
 480+    libc: [glibc]
 481+
 482+  '@img/[email protected]':
 483+    resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==}
 484+    engines: {node: '>=20.9.0'}
 485+    cpu: [riscv64]
 486+    os: [linux]
 487+    libc: [glibc]
 488+
 489+  '@img/[email protected]':
 490+    resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==}
 491+    engines: {node: '>=20.9.0'}
 492+    cpu: [s390x]
 493+    os: [linux]
 494+    libc: [glibc]
 495+
 496+  '@img/[email protected]':
 497+    resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==}
 498+    engines: {node: '>=20.9.0'}
 499+    cpu: [x64]
 500+    os: [linux]
 501+    libc: [glibc]
 502+
 503+  '@img/[email protected]':
 504+    resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==}
 505+    engines: {node: '>=20.9.0'}
 506+    cpu: [arm64]
 507+    os: [linux]
 508+    libc: [musl]
 509+
 510+  '@img/[email protected]':
 511+    resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==}
 512+    engines: {node: '>=20.9.0'}
 513+    cpu: [x64]
 514+    os: [linux]
 515+    libc: [musl]
 516+
 517+  '@img/[email protected]':
 518+    resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==}
 519+    engines: {node: '>=20.9.0'}
 520+
 521+  '@img/[email protected]':
 522+    resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==}
 523+    engines: {node: '>=20.9.0'}
 524+    cpu: [wasm32]
 525+
 526+  '@img/[email protected]':
 527+    resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==}
 528+    engines: {node: '>=20.9.0'}
 529+    cpu: [arm64]
 530+    os: [win32]
 531+
 532+  '@img/[email protected]':
 533+    resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==}
 534+    engines: {node: ^20.9.0}
 535+    cpu: [ia32]
 536+    os: [win32]
 537+
 538+  '@img/[email protected]':
 539+    resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==}
 540+    engines: {node: '>=20.9.0'}
 541+    cpu: [x64]
 542+    os: [win32]
 543+
 544+  '@jridgewell/[email protected]':
 545+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
 546+    engines: {node: '>=6.0.0'}
 547+
 548+  '@jridgewell/[email protected]':
 549+    resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
 550+
 551+  '@jridgewell/[email protected]':
 552+    resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
 553+
 554+  '@poppinss/[email protected]':
 555+    resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==}
 556+
 557+  '@poppinss/[email protected]':
 558+    resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==}
 559+
 560+  '@poppinss/[email protected]':
 561+    resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==}
 562+
 563+  '@sindresorhus/[email protected]':
 564+    resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==}
 565+    engines: {node: '>=18'}
 566+
 567+  '@speed-highlight/[email protected]':
 568+    resolution: {integrity: sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw==}
 569+
 570+  [email protected]:
 571+    resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
 572+
 573+  [email protected]:
 574+    resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
 575+    engines: {node: '>=18'}
 576+
 577+  [email protected]:
 578+    resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
 579+    engines: {node: '>=8'}
 580+
 581+  [email protected]:
 582+    resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==}
 583+
 584+  [email protected]:
 585+    resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
 586+    engines: {node: '>=18'}
 587+    hasBin: true
 588+
 589+  [email protected]:
 590+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
 591+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
 592+    os: [darwin]
 593+
 594+  [email protected]:
 595+    resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
 596+    engines: {node: '>=6'}
 597+
 598+  [email protected]:
 599+    resolution: {integrity: sha512-6ylv8tamkrspDI2R/cAYfv+YWmfGNdXe76Pi9TauEUWsFVXn3LNF9Yk8oduzf1a+TYsSRYTqlOE7+nGGRsMHdw==}
 600+    engines: {node: '>=22.0.0'}
 601+
 602+  [email protected]:
 603+    resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
 604+
 605+  [email protected]:
 606+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
 607+
 608+  [email protected]:
 609+    resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
 610+    engines: {node: '>=10'}
 611+    hasBin: true
 612+
 613+  [email protected]:
 614+    resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==}
 615+    engines: {node: '>=20.9.0'}
 616+    peerDependencies:
 617+      '@types/node': '*'
 618+    peerDependenciesMeta:
 619+      '@types/node':
 620+        optional: true
 621+
 622+  [email protected]:
 623+    resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
 624+    engines: {node: '>=18'}
 625+
 626+  [email protected]:
 627+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 628+
 629+  [email protected]:
 630+    resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==}
 631+    engines: {node: '>=20.18.1'}
 632+
 633+  [email protected]:
 634+    resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==}
 635+
 636+  [email protected]:
 637+    resolution: {integrity: sha512-8MadBuffZ5NdpLwZjUmsqT5QlaKXq4gjgT6wzcKeynZTICNXyePhc+5QVoKiK7+MMhFTLNrRO2KXLlpk8Q6BkA==}
 638+    engines: {node: '>=16'}
 639+    hasBin: true
 640+
 641+  [email protected]:
 642+    resolution: {integrity: sha512-OzK7xmB5r5iLKb3cIT3783g13fe6T7xyeKu9LEdUyl+DKAM2KP/jkjnE0OUhyw+mB/XJM9ycjgF3MWm8PR9amg==}
 643+    engines: {node: '>=22.0.0'}
 644+    hasBin: true
 645+    peerDependencies:
 646+      '@cloudflare/workers-types': ^5.20261006.1
 647+    peerDependenciesMeta:
 648+      '@cloudflare/workers-types':
 649+        optional: true
 650+
 651+  [email protected]:
 652+    resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==}
 653+    engines: {node: '>=10.0.0'}
 654+    peerDependencies:
 655+      bufferutil: ^4.0.1
 656+      utf-8-validate: '>=5.0.2'
 657+    peerDependenciesMeta:
 658+      bufferutil:
 659+        optional: true
 660+      utf-8-validate:
 661+        optional: true
 662+
 663+  [email protected]:
 664+    resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==}
 665+
 666+  [email protected]:
 667+    resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==}
 668+
 669+snapshots:
 670+
 671+  '@cloudflare/[email protected]': {}
 672+
 673+  '@cloudflare/[email protected]([email protected])([email protected])':
 674+    dependencies:
 675+      unenv: 2.0.0-rc.24
 676+    optionalDependencies:
 677+      workerd: 1.20261006.1
 678+
 679+  '@cloudflare/[email protected]':
 680+    optional: true
 681+
 682+  '@cloudflare/[email protected]':
 683+    optional: true
 684+
 685+  '@cloudflare/[email protected]':
 686+    optional: true
 687+
 688+  '@cloudflare/[email protected]':
 689+    optional: true
 690+
 691+  '@cloudflare/[email protected]':
 692+    optional: true
 693+
 694+  '@cspotcode/[email protected]':
 695+    dependencies:
 696+      '@jridgewell/trace-mapping': 0.3.9
 697+
 698+  '@emnapi/[email protected]':
 699+    dependencies:
 700+      tslib: 2.8.1
 701+    optional: true
 702+
 703+  '@esbuild/[email protected]':
 704+    optional: true
 705+
 706+  '@esbuild/[email protected]':
 707+    optional: true
 708+
 709+  '@esbuild/[email protected]':
 710+    optional: true
 711+
 712+  '@esbuild/[email protected]':
 713+    optional: true
 714+
 715+  '@esbuild/[email protected]':
 716+    optional: true
 717+
 718+  '@esbuild/[email protected]':
 719+    optional: true
 720+
 721+  '@esbuild/[email protected]':
 722+    optional: true
 723+
 724+  '@esbuild/[email protected]':
 725+    optional: true
 726+
 727+  '@esbuild/[email protected]':
 728+    optional: true
 729+
 730+  '@esbuild/[email protected]':
 731+    optional: true
 732+
 733+  '@esbuild/[email protected]':
 734+    optional: true
 735+
 736+  '@esbuild/[email protected]':
 737+    optional: true
 738+
 739+  '@esbuild/[email protected]':
 740+    optional: true
 741+
 742+  '@esbuild/[email protected]':
 743+    optional: true
 744+
 745+  '@esbuild/[email protected]':
 746+    optional: true
 747+
 748+  '@esbuild/[email protected]':
 749+    optional: true
 750+
 751+  '@esbuild/[email protected]':
 752+    optional: true
 753+
 754+  '@esbuild/[email protected]':
 755+    optional: true
 756+
 757+  '@esbuild/[email protected]':
 758+    optional: true
 759+
 760+  '@esbuild/[email protected]':
 761+    optional: true
 762+
 763+  '@esbuild/[email protected]':
 764+    optional: true
 765+
 766+  '@esbuild/[email protected]':
 767+    optional: true
 768+
 769+  '@esbuild/[email protected]':
 770+    optional: true
 771+
 772+  '@esbuild/[email protected]':
 773+    optional: true
 774+
 775+  '@esbuild/[email protected]':
 776+    optional: true
 777+
 778+  '@esbuild/[email protected]':
 779+    optional: true
 780+
 781+  '@img/[email protected]': {}
 782+
 783+  '@img/[email protected]':
 784+    optionalDependencies:
 785+      '@img/sharp-libvips-darwin-arm64': 1.3.4
 786+    optional: true
 787+
 788+  '@img/[email protected]':
 789+    optionalDependencies:
 790+      '@img/sharp-libvips-darwin-x64': 1.3.4
 791+    optional: true
 792+
 793+  '@img/[email protected]':
 794+    dependencies:
 795+      '@img/sharp-wasm32': 0.35.5
 796+    optional: true
 797+
 798+  '@img/[email protected]':
 799+    optional: true
 800+
 801+  '@img/[email protected]':
 802+    optional: true
 803+
 804+  '@img/[email protected]':
 805+    optional: true
 806+
 807+  '@img/[email protected]':
 808+    optional: true
 809+
 810+  '@img/[email protected]':
 811+    optional: true
 812+
 813+  '@img/[email protected]':
 814+    optional: true
 815+
 816+  '@img/[email protected]':
 817+    optional: true
 818+
 819+  '@img/[email protected]':
 820+    optional: true
 821+
 822+  '@img/[email protected]':
 823+    optional: true
 824+
 825+  '@img/[email protected]':
 826+    optional: true
 827+
 828+  '@img/[email protected]':
 829+    optionalDependencies:
 830+      '@img/sharp-libvips-linux-arm64': 1.3.4
 831+    optional: true
 832+
 833+  '@img/[email protected]':
 834+    optionalDependencies:
 835+      '@img/sharp-libvips-linux-arm': 1.3.4
 836+    optional: true
 837+
 838+  '@img/[email protected]':
 839+    optionalDependencies:
 840+      '@img/sharp-libvips-linux-ppc64': 1.3.4
 841+    optional: true
 842+
 843+  '@img/[email protected]':
 844+    optionalDependencies:
 845+      '@img/sharp-libvips-linux-riscv64': 1.3.4
 846+    optional: true
 847+
 848+  '@img/[email protected]':
 849+    optionalDependencies:
 850+      '@img/sharp-libvips-linux-s390x': 1.3.4
 851+    optional: true
 852+
 853+  '@img/[email protected]':
 854+    optionalDependencies:
 855+      '@img/sharp-libvips-linux-x64': 1.3.4
 856+    optional: true
 857+
 858+  '@img/[email protected]':
 859+    optionalDependencies:
 860+      '@img/sharp-libvips-linuxmusl-arm64': 1.3.4
 861+    optional: true
 862+
 863+  '@img/[email protected]':
 864+    optionalDependencies:
 865+      '@img/sharp-libvips-linuxmusl-x64': 1.3.4
 866+    optional: true
 867+
 868+  '@img/[email protected]':
 869+    dependencies:
 870+      '@emnapi/runtime': 1.11.3
 871+    optional: true
 872+
 873+  '@img/[email protected]':
 874+    dependencies:
 875+      '@img/sharp-wasm32': 0.35.5
 876+    optional: true
 877+
 878+  '@img/[email protected]':
 879+    optional: true
 880+
 881+  '@img/[email protected]':
 882+    optional: true
 883+
 884+  '@img/[email protected]':
 885+    optional: true
 886+
 887+  '@jridgewell/[email protected]': {}
 888+
 889+  '@jridgewell/[email protected]': {}
 890+
 891+  '@jridgewell/[email protected]':
 892+    dependencies:
 893+      '@jridgewell/resolve-uri': 3.1.2
 894+      '@jridgewell/sourcemap-codec': 1.6.0
 895+
 896+  '@poppinss/[email protected]':
 897+    dependencies:
 898+      kleur: 4.1.5
 899+
 900+  '@poppinss/[email protected]':
 901+    dependencies:
 902+      '@poppinss/colors': 4.1.6
 903+      '@sindresorhus/is': 7.2.0
 904+      supports-color: 10.2.2
 905+
 906+  '@poppinss/[email protected]': {}
 907+
 908+  '@sindresorhus/[email protected]': {}
 909+
 910+  '@speed-highlight/[email protected]': {}
 911+
 912+  [email protected]: {}
 913+
 914+  [email protected]: {}
 915+
 916+  [email protected]: {}
 917+
 918+  [email protected]: {}
 919+
 920+  [email protected]:
 921+    optionalDependencies:
 922+      '@esbuild/aix-ppc64': 0.28.2
 923+      '@esbuild/android-arm': 0.28.2
 924+      '@esbuild/android-arm64': 0.28.2
 925+      '@esbuild/android-x64': 0.28.2
 926+      '@esbuild/darwin-arm64': 0.28.2
 927+      '@esbuild/darwin-x64': 0.28.2
 928+      '@esbuild/freebsd-arm64': 0.28.2
 929+      '@esbuild/freebsd-x64': 0.28.2
 930+      '@esbuild/linux-arm': 0.28.2
 931+      '@esbuild/linux-arm64': 0.28.2
 932+      '@esbuild/linux-ia32': 0.28.2
 933+      '@esbuild/linux-loong64': 0.28.2
 934+      '@esbuild/linux-mips64el': 0.28.2
 935+      '@esbuild/linux-ppc64': 0.28.2
 936+      '@esbuild/linux-riscv64': 0.28.2
 937+      '@esbuild/linux-s390x': 0.28.2
 938+      '@esbuild/linux-x64': 0.28.2
 939+      '@esbuild/netbsd-arm64': 0.28.2
 940+      '@esbuild/netbsd-x64': 0.28.2
 941+      '@esbuild/openbsd-arm64': 0.28.2
 942+      '@esbuild/openbsd-x64': 0.28.2
 943+      '@esbuild/openharmony-arm64': 0.28.2
 944+      '@esbuild/sunos-x64': 0.28.2
 945+      '@esbuild/win32-arm64': 0.28.2
 946+      '@esbuild/win32-ia32': 0.28.2
 947+      '@esbuild/win32-x64': 0.28.2
 948+
 949+  [email protected]:
 950+    optional: true
 951+
 952+  [email protected]: {}
 953+
 954+  [email protected]:
 955+    dependencies:
 956+      '@cspotcode/source-map-support': 0.8.1
 957+      sharp: 0.35.5
 958+      undici: 7.29.1
 959+      workerd: 1.20261006.1
 960+      ws: 8.21.0
 961+      youch: 4.1.0-beta.10
 962+    transitivePeerDependencies:
 963+      - '@types/node'
 964+      - bufferutil
 965+      - utf-8-validate
 966+
 967+  [email protected]: {}
 968+
 969+  [email protected]: {}
 970+
 971+  [email protected]: {}
 972+
 973+  [email protected]:
 974+    dependencies:
 975+      '@img/colour': 1.1.0
 976+      detect-libc: 2.1.2
 977+      semver: 7.8.5
 978+    optionalDependencies:
 979+      '@img/sharp-darwin-arm64': 0.35.5
 980+      '@img/sharp-darwin-x64': 0.35.5
 981+      '@img/sharp-freebsd-wasm32': 0.35.5
 982+      '@img/sharp-libvips-darwin-arm64': 1.3.4
 983+      '@img/sharp-libvips-darwin-x64': 1.3.4
 984+      '@img/sharp-libvips-linux-arm': 1.3.4
 985+      '@img/sharp-libvips-linux-arm64': 1.3.4
 986+      '@img/sharp-libvips-linux-ppc64': 1.3.4
 987+      '@img/sharp-libvips-linux-riscv64': 1.3.4
 988+      '@img/sharp-libvips-linux-s390x': 1.3.4
 989+      '@img/sharp-libvips-linux-x64': 1.3.4
 990+      '@img/sharp-libvips-linuxmusl-arm64': 1.3.4
 991+      '@img/sharp-libvips-linuxmusl-x64': 1.3.4
 992+      '@img/sharp-linux-arm': 0.35.5
 993+      '@img/sharp-linux-arm64': 0.35.5
 994+      '@img/sharp-linux-ppc64': 0.35.5
 995+      '@img/sharp-linux-riscv64': 0.35.5
 996+      '@img/sharp-linux-s390x': 0.35.5
 997+      '@img/sharp-linux-x64': 0.35.5
 998+      '@img/sharp-linuxmusl-arm64': 0.35.5
 999+      '@img/sharp-linuxmusl-x64': 0.35.5
1000+      '@img/sharp-webcontainers-wasm32': 0.35.5
1001+      '@img/sharp-win32-arm64': 0.35.5
1002+      '@img/sharp-win32-ia32': 0.35.5
1003+      '@img/sharp-win32-x64': 0.35.5
1004+
1005+  [email protected]: {}
1006+
1007+  [email protected]:
1008+    optional: true
1009+
1010+  [email protected]: {}
1011+
1012+  [email protected]:
1013+    dependencies:
1014+      pathe: 2.0.3
1015+
1016+  [email protected]:
1017+    optionalDependencies:
1018+      '@cloudflare/workerd-darwin-64': 1.20261006.1
1019+      '@cloudflare/workerd-darwin-arm64': 1.20261006.1
1020+      '@cloudflare/workerd-linux-64': 1.20261006.1
1021+      '@cloudflare/workerd-linux-arm64': 1.20261006.1
1022+      '@cloudflare/workerd-windows-64': 1.20261006.1
1023+
1024+  [email protected]:
1025+    dependencies:
1026+      '@cloudflare/kv-asset-handler': 0.5.0
1027+      '@cloudflare/unenv-preset': 2.16.2([email protected])([email protected])
1028+      blake3-wasm: 2.1.5
1029+      esbuild: 0.28.2
1030+      miniflare: 5.20261006.1-alpha
1031+      path-to-regexp: 6.3.0
1032+      unenv: 2.0.0-rc.24
1033+      workerd: 1.20261006.1
1034+    optionalDependencies:
1035+      fsevents: 2.3.3
1036+    transitivePeerDependencies:
1037+      - '@types/node'
1038+      - bufferutil
1039+      - utf-8-validate
1040+
1041+  [email protected]: {}
1042+
1043+  [email protected]:
1044+    dependencies:
1045+      '@poppinss/exception': 1.2.3
1046+      error-stack-parser-es: 1.0.5
1047+
1048+  [email protected]:
1049+    dependencies:
1050+      '@poppinss/colors': 4.1.6
1051+      '@poppinss/dumper': 0.6.5
1052+      '@speed-highlight/core': 1.2.24
1053+      cookie: 1.1.1
1054+      youch-core: 0.3.3
A pnpm-workspace.yaml
+4, -0
1@@ -0,0 +1,4 @@
2+allowBuilds:
3+  esbuild: true
4+  workerd: true
5+  pnpm: true