axum + Astro, shipped as one binary. Static pages served from disk in dev, embedded in the executable in release.
Astrum: axum + Astro template with env-var hot reload
Debug builds rebuild the Astro site with bun on change and reload browsers over /dev-ws; the client script only exists when the page was built with PUBLIC_HOT_RELOAD=true. Release builds embed frontend/dist and drop the watcher with --no-default-features.
20 files changed, +2562 -0
+6-0.gitignore
| @@ -0,0 +1,6 @@ | ||
| 1 | +target/ | |
| 2 | +frontend/dist/ | |
| 3 | +frontend/node_modules/ | |
| 4 | +frontend/.astro/ | |
| 5 | +.env | |
| 6 | +secrets.md |
+79-0README.md
| @@ -0,0 +1,79 @@ | ||
| 1 | +# Astrum | |
| 2 | + | |
| 3 | +axum + Astro, shipped as one binary. | |
| 4 | + | |
| 5 | +Astro builds static pages. axum serves them: from disk while you develop, from | |
| 6 | +inside the executable in release. There is no `astro dev` and no second port. | |
| 7 | + | |
| 8 | +## Requirements | |
| 9 | + | |
| 10 | +`rust`, `bun`, and `watchexec` (for `dev.sh`). | |
| 11 | + | |
| 12 | +## Develop | |
| 13 | + | |
| 14 | +```sh | |
| 15 | +./dev.sh | |
| 16 | +``` | |
| 17 | + | |
| 18 | +Opens on http://127.0.0.1:8080. It installs frontend dependencies on first run, | |
| 19 | +then watches two things at once: | |
| 20 | + | |
| 21 | +- **Rust changes** restart the server (watchexec). | |
| 22 | +- **Anything under `frontend/`** makes the server run `bun run build` and push | |
| 23 | + `reload` to every browser on `/dev-ws`. | |
| 24 | + | |
| 25 | +## Build for production | |
| 26 | + | |
| 27 | +```sh | |
| 28 | +./build.sh # -> backend/target/release/astrum | |
| 29 | +``` | |
| 30 | + | |
| 31 | +That rebuilds the frontend *without* `PUBLIC_HOT_RELOAD`, then compiles with | |
| 32 | +`--no-default-features` so the watcher, bun and `/dev-ws` are left out | |
| 33 | +entirely. The result is one self-contained file; copy it anywhere and run it. | |
| 34 | + | |
| 35 | +## How hot reload is wired | |
| 36 | + | |
| 37 | +| Where | What | | |
| 38 | +| --- | --- | | |
| 39 | +| `backend/src/dev.rs` | Runs `bun run build` with `PUBLIC_HOT_RELOAD=true`, watches `frontend/`, broadcasts to `/dev-ws`. | | |
| 40 | +| `frontend/src/components/DevReload.astro` | Emits the client script *only* when `PUBLIC_HOT_RELOAD === "true"`, so a production page has none of it. | | |
| 41 | +| `hot-reload` cargo feature | Compiles all of the above in. On by default; `--no-default-features` drops it and the `notify` dependency. | | |
| 42 | + | |
| 43 | +The env var is what connects the two halves: the Rust side sets it when it | |
| 44 | +invokes bun, and the Astro build decides from it whether the page opens a | |
| 45 | +socket at all. | |
| 46 | + | |
| 47 | +## Environment | |
| 48 | + | |
| 49 | +| Variable | Default | Meaning | | |
| 50 | +| --- | --- | --- | | |
| 51 | +| `HOST` | `127.0.0.1` | Bind address. | | |
| 52 | +| `PORT` | `8080` | Bind port. | | |
| 53 | +| `FRONTEND_WATCH` | on in debug, off in release | Rebuild the frontend and serve reloads. | | |
| 54 | +| `DEBOUNCE_MILLIS` | `500` | Quiet period after an edit before rebuilding. | | |
| 55 | +| `RUST_LOG` | `info` | Log filter. | | |
| 56 | + | |
| 57 | +## Layout | |
| 58 | + | |
| 59 | +``` | |
| 60 | +backend/ | |
| 61 | + build.rs cargo can't see frontend/dist; this makes it rebuild when it changes | |
| 62 | + src/main.rs routes, config, startup | |
| 63 | + src/frontend.rs serves dist: disk in debug, embedded in release | |
| 64 | + src/dev.rs bun rebuild, file watcher, /dev-ws | |
| 65 | +frontend/ | |
| 66 | + src/pages/ one file per route (index, about, 404) | |
| 67 | + src/layouts/ page shell | |
| 68 | + src/components/ DevReload | |
| 69 | + src/styles/ Tailwind entry and theme tokens | |
| 70 | +``` | |
| 71 | + | |
| 72 | +## Notes | |
| 73 | + | |
| 74 | +- `frontend/dist` has to exist before the server compiles, since `rust-embed` | |
| 75 | + reads it at compile time. `dev.sh` and `build.sh` both handle that. | |
| 76 | +- Astro emits `about/index.html`; the server resolves `/about` and `/about/` | |
| 77 | + to it, and unknown paths get `404.astro`. | |
| 78 | +- Add a route in axum by adding to the router in `main.rs`. Add a page by | |
| 79 | + dropping a `.astro` file in `frontend/src/pages/`. |
+1244-0backend/Cargo.lock
| @@ -0,0 +1,1244 @@ | ||
| 1 | +# This file is automatically @generated by Cargo. | |
| 2 | +# It is not intended for manual editing. | |
| 3 | +version = 4 | |
| 4 | + | |
| 5 | +[[package]] | |
| 6 | +name = "aho-corasick" | |
| 7 | +version = "1.1.5" | |
| 8 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 9 | +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" | |
| 10 | +dependencies = [ | |
| 11 | + "memchr", | |
| 12 | +] | |
| 13 | + | |
| 14 | +[[package]] | |
| 15 | +name = "anyhow" | |
| 16 | +version = "1.0.104" | |
| 17 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 18 | +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" | |
| 19 | + | |
| 20 | +[[package]] | |
| 21 | +name = "astrum" | |
| 22 | +version = "0.1.0" | |
| 23 | +dependencies = [ | |
| 24 | + "anyhow", | |
| 25 | + "axum", | |
| 26 | + "mime_guess", | |
| 27 | + "notify", | |
| 28 | + "rust-embed", | |
| 29 | + "serde_json", | |
| 30 | + "tokio", | |
| 31 | + "tracing", | |
| 32 | + "tracing-subscriber", | |
| 33 | +] | |
| 34 | + | |
| 35 | +[[package]] | |
| 36 | +name = "atomic-waker" | |
| 37 | +version = "1.1.2" | |
| 38 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 39 | +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" | |
| 40 | + | |
| 41 | +[[package]] | |
| 42 | +name = "axum" | |
| 43 | +version = "0.8.9" | |
| 44 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 45 | +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" | |
| 46 | +dependencies = [ | |
| 47 | + "axum-core", | |
| 48 | + "base64", | |
| 49 | + "bytes", | |
| 50 | + "form_urlencoded", | |
| 51 | + "futures-util", | |
| 52 | + "http", | |
| 53 | + "http-body", | |
| 54 | + "http-body-util", | |
| 55 | + "hyper", | |
| 56 | + "hyper-util", | |
| 57 | + "itoa", | |
| 58 | + "matchit", | |
| 59 | + "memchr", | |
| 60 | + "mime", | |
| 61 | + "percent-encoding", | |
| 62 | + "pin-project-lite", | |
| 63 | + "serde_core", | |
| 64 | + "serde_json", | |
| 65 | + "serde_path_to_error", | |
| 66 | + "serde_urlencoded", | |
| 67 | + "sha1", | |
| 68 | + "sync_wrapper", | |
| 69 | + "tokio", | |
| 70 | + "tokio-tungstenite", | |
| 71 | + "tower", | |
| 72 | + "tower-layer", | |
| 73 | + "tower-service", | |
| 74 | + "tracing", | |
| 75 | +] | |
| 76 | + | |
| 77 | +[[package]] | |
| 78 | +name = "axum-core" | |
| 79 | +version = "0.5.6" | |
| 80 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 81 | +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" | |
| 82 | +dependencies = [ | |
| 83 | + "bytes", | |
| 84 | + "futures-core", | |
| 85 | + "http", | |
| 86 | + "http-body", | |
| 87 | + "http-body-util", | |
| 88 | + "mime", | |
| 89 | + "pin-project-lite", | |
| 90 | + "sync_wrapper", | |
| 91 | + "tower-layer", | |
| 92 | + "tower-service", | |
| 93 | + "tracing", | |
| 94 | +] | |
| 95 | + | |
| 96 | +[[package]] | |
| 97 | +name = "base64" | |
| 98 | +version = "0.22.1" | |
| 99 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 100 | +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" | |
| 101 | + | |
| 102 | +[[package]] | |
| 103 | +name = "bitflags" | |
| 104 | +version = "2.13.2" | |
| 105 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 106 | +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" | |
| 107 | + | |
| 108 | +[[package]] | |
| 109 | +name = "block-buffer" | |
| 110 | +version = "0.10.4" | |
| 111 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 112 | +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" | |
| 113 | +dependencies = [ | |
| 114 | + "generic-array", | |
| 115 | +] | |
| 116 | + | |
| 117 | +[[package]] | |
| 118 | +name = "block-buffer" | |
| 119 | +version = "0.12.1" | |
| 120 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 121 | +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" | |
| 122 | +dependencies = [ | |
| 123 | + "hybrid-array", | |
| 124 | +] | |
| 125 | + | |
| 126 | +[[package]] | |
| 127 | +name = "bytes" | |
| 128 | +version = "1.12.1" | |
| 129 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 130 | +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" | |
| 131 | + | |
| 132 | +[[package]] | |
| 133 | +name = "cfg-if" | |
| 134 | +version = "1.0.5" | |
| 135 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 136 | +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" | |
| 137 | + | |
| 138 | +[[package]] | |
| 139 | +name = "const-oid" | |
| 140 | +version = "0.10.2" | |
| 141 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 142 | +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" | |
| 143 | + | |
| 144 | +[[package]] | |
| 145 | +name = "cpufeatures" | |
| 146 | +version = "0.2.17" | |
| 147 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 148 | +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" | |
| 149 | +dependencies = [ | |
| 150 | + "libc", | |
| 151 | +] | |
| 152 | + | |
| 153 | +[[package]] | |
| 154 | +name = "cpufeatures" | |
| 155 | +version = "0.3.1" | |
| 156 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 157 | +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" | |
| 158 | +dependencies = [ | |
| 159 | + "libc", | |
| 160 | +] | |
| 161 | + | |
| 162 | +[[package]] | |
| 163 | +name = "crypto-common" | |
| 164 | +version = "0.1.7" | |
| 165 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 166 | +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" | |
| 167 | +dependencies = [ | |
| 168 | + "generic-array", | |
| 169 | + "typenum", | |
| 170 | +] | |
| 171 | + | |
| 172 | +[[package]] | |
| 173 | +name = "crypto-common" | |
| 174 | +version = "0.2.2" | |
| 175 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 176 | +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" | |
| 177 | +dependencies = [ | |
| 178 | + "hybrid-array", | |
| 179 | +] | |
| 180 | + | |
| 181 | +[[package]] | |
| 182 | +name = "data-encoding" | |
| 183 | +version = "2.11.1" | |
| 184 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 185 | +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" | |
| 186 | + | |
| 187 | +[[package]] | |
| 188 | +name = "digest" | |
| 189 | +version = "0.10.7" | |
| 190 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 191 | +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" | |
| 192 | +dependencies = [ | |
| 193 | + "block-buffer 0.10.4", | |
| 194 | + "crypto-common 0.1.7", | |
| 195 | +] | |
| 196 | + | |
| 197 | +[[package]] | |
| 198 | +name = "digest" | |
| 199 | +version = "0.11.3" | |
| 200 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 201 | +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" | |
| 202 | +dependencies = [ | |
| 203 | + "block-buffer 0.12.1", | |
| 204 | + "const-oid", | |
| 205 | + "crypto-common 0.2.2", | |
| 206 | +] | |
| 207 | + | |
| 208 | +[[package]] | |
| 209 | +name = "errno" | |
| 210 | +version = "0.3.14" | |
| 211 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 212 | +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" | |
| 213 | +dependencies = [ | |
| 214 | + "libc", | |
| 215 | + "windows-sys 0.61.2", | |
| 216 | +] | |
| 217 | + | |
| 218 | +[[package]] | |
| 219 | +name = "form_urlencoded" | |
| 220 | +version = "1.2.2" | |
| 221 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 222 | +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" | |
| 223 | +dependencies = [ | |
| 224 | + "percent-encoding", | |
| 225 | +] | |
| 226 | + | |
| 227 | +[[package]] | |
| 228 | +name = "fsevent-sys" | |
| 229 | +version = "4.1.0" | |
| 230 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 231 | +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" | |
| 232 | +dependencies = [ | |
| 233 | + "libc", | |
| 234 | +] | |
| 235 | + | |
| 236 | +[[package]] | |
| 237 | +name = "futures-channel" | |
| 238 | +version = "0.3.34" | |
| 239 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 240 | +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" | |
| 241 | +dependencies = [ | |
| 242 | + "futures-core", | |
| 243 | +] | |
| 244 | + | |
| 245 | +[[package]] | |
| 246 | +name = "futures-core" | |
| 247 | +version = "0.3.34" | |
| 248 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 249 | +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" | |
| 250 | + | |
| 251 | +[[package]] | |
| 252 | +name = "futures-sink" | |
| 253 | +version = "0.3.34" | |
| 254 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 255 | +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" | |
| 256 | + | |
| 257 | +[[package]] | |
| 258 | +name = "futures-task" | |
| 259 | +version = "0.3.34" | |
| 260 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 261 | +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" | |
| 262 | + | |
| 263 | +[[package]] | |
| 264 | +name = "futures-util" | |
| 265 | +version = "0.3.34" | |
| 266 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 267 | +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" | |
| 268 | +dependencies = [ | |
| 269 | + "futures-core", | |
| 270 | + "futures-sink", | |
| 271 | + "futures-task", | |
| 272 | + "pin-project-lite", | |
| 273 | + "slab", | |
| 274 | +] | |
| 275 | + | |
| 276 | +[[package]] | |
| 277 | +name = "generic-array" | |
| 278 | +version = "0.14.7" | |
| 279 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 280 | +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" | |
| 281 | +dependencies = [ | |
| 282 | + "typenum", | |
| 283 | + "version_check", | |
| 284 | +] | |
| 285 | + | |
| 286 | +[[package]] | |
| 287 | +name = "getrandom" | |
| 288 | +version = "0.3.4" | |
| 289 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 290 | +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" | |
| 291 | +dependencies = [ | |
| 292 | + "cfg-if", | |
| 293 | + "libc", | |
| 294 | + "r-efi", | |
| 295 | + "wasip2", | |
| 296 | +] | |
| 297 | + | |
| 298 | +[[package]] | |
| 299 | +name = "http" | |
| 300 | +version = "1.5.0" | |
| 301 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 302 | +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" | |
| 303 | +dependencies = [ | |
| 304 | + "bytes", | |
| 305 | + "itoa", | |
| 306 | +] | |
| 307 | + | |
| 308 | +[[package]] | |
| 309 | +name = "http-body" | |
| 310 | +version = "1.1.0" | |
| 311 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 312 | +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" | |
| 313 | +dependencies = [ | |
| 314 | + "bytes", | |
| 315 | + "http", | |
| 316 | +] | |
| 317 | + | |
| 318 | +[[package]] | |
| 319 | +name = "http-body-util" | |
| 320 | +version = "0.1.5" | |
| 321 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 322 | +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" | |
| 323 | +dependencies = [ | |
| 324 | + "bytes", | |
| 325 | + "futures-core", | |
| 326 | + "http", | |
| 327 | + "http-body", | |
| 328 | + "pin-project-lite", | |
| 329 | +] | |
| 330 | + | |
| 331 | +[[package]] | |
| 332 | +name = "httparse" | |
| 333 | +version = "1.10.1" | |
| 334 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 335 | +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" | |
| 336 | + | |
| 337 | +[[package]] | |
| 338 | +name = "httpdate" | |
| 339 | +version = "1.0.3" | |
| 340 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 341 | +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" | |
| 342 | + | |
| 343 | +[[package]] | |
| 344 | +name = "hybrid-array" | |
| 345 | +version = "0.4.15" | |
| 346 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 347 | +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" | |
| 348 | +dependencies = [ | |
| 349 | + "typenum", | |
| 350 | +] | |
| 351 | + | |
| 352 | +[[package]] | |
| 353 | +name = "hyper" | |
| 354 | +version = "1.11.1" | |
| 355 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 356 | +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" | |
| 357 | +dependencies = [ | |
| 358 | + "atomic-waker", | |
| 359 | + "bytes", | |
| 360 | + "futures-channel", | |
| 361 | + "futures-core", | |
| 362 | + "http", | |
| 363 | + "http-body", | |
| 364 | + "httparse", | |
| 365 | + "httpdate", | |
| 366 | + "itoa", | |
| 367 | + "pin-project-lite", | |
| 368 | + "smallvec", | |
| 369 | + "tokio", | |
| 370 | +] | |
| 371 | + | |
| 372 | +[[package]] | |
| 373 | +name = "hyper-util" | |
| 374 | +version = "0.1.20" | |
| 375 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 376 | +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" | |
| 377 | +dependencies = [ | |
| 378 | + "bytes", | |
| 379 | + "http", | |
| 380 | + "http-body", | |
| 381 | + "hyper", | |
| 382 | + "pin-project-lite", | |
| 383 | + "tokio", | |
| 384 | + "tower-service", | |
| 385 | +] | |
| 386 | + | |
| 387 | +[[package]] | |
| 388 | +name = "inotify" | |
| 389 | +version = "0.11.5" | |
| 390 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 391 | +checksum = "4cc00ea907cab49550b7da656f80ebb97be1b997d931fbcd28d39734e17ce592" | |
| 392 | +dependencies = [ | |
| 393 | + "bitflags", | |
| 394 | + "inotify-sys", | |
| 395 | + "libc", | |
| 396 | +] | |
| 397 | + | |
| 398 | +[[package]] | |
| 399 | +name = "inotify-sys" | |
| 400 | +version = "0.1.8" | |
| 401 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 402 | +checksum = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d" | |
| 403 | +dependencies = [ | |
| 404 | + "libc", | |
| 405 | +] | |
| 406 | + | |
| 407 | +[[package]] | |
| 408 | +name = "itoa" | |
| 409 | +version = "1.0.18" | |
| 410 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 411 | +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" | |
| 412 | + | |
| 413 | +[[package]] | |
| 414 | +name = "kqueue" | |
| 415 | +version = "1.2.1" | |
| 416 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 417 | +checksum = "8d763e5b24120b4ddf50de6c92308156765aabfbbccebf401da7cff2d70a41ea" | |
| 418 | +dependencies = [ | |
| 419 | + "kqueue-sys", | |
| 420 | + "libc", | |
| 421 | +] | |
| 422 | + | |
| 423 | +[[package]] | |
| 424 | +name = "kqueue-sys" | |
| 425 | +version = "1.1.2" | |
| 426 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 427 | +checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" | |
| 428 | +dependencies = [ | |
| 429 | + "bitflags", | |
| 430 | + "libc", | |
| 431 | +] | |
| 432 | + | |
| 433 | +[[package]] | |
| 434 | +name = "lazy_static" | |
| 435 | +version = "1.5.0" | |
| 436 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 437 | +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" | |
| 438 | + | |
| 439 | +[[package]] | |
| 440 | +name = "libc" | |
| 441 | +version = "0.2.189" | |
| 442 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 443 | +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" | |
| 444 | + | |
| 445 | +[[package]] | |
| 446 | +name = "lock_api" | |
| 447 | +version = "0.4.14" | |
| 448 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 449 | +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" | |
| 450 | +dependencies = [ | |
| 451 | + "scopeguard", | |
| 452 | +] | |
| 453 | + | |
| 454 | +[[package]] | |
| 455 | +name = "log" | |
| 456 | +version = "0.4.34" | |
| 457 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 458 | +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" | |
| 459 | + | |
| 460 | +[[package]] | |
| 461 | +name = "matchers" | |
| 462 | +version = "0.2.0" | |
| 463 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 464 | +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" | |
| 465 | +dependencies = [ | |
| 466 | + "regex-automata", | |
| 467 | +] | |
| 468 | + | |
| 469 | +[[package]] | |
| 470 | +name = "matchit" | |
| 471 | +version = "0.8.4" | |
| 472 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 473 | +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" | |
| 474 | + | |
| 475 | +[[package]] | |
| 476 | +name = "memchr" | |
| 477 | +version = "2.8.3" | |
| 478 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 479 | +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" | |
| 480 | + | |
| 481 | +[[package]] | |
| 482 | +name = "mime" | |
| 483 | +version = "0.3.17" | |
| 484 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 485 | +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" | |
| 486 | + | |
| 487 | +[[package]] | |
| 488 | +name = "mime_guess" | |
| 489 | +version = "2.0.5" | |
| 490 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 491 | +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" | |
| 492 | +dependencies = [ | |
| 493 | + "mime", | |
| 494 | + "unicase", | |
| 495 | +] | |
| 496 | + | |
| 497 | +[[package]] | |
| 498 | +name = "mio" | |
| 499 | +version = "1.2.3" | |
| 500 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 501 | +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" | |
| 502 | +dependencies = [ | |
| 503 | + "libc", | |
| 504 | + "log", | |
| 505 | + "wasi", | |
| 506 | + "windows-sys 0.61.2", | |
| 507 | +] | |
| 508 | + | |
| 509 | +[[package]] | |
| 510 | +name = "notify" | |
| 511 | +version = "8.2.0" | |
| 512 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 513 | +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" | |
| 514 | +dependencies = [ | |
| 515 | + "bitflags", | |
| 516 | + "fsevent-sys", | |
| 517 | + "inotify", | |
| 518 | + "kqueue", | |
| 519 | + "libc", | |
| 520 | + "log", | |
| 521 | + "mio", | |
| 522 | + "notify-types", | |
| 523 | + "walkdir", | |
| 524 | + "windows-sys 0.60.2", | |
| 525 | +] | |
| 526 | + | |
| 527 | +[[package]] | |
| 528 | +name = "notify-types" | |
| 529 | +version = "2.1.0" | |
| 530 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 531 | +checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" | |
| 532 | +dependencies = [ | |
| 533 | + "bitflags", | |
| 534 | +] | |
| 535 | + | |
| 536 | +[[package]] | |
| 537 | +name = "nu-ansi-term" | |
| 538 | +version = "0.50.3" | |
| 539 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 540 | +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" | |
| 541 | +dependencies = [ | |
| 542 | + "windows-sys 0.61.2", | |
| 543 | +] | |
| 544 | + | |
| 545 | +[[package]] | |
| 546 | +name = "once_cell" | |
| 547 | +version = "1.21.4" | |
| 548 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 549 | +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" | |
| 550 | + | |
| 551 | +[[package]] | |
| 552 | +name = "parking_lot" | |
| 553 | +version = "0.12.5" | |
| 554 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 555 | +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" | |
| 556 | +dependencies = [ | |
| 557 | + "lock_api", | |
| 558 | + "parking_lot_core", | |
| 559 | +] | |
| 560 | + | |
| 561 | +[[package]] | |
| 562 | +name = "parking_lot_core" | |
| 563 | +version = "0.9.12" | |
| 564 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 565 | +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" | |
| 566 | +dependencies = [ | |
| 567 | + "cfg-if", | |
| 568 | + "libc", | |
| 569 | + "redox_syscall", | |
| 570 | + "smallvec", | |
| 571 | + "windows-link", | |
| 572 | +] | |
| 573 | + | |
| 574 | +[[package]] | |
| 575 | +name = "percent-encoding" | |
| 576 | +version = "2.3.2" | |
| 577 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 578 | +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" | |
| 579 | + | |
| 580 | +[[package]] | |
| 581 | +name = "pin-project-lite" | |
| 582 | +version = "0.2.17" | |
| 583 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 584 | +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" | |
| 585 | + | |
| 586 | +[[package]] | |
| 587 | +name = "ppv-lite86" | |
| 588 | +version = "0.2.21" | |
| 589 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 590 | +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" | |
| 591 | +dependencies = [ | |
| 592 | + "zerocopy", | |
| 593 | +] | |
| 594 | + | |
| 595 | +[[package]] | |
| 596 | +name = "proc-macro2" | |
| 597 | +version = "1.0.107" | |
| 598 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 599 | +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" | |
| 600 | +dependencies = [ | |
| 601 | + "unicode-ident", | |
| 602 | +] | |
| 603 | + | |
| 604 | +[[package]] | |
| 605 | +name = "quote" | |
| 606 | +version = "1.0.47" | |
| 607 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 608 | +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" | |
| 609 | +dependencies = [ | |
| 610 | + "proc-macro2", | |
| 611 | +] | |
| 612 | + | |
| 613 | +[[package]] | |
| 614 | +name = "r-efi" | |
| 615 | +version = "5.3.0" | |
| 616 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 617 | +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" | |
| 618 | + | |
| 619 | +[[package]] | |
| 620 | +name = "rand" | |
| 621 | +version = "0.9.5" | |
| 622 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 623 | +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" | |
| 624 | +dependencies = [ | |
| 625 | + "rand_chacha", | |
| 626 | + "rand_core", | |
| 627 | +] | |
| 628 | + | |
| 629 | +[[package]] | |
| 630 | +name = "rand_chacha" | |
| 631 | +version = "0.9.0" | |
| 632 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 633 | +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" | |
| 634 | +dependencies = [ | |
| 635 | + "ppv-lite86", | |
| 636 | + "rand_core", | |
| 637 | +] | |
| 638 | + | |
| 639 | +[[package]] | |
| 640 | +name = "rand_core" | |
| 641 | +version = "0.9.5" | |
| 642 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 643 | +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" | |
| 644 | +dependencies = [ | |
| 645 | + "getrandom", | |
| 646 | +] | |
| 647 | + | |
| 648 | +[[package]] | |
| 649 | +name = "redox_syscall" | |
| 650 | +version = "0.5.18" | |
| 651 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 652 | +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" | |
| 653 | +dependencies = [ | |
| 654 | + "bitflags", | |
| 655 | +] | |
| 656 | + | |
| 657 | +[[package]] | |
| 658 | +name = "regex-automata" | |
| 659 | +version = "0.4.18" | |
| 660 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 661 | +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" | |
| 662 | +dependencies = [ | |
| 663 | + "aho-corasick", | |
| 664 | + "memchr", | |
| 665 | + "regex-syntax", | |
| 666 | +] | |
| 667 | + | |
| 668 | +[[package]] | |
| 669 | +name = "regex-syntax" | |
| 670 | +version = "0.8.11" | |
| 671 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 672 | +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" | |
| 673 | + | |
| 674 | +[[package]] | |
| 675 | +name = "rust-embed" | |
| 676 | +version = "8.12.0" | |
| 677 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 678 | +checksum = "e9e7760e252aaba7b09f4be00e36476cf585bdb68a53552ac954cdf504ab4bc9" | |
| 679 | +dependencies = [ | |
| 680 | + "rust-embed-impl", | |
| 681 | + "rust-embed-utils", | |
| 682 | + "walkdir", | |
| 683 | +] | |
| 684 | + | |
| 685 | +[[package]] | |
| 686 | +name = "rust-embed-impl" | |
| 687 | +version = "8.12.0" | |
| 688 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 689 | +checksum = "3bcfc4d6f53af43755f7a723e4b6b8794fcce052a178dd8c6c1dadc5f5343097" | |
| 690 | +dependencies = [ | |
| 691 | + "mime_guess", | |
| 692 | + "proc-macro2", | |
| 693 | + "quote", | |
| 694 | + "rust-embed-utils", | |
| 695 | + "syn 2.0.119", | |
| 696 | + "walkdir", | |
| 697 | +] | |
| 698 | + | |
| 699 | +[[package]] | |
| 700 | +name = "rust-embed-utils" | |
| 701 | +version = "8.12.0" | |
| 702 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 703 | +checksum = "42ffa149f6aa81b58a5b3011d01a857c4ed12c7a732d2c51947a4c7c692185f0" | |
| 704 | +dependencies = [ | |
| 705 | + "sha2", | |
| 706 | + "walkdir", | |
| 707 | +] | |
| 708 | + | |
| 709 | +[[package]] | |
| 710 | +name = "ryu" | |
| 711 | +version = "1.0.23" | |
| 712 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 713 | +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" | |
| 714 | + | |
| 715 | +[[package]] | |
| 716 | +name = "same-file" | |
| 717 | +version = "1.0.6" | |
| 718 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 719 | +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" | |
| 720 | +dependencies = [ | |
| 721 | + "winapi-util", | |
| 722 | +] | |
| 723 | + | |
| 724 | +[[package]] | |
| 725 | +name = "scopeguard" | |
| 726 | +version = "1.2.0" | |
| 727 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 728 | +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" | |
| 729 | + | |
| 730 | +[[package]] | |
| 731 | +name = "serde" | |
| 732 | +version = "1.0.229" | |
| 733 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 734 | +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" | |
| 735 | +dependencies = [ | |
| 736 | + "serde_core", | |
| 737 | +] | |
| 738 | + | |
| 739 | +[[package]] | |
| 740 | +name = "serde_core" | |
| 741 | +version = "1.0.229" | |
| 742 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 743 | +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" | |
| 744 | +dependencies = [ | |
| 745 | + "serde_derive", | |
| 746 | +] | |
| 747 | + | |
| 748 | +[[package]] | |
| 749 | +name = "serde_derive" | |
| 750 | +version = "1.0.229" | |
| 751 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 752 | +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" | |
| 753 | +dependencies = [ | |
| 754 | + "proc-macro2", | |
| 755 | + "quote", | |
| 756 | + "syn 3.0.6", | |
| 757 | +] | |
| 758 | + | |
| 759 | +[[package]] | |
| 760 | +name = "serde_json" | |
| 761 | +version = "1.0.151" | |
| 762 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 763 | +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" | |
| 764 | +dependencies = [ | |
| 765 | + "itoa", | |
| 766 | + "memchr", | |
| 767 | + "serde", | |
| 768 | + "serde_core", | |
| 769 | + "zmij", | |
| 770 | +] | |
| 771 | + | |
| 772 | +[[package]] | |
| 773 | +name = "serde_path_to_error" | |
| 774 | +version = "0.1.20" | |
| 775 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 776 | +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" | |
| 777 | +dependencies = [ | |
| 778 | + "itoa", | |
| 779 | + "serde", | |
| 780 | + "serde_core", | |
| 781 | +] | |
| 782 | + | |
| 783 | +[[package]] | |
| 784 | +name = "serde_urlencoded" | |
| 785 | +version = "0.7.1" | |
| 786 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 787 | +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" | |
| 788 | +dependencies = [ | |
| 789 | + "form_urlencoded", | |
| 790 | + "itoa", | |
| 791 | + "ryu", | |
| 792 | + "serde", | |
| 793 | +] | |
| 794 | + | |
| 795 | +[[package]] | |
| 796 | +name = "sha1" | |
| 797 | +version = "0.10.7" | |
| 798 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 799 | +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" | |
| 800 | +dependencies = [ | |
| 801 | + "cfg-if", | |
| 802 | + "cpufeatures 0.2.17", | |
| 803 | + "digest 0.10.7", | |
| 804 | +] | |
| 805 | + | |
| 806 | +[[package]] | |
| 807 | +name = "sha2" | |
| 808 | +version = "0.11.0" | |
| 809 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 810 | +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" | |
| 811 | +dependencies = [ | |
| 812 | + "cfg-if", | |
| 813 | + "cpufeatures 0.3.1", | |
| 814 | + "digest 0.11.3", | |
| 815 | +] | |
| 816 | + | |
| 817 | +[[package]] | |
| 818 | +name = "sharded-slab" | |
| 819 | +version = "0.1.7" | |
| 820 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 821 | +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" | |
| 822 | +dependencies = [ | |
| 823 | + "lazy_static", | |
| 824 | +] | |
| 825 | + | |
| 826 | +[[package]] | |
| 827 | +name = "signal-hook-registry" | |
| 828 | +version = "1.4.8" | |
| 829 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 830 | +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" | |
| 831 | +dependencies = [ | |
| 832 | + "errno", | |
| 833 | + "libc", | |
| 834 | +] | |
| 835 | + | |
| 836 | +[[package]] | |
| 837 | +name = "slab" | |
| 838 | +version = "0.4.12" | |
| 839 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 840 | +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" | |
| 841 | + | |
| 842 | +[[package]] | |
| 843 | +name = "smallvec" | |
| 844 | +version = "1.16.1" | |
| 845 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 846 | +checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" | |
| 847 | + | |
| 848 | +[[package]] | |
| 849 | +name = "socket2" | |
| 850 | +version = "0.6.5" | |
| 851 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 852 | +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" | |
| 853 | +dependencies = [ | |
| 854 | + "libc", | |
| 855 | + "windows-sys 0.61.2", | |
| 856 | +] | |
| 857 | + | |
| 858 | +[[package]] | |
| 859 | +name = "syn" | |
| 860 | +version = "2.0.119" | |
| 861 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 862 | +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" | |
| 863 | +dependencies = [ | |
| 864 | + "proc-macro2", | |
| 865 | + "quote", | |
| 866 | + "unicode-ident", | |
| 867 | +] | |
| 868 | + | |
| 869 | +[[package]] | |
| 870 | +name = "syn" | |
| 871 | +version = "3.0.6" | |
| 872 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 873 | +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" | |
| 874 | +dependencies = [ | |
| 875 | + "proc-macro2", | |
| 876 | + "quote", | |
| 877 | + "unicode-ident", | |
| 878 | +] | |
| 879 | + | |
| 880 | +[[package]] | |
| 881 | +name = "sync_wrapper" | |
| 882 | +version = "1.0.2" | |
| 883 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 884 | +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" | |
| 885 | + | |
| 886 | +[[package]] | |
| 887 | +name = "thiserror" | |
| 888 | +version = "2.0.20" | |
| 889 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 890 | +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" | |
| 891 | +dependencies = [ | |
| 892 | + "thiserror-impl", | |
| 893 | +] | |
| 894 | + | |
| 895 | +[[package]] | |
| 896 | +name = "thiserror-impl" | |
| 897 | +version = "2.0.20" | |
| 898 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 899 | +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" | |
| 900 | +dependencies = [ | |
| 901 | + "proc-macro2", | |
| 902 | + "quote", | |
| 903 | + "syn 3.0.6", | |
| 904 | +] | |
| 905 | + | |
| 906 | +[[package]] | |
| 907 | +name = "thread_local" | |
| 908 | +version = "1.1.10" | |
| 909 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 910 | +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" | |
| 911 | +dependencies = [ | |
| 912 | + "cfg-if", | |
| 913 | +] | |
| 914 | + | |
| 915 | +[[package]] | |
| 916 | +name = "tokio" | |
| 917 | +version = "1.53.1" | |
| 918 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 919 | +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" | |
| 920 | +dependencies = [ | |
| 921 | + "bytes", | |
| 922 | + "libc", | |
| 923 | + "mio", | |
| 924 | + "parking_lot", | |
| 925 | + "pin-project-lite", | |
| 926 | + "signal-hook-registry", | |
| 927 | + "socket2", | |
| 928 | + "tokio-macros", | |
| 929 | + "windows-sys 0.61.2", | |
| 930 | +] | |
| 931 | + | |
| 932 | +[[package]] | |
| 933 | +name = "tokio-macros" | |
| 934 | +version = "2.7.2" | |
| 935 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 936 | +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" | |
| 937 | +dependencies = [ | |
| 938 | + "proc-macro2", | |
| 939 | + "quote", | |
| 940 | + "syn 3.0.6", | |
| 941 | +] | |
| 942 | + | |
| 943 | +[[package]] | |
| 944 | +name = "tokio-tungstenite" | |
| 945 | +version = "0.29.0" | |
| 946 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 947 | +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" | |
| 948 | +dependencies = [ | |
| 949 | + "futures-util", | |
| 950 | + "log", | |
| 951 | + "tokio", | |
| 952 | + "tungstenite", | |
| 953 | +] | |
| 954 | + | |
| 955 | +[[package]] | |
| 956 | +name = "tower" | |
| 957 | +version = "0.5.3" | |
| 958 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 959 | +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" | |
| 960 | +dependencies = [ | |
| 961 | + "futures-core", | |
| 962 | + "futures-util", | |
| 963 | + "pin-project-lite", | |
| 964 | + "sync_wrapper", | |
| 965 | + "tokio", | |
| 966 | + "tower-layer", | |
| 967 | + "tower-service", | |
| 968 | + "tracing", | |
| 969 | +] | |
| 970 | + | |
| 971 | +[[package]] | |
| 972 | +name = "tower-layer" | |
| 973 | +version = "0.3.3" | |
| 974 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 975 | +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" | |
| 976 | + | |
| 977 | +[[package]] | |
| 978 | +name = "tower-service" | |
| 979 | +version = "0.3.3" | |
| 980 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 981 | +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" | |
| 982 | + | |
| 983 | +[[package]] | |
| 984 | +name = "tracing" | |
| 985 | +version = "0.1.44" | |
| 986 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 987 | +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" | |
| 988 | +dependencies = [ | |
| 989 | + "log", | |
| 990 | + "pin-project-lite", | |
| 991 | + "tracing-attributes", | |
| 992 | + "tracing-core", | |
| 993 | +] | |
| 994 | + | |
| 995 | +[[package]] | |
| 996 | +name = "tracing-attributes" | |
| 997 | +version = "0.1.31" | |
| 998 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 999 | +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" | |
| 1000 | +dependencies = [ | |
| 1001 | + "proc-macro2", | |
| 1002 | + "quote", | |
| 1003 | + "syn 2.0.119", | |
| 1004 | +] | |
| 1005 | + | |
| 1006 | +[[package]] | |
| 1007 | +name = "tracing-core" | |
| 1008 | +version = "0.1.36" | |
| 1009 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1010 | +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" | |
| 1011 | +dependencies = [ | |
| 1012 | + "once_cell", | |
| 1013 | + "valuable", | |
| 1014 | +] | |
| 1015 | + | |
| 1016 | +[[package]] | |
| 1017 | +name = "tracing-log" | |
| 1018 | +version = "0.2.0" | |
| 1019 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1020 | +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" | |
| 1021 | +dependencies = [ | |
| 1022 | + "log", | |
| 1023 | + "once_cell", | |
| 1024 | + "tracing-core", | |
| 1025 | +] | |
| 1026 | + | |
| 1027 | +[[package]] | |
| 1028 | +name = "tracing-subscriber" | |
| 1029 | +version = "0.3.23" | |
| 1030 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1031 | +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" | |
| 1032 | +dependencies = [ | |
| 1033 | + "matchers", | |
| 1034 | + "nu-ansi-term", | |
| 1035 | + "once_cell", | |
| 1036 | + "regex-automata", | |
| 1037 | + "sharded-slab", | |
| 1038 | + "smallvec", | |
| 1039 | + "thread_local", | |
| 1040 | + "tracing", | |
| 1041 | + "tracing-core", | |
| 1042 | + "tracing-log", | |
| 1043 | +] | |
| 1044 | + | |
| 1045 | +[[package]] | |
| 1046 | +name = "tungstenite" | |
| 1047 | +version = "0.29.0" | |
| 1048 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1049 | +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" | |
| 1050 | +dependencies = [ | |
| 1051 | + "bytes", | |
| 1052 | + "data-encoding", | |
| 1053 | + "http", | |
| 1054 | + "httparse", | |
| 1055 | + "log", | |
| 1056 | + "rand", | |
| 1057 | + "sha1", | |
| 1058 | + "thiserror", | |
| 1059 | +] | |
| 1060 | + | |
| 1061 | +[[package]] | |
| 1062 | +name = "typenum" | |
| 1063 | +version = "1.20.1" | |
| 1064 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1065 | +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" | |
| 1066 | + | |
| 1067 | +[[package]] | |
| 1068 | +name = "unicase" | |
| 1069 | +version = "2.9.0" | |
| 1070 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1071 | +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" | |
| 1072 | + | |
| 1073 | +[[package]] | |
| 1074 | +name = "unicode-ident" | |
| 1075 | +version = "1.0.26" | |
| 1076 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1077 | +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" | |
| 1078 | + | |
| 1079 | +[[package]] | |
| 1080 | +name = "valuable" | |
| 1081 | +version = "0.1.1" | |
| 1082 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1083 | +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" | |
| 1084 | + | |
| 1085 | +[[package]] | |
| 1086 | +name = "version_check" | |
| 1087 | +version = "0.9.5" | |
| 1088 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1089 | +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" | |
| 1090 | + | |
| 1091 | +[[package]] | |
| 1092 | +name = "walkdir" | |
| 1093 | +version = "2.5.0" | |
| 1094 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1095 | +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" | |
| 1096 | +dependencies = [ | |
| 1097 | + "same-file", | |
| 1098 | + "winapi-util", | |
| 1099 | +] | |
| 1100 | + | |
| 1101 | +[[package]] | |
| 1102 | +name = "wasi" | |
| 1103 | +version = "0.11.1+wasi-snapshot-preview1" | |
| 1104 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1105 | +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" | |
| 1106 | + | |
| 1107 | +[[package]] | |
| 1108 | +name = "wasip2" | |
| 1109 | +version = "1.0.4+wasi-0.2.12" | |
| 1110 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1111 | +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" | |
| 1112 | +dependencies = [ | |
| 1113 | + "wit-bindgen", | |
| 1114 | +] | |
| 1115 | + | |
| 1116 | +[[package]] | |
| 1117 | +name = "winapi-util" | |
| 1118 | +version = "0.1.11" | |
| 1119 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1120 | +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" | |
| 1121 | +dependencies = [ | |
| 1122 | + "windows-sys 0.61.2", | |
| 1123 | +] | |
| 1124 | + | |
| 1125 | +[[package]] | |
| 1126 | +name = "windows-link" | |
| 1127 | +version = "0.2.1" | |
| 1128 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1129 | +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" | |
| 1130 | + | |
| 1131 | +[[package]] | |
| 1132 | +name = "windows-sys" | |
| 1133 | +version = "0.60.2" | |
| 1134 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1135 | +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" | |
| 1136 | +dependencies = [ | |
| 1137 | + "windows-targets", | |
| 1138 | +] | |
| 1139 | + | |
| 1140 | +[[package]] | |
| 1141 | +name = "windows-sys" | |
| 1142 | +version = "0.61.2" | |
| 1143 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1144 | +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" | |
| 1145 | +dependencies = [ | |
| 1146 | + "windows-link", | |
| 1147 | +] | |
| 1148 | + | |
| 1149 | +[[package]] | |
| 1150 | +name = "windows-targets" | |
| 1151 | +version = "0.53.5" | |
| 1152 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1153 | +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" | |
| 1154 | +dependencies = [ | |
| 1155 | + "windows-link", | |
| 1156 | + "windows_aarch64_gnullvm", | |
| 1157 | + "windows_aarch64_msvc", | |
| 1158 | + "windows_i686_gnu", | |
| 1159 | + "windows_i686_gnullvm", | |
| 1160 | + "windows_i686_msvc", | |
| 1161 | + "windows_x86_64_gnu", | |
| 1162 | + "windows_x86_64_gnullvm", | |
| 1163 | + "windows_x86_64_msvc", | |
| 1164 | +] | |
| 1165 | + | |
| 1166 | +[[package]] | |
| 1167 | +name = "windows_aarch64_gnullvm" | |
| 1168 | +version = "0.53.1" | |
| 1169 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1170 | +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" | |
| 1171 | + | |
| 1172 | +[[package]] | |
| 1173 | +name = "windows_aarch64_msvc" | |
| 1174 | +version = "0.53.1" | |
| 1175 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1176 | +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" | |
| 1177 | + | |
| 1178 | +[[package]] | |
| 1179 | +name = "windows_i686_gnu" | |
| 1180 | +version = "0.53.1" | |
| 1181 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1182 | +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" | |
| 1183 | + | |
| 1184 | +[[package]] | |
| 1185 | +name = "windows_i686_gnullvm" | |
| 1186 | +version = "0.53.1" | |
| 1187 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1188 | +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" | |
| 1189 | + | |
| 1190 | +[[package]] | |
| 1191 | +name = "windows_i686_msvc" | |
| 1192 | +version = "0.53.1" | |
| 1193 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1194 | +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" | |
| 1195 | + | |
| 1196 | +[[package]] | |
| 1197 | +name = "windows_x86_64_gnu" | |
| 1198 | +version = "0.53.1" | |
| 1199 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1200 | +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" | |
| 1201 | + | |
| 1202 | +[[package]] | |
| 1203 | +name = "windows_x86_64_gnullvm" | |
| 1204 | +version = "0.53.1" | |
| 1205 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1206 | +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" | |
| 1207 | + | |
| 1208 | +[[package]] | |
| 1209 | +name = "windows_x86_64_msvc" | |
| 1210 | +version = "0.53.1" | |
| 1211 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1212 | +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" | |
| 1213 | + | |
| 1214 | +[[package]] | |
| 1215 | +name = "wit-bindgen" | |
| 1216 | +version = "0.57.1" | |
| 1217 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1218 | +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" | |
| 1219 | + | |
| 1220 | +[[package]] | |
| 1221 | +name = "zerocopy" | |
| 1222 | +version = "0.8.57" | |
| 1223 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1224 | +checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" | |
| 1225 | +dependencies = [ | |
| 1226 | + "zerocopy-derive", | |
| 1227 | +] | |
| 1228 | + | |
| 1229 | +[[package]] | |
| 1230 | +name = "zerocopy-derive" | |
| 1231 | +version = "0.8.57" | |
| 1232 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1233 | +checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" | |
| 1234 | +dependencies = [ | |
| 1235 | + "proc-macro2", | |
| 1236 | + "quote", | |
| 1237 | + "syn 2.0.119", | |
| 1238 | +] | |
| 1239 | + | |
| 1240 | +[[package]] | |
| 1241 | +name = "zmij" | |
| 1242 | +version = "1.0.23" | |
| 1243 | +source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 1244 | +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" |
+21-0backend/Cargo.toml
| @@ -0,0 +1,21 @@ | ||
| 1 | +[package] | |
| 2 | +name = "astrum" | |
| 3 | +version = "0.1.0" | |
| 4 | +edition = "2024" | |
| 5 | + | |
| 6 | +[features] | |
| 7 | +default = ["hot-reload"] | |
| 8 | +# src/dev.rs: the bun rebuild, the file watcher and /dev-ws. Build a | |
| 9 | +# production binary with --no-default-features to leave all of it out. | |
| 10 | +hot-reload = ["dep:notify"] | |
| 11 | + | |
| 12 | +[dependencies] | |
| 13 | +anyhow = "1" | |
| 14 | +axum = { version = "0.8", features = ["ws"] } | |
| 15 | +mime_guess = "2" | |
| 16 | +notify = { version = "8", optional = true } | |
| 17 | +rust-embed = "8" | |
| 18 | +serde_json = "1" | |
| 19 | +tokio = { version = "1", features = ["full"] } | |
| 20 | +tracing = "0.1" | |
| 21 | +tracing-subscriber = { version = "0.3", features = ["env-filter"] } |
+7-0backend/build.rs
| @@ -0,0 +1,7 @@ | ||
| 1 | +// rust-embed reads ../frontend/dist while the Embed derive expands, and | |
| 2 | +// cargo has no idea those files exist. Without this, a release build happily | |
| 3 | +// embeds a stale frontend (including the dev reload script) because nothing | |
| 4 | +// in src/ changed. | |
| 5 | +fn main() { | |
| 6 | + println!("cargo:rerun-if-changed=../frontend/dist"); | |
| 7 | +} |
+122-0backend/src/dev.rs
| @@ -0,0 +1,122 @@ | ||
| 1 | +//! Hot reload, debug builds only. | |
| 2 | +//! | |
| 3 | +//! One `bun run build` at startup, another whenever a source file under | |
| 4 | +//! `frontend/` changes, and a `reload` frame to every browser holding the | |
| 5 | +//! `/dev-ws` socket afterwards. The page only opens that socket when it was | |
| 6 | +//! built with `PUBLIC_HOT_RELOAD=true`, which this module sets, so a | |
| 7 | +//! production build never carries the client script. | |
| 8 | + | |
| 9 | +use std::{path::PathBuf, process::Command, sync::mpsc, time::Duration}; | |
| 10 | + | |
| 11 | +use axum::{ | |
| 12 | + extract::{ | |
| 13 | + State, WebSocketUpgrade, | |
| 14 | + ws::{Message, WebSocket}, | |
| 15 | + }, | |
| 16 | + response::IntoResponse, | |
| 17 | +}; | |
| 18 | +use notify::{RecursiveMode, Watcher, recommended_watcher}; | |
| 19 | +use tokio::sync::broadcast::{self, Sender}; | |
| 20 | + | |
| 21 | +use crate::AppState; | |
| 22 | + | |
| 23 | +fn frontend_dir() -> PathBuf { | |
| 24 | + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../frontend") | |
| 25 | +} | |
| 26 | + | |
| 27 | +fn build_frontend(reload_tx: &Sender<()>) -> anyhow::Result<()> { | |
| 28 | + tracing::info!("building frontend"); | |
| 29 | + let status = Command::new("bun") | |
| 30 | + .args(["run", "build"]) | |
| 31 | + .env("PUBLIC_HOT_RELOAD", "true") | |
| 32 | + .current_dir(frontend_dir()) | |
| 33 | + .status()?; | |
| 34 | + | |
| 35 | + if status.success() { | |
| 36 | + let browsers = reload_tx.send(()).unwrap_or_default(); | |
| 37 | + tracing::info!(browsers, "frontend built; reloading browsers"); | |
| 38 | + } else { | |
| 39 | + // Leave the last good build in place and wait for the next edit. | |
| 40 | + tracing::error!("frontend build failed"); | |
| 41 | + } | |
| 42 | + Ok(()) | |
| 43 | +} | |
| 44 | + | |
| 45 | +pub fn watch_frontend(reload_tx: Sender<()>) -> anyhow::Result<()> { | |
| 46 | + build_frontend(&reload_tx)?; | |
| 47 | + | |
| 48 | + let debounce = Duration::from_millis( | |
| 49 | + std::env::var("DEBOUNCE_MILLIS") | |
| 50 | + .ok() | |
| 51 | + .and_then(|v| v.parse().ok()) | |
| 52 | + .unwrap_or(500), | |
| 53 | + ); | |
| 54 | + | |
| 55 | + std::thread::spawn(move || { | |
| 56 | + let (event_tx, event_rx) = mpsc::channel(); | |
| 57 | + let mut watcher = | |
| 58 | + recommended_watcher(move |event| { let _ = event_tx.send(event); }) | |
| 59 | + .expect("failed to create frontend watcher"); | |
| 60 | + watcher | |
| 61 | + .watch(&frontend_dir(), RecursiveMode::Recursive) | |
| 62 | + .expect("failed to watch frontend directory"); | |
| 63 | + | |
| 64 | + while let Ok(event) = event_rx.recv() { | |
| 65 | + let Ok(event) = event else { continue }; | |
| 66 | + if !is_source_change(&event) { | |
| 67 | + continue; | |
| 68 | + } | |
| 69 | + | |
| 70 | + // Wait for the editor to finish its burst of writes. Trailing | |
| 71 | + // edge, so the last event can never be dropped. | |
| 72 | + while event_rx.recv_timeout(debounce).is_ok() {} | |
| 73 | + | |
| 74 | + if let Err(error) = build_frontend(&reload_tx) { | |
| 75 | + tracing::error!(%error, "could not build frontend"); | |
| 76 | + } | |
| 77 | + } | |
| 78 | + }); | |
| 79 | + | |
| 80 | + Ok(()) | |
| 81 | +} | |
| 82 | + | |
| 83 | +/// Ignores the build's own output, so a rebuild cannot trigger another one. | |
| 84 | +fn is_source_change(event: ¬ify::Event) -> bool { | |
| 85 | + use notify::EventKind; | |
| 86 | + matches!( | |
| 87 | + event.kind, | |
| 88 | + EventKind::Create(_) | EventKind::Modify(_) | EventKind::Remove(_) | |
| 89 | + ) && event.paths.iter().any(|path| { | |
| 90 | + !path.components().any(|part| { | |
| 91 | + matches!( | |
| 92 | + part.as_os_str().to_str(), | |
| 93 | + Some("dist" | "node_modules" | ".astro" | ".git") | |
| 94 | + ) | |
| 95 | + }) | |
| 96 | + }) | |
| 97 | +} | |
| 98 | + | |
| 99 | +pub async fn ws_handler(ws: WebSocketUpgrade, State(state): State<AppState>) -> impl IntoResponse { | |
| 100 | + let reload_rx = state.reload_tx.subscribe(); | |
| 101 | + ws.on_upgrade(move |socket| handle_socket(socket, reload_rx)) | |
| 102 | +} | |
| 103 | + | |
| 104 | +async fn handle_socket(mut socket: WebSocket, mut reload_rx: broadcast::Receiver<()>) { | |
| 105 | + loop { | |
| 106 | + tokio::select! { | |
| 107 | + message = socket.recv() => match message { | |
| 108 | + Some(Ok(Message::Ping(payload))) => { | |
| 109 | + if socket.send(Message::Pong(payload)).await.is_err() { break; } | |
| 110 | + } | |
| 111 | + Some(Ok(Message::Close(_))) | Some(Err(_)) | None => break, | |
| 112 | + _ => {} | |
| 113 | + }, | |
| 114 | + reload = reload_rx.recv() => match reload { | |
| 115 | + Ok(()) | Err(broadcast::error::RecvError::Lagged(_)) => { | |
| 116 | + if socket.send(Message::Text("reload".into())).await.is_err() { break; } | |
| 117 | + } | |
| 118 | + Err(broadcast::error::RecvError::Closed) => break, | |
| 119 | + } | |
| 120 | + } | |
| 121 | + } | |
| 122 | +} |
+91-0backend/src/frontend.rs
| @@ -0,0 +1,91 @@ | ||
| 1 | +//! Serving the Astro build. | |
| 2 | +//! | |
| 3 | +//! Debug builds read `frontend/dist` from disk, so a rebuild shows up without | |
| 4 | +//! recompiling the server. Release builds embed the same directory through | |
| 5 | +//! `rust-embed`. Both resolve paths identically, so a URL that works locally | |
| 6 | +//! works in production. | |
| 7 | + | |
| 8 | +use axum::{ | |
| 9 | + http::{StatusCode, Uri, header}, | |
| 10 | + response::{IntoResponse, Response}, | |
| 11 | +}; | |
| 12 | +use rust_embed::Embed; | |
| 13 | + | |
| 14 | +#[derive(Embed)] | |
| 15 | +#[folder = "../frontend/dist"] | |
| 16 | +// Only read in release builds, but derived in both so a missing or empty | |
| 17 | +// frontend/dist fails at the first `cargo build`, not at release time. | |
| 18 | +#[cfg_attr(debug_assertions, allow(dead_code))] | |
| 19 | +struct Dist; | |
| 20 | + | |
| 21 | +pub async fn serve(uri: Uri) -> Response { | |
| 22 | + let path = uri.path().trim_matches('/'); | |
| 23 | + let path = if path.is_empty() { "index.html" } else { path }; | |
| 24 | + | |
| 25 | + match load(path).await { | |
| 26 | + Some((body, served)) => respond(StatusCode::OK, body, &served), | |
| 27 | + None => match load("404.html").await { | |
| 28 | + Some((body, served)) => respond(StatusCode::NOT_FOUND, body, &served), | |
| 29 | + None => (StatusCode::NOT_FOUND, "Not Found").into_response(), | |
| 30 | + }, | |
| 31 | + } | |
| 32 | +} | |
| 33 | + | |
| 34 | +/// Tries the path itself, then `.html`, then `/index.html`, so `/about`, | |
| 35 | +/// `/about/` and `/about.html` all reach `dist/about/index.html`. | |
| 36 | +async fn load(path: &str) -> Option<(Vec<u8>, String)> { | |
| 37 | + for candidate in [ | |
| 38 | + path.to_string(), | |
| 39 | + format!("{path}.html"), | |
| 40 | + format!("{path}/index.html"), | |
| 41 | + ] { | |
| 42 | + if let Some(body) = read(&candidate).await { | |
| 43 | + return Some((body, candidate)); | |
| 44 | + } | |
| 45 | + } | |
| 46 | + None | |
| 47 | +} | |
| 48 | + | |
| 49 | +#[cfg(debug_assertions)] | |
| 50 | +async fn read(path: &str) -> Option<Vec<u8>> { | |
| 51 | + use std::path::{Component, Path}; | |
| 52 | + | |
| 53 | + // Nothing may escape dist/ (`..`, absolute paths, Windows prefixes). | |
| 54 | + let relative = Path::new(path); | |
| 55 | + if relative | |
| 56 | + .components() | |
| 57 | + .any(|part| !matches!(part, Component::Normal(_))) | |
| 58 | + { | |
| 59 | + return None; | |
| 60 | + } | |
| 61 | + tokio::fs::read(dist_dir().join(relative)).await.ok() | |
| 62 | +} | |
| 63 | + | |
| 64 | +#[cfg(not(debug_assertions))] | |
| 65 | +async fn read(path: &str) -> Option<Vec<u8>> { | |
| 66 | + Dist::get(path).map(|file| file.data.into_owned()) | |
| 67 | +} | |
| 68 | + | |
| 69 | +#[cfg(debug_assertions)] | |
| 70 | +pub fn dist_dir() -> std::path::PathBuf { | |
| 71 | + std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../frontend/dist") | |
| 72 | +} | |
| 73 | + | |
| 74 | +fn respond(status: StatusCode, body: Vec<u8>, path: &str) -> Response { | |
| 75 | + let mime = mime_guess::from_path(path).first_or_octet_stream(); | |
| 76 | + // Never cache while developing; the browser reloads on every rebuild. | |
| 77 | + let cache = if cfg!(debug_assertions) { | |
| 78 | + "no-store" | |
| 79 | + } else { | |
| 80 | + "public, max-age=3600" | |
| 81 | + }; | |
| 82 | + ( | |
| 83 | + status, | |
| 84 | + [ | |
| 85 | + (header::CONTENT_TYPE, mime.as_ref()), | |
| 86 | + (header::CACHE_CONTROL, cache), | |
| 87 | + ], | |
| 88 | + body, | |
| 89 | + ) | |
| 90 | + .into_response() | |
| 91 | +} |
+75-0backend/src/main.rs
| @@ -0,0 +1,75 @@ | ||
| 1 | +//! axum + Astro, one binary. | |
| 2 | +//! | |
| 3 | +//! Debug builds rebuild the Astro site with bun whenever something under | |
| 4 | +//! `frontend/` changes, then tell open browsers to reload over `/dev-ws`. | |
| 5 | +//! Release builds embed `frontend/dist` into the executable, so deploying is | |
| 6 | +//! copying one file. | |
| 7 | + | |
| 8 | +#[cfg(feature = "hot-reload")] | |
| 9 | +mod dev; | |
| 10 | +mod frontend; | |
| 11 | + | |
| 12 | +use axum::{Json, Router, routing::get}; | |
| 13 | +use serde_json::json; | |
| 14 | +use tokio::{net::TcpListener, sync::broadcast}; | |
| 15 | +use tracing_subscriber::EnvFilter; | |
| 16 | + | |
| 17 | +#[derive(Clone)] | |
| 18 | +pub struct AppState { | |
| 19 | + /// Fan-out to the browsers connected to `/dev-ws`. Debug builds only; | |
| 20 | + /// nothing sends on it in a release build. | |
| 21 | + #[allow(dead_code)] | |
| 22 | + pub reload_tx: broadcast::Sender<()>, | |
| 23 | +} | |
| 24 | + | |
| 25 | +#[tokio::main] | |
| 26 | +async fn main() -> anyhow::Result<()> { | |
| 27 | + tracing_subscriber::fmt() | |
| 28 | + .with_env_filter(EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"))) | |
| 29 | + .init(); | |
| 30 | + | |
| 31 | + let (reload_tx, _) = broadcast::channel::<()>(16); | |
| 32 | + | |
| 33 | + // On by default while developing. FRONTEND_WATCH=false serves whatever is | |
| 34 | + // already in frontend/dist without bun or the watcher (tests, a second | |
| 35 | + // instance); =true turns it back on in a release build. | |
| 36 | + #[cfg(feature = "hot-reload")] | |
| 37 | + if env_flag("FRONTEND_WATCH", cfg!(debug_assertions)) { | |
| 38 | + dev::watch_frontend(reload_tx.clone())?; | |
| 39 | + } | |
| 40 | + | |
| 41 | + let app = Router::new().route("/api/health", get(health)); | |
| 42 | + | |
| 43 | + #[cfg(feature = "hot-reload")] | |
| 44 | + let app = app.route("/dev-ws", get(dev::ws_handler)); | |
| 45 | + | |
| 46 | + let app = app | |
| 47 | + .fallback(frontend::serve) | |
| 48 | + .with_state(AppState { reload_tx }); | |
| 49 | + | |
| 50 | + let address = format!("{}:{}", env_str("HOST", "127.0.0.1"), env_str("PORT", "8080")); | |
| 51 | + let listener = TcpListener::bind(&address).await?; | |
| 52 | + tracing::info!(address = %listener.local_addr()?, "listening"); | |
| 53 | + axum::serve(listener, app).await?; | |
| 54 | + Ok(()) | |
| 55 | +} | |
| 56 | + | |
| 57 | +async fn health() -> Json<serde_json::Value> { | |
| 58 | + Json(json!({ "status": "ok" })) | |
| 59 | +} | |
| 60 | + | |
| 61 | +fn env_str(name: &str, default: &str) -> String { | |
| 62 | + std::env::var(name) | |
| 63 | + .ok() | |
| 64 | + .map(|v| v.trim().to_string()) | |
| 65 | + .filter(|v| !v.is_empty()) | |
| 66 | + .unwrap_or_else(|| default.to_string()) | |
| 67 | +} | |
| 68 | + | |
| 69 | +#[cfg(feature = "hot-reload")] | |
| 70 | +fn env_flag(name: &str, default: bool) -> bool { | |
| 71 | + match std::env::var(name) { | |
| 72 | + Ok(v) => !matches!(v.trim().to_ascii_lowercase().as_str(), "0" | "false" | "no" | ""), | |
| 73 | + Err(_) => default, | |
| 74 | + } | |
| 75 | +} |
+13-0build.sh
| @@ -0,0 +1,13 @@ | ||
| 1 | +#!/bin/sh | |
| 2 | +# Production build. The frontend is rebuilt without PUBLIC_HOT_RELOAD first: | |
| 3 | +# dev.sh's builds set it, and whatever is in frontend/dist at compile time is | |
| 4 | +# what gets embedded, reload script and all. | |
| 5 | +set -e | |
| 6 | + | |
| 7 | +cd "$(dirname "$0")" | |
| 8 | + | |
| 9 | +(cd frontend && bun install --frozen-lockfile && bun run build) | |
| 10 | +cd backend | |
| 11 | +cargo build --release --no-default-features | |
| 12 | + | |
| 13 | +echo "built backend/target/release/astrum" |
+14-0dev.sh
| @@ -0,0 +1,14 @@ | ||
| 1 | +#!/bin/sh | |
| 2 | +# Development server. Installs frontend dependencies if needed (rust-embed | |
| 3 | +# needs frontend/dist to exist before the server will compile), then restarts | |
| 4 | +# the server on Rust changes. The server itself rebuilds the frontend and | |
| 5 | +# reloads open browsers. | |
| 6 | +set -e | |
| 7 | + | |
| 8 | +cd "$(dirname "$0")" | |
| 9 | + | |
| 10 | +[ -d frontend/node_modules ] || (cd frontend && bun install) | |
| 11 | +[ -d frontend/dist ] || (cd frontend && bun run build) | |
| 12 | + | |
| 13 | +cd backend | |
| 14 | +exec watchexec -r -e rs,toml -- cargo run |
+11-0frontend/astro.config.mjs
| @@ -0,0 +1,11 @@ | ||
| 1 | +// @ts-check | |
| 2 | +import { defineConfig } from "astro/config"; | |
| 3 | +import tailwindcss from "@tailwindcss/vite"; | |
| 4 | + | |
| 5 | +export default defineConfig({ | |
| 6 | + // `directory` emits about/index.html, which the Rust server resolves for | |
| 7 | + // /about, /about/ and /about.html alike. There is no `astro dev` here: the | |
| 8 | + // Rust server is the only server, and it rebuilds this on change. | |
| 9 | + build: { format: "directory" }, | |
| 10 | + vite: { plugins: [tailwindcss()] }, | |
| 11 | +}); |
+671-0frontend/bun.lock
| @@ -0,0 +1,671 @@ | ||
| 1 | +{ | |
| 2 | + "lockfileVersion": 2, | |
| 3 | + "configVersion": 1, | |
| 4 | + "workspaces": { | |
| 5 | + "": { | |
| 6 | + "name": "astrum-frontend", | |
| 7 | + "dependencies": { | |
| 8 | + "@tailwindcss/vite": "^4.1.18", | |
| 9 | + "astro": "^7.3.3", | |
| 10 | + "tailwindcss": "^4.1.18", | |
| 11 | + }, | |
| 12 | + }, | |
| 13 | + }, | |
| 14 | + "packages": { | |
| 15 | + "@astrojs/compiler-binding": ["@astrojs/compiler-binding@0.4.1", "", { "optionalDependencies": { "@astrojs/compiler-binding-android-arm64": "0.4.1", "@astrojs/compiler-binding-darwin-arm64": "0.4.1", "@astrojs/compiler-binding-darwin-x64": "0.4.1", "@astrojs/compiler-binding-linux-arm64-gnu": "0.4.1", "@astrojs/compiler-binding-linux-arm64-musl": "0.4.1", "@astrojs/compiler-binding-linux-x64-gnu": "0.4.1", "@astrojs/compiler-binding-linux-x64-musl": "0.4.1", "@astrojs/compiler-binding-wasm32-wasi": "0.4.1", "@astrojs/compiler-binding-win32-arm64-msvc": "0.4.1", "@astrojs/compiler-binding-win32-x64-msvc": "0.4.1" } }, "sha512-ZYVDW1P58OXyxqZbOMp+/2U9KA7y2esIx9r4pWdpZ/l6fCZhaw4ul+D7EgpRVxYLkyTWqzANbTTUFGPFP8zDHA=="], | |
| 16 | + | |
| 17 | + "@astrojs/compiler-binding-android-arm64": ["@astrojs/compiler-binding-android-arm64@0.4.1", "", { "os": "android", "cpu": "arm64" }, "sha512-Wtx2DZORuNTLASLLZ8hlrjFaJe1LUloatcCn9EPq7knBhRpjMGXeJANIJMeBZG4igvz7x+3nyAJM2iwCSW9xog=="], | |
| 18 | + | |
| 19 | + "@astrojs/compiler-binding-darwin-arm64": ["@astrojs/compiler-binding-darwin-arm64@0.4.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7iwXcU+hB60Y1SvOfnWHNioT72gDsDQKaDipXh2Onwp/TvQMozhbvhy13wJR8Af940a0h6PbddCeJFpj791UDA=="], | |
| 20 | + | |
| 21 | + "@astrojs/compiler-binding-darwin-x64": ["@astrojs/compiler-binding-darwin-x64@0.4.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pifjICos49RXhSVKSDu5gDB0/8j0O7DmxSp1DaWW2PyLG5ekwSkcrfOZto5JqhdI7QYMZB3XOiXpsdOXpS4npA=="], | |
| 22 | + | |
| 23 | + "@astrojs/compiler-binding-linux-arm64-gnu": ["@astrojs/compiler-binding-linux-arm64-gnu@0.4.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-hsZMlNWc6LqWHh9LlSwTq1/XCY7pxA5rkkKIdZRV8mgbOz9OwLvjEoe5Jry13eIZjMUQO8XnQyzk8o/Pjw2YFA=="], | |
| 24 | + | |
| 25 | + "@astrojs/compiler-binding-linux-arm64-musl": ["@astrojs/compiler-binding-linux-arm64-musl@0.4.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-a3EW27f+Z9uf57vYmpLgUriA1y9wDhKz57PT8D8XlFZt2HZEWhUxKuxI1jvKVI9p8okYee11WXEm/FHY1G9yoQ=="], | |
| 26 | + | |
| 27 | + "@astrojs/compiler-binding-linux-x64-gnu": ["@astrojs/compiler-binding-linux-x64-gnu@0.4.1", "", { "os": "linux", "cpu": "x64" }, "sha512-XruPTKB/SS4DFzeAjQ1ZyM0ieHDjapHkOSnnzRApZ4FXY2YAI7UY3mETjfJiIS/acyZyrnPH5jObv1gATTdUJQ=="], | |
| 28 | + | |
| 29 | + "@astrojs/compiler-binding-linux-x64-musl": ["@astrojs/compiler-binding-linux-x64-musl@0.4.1", "", { "os": "linux", "cpu": "x64" }, "sha512-E8j7lGanqNpudtkUbsFaOLJhmwFe4Ecqux7K9hkj4wULIPNZRM2bYZNcMSj8r1oWvaUiwZl8LaaNwv3+14jqhw=="], | |
| 30 | + | |
| 31 | + "@astrojs/compiler-binding-wasm32-wasi": ["@astrojs/compiler-binding-wasm32-wasi@0.4.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.2.4" }, "cpu": "none" }, "sha512-vNLxIv41ZE+nmPFtw24cRW5ZXG+ZPcAGtgigtjCP8lvcxKI7u2GrXoMsCgEH5fMw8WCEJpwLvsVBg15rJKAkyA=="], | |
| 32 | + | |
| 33 | + "@astrojs/compiler-binding-win32-arm64-msvc": ["@astrojs/compiler-binding-win32-arm64-msvc@0.4.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-/xTDgRsFDoTh0/+KFXJ74DY4Jqn8CoSHwa8UP5RAblHfnRHkenwfSl4zYDET61O9vXKLk09UzHjjq09yP20/AQ=="], | |
| 34 | + | |
| 35 | + "@astrojs/compiler-binding-win32-x64-msvc": ["@astrojs/compiler-binding-win32-x64-msvc@0.4.1", "", { "os": "win32", "cpu": "x64" }, "sha512-0x5J6iHZO0Fjo/CVzoIbXKzWnGESftDbEUQ/oXQ61HhUAFoR7+T1jfToZSNAS+gYyBXHSTpMWYC7lzarbhClcg=="], | |
| 36 | + | |
| 37 | + "@astrojs/compiler-rs": ["@astrojs/compiler-rs@0.4.1", "", { "dependencies": { "@astrojs/compiler-binding": "0.4.1" } }, "sha512-//NmAuRhy7eU9iP0ceI5Pymy55M+nUZ//kS6XeOyhBWdDib2KbJOyFaVJ52k7sDkJwTKVox7oPu3SpYiVnGm5A=="], | |
| 38 | + | |
| 39 | + "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.11.0", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.3.0", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA=="], | |
| 40 | + | |
| 41 | + "@astrojs/markdown-satteri": ["@astrojs/markdown-satteri@0.4.1", "", { "dependencies": { "@astrojs/internal-helpers": "0.11.0", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "satteri": "^0.10.3" } }, "sha512-EniHbFNa6SQHDih7JnpPos3NWXO6hdt4raBcOosfGmlfc3gP9CI/sESA3VOf1PgJZ7SFfewlZW9Livn0JugEZg=="], | |
| 42 | + | |
| 43 | + "@astrojs/prism": ["@astrojs/prism@4.0.2", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA=="], | |
| 44 | + | |
| 45 | + "@astrojs/telemetry": ["@astrojs/telemetry@3.3.3", "", { "dependencies": { "ci-info": "^4.4.0", "dset": "^3.1.4", "is-docker": "^4.0.0", "package-manager-detector": "^1.6.0" } }, "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ=="], | |
| 46 | + | |
| 47 | + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], | |
| 48 | + | |
| 49 | + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], | |
| 50 | + | |
| 51 | + "@babel/parser": ["@babel/parser@7.29.9", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA=="], | |
| 52 | + | |
| 53 | + "@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], | |
| 54 | + | |
| 55 | + "@bruits/satteri-darwin-arm64": ["@bruits/satteri-darwin-arm64@0.10.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA=="], | |
| 56 | + | |
| 57 | + "@bruits/satteri-darwin-x64": ["@bruits/satteri-darwin-x64@0.10.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q=="], | |
| 58 | + | |
| 59 | + "@bruits/satteri-linux-arm64-gnu": ["@bruits/satteri-linux-arm64-gnu@0.10.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w=="], | |
| 60 | + | |
| 61 | + "@bruits/satteri-linux-arm64-musl": ["@bruits/satteri-linux-arm64-musl@0.10.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA=="], | |
| 62 | + | |
| 63 | + "@bruits/satteri-linux-x64-gnu": ["@bruits/satteri-linux-x64-gnu@0.10.5", "", { "os": "linux", "cpu": "x64" }, "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw=="], | |
| 64 | + | |
| 65 | + "@bruits/satteri-linux-x64-musl": ["@bruits/satteri-linux-x64-musl@0.10.5", "", { "os": "linux", "cpu": "x64" }, "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg=="], | |
| 66 | + | |
| 67 | + "@bruits/satteri-wasm32-wasi": ["@bruits/satteri-wasm32-wasi@0.10.5", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.2.3" }, "cpu": "none" }, "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw=="], | |
| 68 | + | |
| 69 | + "@bruits/satteri-win32-arm64-msvc": ["@bruits/satteri-win32-arm64-msvc@0.10.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw=="], | |
| 70 | + | |
| 71 | + "@bruits/satteri-win32-x64-msvc": ["@bruits/satteri-win32-x64-msvc@0.10.5", "", { "os": "win32", "cpu": "x64" }, "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ=="], | |
| 72 | + | |
| 73 | + "@capsizecss/unpack": ["@capsizecss/unpack@4.0.1", "", { "dependencies": { "fontkitten": "^1.0.3" } }, "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ=="], | |
| 74 | + | |
| 75 | + "@clack/core": ["@clack/core@1.5.1", "", { "dependencies": { "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ=="], | |
| 76 | + | |
| 77 | + "@clack/prompts": ["@clack/prompts@1.8.1", "", { "dependencies": { "@clack/core": "1.5.1", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ=="], | |
| 78 | + | |
| 79 | + "@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], | |
| 80 | + | |
| 81 | + "@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], | |
| 82 | + | |
| 83 | + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], | |
| 84 | + | |
| 85 | + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ=="], | |
| 86 | + | |
| 87 | + "@esbuild/android-arm": ["@esbuild/android-arm@0.28.2", "", { "os": "android", "cpu": "arm" }, "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg=="], | |
| 88 | + | |
| 89 | + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A=="], | |
| 90 | + | |
| 91 | + "@esbuild/android-x64": ["@esbuild/android-x64@0.28.2", "", { "os": "android", "cpu": "x64" }, "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q=="], | |
| 92 | + | |
| 93 | + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw=="], | |
| 94 | + | |
| 95 | + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw=="], | |
| 96 | + | |
| 97 | + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw=="], | |
| 98 | + | |
| 99 | + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg=="], | |
| 100 | + | |
| 101 | + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.2", "", { "os": "linux", "cpu": "arm" }, "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w=="], | |
| 102 | + | |
| 103 | + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug=="], | |
| 104 | + | |
| 105 | + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ=="], | |
| 106 | + | |
| 107 | + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ=="], | |
| 108 | + | |
| 109 | + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA=="], | |
| 110 | + | |
| 111 | + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ=="], | |
| 112 | + | |
| 113 | + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA=="], | |
| 114 | + | |
| 115 | + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg=="], | |
| 116 | + | |
| 117 | + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.2", "", { "os": "linux", "cpu": "x64" }, "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ=="], | |
| 118 | + | |
| 119 | + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw=="], | |
| 120 | + | |
| 121 | + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.2", "", { "os": "none", "cpu": "x64" }, "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw=="], | |
| 122 | + | |
| 123 | + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ=="], | |
| 124 | + | |
| 125 | + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw=="], | |
| 126 | + | |
| 127 | + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q=="], | |
| 128 | + | |
| 129 | + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g=="], | |
| 130 | + | |
| 131 | + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ=="], | |
| 132 | + | |
| 133 | + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA=="], | |
| 134 | + | |
| 135 | + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g=="], | |
| 136 | + | |
| 137 | + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], | |
| 138 | + | |
| 139 | + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.3" }, "os": "darwin", "cpu": "arm64" }, "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA=="], | |
| 140 | + | |
| 141 | + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.3.3" }, "os": "darwin", "cpu": "x64" }, "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw=="], | |
| 142 | + | |
| 143 | + "@img/sharp-freebsd-wasm32": ["@img/sharp-freebsd-wasm32@0.35.4", "", { "dependencies": { "@img/sharp-wasm32": "0.35.4" }, "os": "freebsd" }, "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA=="], | |
| 144 | + | |
| 145 | + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg=="], | |
| 146 | + | |
| 147 | + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw=="], | |
| 148 | + | |
| 149 | + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA=="], | |
| 150 | + | |
| 151 | + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A=="], | |
| 152 | + | |
| 153 | + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.3.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w=="], | |
| 154 | + | |
| 155 | + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.3.3", "", { "os": "linux", "cpu": "none" }, "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ=="], | |
| 156 | + | |
| 157 | + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.3.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q=="], | |
| 158 | + | |
| 159 | + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA=="], | |
| 160 | + | |
| 161 | + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw=="], | |
| 162 | + | |
| 163 | + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw=="], | |
| 164 | + | |
| 165 | + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.3.3" }, "os": "linux", "cpu": "arm" }, "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A=="], | |
| 166 | + | |
| 167 | + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.3.3" }, "os": "linux", "cpu": "arm64" }, "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ=="], | |
| 168 | + | |
| 169 | + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.3.3" }, "os": "linux", "cpu": "ppc64" }, "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ=="], | |
| 170 | + | |
| 171 | + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.3.3" }, "os": "linux", "cpu": "none" }, "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA=="], | |
| 172 | + | |
| 173 | + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.3.3" }, "os": "linux", "cpu": "s390x" }, "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ=="], | |
| 174 | + | |
| 175 | + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.3.3" }, "os": "linux", "cpu": "x64" }, "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA=="], | |
| 176 | + | |
| 177 | + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" }, "os": "linux", "cpu": "arm64" }, "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA=="], | |
| 178 | + | |
| 179 | + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.35.4", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.3.3" }, "os": "linux", "cpu": "x64" }, "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg=="], | |
| 180 | + | |
| 181 | + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.4", "", { "dependencies": { "@emnapi/runtime": "^1.11.3" } }, "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA=="], | |
| 182 | + | |
| 183 | + "@img/sharp-webcontainers-wasm32": ["@img/sharp-webcontainers-wasm32@0.35.4", "", { "dependencies": { "@img/sharp-wasm32": "0.35.4" }, "cpu": "none" }, "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA=="], | |
| 184 | + | |
| 185 | + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.35.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw=="], | |
| 186 | + | |
| 187 | + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.35.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw=="], | |
| 188 | + | |
| 189 | + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.35.4", "", { "os": "win32", "cpu": "x64" }, "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg=="], | |
| 190 | + | |
| 191 | + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], | |
| 192 | + | |
| 193 | + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], | |
| 194 | + | |
| 195 | + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], | |
| 196 | + | |
| 197 | + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], | |
| 198 | + | |
| 199 | + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], | |
| 200 | + | |
| 201 | + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g=="], | |
| 202 | + | |
| 203 | + "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], | |
| 204 | + | |
| 205 | + "@oxc-project/types": ["@oxc-project/types@0.150.0", "", {}, "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw=="], | |
| 206 | + | |
| 207 | + "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.9", "", { "os": "android", "cpu": "arm" }, "sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw=="], | |
| 208 | + | |
| 209 | + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.9", "", { "os": "android", "cpu": "arm64" }, "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg=="], | |
| 210 | + | |
| 211 | + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw=="], | |
| 212 | + | |
| 213 | + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw=="], | |
| 214 | + | |
| 215 | + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g=="], | |
| 216 | + | |
| 217 | + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.9", "", { "os": "linux", "cpu": "arm" }, "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw=="], | |
| 218 | + | |
| 219 | + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw=="], | |
| 220 | + | |
| 221 | + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA=="], | |
| 222 | + | |
| 223 | + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw=="], | |
| 224 | + | |
| 225 | + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ=="], | |
| 226 | + | |
| 227 | + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q=="], | |
| 228 | + | |
| 229 | + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ=="], | |
| 230 | + | |
| 231 | + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.9", "", { "os": "none", "cpu": "arm64" }, "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg=="], | |
| 232 | + | |
| 233 | + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww=="], | |
| 234 | + | |
| 235 | + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.9", "", { "os": "win32", "cpu": "x64" }, "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g=="], | |
| 236 | + | |
| 237 | + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], | |
| 238 | + | |
| 239 | + "@shikijs/core": ["@shikijs/core@4.4.3", "", { "dependencies": { "@shikijs/primitive": "4.4.3", "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg=="], | |
| 240 | + | |
| 241 | + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ=="], | |
| 242 | + | |
| 243 | + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w=="], | |
| 244 | + | |
| 245 | + "@shikijs/langs": ["@shikijs/langs@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3" } }, "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A=="], | |
| 246 | + | |
| 247 | + "@shikijs/primitive": ["@shikijs/primitive@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ=="], | |
| 248 | + | |
| 249 | + "@shikijs/themes": ["@shikijs/themes@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3" } }, "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw=="], | |
| 250 | + | |
| 251 | + "@shikijs/types": ["@shikijs/types@4.4.3", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g=="], | |
| 252 | + | |
| 253 | + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], | |
| 254 | + | |
| 255 | + "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="], | |
| 256 | + | |
| 257 | + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="], | |
| 258 | + | |
| 259 | + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="], | |
| 260 | + | |
| 261 | + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="], | |
| 262 | + | |
| 263 | + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="], | |
| 264 | + | |
| 265 | + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="], | |
| 266 | + | |
| 267 | + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="], | |
| 268 | + | |
| 269 | + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="], | |
| 270 | + | |
| 271 | + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="], | |
| 272 | + | |
| 273 | + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="], | |
| 274 | + | |
| 275 | + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="], | |
| 276 | + | |
| 277 | + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="], | |
| 278 | + | |
| 279 | + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="], | |
| 280 | + | |
| 281 | + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], | |
| 282 | + | |
| 283 | + "@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="], | |
| 284 | + | |
| 285 | + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.4", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A=="], | |
| 286 | + | |
| 287 | + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], | |
| 288 | + | |
| 289 | + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], | |
| 290 | + | |
| 291 | + "@types/hast": ["@types/hast@3.0.5", "", { "dependencies": { "@types/unist": "*" } }, "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g=="], | |
| 292 | + | |
| 293 | + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], | |
| 294 | + | |
| 295 | + "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], | |
| 296 | + | |
| 297 | + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], | |
| 298 | + | |
| 299 | + "@ungap/structured-clone": ["@ungap/structured-clone@1.4.0", "", {}, "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ=="], | |
| 300 | + | |
| 301 | + "am-i-vibing": ["am-i-vibing@0.4.0", "", { "dependencies": { "process-ancestry": "^0.1.0" }, "bin": { "am-i-vibing": "dist/cli.mjs" } }, "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg=="], | |
| 302 | + | |
| 303 | + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], | |
| 304 | + | |
| 305 | + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], | |
| 306 | + | |
| 307 | + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], | |
| 308 | + | |
| 309 | + "astro": ["astro@7.3.3", "", { "dependencies": { "@astrojs/compiler-rs": "^0.4.0", "@astrojs/internal-helpers": "0.11.0", "@astrojs/markdown-satteri": "0.4.1", "@astrojs/telemetry": "3.3.3", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "am-i-vibing": "^0.4.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^2.0.1", "devalue": "^5.8.1", "diff": "^9.0.0", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", "esbuild": "^0.28.0", "find-proc": "0.2.0", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.3.0", "jsonc-parser": "^3.3.1", "magic-string": "^1.0.0", "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^1.0.1", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "svgo": "^4.0.2", "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "ultrahtml": "^1.6.0", "unifont": "~0.7.5", "unstorage": "^1.17.5", "verkit": "^0.4.0", "vite": "^8.0.13", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.5.4" }, "optionalDependencies": { "sharp": "^0.35.4" }, "peerDependencies": { "@astrojs/markdown-remark": "^7.3.0" }, "optionalPeers": ["@astrojs/markdown-remark"], "bin": { "astro": "./bin/astro.mjs" } }, "sha512-NF08hk3edFkVmr9avf9HW/rQyf6NrpbVDyYj2cVN3JfijDhfJYh1ivWVTY5PUd5+rRZn/Vtu4iaeyNlP0Iv6mg=="], | |
| 310 | + | |
| 311 | + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], | |
| 312 | + | |
| 313 | + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], | |
| 314 | + | |
| 315 | + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], | |
| 316 | + | |
| 317 | + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], | |
| 318 | + | |
| 319 | + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], | |
| 320 | + | |
| 321 | + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], | |
| 322 | + | |
| 323 | + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], | |
| 324 | + | |
| 325 | + "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], | |
| 326 | + | |
| 327 | + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], | |
| 328 | + | |
| 329 | + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], | |
| 330 | + | |
| 331 | + "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], | |
| 332 | + | |
| 333 | + "common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="], | |
| 334 | + | |
| 335 | + "cookie": ["cookie@2.0.1", "", {}, "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w=="], | |
| 336 | + | |
| 337 | + "cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], | |
| 338 | + | |
| 339 | + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], | |
| 340 | + | |
| 341 | + "css-select": ["css-select@6.0.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^7.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "nth-check": "^2.1.1" } }, "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw=="], | |
| 342 | + | |
| 343 | + "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], | |
| 344 | + | |
| 345 | + "css-what": ["css-what@7.0.0", "", {}, "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ=="], | |
| 346 | + | |
| 347 | + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], | |
| 348 | + | |
| 349 | + "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], | |
| 350 | + | |
| 351 | + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], | |
| 352 | + | |
| 353 | + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], | |
| 354 | + | |
| 355 | + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], | |
| 356 | + | |
| 357 | + "devalue": ["devalue@5.9.4", "", {}, "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg=="], | |
| 358 | + | |
| 359 | + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], | |
| 360 | + | |
| 361 | + "diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], | |
| 362 | + | |
| 363 | + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], | |
| 364 | + | |
| 365 | + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], | |
| 366 | + | |
| 367 | + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], | |
| 368 | + | |
| 369 | + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], | |
| 370 | + | |
| 371 | + "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], | |
| 372 | + | |
| 373 | + "enhanced-resolve": ["enhanced-resolve@5.25.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w=="], | |
| 374 | + | |
| 375 | + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], | |
| 376 | + | |
| 377 | + "es-module-lexer": ["es-module-lexer@2.3.2", "", {}, "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw=="], | |
| 378 | + | |
| 379 | + "esbuild": ["esbuild@0.28.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.2", "@esbuild/android-arm": "0.28.2", "@esbuild/android-arm64": "0.28.2", "@esbuild/android-x64": "0.28.2", "@esbuild/darwin-arm64": "0.28.2", "@esbuild/darwin-x64": "0.28.2", "@esbuild/freebsd-arm64": "0.28.2", "@esbuild/freebsd-x64": "0.28.2", "@esbuild/linux-arm": "0.28.2", "@esbuild/linux-arm64": "0.28.2", "@esbuild/linux-ia32": "0.28.2", "@esbuild/linux-loong64": "0.28.2", "@esbuild/linux-mips64el": "0.28.2", "@esbuild/linux-ppc64": "0.28.2", "@esbuild/linux-riscv64": "0.28.2", "@esbuild/linux-s390x": "0.28.2", "@esbuild/linux-x64": "0.28.2", "@esbuild/netbsd-arm64": "0.28.2", "@esbuild/netbsd-x64": "0.28.2", "@esbuild/openbsd-arm64": "0.28.2", "@esbuild/openbsd-x64": "0.28.2", "@esbuild/openharmony-arm64": "0.28.2", "@esbuild/sunos-x64": "0.28.2", "@esbuild/win32-arm64": "0.28.2", "@esbuild/win32-ia32": "0.28.2", "@esbuild/win32-x64": "0.28.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA=="], | |
| 380 | + | |
| 381 | + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], | |
| 382 | + | |
| 383 | + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], | |
| 384 | + | |
| 385 | + "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], | |
| 386 | + | |
| 387 | + "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], | |
| 388 | + | |
| 389 | + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], | |
| 390 | + | |
| 391 | + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], | |
| 392 | + | |
| 393 | + "find-proc": ["find-proc@0.2.0", "", {}, "sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w=="], | |
| 394 | + | |
| 395 | + "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], | |
| 396 | + | |
| 397 | + "fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], | |
| 398 | + | |
| 399 | + "fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="], | |
| 400 | + | |
| 401 | + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], | |
| 402 | + | |
| 403 | + "get-tsconfig": ["get-tsconfig@5.0.0-beta.4", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ=="], | |
| 404 | + | |
| 405 | + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], | |
| 406 | + | |
| 407 | + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], | |
| 408 | + | |
| 409 | + "h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], | |
| 410 | + | |
| 411 | + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], | |
| 412 | + | |
| 413 | + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], | |
| 414 | + | |
| 415 | + "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], | |
| 416 | + | |
| 417 | + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], | |
| 418 | + | |
| 419 | + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], | |
| 420 | + | |
| 421 | + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], | |
| 422 | + | |
| 423 | + "is-docker": ["is-docker@4.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA=="], | |
| 424 | + | |
| 425 | + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], | |
| 426 | + | |
| 427 | + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], | |
| 428 | + | |
| 429 | + "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], | |
| 430 | + | |
| 431 | + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], | |
| 432 | + | |
| 433 | + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], | |
| 434 | + | |
| 435 | + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], | |
| 436 | + | |
| 437 | + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], | |
| 438 | + | |
| 439 | + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], | |
| 440 | + | |
| 441 | + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], | |
| 442 | + | |
| 443 | + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], | |
| 444 | + | |
| 445 | + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], | |
| 446 | + | |
| 447 | + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], | |
| 448 | + | |
| 449 | + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], | |
| 450 | + | |
| 451 | + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], | |
| 452 | + | |
| 453 | + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], | |
| 454 | + | |
| 455 | + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], | |
| 456 | + | |
| 457 | + "lru-cache": ["lru-cache@11.5.3", "", {}, "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg=="], | |
| 458 | + | |
| 459 | + "magic-string": ["magic-string@1.4.1", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0" } }, "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow=="], | |
| 460 | + | |
| 461 | + "magicast": ["magicast@0.5.5", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA=="], | |
| 462 | + | |
| 463 | + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], | |
| 464 | + | |
| 465 | + "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], | |
| 466 | + | |
| 467 | + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], | |
| 468 | + | |
| 469 | + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], | |
| 470 | + | |
| 471 | + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], | |
| 472 | + | |
| 473 | + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], | |
| 474 | + | |
| 475 | + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], | |
| 476 | + | |
| 477 | + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], | |
| 478 | + | |
| 479 | + "nanoid": ["nanoid@3.3.19", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug=="], | |
| 480 | + | |
| 481 | + "neotraverse": ["neotraverse@1.0.1", "", {}, "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w=="], | |
| 482 | + | |
| 483 | + "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], | |
| 484 | + | |
| 485 | + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], | |
| 486 | + | |
| 487 | + "node-mock-http": ["node-mock-http@1.0.5", "", {}, "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw=="], | |
| 488 | + | |
| 489 | + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], | |
| 490 | + | |
| 491 | + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], | |
| 492 | + | |
| 493 | + "obug": ["obug@2.2.1", "", {}, "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q=="], | |
| 494 | + | |
| 495 | + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], | |
| 496 | + | |
| 497 | + "ohash": ["ohash@2.0.12", "", {}, "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw=="], | |
| 498 | + | |
| 499 | + "oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="], | |
| 500 | + | |
| 501 | + "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="], | |
| 502 | + | |
| 503 | + "p-limit": ["p-limit@7.3.3", "", { "dependencies": { "yocto-queue": "^1.2.1" } }, "sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ=="], | |
| 504 | + | |
| 505 | + "p-queue": ["p-queue@9.3.3", "", { "dependencies": { "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" } }, "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA=="], | |
| 506 | + | |
| 507 | + "p-timeout": ["p-timeout@7.0.2", "", {}, "sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw=="], | |
| 508 | + | |
| 509 | + "package-manager-detector": ["package-manager-detector@1.8.0", "", {}, "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A=="], | |
| 510 | + | |
| 511 | + "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], | |
| 512 | + | |
| 513 | + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], | |
| 514 | + | |
| 515 | + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], | |
| 516 | + | |
| 517 | + "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], | |
| 518 | + | |
| 519 | + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], | |
| 520 | + | |
| 521 | + "process-ancestry": ["process-ancestry@0.1.0", "", {}, "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg=="], | |
| 522 | + | |
| 523 | + "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], | |
| 524 | + | |
| 525 | + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], | |
| 526 | + | |
| 527 | + "readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], | |
| 528 | + | |
| 529 | + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], | |
| 530 | + | |
| 531 | + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], | |
| 532 | + | |
| 533 | + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], | |
| 534 | + | |
| 535 | + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], | |
| 536 | + | |
| 537 | + "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], | |
| 538 | + | |
| 539 | + "rolldown": ["rolldown@1.2.9", "", { "dependencies": { "@oxc-project/types": "=0.150.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.9", "@rolldown/binding-android-arm64": "1.2.9", "@rolldown/binding-darwin-arm64": "1.2.9", "@rolldown/binding-darwin-x64": "1.2.9", "@rolldown/binding-freebsd-x64": "1.2.9", "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", "@rolldown/binding-linux-arm64-gnu": "1.2.9", "@rolldown/binding-linux-arm64-musl": "1.2.9", "@rolldown/binding-linux-ppc64-gnu": "1.2.9", "@rolldown/binding-linux-s390x-gnu": "1.2.9", "@rolldown/binding-linux-x64-gnu": "1.2.9", "@rolldown/binding-linux-x64-musl": "1.2.9", "@rolldown/binding-openharmony-arm64": "1.2.9", "@rolldown/binding-win32-arm64-msvc": "1.2.9", "@rolldown/binding-win32-x64-msvc": "1.2.9" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg=="], | |
| 540 | + | |
| 541 | + "satteri": ["satteri@0.10.5", "", { "dependencies": { "@types/estree-jsx": "^1.0.5", "@types/hast": "^3.0.5", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3" }, "optionalDependencies": { "@bruits/satteri-darwin-arm64": "0.10.5", "@bruits/satteri-darwin-x64": "0.10.5", "@bruits/satteri-linux-arm64-gnu": "0.10.5", "@bruits/satteri-linux-arm64-musl": "0.10.5", "@bruits/satteri-linux-x64-gnu": "0.10.5", "@bruits/satteri-linux-x64-musl": "0.10.5", "@bruits/satteri-wasm32-wasi": "0.10.5", "@bruits/satteri-win32-arm64-msvc": "0.10.5", "@bruits/satteri-win32-x64-msvc": "0.10.5" } }, "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ=="], | |
| 542 | + | |
| 543 | + "sax": ["sax@1.6.1", "", {}, "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q=="], | |
| 544 | + | |
| 545 | + "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], | |
| 546 | + | |
| 547 | + "sharp": ["sharp@0.35.4", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.4", "@img/sharp-darwin-x64": "0.35.4", "@img/sharp-freebsd-wasm32": "0.35.4", "@img/sharp-libvips-darwin-arm64": "1.3.3", "@img/sharp-libvips-darwin-x64": "1.3.3", "@img/sharp-libvips-linux-arm": "1.3.3", "@img/sharp-libvips-linux-arm64": "1.3.3", "@img/sharp-libvips-linux-ppc64": "1.3.3", "@img/sharp-libvips-linux-riscv64": "1.3.3", "@img/sharp-libvips-linux-s390x": "1.3.3", "@img/sharp-libvips-linux-x64": "1.3.3", "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", "@img/sharp-libvips-linuxmusl-x64": "1.3.3", "@img/sharp-linux-arm": "0.35.4", "@img/sharp-linux-arm64": "0.35.4", "@img/sharp-linux-ppc64": "0.35.4", "@img/sharp-linux-riscv64": "0.35.4", "@img/sharp-linux-s390x": "0.35.4", "@img/sharp-linux-x64": "0.35.4", "@img/sharp-linuxmusl-arm64": "0.35.4", "@img/sharp-linuxmusl-x64": "0.35.4", "@img/sharp-webcontainers-wasm32": "0.35.4", "@img/sharp-win32-arm64": "0.35.4", "@img/sharp-win32-ia32": "0.35.4", "@img/sharp-win32-x64": "0.35.4" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA=="], | |
| 548 | + | |
| 549 | + "shiki": ["shiki@4.4.3", "", { "dependencies": { "@shikijs/core": "4.4.3", "@shikijs/engine-javascript": "4.4.3", "@shikijs/engine-oniguruma": "4.4.3", "@shikijs/langs": "4.4.3", "@shikijs/themes": "4.4.3", "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g=="], | |
| 550 | + | |
| 551 | + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], | |
| 552 | + | |
| 553 | + "smol-toml": ["smol-toml@1.8.0", "", {}, "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ=="], | |
| 554 | + | |
| 555 | + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], | |
| 556 | + | |
| 557 | + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], | |
| 558 | + | |
| 559 | + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], | |
| 560 | + | |
| 561 | + "svgo": ["svgo@4.1.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^6.0.0", "css-tree": "^3.0.1", "css-what": "^7.0.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "1.6.1" }, "bin": { "svgo": "bin/svgo.js" } }, "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q=="], | |
| 562 | + | |
| 563 | + "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], | |
| 564 | + | |
| 565 | + "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], | |
| 566 | + | |
| 567 | + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], | |
| 568 | + | |
| 569 | + "tinyclip": ["tinyclip@0.1.15", "", {}, "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A=="], | |
| 570 | + | |
| 571 | + "tinyexec": ["tinyexec@1.3.1", "", {}, "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA=="], | |
| 572 | + | |
| 573 | + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], | |
| 574 | + | |
| 575 | + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], | |
| 576 | + | |
| 577 | + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], | |
| 578 | + | |
| 579 | + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], | |
| 580 | + | |
| 581 | + "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], | |
| 582 | + | |
| 583 | + "ultrahtml": ["ultrahtml@1.7.0", "", {}, "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g=="], | |
| 584 | + | |
| 585 | + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], | |
| 586 | + | |
| 587 | + "undici": ["undici@8.10.2", "", {}, "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ=="], | |
| 588 | + | |
| 589 | + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], | |
| 590 | + | |
| 591 | + "unifont": ["unifont@0.7.5", "", { "dependencies": { "css-tree": "^3.1.0", "ohash": "^2.0.11", "undici": "^8.0.0" } }, "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg=="], | |
| 592 | + | |
| 593 | + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], | |
| 594 | + | |
| 595 | + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], | |
| 596 | + | |
| 597 | + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], | |
| 598 | + | |
| 599 | + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], | |
| 600 | + | |
| 601 | + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], | |
| 602 | + | |
| 603 | + "unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], | |
| 604 | + | |
| 605 | + "verkit": ["verkit@0.4.1", "", {}, "sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ=="], | |
| 606 | + | |
| 607 | + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], | |
| 608 | + | |
| 609 | + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], | |
| 610 | + | |
| 611 | + "vite": ["vite@8.3.0", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ=="], | |
| 612 | + | |
| 613 | + "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], | |
| 614 | + | |
| 615 | + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], | |
| 616 | + | |
| 617 | + "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], | |
| 618 | + | |
| 619 | + "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], | |
| 620 | + | |
| 621 | + "zod": ["zod@4.6.5", "", {}, "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q=="], | |
| 622 | + | |
| 623 | + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], | |
| 624 | + | |
| 625 | + "@bruits/satteri-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], | |
| 626 | + | |
| 627 | + "@tailwindcss/node/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], | |
| 628 | + | |
| 629 | + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], | |
| 630 | + | |
| 631 | + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], | |
| 632 | + | |
| 633 | + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], | |
| 634 | + | |
| 635 | + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" }, "bundled": true }, "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g=="], | |
| 636 | + | |
| 637 | + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.4", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A=="], | |
| 638 | + | |
| 639 | + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], | |
| 640 | + | |
| 641 | + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], | |
| 642 | + | |
| 643 | + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], | |
| 644 | + | |
| 645 | + "vite/lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], | |
| 646 | + | |
| 647 | + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], | |
| 648 | + | |
| 649 | + "vite/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.33.0", "", { "os": "android", "cpu": "arm64" }, "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="], | |
| 650 | + | |
| 651 | + "vite/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.33.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg=="], | |
| 652 | + | |
| 653 | + "vite/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.33.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ=="], | |
| 654 | + | |
| 655 | + "vite/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.33.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg=="], | |
| 656 | + | |
| 657 | + "vite/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.33.0", "", { "os": "linux", "cpu": "arm" }, "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ=="], | |
| 658 | + | |
| 659 | + "vite/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg=="], | |
| 660 | + | |
| 661 | + "vite/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ=="], | |
| 662 | + | |
| 663 | + "vite/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg=="], | |
| 664 | + | |
| 665 | + "vite/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw=="], | |
| 666 | + | |
| 667 | + "vite/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.33.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA=="], | |
| 668 | + | |
| 669 | + "vite/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="], | |
| 670 | + } | |
| 671 | +} |
+16-0frontend/package.json
| @@ -0,0 +1,16 @@ | ||
| 1 | +{ | |
| 2 | + "name": "astrum-frontend", | |
| 3 | + "type": "module", | |
| 4 | + "version": "0.1.0", | |
| 5 | + "private": true, | |
| 6 | + "scripts": { | |
| 7 | + "build": "astro build", | |
| 8 | + "check": "astro check", | |
| 9 | + "astro": "astro" | |
| 10 | + }, | |
| 11 | + "dependencies": { | |
| 12 | + "@tailwindcss/vite": "^4.1.18", | |
| 13 | + "astro": "^7.3.3", | |
| 14 | + "tailwindcss": "^4.1.18" | |
| 15 | + } | |
| 16 | +} |
+4-0frontend/public/favicon.svg
| @@ -0,0 +1,4 @@ | ||
| 1 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> | |
| 2 | + <rect width="32" height="32" rx="4" fill="#0b0f16" /> | |
| 3 | + <path d="M16 6 L25 26 H20.5 L16 15.5 L11.5 26 H7 Z" fill="#4f8cff" /> | |
| 4 | +</svg> |
+58-0frontend/src/components/DevReload.astro
| @@ -0,0 +1,58 @@ | ||
| 1 | +--- | |
| 2 | +// Emitted only when the build ran with PUBLIC_HOT_RELOAD=true, which | |
| 3 | +// backend/src/dev.rs sets. A production build contains none of this. | |
| 4 | +const hotReload = import.meta.env.PUBLIC_HOT_RELOAD === "true"; | |
| 5 | +--- | |
| 6 | + | |
| 7 | +{ | |
| 8 | + hotReload && ( | |
| 9 | + <script is:inline> | |
| 10 | + (() => { | |
| 11 | + const protocol = location.protocol === "https:" ? "wss:" : "ws:"; | |
| 12 | + let delay = 250; | |
| 13 | + let reconnectTimer; | |
| 14 | + let stableTimer; | |
| 15 | + let reloading = false; | |
| 16 | + let socket; | |
| 17 | + | |
| 18 | + function connect() { | |
| 19 | + if ( | |
| 20 | + reloading || | |
| 21 | + document.visibilityState === "hidden" || | |
| 22 | + socket?.readyState === WebSocket.OPEN || | |
| 23 | + socket?.readyState === WebSocket.CONNECTING | |
| 24 | + ) | |
| 25 | + return; | |
| 26 | + | |
| 27 | + const ws = (socket = new WebSocket(`${protocol}//${location.host}/dev-ws`)); | |
| 28 | + ws.onopen = () => { | |
| 29 | + console.info("[reload] connected"); | |
| 30 | + // Only treat the backoff as recovered once it has held. | |
| 31 | + stableTimer = setTimeout(() => { delay = 250; }, 5000); | |
| 32 | + }; | |
| 33 | + ws.onmessage = (event) => { | |
| 34 | + if (event.data === "reload" && !reloading) { | |
| 35 | + reloading = true; | |
| 36 | + ws.close(); | |
| 37 | + location.reload(); | |
| 38 | + } | |
| 39 | + }; | |
| 40 | + ws.onclose = () => { | |
| 41 | + clearTimeout(stableTimer); | |
| 42 | + if (reloading) return; | |
| 43 | + // The server is usually just restarting; back off and retry. | |
| 44 | + clearTimeout(reconnectTimer); | |
| 45 | + reconnectTimer = setTimeout(connect, delay + Math.random() * 250); | |
| 46 | + delay = Math.min(delay * 2, 5000); | |
| 47 | + }; | |
| 48 | + } | |
| 49 | + | |
| 50 | + document.addEventListener("visibilitychange", () => { | |
| 51 | + if (document.visibilityState === "visible") connect(); | |
| 52 | + }); | |
| 53 | + window.addEventListener("online", connect); | |
| 54 | + connect(); | |
| 55 | + })(); | |
| 56 | + </script> | |
| 57 | + ) | |
| 58 | +} |
+43-0frontend/src/layouts/Layout.astro
| @@ -0,0 +1,43 @@ | ||
| 1 | +--- | |
| 2 | +import DevReload from "../components/DevReload.astro"; | |
| 3 | +import "../styles/global.css"; | |
| 4 | + | |
| 5 | +interface Props { | |
| 6 | + title?: string; | |
| 7 | + description?: string; | |
| 8 | +} | |
| 9 | + | |
| 10 | +const { title = "Astrum", description = "axum + Astro, one binary." } = Astro.props; | |
| 11 | +--- | |
| 12 | + | |
| 13 | +<!doctype html> | |
| 14 | +<html lang="en" class="h-full"> | |
| 15 | + <head> | |
| 16 | + <meta charset="utf-8" /> | |
| 17 | + <meta name="viewport" content="width=device-width, initial-scale=1" /> | |
| 18 | + <title>{title}</title> | |
| 19 | + <meta name="description" content={description} /> | |
| 20 | + <link rel="icon" href="/favicon.svg" type="image/svg+xml" /> | |
| 21 | + </head> | |
| 22 | + <body class="h-full bg-surface text-ink antialiased"> | |
| 23 | + <div class="mx-auto flex min-h-full max-w-3xl flex-col px-4"> | |
| 24 | + <header class="flex items-center justify-between border-b border-edge py-4"> | |
| 25 | + <a href="/" class="text-sm font-semibold tracking-widest uppercase">Astrum</a> | |
| 26 | + <nav class="flex gap-4 text-sm text-ink-dim"> | |
| 27 | + <a href="/" class="hover:text-ink">Home</a> | |
| 28 | + <a href="/about" class="hover:text-ink">About</a> | |
| 29 | + <a href="/api/health" class="hover:text-ink">API</a> | |
| 30 | + </nav> | |
| 31 | + </header> | |
| 32 | + | |
| 33 | + <main class="flex-1 py-8"> | |
| 34 | + <slot /> | |
| 35 | + </main> | |
| 36 | + | |
| 37 | + <footer class="border-t border-edge py-4 text-xs text-ink-dim"> | |
| 38 | + Served by axum. Built by Astro. | |
| 39 | + </footer> | |
| 40 | + </div> | |
| 41 | + <DevReload /> | |
| 42 | + </body> | |
| 43 | +</html> |
+10-0frontend/src/pages/404.astro
| @@ -0,0 +1,10 @@ | ||
| 1 | +--- | |
| 2 | +import Layout from "../layouts/Layout.astro"; | |
| 3 | +--- | |
| 4 | + | |
| 5 | +<Layout title="Not found"> | |
| 6 | + <h1 class="text-2xl font-semibold">404</h1> | |
| 7 | + <p class="mt-2 text-ink-dim"> | |
| 8 | + That page isn't here. <a href="/" class="text-accent hover:underline">Go home</a>. | |
| 9 | + </p> | |
| 10 | +</Layout> |
+33-0frontend/src/pages/about.astro
| @@ -0,0 +1,33 @@ | ||
| 1 | +--- | |
| 2 | +import Layout from "../layouts/Layout.astro"; | |
| 3 | +--- | |
| 4 | + | |
| 5 | +<Layout title="About Astrum" description="How the two halves fit together."> | |
| 6 | + <h1 class="text-2xl font-semibold">How it fits together</h1> | |
| 7 | + | |
| 8 | + <dl class="mt-6 space-y-4 text-sm"> | |
| 9 | + <div> | |
| 10 | + <dt class="font-semibold">Debug</dt> | |
| 11 | + <dd class="text-ink-dim"> | |
| 12 | + The server runs <code>bun run build</code> at startup and on every change under | |
| 13 | + <code>frontend/</code>, reads pages from <code>frontend/dist</code>, and pushes | |
| 14 | + a reload over <code>/dev-ws</code>. | |
| 15 | + </dd> | |
| 16 | + </div> | |
| 17 | + <div> | |
| 18 | + <dt class="font-semibold">Release</dt> | |
| 19 | + <dd class="text-ink-dim"> | |
| 20 | + <code>rust-embed</code> compiles <code>frontend/dist</code> into the binary. No | |
| 21 | + bun, no watcher, no files to ship alongside it. | |
| 22 | + </dd> | |
| 23 | + </div> | |
| 24 | + <div> | |
| 25 | + <dt class="font-semibold">This page</dt> | |
| 26 | + <dd class="text-ink-dim"> | |
| 27 | + Reachable as <code>/about</code> and <code>/about/</code> alike: the server | |
| 28 | + tries the path, then <code>.html</code>, then <code>/index.html</code>. An | |
| 29 | + unknown path gets <code>404.astro</code>. | |
| 30 | + </dd> | |
| 31 | + </div> | |
| 32 | + </dl> | |
| 33 | +</Layout> |
+33-0frontend/src/pages/index.astro
| @@ -0,0 +1,33 @@ | ||
| 1 | +--- | |
| 2 | +import Layout from "../layouts/Layout.astro"; | |
| 3 | +--- | |
| 4 | + | |
| 5 | +<Layout title="Astrum"> | |
| 6 | + <h1 class="text-2xl font-semibold">axum + Astro</h1> | |
| 7 | + <p class="mt-2 max-w-prose text-ink-dim"> | |
| 8 | + Astro builds static pages. axum serves them: from disk while developing, from | |
| 9 | + inside the binary in release. Edit anything under <code | |
| 10 | + class="rounded-[4px] bg-surface-raised px-1 py-0.5 text-ink">frontend/src</code | |
| 11 | + > and this page reloads itself. | |
| 12 | + </p> | |
| 13 | + | |
| 14 | + <section class="mt-8 rounded-[4px] border border-edge bg-surface-raised p-4"> | |
| 15 | + <h2 class="text-sm font-semibold tracking-wider uppercase text-ink-dim"> | |
| 16 | + GET /api/health | |
| 17 | + </h2> | |
| 18 | + <pre | |
| 19 | + class="mt-2 overflow-x-auto text-sm"><code id="health">loading…</code></pre> | |
| 20 | + </section> | |
| 21 | +</Layout> | |
| 22 | + | |
| 23 | +<script> | |
| 24 | + const target = document.getElementById("health"); | |
| 25 | + fetch("/api/health") | |
| 26 | + .then((response) => response.json()) | |
| 27 | + .then((body) => { | |
| 28 | + if (target) target.textContent = JSON.stringify(body, null, 2); | |
| 29 | + }) | |
| 30 | + .catch((error) => { | |
| 31 | + if (target) target.textContent = String(error); | |
| 32 | + }); | |
| 33 | +</script> |
+11-0frontend/src/styles/global.css
| @@ -0,0 +1,11 @@ | ||
| 1 | +@import "tailwindcss"; | |
| 2 | + | |
| 3 | +@theme { | |
| 4 | + --color-surface: #0b0f16; | |
| 5 | + --color-surface-raised: #141a24; | |
| 6 | + --color-edge: #232c3a; | |
| 7 | + --color-ink: #e7ecf3; | |
| 8 | + --color-ink-dim: #93a0b4; | |
| 9 | + --color-accent: #4f8cff; | |
| 10 | + --radius-card: 4px; | |
| 11 | +} |