web components for a integrable atproto based guestbook

init commit

nekomimi.pet 03e61a07

verified
+24
.gitignore
···
+
# Logs
+
logs
+
*.log
+
npm-debug.log*
+
yarn-debug.log*
+
yarn-error.log*
+
pnpm-debug.log*
+
lerna-debug.log*
+
+
node_modules
+
dist
+
dist-ssr
+
*.local
+
+
# Editor directories and files
+
.vscode/*
+
!.vscode/extensions.json
+
.idea
+
.DS_Store
+
*.suo
+
*.ntvs*
+
*.njsproj
+
*.sln
+
*.sw?
+3
.vscode/extensions.json
···
+
{
+
"recommendations": ["svelte.svelte-vscode"]
+
}
+114
README.md
···
+
# cutebook
+
+
Web components for AT Protocol guestbooks. Sign and display guestbook entries stored in user repositories, indexed via Constellation.
+
+
## Installation
+
+
```bash
+
npm install cutebook
+
```
+
+
Peer dependencies:
+
+
```bash
+
npm install @atcute/client @atcute/oauth-browser-client @atcute/identity-resolver
+
```
+
+
## Quick Start
+
+
The simplest way to use the components is with the auto-register entry point:
+
+
```ts
+
import { configureGuestbook } from 'cutebook/register';
+
+
configureGuestbook({
+
oauth: {
+
clientId: 'https://your-app.com/client-metadata.json',
+
redirectUri: 'https://your-app.com/',
+
scope: 'atproto transition:generic',
+
},
+
});
+
```
+
+
Then use the custom elements in your HTML:
+
+
```html
+
<guestbook-sign did="did:plc:your-did-here"></guestbook-sign>
+
<guestbook-display did="did:plc:your-did-here" limit="50"></guestbook-display>
+
```
+
+
## Manual Registration
+
+
If you need more control over element registration:
+
+
```ts
+
import {
+
GuestbookSignElement,
+
GuestbookDisplayElement,
+
configureGuestbook
+
} from 'cutebook';
+
+
configureGuestbook({
+
oauth: {
+
clientId: 'https://your-app.com/client-metadata.json',
+
redirectUri: 'https://your-app.com/',
+
scope: 'atproto transition:generic',
+
},
+
});
+
+
customElements.define('my-guestbook-sign', GuestbookSignElement);
+
customElements.define('my-guestbook-display', GuestbookDisplayElement);
+
```
+
+
## Components
+
+
### guestbook-sign
+
+
A form component that handles OAuth authentication and record creation.
+
+
| Attribute | Description |
+
|-----------|-------------|
+
| `did` | The DID of the guestbook owner (required) |
+
+
Dispatches a `sign-created` event with `{ uri, cid }` when a signature is successfully created.
+
+
### guestbook-display
+
+
Displays guestbook signatures by querying Constellation for backlinks.
+
+
| Attribute | Description |
+
|-----------|-------------|
+
| `did` | The DID of the guestbook owner (required) |
+
| `limit` | Maximum number of entries to display (default: 50) |
+
+
Call `.refresh()` on the element to reload signatures.
+
+
## Lexicon
+
+
Signatures use the `pet.nkp.guestbook.sign` record type:
+
+
```json
+
{
+
"$type": "pet.nkp.guestbook.sign",
+
"subject": "did:plc:guestbook-owner",
+
"message": "Your message here",
+
"createdAt": "2024-01-01T00:00:00.000Z"
+
}
+
```
+
+
## Development
+
+
```bash
+
npm run dev # Run demo app
+
npm run build # Build library
+
npm run build:demo # Build demo app
+
npm run check # Type check
+
```
+
+
## Credits
+
+
Handle typeahead powered by [actor-typeahead](https://tangled.org/jakelazaroff.com/actor-typeahead) by Jake Lazaroff.
+
+
## License
+
+
MIT
+244
bun.lock
···
+
{
+
"lockfileVersion": 1,
+
"configVersion": 0,
+
"workspaces": {
+
"": {
+
"name": "cutebook",
+
"dependencies": {
+
"@atcute/atproto": "^3.1.9",
+
"@atcute/client": "^4.1.0",
+
"@atcute/identity-resolver": "^1.1.4",
+
"@atcute/lex-cli": "^2.5.0",
+
"@atcute/lexicon-doc": "^2.0.4",
+
"@atcute/oauth-browser-client": "^2.0.1",
+
},
+
"devDependencies": {
+
"@sveltejs/vite-plugin-svelte": "^6.2.1",
+
"@tsconfig/svelte": "^5.0.6",
+
"@types/node": "^24.10.1",
+
"svelte": "^5.43.8",
+
"svelte-check": "^4.3.4",
+
"typescript": "~5.9.3",
+
"vite": "npm:rolldown-vite@7.2.5",
+
},
+
},
+
},
+
"overrides": {
+
"vite": "npm:rolldown-vite@7.2.5",
+
},
+
"packages": {
+
"@atcute/atproto": ["@atcute/atproto@3.1.9", "", { "dependencies": { "@atcute/lexicons": "^1.2.2" } }, "sha512-DyWwHCTdR4hY2BPNbLXgVmm7lI+fceOwWbE4LXbGvbvVtSn+ejSVFaAv01Ra3kWDha0whsOmbJL8JP0QPpf1+w=="],
+
+
"@atcute/car": ["@atcute/car@5.0.0", "", { "dependencies": { "@atcute/cbor": "^2.2.7", "@atcute/cid": "^2.2.6", "@atcute/uint8array": "^1.0.5", "@atcute/varint": "^1.0.3" } }, "sha512-OIY2xTXv8lSpZsDSn/UYQtJSMvDw5Hi4Q+uyvmiqSM+fht08QRAEq/nxa5YFciPZ3nfDFnZ3//EgJw7QhkSXLQ=="],
+
+
"@atcute/cbor": ["@atcute/cbor@2.2.8", "", { "dependencies": { "@atcute/cid": "^2.2.6", "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5" } }, "sha512-UzOAN9BuN6JCXgn0ryV8qZuRJUDrNqrbLd6EFM8jc6RYssjRyGRxNy6RZ1NU/07Hd8Tq/0pz8+nQiMu5Zai5uw=="],
+
+
"@atcute/cid": ["@atcute/cid@2.2.6", "", { "dependencies": { "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5" } }, "sha512-bTAHHbJ24p+E//V4KCS4xdmd39o211jJswvqQOevj7vk+5IYcgDLx1ryZWZ1sEPOo9x875li/kj5gpKL14RDwQ=="],
+
+
"@atcute/client": ["@atcute/client@4.1.0", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/lexicons": "^1.2.5" } }, "sha512-AYhSu3RSDA2VDkVGOmad320NRbUUUf5pCFWJcOzlk25YC/4kyzmMFfpzhf1jjjEcY+anNBXGGhav/kKB1evggQ=="],
+
+
"@atcute/crypto": ["@atcute/crypto@2.2.6", "", { "dependencies": { "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5", "@noble/secp256k1": "^3.0.0" } }, "sha512-vkuexF+kmrKE1/Uqzub99Qi4QpnxA2jbu60E6PTgL4XypELQ6rb59MB/J1VbY2gs0kd3ET7+L3+NWpKD5nXyfA=="],
+
+
"@atcute/identity": ["@atcute/identity@1.1.3", "", { "dependencies": { "@atcute/lexicons": "^1.2.4", "@badrap/valita": "^0.4.6" } }, "sha512-oIqPoI8TwWeQxvcLmFEZLdN2XdWcaLVtlm8pNk0E72As9HNzzD9pwKPrLr3rmTLRIoULPPFmq9iFNsTeCIU9ng=="],
+
+
"@atcute/identity-resolver": ["@atcute/identity-resolver@1.1.4", "", { "dependencies": { "@atcute/lexicons": "^1.2.2", "@atcute/util-fetch": "^1.0.3", "@badrap/valita": "^0.4.6" }, "peerDependencies": { "@atcute/identity": "^1.0.0" } }, "sha512-/SVh8vf2cXFJenmBnGeYF2aY3WGQm3cJeew5NWTlkqoy3LvJ5wkvKq9PWu4Tv653VF40rPOp6LOdVr9Fa+q5rA=="],
+
+
"@atcute/lex-cli": ["@atcute/lex-cli@2.5.0", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/identity-resolver": "^1.1.4", "@atcute/lexicon-doc": "^2.0.3", "@atcute/lexicon-resolver": "^0.1.4", "@atcute/lexicons": "^1.2.5", "@badrap/valita": "^0.4.6", "@optique/core": "^0.6.3", "@optique/run": "^0.6.3", "picocolors": "^1.1.1", "prettier": "^3.6.2" }, "bin": { "lex-cli": "cli.mjs" } }, "sha512-mIla9XeK9HJqFW0m/FaHI3+wIQlUL3PJYFpGmlXVwJISQVHASvWpU6gCHSYtAySZTrfVDv73fsVDBkpw9mnTjA=="],
+
+
"@atcute/lexicon-doc": ["@atcute/lexicon-doc@2.0.4", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/lexicons": "^1.2.5", "@badrap/valita": "^0.4.6" } }, "sha512-YfwlYFoYiBvRIYG0I1zsINCTFugFtS8l67uT3nQ04zdKVflzdg8uUj8cNZYRNY1V7okoOPdikhR4kPFhYGyemw=="],
+
+
"@atcute/lexicon-resolver": ["@atcute/lexicon-resolver@0.1.5", "", { "dependencies": { "@atcute/crypto": "^2.2.6", "@atcute/lexicon-doc": "^2.0.4", "@atcute/lexicons": "^1.2.5", "@atcute/repo": "^0.1.0", "@atcute/util-fetch": "^1.0.4", "@badrap/valita": "^0.4.6" }, "peerDependencies": { "@atcute/identity": "^1.1.0", "@atcute/identity-resolver": "^1.1.3" } }, "sha512-0bx1/zdMQPuxvRcHW6ykAxRxktC2rEZLoAVSFoLSWDAA92Tf09F9QPK5wgXSF4MNODm1dvzMEdWSMIvlg8sr3A=="],
+
+
"@atcute/lexicons": ["@atcute/lexicons@1.2.5", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "esm-env": "^1.2.2" } }, "sha512-9yO9WdgxW8jZ7SbzUycH710z+JmsQ9W9n5S6i6eghYju32kkluFmgBeS47r8e8p2+Dv4DemS7o/3SUGsX9FR5Q=="],
+
+
"@atcute/mst": ["@atcute/mst@0.1.0", "", { "dependencies": { "@atcute/cbor": "^2.2.7", "@atcute/cid": "^2.2.6", "@atcute/uint8array": "^1.0.5" } }, "sha512-h+iDToKEnBpigk2DOHjSqY63vJtjYKUIztqu1CZ0P+I54wV2SrgoqAXAT1xrW6A1Iup8cjTv+U2H5WVG4KxPLw=="],
+
+
"@atcute/multibase": ["@atcute/multibase@1.1.6", "", { "dependencies": { "@atcute/uint8array": "^1.0.5" } }, "sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg=="],
+
+
"@atcute/oauth-browser-client": ["@atcute/oauth-browser-client@2.0.1", "", { "dependencies": { "@atcute/client": "^4.0.5", "@atcute/identity": "^1.1.1", "@atcute/identity-resolver": "^1.1.4", "@atcute/lexicons": "^1.2.2", "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5", "nanoid": "^5.1.5" } }, "sha512-lG021GkeORG06zfFf4bH85egObjBEKHNgAWHvbtY/E2dX4wxo88hf370pJDx8acdnuUJLJ2VKPikJtZwo4Heeg=="],
+
+
"@atcute/repo": ["@atcute/repo@0.1.0", "", { "dependencies": { "@atcute/car": "^5.0.0", "@atcute/cbor": "^2.2.7", "@atcute/cid": "^2.2.6", "@atcute/crypto": "^2.2.5", "@atcute/lexicons": "^1.2.2", "@atcute/mst": "^0.1.0", "@atcute/uint8array": "^1.0.5" } }, "sha512-INiYAuma8dydBu7cqd2WVpcXh3mzhIepYBUqFWAK5MqMulPRLTRCc/9GW3G9pxYrOdlvLCVamG2Jf8XK0nuFEw=="],
+
+
"@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="],
+
+
"@atcute/util-fetch": ["@atcute/util-fetch@1.0.3", "", { "dependencies": { "@badrap/valita": "^0.4.6" } }, "sha512-f8zzTb/xlKIwv2OQ31DhShPUNCmIIleX6p7qIXwWwEUjX6x8skUtpdISSjnImq01LXpltGV5y8yhV4/Mlb7CRQ=="],
+
+
"@atcute/varint": ["@atcute/varint@1.0.3", "", {}, "sha512-fdvMPyBB+McDT+Ai5e9RwEbwYV4yjZ60S2Dn5PTjGqUyxvoCH1z42viuheDZRUDkmfQehXJTZ5az7dSozVNtog=="],
+
+
"@badrap/valita": ["@badrap/valita@0.4.6", "", {}, "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg=="],
+
+
"@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="],
+
+
"@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="],
+
+
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
+
+
"@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=="],
+
+
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
+
+
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+
"@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=="],
+
+
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="],
+
+
"@noble/secp256k1": ["@noble/secp256k1@3.0.0", "", {}, "sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg=="],
+
+
"@optique/core": ["@optique/core@0.6.3", "", {}, "sha512-Aw7naHPeZr+YThJRrfk+Ds3OuAd7HUD1chsGncay+6crmLyrraXh0s0xDuJ52kCfNPdCTKAW3MG0XLcuEIr8qQ=="],
+
+
"@optique/run": ["@optique/run@0.6.3", "", { "dependencies": { "@optique/core": "0.6.3" } }, "sha512-6zesLs4XLyFtG8s/JoG2VO/+plJVZhqbLK20yDm0hFEXrqcP+VCKTsoFAlWoWv4Us48V170SKH+8DZcxw8raJw=="],
+
+
"@oxc-project/runtime": ["@oxc-project/runtime@0.97.0", "", {}, "sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w=="],
+
+
"@oxc-project/types": ["@oxc-project/types@0.97.0", "", {}, "sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ=="],
+
+
"@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.50", "", { "os": "android", "cpu": "arm64" }, "sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag=="],
+
+
"@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w=="],
+
+
"@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "x64" }, "sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA=="],
+
+
"@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.50", "", { "os": "freebsd", "cpu": "x64" }, "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q=="],
+
+
"@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm" }, "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw=="],
+
+
"@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw=="],
+
+
"@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw=="],
+
+
"@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg=="],
+
+
"@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA=="],
+
+
"@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.50", "", { "os": "none", "cpu": "arm64" }, "sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA=="],
+
+
"@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.50", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg=="],
+
+
"@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "arm64" }, "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA=="],
+
+
"@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "ia32" }, "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg=="],
+
+
"@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "x64" }, "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ=="],
+
+
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.50", "", {}, "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA=="],
+
+
"@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="],
+
+
"@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.7", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q=="],
+
+
"@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.2.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ=="],
+
+
"@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.1", "", { "dependencies": { "debug": "^4.4.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA=="],
+
+
"@tsconfig/svelte": ["@tsconfig/svelte@5.0.6", "", {}, "sha512-yGxYL0I9eETH1/DR9qVJey4DAsCdeau4a9wYPKuXfEhm8lFO8wg+LLYJjIpAm6Fw7HSlhepPhYPDop75485yWQ=="],
+
+
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
+
+
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+
"@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
+
+
"acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
+
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
+
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
+
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
+
+
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+
"devalue": ["devalue@5.5.0", "", {}, "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w=="],
+
+
"esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
+
+
"esrap": ["esrap@2.2.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg=="],
+
+
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+
"is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
+
+
"lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="],
+
+
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="],
+
+
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="],
+
+
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="],
+
+
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="],
+
+
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="],
+
+
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="],
+
+
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="],
+
+
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="],
+
+
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="],
+
+
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="],
+
+
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="],
+
+
"locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],
+
+
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
+
+
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+
"nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="],
+
+
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+
+
"postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+
+
"prettier": ["prettier@3.7.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-RWKXE4qB3u5Z6yz7omJkjWwmTfLdcbv44jUVHC5NpfXwFGzvpQM798FGv/6WNK879tc+Cn0AAyherCl1KjbyZQ=="],
+
+
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+
"rolldown": ["rolldown@1.0.0-beta.50", "", { "dependencies": { "@oxc-project/types": "=0.97.0", "@rolldown/pluginutils": "1.0.0-beta.50" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-x64": "1.0.0-beta.50", "@rolldown/binding-freebsd-x64": "1.0.0-beta.50", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.50", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.50", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.50", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.50", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.50" }, "bin": "bin/cli.mjs" }, "sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A=="],
+
+
"sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="],
+
+
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+
"svelte": ["svelte@5.45.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.5.0", "esm-env": "^1.2.1", "esrap": "^2.2.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-yyXdW2u3H0H/zxxWoGwJoQlRgaSJLp+Vhktv12iRw2WRDlKqUPT54Fi0K/PkXqrdkcQ98aBazpy0AH4BCBVfoA=="],
+
+
"svelte-check": ["svelte-check@4.3.4", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": "bin/svelte-check" }, "sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw=="],
+
+
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
+
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+
+
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
+
+
"vite": ["rolldown-vite@7.2.5", "", { "dependencies": { "@oxc-project/runtime": "0.97.0", "fdir": "^6.5.0", "lightningcss": "^1.30.2", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rolldown": "1.0.0-beta.50", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "esbuild": "^0.25.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": ["esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-u09tdk/huMiN8xwoiBbig197jKdCamQTtOruSalOzbqGje3jdHiV0njQlAW0YvzoahkirFePNQ4RYlfnRQpXZA=="],
+
+
"vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="],
+
+
"zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="],
+
+
"@atcute/lexicon-resolver/@atcute/util-fetch": ["@atcute/util-fetch@1.0.4", "", { "dependencies": { "@badrap/valita": "^0.4.6" } }, "sha512-sIU9Qk0dE8PLEXSfhy+gIJV+HpiiknMytCI2SqLlqd0vgZUtEKI/EQfP+23LHWvP+CLCzVDOa6cpH045OlmNBg=="],
+
+
"postcss/nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
}
+
}
+13
demo/index.html
···
+
<!doctype html>
+
<html lang="en">
+
<head>
+
<meta charset="UTF-8" />
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
<title>cutebook</title>
+
</head>
+
<body>
+
<div id="app"></div>
+
<script type="module" src="/src/main.ts"></script>
+
</body>
+
</html>
+12
demo/public/client-metadata.json
···
+
{
+
"client_id": "https://guestbook.nkp.pet/client-metadata.json",
+
"client_name": "guestbook",
+
"client_uri": "https://guestbook.nkp.pet",
+
"redirect_uris": ["https://guestbook.nkp.pet/"],
+
"scope": "atproto transition:generic",
+
"grant_types": ["authorization_code", "refresh_token"],
+
"response_types": ["code"],
+
"token_endpoint_auth_method": "none",
+
"application_type": "web",
+
"dpop_bound_access_tokens": true
+
}
+69
demo/src/App.svelte
···
+
<script lang="ts">
+
import type { GuestbookDisplayElement } from './components/guestbook-display';
+
+
function handleSignCreated(event: CustomEvent) {
+
console.log('New signature created:', event.detail);
+
// refresh the display
+
const display = document.querySelector('guestbook-display') as GuestbookDisplayElement;
+
if (display) {
+
display.refresh();
+
}
+
}
+
</script>
+
+
<main>
+
<header>
+
<h1>Guestbook</h1>
+
<p class="subtitle">Leave your thoughts and memories. Thanks for visiting!</p>
+
</header>
+
+
<div class="components">
+
<guestbook-sign
+
did="did:plc:ttdrpj45ibqunmfhdsb4zdwq"
+
onsign-created={handleSignCreated}>
+
</guestbook-sign>
+
+
<guestbook-display
+
did="did:plc:ttdrpj45ibqunmfhdsb4zdwq"
+
limit="50">
+
</guestbook-display>
+
</div>
+
</main>
+
+
<style>
+
main {
+
max-width: 1200px;
+
margin: 0 auto;
+
padding: 48px 24px;
+
}
+
+
header {
+
margin-bottom: 48px;
+
}
+
+
h1 {
+
font-size: 48px;
+
font-weight: 700;
+
margin: 0 0 12px 0;
+
color: #000;
+
}
+
+
.subtitle {
+
font-size: 18px;
+
color: #6b7280;
+
margin: 0;
+
}
+
+
.components {
+
display: grid;
+
grid-template-columns: 1fr 1fr;
+
gap: 48px;
+
align-items: start;
+
}
+
+
@media (max-width: 768px) {
+
.components {
+
grid-template-columns: 1fr;
+
}
+
}
+
</style>
+19
demo/src/app.css
···
+
* {
+
box-sizing: border-box;
+
margin: 0;
+
padding: 0;
+
}
+
+
body {
+
margin: 0;
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+
-webkit-font-smoothing: antialiased;
+
-moz-osx-font-smoothing: grayscale;
+
background-color: #f9fafb;
+
color: #000;
+
line-height: 1.5;
+
}
+
+
#app {
+
width: 100%;
+
}
+21
demo/src/main.ts
···
+
import { mount } from 'svelte'
+
import './app.css'
+
import App from './App.svelte'
+
+
// Import and configure guestbook components
+
import { configureGuestbook } from '../../lib/register';
+
+
// Configure with demo OAuth settings
+
configureGuestbook({
+
oauth: {
+
clientId: import.meta.env.VITE_OAUTH_CLIENT_ID,
+
redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URL,
+
scope: import.meta.env.VITE_OAUTH_SCOPE,
+
},
+
});
+
+
const app = mount(App, {
+
target: document.getElementById('app')!,
+
})
+
+
export default app
+14
demo/src/vite-env.d.ts
···
+
/// <reference types="vite/client" />
+
+
interface ImportMetaEnv {
+
readonly VITE_DEV_SERVER_PORT?: string;
+
readonly VITE_CLIENT_URI: string;
+
readonly VITE_OAUTH_CLIENT_ID: string;
+
readonly VITE_OAUTH_REDIRECT_URL: string;
+
readonly VITE_OAUTH_SCOPE: string;
+
}
+
+
interface ImportMeta {
+
readonly env: ImportMetaEnv;
+
}
+
+8
demo/svelte.config.js
···
+
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
+
+
/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */
+
export default {
+
// Consult https://svelte.dev/docs#compile-time-svelte-preprocess
+
// for more information about preprocessors
+
preprocess: vitePreprocess(),
+
}
+15
demo/tsconfig.json
···
+
{
+
"compilerOptions": {
+
"target": "ES2020",
+
"module": "ESNext",
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
+
"moduleResolution": "bundler",
+
"strict": true,
+
"noEmit": true,
+
"isolatedModules": true,
+
"esModuleInterop": true,
+
"skipLibCheck": true
+
},
+
"include": ["src/**/*.ts", "src/**/*.svelte", "../lib/**/*.ts"]
+
}
+
+43
demo/vite.config.ts
···
+
import { defineConfig } from 'vite';
+
import { svelte } from '@sveltejs/vite-plugin-svelte';
+
import metadata from './public/client-metadata.json';
+
+
const SERVER_HOST = '127.0.0.1';
+
const SERVER_PORT = 5173;
+
+
export default defineConfig({
+
plugins: [
+
svelte(),
+
{
+
name: 'oauth',
+
config(_conf, { command }) {
+
if (command === 'build') {
+
process.env.VITE_OAUTH_CLIENT_ID = metadata.client_id;
+
process.env.VITE_OAUTH_REDIRECT_URL = metadata.redirect_uris[0];
+
} else {
+
const redirectUri = ((): string => {
+
const url = new URL(metadata.redirect_uris[0]);
+
return `http://${SERVER_HOST}:${SERVER_PORT}${url.pathname}`;
+
})();
+
+
const clientId =
+
`http://localhost` +
+
`?redirect_uri=${encodeURIComponent(redirectUri)}` +
+
`&scope=${encodeURIComponent(metadata.scope)}`;
+
+
process.env.VITE_DEV_SERVER_PORT = '' + SERVER_PORT;
+
process.env.VITE_OAUTH_CLIENT_ID = clientId;
+
process.env.VITE_OAUTH_REDIRECT_URL = redirectUri;
+
}
+
+
process.env.VITE_CLIENT_URI = metadata.client_uri;
+
process.env.VITE_OAUTH_SCOPE = metadata.scope;
+
},
+
},
+
],
+
server: {
+
host: SERVER_HOST,
+
port: SERVER_PORT,
+
},
+
});
+
+9
lex.config.ts
···
+
import { defineLexiconConfig } from '@atcute/lex-cli';
+
+
export default defineLexiconConfig({
+
files: ['lexicons/**/*.ts'],
+
outdir: 'src/lexicons/',
+
export: {
+
outdir: 'lexicons/'
+
},
+
});
+29
lexicons/pet/nkp/guestbook/sign.json
···
+
{
+
"defs": {
+
"main": {
+
"description": "a sign in the guestbook",
+
"key": "tid",
+
"record": {
+
"properties": {
+
"subject": {
+
"type": "string",
+
"format": "at-identifier"
+
},
+
"createdAt": {
+
"type": "string",
+
"format": "datetime"
+
},
+
"message": {
+
"type": "string",
+
"maxLength": 100
+
}
+
},
+
"required": ["subject", "createdAt", "message"],
+
"type": "object"
+
},
+
"type": "record"
+
}
+
},
+
"id": "pet.nkp.guestbook.sign",
+
"lexicon": 1
+
}
+18
lexicons/pet/nkp/guestbook/sign.ts
···
+
import { document, object, record, required, string } from '@atcute/lexicon-doc/builder';
+
+
export default document({
+
id: 'pet.nkp.guestbook.sign',
+
defs: {
+
main: record({
+
key: 'tid',
+
description: 'a sign in the guestbook',
+
record: object({
+
properties: {
+
subject: required(string({ format: 'at-identifier' })),
+
createdAt: required(string({ format: 'datetime' })),
+
message: required(string({ maxLength: 100 })),
+
},
+
}),
+
}),
+
},
+
});
+72
lib/config.ts
···
+
import {
+
configureOAuth,
+
defaultIdentityResolver,
+
} from '@atcute/oauth-browser-client';
+
import {
+
CompositeDidDocumentResolver,
+
PlcDidDocumentResolver,
+
WebDidDocumentResolver,
+
XrpcHandleResolver,
+
} from '@atcute/identity-resolver';
+
+
export interface GuestbookConfig {
+
oauth: {
+
clientId: string;
+
redirectUri: string;
+
scope: string;
+
};
+
services?: {
+
handleResolver?: string;
+
};
+
}
+
+
let configured = false;
+
let storedConfig: GuestbookConfig | null = null;
+
+
/**
+
* Configure the guestbook components with OAuth settings.
+
* Must be called before using <guestbook-sign>.
+
*/
+
export function configureGuestbook(config: GuestbookConfig) {
+
if (configured) {
+
console.warn('Guestbook already configured');
+
return;
+
}
+
+
storedConfig = config;
+
+
configureOAuth({
+
metadata: {
+
client_id: config.oauth.clientId,
+
redirect_uri: config.oauth.redirectUri,
+
},
+
identityResolver: defaultIdentityResolver({
+
handleResolver: new XrpcHandleResolver({
+
serviceUrl: config.services?.handleResolver ?? 'https://slingshot.wisp.place'
+
}),
+
didDocumentResolver: new CompositeDidDocumentResolver({
+
methods: {
+
plc: new PlcDidDocumentResolver(),
+
web: new WebDidDocumentResolver(),
+
},
+
}),
+
}),
+
});
+
+
configured = true;
+
}
+
+
/**
+
* Check if guestbook has been configured
+
*/
+
export function isConfigured(): boolean {
+
return configured;
+
}
+
+
/**
+
* Get the stored config
+
*/
+
export function getConfig(): GuestbookConfig | null {
+
return storedConfig;
+
}
+
+425
lib/guestbook-display.ts
···
+
// no imports needed for this component - uses native fetch
+
+
/**
+
* represents a guestbook signature from constellation
+
*/
+
export interface GuestbookSignature {
+
uri: string;
+
cid: string;
+
value: {
+
$type: 'pet.nkp.guestbook.sign';
+
subject: string; // DID (at-identifier format)
+
message: string;
+
createdAt: string;
+
};
+
author: string;
+
authorHandle?: string;
+
}
+
+
/**
+
* constellation API response for backlinks
+
*/
+
interface ConstellationBacklinksResponse {
+
total: number;
+
records: Array<{
+
did: string;
+
collection: string;
+
rkey: string;
+
}>;
+
cursor?: string;
+
}
+
+
/**
+
* Web component for displaying guestbook signatures.
+
*
+
* Usage:
+
* <guestbook-display
+
* did="did:web:nekomimi.pet"
+
* limit="50">
+
* </guestbook-display>
+
*/
+
export class GuestbookDisplayElement extends HTMLElement {
+
private signatures: GuestbookSignature[] = [];
+
private loading = false;
+
private error: string | null = null;
+
+
static get observedAttributes() {
+
return ['did', 'limit'];
+
}
+
+
constructor() {
+
super();
+
this.attachShadow({ mode: 'open' });
+
}
+
+
connectedCallback() {
+
this.render();
+
this.fetchSignatures();
+
}
+
+
attributeChangedCallback(name: string, oldValue: string, newValue: string) {
+
if (oldValue !== newValue && (name === 'did' || name === 'limit')) {
+
this.fetchSignatures();
+
}
+
}
+
+
private render() {
+
if (!this.shadowRoot) {
+
return;
+
}
+
+
this.shadowRoot.innerHTML = `
+
<style>
+
* {
+
box-sizing: border-box;
+
margin: 0;
+
padding: 0;
+
}
+
+
:host {
+
display: block;
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+
-webkit-font-smoothing: antialiased;
+
-moz-osx-font-smoothing: grayscale;
+
}
+
+
.guestbook-display {
+
background: #f9fafb;
+
padding: 0;
+
width: 100%;
+
}
+
+
h2 {
+
margin: 0 0 24px 0;
+
font-size: 11px;
+
font-weight: 700;
+
color: #000;
+
text-transform: uppercase;
+
letter-spacing: 0.05em;
+
}
+
+
.signatures-list {
+
display: flex;
+
flex-direction: column;
+
gap: 12px;
+
}
+
+
.signature-card {
+
background: white;
+
border: 1px solid #e5e7eb;
+
border-radius: 6px;
+
padding: 16px;
+
transition: background-color 0.2s;
+
}
+
+
.signature-card:hover {
+
background: rgba(255, 255, 255, 0.5);
+
}
+
+
.signature-header {
+
display: flex;
+
justify-content: space-between;
+
align-items: baseline;
+
margin-bottom: 8px;
+
gap: 12px;
+
}
+
+
.author {
+
font-weight: 500;
+
color: #000;
+
font-size: 14px;
+
word-break: break-all;
+
}
+
+
.author a {
+
color: #000;
+
text-decoration: none;
+
}
+
+
.author a:hover {
+
text-decoration: underline;
+
}
+
+
.timestamp {
+
font-size: 12px;
+
color: #6b7280;
+
white-space: nowrap;
+
}
+
+
.message {
+
font-size: 14px;
+
line-height: 1.5;
+
color: #000;
+
word-wrap: break-word;
+
}
+
+
.loading {
+
text-align: center;
+
padding: 32px;
+
color: #9ca3af;
+
}
+
+
.spinner {
+
display: inline-block;
+
width: 20px;
+
height: 20px;
+
border: 3px solid #e5e7eb;
+
border-top-color: #6b7280;
+
border-radius: 50%;
+
animation: spin 0.8s linear infinite;
+
}
+
+
@keyframes spin {
+
to { transform: rotate(360deg); }
+
}
+
+
.error {
+
text-align: center;
+
padding: 32px;
+
color: #dc2626;
+
background: #fef2f2;
+
border-radius: 8px;
+
border: 1px solid #fecaca;
+
}
+
+
.empty {
+
text-align: center;
+
padding: 48px 24px;
+
color: #9ca3af;
+
font-size: 15px;
+
}
+
+
.empty-icon {
+
font-size: 48px;
+
margin-bottom: 16px;
+
opacity: 0.5;
+
}
+
+
.signature-count {
+
font-size: 14px;
+
color: #536471;
+
margin-bottom: 16px;
+
text-align: center;
+
}
+
</style>
+
+
<div class="guestbook-display">
+
<h2>RECENT ENTRIES</h2>
+
<div id="content"></div>
+
</div>
+
`;
+
+
this.updateContent();
+
}
+
+
private updateContent() {
+
const contentDiv = this.shadowRoot?.querySelector('#content');
+
if (!contentDiv) {
+
return;
+
}
+
+
if (this.loading) {
+
contentDiv.innerHTML = `
+
<div class="loading">
+
<div class="spinner"></div>
+
<p>Loading signatures...</p>
+
</div>
+
`;
+
return;
+
}
+
+
if (this.error) {
+
contentDiv.innerHTML = `
+
<div class="error">
+
<p><strong>Error:</strong> ${this.error}</p>
+
</div>
+
`;
+
return;
+
}
+
+
if (this.signatures.length === 0) {
+
contentDiv.innerHTML = `
+
<div class="empty">
+
<div class="empty-icon">✍️</div>
+
<p>No signatures yet. Be the first to sign!</p>
+
</div>
+
`;
+
return;
+
}
+
+
// render signatures
+
const signaturesHtml = this.signatures
+
.map((sig) => this.renderSignature(sig))
+
.join('');
+
+
contentDiv.innerHTML = `
+
<div class="signature-count">
+
${this.signatures.length} signature${this.signatures.length !== 1 ? 's' : ''}
+
</div>
+
<div class="signatures-list">
+
${signaturesHtml}
+
</div>
+
`;
+
}
+
+
private renderSignature(sig: GuestbookSignature): string {
+
const timestamp = this.formatTimestamp(sig.value.createdAt);
+
const authorIdentifier = sig.authorHandle || sig.author;
+
const authorLink = `https://bsky.app/profile/${sig.authorHandle || sig.author}`;
+
const displayName = sig.authorHandle || this.shortenDid(sig.author);
+
+
return `
+
<div class="signature-card">
+
<div class="signature-header">
+
<div class="author">
+
<a href="${authorLink}" target="_blank" rel="noopener noreferrer">
+
${this.escapeHtml(displayName)}
+
</a>
+
</div>
+
<div class="timestamp">${timestamp}</div>
+
</div>
+
<div class="message">${this.escapeHtml(sig.value.message)}</div>
+
</div>
+
`;
+
}
+
+
private async fetchSignatures() {
+
const did = this.getAttribute('did');
+
if (!did) {
+
this.error = 'Missing did attribute';
+
this.render();
+
return;
+
}
+
+
// subject is just the DID (at-identifier format)
+
const subject = did;
+
+
const limit = parseInt(this.getAttribute('limit') || '50', 10);
+
+
this.loading = true;
+
this.error = null;
+
this.updateContent();
+
+
try {
+
// query constellation for backlinks
+
// source format: collection:field.path
+
// constellation is not in atproto schemas, so we use a direct fetch
+
const url = new URL('/xrpc/blue.microcosm.links.getBacklinks', 'https://constellation.microcosm.blue');
+
url.searchParams.set('subject', subject);
+
url.searchParams.set('source', 'pet.nkp.guestbook.sign:subject');
+
url.searchParams.set('limit', limit.toString());
+
+
const response = await fetch(url.toString());
+
if (!response.ok) {
+
throw new Error('Failed to fetch signatures from Constellation');
+
}
+
+
const data: ConstellationBacklinksResponse = await response.json();
+
+
console.log('Constellation response:', data);
+
+
// fetch actual records
+
if (!data.records || !Array.isArray(data.records)) {
+
console.warn('No records found in response');
+
this.signatures = [];
+
} else {
+
// fetch each record from the repository
+
const signatures: GuestbookSignature[] = [];
+
+
for (const record of data.records) {
+
try {
+
const recordUrl = new URL('/xrpc/com.atproto.repo.getRecord', 'https://slingshot.wisp.place');
+
recordUrl.searchParams.set('repo', record.did);
+
recordUrl.searchParams.set('collection', record.collection);
+
recordUrl.searchParams.set('rkey', record.rkey);
+
+
const recordResponse = await fetch(recordUrl.toString());
+
if (!recordResponse.ok) {
+
console.warn(`Failed to fetch record ${record.did}/${record.collection}/${record.rkey}`);
+
continue;
+
}
+
+
const recordData = await recordResponse.json();
+
+
// validate the record
+
if (
+
recordData.value &&
+
recordData.value.$type === 'pet.nkp.guestbook.sign' &&
+
typeof recordData.value.message === 'string' &&
+
typeof recordData.value.createdAt === 'string'
+
) {
+
// Fetch the handle for this author
+
let authorHandle: string | undefined;
+
try {
+
const profileResponse = await fetch(
+
`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${record.did}`
+
);
+
if (profileResponse.ok) {
+
const profileData = await profileResponse.json();
+
authorHandle = profileData.handle;
+
}
+
} catch (err) {
+
console.warn(`Failed to fetch handle for ${record.did}:`, err);
+
}
+
+
signatures.push({
+
uri: recordData.uri,
+
cid: recordData.cid,
+
value: recordData.value,
+
author: record.did,
+
authorHandle: authorHandle,
+
});
+
}
+
} catch (err) {
+
console.warn(`Error fetching record ${record.did}/${record.collection}/${record.rkey}:`, err);
+
}
+
}
+
+
// sort by creation time, newest first
+
this.signatures = signatures.sort((a, b) => {
+
return new Date(b.value.createdAt).getTime() - new Date(a.value.createdAt).getTime();
+
});
+
}
+
+
this.loading = false;
+
this.updateContent();
+
+
} catch (error) {
+
console.error('Error fetching signatures:', error);
+
this.error = error instanceof Error ? error.message : 'Unknown error occurred';
+
this.loading = false;
+
this.updateContent();
+
}
+
}
+
+
private formatTimestamp(isoString: string): string {
+
const date = new Date(isoString);
+
// Format as "Nov 24, 2024"
+
return date.toLocaleDateString('en-US', {
+
month: 'short',
+
day: 'numeric',
+
year: 'numeric',
+
});
+
}
+
+
private shortenDid(did: string): string {
+
if (did.startsWith('did:plc:')) {
+
return `${did.slice(0, 16)}...${did.slice(-4)}`;
+
}
+
return did;
+
}
+
+
private escapeHtml(text: string): string {
+
const div = document.createElement('div');
+
div.textContent = text;
+
return div.innerHTML;
+
}
+
+
/**
+
* refresh signatures from the API
+
*/
+
refresh() {
+
this.fetchSignatures();
+
}
+
}
+
+489
lib/guestbook-sign.ts
···
+
import { Client } from '@atcute/client';
+
import type {} from '@atcute/atproto';
+
import {
+
createAuthorizationUrl,
+
finalizeAuthorization,
+
OAuthUserAgent,
+
} from '@atcute/oauth-browser-client';
+
import { getConfig } from './config';
+
+
// Actor typeahead web component
+
import 'actor-typeahead';
+
+
// Global agent instance
+
let globalAgent: OAuthUserAgent | null = null;
+
+
// Helper function to wait
+
const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
+
+
/**
+
* Web component for signing the guestbook.
+
*
+
* Usage:
+
* <guestbook-sign did="did:web:nekomimi.pet"></guestbook-sign>
+
*/
+
export class GuestbookSignElement extends HTMLElement {
+
private form: HTMLFormElement | null = null;
+
private messageInput: HTMLTextAreaElement | null = null;
+
private submitButton: HTMLButtonElement | null = null;
+
private statusDiv: HTMLDivElement | null = null;
+
private loginInput: HTMLInputElement | null = null;
+
private loginButton: HTMLButtonElement | null = null;
+
private userHandle: string | null = null;
+
+
static get observedAttributes() {
+
return ['did'];
+
}
+
+
constructor() {
+
super();
+
this.attachShadow({ mode: 'open' });
+
}
+
+
async connectedCallback() {
+
await this.initializeAuth();
+
if (globalAgent) {
+
await this.fetchUserHandle();
+
}
+
this.render();
+
this.attachEventListeners();
+
}
+
+
private async fetchUserHandle() {
+
if (!globalAgent) return;
+
+
try {
+
const response = await fetch(
+
`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${globalAgent.session.info.sub}`
+
);
+
if (response.ok) {
+
const data = await response.json();
+
this.userHandle = data.handle || null;
+
}
+
} catch (error) {
+
console.error('Failed to fetch user handle:', error);
+
}
+
}
+
+
private async initializeAuth() {
+
// Check if we have OAuth parameters in the hash (returning from OAuth)
+
if (location.hash.length > 1) {
+
const params = new URLSearchParams(location.hash.slice(1));
+
+
if (params.has('state') && (params.has('code') || params.has('error'))) {
+
try {
+
// Scrub the parameters from history to prevent replay
+
history.replaceState(null, '', location.pathname + location.search);
+
+
// Finalize the authorization and get the result
+
const result = await finalizeAuthorization(params);
+
+
// Create the OAuth user agent with the session
+
globalAgent = new OAuthUserAgent(result.session);
+
+
console.log('Authorization successful! Logged in as:', result.session.info.sub);
+
+
} catch (error) {
+
console.error('Failed to finalize authorization:', error);
+
alert('Login failed. Please try again.');
+
}
+
}
+
}
+
}
+
+
private render() {
+
if (!this.shadowRoot) {
+
return;
+
}
+
+
const isLoggedIn = globalAgent !== null;
+
+
this.shadowRoot.innerHTML = `
+
<style>
+
* {
+
box-sizing: border-box;
+
margin: 0;
+
padding: 0;
+
}
+
+
:host {
+
display: block;
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+
-webkit-font-smoothing: antialiased;
+
-moz-osx-font-smoothing: grayscale;
+
}
+
+
.guestbook-sign {
+
background: #f9fafb;
+
padding: 0;
+
width: 100%;
+
}
+
+
h2 {
+
margin: 0 0 24px 0;
+
font-size: 11px;
+
font-weight: 700;
+
color: #000;
+
text-transform: uppercase;
+
letter-spacing: 0.05em;
+
}
+
+
.form-group {
+
margin-bottom: 24px;
+
}
+
+
label {
+
display: block;
+
margin-bottom: 8px;
+
font-size: 14px;
+
font-weight: 600;
+
color: #000;
+
}
+
+
textarea, input[type="text"] {
+
width: 100%;
+
padding: 12px 16px;
+
border: 1px solid #e5e7eb;
+
border-radius: 6px;
+
font-family: inherit;
+
font-size: 15px;
+
background: white;
+
box-sizing: border-box;
+
transition: border-color 0.2s, box-shadow 0.2s;
+
}
+
+
textarea {
+
min-height: 120px;
+
resize: vertical;
+
}
+
+
textarea:focus, input[type="text"]:focus {
+
outline: none;
+
border-color: #a1a1aa;
+
box-shadow: 0 0 0 2px rgba(161, 161, 170, 0.2);
+
}
+
+
textarea::placeholder, input[type="text"]::placeholder {
+
color: #9ca3af;
+
}
+
+
.char-count {
+
display: none;
+
}
+
+
button {
+
width: 100%;
+
background: #18181b;
+
color: white;
+
border: none;
+
border-radius: 6px;
+
padding: 12px 24px;
+
font-size: 15px;
+
font-weight: 500;
+
cursor: pointer;
+
transition: background-color 0.2s;
+
}
+
+
button:hover:not(:disabled) {
+
background: #27272a;
+
}
+
+
button:disabled {
+
background: #d1d5db;
+
cursor: not-allowed;
+
}
+
+
.status {
+
margin-top: 16px;
+
padding: 12px;
+
border-radius: 8px;
+
font-size: 14px;
+
display: none;
+
}
+
+
.status.show {
+
display: block;
+
}
+
+
.status.success {
+
background: #ecfdf5;
+
color: #065f46;
+
border: 1px solid #d1fae5;
+
}
+
+
.status.error {
+
background: #fef2f2;
+
color: #991b1b;
+
border: 1px solid #fecaca;
+
}
+
+
.status.loading {
+
background: #eff6ff;
+
color: #1e40af;
+
border: 1px solid #dbeafe;
+
}
+
+
.login-prompt {
+
display: none;
+
}
+
</style>
+
+
<div class="guestbook-sign">
+
<h2>SIGN</h2>
+
${!isLoggedIn ? `
+
<form id="login-form">
+
<div class="form-group">
+
<label for="handle">AT Proto Handle</label>
+
<actor-typeahead>
+
<input
+
type="text"
+
id="handle"
+
name="handle"
+
placeholder="user.bsky.social"
+
autocomplete="username"
+
required
+
/>
+
</actor-typeahead>
+
</div>
+
<button type="submit" id="login-btn">Sign in to Continue</button>
+
<div class="status" id="status"></div>
+
</form>
+
` : `
+
<form id="sign-form">
+
<div class="form-group">
+
<label for="name">Name</label>
+
<input
+
type="text"
+
id="name"
+
name="name"
+
placeholder="Your name"
+
value="${this.userHandle || globalAgent?.session.info.sub || ''}"
+
readonly
+
/>
+
</div>
+
<div class="form-group">
+
<label for="message">Message</label>
+
<textarea
+
id="message"
+
name="message"
+
placeholder="Share your thoughts..."
+
maxlength="100"
+
required
+
></textarea>
+
</div>
+
<button type="submit" id="submit-btn">Sign Guestbook</button>
+
<div class="status" id="status"></div>
+
</form>
+
`}
+
</div>
+
`;
+
+
if (isLoggedIn) {
+
this.form = this.shadowRoot.querySelector('#sign-form');
+
this.messageInput = this.shadowRoot.querySelector('#message');
+
this.submitButton = this.shadowRoot.querySelector('#submit-btn');
+
} else {
+
this.form = this.shadowRoot.querySelector('#login-form');
+
this.loginInput = this.shadowRoot.querySelector('#handle');
+
this.loginButton = this.shadowRoot.querySelector('#login-btn');
+
}
+
+
this.statusDiv = this.shadowRoot.querySelector('#status');
+
}
+
+
private attachEventListeners() {
+
if (!this.form) {
+
return;
+
}
+
+
const isLoggedIn = globalAgent !== null;
+
+
if (isLoggedIn && this.messageInput) {
+
// character counter
+
this.messageInput.addEventListener('input', () => {
+
this.updateCharCount();
+
});
+
+
// form submission for signing
+
this.form.addEventListener('submit', (e) => {
+
e.preventDefault();
+
this.handleSubmit();
+
});
+
} else {
+
// form submission for login
+
this.form.addEventListener('submit', (e) => {
+
e.preventDefault();
+
this.handleLogin();
+
});
+
}
+
}
+
+
private updateCharCount() {
+
if (!this.messageInput || !this.shadowRoot) {
+
return;
+
}
+
+
const length = this.messageInput.value.length;
+
const charCountEl = this.shadowRoot.querySelector('#char-count');
+
+
if (charCountEl) {
+
charCountEl.textContent = `${length} / 100`;
+
charCountEl.classList.remove('warning', 'error');
+
+
if (length > 90) {
+
charCountEl.classList.add('error');
+
} else if (length > 80) {
+
charCountEl.classList.add('warning');
+
}
+
}
+
}
+
+
private async handleLogin() {
+
const handle = this.loginInput?.value.trim();
+
+
if (!handle) {
+
this.showStatus('Please enter your Bluesky handle.', 'error');
+
return;
+
}
+
+
try {
+
this.showStatus('Redirecting to sign in...', 'loading');
+
this.setFormDisabled(true);
+
+
const config = getConfig();
+
if (!config) {
+
throw new Error('Guestbook not configured. Call configureGuestbook() first.');
+
}
+
+
const authUrl = await createAuthorizationUrl({
+
target: { type: 'account', identifier: handle as `${string}.${string}` },
+
scope: config.oauth.scope,
+
});
+
+
// recommended to wait for the browser to persist local storage before proceeding
+
await sleep(250);
+
+
// redirect the user to sign in and authorize the app
+
window.location.assign(authUrl);
+
+
} catch (error) {
+
console.error('Login error:', error);
+
this.showStatus('Login failed. Please try again.', 'error');
+
this.setFormDisabled(false);
+
}
+
}
+
+
private async handleSubmit() {
+
if (!globalAgent) {
+
this.showStatus('Please log in first.', 'error');
+
return;
+
}
+
+
const did = this.getAttribute('did');
+
if (!did) {
+
this.showStatus('Missing guestbook DID.', 'error');
+
return;
+
}
+
+
// subject is just the DID (at-identifier format)
+
const subject = did;
+
+
const message = this.messageInput?.value.trim();
+
if (!message) {
+
this.showStatus('Please enter a message.', 'error');
+
return;
+
}
+
+
try {
+
this.showStatus('Signing guestbook...', 'loading');
+
this.setFormDisabled(true);
+
+
// get the client from the OAuth agent
+
const client = new Client({ handler: globalAgent });
+
+
// create the record
+
const record = {
+
$type: 'pet.nkp.guestbook.sign',
+
subject: subject,
+
message: message,
+
createdAt: new Date().toISOString(),
+
};
+
+
const response = await client.post('com.atproto.repo.createRecord', {
+
input: {
+
repo: globalAgent.session.info.sub, // user's DID
+
collection: 'pet.nkp.guestbook.sign',
+
record: record,
+
},
+
});
+
+
if (response.ok) {
+
this.showStatus('✓ Successfully signed the guestbook!', 'success');
+
+
// clear the form
+
if (this.messageInput) {
+
this.messageInput.value = '';
+
}
+
this.updateCharCount();
+
+
// dispatch custom event for parent to listen to
+
this.dispatchEvent(new CustomEvent('sign-created', {
+
detail: {
+
uri: response.data.uri,
+
cid: response.data.cid,
+
},
+
bubbles: true,
+
composed: true,
+
}));
+
+
// hide success message after 3 seconds
+
setTimeout(() => {
+
this.hideStatus();
+
}, 3000);
+
} else {
+
throw new Error('Failed to create record');
+
}
+
} catch (error) {
+
console.error('Error signing guestbook:', error);
+
this.showStatus(
+
`Failed to sign: ${error instanceof Error ? error.message : 'Unknown error'}`,
+
'error'
+
);
+
} finally {
+
this.setFormDisabled(false);
+
}
+
}
+
+
private showStatus(message: string, type: 'success' | 'error' | 'loading') {
+
if (!this.statusDiv) {
+
return;
+
}
+
+
this.statusDiv.textContent = message;
+
this.statusDiv.className = `status show ${type}`;
+
}
+
+
private hideStatus() {
+
if (!this.statusDiv) {
+
return;
+
}
+
+
this.statusDiv.classList.remove('show');
+
}
+
+
private setFormDisabled(disabled: boolean) {
+
if (this.messageInput) {
+
this.messageInput.disabled = disabled;
+
}
+
if (this.submitButton) {
+
this.submitButton.disabled = disabled;
+
}
+
if (this.loginInput) {
+
this.loginInput.disabled = disabled;
+
}
+
if (this.loginButton) {
+
this.loginButton.disabled = disabled;
+
}
+
}
+
}
+
+11
lib/index.ts
···
+
// Core component exports
+
export { GuestbookSignElement } from './guestbook-sign';
+
export { GuestbookDisplayElement } from './guestbook-display';
+
+
// Configuration
+
export { configureGuestbook, isConfigured, getConfig } from './config';
+
export type { GuestbookConfig } from './config';
+
+
// Types
+
export type { GuestbookSignature } from './guestbook-display';
+
+28
lib/register.ts
···
+
/**
+
* Register guestbook custom elements.
+
* Import this file to auto-register the components.
+
*/
+
import { GuestbookSignElement } from './guestbook-sign';
+
import { GuestbookDisplayElement } from './guestbook-display';
+
+
// Register custom elements if not already registered
+
if (!customElements.get('guestbook-sign')) {
+
customElements.define('guestbook-sign', GuestbookSignElement);
+
}
+
+
if (!customElements.get('guestbook-display')) {
+
customElements.define('guestbook-display', GuestbookDisplayElement);
+
}
+
+
// Re-export for convenience
+
export { GuestbookSignElement, GuestbookDisplayElement };
+
export { configureGuestbook, isConfigured, getConfig } from './config';
+
export type { GuestbookConfig } from './config';
+
+
// Add to global declarations for TypeScript
+
declare global {
+
interface HTMLElementTagNameMap {
+
'guestbook-sign': GuestbookSignElement;
+
'guestbook-display': GuestbookDisplayElement;
+
}
+
}
+2627
package-lock.json
···
+
{
+
"name": "@aspect/guestbook",
+
"version": "0.1.0",
+
"lockfileVersion": 3,
+
"requires": true,
+
"packages": {
+
"": {
+
"name": "@aspect/guestbook",
+
"version": "0.1.0",
+
"dependencies": {
+
"actor-typeahead": "^0.1.2"
+
},
+
"devDependencies": {
+
"@atcute/atproto": "^3.1.9",
+
"@atcute/client": "^4.1.0",
+
"@atcute/identity-resolver": "^1.1.4",
+
"@atcute/lex-cli": "^2.5.0",
+
"@atcute/lexicon-doc": "^2.0.4",
+
"@atcute/oauth-browser-client": "^2.0.1",
+
"@sveltejs/vite-plugin-svelte": "^6.2.1",
+
"@tsconfig/svelte": "^5.0.6",
+
"@types/node": "^24.10.1",
+
"svelte": "^5.43.8",
+
"svelte-check": "^4.3.4",
+
"typescript": "~5.9.3",
+
"vite": "npm:rolldown-vite@7.2.5",
+
"vite-plugin-dts": "^4.5.4"
+
},
+
"peerDependencies": {
+
"@atcute/client": "^4.0.0",
+
"@atcute/identity-resolver": "^1.0.0",
+
"@atcute/oauth-browser-client": "^2.0.0"
+
}
+
},
+
"node_modules/@atcute/atproto": {
+
"version": "3.1.9",
+
"resolved": "https://registry.npmjs.org/@atcute/atproto/-/atproto-3.1.9.tgz",
+
"integrity": "sha512-DyWwHCTdR4hY2BPNbLXgVmm7lI+fceOwWbE4LXbGvbvVtSn+ejSVFaAv01Ra3kWDha0whsOmbJL8JP0QPpf1+w==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/lexicons": "^1.2.2"
+
}
+
},
+
"node_modules/@atcute/car": {
+
"version": "5.0.0",
+
"resolved": "https://registry.npmjs.org/@atcute/car/-/car-5.0.0.tgz",
+
"integrity": "sha512-OIY2xTXv8lSpZsDSn/UYQtJSMvDw5Hi4Q+uyvmiqSM+fht08QRAEq/nxa5YFciPZ3nfDFnZ3//EgJw7QhkSXLQ==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/cbor": "^2.2.7",
+
"@atcute/cid": "^2.2.6",
+
"@atcute/uint8array": "^1.0.5",
+
"@atcute/varint": "^1.0.3"
+
}
+
},
+
"node_modules/@atcute/cbor": {
+
"version": "2.2.8",
+
"resolved": "https://registry.npmjs.org/@atcute/cbor/-/cbor-2.2.8.tgz",
+
"integrity": "sha512-UzOAN9BuN6JCXgn0ryV8qZuRJUDrNqrbLd6EFM8jc6RYssjRyGRxNy6RZ1NU/07Hd8Tq/0pz8+nQiMu5Zai5uw==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/cid": "^2.2.6",
+
"@atcute/multibase": "^1.1.6",
+
"@atcute/uint8array": "^1.0.5"
+
}
+
},
+
"node_modules/@atcute/cid": {
+
"version": "2.2.6",
+
"resolved": "https://registry.npmjs.org/@atcute/cid/-/cid-2.2.6.tgz",
+
"integrity": "sha512-bTAHHbJ24p+E//V4KCS4xdmd39o211jJswvqQOevj7vk+5IYcgDLx1ryZWZ1sEPOo9x875li/kj5gpKL14RDwQ==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/multibase": "^1.1.6",
+
"@atcute/uint8array": "^1.0.5"
+
}
+
},
+
"node_modules/@atcute/client": {
+
"version": "4.1.0",
+
"resolved": "https://registry.npmjs.org/@atcute/client/-/client-4.1.0.tgz",
+
"integrity": "sha512-AYhSu3RSDA2VDkVGOmad320NRbUUUf5pCFWJcOzlk25YC/4kyzmMFfpzhf1jjjEcY+anNBXGGhav/kKB1evggQ==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/identity": "^1.1.3",
+
"@atcute/lexicons": "^1.2.5"
+
}
+
},
+
"node_modules/@atcute/crypto": {
+
"version": "2.2.6",
+
"resolved": "https://registry.npmjs.org/@atcute/crypto/-/crypto-2.2.6.tgz",
+
"integrity": "sha512-vkuexF+kmrKE1/Uqzub99Qi4QpnxA2jbu60E6PTgL4XypELQ6rb59MB/J1VbY2gs0kd3ET7+L3+NWpKD5nXyfA==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/multibase": "^1.1.6",
+
"@atcute/uint8array": "^1.0.5",
+
"@noble/secp256k1": "^3.0.0"
+
}
+
},
+
"node_modules/@atcute/identity": {
+
"version": "1.1.3",
+
"resolved": "https://registry.npmjs.org/@atcute/identity/-/identity-1.1.3.tgz",
+
"integrity": "sha512-oIqPoI8TwWeQxvcLmFEZLdN2XdWcaLVtlm8pNk0E72As9HNzzD9pwKPrLr3rmTLRIoULPPFmq9iFNsTeCIU9ng==",
+
"dev": true,
+
"license": "0BSD",
+
"peer": true,
+
"dependencies": {
+
"@atcute/lexicons": "^1.2.4",
+
"@badrap/valita": "^0.4.6"
+
}
+
},
+
"node_modules/@atcute/identity-resolver": {
+
"version": "1.1.4",
+
"resolved": "https://registry.npmjs.org/@atcute/identity-resolver/-/identity-resolver-1.1.4.tgz",
+
"integrity": "sha512-/SVh8vf2cXFJenmBnGeYF2aY3WGQm3cJeew5NWTlkqoy3LvJ5wkvKq9PWu4Tv653VF40rPOp6LOdVr9Fa+q5rA==",
+
"dev": true,
+
"license": "0BSD",
+
"peer": true,
+
"dependencies": {
+
"@atcute/lexicons": "^1.2.2",
+
"@atcute/util-fetch": "^1.0.3",
+
"@badrap/valita": "^0.4.6"
+
},
+
"peerDependencies": {
+
"@atcute/identity": "^1.0.0"
+
}
+
},
+
"node_modules/@atcute/lex-cli": {
+
"version": "2.5.0",
+
"resolved": "https://registry.npmjs.org/@atcute/lex-cli/-/lex-cli-2.5.0.tgz",
+
"integrity": "sha512-mIla9XeK9HJqFW0m/FaHI3+wIQlUL3PJYFpGmlXVwJISQVHASvWpU6gCHSYtAySZTrfVDv73fsVDBkpw9mnTjA==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/identity": "^1.1.3",
+
"@atcute/identity-resolver": "^1.1.4",
+
"@atcute/lexicon-doc": "^2.0.3",
+
"@atcute/lexicon-resolver": "^0.1.4",
+
"@atcute/lexicons": "^1.2.5",
+
"@badrap/valita": "^0.4.6",
+
"@optique/core": "^0.6.3",
+
"@optique/run": "^0.6.3",
+
"picocolors": "^1.1.1",
+
"prettier": "^3.6.2"
+
},
+
"bin": {
+
"lex-cli": "cli.mjs"
+
}
+
},
+
"node_modules/@atcute/lexicon-doc": {
+
"version": "2.0.4",
+
"resolved": "https://registry.npmjs.org/@atcute/lexicon-doc/-/lexicon-doc-2.0.4.tgz",
+
"integrity": "sha512-YfwlYFoYiBvRIYG0I1zsINCTFugFtS8l67uT3nQ04zdKVflzdg8uUj8cNZYRNY1V7okoOPdikhR4kPFhYGyemw==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/identity": "^1.1.3",
+
"@atcute/lexicons": "^1.2.5",
+
"@badrap/valita": "^0.4.6"
+
}
+
},
+
"node_modules/@atcute/lexicon-resolver": {
+
"version": "0.1.5",
+
"resolved": "https://registry.npmjs.org/@atcute/lexicon-resolver/-/lexicon-resolver-0.1.5.tgz",
+
"integrity": "sha512-0bx1/zdMQPuxvRcHW6ykAxRxktC2rEZLoAVSFoLSWDAA92Tf09F9QPK5wgXSF4MNODm1dvzMEdWSMIvlg8sr3A==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/crypto": "^2.2.6",
+
"@atcute/lexicon-doc": "^2.0.4",
+
"@atcute/lexicons": "^1.2.5",
+
"@atcute/repo": "^0.1.0",
+
"@atcute/util-fetch": "^1.0.4",
+
"@badrap/valita": "^0.4.6"
+
},
+
"peerDependencies": {
+
"@atcute/identity": "^1.1.0",
+
"@atcute/identity-resolver": "^1.1.3"
+
}
+
},
+
"node_modules/@atcute/lexicons": {
+
"version": "1.2.5",
+
"resolved": "https://registry.npmjs.org/@atcute/lexicons/-/lexicons-1.2.5.tgz",
+
"integrity": "sha512-9yO9WdgxW8jZ7SbzUycH710z+JmsQ9W9n5S6i6eghYju32kkluFmgBeS47r8e8p2+Dv4DemS7o/3SUGsX9FR5Q==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@standard-schema/spec": "^1.0.0",
+
"esm-env": "^1.2.2"
+
}
+
},
+
"node_modules/@atcute/mst": {
+
"version": "0.1.0",
+
"resolved": "https://registry.npmjs.org/@atcute/mst/-/mst-0.1.0.tgz",
+
"integrity": "sha512-h+iDToKEnBpigk2DOHjSqY63vJtjYKUIztqu1CZ0P+I54wV2SrgoqAXAT1xrW6A1Iup8cjTv+U2H5WVG4KxPLw==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/cbor": "^2.2.7",
+
"@atcute/cid": "^2.2.6",
+
"@atcute/uint8array": "^1.0.5"
+
}
+
},
+
"node_modules/@atcute/multibase": {
+
"version": "1.1.6",
+
"resolved": "https://registry.npmjs.org/@atcute/multibase/-/multibase-1.1.6.tgz",
+
"integrity": "sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/uint8array": "^1.0.5"
+
}
+
},
+
"node_modules/@atcute/oauth-browser-client": {
+
"version": "2.0.1",
+
"resolved": "https://registry.npmjs.org/@atcute/oauth-browser-client/-/oauth-browser-client-2.0.1.tgz",
+
"integrity": "sha512-lG021GkeORG06zfFf4bH85egObjBEKHNgAWHvbtY/E2dX4wxo88hf370pJDx8acdnuUJLJ2VKPikJtZwo4Heeg==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/client": "^4.0.5",
+
"@atcute/identity": "^1.1.1",
+
"@atcute/identity-resolver": "^1.1.4",
+
"@atcute/lexicons": "^1.2.2",
+
"@atcute/multibase": "^1.1.6",
+
"@atcute/uint8array": "^1.0.5",
+
"nanoid": "^5.1.5"
+
}
+
},
+
"node_modules/@atcute/oauth-browser-client/node_modules/nanoid": {
+
"version": "5.1.6",
+
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz",
+
"integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"bin": {
+
"nanoid": "bin/nanoid.js"
+
},
+
"engines": {
+
"node": "^18 || >=20"
+
}
+
},
+
"node_modules/@atcute/repo": {
+
"version": "0.1.0",
+
"resolved": "https://registry.npmjs.org/@atcute/repo/-/repo-0.1.0.tgz",
+
"integrity": "sha512-INiYAuma8dydBu7cqd2WVpcXh3mzhIepYBUqFWAK5MqMulPRLTRCc/9GW3G9pxYrOdlvLCVamG2Jf8XK0nuFEw==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/car": "^5.0.0",
+
"@atcute/cbor": "^2.2.7",
+
"@atcute/cid": "^2.2.6",
+
"@atcute/crypto": "^2.2.5",
+
"@atcute/lexicons": "^1.2.2",
+
"@atcute/mst": "^0.1.0",
+
"@atcute/uint8array": "^1.0.5"
+
}
+
},
+
"node_modules/@atcute/uint8array": {
+
"version": "1.0.5",
+
"resolved": "https://registry.npmjs.org/@atcute/uint8array/-/uint8array-1.0.5.tgz",
+
"integrity": "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q==",
+
"dev": true,
+
"license": "0BSD"
+
},
+
"node_modules/@atcute/util-fetch": {
+
"version": "1.0.4",
+
"resolved": "https://registry.npmjs.org/@atcute/util-fetch/-/util-fetch-1.0.4.tgz",
+
"integrity": "sha512-sIU9Qk0dE8PLEXSfhy+gIJV+HpiiknMytCI2SqLlqd0vgZUtEKI/EQfP+23LHWvP+CLCzVDOa6cpH045OlmNBg==",
+
"dev": true,
+
"license": "0BSD",
+
"dependencies": {
+
"@badrap/valita": "^0.4.6"
+
}
+
},
+
"node_modules/@atcute/varint": {
+
"version": "1.0.3",
+
"resolved": "https://registry.npmjs.org/@atcute/varint/-/varint-1.0.3.tgz",
+
"integrity": "sha512-fdvMPyBB+McDT+Ai5e9RwEbwYV4yjZ60S2Dn5PTjGqUyxvoCH1z42viuheDZRUDkmfQehXJTZ5az7dSozVNtog==",
+
"dev": true,
+
"license": "0BSD"
+
},
+
"node_modules/@babel/helper-string-parser": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-validator-identifier": {
+
"version": "7.28.5",
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/parser": {
+
"version": "7.28.5",
+
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
+
"integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/types": "^7.28.5"
+
},
+
"bin": {
+
"parser": "bin/babel-parser.js"
+
},
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@babel/types": {
+
"version": "7.28.5",
+
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
+
"integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-string-parser": "^7.27.1",
+
"@babel/helper-validator-identifier": "^7.28.5"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@badrap/valita": {
+
"version": "0.4.6",
+
"resolved": "https://registry.npmjs.org/@badrap/valita/-/valita-0.4.6.tgz",
+
"integrity": "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 18"
+
}
+
},
+
"node_modules/@emnapi/core": {
+
"version": "1.7.1",
+
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz",
+
"integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==",
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"dependencies": {
+
"@emnapi/wasi-threads": "1.1.0",
+
"tslib": "^2.4.0"
+
}
+
},
+
"node_modules/@emnapi/runtime": {
+
"version": "1.7.1",
+
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz",
+
"integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==",
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"dependencies": {
+
"tslib": "^2.4.0"
+
}
+
},
+
"node_modules/@emnapi/wasi-threads": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+
"integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"dependencies": {
+
"tslib": "^2.4.0"
+
}
+
},
+
"node_modules/@isaacs/balanced-match": {
+
"version": "4.0.1",
+
"resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+
"integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "20 || >=22"
+
}
+
},
+
"node_modules/@isaacs/brace-expansion": {
+
"version": "5.0.0",
+
"resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+
"integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@isaacs/balanced-match": "^4.0.1"
+
},
+
"engines": {
+
"node": "20 || >=22"
+
}
+
},
+
"node_modules/@jridgewell/gen-mapping": {
+
"version": "0.3.13",
+
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/sourcemap-codec": "^1.5.0",
+
"@jridgewell/trace-mapping": "^0.3.24"
+
}
+
},
+
"node_modules/@jridgewell/remapping": {
+
"version": "2.3.5",
+
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/gen-mapping": "^0.3.5",
+
"@jridgewell/trace-mapping": "^0.3.24"
+
}
+
},
+
"node_modules/@jridgewell/resolve-uri": {
+
"version": "3.1.2",
+
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@jridgewell/sourcemap-codec": {
+
"version": "1.5.5",
+
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@jridgewell/trace-mapping": {
+
"version": "0.3.31",
+
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/resolve-uri": "^3.1.0",
+
"@jridgewell/sourcemap-codec": "^1.4.14"
+
}
+
},
+
"node_modules/@microsoft/api-extractor": {
+
"version": "7.55.1",
+
"resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.55.1.tgz",
+
"integrity": "sha512-l8Z+8qrLkZFM3HM95Dbpqs6G39fpCa7O5p8A7AkA6hSevxkgwsOlLrEuPv0ADOyj5dI1Af5WVDiwpKG/ya5G3w==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@microsoft/api-extractor-model": "7.32.1",
+
"@microsoft/tsdoc": "~0.16.0",
+
"@microsoft/tsdoc-config": "~0.18.0",
+
"@rushstack/node-core-library": "5.19.0",
+
"@rushstack/rig-package": "0.6.0",
+
"@rushstack/terminal": "0.19.4",
+
"@rushstack/ts-command-line": "5.1.4",
+
"diff": "~8.0.2",
+
"lodash": "~4.17.15",
+
"minimatch": "10.0.3",
+
"resolve": "~1.22.1",
+
"semver": "~7.5.4",
+
"source-map": "~0.6.1",
+
"typescript": "5.8.2"
+
},
+
"bin": {
+
"api-extractor": "bin/api-extractor"
+
}
+
},
+
"node_modules/@microsoft/api-extractor-model": {
+
"version": "7.32.1",
+
"resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.1.tgz",
+
"integrity": "sha512-u4yJytMYiUAnhcNQcZDTh/tVtlrzKlyKrQnLOV+4Qr/5gV+cpufWzCYAB1Q23URFqD6z2RoL2UYncM9xJVGNKA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@microsoft/tsdoc": "~0.16.0",
+
"@microsoft/tsdoc-config": "~0.18.0",
+
"@rushstack/node-core-library": "5.19.0"
+
}
+
},
+
"node_modules/@microsoft/api-extractor/node_modules/typescript": {
+
"version": "5.8.2",
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
+
"integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"bin": {
+
"tsc": "bin/tsc",
+
"tsserver": "bin/tsserver"
+
},
+
"engines": {
+
"node": ">=14.17"
+
}
+
},
+
"node_modules/@microsoft/tsdoc": {
+
"version": "0.16.0",
+
"resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz",
+
"integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@microsoft/tsdoc-config": {
+
"version": "0.18.0",
+
"resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz",
+
"integrity": "sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@microsoft/tsdoc": "0.16.0",
+
"ajv": "~8.12.0",
+
"jju": "~1.4.0",
+
"resolve": "~1.22.2"
+
}
+
},
+
"node_modules/@napi-rs/wasm-runtime": {
+
"version": "1.0.7",
+
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
+
"integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==",
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"dependencies": {
+
"@emnapi/core": "^1.5.0",
+
"@emnapi/runtime": "^1.5.0",
+
"@tybys/wasm-util": "^0.10.1"
+
}
+
},
+
"node_modules/@noble/secp256k1": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-3.0.0.tgz",
+
"integrity": "sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==",
+
"dev": true,
+
"license": "MIT",
+
"funding": {
+
"url": "https://paulmillr.com/funding/"
+
}
+
},
+
"node_modules/@optique/core": {
+
"version": "0.6.3",
+
"resolved": "https://registry.npmjs.org/@optique/core/-/core-0.6.3.tgz",
+
"integrity": "sha512-Aw7naHPeZr+YThJRrfk+Ds3OuAd7HUD1chsGncay+6crmLyrraXh0s0xDuJ52kCfNPdCTKAW3MG0XLcuEIr8qQ==",
+
"dev": true,
+
"funding": [
+
"https://github.com/sponsors/dahlia"
+
],
+
"license": "MIT",
+
"engines": {
+
"bun": ">=1.2.0",
+
"deno": ">=2.3.0",
+
"node": ">=20.0.0"
+
}
+
},
+
"node_modules/@optique/run": {
+
"version": "0.6.3",
+
"resolved": "https://registry.npmjs.org/@optique/run/-/run-0.6.3.tgz",
+
"integrity": "sha512-6zesLs4XLyFtG8s/JoG2VO/+plJVZhqbLK20yDm0hFEXrqcP+VCKTsoFAlWoWv4Us48V170SKH+8DZcxw8raJw==",
+
"dev": true,
+
"funding": [
+
"https://github.com/sponsors/dahlia"
+
],
+
"license": "MIT",
+
"dependencies": {
+
"@optique/core": "0.6.3"
+
},
+
"engines": {
+
"bun": ">=1.2.0",
+
"deno": ">=2.3.0",
+
"node": ">=20.0.0"
+
}
+
},
+
"node_modules/@oxc-project/runtime": {
+
"version": "0.97.0",
+
"resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.97.0.tgz",
+
"integrity": "sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@oxc-project/types": {
+
"version": "0.97.0",
+
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.97.0.tgz",
+
"integrity": "sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ==",
+
"dev": true,
+
"license": "MIT",
+
"funding": {
+
"url": "https://github.com/sponsors/Boshen"
+
}
+
},
+
"node_modules/@rolldown/binding-android-arm64": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.50.tgz",
+
"integrity": "sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-darwin-arm64": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.50.tgz",
+
"integrity": "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-darwin-x64": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.50.tgz",
+
"integrity": "sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-freebsd-x64": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.50.tgz",
+
"integrity": "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"freebsd"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.50.tgz",
+
"integrity": "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-linux-arm64-gnu": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.50.tgz",
+
"integrity": "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-linux-arm64-musl": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.50.tgz",
+
"integrity": "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-linux-x64-gnu": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.50.tgz",
+
"integrity": "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-linux-x64-musl": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.50.tgz",
+
"integrity": "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-openharmony-arm64": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.50.tgz",
+
"integrity": "sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"openharmony"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-wasm32-wasi": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.50.tgz",
+
"integrity": "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg==",
+
"cpu": [
+
"wasm32"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"dependencies": {
+
"@napi-rs/wasm-runtime": "^1.0.7"
+
},
+
"engines": {
+
"node": ">=14.0.0"
+
}
+
},
+
"node_modules/@rolldown/binding-win32-arm64-msvc": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.50.tgz",
+
"integrity": "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-win32-ia32-msvc": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.50.tgz",
+
"integrity": "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg==",
+
"cpu": [
+
"ia32"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/binding-win32-x64-msvc": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.50.tgz",
+
"integrity": "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/pluginutils": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.50.tgz",
+
"integrity": "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@rollup/pluginutils": {
+
"version": "5.3.0",
+
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
+
"integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@types/estree": "^1.0.0",
+
"estree-walker": "^2.0.2",
+
"picomatch": "^4.0.2"
+
},
+
"engines": {
+
"node": ">=14.0.0"
+
},
+
"peerDependencies": {
+
"rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+
},
+
"peerDependenciesMeta": {
+
"rollup": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@rushstack/node-core-library": {
+
"version": "5.19.0",
+
"resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.0.tgz",
+
"integrity": "sha512-BxAopbeWBvNJ6VGiUL+5lbJXywTdsnMeOS8j57Cn/xY10r6sV/gbsTlfYKjzVCUBZATX2eRzJHSMCchsMTGN6A==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ajv": "~8.13.0",
+
"ajv-draft-04": "~1.0.0",
+
"ajv-formats": "~3.0.1",
+
"fs-extra": "~11.3.0",
+
"import-lazy": "~4.0.0",
+
"jju": "~1.4.0",
+
"resolve": "~1.22.1",
+
"semver": "~7.5.4"
+
},
+
"peerDependencies": {
+
"@types/node": "*"
+
},
+
"peerDependenciesMeta": {
+
"@types/node": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@rushstack/node-core-library/node_modules/ajv": {
+
"version": "8.13.0",
+
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz",
+
"integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"fast-deep-equal": "^3.1.3",
+
"json-schema-traverse": "^1.0.0",
+
"require-from-string": "^2.0.2",
+
"uri-js": "^4.4.1"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/epoberezkin"
+
}
+
},
+
"node_modules/@rushstack/problem-matcher": {
+
"version": "0.1.1",
+
"resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz",
+
"integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==",
+
"dev": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/node": "*"
+
},
+
"peerDependenciesMeta": {
+
"@types/node": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@rushstack/rig-package": {
+
"version": "0.6.0",
+
"resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz",
+
"integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"resolve": "~1.22.1",
+
"strip-json-comments": "~3.1.1"
+
}
+
},
+
"node_modules/@rushstack/terminal": {
+
"version": "0.19.4",
+
"resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.4.tgz",
+
"integrity": "sha512-f4XQk02CrKfrMgyOfhYd3qWI944dLC21S4I/LUhrlAP23GTMDNG6EK5effQtFkISwUKCgD9vMBrJZaPSUquxWQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@rushstack/node-core-library": "5.19.0",
+
"@rushstack/problem-matcher": "0.1.1",
+
"supports-color": "~8.1.1"
+
},
+
"peerDependencies": {
+
"@types/node": "*"
+
},
+
"peerDependenciesMeta": {
+
"@types/node": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@rushstack/ts-command-line": {
+
"version": "5.1.4",
+
"resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.4.tgz",
+
"integrity": "sha512-H0I6VdJ6sOUbktDFpP2VW5N29w8v4hRoNZOQz02vtEi6ZTYL1Ju8u+TcFiFawUDrUsx/5MQTUhd79uwZZVwVlA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@rushstack/terminal": "0.19.4",
+
"@types/argparse": "1.0.38",
+
"argparse": "~1.0.9",
+
"string-argv": "~0.3.1"
+
}
+
},
+
"node_modules/@standard-schema/spec": {
+
"version": "1.0.0",
+
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
+
"integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@sveltejs/acorn-typescript": {
+
"version": "1.0.7",
+
"resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.7.tgz",
+
"integrity": "sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==",
+
"dev": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"acorn": "^8.9.0"
+
}
+
},
+
"node_modules/@sveltejs/vite-plugin-svelte": {
+
"version": "6.2.1",
+
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz",
+
"integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==",
+
"dev": true,
+
"license": "MIT",
+
"peer": true,
+
"dependencies": {
+
"@sveltejs/vite-plugin-svelte-inspector": "^5.0.0",
+
"debug": "^4.4.1",
+
"deepmerge": "^4.3.1",
+
"magic-string": "^0.30.17",
+
"vitefu": "^1.1.1"
+
},
+
"engines": {
+
"node": "^20.19 || ^22.12 || >=24"
+
},
+
"peerDependencies": {
+
"svelte": "^5.0.0",
+
"vite": "^6.3.0 || ^7.0.0"
+
}
+
},
+
"node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz",
+
"integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"debug": "^4.4.1"
+
},
+
"engines": {
+
"node": "^20.19 || ^22.12 || >=24"
+
},
+
"peerDependencies": {
+
"@sveltejs/vite-plugin-svelte": "^6.0.0-next.0",
+
"svelte": "^5.0.0",
+
"vite": "^6.3.0 || ^7.0.0"
+
}
+
},
+
"node_modules/@tsconfig/svelte": {
+
"version": "5.0.6",
+
"resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.6.tgz",
+
"integrity": "sha512-yGxYL0I9eETH1/DR9qVJey4DAsCdeau4a9wYPKuXfEhm8lFO8wg+LLYJjIpAm6Fw7HSlhepPhYPDop75485yWQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@tybys/wasm-util": {
+
"version": "0.10.1",
+
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+
"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"dependencies": {
+
"tslib": "^2.4.0"
+
}
+
},
+
"node_modules/@types/argparse": {
+
"version": "1.0.38",
+
"resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz",
+
"integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@types/estree": {
+
"version": "1.0.8",
+
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@types/node": {
+
"version": "24.10.1",
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
+
"integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
+
"dev": true,
+
"license": "MIT",
+
"peer": true,
+
"dependencies": {
+
"undici-types": "~7.16.0"
+
}
+
},
+
"node_modules/@volar/language-core": {
+
"version": "2.4.26",
+
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.26.tgz",
+
"integrity": "sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@volar/source-map": "2.4.26"
+
}
+
},
+
"node_modules/@volar/source-map": {
+
"version": "2.4.26",
+
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.26.tgz",
+
"integrity": "sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@volar/typescript": {
+
"version": "2.4.26",
+
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.26.tgz",
+
"integrity": "sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@volar/language-core": "2.4.26",
+
"path-browserify": "^1.0.1",
+
"vscode-uri": "^3.0.8"
+
}
+
},
+
"node_modules/@vue/compiler-core": {
+
"version": "3.5.25",
+
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz",
+
"integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/parser": "^7.28.5",
+
"@vue/shared": "3.5.25",
+
"entities": "^4.5.0",
+
"estree-walker": "^2.0.2",
+
"source-map-js": "^1.2.1"
+
}
+
},
+
"node_modules/@vue/compiler-dom": {
+
"version": "3.5.25",
+
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz",
+
"integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@vue/compiler-core": "3.5.25",
+
"@vue/shared": "3.5.25"
+
}
+
},
+
"node_modules/@vue/compiler-vue2": {
+
"version": "2.7.16",
+
"resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
+
"integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"de-indent": "^1.0.2",
+
"he": "^1.2.0"
+
}
+
},
+
"node_modules/@vue/language-core": {
+
"version": "2.2.0",
+
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz",
+
"integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@volar/language-core": "~2.4.11",
+
"@vue/compiler-dom": "^3.5.0",
+
"@vue/compiler-vue2": "^2.7.16",
+
"@vue/shared": "^3.5.0",
+
"alien-signals": "^0.4.9",
+
"minimatch": "^9.0.3",
+
"muggle-string": "^0.4.1",
+
"path-browserify": "^1.0.1"
+
},
+
"peerDependencies": {
+
"typescript": "*"
+
},
+
"peerDependenciesMeta": {
+
"typescript": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@vue/language-core/node_modules/minimatch": {
+
"version": "9.0.5",
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"brace-expansion": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/@vue/shared": {
+
"version": "3.5.25",
+
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz",
+
"integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/acorn": {
+
"version": "8.15.0",
+
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+
"dev": true,
+
"license": "MIT",
+
"peer": true,
+
"bin": {
+
"acorn": "bin/acorn"
+
},
+
"engines": {
+
"node": ">=0.4.0"
+
}
+
},
+
"node_modules/actor-typeahead": {
+
"version": "0.1.2",
+
"resolved": "https://registry.npmjs.org/actor-typeahead/-/actor-typeahead-0.1.2.tgz",
+
"integrity": "sha512-I97YqqNl7Kar0J/bIJvgY/KmHpssHcDElhfwVTLP7wRFlkxso2ZLBqiS2zol5A8UVUJbQK2JXYaqNpZXz8Uk2A==",
+
"license": "MPL-2.0"
+
},
+
"node_modules/ajv": {
+
"version": "8.12.0",
+
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"fast-deep-equal": "^3.1.1",
+
"json-schema-traverse": "^1.0.0",
+
"require-from-string": "^2.0.2",
+
"uri-js": "^4.2.2"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/epoberezkin"
+
}
+
},
+
"node_modules/ajv-draft-04": {
+
"version": "1.0.0",
+
"resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz",
+
"integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==",
+
"dev": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"ajv": "^8.5.0"
+
},
+
"peerDependenciesMeta": {
+
"ajv": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/ajv-formats": {
+
"version": "3.0.1",
+
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+
"integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ajv": "^8.0.0"
+
},
+
"peerDependencies": {
+
"ajv": "^8.0.0"
+
},
+
"peerDependenciesMeta": {
+
"ajv": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/alien-signals": {
+
"version": "0.4.14",
+
"resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz",
+
"integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/argparse": {
+
"version": "1.0.10",
+
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"sprintf-js": "~1.0.2"
+
}
+
},
+
"node_modules/aria-query": {
+
"version": "5.3.2",
+
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+
"integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">= 0.4"
+
}
+
},
+
"node_modules/axobject-query": {
+
"version": "4.1.0",
+
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+
"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">= 0.4"
+
}
+
},
+
"node_modules/balanced-match": {
+
"version": "1.0.2",
+
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/brace-expansion": {
+
"version": "2.0.2",
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"balanced-match": "^1.0.0"
+
}
+
},
+
"node_modules/chokidar": {
+
"version": "4.0.3",
+
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"readdirp": "^4.0.1"
+
},
+
"engines": {
+
"node": ">= 14.16.0"
+
},
+
"funding": {
+
"url": "https://paulmillr.com/funding/"
+
}
+
},
+
"node_modules/clsx": {
+
"version": "2.1.1",
+
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/compare-versions": {
+
"version": "6.1.1",
+
"resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz",
+
"integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/confbox": {
+
"version": "0.2.2",
+
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz",
+
"integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/de-indent": {
+
"version": "1.0.2",
+
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+
"integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/debug": {
+
"version": "4.4.3",
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ms": "^2.1.3"
+
},
+
"engines": {
+
"node": ">=6.0"
+
},
+
"peerDependenciesMeta": {
+
"supports-color": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/deepmerge": {
+
"version": "4.3.1",
+
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/detect-libc": {
+
"version": "2.1.2",
+
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/devalue": {
+
"version": "5.5.0",
+
"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.5.0.tgz",
+
"integrity": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/diff": {
+
"version": "8.0.2",
+
"resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz",
+
"integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==",
+
"dev": true,
+
"license": "BSD-3-Clause",
+
"engines": {
+
"node": ">=0.3.1"
+
}
+
},
+
"node_modules/entities": {
+
"version": "4.5.0",
+
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"engines": {
+
"node": ">=0.12"
+
},
+
"funding": {
+
"url": "https://github.com/fb55/entities?sponsor=1"
+
}
+
},
+
"node_modules/esm-env": {
+
"version": "1.2.2",
+
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
+
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/esrap": {
+
"version": "2.2.0",
+
"resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.0.tgz",
+
"integrity": "sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/sourcemap-codec": "^1.4.15"
+
}
+
},
+
"node_modules/estree-walker": {
+
"version": "2.0.2",
+
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/exsolve": {
+
"version": "1.0.8",
+
"resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
+
"integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/fast-deep-equal": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/fdir": {
+
"version": "6.5.0",
+
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=12.0.0"
+
},
+
"peerDependencies": {
+
"picomatch": "^3 || ^4"
+
},
+
"peerDependenciesMeta": {
+
"picomatch": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/fs-extra": {
+
"version": "11.3.2",
+
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
+
"integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"graceful-fs": "^4.2.0",
+
"jsonfile": "^6.0.1",
+
"universalify": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=14.14"
+
}
+
},
+
"node_modules/fsevents": {
+
"version": "2.3.3",
+
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+
"dev": true,
+
"hasInstallScript": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+
}
+
},
+
"node_modules/function-bind": {
+
"version": "1.1.2",
+
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+
"dev": true,
+
"license": "MIT",
+
"funding": {
+
"url": "https://github.com/sponsors/ljharb"
+
}
+
},
+
"node_modules/graceful-fs": {
+
"version": "4.2.11",
+
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/has-flag": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/hasown": {
+
"version": "2.0.2",
+
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"function-bind": "^1.1.2"
+
},
+
"engines": {
+
"node": ">= 0.4"
+
}
+
},
+
"node_modules/he": {
+
"version": "1.2.0",
+
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+
"dev": true,
+
"license": "MIT",
+
"bin": {
+
"he": "bin/he"
+
}
+
},
+
"node_modules/import-lazy": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+
"integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/is-core-module": {
+
"version": "2.16.1",
+
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"hasown": "^2.0.2"
+
},
+
"engines": {
+
"node": ">= 0.4"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/ljharb"
+
}
+
},
+
"node_modules/is-reference": {
+
"version": "3.0.3",
+
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
+
"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@types/estree": "^1.0.6"
+
}
+
},
+
"node_modules/jju": {
+
"version": "1.4.0",
+
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
+
"integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/json-schema-traverse": {
+
"version": "1.0.0",
+
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/jsonfile": {
+
"version": "6.2.0",
+
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"universalify": "^2.0.0"
+
},
+
"optionalDependencies": {
+
"graceful-fs": "^4.1.6"
+
}
+
},
+
"node_modules/kolorist": {
+
"version": "1.8.0",
+
"resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
+
"integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/lightningcss": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
+
"integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+
"dev": true,
+
"license": "MPL-2.0",
+
"dependencies": {
+
"detect-libc": "^2.0.3"
+
},
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
},
+
"optionalDependencies": {
+
"lightningcss-android-arm64": "1.30.2",
+
"lightningcss-darwin-arm64": "1.30.2",
+
"lightningcss-darwin-x64": "1.30.2",
+
"lightningcss-freebsd-x64": "1.30.2",
+
"lightningcss-linux-arm-gnueabihf": "1.30.2",
+
"lightningcss-linux-arm64-gnu": "1.30.2",
+
"lightningcss-linux-arm64-musl": "1.30.2",
+
"lightningcss-linux-x64-gnu": "1.30.2",
+
"lightningcss-linux-x64-musl": "1.30.2",
+
"lightningcss-win32-arm64-msvc": "1.30.2",
+
"lightningcss-win32-x64-msvc": "1.30.2"
+
}
+
},
+
"node_modules/lightningcss-android-arm64": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz",
+
"integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-darwin-arm64": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
+
"integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-darwin-x64": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz",
+
"integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-freebsd-x64": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz",
+
"integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"freebsd"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-arm-gnueabihf": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz",
+
"integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-arm64-gnu": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz",
+
"integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-arm64-musl": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz",
+
"integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-x64-gnu": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz",
+
"integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-linux-x64-musl": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz",
+
"integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-win32-arm64-msvc": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz",
+
"integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/lightningcss-win32-x64-msvc": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
+
"integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/local-pkg": {
+
"version": "1.1.2",
+
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz",
+
"integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"mlly": "^1.7.4",
+
"pkg-types": "^2.3.0",
+
"quansync": "^0.2.11"
+
},
+
"engines": {
+
"node": ">=14"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/antfu"
+
}
+
},
+
"node_modules/locate-character": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+
"integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/lodash": {
+
"version": "4.17.21",
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/lru-cache": {
+
"version": "6.0.0",
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"yallist": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/magic-string": {
+
"version": "0.30.21",
+
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/sourcemap-codec": "^1.5.5"
+
}
+
},
+
"node_modules/minimatch": {
+
"version": "10.0.3",
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz",
+
"integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"@isaacs/brace-expansion": "^5.0.0"
+
},
+
"engines": {
+
"node": "20 || >=22"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/mlly": {
+
"version": "1.8.0",
+
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz",
+
"integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"acorn": "^8.15.0",
+
"pathe": "^2.0.3",
+
"pkg-types": "^1.3.1",
+
"ufo": "^1.6.1"
+
}
+
},
+
"node_modules/mlly/node_modules/confbox": {
+
"version": "0.1.8",
+
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+
"integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/mlly/node_modules/pkg-types": {
+
"version": "1.3.1",
+
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+
"integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"confbox": "^0.1.8",
+
"mlly": "^1.7.4",
+
"pathe": "^2.0.1"
+
}
+
},
+
"node_modules/mri": {
+
"version": "1.2.0",
+
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+
"integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/ms": {
+
"version": "2.1.3",
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/muggle-string": {
+
"version": "0.4.1",
+
"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
+
"integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/nanoid": {
+
"version": "3.3.11",
+
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"bin": {
+
"nanoid": "bin/nanoid.cjs"
+
},
+
"engines": {
+
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+
}
+
},
+
"node_modules/path-browserify": {
+
"version": "1.0.1",
+
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/path-parse": {
+
"version": "1.0.7",
+
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/pathe": {
+
"version": "2.0.3",
+
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/picocolors": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/picomatch": {
+
"version": "4.0.3",
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+
"dev": true,
+
"license": "MIT",
+
"peer": true,
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/jonschlinkert"
+
}
+
},
+
"node_modules/pkg-types": {
+
"version": "2.3.0",
+
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
+
"integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"confbox": "^0.2.2",
+
"exsolve": "^1.0.7",
+
"pathe": "^2.0.3"
+
}
+
},
+
"node_modules/postcss": {
+
"version": "8.5.6",
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/postcss"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"nanoid": "^3.3.11",
+
"picocolors": "^1.1.1",
+
"source-map-js": "^1.2.1"
+
},
+
"engines": {
+
"node": "^10 || ^12 || >=14"
+
}
+
},
+
"node_modules/prettier": {
+
"version": "3.7.1",
+
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.1.tgz",
+
"integrity": "sha512-RWKXE4qB3u5Z6yz7omJkjWwmTfLdcbv44jUVHC5NpfXwFGzvpQM798FGv/6WNK879tc+Cn0AAyherCl1KjbyZQ==",
+
"dev": true,
+
"license": "MIT",
+
"bin": {
+
"prettier": "bin/prettier.cjs"
+
},
+
"engines": {
+
"node": ">=14"
+
},
+
"funding": {
+
"url": "https://github.com/prettier/prettier?sponsor=1"
+
}
+
},
+
"node_modules/punycode": {
+
"version": "2.3.1",
+
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/quansync": {
+
"version": "0.2.11",
+
"resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+
"integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "individual",
+
"url": "https://github.com/sponsors/antfu"
+
},
+
{
+
"type": "individual",
+
"url": "https://github.com/sponsors/sxzz"
+
}
+
],
+
"license": "MIT"
+
},
+
"node_modules/readdirp": {
+
"version": "4.1.2",
+
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 14.18.0"
+
},
+
"funding": {
+
"type": "individual",
+
"url": "https://paulmillr.com/funding/"
+
}
+
},
+
"node_modules/require-from-string": {
+
"version": "2.0.2",
+
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/resolve": {
+
"version": "1.22.11",
+
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+
"integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"is-core-module": "^2.16.1",
+
"path-parse": "^1.0.7",
+
"supports-preserve-symlinks-flag": "^1.0.0"
+
},
+
"bin": {
+
"resolve": "bin/resolve"
+
},
+
"engines": {
+
"node": ">= 0.4"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/ljharb"
+
}
+
},
+
"node_modules/rolldown": {
+
"version": "1.0.0-beta.50",
+
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.50.tgz",
+
"integrity": "sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@oxc-project/types": "=0.97.0",
+
"@rolldown/pluginutils": "1.0.0-beta.50"
+
},
+
"bin": {
+
"rolldown": "bin/cli.mjs"
+
},
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
},
+
"optionalDependencies": {
+
"@rolldown/binding-android-arm64": "1.0.0-beta.50",
+
"@rolldown/binding-darwin-arm64": "1.0.0-beta.50",
+
"@rolldown/binding-darwin-x64": "1.0.0-beta.50",
+
"@rolldown/binding-freebsd-x64": "1.0.0-beta.50",
+
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.50",
+
"@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.50",
+
"@rolldown/binding-linux-arm64-musl": "1.0.0-beta.50",
+
"@rolldown/binding-linux-x64-gnu": "1.0.0-beta.50",
+
"@rolldown/binding-linux-x64-musl": "1.0.0-beta.50",
+
"@rolldown/binding-openharmony-arm64": "1.0.0-beta.50",
+
"@rolldown/binding-wasm32-wasi": "1.0.0-beta.50",
+
"@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.50",
+
"@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.50",
+
"@rolldown/binding-win32-x64-msvc": "1.0.0-beta.50"
+
}
+
},
+
"node_modules/sade": {
+
"version": "1.8.1",
+
"resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
+
"integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"mri": "^1.1.0"
+
},
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/semver": {
+
"version": "7.5.4",
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"lru-cache": "^6.0.0"
+
},
+
"bin": {
+
"semver": "bin/semver.js"
+
},
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/source-map": {
+
"version": "0.6.1",
+
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+
"dev": true,
+
"license": "BSD-3-Clause",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/source-map-js": {
+
"version": "1.2.1",
+
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+
"dev": true,
+
"license": "BSD-3-Clause",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/sprintf-js": {
+
"version": "1.0.3",
+
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+
"dev": true,
+
"license": "BSD-3-Clause"
+
},
+
"node_modules/string-argv": {
+
"version": "0.3.2",
+
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+
"integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.6.19"
+
}
+
},
+
"node_modules/strip-json-comments": {
+
"version": "3.1.1",
+
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/supports-color": {
+
"version": "8.1.1",
+
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"has-flag": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/supports-color?sponsor=1"
+
}
+
},
+
"node_modules/supports-preserve-symlinks-flag": {
+
"version": "1.0.0",
+
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 0.4"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/ljharb"
+
}
+
},
+
"node_modules/svelte": {
+
"version": "5.45.2",
+
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.45.2.tgz",
+
"integrity": "sha512-yyXdW2u3H0H/zxxWoGwJoQlRgaSJLp+Vhktv12iRw2WRDlKqUPT54Fi0K/PkXqrdkcQ98aBazpy0AH4BCBVfoA==",
+
"dev": true,
+
"license": "MIT",
+
"peer": true,
+
"dependencies": {
+
"@jridgewell/remapping": "^2.3.4",
+
"@jridgewell/sourcemap-codec": "^1.5.0",
+
"@sveltejs/acorn-typescript": "^1.0.5",
+
"@types/estree": "^1.0.5",
+
"acorn": "^8.12.1",
+
"aria-query": "^5.3.1",
+
"axobject-query": "^4.1.0",
+
"clsx": "^2.1.1",
+
"devalue": "^5.5.0",
+
"esm-env": "^1.2.1",
+
"esrap": "^2.2.0",
+
"is-reference": "^3.0.3",
+
"locate-character": "^3.0.0",
+
"magic-string": "^0.30.11",
+
"zimmerframe": "^1.1.2"
+
},
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/svelte-check": {
+
"version": "4.3.4",
+
"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.4.tgz",
+
"integrity": "sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/trace-mapping": "^0.3.25",
+
"chokidar": "^4.0.1",
+
"fdir": "^6.2.0",
+
"picocolors": "^1.0.0",
+
"sade": "^1.7.4"
+
},
+
"bin": {
+
"svelte-check": "bin/svelte-check"
+
},
+
"engines": {
+
"node": ">= 18.0.0"
+
},
+
"peerDependencies": {
+
"svelte": "^4.0.0 || ^5.0.0-next.0",
+
"typescript": ">=5.0.0"
+
}
+
},
+
"node_modules/tinyglobby": {
+
"version": "0.2.15",
+
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"fdir": "^6.5.0",
+
"picomatch": "^4.0.3"
+
},
+
"engines": {
+
"node": ">=12.0.0"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/SuperchupuDev"
+
}
+
},
+
"node_modules/tslib": {
+
"version": "2.8.1",
+
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+
"dev": true,
+
"license": "0BSD",
+
"optional": true
+
},
+
"node_modules/typescript": {
+
"version": "5.9.3",
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"peer": true,
+
"bin": {
+
"tsc": "bin/tsc",
+
"tsserver": "bin/tsserver"
+
},
+
"engines": {
+
"node": ">=14.17"
+
}
+
},
+
"node_modules/ufo": {
+
"version": "1.6.1",
+
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
+
"integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/undici-types": {
+
"version": "7.16.0",
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/universalify": {
+
"version": "2.0.1",
+
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 10.0.0"
+
}
+
},
+
"node_modules/uri-js": {
+
"version": "4.4.1",
+
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"punycode": "^2.1.0"
+
}
+
},
+
"node_modules/vite": {
+
"name": "rolldown-vite",
+
"version": "7.2.5",
+
"resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-7.2.5.tgz",
+
"integrity": "sha512-u09tdk/huMiN8xwoiBbig197jKdCamQTtOruSalOzbqGje3jdHiV0njQlAW0YvzoahkirFePNQ4RYlfnRQpXZA==",
+
"dev": true,
+
"license": "MIT",
+
"peer": true,
+
"dependencies": {
+
"@oxc-project/runtime": "0.97.0",
+
"fdir": "^6.5.0",
+
"lightningcss": "^1.30.2",
+
"picomatch": "^4.0.3",
+
"postcss": "^8.5.6",
+
"rolldown": "1.0.0-beta.50",
+
"tinyglobby": "^0.2.15"
+
},
+
"bin": {
+
"vite": "bin/vite.js"
+
},
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
},
+
"funding": {
+
"url": "https://github.com/vitejs/vite?sponsor=1"
+
},
+
"optionalDependencies": {
+
"fsevents": "~2.3.3"
+
},
+
"peerDependencies": {
+
"@types/node": "^20.19.0 || >=22.12.0",
+
"esbuild": "^0.25.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"
+
},
+
"peerDependenciesMeta": {
+
"@types/node": {
+
"optional": true
+
},
+
"esbuild": {
+
"optional": true
+
},
+
"jiti": {
+
"optional": true
+
},
+
"less": {
+
"optional": true
+
},
+
"sass": {
+
"optional": true
+
},
+
"sass-embedded": {
+
"optional": true
+
},
+
"stylus": {
+
"optional": true
+
},
+
"sugarss": {
+
"optional": true
+
},
+
"terser": {
+
"optional": true
+
},
+
"tsx": {
+
"optional": true
+
},
+
"yaml": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/vite-plugin-dts": {
+
"version": "4.5.4",
+
"resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz",
+
"integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@microsoft/api-extractor": "^7.50.1",
+
"@rollup/pluginutils": "^5.1.4",
+
"@volar/typescript": "^2.4.11",
+
"@vue/language-core": "2.2.0",
+
"compare-versions": "^6.1.1",
+
"debug": "^4.4.0",
+
"kolorist": "^1.8.0",
+
"local-pkg": "^1.0.0",
+
"magic-string": "^0.30.17"
+
},
+
"peerDependencies": {
+
"typescript": "*",
+
"vite": "*"
+
},
+
"peerDependenciesMeta": {
+
"vite": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/vitefu": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz",
+
"integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==",
+
"dev": true,
+
"license": "MIT",
+
"workspaces": [
+
"tests/deps/*",
+
"tests/projects/*",
+
"tests/projects/workspace/packages/*"
+
],
+
"peerDependencies": {
+
"vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0"
+
},
+
"peerDependenciesMeta": {
+
"vite": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/vscode-uri": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
+
"integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/yallist": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/zimmerframe": {
+
"version": "1.1.4",
+
"resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
+
"integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
+
"dev": true,
+
"license": "MIT"
+
}
+
}
+
}
+55
package.json
···
+
{
+
"name": "cutebook",
+
"version": "0.1.0",
+
"type": "module",
+
"main": "./dist/index.js",
+
"module": "./dist/index.js",
+
"types": "./dist/index.d.ts",
+
"exports": {
+
".": {
+
"import": "./dist/index.js",
+
"types": "./dist/index.d.ts"
+
},
+
"./register": {
+
"import": "./dist/register.js",
+
"types": "./dist/register.d.ts"
+
}
+
},
+
"files": [
+
"dist"
+
],
+
"scripts": {
+
"dev": "cd demo && vite",
+
"build": "vite build -c vite.config.lib.ts",
+
"build:demo": "cd demo && vite build",
+
"preview": "cd demo && vite preview",
+
"check": "tsc -p tsconfig.lib.json"
+
},
+
"peerDependencies": {
+
"@atcute/client": "^4.0.0",
+
"@atcute/identity-resolver": "^1.0.0",
+
"@atcute/oauth-browser-client": "^2.0.0"
+
},
+
"dependencies": {
+
"actor-typeahead": "^0.1.2"
+
},
+
"devDependencies": {
+
"@atcute/atproto": "^3.1.9",
+
"@atcute/client": "^4.1.0",
+
"@atcute/identity-resolver": "^1.1.4",
+
"@atcute/lex-cli": "^2.5.0",
+
"@atcute/lexicon-doc": "^2.0.4",
+
"@atcute/oauth-browser-client": "^2.0.1",
+
"@sveltejs/vite-plugin-svelte": "^6.2.1",
+
"@tsconfig/svelte": "^5.0.6",
+
"@types/node": "^24.10.1",
+
"svelte": "^5.43.8",
+
"svelte-check": "^4.3.4",
+
"typescript": "~5.9.3",
+
"vite": "npm:rolldown-vite@7.2.5",
+
"vite-plugin-dts": "^4.5.4"
+
},
+
"overrides": {
+
"vite": "npm:rolldown-vite@7.2.5"
+
}
+
}
+15
tsconfig.json
···
+
{
+
"compilerOptions": {
+
"target": "ES2020",
+
"module": "ESNext",
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
+
"moduleResolution": "bundler",
+
"strict": true,
+
"noEmit": true,
+
"isolatedModules": true,
+
"esModuleInterop": true,
+
"skipLibCheck": true,
+
"declaration": true
+
},
+
"include": ["lib/**/*.ts"]
+
}
+17
tsconfig.lib.json
···
+
{
+
"compilerOptions": {
+
"target": "ES2020",
+
"module": "ESNext",
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
+
"moduleResolution": "bundler",
+
"strict": true,
+
"noEmit": true,
+
"isolatedModules": true,
+
"esModuleInterop": true,
+
"skipLibCheck": true,
+
"declaration": true,
+
"declarationMap": true
+
},
+
"include": ["lib/**/*.ts"]
+
}
+
+34
vite.config.lib.ts
···
+
import { defineConfig } from 'vite';
+
import { resolve } from 'path';
+
import dts from 'vite-plugin-dts';
+
+
export default defineConfig({
+
plugins: [
+
dts({
+
include: ['lib/**/*.ts'],
+
outDir: 'dist',
+
}),
+
],
+
build: {
+
lib: {
+
entry: {
+
index: resolve(__dirname, 'lib/index.ts'),
+
register: resolve(__dirname, 'lib/register.ts'),
+
},
+
formats: ['es'],
+
},
+
rollupOptions: {
+
external: [
+
'@atcute/client',
+
'@atcute/atproto',
+
'@atcute/oauth-browser-client',
+
'@atcute/identity-resolver',
+
'@atcute/lexicons',
+
'actor-typeahead',
+
],
+
},
+
outDir: 'dist',
+
emptyOutDir: true,
+
},
+
});
+