From 978f82321a169b39e1fc7c5b3205421b7e463228 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Fri, 27 Mar 2026 00:02:00 +0000 Subject: [PATCH 01/15] init astro --- .gitignore | 17 + website/.vscode/extensions.json | 4 + website/.vscode/launch.json | 11 + website/README.md | 46 + website/astro.config.mjs | 5 + website/package-lock.json | 4783 ++++++++++++++++++++++++++ website/package.json | 17 + website/public/favicon.ico | Bin 0 -> 655 bytes website/public/favicon.svg | 9 + website/src/assets/astro.svg | 1 + website/src/assets/background.svg | 1 + website/src/components/Welcome.astro | 210 ++ website/src/layouts/Layout.astro | 23 + website/src/pages/index.astro | 11 + website/tsconfig.json | 5 + 15 files changed, 5143 insertions(+) create mode 100644 website/.vscode/extensions.json create mode 100644 website/.vscode/launch.json create mode 100644 website/README.md create mode 100644 website/astro.config.mjs create mode 100644 website/package-lock.json create mode 100644 website/package.json create mode 100644 website/public/favicon.ico create mode 100644 website/public/favicon.svg create mode 100644 website/src/assets/astro.svg create mode 100644 website/src/assets/background.svg create mode 100644 website/src/components/Welcome.astro create mode 100644 website/src/layouts/Layout.astro create mode 100644 website/src/pages/index.astro create mode 100644 website/tsconfig.json diff --git a/.gitignore b/.gitignore index 0ee7ed4..84031ef 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,25 @@ Thumbs.db # logs *.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* # Node / Playwright (site tests) node_modules/ site/test-results/ site/playwright-report/ + +# build output +dist/ + +# generated types +.astro/ + +# environment variables +.env +.env.production + +# jetbrains setting folder +.idea/ \ No newline at end of file diff --git a/website/.vscode/extensions.json b/website/.vscode/extensions.json new file mode 100644 index 0000000..22a1505 --- /dev/null +++ b/website/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/website/.vscode/launch.json b/website/.vscode/launch.json new file mode 100644 index 0000000..d642209 --- /dev/null +++ b/website/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..414a13a --- /dev/null +++ b/website/README.md @@ -0,0 +1,46 @@ +# Astro Starter Kit: Basics + +```sh +npm create astro@latest -- --template basics +``` + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro project, you'll see the following folders and files: + +```text +/ +├── public/ +│ └── favicon.svg +├── src +│   ├── assets +│   │   └── astro.svg +│   ├── components +│   │   └── Welcome.astro +│   ├── layouts +│   │   └── Layout.astro +│   └── pages +│   └── index.astro +└── package.json +``` + +To learn more about the folder structure of an Astro project, refer to [our guide on project structure](https://docs.astro.build/en/basics/project-structure/). + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). diff --git a/website/astro.config.mjs b/website/astro.config.mjs new file mode 100644 index 0000000..e762ba5 --- /dev/null +++ b/website/astro.config.mjs @@ -0,0 +1,5 @@ +// @ts-check +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({}); diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 0000000..2db56e2 --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,4783 @@ +{ + "name": "website", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "website", + "version": "0.0.1", + "dependencies": { + "astro": "^6.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-3.0.1.tgz", + "integrity": "sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.8.0.tgz", + "integrity": "sha512-J56GrhEiV+4dmrGLPNOl2pZjpHXAndWVyiVDYGDuw6MWKpBSEMLdFxHzeM/6sqaknw9M+HFfHZAcvi3OfT3D/w==", + "license": "MIT", + "dependencies": { + "picomatch": "^4.0.3" + } + }, + "node_modules/@astrojs/markdown-remark": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.1.0.tgz", + "integrity": "sha512-P+HnCsu2js3BoTc8kFmu+E9gOcFeMdPris75g+Zl4sY8+bBRbSQV6xzcBDbZ27eE7yBGEGQoqjpChx+KJYIPYQ==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.8.0", + "@astrojs/prism": "4.0.1", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.0", + "smol-toml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/prism": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.1.tgz", + "integrity": "sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.1.0.tgz", + "integrity": "sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==", + "license": "MIT", + "dependencies": { + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.1.0.tgz", + "integrity": "sha512-pkqbPGtohJAvm4Dphs2M8xE29ggupihHdy1x84HNojZuMtFsHiUlRvqD24tM2+XmI+61LlfNceM3Wr7U5QES5g==", + "license": "MIT", + "dependencies": { + "@clack/core": "1.1.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "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==", + "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/@rollup/rollup-android-arm-eabi": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", + "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz", + "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz", + "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz", + "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz", + "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz", + "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz", + "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz", + "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz", + "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz", + "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz", + "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==", + "cpu": [ + "loong64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz", + "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==", + "cpu": [ + "loong64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz", + "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz", + "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz", + "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz", + "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz", + "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz", + "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz", + "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz", + "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz", + "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz", + "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz", + "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz", + "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz", + "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", + "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", + "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", + "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", + "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astro": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-6.1.1.tgz", + "integrity": "sha512-vq8sHpu1JsY1fWAunn+tdKNbVDmLQNiVdyuGsVT2csgITdFGXXVAyEXFWc1DzkMN0ehElPeiHnqItyQOJK+GqA==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^3.0.1", + "@astrojs/internal-helpers": "0.8.0", + "@astrojs/markdown-remark": "7.1.0", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^1.1.1", + "devalue": "^5.6.3", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.27.3", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "rehype": "^13.0.2", + "semver": "^7.7.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.1", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unist-util-visit": "^5.1.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^7.3.1", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "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==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "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==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.10.tgz", + "integrity": "sha512-YzJeWSkDZxAhvmp8dexjRK5hxziRO7I9m0N53WhvYL5NiWfkUkzssVzY9jvGu0HBoLFW6+duYmNSn6MaZBCCtg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "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==", + "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/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.5.tgz", + "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", + "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", + "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "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/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rollup": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz", + "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.0", + "@rollup/rollup-android-arm64": "4.60.0", + "@rollup/rollup-darwin-arm64": "4.60.0", + "@rollup/rollup-darwin-x64": "4.60.0", + "@rollup/rollup-freebsd-arm64": "4.60.0", + "@rollup/rollup-freebsd-x64": "4.60.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", + "@rollup/rollup-linux-arm-musleabihf": "4.60.0", + "@rollup/rollup-linux-arm64-gnu": "4.60.0", + "@rollup/rollup-linux-arm64-musl": "4.60.0", + "@rollup/rollup-linux-loong64-gnu": "4.60.0", + "@rollup/rollup-linux-loong64-musl": "4.60.0", + "@rollup/rollup-linux-ppc64-gnu": "4.60.0", + "@rollup/rollup-linux-ppc64-musl": "4.60.0", + "@rollup/rollup-linux-riscv64-gnu": "4.60.0", + "@rollup/rollup-linux-riscv64-musl": "4.60.0", + "@rollup/rollup-linux-s390x-gnu": "4.60.0", + "@rollup/rollup-linux-x64-gnu": "4.60.0", + "@rollup/rollup-linux-x64-musl": "4.60.0", + "@rollup/rollup-openbsd-x64": "4.60.0", + "@rollup/rollup-openharmony-arm64": "4.60.0", + "@rollup/rollup-win32-arm64-msvc": "4.60.0", + "@rollup/rollup-win32-ia32-msvc": "4.60.0", + "@rollup/rollup-win32-x64-gnu": "4.60.0", + "@rollup/rollup-win32-x64-msvc": "4.60.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shiki": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyclip": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.12.tgz", + "integrity": "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "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/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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==", + "license": "0BSD", + "optional": true + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "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", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.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 + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "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/vitefu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", + "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 || ^8.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..657ca5f --- /dev/null +++ b/website/package.json @@ -0,0 +1,17 @@ +{ + "name": "website", + "type": "module", + "version": "0.0.1", + "engines": { + "node": ">=22.12.0" + }, + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "astro": "^6.1.1" + } +} \ No newline at end of file diff --git a/website/public/favicon.ico b/website/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7f48a94d16071d6c8d06478c7458ab12e675019c GIT binary patch literal 655 zcmV;A0&x9_P)Rl-XF(A`bsas&GH{e7U1}Ri zJr5jR8B2*Jd6$=$AqgTM2o2FV$WZ9|#jJ3mmpEs{jB0ps@*Kxv}=RB|IJih8Z&fqwCG`%bN0000#bW%=J zQ=IH#a_&L{B{_6Lu_3m>0bMN%+@aOmN_3G~H^8EGi>+bXO=;-|Z`uFnf==AdP z{Oj-S=ltmI=<4`LcLE*&009F@L_t(|+I`d4ZUZ3@1<*Uo7H^LoCw6-8z4wsbd;b4l zA}zMFtOw2mLX6O5Mgl}(5P=uOM4%=tnuHiuAp%(G<c=npm$Fz%eL + + + diff --git a/website/src/assets/astro.svg b/website/src/assets/astro.svg new file mode 100644 index 0000000..8cf8fb0 --- /dev/null +++ b/website/src/assets/astro.svg @@ -0,0 +1 @@ + diff --git a/website/src/assets/background.svg b/website/src/assets/background.svg new file mode 100644 index 0000000..4b2be0a --- /dev/null +++ b/website/src/assets/background.svg @@ -0,0 +1 @@ + diff --git a/website/src/components/Welcome.astro b/website/src/components/Welcome.astro new file mode 100644 index 0000000..1b2cf9c --- /dev/null +++ b/website/src/components/Welcome.astro @@ -0,0 +1,210 @@ +--- +import astroLogo from '../assets/astro.svg'; +import background from '../assets/background.svg'; +--- + + + + diff --git a/website/src/layouts/Layout.astro b/website/src/layouts/Layout.astro new file mode 100644 index 0000000..f6b55d4 --- /dev/null +++ b/website/src/layouts/Layout.astro @@ -0,0 +1,23 @@ + + + + + + + + + Astro Basics + + + + + + + diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro new file mode 100644 index 0000000..c04f360 --- /dev/null +++ b/website/src/pages/index.astro @@ -0,0 +1,11 @@ +--- +import Welcome from '../components/Welcome.astro'; +import Layout from '../layouts/Layout.astro'; + +// Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build +// Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh. +--- + + + + diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} From 62f2265417d008a3089523efdb9fb9239dfb1f9b Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sat, 28 Mar 2026 00:21:07 +0000 Subject: [PATCH 02/15] fix: remove default astro files --- website/src/assets/astro.svg | 1 - website/src/assets/background.svg | 1 - website/src/components/Welcome.astro | 210 --------------------------- 3 files changed, 212 deletions(-) delete mode 100644 website/src/assets/astro.svg delete mode 100644 website/src/assets/background.svg delete mode 100644 website/src/components/Welcome.astro diff --git a/website/src/assets/astro.svg b/website/src/assets/astro.svg deleted file mode 100644 index 8cf8fb0..0000000 --- a/website/src/assets/astro.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/src/assets/background.svg b/website/src/assets/background.svg deleted file mode 100644 index 4b2be0a..0000000 --- a/website/src/assets/background.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/src/components/Welcome.astro b/website/src/components/Welcome.astro deleted file mode 100644 index 1b2cf9c..0000000 --- a/website/src/components/Welcome.astro +++ /dev/null @@ -1,210 +0,0 @@ ---- -import astroLogo from '../assets/astro.svg'; -import background from '../assets/background.svg'; ---- - - - - From b76db7889be63102908ec18446be46d5c12075d0 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sat, 28 Mar 2026 00:21:47 +0000 Subject: [PATCH 03/15] feat: add astro styles --- website/src/layouts/Layout.astro | 39 +++++----- website/src/styles/compositions.css | 14 ++++ website/src/styles/global.css | 113 ++++++++++++++++++++++++++++ website/src/styles/index.css | 6 ++ website/src/styles/reset.css | 78 +++++++++++++++++++ website/src/styles/utilities.css | 15 ++++ website/src/styles/variables.css | 64 ++++++++++++++++ 7 files changed, 312 insertions(+), 17 deletions(-) create mode 100644 website/src/styles/compositions.css create mode 100644 website/src/styles/global.css create mode 100644 website/src/styles/index.css create mode 100644 website/src/styles/reset.css create mode 100644 website/src/styles/utilities.css create mode 100644 website/src/styles/variables.css diff --git a/website/src/layouts/Layout.astro b/website/src/layouts/Layout.astro index f6b55d4..905e2f4 100644 --- a/website/src/layouts/Layout.astro +++ b/website/src/layouts/Layout.astro @@ -1,23 +1,28 @@ +--- +import "../styles/index.css"; +--- + - - - - - - - Astro Basics - - - - + + + + + + + + Astro Basics + + + + diff --git a/website/src/styles/compositions.css b/website/src/styles/compositions.css new file mode 100644 index 0000000..bc82cbc --- /dev/null +++ b/website/src/styles/compositions.css @@ -0,0 +1,14 @@ +/* ── Stack ─────────────────────────────────────────────────────────── */ +.stack { + display: flex; + flex-direction: column; + justify-content: flex-start; +} + +.stack > * { + margin-block: 0; +} + +.stack > * + * { + margin-block-start: var(--space, 1.5rem); +} diff --git a/website/src/styles/global.css b/website/src/styles/global.css new file mode 100644 index 0000000..140f72e --- /dev/null +++ b/website/src/styles/global.css @@ -0,0 +1,113 @@ +@import url("https://fonts.cdnfonts.com/css/jetbrains-mono"); + +/* ── Reset ─────────────────────────────────────────────────────────── */ + +/* *, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} */ + +/* html { + font-size: 16px; +} */ + +body { + /* min-height: 100vh; */ + background: var(--base); + color: var(--text); + font-family: var(--font-mono); + display: flex; + flex-direction: column; +} + +/* h1, +h2, +h3, +h4 { + text-wrap: balance; +} */ + +/* p { + text-wrap: pretty; +} */ + +a { + color: currentColor; +} + +a:focus-visible, +button:focus-visible { + outline-offset: 3px; + outline: 2px solid currentColor; +} + +a:hover { + color: var(--subtext0); +} + +/* ── Button ─────────────────────────────────────────────────────────── */ + +button, +.button { + border: none; + font: inherit; + text-decoration: none; + background-color: var(--blue); + color: var(--base); + + display: flex; + align-items: center; + justify-content: center; + padding: 0.5rem 0.75rem; + font-weight: 800; + line-height: 1.5; + cursor: pointer; + + transition: background-color 0.1s linear; + + &:hover { + color: var(--base); + background-color: color-mix(in srgb, var(--blue), var(--text) 20%); + } + + &:focus-visible { + outline-offset: 3px; + outline: 2px solid var(--blue); + } +} + +/* ── Nav ─────────────────────────────────────────────────────────── */ + +.nav { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.75rem 1.25rem; + background: var(--mantle); + border-bottom: 0.0625rem solid var(--surface0); + flex-shrink: 0; +} + +.nav-back { + text-decoration: none; + display: flex; + align-items: center; + min-block-size: 44px; +} + +/* ── Github link ─────────────────────────────────────────────────────────── */ + +.gh-logo { + width: 24px; + height: auto; +} + +.gh-link { + transition: color 0.15s; + display: flex; + align-items: center; + gap: 0.5rem; +} diff --git a/website/src/styles/index.css b/website/src/styles/index.css new file mode 100644 index 0000000..2833674 --- /dev/null +++ b/website/src/styles/index.css @@ -0,0 +1,6 @@ +@import "reset.css"; +/* @import "fonts.css"; */ +@import "variables.css"; +@import "global.css"; +@import "utilities.css"; +@import "compositions.css"; diff --git a/website/src/styles/reset.css b/website/src/styles/reset.css new file mode 100644 index 0000000..f41d8d1 --- /dev/null +++ b/website/src/styles/reset.css @@ -0,0 +1,78 @@ +/* Modern reset: https://piccalil.li/blog/a-more-modern-css-reset/ */ +/* Box sizing rules */ +*, +*::before, +*::after { + box-sizing: border-box; +} +/* Prevent font size inflation */ +html { + -moz-text-size-adjust: none; + -webkit-text-size-adjust: none; + text-size-adjust: none; +} +/* Remove default margin in favour of better control in authored CSS */ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} +/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ +ul[role="list"], +ol[role="list"] { + list-style: none; +} +/* Set core body defaults */ +body { + min-height: 100dvh; + line-height: 1.5; +} +/* Set shorter line heights on headings and interactive elements */ +h1, +h2, +h3, +h4, +button, +input, +label { + line-height: 1.1; +} +/* Balance text wrapping on headings */ +h1, +h2, +h3, +h4 { + text-wrap: balance; +} +/* Improve body copy style*/ +p { + text-wrap: pretty; +} +/* A elements that don't have a class get default styles */ +a:not([class]) { + text-decoration-skip-ink: auto; + color: currentColor; +} +/* Make images easier to work with */ +img, +picture { + max-width: 100%; + display: block; +} +/* Inherit fonts for inputs and buttons */ +input, +button, +textarea, +select { + font: inherit; +} +/* Make sure textareas without a rows attribute are not tiny */ +textarea:not([rows]) { + min-height: 10em; +} +/* Anything that has been anchored to should have extra scroll margin */ +:target { + scroll-margin-block: 5ex; +} diff --git a/website/src/styles/utilities.css b/website/src/styles/utilities.css new file mode 100644 index 0000000..32210de --- /dev/null +++ b/website/src/styles/utilities.css @@ -0,0 +1,15 @@ +.hidden { + display: none !important; +} + +.visually-hidden { + border: 0; + clip: rect(0 0 0 0); + height: auto; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + white-space: nowrap; +} diff --git a/website/src/styles/variables.css b/website/src/styles/variables.css new file mode 100644 index 0000000..ec9a9d2 --- /dev/null +++ b/website/src/styles/variables.css @@ -0,0 +1,64 @@ +:root { + --font-mono: + "JetBrains Mono", "Fira Code", "SF Mono", Menlo, Consolas, monospace; + + /* Catppuccin Latte palette (Light)*/ + --rosewater: #dc8a78; + --flamingo: #dd7878; + --pink: #ea76cb; + --mauve: #8839ef; + --red: #d20f39; + --maroon: #e64553; + --peach: #fe640b; + --yellow: #df8e1d; + --green: #40a02b; + --teal: #179299; + --sky: #04a5e5; + --sapphire: #209fb5; + --blue: #1e66f5; + --lavender: #7287fd; + --text: #4c4f69; + --subtext1: #5c5f77; + --subtext0: #6c6f85; + --overlay2: #7c7f93; + --overlay1: #8c8fa1; + --overlay0: #9ca0b0; + --surface2: #acb0be; + --surface1: #bcc0cc; + --surface0: #ccd0da; + --base: #eff1f5; + --mantle: #e6e9ef; + --crust: #dce0e8; +} + +@media (prefers-color-scheme: dark) { + :root { + /* Catppuccin Mocha (Dark) */ + --rosewater: #f5e0dc; + --flamingo: #f2cdcd; + --pink: #f5c2e7; + --mauve: #cba6f7; + --red: #f38ba8; + --maroon: #eba0ac; + --peach: #fab387; + --yellow: #f9e2af; + --green: #a6e3a1; + --teal: #94e2d5; + --sky: #89dceb; + --sapphire: #74c7ec; + --blue: #89b4fa; + --lavender: #b4befe; + --text: #cdd6f4; + --subtext1: #bac2de; + --subtext0: #a6adc8; + --overlay2: #9399b2; + --overlay1: #7f849c; + --overlay0: #6c7086; + --surface2: #585b70; + --surface1: #45475a; + --surface0: #313244; + --base: #1e1e2e; + --mantle: #181825; + --crust: #11111b; + } +} From bb3edf43316464f83913625d5c97844760b8cda1 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sat, 28 Mar 2026 00:30:16 +0000 Subject: [PATCH 04/15] fix: prettier astro support --- .prettierrc | 12 ++++++- website/package-lock.json | 69 +++++++++++++++++++++++++++++++++++++++ website/package.json | 6 +++- 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/.prettierrc b/.prettierrc index 0967ef4..d87faa5 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1 +1,11 @@ -{} +{ + "plugins": ["prettier-plugin-astro"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro" + } + } + ] +} diff --git a/website/package-lock.json b/website/package-lock.json index 2db56e2..57fd985 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -10,6 +10,10 @@ "dependencies": { "astro": "^6.1.1" }, + "devDependencies": { + "prettier": "3.8.1", + "prettier-plugin-astro": "0.14.1" + }, "engines": { "node": ">=22.12.0" } @@ -3755,6 +3759,44 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-astro": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.14.1.tgz", + "integrity": "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.9.1", + "prettier": "^3.0.0", + "sass-formatter": "^0.7.6" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" + } + }, + "node_modules/prettier-plugin-astro/node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", + "dev": true, + "license": "MIT" + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -4064,6 +4106,23 @@ "fsevents": "~2.3.2" } }, + "node_modules/s.color": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", + "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass-formatter": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.9.tgz", + "integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "suf-log": "^2.5.3" + } + }, "node_modules/sax": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", @@ -4200,6 +4259,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/suf-log": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", + "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "dev": true, + "license": "MIT", + "dependencies": { + "s.color": "0.0.15" + } + }, "node_modules/svgo": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", diff --git a/website/package.json b/website/package.json index 657ca5f..152adbb 100644 --- a/website/package.json +++ b/website/package.json @@ -13,5 +13,9 @@ }, "dependencies": { "astro": "^6.1.1" + }, + "devDependencies": { + "prettier": "3.8.1", + "prettier-plugin-astro": "0.14.1" } -} \ No newline at end of file +} From 80156abb0b556c738a50dbe21b3ea6f03d579f30 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sat, 28 Mar 2026 00:31:39 +0000 Subject: [PATCH 05/15] feat: (astro) add index.astro page --- website/src/pages/index.astro | 414 +++++++++++++++++++++++++++++++++- 1 file changed, 411 insertions(+), 3 deletions(-) diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index c04f360..54ca020 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -1,11 +1,419 @@ --- -import Welcome from '../components/Welcome.astro'; -import Layout from '../layouts/Layout.astro'; +import Layout from "../layouts/Layout.astro"; // Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build // Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh. --- - +
+
+
+ + + + v0.22.0 + +
+
+

No more searching the README.

+

+ "How do I" surfaces install, run, + test and deploy steps and commands all in your + terminal. +

+ Try the demo -> +
+
+ +
+

Install

+
+
+

Homebrew

+
+
brew install grega/tap/hdi
+ +
+
+
+

Manual

+
+
curl -fsSL https://raw.githubusercontent.com/grega/hdi/main/hdi \
+  -o ~/.local/bin/hdi && chmod +x ~/.local/bin/hdi
+ +
+
+
+

+ No dependencies, just Bash. Works on macOS and Linux. +

+
+ +
+

Demo

+ + + Animated demo showing hdi in action + + +
+ +
+

How does it work?

+

+ hdi parses a given README's Markdown headings looking for keywords + like + install, setup, prerequisites, run, usage, getting started, + etc. It extracts the fenced code blocks from matching sections and + presents them as an interactive, executable list. +

+
+ +
+

Usage

+
$ cd some-project
+$ hdi
+[hdi] some-project
+
+  Installation
+  ▶ npm install
+    cp .env.example .env
+
+  Run
+    npm run dev
+
+  ↑↓ navigate  ⇥ sections  ⏎ execute  c copy  q quit
+ +
+ + +
+ +
+ + From f19481aa192772a8aa4c9843055262c2a14abf75 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sat, 28 Mar 2026 00:49:00 +0000 Subject: [PATCH 06/15] chore: formatting --- website/astro.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/astro.config.mjs b/website/astro.config.mjs index e762ba5..17f6a62 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -1,5 +1,5 @@ // @ts-check -import { defineConfig } from 'astro/config'; +import { defineConfig } from "astro/config"; // https://astro.build/config export default defineConfig({}); From 761779becd34a5f3474923ecee1bd7772d09236e Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sat, 28 Mar 2026 00:49:13 +0000 Subject: [PATCH 07/15] feat: add astro vscode settings --- website/.vscode/settings.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 website/.vscode/settings.json diff --git a/website/.vscode/settings.json b/website/.vscode/settings.json new file mode 100644 index 0000000..d3b317b --- /dev/null +++ b/website/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "prettier.documentSelectors": ["**/*.astro"], + "[astro]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } +} From 5d1493b1fbd554f63d3b3ee54ea6691c5d10cb84 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sat, 28 Mar 2026 00:49:50 +0000 Subject: [PATCH 08/15] fix: Add prop for page title --- website/src/layouts/Layout.astro | 11 +++++++++++ website/src/pages/index.astro | 16 +++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/website/src/layouts/Layout.astro b/website/src/layouts/Layout.astro index 905e2f4..ddb2c24 100644 --- a/website/src/layouts/Layout.astro +++ b/website/src/layouts/Layout.astro @@ -1,5 +1,6 @@ --- import "../styles/index.css"; +const { title } = Astro.props; --- @@ -11,6 +12,16 @@ import "../styles/index.css"; + hdi - {title} + + Astro Basics diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index 54ca020..5305e27 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -1,11 +1,9 @@ --- import Layout from "../layouts/Layout.astro"; -// Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build -// Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh. --- - +
@@ -23,14 +21,16 @@ import Layout from "../layouts/Layout.astro"; class="gh-link" target="_blank" title="hdi on GitHub" - rel="noopener"> + rel="noopener" + > diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index 5305e27..e449e96 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -1,6 +1,5 @@ --- import Layout from "../layouts/Layout.astro"; - --- From dda5abb9f50b2a4b0e910e1357b4a1c3833b6267 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sat, 28 Mar 2026 01:16:40 +0000 Subject: [PATCH 10/15] fix: remove old stylesheet from layout --- website/src/layouts/Layout.astro | 1 - 1 file changed, 1 deletion(-) diff --git a/website/src/layouts/Layout.astro b/website/src/layouts/Layout.astro index 46d17ae..de01713 100644 --- a/website/src/layouts/Layout.astro +++ b/website/src/layouts/Layout.astro @@ -10,7 +10,6 @@ const { title } = Astro.props; - hdi - {title} Date: Sun, 29 Mar 2026 23:03:22 +0100 Subject: [PATCH 11/15] fix: get all pages working in astro --- website/public/data.js | 1606 ++++++++++++++++++++++++++++++ website/public/picker.js | 255 +++++ website/public/terminal.js | 513 ++++++++++ website/src/layouts/Layout.astro | 3 +- website/src/pages/demo.astro | 379 +++++++ website/src/pages/index.astro | 1 - 6 files changed, 2755 insertions(+), 2 deletions(-) create mode 100644 website/public/data.js create mode 100644 website/public/picker.js create mode 100644 website/public/terminal.js create mode 100644 website/src/pages/demo.astro diff --git a/website/public/data.js b/website/public/data.js new file mode 100644 index 0000000..5c00cf8 --- /dev/null +++ b/website/public/data.js @@ -0,0 +1,1606 @@ +// Auto-generated by site/generate-data.sh - do not edit manually + +window.PROJECTS = [ + { + slug: "node-express", + name: "express-api", + description: "Invoice management REST API", + lang: "JS", + langFull: "JavaScript", + readme: `# express-api + +A REST API for managing invoices, built with Express and PostgreSQL. Handles PDF generation, email notifications, and Stripe payment webhooks. + +## Prerequisites + +Requires Node.js 20+ and a running PostgreSQL instance. + +\`\`\`bash +nvm install 20 +nvm use 20 +\`\`\` + +## Installation + +\`\`\`bash +npm install +cp .env.example .env +npx prisma migrate dev +\`\`\` + +## Development + +Start the development server with hot reload: + +\`\`\`bash +npm run dev +\`\`\` + +The API will be available at \`http://localhost:4000/api\`. + +## Testing + +Run the full test suite: + +\`\`\`bash +npm test +\`\`\` + +Run tests in watch mode during development: + +\`\`\`bash +npm run test:watch +\`\`\` + +## Deployment + +Build the Docker image and push to the container registry: + +\`\`\`bash +docker build -t express-api . +docker push ghcr.io/acme/express-api:latest +\`\`\` + +## API Response + +\`\`\`json +{ + "status": "ok", + "data": [] +} +\`\`\` + +## License + +MIT`, + modes: { + default: [ + { type: "header", text: "Prerequisites" }, + { type: "command", text: "nvm install 20" }, + { type: "command", text: "nvm use 20" }, + { type: "header", text: "Installation" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env" }, + { type: "command", text: "npx prisma migrate dev" }, + { type: "header", text: "Development" }, + { type: "command", text: "npm run dev" }, + { type: "header", text: "Testing" }, + { type: "command", text: "npm test" }, + { type: "command", text: "npm run test:watch" }, + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t express-api ." }, + { + type: "command", + text: "docker push ghcr.io/acme/express-api:latest", + }, + ], + install: [ + { type: "header", text: "Prerequisites" }, + { type: "command", text: "nvm install 20" }, + { type: "command", text: "nvm use 20" }, + { type: "header", text: "Installation" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env" }, + { type: "command", text: "npx prisma migrate dev" }, + ], + run: [ + { type: "header", text: "Development" }, + { type: "command", text: "npm run dev" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "command", text: "npm test" }, + { type: "command", text: "npm run test:watch" }, + ], + deploy: [ + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t express-api ." }, + { + type: "command", + text: "docker push ghcr.io/acme/express-api:latest", + }, + ], + all: [ + { type: "header", text: "Prerequisites" }, + { type: "command", text: "nvm install 20" }, + { type: "command", text: "nvm use 20" }, + { type: "header", text: "Installation" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env" }, + { type: "command", text: "npx prisma migrate dev" }, + { type: "header", text: "Development" }, + { type: "command", text: "npm run dev" }, + { type: "header", text: "Testing" }, + { type: "command", text: "npm test" }, + { type: "command", text: "npm run test:watch" }, + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t express-api ." }, + { + type: "command", + text: "docker push ghcr.io/acme/express-api:latest", + }, + ], + }, + check: [ + { tool: "nvm", installed: false }, + { tool: "npm", installed: true, version: "11.11.0" }, + { tool: "npx", installed: true, version: "10.9.4" }, + { tool: "docker", installed: true, version: "29.1.3" }, + ], + fullProse: { + default: [ + { type: "header", text: "Prerequisites" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Requires Node.js 20+ and a running PostgreSQL instance.", + }, + { type: "empty", text: "" }, + { type: "command", text: "nvm install 20" }, + { type: "command", text: "nvm use 20" }, + { type: "empty", text: "" }, + { type: "header", text: "Installation" }, + { type: "empty", text: "" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env" }, + { type: "command", text: "npx prisma migrate dev" }, + { type: "empty", text: "" }, + { type: "header", text: "Development" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Start the development server with hot reload:", + }, + { type: "empty", text: "" }, + { type: "command", text: "npm run dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The API will be available at `http://localhost:4000/api`.", + }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the full test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm test" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run tests in watch mode during development:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run test:watch" }, + { type: "empty", text: "" }, + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Build the Docker image and push to the container registry:", + }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t express-api ." }, + { + type: "command", + text: "docker push ghcr.io/acme/express-api:latest", + }, + { type: "empty", text: "" }, + ], + install: [ + { type: "header", text: "Prerequisites" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Requires Node.js 20+ and a running PostgreSQL instance.", + }, + { type: "empty", text: "" }, + { type: "command", text: "nvm install 20" }, + { type: "command", text: "nvm use 20" }, + { type: "empty", text: "" }, + { type: "header", text: "Installation" }, + { type: "empty", text: "" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env" }, + { type: "command", text: "npx prisma migrate dev" }, + { type: "empty", text: "" }, + ], + run: [ + { type: "header", text: "Development" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Start the development server with hot reload:", + }, + { type: "empty", text: "" }, + { type: "command", text: "npm run dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The API will be available at `http://localhost:4000/api`.", + }, + { type: "empty", text: "" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the full test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm test" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run tests in watch mode during development:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run test:watch" }, + { type: "empty", text: "" }, + ], + deploy: [ + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Build the Docker image and push to the container registry:", + }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t express-api ." }, + { + type: "command", + text: "docker push ghcr.io/acme/express-api:latest", + }, + { type: "empty", text: "" }, + ], + all: [ + { type: "header", text: "Prerequisites" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Requires Node.js 20+ and a running PostgreSQL instance.", + }, + { type: "empty", text: "" }, + { type: "command", text: "nvm install 20" }, + { type: "command", text: "nvm use 20" }, + { type: "empty", text: "" }, + { type: "header", text: "Installation" }, + { type: "empty", text: "" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env" }, + { type: "command", text: "npx prisma migrate dev" }, + { type: "empty", text: "" }, + { type: "header", text: "Development" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Start the development server with hot reload:", + }, + { type: "empty", text: "" }, + { type: "command", text: "npm run dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The API will be available at `http://localhost:4000/api`.", + }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the full test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm test" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run tests in watch mode during development:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run test:watch" }, + { type: "empty", text: "" }, + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Build the Docker image and push to the container registry:", + }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t express-api ." }, + { + type: "command", + text: "docker push ghcr.io/acme/express-api:latest", + }, + { type: "empty", text: "" }, + ], + }, + }, + { + slug: "python-flask", + name: "flask-app", + description: "Sensor data processing service", + lang: "PY", + langFull: "Python", + readme: `# flask-app + +A Flask application for processing and visualising sensor data. Uses Celery for background tasks and SQLAlchemy for persistence. + +## Getting Started + +### Set up a virtual environment + +\`\`\`bash +python3 -m venv venv +source venv/bin/activate +\`\`\` + +### Install dependencies + +\`\`\`bash +pip install -r requirements.txt +\`\`\` + +### Database Setup + +Initialise the database and run migrations: + +\`\`\`bash +flask db upgrade +flask seed-data +\`\`\` + +### Run the development server + +\`\`\`bash +flask run --debug +\`\`\` + +The app will be available at \`http://localhost:5000\`. + +## Testing + +Run the test suite with pytest: + +\`\`\`bash +pytest +\`\`\` + +Run with coverage reporting: + +\`\`\`bash +pytest --cov=app --cov-report=term-missing +\`\`\` + +## Deployment + +Build and push the container image: + +\`\`\`bash +docker build -t flask-app . +docker push registry.example.com/flask-app:latest +\`\`\` + +## Configuration + +\`\`\`yaml +DATABASE_URL: postgres://localhost/flask_app +SECRET_KEY: change-me +CELERY_BROKER_URL: redis://localhost:6379/0 +\`\`\` + +## License + +MIT`, + modes: { + default: [ + { type: "header", text: "Getting Started" }, + { type: "empty", text: "(no commands - use --full to see prose)" }, + { type: "header", text: "Set up a virtual environment" }, + { type: "command", text: "python3 -m venv venv" }, + { type: "command", text: "source venv/bin/activate" }, + { type: "header", text: "Install dependencies" }, + { type: "command", text: "pip install -r requirements.txt" }, + { type: "header", text: "Database Setup" }, + { type: "command", text: "flask db upgrade" }, + { type: "command", text: "flask seed-data" }, + { type: "header", text: "Run the development server" }, + { type: "command", text: "flask run --debug" }, + { type: "header", text: "Testing" }, + { type: "command", text: "pytest" }, + { type: "command", text: "pytest --cov=app --cov-report=term-missing" }, + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t flask-app ." }, + { + type: "command", + text: "docker push registry.example.com/flask-app:latest", + }, + { type: "header", text: "Configuration" }, + { type: "empty", text: "(no commands - use --full to see prose)" }, + ], + install: [ + { type: "header", text: "Getting Started" }, + { type: "empty", text: "(no commands - use --full to see prose)" }, + { type: "header", text: "Set up a virtual environment" }, + { type: "command", text: "python3 -m venv venv" }, + { type: "command", text: "source venv/bin/activate" }, + { type: "header", text: "Install dependencies" }, + { type: "command", text: "pip install -r requirements.txt" }, + { type: "header", text: "Database Setup" }, + { type: "command", text: "flask db upgrade" }, + { type: "command", text: "flask seed-data" }, + ], + run: [ + { type: "header", text: "Getting Started" }, + { type: "subheader", text: "Set up a virtual environment" }, + { type: "command", text: "python3 -m venv venv" }, + { type: "command", text: "source venv/bin/activate" }, + { type: "subheader", text: "Install dependencies" }, + { type: "command", text: "pip install -r requirements.txt" }, + { type: "subheader", text: "Database Setup" }, + { type: "command", text: "flask db upgrade" }, + { type: "command", text: "flask seed-data" }, + { type: "header", text: "Run the development server" }, + { type: "command", text: "flask run --debug" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "command", text: "pytest" }, + { type: "command", text: "pytest --cov=app --cov-report=term-missing" }, + ], + deploy: [ + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t flask-app ." }, + { + type: "command", + text: "docker push registry.example.com/flask-app:latest", + }, + ], + all: [ + { type: "header", text: "Getting Started" }, + { type: "empty", text: "(no commands - use --full to see prose)" }, + { type: "header", text: "Set up a virtual environment" }, + { type: "command", text: "python3 -m venv venv" }, + { type: "command", text: "source venv/bin/activate" }, + { type: "header", text: "Install dependencies" }, + { type: "command", text: "pip install -r requirements.txt" }, + { type: "header", text: "Database Setup" }, + { type: "command", text: "flask db upgrade" }, + { type: "command", text: "flask seed-data" }, + { type: "header", text: "Run the development server" }, + { type: "command", text: "flask run --debug" }, + { type: "header", text: "Testing" }, + { type: "command", text: "pytest" }, + { type: "command", text: "pytest --cov=app --cov-report=term-missing" }, + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t flask-app ." }, + { + type: "command", + text: "docker push registry.example.com/flask-app:latest", + }, + { type: "header", text: "Configuration" }, + { type: "empty", text: "(no commands - use --full to see prose)" }, + ], + }, + check: [ + { tool: "python3", installed: true, version: "3.9.16" }, + { tool: "pip", installed: true, version: "22.0.4" }, + { tool: "flask", installed: true }, + { tool: "pytest", installed: true }, + { tool: "docker", installed: true, version: "29.1.3" }, + ], + fullProse: { + default: [ + { type: "header", text: "Set up a virtual environment" }, + { type: "empty", text: "" }, + { type: "command", text: "python3 -m venv venv" }, + { type: "command", text: "source venv/bin/activate" }, + { type: "empty", text: "" }, + { type: "header", text: "Install dependencies" }, + { type: "empty", text: "" }, + { type: "command", text: "pip install -r requirements.txt" }, + { type: "empty", text: "" }, + { type: "header", text: "Database Setup" }, + { type: "empty", text: "" }, + { type: "prose", text: "Initialise the database and run migrations:" }, + { type: "empty", text: "" }, + { type: "command", text: "flask db upgrade" }, + { type: "command", text: "flask seed-data" }, + { type: "empty", text: "" }, + { type: "header", text: "Run the development server" }, + { type: "empty", text: "" }, + { type: "command", text: "flask run --debug" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The app will be available at `http://localhost:5000`.", + }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the test suite with pytest:" }, + { type: "empty", text: "" }, + { type: "command", text: "pytest" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run with coverage reporting:" }, + { type: "empty", text: "" }, + { type: "command", text: "pytest --cov=app --cov-report=term-missing" }, + { type: "empty", text: "" }, + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { type: "prose", text: "Build and push the container image:" }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t flask-app ." }, + { + type: "command", + text: "docker push registry.example.com/flask-app:latest", + }, + { type: "empty", text: "" }, + { type: "header", text: "Configuration" }, + { type: "empty", text: "" }, + { type: "prose", text: "DATABASE_URL: postgres://localhost/flask_app" }, + { type: "prose", text: "SECRET_KEY: change-me" }, + { type: "prose", text: "CELERY_BROKER_URL: redis://localhost:6379/0" }, + { type: "empty", text: "" }, + ], + install: [ + { type: "header", text: "Set up a virtual environment" }, + { type: "empty", text: "" }, + { type: "command", text: "python3 -m venv venv" }, + { type: "command", text: "source venv/bin/activate" }, + { type: "empty", text: "" }, + { type: "header", text: "Install dependencies" }, + { type: "empty", text: "" }, + { type: "command", text: "pip install -r requirements.txt" }, + { type: "empty", text: "" }, + { type: "header", text: "Database Setup" }, + { type: "empty", text: "" }, + { type: "prose", text: "Initialise the database and run migrations:" }, + { type: "empty", text: "" }, + { type: "command", text: "flask db upgrade" }, + { type: "command", text: "flask seed-data" }, + { type: "empty", text: "" }, + ], + run: [ + { type: "header", text: "Getting Started" }, + { type: "empty", text: "" }, + { type: "subheader", text: "Set up a virtual environment" }, + { type: "empty", text: "" }, + { type: "command", text: "python3 -m venv venv" }, + { type: "command", text: "source venv/bin/activate" }, + { type: "empty", text: "" }, + { type: "subheader", text: "Install dependencies" }, + { type: "empty", text: "" }, + { type: "command", text: "pip install -r requirements.txt" }, + { type: "empty", text: "" }, + { type: "subheader", text: "Database Setup" }, + { type: "empty", text: "" }, + { type: "prose", text: "Initialise the database and run migrations:" }, + { type: "empty", text: "" }, + { type: "command", text: "flask db upgrade" }, + { type: "command", text: "flask seed-data" }, + { type: "empty", text: "" }, + { type: "header", text: "Run the development server" }, + { type: "empty", text: "" }, + { type: "command", text: "flask run --debug" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The app will be available at `http://localhost:5000`.", + }, + { type: "empty", text: "" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the test suite with pytest:" }, + { type: "empty", text: "" }, + { type: "command", text: "pytest" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run with coverage reporting:" }, + { type: "empty", text: "" }, + { type: "command", text: "pytest --cov=app --cov-report=term-missing" }, + { type: "empty", text: "" }, + ], + deploy: [ + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { type: "prose", text: "Build and push the container image:" }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t flask-app ." }, + { + type: "command", + text: "docker push registry.example.com/flask-app:latest", + }, + { type: "empty", text: "" }, + ], + all: [ + { type: "header", text: "Set up a virtual environment" }, + { type: "empty", text: "" }, + { type: "command", text: "python3 -m venv venv" }, + { type: "command", text: "source venv/bin/activate" }, + { type: "empty", text: "" }, + { type: "header", text: "Install dependencies" }, + { type: "empty", text: "" }, + { type: "command", text: "pip install -r requirements.txt" }, + { type: "empty", text: "" }, + { type: "header", text: "Database Setup" }, + { type: "empty", text: "" }, + { type: "prose", text: "Initialise the database and run migrations:" }, + { type: "empty", text: "" }, + { type: "command", text: "flask db upgrade" }, + { type: "command", text: "flask seed-data" }, + { type: "empty", text: "" }, + { type: "header", text: "Run the development server" }, + { type: "empty", text: "" }, + { type: "command", text: "flask run --debug" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The app will be available at `http://localhost:5000`.", + }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the test suite with pytest:" }, + { type: "empty", text: "" }, + { type: "command", text: "pytest" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run with coverage reporting:" }, + { type: "empty", text: "" }, + { type: "command", text: "pytest --cov=app --cov-report=term-missing" }, + { type: "empty", text: "" }, + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { type: "prose", text: "Build and push the container image:" }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t flask-app ." }, + { + type: "command", + text: "docker push registry.example.com/flask-app:latest", + }, + { type: "empty", text: "" }, + { type: "header", text: "Configuration" }, + { type: "empty", text: "" }, + { type: "prose", text: "DATABASE_URL: postgres://localhost/flask_app" }, + { type: "prose", text: "SECRET_KEY: change-me" }, + { type: "prose", text: "CELERY_BROKER_URL: redis://localhost:6379/0" }, + { type: "empty", text: "" }, + ], + }, + }, + { + slug: "ruby-rails", + name: "rails-app", + description: "Team project management app", + lang: "RB", + langFull: "Ruby", + readme: `# rails-app + +A Ruby on Rails application for team project management. Includes real-time updates via Action Cable and background job processing with Sidekiq. + +## Prerequisites + +- Ruby 3.3+ +- PostgreSQL 16+ +- Redis 7+ + +\`\`\`bash +brew install ruby postgresql redis +\`\`\` + +## Installation + +\`\`\`bash +bundle install +rails db:create db:migrate db:seed +\`\`\` + +## Running + +Start the Rails server: + +\`\`\`bash +bin/rails server +\`\`\` + +Or start all processes (web, worker, CSS watcher) with Foreman: + +\`\`\`bash +bin/dev +\`\`\` + +The app will be available at \`http://localhost:3000\`. + +## Testing + +Run the full test suite: + +\`\`\`bash +bundle exec rspec +\`\`\` + +Run a specific test file: + +\`\`\`bash +bundle exec rspec spec/models/project_spec.rb +\`\`\` + +## Deployment + +Deploy to production via Kamal: + +\`\`\`bash +kamal setup +kamal deploy +\`\`\` + +## License + +MIT`, + modes: { + default: [ + { type: "header", text: "Prerequisites" }, + { type: "command", text: "brew install ruby postgresql redis" }, + { type: "header", text: "Installation" }, + { type: "command", text: "bundle install" }, + { type: "command", text: "rails db:create db:migrate db:seed" }, + { type: "header", text: "Running" }, + { type: "command", text: "bin/rails server" }, + { type: "command", text: "bin/dev" }, + { type: "header", text: "Testing" }, + { type: "command", text: "bundle exec rspec" }, + { + type: "command", + text: "bundle exec rspec spec/models/project_spec.rb", + }, + { type: "header", text: "Deployment" }, + { type: "command", text: "kamal setup" }, + { type: "command", text: "kamal deploy" }, + ], + install: [ + { type: "header", text: "Prerequisites" }, + { type: "command", text: "brew install ruby postgresql redis" }, + { type: "header", text: "Installation" }, + { type: "command", text: "bundle install" }, + { type: "command", text: "rails db:create db:migrate db:seed" }, + ], + run: [ + { type: "header", text: "Running" }, + { type: "command", text: "bin/rails server" }, + { type: "command", text: "bin/dev" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "command", text: "bundle exec rspec" }, + { + type: "command", + text: "bundle exec rspec spec/models/project_spec.rb", + }, + ], + deploy: [ + { type: "header", text: "Deployment" }, + { type: "command", text: "kamal setup" }, + { type: "command", text: "kamal deploy" }, + ], + all: [ + { type: "header", text: "Prerequisites" }, + { type: "command", text: "brew install ruby postgresql redis" }, + { type: "header", text: "Installation" }, + { type: "command", text: "bundle install" }, + { type: "command", text: "rails db:create db:migrate db:seed" }, + { type: "header", text: "Running" }, + { type: "command", text: "bin/rails server" }, + { type: "command", text: "bin/dev" }, + { type: "header", text: "Testing" }, + { type: "command", text: "bundle exec rspec" }, + { + type: "command", + text: "bundle exec rspec spec/models/project_spec.rb", + }, + { type: "header", text: "Deployment" }, + { type: "command", text: "kamal setup" }, + { type: "command", text: "kamal deploy" }, + ], + }, + check: [ + { tool: "brew", installed: true, version: "5.1.1" }, + { tool: "bundle", installed: true, version: "2.5.3" }, + { tool: "rails", installed: true }, + { tool: "kamal", installed: false }, + ], + fullProse: { + default: [ + { type: "header", text: "Prerequisites" }, + { type: "empty", text: "" }, + { type: "prose", text: "- Ruby 3.3+" }, + { type: "prose", text: "- PostgreSQL 16+" }, + { type: "prose", text: "- Redis 7+" }, + { type: "empty", text: "" }, + { type: "command", text: "brew install ruby postgresql redis" }, + { type: "empty", text: "" }, + { type: "header", text: "Installation" }, + { type: "empty", text: "" }, + { type: "command", text: "bundle install" }, + { type: "command", text: "rails db:create db:migrate db:seed" }, + { type: "empty", text: "" }, + { type: "header", text: "Running" }, + { type: "empty", text: "" }, + { type: "prose", text: "Start the Rails server:" }, + { type: "empty", text: "" }, + { type: "command", text: "bin/rails server" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Or start all processes (web, worker, CSS watcher) with Foreman:", + }, + { type: "empty", text: "" }, + { type: "command", text: "bin/dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The app will be available at `http://localhost:3000`.", + }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the full test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "bundle exec rspec" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run a specific test file:" }, + { type: "empty", text: "" }, + { + type: "command", + text: "bundle exec rspec spec/models/project_spec.rb", + }, + { type: "empty", text: "" }, + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { type: "prose", text: "Deploy to production via Kamal:" }, + { type: "empty", text: "" }, + { type: "command", text: "kamal setup" }, + { type: "command", text: "kamal deploy" }, + { type: "empty", text: "" }, + ], + install: [ + { type: "header", text: "Prerequisites" }, + { type: "empty", text: "" }, + { type: "prose", text: "- Ruby 3.3+" }, + { type: "prose", text: "- PostgreSQL 16+" }, + { type: "prose", text: "- Redis 7+" }, + { type: "empty", text: "" }, + { type: "command", text: "brew install ruby postgresql redis" }, + { type: "empty", text: "" }, + { type: "header", text: "Installation" }, + { type: "empty", text: "" }, + { type: "command", text: "bundle install" }, + { type: "command", text: "rails db:create db:migrate db:seed" }, + { type: "empty", text: "" }, + ], + run: [ + { type: "header", text: "Running" }, + { type: "empty", text: "" }, + { type: "prose", text: "Start the Rails server:" }, + { type: "empty", text: "" }, + { type: "command", text: "bin/rails server" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Or start all processes (web, worker, CSS watcher) with Foreman:", + }, + { type: "empty", text: "" }, + { type: "command", text: "bin/dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The app will be available at `http://localhost:3000`.", + }, + { type: "empty", text: "" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the full test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "bundle exec rspec" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run a specific test file:" }, + { type: "empty", text: "" }, + { + type: "command", + text: "bundle exec rspec spec/models/project_spec.rb", + }, + { type: "empty", text: "" }, + ], + deploy: [ + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { type: "prose", text: "Deploy to production via Kamal:" }, + { type: "empty", text: "" }, + { type: "command", text: "kamal setup" }, + { type: "command", text: "kamal deploy" }, + { type: "empty", text: "" }, + ], + all: [ + { type: "header", text: "Prerequisites" }, + { type: "empty", text: "" }, + { type: "prose", text: "- Ruby 3.3+" }, + { type: "prose", text: "- PostgreSQL 16+" }, + { type: "prose", text: "- Redis 7+" }, + { type: "empty", text: "" }, + { type: "command", text: "brew install ruby postgresql redis" }, + { type: "empty", text: "" }, + { type: "header", text: "Installation" }, + { type: "empty", text: "" }, + { type: "command", text: "bundle install" }, + { type: "command", text: "rails db:create db:migrate db:seed" }, + { type: "empty", text: "" }, + { type: "header", text: "Running" }, + { type: "empty", text: "" }, + { type: "prose", text: "Start the Rails server:" }, + { type: "empty", text: "" }, + { type: "command", text: "bin/rails server" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Or start all processes (web, worker, CSS watcher) with Foreman:", + }, + { type: "empty", text: "" }, + { type: "command", text: "bin/dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "The app will be available at `http://localhost:3000`.", + }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the full test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "bundle exec rspec" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run a specific test file:" }, + { type: "empty", text: "" }, + { + type: "command", + text: "bundle exec rspec spec/models/project_spec.rb", + }, + { type: "empty", text: "" }, + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { type: "prose", text: "Deploy to production via Kamal:" }, + { type: "empty", text: "" }, + { type: "command", text: "kamal setup" }, + { type: "command", text: "kamal deploy" }, + { type: "empty", text: "" }, + ], + }, + }, + { + slug: "react-nextjs", + name: "next-app", + description: "SaaS analytics dashboard", + lang: "TS", + langFull: "TypeScript", + readme: `# next-app + +A Next.js application with App Router for a SaaS analytics dashboard. Uses Tailwind CSS, Drizzle ORM, and NextAuth for authentication. + +## Getting Started + +First, install dependencies: + +\`\`\`bash +npm install +\`\`\` + +Copy the environment file and configure your database connection: + +\`\`\`bash +cp .env.example .env.local +\`\`\` + +Run database migrations: + +\`\`\`bash +npm run db:push +\`\`\` + +Then, run the development server: + +\`\`\`bash +npm run dev +\`\`\` + +Open [http://localhost:3000](http://localhost:3000) with your browser. + +## Testing + +Run the test suite: + +\`\`\`bash +npm test +\`\`\` + +Run end-to-end tests with Playwright: + +\`\`\`bash +npx playwright test +\`\`\` + +## Deploy + +Build the production bundle: + +\`\`\`bash +npm run build +\`\`\` + +Deploy to Vercel: + +\`\`\`bash +npx vercel --prod +\`\`\` + +## Learn More + +See the [Next.js docs](https://nextjs.org/docs).`, + modes: { + default: [ + { type: "header", text: "Getting Started" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env.local" }, + { type: "command", text: "npm run db:push" }, + { type: "command", text: "npm run dev" }, + { type: "header", text: "Testing" }, + { type: "command", text: "npm test" }, + { type: "command", text: "npx playwright test" }, + { type: "header", text: "Deploy" }, + { type: "command", text: "npm run build" }, + { type: "command", text: "npx vercel --prod" }, + ], + install: [ + { type: "header", text: "Getting Started" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env.local" }, + { type: "command", text: "npm run db:push" }, + { type: "command", text: "npm run dev" }, + ], + run: [ + { type: "header", text: "Getting Started" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env.local" }, + { type: "command", text: "npm run db:push" }, + { type: "command", text: "npm run dev" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "command", text: "npm test" }, + { type: "command", text: "npx playwright test" }, + ], + deploy: [ + { type: "header", text: "Deploy" }, + { type: "command", text: "npm run build" }, + { type: "command", text: "npx vercel --prod" }, + ], + all: [ + { type: "header", text: "Getting Started" }, + { type: "command", text: "npm install" }, + { type: "command", text: "cp .env.example .env.local" }, + { type: "command", text: "npm run db:push" }, + { type: "command", text: "npm run dev" }, + { type: "header", text: "Testing" }, + { type: "command", text: "npm test" }, + { type: "command", text: "npx playwright test" }, + { type: "header", text: "Deploy" }, + { type: "command", text: "npm run build" }, + { type: "command", text: "npx vercel --prod" }, + ], + }, + check: [ + { tool: "npm", installed: true, version: "11.11.0" }, + { tool: "npx", installed: true, version: "10.9.4" }, + ], + fullProse: { + default: [ + { type: "header", text: "Getting Started" }, + { type: "empty", text: "" }, + { type: "prose", text: "First, install dependencies:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm install" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Copy the environment file and configure your database connection:", + }, + { type: "empty", text: "" }, + { type: "command", text: "cp .env.example .env.local" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run database migrations:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run db:push" }, + { type: "empty", text: "" }, + { type: "prose", text: "Then, run the development server:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Open [http://localhost:3000](http://localhost:3000) with your browser.", + }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm test" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run end-to-end tests with Playwright:" }, + { type: "empty", text: "" }, + { type: "command", text: "npx playwright test" }, + { type: "empty", text: "" }, + { type: "header", text: "Deploy" }, + { type: "empty", text: "" }, + { type: "prose", text: "Build the production bundle:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run build" }, + { type: "empty", text: "" }, + { type: "prose", text: "Deploy to Vercel:" }, + { type: "empty", text: "" }, + { type: "command", text: "npx vercel --prod" }, + { type: "empty", text: "" }, + ], + install: [ + { type: "header", text: "Getting Started" }, + { type: "empty", text: "" }, + { type: "prose", text: "First, install dependencies:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm install" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Copy the environment file and configure your database connection:", + }, + { type: "empty", text: "" }, + { type: "command", text: "cp .env.example .env.local" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run database migrations:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run db:push" }, + { type: "empty", text: "" }, + { type: "prose", text: "Then, run the development server:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Open [http://localhost:3000](http://localhost:3000) with your browser.", + }, + { type: "empty", text: "" }, + ], + run: [ + { type: "header", text: "Getting Started" }, + { type: "empty", text: "" }, + { type: "prose", text: "First, install dependencies:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm install" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Copy the environment file and configure your database connection:", + }, + { type: "empty", text: "" }, + { type: "command", text: "cp .env.example .env.local" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run database migrations:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run db:push" }, + { type: "empty", text: "" }, + { type: "prose", text: "Then, run the development server:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Open [http://localhost:3000](http://localhost:3000) with your browser.", + }, + { type: "empty", text: "" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm test" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run end-to-end tests with Playwright:" }, + { type: "empty", text: "" }, + { type: "command", text: "npx playwright test" }, + { type: "empty", text: "" }, + ], + deploy: [ + { type: "header", text: "Deploy" }, + { type: "empty", text: "" }, + { type: "prose", text: "Build the production bundle:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run build" }, + { type: "empty", text: "" }, + { type: "prose", text: "Deploy to Vercel:" }, + { type: "empty", text: "" }, + { type: "command", text: "npx vercel --prod" }, + { type: "empty", text: "" }, + ], + all: [ + { type: "header", text: "Getting Started" }, + { type: "empty", text: "" }, + { type: "prose", text: "First, install dependencies:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm install" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Copy the environment file and configure your database connection:", + }, + { type: "empty", text: "" }, + { type: "command", text: "cp .env.example .env.local" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run database migrations:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run db:push" }, + { type: "empty", text: "" }, + { type: "prose", text: "Then, run the development server:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run dev" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Open [http://localhost:3000](http://localhost:3000) with your browser.", + }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run the test suite:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm test" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run end-to-end tests with Playwright:" }, + { type: "empty", text: "" }, + { type: "command", text: "npx playwright test" }, + { type: "empty", text: "" }, + { type: "header", text: "Deploy" }, + { type: "empty", text: "" }, + { type: "prose", text: "Build the production bundle:" }, + { type: "empty", text: "" }, + { type: "command", text: "npm run build" }, + { type: "empty", text: "" }, + { type: "prose", text: "Deploy to Vercel:" }, + { type: "empty", text: "" }, + { type: "command", text: "npx vercel --prod" }, + { type: "empty", text: "" }, + ], + }, + }, + { + slug: "go-project", + name: "go-service", + description: "Event stream microservice", + lang: "GO", + langFull: "Go", + readme: `# go-service + +A microservice written in Go for processing event streams. Uses gRPC for inter-service communication and connects to PostgreSQL and Redis. + +## Requirements + +Go 1.22+ is required. + +\`\`\`bash +brew install go +\`\`\` + +## Setup + +\`\`\`bash +go mod download +cp config.example.yaml config.yaml +\`\`\` + +## Build + +\`\`\`bash +go build -o bin/service ./cmd/service +\`\`\` + +## Running + +\`\`\`bash +./bin/service --port 8080 +\`\`\` + +## Testing + +Run all tests: + +\`\`\`bash +go test ./... +\`\`\` + +Run tests with race detection and coverage: + +\`\`\`bash +go test -race -coverprofile=coverage.out ./... +\`\`\` + +## Deployment + +Build the container image and push to the registry: + +\`\`\`bash +docker build -t go-service . +docker push ghcr.io/acme/go-service:latest +\`\`\` + +## Environment Variables + +\`\`\`env +PORT=8080 +DB_HOST=localhost +REDIS_URL=redis://localhost:6379 +\`\`\``, + modes: { + default: [ + { type: "header", text: "Requirements" }, + { type: "command", text: "brew install go" }, + { type: "header", text: "Setup" }, + { type: "command", text: "go mod download" }, + { type: "command", text: "cp config.example.yaml config.yaml" }, + { type: "header", text: "Build" }, + { type: "command", text: "go build -o bin/service ./cmd/service" }, + { type: "header", text: "Running" }, + { type: "command", text: "./bin/service --port 8080" }, + { type: "header", text: "Testing" }, + { type: "command", text: "go test ./..." }, + { + type: "command", + text: "go test -race -coverprofile=coverage.out ./...", + }, + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t go-service ." }, + { type: "command", text: "docker push ghcr.io/acme/go-service:latest" }, + { type: "header", text: "Environment Variables" }, + { type: "empty", text: "(no commands - use --full to see prose)" }, + ], + install: [ + { type: "header", text: "Requirements" }, + { type: "command", text: "brew install go" }, + { type: "header", text: "Setup" }, + { type: "command", text: "go mod download" }, + { type: "command", text: "cp config.example.yaml config.yaml" }, + ], + run: [ + { type: "header", text: "Running" }, + { type: "command", text: "./bin/service --port 8080" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "command", text: "go test ./..." }, + { + type: "command", + text: "go test -race -coverprofile=coverage.out ./...", + }, + ], + deploy: [ + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t go-service ." }, + { type: "command", text: "docker push ghcr.io/acme/go-service:latest" }, + ], + all: [ + { type: "header", text: "Requirements" }, + { type: "command", text: "brew install go" }, + { type: "header", text: "Setup" }, + { type: "command", text: "go mod download" }, + { type: "command", text: "cp config.example.yaml config.yaml" }, + { type: "header", text: "Build" }, + { type: "command", text: "go build -o bin/service ./cmd/service" }, + { type: "header", text: "Running" }, + { type: "command", text: "./bin/service --port 8080" }, + { type: "header", text: "Testing" }, + { type: "command", text: "go test ./..." }, + { + type: "command", + text: "go test -race -coverprofile=coverage.out ./...", + }, + { type: "header", text: "Deployment" }, + { type: "command", text: "docker build -t go-service ." }, + { type: "command", text: "docker push ghcr.io/acme/go-service:latest" }, + { type: "header", text: "Environment Variables" }, + { type: "empty", text: "(no commands - use --full to see prose)" }, + ], + }, + check: [ + { tool: "brew", installed: true, version: "5.1.1" }, + { tool: "go", installed: false }, + { tool: "docker", installed: true, version: "29.1.3" }, + ], + fullProse: { + default: [ + { type: "header", text: "Requirements" }, + { type: "empty", text: "" }, + { type: "prose", text: "Go 1.22+ is required." }, + { type: "empty", text: "" }, + { type: "command", text: "brew install go" }, + { type: "empty", text: "" }, + { type: "header", text: "Setup" }, + { type: "empty", text: "" }, + { type: "command", text: "go mod download" }, + { type: "command", text: "cp config.example.yaml config.yaml" }, + { type: "empty", text: "" }, + { type: "header", text: "Build" }, + { type: "empty", text: "" }, + { type: "command", text: "go build -o bin/service ./cmd/service" }, + { type: "empty", text: "" }, + { type: "header", text: "Running" }, + { type: "empty", text: "" }, + { type: "command", text: "./bin/service --port 8080" }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run all tests:" }, + { type: "empty", text: "" }, + { type: "command", text: "go test ./..." }, + { type: "empty", text: "" }, + { type: "prose", text: "Run tests with race detection and coverage:" }, + { type: "empty", text: "" }, + { + type: "command", + text: "go test -race -coverprofile=coverage.out ./...", + }, + { type: "empty", text: "" }, + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Build the container image and push to the registry:", + }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t go-service ." }, + { type: "command", text: "docker push ghcr.io/acme/go-service:latest" }, + { type: "empty", text: "" }, + { type: "header", text: "Environment Variables" }, + { type: "empty", text: "" }, + { type: "prose", text: "PORT=8080" }, + { type: "prose", text: "DB_HOST=localhost" }, + { type: "prose", text: "REDIS_URL=redis://localhost:6379" }, + { type: "empty", text: "" }, + ], + install: [ + { type: "header", text: "Requirements" }, + { type: "empty", text: "" }, + { type: "prose", text: "Go 1.22+ is required." }, + { type: "empty", text: "" }, + { type: "command", text: "brew install go" }, + { type: "empty", text: "" }, + { type: "header", text: "Setup" }, + { type: "empty", text: "" }, + { type: "command", text: "go mod download" }, + { type: "command", text: "cp config.example.yaml config.yaml" }, + { type: "empty", text: "" }, + ], + run: [ + { type: "header", text: "Running" }, + { type: "empty", text: "" }, + { type: "command", text: "./bin/service --port 8080" }, + { type: "empty", text: "" }, + ], + test: [ + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run all tests:" }, + { type: "empty", text: "" }, + { type: "command", text: "go test ./..." }, + { type: "empty", text: "" }, + { type: "prose", text: "Run tests with race detection and coverage:" }, + { type: "empty", text: "" }, + { + type: "command", + text: "go test -race -coverprofile=coverage.out ./...", + }, + { type: "empty", text: "" }, + ], + deploy: [ + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Build the container image and push to the registry:", + }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t go-service ." }, + { type: "command", text: "docker push ghcr.io/acme/go-service:latest" }, + { type: "empty", text: "" }, + ], + all: [ + { type: "header", text: "Requirements" }, + { type: "empty", text: "" }, + { type: "prose", text: "Go 1.22+ is required." }, + { type: "empty", text: "" }, + { type: "command", text: "brew install go" }, + { type: "empty", text: "" }, + { type: "header", text: "Setup" }, + { type: "empty", text: "" }, + { type: "command", text: "go mod download" }, + { type: "command", text: "cp config.example.yaml config.yaml" }, + { type: "empty", text: "" }, + { type: "header", text: "Build" }, + { type: "empty", text: "" }, + { type: "command", text: "go build -o bin/service ./cmd/service" }, + { type: "empty", text: "" }, + { type: "header", text: "Running" }, + { type: "empty", text: "" }, + { type: "command", text: "./bin/service --port 8080" }, + { type: "empty", text: "" }, + { type: "header", text: "Testing" }, + { type: "empty", text: "" }, + { type: "prose", text: "Run all tests:" }, + { type: "empty", text: "" }, + { type: "command", text: "go test ./..." }, + { type: "empty", text: "" }, + { type: "prose", text: "Run tests with race detection and coverage:" }, + { type: "empty", text: "" }, + { + type: "command", + text: "go test -race -coverprofile=coverage.out ./...", + }, + { type: "empty", text: "" }, + { type: "header", text: "Deployment" }, + { type: "empty", text: "" }, + { + type: "prose", + text: "Build the container image and push to the registry:", + }, + { type: "empty", text: "" }, + { type: "command", text: "docker build -t go-service ." }, + { type: "command", text: "docker push ghcr.io/acme/go-service:latest" }, + { type: "empty", text: "" }, + { type: "header", text: "Environment Variables" }, + { type: "empty", text: "" }, + { type: "prose", text: "PORT=8080" }, + { type: "prose", text: "DB_HOST=localhost" }, + { type: "prose", text: "REDIS_URL=redis://localhost:6379" }, + { type: "empty", text: "" }, + ], + }, + }, +]; + +const HELP_TEXT = `hdi - "How do I..." - Extracts setup/run/test commands from a README. + +Usage: + hdi Interactive picker - shows all sections (default) + hdi install Just install/setup commands (aliases: setup, i) + hdi run Just run/start commands (aliases: start, r) + hdi test Just test commands (alias: t) + hdi deploy Just deploy/release commands and platform detection (alias: d) + hdi all Show all matched sections (currently the default mode) + hdi check Check if required tools are installed (experimental) + hdi [mode] --no-interactive Print commands without the picker (alias: --ni) + hdi [mode] --full Include prose around commands + hdi [mode] --raw Plain markdown output (no colour, good for piping) + hdi --json Structured JSON output (includes all sections) + hdi [mode] /path Scan a specific directory + hdi [mode] /path/to/file.md Parse a specific markdown file + +Interactive controls: + ↑/↓ k/j Navigate commands + Tab/S-Tab Jump between sections + Enter Execute the highlighted command + c Copy highlighted command to clipboard + q / Esc / Ctrl+C Quit`; + +const VERSION = "0.22.0"; diff --git a/website/public/picker.js b/website/public/picker.js new file mode 100644 index 0000000..eb6f1f5 --- /dev/null +++ b/website/public/picker.js @@ -0,0 +1,255 @@ +// Interactive picker simulation for the hdi +// Renders a navigable command list inside the terminal + +function Picker(items, projectName, modeLabel, terminal) { + var cmdIndices = []; + for (var i = 0; i < items.length; i++) { + if (items[i].type === "command") cmdIndices.push(i); + } + + var sectionFirstCmd = []; + for (var i = 0; i < items.length; i++) { + if (items[i].type === "header") { + for (var j = i + 1; j < items.length; j++) { + if (items[j].type === "command") { + sectionFirstCmd.push(cmdIndices.indexOf(j)); + break; + } + } + } + } + + var cursor = 0; + var flashMsg = ""; + var flashClass = ""; + var flashTimer = null; + var copied = false; + var copiedTimer = null; + var wrap = null; + var active = false; + + function render() { + if (!wrap) return; + wrap.innerHTML = ""; + + var titleLine = document.createElement("div"); + titleLine.className = "picker-row"; + var label = modeLabel ? " [" + modeLabel + "]" : ""; + titleLine.innerHTML = + '[hdi] ' + + '' + + esc(projectName) + + "" + + '' + + esc(label) + + ""; + wrap.appendChild(titleLine); + + var selectedIdx = cmdIndices[cursor]; + + for (var i = 0; i < items.length; i++) { + var item = items[i]; + var row = document.createElement("div"); + row.className = "picker-row"; + + if (item.type === "header") { + row.innerHTML = + "\n" + ' \u25b8 ' + esc(item.text) + ""; + } else if (item.type === "subheader") { + row.innerHTML = + '\n ' + esc(item.text) + ""; + } else if (item.type === "command") { + var isSelected = i === selectedIdx; + if (isSelected) { + row.classList.add("selected"); + var icon = copied ? "\u2714" : "\u25b6"; + row.innerHTML = + ' ' + + icon + + ' ' + + esc(item.text) + + ""; + } else { + row.innerHTML = + ' ' + esc(item.text) + ""; + } + } else if (item.type === "empty") { + if (item.text) { + row.innerHTML = ' ' + esc(item.text) + ""; + } + } + + wrap.appendChild(row); + } + + var footer = document.createElement("div"); + footer.className = "picker-footer"; + if (flashMsg) { + footer.innerHTML = + "\n " + + '' + + esc(flashMsg) + + ""; + } else { + footer.innerHTML = + "\n \u2191\u2193 navigate \u21e5 sections \u23ce execute c copy q quit"; + } + wrap.appendChild(footer); + } + + function moveCursor(delta) { + var next = cursor + delta; + if (next >= 0 && next < cmdIndices.length) { + cursor = next; + copied = false; + render(); + } + } + + function moveSection(delta) { + if (sectionFirstCmd.length === 0) return; + var i; + if (delta > 0) { + for (i = 0; i < sectionFirstCmd.length; i++) { + if (sectionFirstCmd[i] > cursor) { + cursor = sectionFirstCmd[i]; + copied = false; + render(); + return; + } + } + } else { + for (i = sectionFirstCmd.length - 1; i >= 0; i--) { + if (sectionFirstCmd[i] < cursor) { + cursor = sectionFirstCmd[i]; + copied = false; + render(); + return; + } + } + } + } + + function flash(msg, duration, cls) { + flashMsg = msg; + flashClass = cls || ""; + render(); + if (flashTimer) clearTimeout(flashTimer); + flashTimer = setTimeout(function () { + flashMsg = ""; + flashClass = ""; + render(); + }, duration || 1500); + } + + function clipCopy(cmd) { + if (navigator.clipboard && navigator.clipboard.writeText) { + return navigator.clipboard.writeText(cmd); + } + return Promise.reject(); + } + + function copyCmd() { + if (cmdIndices.length === 0) return; + var cmd = items[cmdIndices[cursor]].text; + clipCopy(cmd).then( + function () { + copied = true; + flash("\u2714 Copied: " + cmd); + if (copiedTimer) clearTimeout(copiedTimer); + copiedTimer = setTimeout(function () { + copied = false; + render(); + }, 1500); + }, + function () { + flash("Could not copy to clipboard"); + }, + ); + } + + function executeCmd() { + if (cmdIndices.length === 0) return; + var cmd = items[cmdIndices[cursor]].text; + flash( + "$ " + cmd + " \u2014 would execute in a real terminal", + 2500, + "flash-execute", + ); + } + + function handleKey(e) { + if (!active) return; + + var demoView = document.getElementById("demo-view"); + if (!demoView || demoView.classList.contains("hidden")) return; + + var key = e.key; + if (key === "ArrowUp" || key === "k") { + e.preventDefault(); + moveCursor(-1); + } else if (key === "ArrowDown" || key === "j") { + e.preventDefault(); + moveCursor(1); + } else if (key === "c") { + e.preventDefault(); + copyCmd(); + } else if (key === "Enter") { + e.preventDefault(); + executeCmd(); + } else if (key === "Tab") { + e.preventDefault(); + moveSection(e.shiftKey ? -1 : 1); + } else if (key === "ArrowRight") { + e.preventDefault(); + moveSection(1); + } else if (key === "ArrowLeft") { + e.preventDefault(); + moveSection(-1); + } else if (key === "q" || key === "Escape") { + e.preventDefault(); + destroy(); + terminal.showPrompt(); + } + } + + function mount(container) { + wrap = document.createElement("div"); + wrap.className = "picker-wrap"; + container.appendChild(wrap); + active = true; + document.addEventListener("keydown", handleKey); + render(); + scrollTerminal(); + } + + function destroy() { + active = false; + if (flashTimer) clearTimeout(flashTimer); + document.removeEventListener("keydown", handleKey); + if (wrap && wrap.parentNode) { + wrap.parentNode.removeChild(wrap); + } + } + + function scrollTerminal() { + var term = document.getElementById("terminal"); + if (term) term.scrollTop = term.scrollHeight; + } + + return { + mount: mount, + destroy: destroy, + isActive: function () { + return active; + }, + }; +} + +function esc(text) { + var d = document.createElement("div"); + d.textContent = text; + return d.innerHTML; +} diff --git a/website/public/terminal.js b/website/public/terminal.js new file mode 100644 index 0000000..cc6dd3f --- /dev/null +++ b/website/public/terminal.js @@ -0,0 +1,513 @@ +// Terminal emulator + app logic for the hdi demo site + +(function () { + var termEl = document.getElementById("terminal"); + var hiddenInput = document.getElementById("terminal-input"); + var sidebarEl = document.getElementById("sidebar"); + var hintsEl = document.getElementById("hints"); + + var currentProject = PROJECTS[0]; + var currentPicker = null; + var inputBuffer = ""; + var promptActive = false; + var autoPlayed = false; + + function focusTerminal() { + hiddenInput.focus({ preventScroll: true }); + } + + function clearTerminal() { + termEl.innerHTML = ""; + termEl.appendChild(hiddenInput); + } + + // ── Sidebar ────────────────────────────────────────────────────────────── + + function buildSidebar() { + sidebarEl.innerHTML = ""; + var heading = document.createElement("div"); + heading.className = "sidebar-heading"; + heading.textContent = "Example projects"; + sidebarEl.appendChild(heading); + PROJECTS.forEach(function (p) { + var item = document.createElement("div"); + item.className = "sidebar-item" + (p === currentProject ? " active" : ""); + item.innerHTML = + '' + + p.lang + + "" + + '"; + item.addEventListener("click", function (e) { + e.stopPropagation(); + selectProject(p); + }); + sidebarEl.appendChild(item); + }); + } + + function resetTerminal() { + clearTerminal(); + appendLine("t-dim", "cd " + currentProject.name); + appendLine("", ""); + appendLine( + "t-dim", + 'Type "hdi" to get started, "hdi --help" for more options, or "cat README.md" to see the full project README', + ); + appendLine( + "t-dim", + 'Use "hdi" with the "i" (install), "r" (run), "t" (test), or "d" (deploy) subcommands to see specific sections', + ); + appendLine("t-dim", 'eg. "hdi r"'); + appendLine("", ""); + showPrompt(); + focusTerminal(); + } + + function selectProject(p) { + if (currentPicker) { + currentPicker.destroy(); + currentPicker = null; + } + currentProject = p; + buildSidebar(); + resetTerminal(); + } + + // ── Terminal output ────────────────────────────────────────────────────── + + function appendLine(className, html) { + var div = document.createElement("div"); + div.className = "t-line" + (className ? " " + className : ""); + div.innerHTML = html; + termEl.appendChild(div); + } + + function scrollToBottom() { + termEl.scrollTop = termEl.scrollHeight; + } + + // ── Prompt ─────────────────────────────────────────────────────────────── + + function showPrompt() { + promptActive = true; + inputBuffer = ""; + var line = document.createElement("div"); + line.className = "t-line t-prompt"; + line.id = "prompt-line"; + line.innerHTML = + '$ '; + termEl.appendChild(line); + scrollToBottom(); + setHints(); + } + + function updatePromptDisplay() { + var el = document.getElementById("prompt-input"); + if (el) el.textContent = inputBuffer; + scrollToBottom(); + } + + function freezePrompt() { + promptActive = false; + var line = document.getElementById("prompt-line"); + if (line) { + line.removeAttribute("id"); + line.innerHTML = + "$ " + '' + esc(inputBuffer) + ""; + } + var input = document.getElementById("prompt-input"); + if (input) input.removeAttribute("id"); + } + + // ── Hints ──────────────────────────────────────────────────────────────── + + function setHints() { + hintsEl.innerHTML = + "Try: hdi hdi install hdi run " + + "hdi test hdi deploy hdi all hdi check hdi --full hdi --raw"; + hintsEl.querySelectorAll("code").forEach(function (el) { + el.style.cursor = "pointer"; + el.addEventListener("click", function () { + if (!promptActive) return; + inputBuffer = el.textContent; + updatePromptDisplay(); + focusTerminal(); + }); + }); + } + + // ── Command parsing ────────────────────────────────────────────────────── + + function parseCommand(input) { + var parts = input.trim().split(/\s+/); + if (parts[0] === "clear") return { clear: true }; + if (parts[0] === "cat" && /readme\.md$/i.test(parts[1] || "")) + return { cat: true }; + if (parts[0] !== "hdi") + return { + error: "Command not found: " + parts[0] + '. Try "hdi" to get started.', + }; + + var mode = "default"; + var full = false; + var raw = false; + var help = false; + var version = false; + + for (var i = 1; i < parts.length; i++) { + var arg = parts[i]; + switch (arg) { + case "install": + case "setup": + case "i": + mode = "install"; + break; + case "run": + case "start": + case "r": + mode = "run"; + break; + case "test": + case "t": + mode = "test"; + break; + case "deploy": + case "d": + mode = "deploy"; + break; + case "all": + case "a": + mode = "all"; + break; + case "check": + case "c": + mode = "check"; + break; + case "--full": + case "-f": + full = true; + break; + case "--raw": + raw = true; + break; + case "--help": + case "-h": + help = true; + break; + case "--version": + case "-v": + version = true; + break; + case "--no-interactive": + case "--ni": + break; + default: + return { error: "Unknown argument: " + arg }; + } + } + + if (help) return { help: true }; + if (version) return { version: true }; + return { mode: mode, full: full, raw: raw }; + } + + function modeLabel(mode) { + if (mode === "default") return ""; + return mode; + } + + // ── Execute command ────────────────────────────────────────────────────── + + function execute(input) { + if (!input.trim()) { + showPrompt(); + return; + } + + var parsed = parseCommand(input); + + if (parsed.clear) { + resetTerminal(); + return; + } + + if (parsed.cat) { + currentProject.readme.split("\n").forEach(function (line) { + appendLine("", esc(line)); + }); + appendLine("", ""); + showPrompt(); + return; + } + + if (parsed.error) { + appendLine("t-yellow", esc(parsed.error)); + appendLine("", ""); + showPrompt(); + return; + } + + if (parsed.help) { + HELP_TEXT.split("\n").forEach(function (line) { + appendLine("", esc(line)); + }); + appendLine("", ""); + showPrompt(); + return; + } + + if (parsed.version) { + appendLine("", "hdi " + VERSION); + appendLine("", ""); + showPrompt(); + return; + } + + if (parsed.mode === "check") { + renderCheck(); + showPrompt(); + return; + } + + if (parsed.raw) { + renderRaw(parsed.mode); + showPrompt(); + return; + } + + if (parsed.full) { + renderFull(parsed.mode); + showPrompt(); + return; + } + + var items = currentProject.modes[parsed.mode]; + if (!items || items.length === 0) { + appendLine("t-yellow", "No matching sections found"); + appendLine("t-dim", "Try: hdi all --full"); + appendLine("", ""); + showPrompt(); + return; + } + + setHints(); + currentPicker = Picker(items, currentProject.name, modeLabel(parsed.mode), { + showPrompt: function () { + currentPicker = null; + setHints(); + showPrompt(); + }, + }); + currentPicker.mount(termEl); + scrollToBottom(); + } + + // ── Raw renderer ───────────────────────────────────────────────────────── + + function renderRaw(mode) { + var items = currentProject.modes[mode]; + if (!items || items.length === 0) { + appendLine("t-yellow", "No matching sections found"); + appendLine("t-dim", "Try: hdi all --full"); + appendLine("", ""); + return; + } + + appendLine("", ""); + items.forEach(function (item) { + if (item.type === "header") { + appendLine("", "\n## " + esc(item.text)); + } else if (item.type === "subheader") { + appendLine("", "\n### " + esc(item.text)); + } else if (item.type === "command") { + appendLine("", esc(item.text)); + } else if (item.type === "empty" && item.text) { + appendLine("", " " + esc(item.text)); + } + }); + appendLine("", ""); + } + + // ── Full-prose renderer ────────────────────────────────────────────────── + + function renderFull(mode) { + var items = currentProject.fullProse[mode]; + if (!items || items.length === 0) { + appendLine("t-yellow", "No matching sections found"); + appendLine("t-dim", "Try: hdi all --full"); + appendLine("", ""); + return; + } + + var label = modeLabel(mode); + var labelStr = label ? " [" + label + "]" : ""; + appendLine( + "t-title-line", + "[hdi] " + + esc(currentProject.name) + + '' + + esc(labelStr) + + "", + ); + + items.forEach(function (item) { + if (item.type === "header") { + appendLine("", ""); + appendLine("t-header", " \u25b8 " + esc(item.text)); + } else if (item.type === "subheader") { + appendLine("", ""); + appendLine("t-subheader", " " + esc(item.text)); + } else if (item.type === "command") { + appendLine("t-command", " " + esc(item.text)); + } else if (item.type === "prose") { + appendLine("t-dim", " " + esc(item.text)); + } else if (item.type === "empty") { + appendLine("", ""); + } + }); + appendLine("", ""); + } + + // ── Check renderer ────────────────────────────────────────────────────── + + function renderCheck() { + var items = currentProject.check; + if (!items || items.length === 0) { + appendLine("t-yellow", "No tool references found in commands."); + appendLine("", ""); + return; + } + + appendLine("", ""); + appendLine( + "t-title-line", + "[hdi] " + + esc(currentProject.name) + + ' check', + ); + appendLine("", ""); + + var found = 0; + var missing = 0; + + items.forEach(function (item) { + var name = item.tool; + while (name.length < 14) name += " "; + if (item.installed) { + var ver = item.version + ? ' (' + esc(item.version) + ")" + : ""; + appendLine( + "", + ' \u2713 ' + esc(name) + ver, + ); + found++; + } else { + appendLine( + "", + ' \u2717 ' + + esc(name) + + ' not found', + ); + missing++; + } + }); + + appendLine("", ""); + if (missing === 0) { + appendLine("t-dim", " \u2713 All " + found + " tools found"); + } else { + appendLine( + "", + ' ' + + found + + ' found, ' + + missing + + " not found", + ); + } + appendLine("", ""); + } + + // ── Keyboard handling ──────────────────────────────────────────────────── + + function onKeyDown(e) { + if (currentPicker && currentPicker.isActive()) return; + if (!promptActive) return; + + if (e.key === "Enter") { + e.preventDefault(); + e.stopPropagation(); + var cmd = inputBuffer; + freezePrompt(); + execute(cmd); + } else if (e.key === "Backspace") { + e.preventDefault(); + inputBuffer = inputBuffer.slice(0, -1); + updatePromptDisplay(); + } else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey) { + e.preventDefault(); + inputBuffer += e.key; + updatePromptDisplay(); + } else if (e.key === "Tab") { + e.preventDefault(); + } else if (e.key === "l" && e.ctrlKey) { + // Ctrl+L to clear + e.preventDefault(); + clearTerminal(); + showPrompt(); + } + } + + hiddenInput.addEventListener("keydown", onKeyDown); + + // Handle mobile keyboard input via the hidden input element + // iOS Safari only shows the on-screen keyboard for real input elements, + // so we focus a hidden and proxy its value into inputBuffer + hiddenInput.addEventListener("input", function () { + if (!promptActive) return; + if (currentPicker && currentPicker.isActive()) return; + var val = hiddenInput.value; + if (val) { + inputBuffer += val; + hiddenInput.value = ""; + updatePromptDisplay(); + } + }); + + // Handle paste on both the terminal div and hidden input + function onPaste(e) { + if (!promptActive) return; + if (currentPicker && currentPicker.isActive()) return; + e.preventDefault(); + var text = (e.clipboardData || window.clipboardData).getData("text"); + if (text) { + // Take only the first line + var firstLine = text.split("\n")[0].trim(); + inputBuffer += firstLine; + updatePromptDisplay(); + } + } + termEl.addEventListener("paste", onPaste); + hiddenInput.addEventListener("paste", onPaste); + + termEl.addEventListener("click", function () { + if (!currentPicker || !currentPicker.isActive()) { + focusTerminal(); + } + }); + + // ── Init ───────────────────────────────────────────────────────────────── + + buildSidebar(); + selectProject(currentProject); +})(); diff --git a/website/src/layouts/Layout.astro b/website/src/layouts/Layout.astro index de01713..e520e6d 100644 --- a/website/src/layouts/Layout.astro +++ b/website/src/layouts/Layout.astro @@ -17,6 +17,7 @@ const { title } = Astro.props; content="CLI tool that scans a project's README and extracts the commands you need to get it running. No dependencies, just Bash." /> + + diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index e449e96..243ced2 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -175,7 +175,6 @@ $ hdi .about { flex: 1; - overflow-y: auto; padding: 2rem 1.5rem; max-width: 48rem; margin: 0 auto; From 8d080019bcf8485b1d8d5cbf2cbc17bf4fa4d7f6 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sun, 29 Mar 2026 23:25:37 +0100 Subject: [PATCH 12/15] build: migrate `.tool-versions` to astro --- website/.tool-versions | 1 + 1 file changed, 1 insertion(+) create mode 100644 website/.tool-versions diff --git a/website/.tool-versions b/website/.tool-versions new file mode 100644 index 0000000..01c1e7d --- /dev/null +++ b/website/.tool-versions @@ -0,0 +1 @@ +nodejs 24.14.0 From 51f4b3a43a5a7ec31c618c45e86cd1a9b1cf6593 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sun, 29 Mar 2026 23:26:30 +0100 Subject: [PATCH 13/15] test: migrate e2e playwright tests to astro --- .gitignore | 7 +- website/.github/workflows/playwright.yml | 27 +++++ website/package-lock.json | 82 +++++++++++++++ website/package.json | 2 + website/playwright.config.ts | 79 ++++++++++++++ website/tests/about.spec.ts | 26 +++++ website/tests/navigation.spec.ts | 47 +++++++++ website/tests/picker.spec.ts | 126 +++++++++++++++++++++++ website/tests/terminal.spec.ts | 83 +++++++++++++++ 9 files changed, 477 insertions(+), 2 deletions(-) create mode 100644 website/.github/workflows/playwright.yml create mode 100644 website/playwright.config.ts create mode 100644 website/tests/about.spec.ts create mode 100644 website/tests/navigation.spec.ts create mode 100644 website/tests/picker.spec.ts create mode 100644 website/tests/terminal.spec.ts diff --git a/.gitignore b/.gitignore index 84031ef..a6ea63b 100644 --- a/.gitignore +++ b/.gitignore @@ -17,8 +17,11 @@ pnpm-debug.log* # Node / Playwright (site tests) node_modules/ -site/test-results/ -site/playwright-report/ +test-results/ +playwright-report/ +blob-report/ +playwright/.cache/ +playwright/.auth/ # build output dist/ diff --git a/website/.github/workflows/playwright.yml b/website/.github/workflows/playwright.yml new file mode 100644 index 0000000..3eb1314 --- /dev/null +++ b/website/.github/workflows/playwright.yml @@ -0,0 +1,27 @@ +name: Playwright Tests +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + - name: Install dependencies + run: npm ci + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/website/package-lock.json b/website/package-lock.json index 57fd985..0ab43cd 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -11,6 +11,8 @@ "astro": "^6.1.1" }, "devDependencies": { + "@playwright/test": "^1.58.2", + "@types/node": "^25.5.0", "prettier": "3.8.1", "prettier-plugin-astro": "0.14.1" }, @@ -1121,6 +1123,22 @@ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", @@ -1655,6 +1673,16 @@ "@types/unist": "*" } }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -3731,6 +3759,53 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.5.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", @@ -4399,6 +4474,13 @@ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", "license": "MIT" }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "devOptional": true, + "license": "MIT" + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", diff --git a/website/package.json b/website/package.json index 152adbb..26f8b10 100644 --- a/website/package.json +++ b/website/package.json @@ -15,6 +15,8 @@ "astro": "^6.1.1" }, "devDependencies": { + "@playwright/test": "^1.58.2", + "@types/node": "^25.5.0", "prettier": "3.8.1", "prettier-plugin-astro": "0.14.1" } diff --git a/website/playwright.config.ts b/website/playwright.config.ts new file mode 100644 index 0000000..d426deb --- /dev/null +++ b/website/playwright.config.ts @@ -0,0 +1,79 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('')`. */ + baseURL: 'http://127.0.0.1:4321', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npm run dev -- --host 127.0.0.1 --port 4321', + url: 'http://127.0.0.1:4321', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/website/tests/about.spec.ts b/website/tests/about.spec.ts new file mode 100644 index 0000000..75fe7f8 --- /dev/null +++ b/website/tests/about.spec.ts @@ -0,0 +1,26 @@ +import { test, expect } from "@playwright/test"; + +test.describe("About page", () => { + test.beforeEach(async ({ page }) => { + await page.goto("/"); + }); + + test("renders hero and install section", async ({ page }) => { + await expect( + page.locator("h1", { hasText: "No more searching the README." }), + ).toBeVisible(); + await expect(page.locator(".install-section")).toBeVisible(); + await expect(page.locator(".install-method")).toHaveCount(2); + }); + + test("copy button works", async ({ page, context }) => { + await context.grantPermissions(["clipboard-read", "clipboard-write"]); + const btn = page.locator(".copy-btn").first(); + await btn.click(); + await expect(btn).toHaveText("Copied!"); + await expect(btn).toHaveClass(/copied/); + // Reverts after timeout + await expect(btn).toHaveText("Copy", { timeout: 3000 }); + await expect(btn).not.toHaveClass(/copied/); + }); +}); diff --git a/website/tests/navigation.spec.ts b/website/tests/navigation.spec.ts new file mode 100644 index 0000000..848cd1e --- /dev/null +++ b/website/tests/navigation.spec.ts @@ -0,0 +1,47 @@ +import { test, expect } from "@playwright/test"; + +test.describe("Page navigation", () => { + test("navigates to demo page via link", async ({ page }) => { + await page.goto("/"); + await page + .locator('a.button, a[href*="demo"], .demo-link a') + .first() + .click(); + const url = page.url(); + expect(url.endsWith("/demo")); + }); + + test("navigates back to main page from demo", async ({ page }) => { + await page.goto("/demo.html"); + await page.locator("a.nav-back").click(); + const url = page.url(); + expect(url.endsWith("/")); + await expect(page.locator("#about")).toBeVisible(); + }); + + test("direct navigation to /demo.html shows demo view", async ({ page }) => { + await page.goto("/demo.html"); + await expect(page.locator("#demo-view")).toBeVisible(); + }); +}); + +test.describe("Sidebar", () => { + test.beforeEach(async ({ page }) => { + await page.goto("/demo"); + await page.locator(".t-prompt").waitFor(); + }); + + test("shows projects with first active", async ({ page }) => { + const items = page.locator(".sidebar-item"); + await expect(items).toHaveCount(5); + await expect(items.first()).toHaveClass(/active/); + }); + + test("clicking a project switches context", async ({ page }) => { + const items = page.locator(".sidebar-item"); + await items.nth(1).click(); + await expect(items.nth(1)).toHaveClass(/active/); + await expect(items.first()).not.toHaveClass(/active/); + await expect(page.locator(".t-prompt")).toBeVisible(); + }); +}); diff --git a/website/tests/picker.spec.ts b/website/tests/picker.spec.ts new file mode 100644 index 0000000..6d91428 --- /dev/null +++ b/website/tests/picker.spec.ts @@ -0,0 +1,126 @@ +import { test, expect } from "@playwright/test"; + +test.describe("Interactive picker", () => { + test.beforeEach(async ({ page }) => { + await page.goto("/demo"); + await page.locator(".t-prompt").waitFor(); + await page.locator("#terminal-input").focus(); + await page.keyboard.type("hdi"); + await page.keyboard.press("Enter"); + await page.locator(".picker-wrap").waitFor(); + }); + + test("renders with title, commands, and footer", async ({ page }) => { + await expect(page.locator(".picker-wrap")).toBeVisible(); + await expect( + page.locator(".picker-wrap", { hasText: "express-api" }), + ).toBeVisible(); + await expect(page.locator(".picker-row.selected")).toHaveCount(1); + await expect( + page.locator(".picker-footer", { hasText: "navigate" }), + ).toBeVisible(); + }); + + test("arrow down/up navigates between commands", async ({ page }) => { + const first = await page + .locator(".picker-row.selected .t-command") + .textContent(); + await page.keyboard.press("ArrowDown"); + const second = await page + .locator(".picker-row.selected .t-command") + .textContent(); + expect(second).not.toBe(first); + await page.keyboard.press("ArrowUp"); + const back = await page + .locator(".picker-row.selected .t-command") + .textContent(); + expect(back).toBe(first); + }); + + test("j/k vim-style navigation", async ({ page }) => { + const first = await page + .locator(".picker-row.selected .t-command") + .textContent(); + await page.keyboard.press("j"); + const second = await page + .locator(".picker-row.selected .t-command") + .textContent(); + expect(second).not.toBe(first); + await page.keyboard.press("k"); + const back = await page + .locator(".picker-row.selected .t-command") + .textContent(); + expect(back).toBe(first); + }); + + test("Tab jumps to next section", async ({ page }) => { + const first = await page + .locator(".picker-row.selected .t-command") + .textContent(); + await page.keyboard.press("Tab"); + const jumped = await page + .locator(".picker-row.selected .t-command") + .textContent(); + expect(jumped).not.toBe(first); + // Tab should skip past multiple commands, not just move one + await page.keyboard.press("ArrowUp"); + const oneAbove = await page + .locator(".picker-row.selected .t-command") + .textContent(); + // If Tab jumped sections, moving up from the jumped position should + // land on a different command than the first (we skipped over commands) + expect(oneAbove).not.toBe(first); + }); + + test("Shift+Tab jumps to previous section", async ({ page }) => { + const first = await page + .locator(".picker-row.selected .t-command") + .textContent(); + await page.keyboard.press("Tab"); + await page.keyboard.press("Shift+Tab"); + const back = await page + .locator(".picker-row.selected .t-command") + .textContent(); + expect(back).toBe(first); + }); + + test("Enter shows execute flash", async ({ page }) => { + await page.keyboard.press("Enter"); + await expect(page.locator(".flash-execute")).toBeVisible(); + await expect( + page.locator(".flash-execute", { hasText: "would execute" }), + ).toBeVisible(); + }); + + test("c copies and shows flash", async ({ page, context }) => { + await context.grantPermissions(["clipboard-read", "clipboard-write"]); + await page.keyboard.press("c"); + await expect( + page.locator(".flash-msg", { hasText: "Copied" }), + ).toBeVisible(); + }); + + test("q quits picker", async ({ page }) => { + await page.keyboard.press("q"); + await expect(page.locator(".picker-wrap")).toHaveCount(0); + await expect(page.locator(".t-prompt").last()).toBeVisible(); + }); + + test("Escape quits picker", async ({ page }) => { + await page.keyboard.press("Escape"); + await expect(page.locator(".picker-wrap")).toHaveCount(0); + await expect(page.locator(".t-prompt").last()).toBeVisible(); + }); + + test("cannot navigate past first command", async ({ page }) => { + const first = await page + .locator(".picker-row.selected .t-command") + .textContent(); + // Press up many times - should stay on first + for (let i = 0; i < 10; i++) await page.keyboard.press("ArrowUp"); + const still = await page + .locator(".picker-row.selected .t-command") + .textContent(); + expect(still).toBe(first); + }); +}); diff --git a/website/tests/terminal.spec.ts b/website/tests/terminal.spec.ts new file mode 100644 index 0000000..8373132 --- /dev/null +++ b/website/tests/terminal.spec.ts @@ -0,0 +1,83 @@ +import { test, expect } from "@playwright/test"; + +test.describe("Terminal simulator", () => { + test.beforeEach(async ({ page }) => { + await page.goto("/demo"); + await page.locator(".t-prompt").waitFor(); + await page.locator("#terminal-input").focus(); + }); + + test("typing shows in prompt", async ({ page }) => { + await page.keyboard.type("hdi"); + await expect(page.locator("#prompt-input")).toHaveText("hdi"); + }); + + test("enter executes command", async ({ page }) => { + await page.keyboard.type("hdi --version"); + await page.keyboard.press("Enter"); + await expect(page.locator(".t-line", { hasText: /^hdi \d/ })).toBeVisible(); + // A new prompt should appear after output + await expect(page.locator(".t-prompt").last()).toBeVisible(); + }); + + test("unknown command shows error", async ({ page }) => { + await page.keyboard.type("foo"); + await page.keyboard.press("Enter"); + await expect( + page.locator(".t-line", { hasText: "Command not found: foo" }), + ).toBeVisible(); + }); + + test("clear resets terminal and accepts input", async ({ page }) => { + await page.keyboard.type("hdi --version"); + await page.keyboard.press("Enter"); + await page.locator(".t-prompt").last().waitFor(); + await page.keyboard.type("clear"); + await page.keyboard.press("Enter"); + // Welcome text should reappear + await expect( + page.locator(".t-line", { hasText: 'Type "hdi" to get started' }), + ).toBeVisible(); + // Should be able to type after clear + await page.keyboard.type("hdi"); + await expect(page.locator("#prompt-input")).toHaveText("hdi"); + }); + + test("Ctrl+L clears terminal", async ({ page }) => { + await page.keyboard.type("hdi --version"); + await page.keyboard.press("Enter"); + await page.locator(".t-prompt").last().waitFor(); + await page.keyboard.press("Control+l"); + await expect(page.locator(".t-prompt")).toBeVisible(); + }); + + test("cat README.md shows readme content", async ({ page }) => { + await page.keyboard.type("cat README.md"); + await page.keyboard.press("Enter"); + // Default project is express-api + await expect( + page.locator(".t-line", { hasText: "# express-api" }), + ).toBeVisible(); + }); + + test("hdi --help shows help text", async ({ page }) => { + await page.keyboard.type("hdi --help"); + await page.keyboard.press("Enter"); + await expect(page.locator(".t-line", { hasText: "Usage:" })).toBeVisible(); + }); + + test("hint bar buttons fill prompt", async ({ page }) => { + await page.locator("#hints code", { hasText: "hdi install" }).click(); + await expect(page.locator("#prompt-input")).toHaveText("hdi install"); + }); + + test("empty enter shows new prompt without error", async ({ page }) => { + const promptCount = await page.locator(".t-prompt").count(); + await page.keyboard.press("Enter"); + await expect(page.locator(".t-prompt")).toHaveCount(promptCount + 1); + // No error line should appear + await expect( + page.locator(".t-yellow", { hasText: "Command not found" }), + ).toHaveCount(0); + }); +}); From 925d82765e086032118d00c7ec92c8afb5b35a57 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sun, 29 Mar 2026 23:39:59 +0100 Subject: [PATCH 14/15] test: add e2e test to check clipboard content after copy, skip unsupported skipping firefox/webkit since this is not supported --- website/tests/about.spec.ts | 19 +++++++++++++++++-- website/tests/picker.spec.ts | 19 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/website/tests/about.spec.ts b/website/tests/about.spec.ts index 75fe7f8..7b52d4d 100644 --- a/website/tests/about.spec.ts +++ b/website/tests/about.spec.ts @@ -13,12 +13,27 @@ test.describe("About page", () => { await expect(page.locator(".install-method")).toHaveCount(2); }); - test("copy button works", async ({ page, context }) => { - await context.grantPermissions(["clipboard-read", "clipboard-write"]); + test("copy button works", async ({ page, context, browserName }) => { + test.skip( + browserName !== "chromium", + "Real clipboard permission support is inconsistent in Firefox/WebKit.", + ); + const btn = page.locator(".copy-btn").first(); + const expected = await btn.getAttribute("data-copy"); + expect(expected).toBeTruthy(); + + await context.grantPermissions(["clipboard-read", "clipboard-write"], { + origin: new URL(page.url()).origin, + }); + await btn.click(); await expect(btn).toHaveText("Copied!"); await expect(btn).toHaveClass(/copied/); + + const copied = await page.evaluate(() => navigator.clipboard.readText()); + expect(copied).toBe(expected); + // Reverts after timeout await expect(btn).toHaveText("Copy", { timeout: 3000 }); await expect(btn).not.toHaveClass(/copied/); diff --git a/website/tests/picker.spec.ts b/website/tests/picker.spec.ts index 6d91428..0fad7f0 100644 --- a/website/tests/picker.spec.ts +++ b/website/tests/picker.spec.ts @@ -92,12 +92,27 @@ test.describe("Interactive picker", () => { ).toBeVisible(); }); - test("c copies and shows flash", async ({ page, context }) => { - await context.grantPermissions(["clipboard-read", "clipboard-write"]); + test("c copies and shows flash", async ({ page, context, browserName }) => { + test.skip( + browserName !== "chromium", + "Real clipboard permission support is inconsistent in Firefox/WebKit.", + ); + + const selected = page.locator(".picker-row.selected .t-command"); + const expected = (await selected.textContent())?.trim(); + expect(expected).toBeTruthy(); + + await context.grantPermissions(["clipboard-read", "clipboard-write"], { + origin: new URL(page.url()).origin, + }); + await page.keyboard.press("c"); await expect( page.locator(".flash-msg", { hasText: "Copied" }), ).toBeVisible(); + + const copied = await page.evaluate(() => navigator.clipboard.readText()); + expect(copied).toBe(expected); }); test("q quits picker", async ({ page }) => { From 2cdde7a8e0926a13e05bc4dd0a0b820ca3cef995 Mon Sep 17 00:00:00 2001 From: Max Elkins Date: Sun, 29 Mar 2026 23:51:37 +0100 Subject: [PATCH 15/15] fix: migrate favicon --- website/public/favicon.ico | Bin 655 -> 0 bytes website/public/favicon.svg | 11 +++-------- 2 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 website/public/favicon.ico diff --git a/website/public/favicon.ico b/website/public/favicon.ico deleted file mode 100644 index 7f48a94d16071d6c8d06478c7458ab12e675019c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmV;A0&x9_P)Rl-XF(A`bsas&GH{e7U1}Ri zJr5jR8B2*Jd6$=$AqgTM2o2FV$WZ9|#jJ3mmpEs{jB0ps@*Kxv}=RB|IJih8Z&fqwCG`%bN0000#bW%=J zQ=IH#a_&L{B{_6Lu_3m>0bMN%+@aOmN_3G~H^8EGi>+bXO=;-|Z`uFnf==AdP z{Oj-S=ltmI=<4`LcLE*&009F@L_t(|+I`d4ZUZ3@1<*Uo7H^LoCw6-8z4wsbd;b4l zA}zMFtOw2mLX6O5Mgl}(5P=uOM4%=tnuHiuAp%(G<c=npm$Fz%eL - - + + + hdi