` tags, and descriptions are in `` tags.
-
-### Step 2: Create Your Config File
-
-Create a new text file and save it as `my-blog.yml` (or any name you like). Add this basic information:
-
-```yaml
-# my-blog.yml
-channel:
- url: https://example.com/blog
- title: My Awesome Blog
- description: The latest news from my awesome blog.
-```
-
-This tells html2rss: "Look at this website and call the feed 'My Awesome Blog'"
-
-### Step 3: Tell html2rss What to Find
-
-Now add the selectors that tell html2rss exactly what content to extract:
-
-```yaml
-# my-blog.yml
-selectors:
- items:
- selector: "article.post"
- title:
- selector: "h2 a"
- link:
- selector: "h2 a"
- description:
- selector: "p"
-```
-
-**What this means:**
-
-- `items: "article.post"` = "Find each article with class 'post'"
-- `title: "h2 a"` = "Get the title from the h2 link"
-- `link: "h2 a"` = "Get the link from the same h2 link"
-- `description: "p"` = "Get the description from the paragraph"
-
----
-
-## Advanced Techniques
-
-### Dynamic Feeds with Parameters
-
-Use the `parameters` block to create flexible configs. This is useful for feeds based on search terms, categories, or regions.
-
-```yaml
-# news-search.yml
-parameters:
- query:
- type: string
- default: "technology"
-
-channel:
- url: "https://news.example.com/search?q={query}"
- title: "News results for '{query}'"
-
-selectors:
- items:
- selector: ".article"
- title:
- selector: "h2 a"
- url:
- selector: "h2 a"
- extractor: "href"
-```
-
----
-
-## Contributing Your Config
-
-Have you created a config that others might find useful? We strongly encourage you to contribute it to the project! By sharing your config, you make it available to all users of the public `html2rss-web` service and the Feed Directory.
-
-To contribute, please [create a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) to the `html2rss-configs` repository.
-
----
-
-## Usage and Integration
-
-### With `html2rss-web`
-
-Once your pull request is reviewed and merged, your config will become available on the public [`html2rss-web`]({{ '/web-application/' | relative_url }}) instance. You can then access it at the path `/.rss`.
-
-### Programmatic Usage in Ruby
-
-You can also use `html2rss-configs` programmatically in your Ruby applications.
-
-Add this to your Gemfile:
-
-```ruby
-gem 'html2rss-configs', git: 'https://github.com/html2rss/html2rss-configs.git'
-```
-
-And use it in your code:
-
-```ruby
-require 'html2rss/configs'
-
-config = Html2rss::Configs.find_by_name('domainname.tld/whatever')
-rss = Html2rss.feed(config)
-```
diff --git a/index.md b/index.md
deleted file mode 100644
index 957c1961..00000000
--- a/index.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-layout: default
-title: Home
-nav_order: 1
----
-
-# Turn Any Website Into an RSS Feed
-
-Ever wished you could follow your favorite websites like a social media feed? The html2rss project makes it possible by creating RSS feeds for any website - even ones that don't offer them.
-
-[**🚀 Get Started with html2rss-web**]({{ '/web-application/getting-started' | relative_url }})
-
----
-
-## What is RSS?
-
-RSS (Really Simple Syndication) lets you follow websites in your favorite feed reader. Instead of checking multiple websites daily, you get all updates in one place - like a personalized news feed.
-
-## The html2rss Project
-
-The html2rss project provides two main ways to create RSS feeds:
-
-- **html2rss-web** - A user-friendly web application (recommended for most users)
-- **html2rss** - A Ruby gem for developers and advanced users
-
-Both use the same powerful engine to extract content from websites and convert it into RSS feeds.
-
----
-
-## Choose Your Path
-
-- **[html2rss-web]({{ '/web-application' | relative_url }}):** **Start here!** Easy-to-use web application. No technical knowledge required.
-- **[Feed Directory]({{ '/feed-directory' | relative_url }}):** Browse ready-made feeds for popular websites
-- **[html2rss (Ruby Gem)]({{ '/ruby-gem' | relative_url }}):** For developers who want to create custom configurations
-
----
-
-**Ready to get started?** Check out our [html2rss-web getting started guide]({{ '/web-application/getting-started' | relative_url }}) or [browse existing feeds]({{ '/feed-directory' | relative_url }}) to see what's possible.
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..824abe98
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,5698 @@
+{
+ "name": "html2rss-website",
+ "version": "0.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "html2rss-website",
+ "version": "0.0.1",
+ "dependencies": {
+ "@astrojs/sitemap": "^3.6.0",
+ "@astrojs/starlight": "^0.35.3",
+ "astro": "^5.6.1",
+ "sharp": "^0.34.2"
+ },
+ "devDependencies": {
+ "prettier": "^3.0.0",
+ "prettier-plugin-astro": "^0.14.0"
+ }
+ },
+ "node_modules/@astrojs/compiler": {
+ "version": "2.12.2",
+ "license": "MIT"
+ },
+ "node_modules/@astrojs/internal-helpers": {
+ "version": "0.7.2",
+ "license": "MIT"
+ },
+ "node_modules/@astrojs/markdown-remark": {
+ "version": "6.3.6",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/internal-helpers": "0.7.2",
+ "@astrojs/prism": "3.3.0",
+ "github-slugger": "^2.0.0",
+ "hast-util-from-html": "^2.0.3",
+ "hast-util-to-text": "^4.0.2",
+ "import-meta-resolve": "^4.1.0",
+ "js-yaml": "^4.1.0",
+ "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",
+ "shiki": "^3.2.1",
+ "smol-toml": "^1.3.4",
+ "unified": "^11.0.5",
+ "unist-util-remove-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "unist-util-visit-parents": "^6.0.1",
+ "vfile": "^6.0.3"
+ }
+ },
+ "node_modules/@astrojs/mdx": {
+ "version": "4.3.5",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/markdown-remark": "6.3.6",
+ "@mdx-js/mdx": "^3.1.1",
+ "acorn": "^8.15.0",
+ "es-module-lexer": "^1.7.0",
+ "estree-util-visit": "^2.0.0",
+ "hast-util-to-html": "^9.0.5",
+ "kleur": "^4.1.5",
+ "rehype-raw": "^7.0.0",
+ "remark-gfm": "^4.0.1",
+ "remark-smartypants": "^3.0.2",
+ "source-map": "^0.7.6",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.3"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "astro": "^5.0.0"
+ }
+ },
+ "node_modules/@astrojs/prism": {
+ "version": "3.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "prismjs": "^1.30.0"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0"
+ }
+ },
+ "node_modules/@astrojs/sitemap": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.6.0.tgz",
+ "integrity": "sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==",
+ "license": "MIT",
+ "dependencies": {
+ "sitemap": "^8.0.0",
+ "stream-replace-string": "^2.0.0",
+ "zod": "^3.25.76"
+ }
+ },
+ "node_modules/@astrojs/starlight": {
+ "version": "0.35.3",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/markdown-remark": "^6.3.1",
+ "@astrojs/mdx": "^4.2.3",
+ "@astrojs/sitemap": "^3.3.0",
+ "@pagefind/default-ui": "^1.3.0",
+ "@types/hast": "^3.0.4",
+ "@types/js-yaml": "^4.0.9",
+ "@types/mdast": "^4.0.4",
+ "astro-expressive-code": "^0.41.1",
+ "bcp-47": "^2.1.0",
+ "hast-util-from-html": "^2.0.1",
+ "hast-util-select": "^6.0.2",
+ "hast-util-to-string": "^3.0.0",
+ "hastscript": "^9.0.0",
+ "i18next": "^23.11.5",
+ "js-yaml": "^4.1.0",
+ "klona": "^2.0.6",
+ "mdast-util-directive": "^3.0.0",
+ "mdast-util-to-markdown": "^2.1.0",
+ "mdast-util-to-string": "^4.0.0",
+ "pagefind": "^1.3.0",
+ "rehype": "^13.0.1",
+ "rehype-format": "^5.0.0",
+ "remark-directive": "^3.0.0",
+ "ultrahtml": "^1.6.0",
+ "unified": "^11.0.5",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.2"
+ },
+ "peerDependencies": {
+ "astro": "^5.5.0"
+ }
+ },
+ "node_modules/@astrojs/telemetry": {
+ "version": "3.3.0",
+ "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",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.4",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.4"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.4",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.4",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@capsizecss/unpack": {
+ "version": "2.4.0",
+ "license": "MIT",
+ "dependencies": {
+ "blob-to-buffer": "^1.2.8",
+ "cross-fetch": "^3.0.4",
+ "fontkit": "^2.0.2"
+ }
+ },
+ "node_modules/@ctrl/tinycolor": {
+ "version": "4.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.5.0",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.9",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@expressive-code/core": {
+ "version": "0.41.3",
+ "license": "MIT",
+ "dependencies": {
+ "@ctrl/tinycolor": "^4.0.4",
+ "hast-util-select": "^6.0.2",
+ "hast-util-to-html": "^9.0.1",
+ "hast-util-to-text": "^4.0.1",
+ "hastscript": "^9.0.0",
+ "postcss": "^8.4.38",
+ "postcss-nested": "^6.0.1",
+ "unist-util-visit": "^5.0.0",
+ "unist-util-visit-parents": "^6.0.1"
+ }
+ },
+ "node_modules/@expressive-code/plugin-frames": {
+ "version": "0.41.3",
+ "license": "MIT",
+ "dependencies": {
+ "@expressive-code/core": "^0.41.3"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki": {
+ "version": "0.41.3",
+ "license": "MIT",
+ "dependencies": {
+ "@expressive-code/core": "^0.41.3",
+ "shiki": "^3.2.2"
+ }
+ },
+ "node_modules/@expressive-code/plugin-text-markers": {
+ "version": "0.41.3",
+ "license": "MIT",
+ "dependencies": {
+ "@expressive-code/core": "^0.41.3"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.3",
+ "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.0"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.0",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "license": "MIT"
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "3.1.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdx": "^2.0.0",
+ "acorn": "^8.0.0",
+ "collapse-white-space": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-util-scope": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "markdown-extensions": "^2.0.0",
+ "recma-build-jsx": "^1.0.0",
+ "recma-jsx": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "rehype-recma": "^1.0.0",
+ "remark-mdx": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "source-map": "^0.7.0",
+ "unified": "^11.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@oslojs/encoding": {
+ "version": "1.1.0",
+ "license": "MIT"
+ },
+ "node_modules/@pagefind/default-ui": {
+ "version": "1.4.0",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.3.0",
+ "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/pluginutils/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.50.1",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "3.12.2",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "3.12.2",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.3"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "3.12.2",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "3.12.2",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "3.12.2",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "3.12.2",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "license": "MIT"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.17",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/fontkit": {
+ "version": "2.0.8",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/js-yaml": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
+ "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.13",
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "license": "MIT"
+ },
+ "node_modules/@types/nlcst": {
+ "version": "2.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "24.4.0",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.11.0"
+ }
+ },
+ "node_modules/@types/sax": {
+ "version": "1.2.7",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "license": "ISC"
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.1",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.1.0"
+ }
+ },
+ "node_modules/ansi-align/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-align/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/ansi-align/node_modules/string-width": {
+ "version": "4.2.3",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-align/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "license": "MIT"
+ },
+ "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",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-iterate": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/astro": {
+ "version": "5.13.7",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/compiler": "^2.12.2",
+ "@astrojs/internal-helpers": "0.7.2",
+ "@astrojs/markdown-remark": "6.3.6",
+ "@astrojs/telemetry": "3.3.0",
+ "@capsizecss/unpack": "^2.4.0",
+ "@oslojs/encoding": "^1.1.0",
+ "@rollup/pluginutils": "^5.2.0",
+ "acorn": "^8.15.0",
+ "aria-query": "^5.3.2",
+ "axobject-query": "^4.1.0",
+ "boxen": "8.0.1",
+ "ci-info": "^4.3.0",
+ "clsx": "^2.1.1",
+ "common-ancestor-path": "^1.0.1",
+ "cookie": "^1.0.2",
+ "cssesc": "^3.0.0",
+ "debug": "^4.4.1",
+ "deterministic-object-hash": "^2.0.2",
+ "devalue": "^5.1.1",
+ "diff": "^5.2.0",
+ "dlv": "^1.1.3",
+ "dset": "^3.1.4",
+ "es-module-lexer": "^1.7.0",
+ "esbuild": "^0.25.0",
+ "estree-walker": "^3.0.3",
+ "flattie": "^1.1.1",
+ "fontace": "~0.3.0",
+ "github-slugger": "^2.0.0",
+ "html-escaper": "3.0.3",
+ "http-cache-semantics": "^4.2.0",
+ "import-meta-resolve": "^4.2.0",
+ "js-yaml": "^4.1.0",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.18",
+ "magicast": "^0.3.5",
+ "mrmime": "^2.0.1",
+ "neotraverse": "^0.6.18",
+ "p-limit": "^6.2.0",
+ "p-queue": "^8.1.0",
+ "package-manager-detector": "^1.3.0",
+ "picomatch": "^4.0.3",
+ "prompts": "^2.4.2",
+ "rehype": "^13.0.2",
+ "semver": "^7.7.2",
+ "shiki": "^3.12.0",
+ "smol-toml": "^1.4.2",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.14",
+ "tsconfck": "^3.1.6",
+ "ultrahtml": "^1.6.0",
+ "unifont": "~0.5.2",
+ "unist-util-visit": "^5.0.0",
+ "unstorage": "^1.17.0",
+ "vfile": "^6.0.3",
+ "vite": "^6.3.6",
+ "vitefu": "^1.1.1",
+ "xxhash-wasm": "^1.1.0",
+ "yargs-parser": "^21.1.1",
+ "yocto-spinner": "^0.2.3",
+ "zod": "^3.25.76",
+ "zod-to-json-schema": "^3.24.6",
+ "zod-to-ts": "^1.2.0"
+ },
+ "bin": {
+ "astro": "astro.js"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0",
+ "npm": ">=9.6.5",
+ "pnpm": ">=7.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/astrodotbuild"
+ },
+ "optionalDependencies": {
+ "sharp": "^0.34.0"
+ }
+ },
+ "node_modules/astro-expressive-code": {
+ "version": "0.41.3",
+ "license": "MIT",
+ "dependencies": {
+ "rehype-expressive-code": "^0.41.3"
+ },
+ "peerDependencies": {
+ "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/base-64": {
+ "version": "1.0.0",
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bcp-47": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/bcp-47-match": {
+ "version": "2.0.3",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/blob-to-buffer": {
+ "version": "1.2.9",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "license": "ISC"
+ },
+ "node_modules/boxen": {
+ "version": "8.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^8.0.0",
+ "chalk": "^5.3.0",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^7.2.0",
+ "type-fest": "^4.21.0",
+ "widest-line": "^5.0.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brotli": {
+ "version": "1.3.3",
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.1.2"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "8.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "5.6.2",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "4.3.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clone": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/collapse-white-space": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/common-ancestor-path": {
+ "version": "1.0.1",
+ "license": "ISC"
+ },
+ "node_modules/cookie": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cookie-es": {
+ "version": "1.2.2",
+ "license": "MIT"
+ },
+ "node_modules/cross-fetch": {
+ "version": "3.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^2.7.0"
+ }
+ },
+ "node_modules/crossws": {
+ "version": "0.3.5",
+ "license": "MIT",
+ "dependencies": {
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/css-selector-parser": {
+ "version": "3.1.3",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/css-tree": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.12.2",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destr": {
+ "version": "2.0.5",
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.4",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/deterministic-object-hash": {
+ "version": "2.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "base-64": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "5.3.2",
+ "license": "MIT"
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dfa": {
+ "version": "1.2.0",
+ "license": "MIT"
+ },
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/direction": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "bin": {
+ "direction": "cli.js"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "license": "MIT"
+ },
+ "node_modules/dset": {
+ "version": "3.1.4",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "10.5.0",
+ "license": "MIT"
+ },
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "license": "MIT"
+ },
+ "node_modules/esast-util-from-estree": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esast-util-from-js": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "acorn": "^8.0.0",
+ "esast-util-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.9",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.9",
+ "@esbuild/android-arm": "0.25.9",
+ "@esbuild/android-arm64": "0.25.9",
+ "@esbuild/android-x64": "0.25.9",
+ "@esbuild/darwin-arm64": "0.25.9",
+ "@esbuild/darwin-x64": "0.25.9",
+ "@esbuild/freebsd-arm64": "0.25.9",
+ "@esbuild/freebsd-x64": "0.25.9",
+ "@esbuild/linux-arm": "0.25.9",
+ "@esbuild/linux-arm64": "0.25.9",
+ "@esbuild/linux-ia32": "0.25.9",
+ "@esbuild/linux-loong64": "0.25.9",
+ "@esbuild/linux-mips64el": "0.25.9",
+ "@esbuild/linux-ppc64": "0.25.9",
+ "@esbuild/linux-riscv64": "0.25.9",
+ "@esbuild/linux-s390x": "0.25.9",
+ "@esbuild/linux-x64": "0.25.9",
+ "@esbuild/netbsd-arm64": "0.25.9",
+ "@esbuild/netbsd-x64": "0.25.9",
+ "@esbuild/openbsd-arm64": "0.25.9",
+ "@esbuild/openbsd-x64": "0.25.9",
+ "@esbuild/openharmony-arm64": "0.25.9",
+ "@esbuild/sunos-x64": "0.25.9",
+ "@esbuild/win32-arm64": "0.25.9",
+ "@esbuild/win32-ia32": "0.25.9",
+ "@esbuild/win32-x64": "0.25.9"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
+ "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/android-arm": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
+ "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/android-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
+ "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/android-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
+ "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
+ "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
+ "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-arm": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
+ "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
+ "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
+ "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
+ "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
+ "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
+ "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
+ "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
+ "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/linux-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
+ "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
+ "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
+ "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz",
+ "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
+ "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
+ "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
+ "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/esbuild/node_modules/@esbuild/win32-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
+ "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/estree-util-attach-comments": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-build-jsx": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-walker": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-scope": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-to-js": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "astring": "^1.8.0",
+ "source-map": "^0.7.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-visit": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "license": "MIT"
+ },
+ "node_modules/expressive-code": {
+ "version": "0.41.3",
+ "license": "MIT",
+ "dependencies": {
+ "@expressive-code/core": "^0.41.3",
+ "@expressive-code/plugin-frames": "^0.41.3",
+ "@expressive-code/plugin-shiki": "^0.41.3",
+ "@expressive-code/plugin-text-markers": "^0.41.3"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/flattie": {
+ "version": "1.1.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fontace": {
+ "version": "0.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/fontkit": "^2.0.8",
+ "fontkit": "^2.0.4"
+ }
+ },
+ "node_modules/fontkit": {
+ "version": "2.0.4",
+ "license": "MIT",
+ "dependencies": {
+ "@swc/helpers": "^0.5.12",
+ "brotli": "^1.3.2",
+ "clone": "^2.1.2",
+ "dfa": "^1.2.0",
+ "fast-deep-equal": "^3.1.3",
+ "restructure": "^3.0.0",
+ "tiny-inflate": "^1.0.3",
+ "unicode-properties": "^1.4.0",
+ "unicode-trie": "^2.0.0"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.4.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "2.0.0",
+ "license": "ISC"
+ },
+ "node_modules/h3": {
+ "version": "1.15.4",
+ "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.2",
+ "radix3": "^1.1.2",
+ "ufo": "^1.6.1",
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/hast-util-embedded": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-is-element": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-format": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-minify-whitespace": "^1.0.0",
+ "hast-util-phrasing": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-whitespace-sensitive-tag-names": "^3.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-html": {
+ "version": "2.0.3",
+ "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",
+ "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-has-property": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-body-ok-link": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-minify-whitespace": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-phrasing": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-has-property": "^3.0.0",
+ "hast-util-is-body-ok-link": "^3.0.0",
+ "hast-util-is-element": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw": {
+ "version": "9.1.0",
+ "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-select": {
+ "version": "6.0.4",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "bcp-47-match": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "css-selector-parser": "^3.0.0",
+ "devlop": "^1.0.0",
+ "direction": "^2.0.0",
+ "hast-util-has-property": "^3.0.0",
+ "hast-util-to-string": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "nth-check": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-estree": {
+ "version": "3.1.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-attach-comments": "^3.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "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-jsx-runtime": {
+ "version": "2.3.6",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-parse5": {
+ "version": "8.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "property-information": "^6.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-parse5/node_modules/property-information": {
+ "version": "6.5.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/hast-util-to-string": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-text": {
+ "version": "4.0.2",
+ "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",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "9.0.1",
+ "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",
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/html-whitespace-sensitive-tag-names": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/i18next": {
+ "version": "23.16.8",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2"
+ }
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.2.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.4",
+ "license": "MIT"
+ },
+ "node_modules/iron-webcrypto": {
+ "version": "1.2.1",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/brc-dd"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.4",
+ "license": "MIT"
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "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-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "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",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.0",
+ "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.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "license": "ISC"
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.19",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/magicast": {
+ "version": "0.3.5",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.25.4",
+ "@babel/types": "^7.25.4",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/markdown-extensions": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-definitions": {
+ "version": "6.0.0",
+ "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-directive": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "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.2",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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-mdx": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@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-mdx-jsx": {
+ "version": "3.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@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",
+ "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.0",
+ "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",
+ "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",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/micromark": {
+ "version": "4.0.2",
+ "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",
+ "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-directive": {
+ "version": "3.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "parse-entities": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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-mdx-expression": {
+ "version": "3.0.1",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-jsx": {
+ "version": "3.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-md": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.0.0",
+ "acorn-jsx": "^5.0.0",
+ "micromark-extension-mdx-expression": "^3.0.0",
+ "micromark-extension-mdx-jsx": "^3.0.0",
+ "micromark-extension-mdx-md": "^2.0.0",
+ "micromark-extension-mdxjs-esm": "^3.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-mdxjs-esm": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "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",
+ "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-mdx-expression": {
+ "version": "2.0.3",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-events-to-acorn": {
+ "version": "2.0.3",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/nlcst-to-string": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch-native": {
+ "version": "1.6.7",
+ "license": "MIT"
+ },
+ "node_modules/node-mock-http": {
+ "version": "1.0.3",
+ "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",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/ofetch": {
+ "version": "1.4.1",
+ "license": "MIT",
+ "dependencies": {
+ "destr": "^2.0.3",
+ "node-fetch-native": "^1.6.4",
+ "ufo": "^1.5.4"
+ }
+ },
+ "node_modules/ohash": {
+ "version": "2.0.11",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.1",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.3",
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.1",
+ "regex": "^6.0.1",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "6.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue": {
+ "version": "8.1.1",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^5.0.1",
+ "p-timeout": "^6.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-timeout": {
+ "version": "6.1.4",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.3.0",
+ "license": "MIT"
+ },
+ "node_modules/pagefind": {
+ "version": "1.4.0",
+ "license": "MIT",
+ "bin": {
+ "pagefind": "lib/runner/bin.cjs"
+ },
+ "optionalDependencies": {
+ "@pagefind/darwin-arm64": "1.4.0",
+ "@pagefind/darwin-x64": "1.4.0",
+ "@pagefind/freebsd-x64": "1.4.0",
+ "@pagefind/linux-arm64": "1.4.0",
+ "@pagefind/linux-x64": "1.4.0",
+ "@pagefind/windows-x64": "1.4.0"
+ }
+ },
+ "node_modules/pagefind/node_modules/@pagefind/darwin-arm64": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz",
+ "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/pagefind/node_modules/@pagefind/darwin-x64": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz",
+ "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/pagefind/node_modules/@pagefind/freebsd-x64": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz",
+ "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/pagefind/node_modules/@pagefind/linux-arm64": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz",
+ "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/pagefind/node_modules/@pagefind/linux-x64": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz",
+ "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/pagefind/node_modules/@pagefind/windows-x64": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz",
+ "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/pako": {
+ "version": "0.2.9",
+ "license": "MIT"
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "license": "MIT"
+ },
+ "node_modules/parse-latin": {
+ "version": "7.0.0",
+ "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",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "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.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "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/postcss-nested": {
+ "version": "6.2.0",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
+ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
+ "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/prismjs": {
+ "version": "1.30.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prompts/node_modules/kleur": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/radix3": {
+ "version": "1.1.2",
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/recma-build-jsx": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-build-jsx": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-jsx": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "acorn-jsx": "^5.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "recma-parse": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/recma-parse": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "esast-util-from-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-stringify": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "license": "MIT"
+ },
+ "node_modules/rehype": {
+ "version": "13.0.2",
+ "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-expressive-code": {
+ "version": "0.41.3",
+ "license": "MIT",
+ "dependencies": {
+ "expressive-code": "^0.41.3"
+ }
+ },
+ "node_modules/rehype-format": {
+ "version": "5.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-format": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-parse": {
+ "version": "9.0.1",
+ "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",
+ "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-recma": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "hast-util-to-estree": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-stringify": {
+ "version": "10.0.1",
+ "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-directive": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-directive": "^3.0.0",
+ "micromark-extension-directive": "^3.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "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-mdx": {
+ "version": "3.1.1",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-mdx": "^3.0.0",
+ "micromark-extension-mdxjs": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "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",
+ "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",
+ "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",
+ "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/restructure": {
+ "version": "3.0.2",
+ "license": "MIT"
+ },
+ "node_modules/retext": {
+ "version": "9.0.0",
+ "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",
+ "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",
+ "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",
+ "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.50.1",
+ "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.50.1",
+ "@rollup/rollup-android-arm64": "4.50.1",
+ "@rollup/rollup-darwin-arm64": "4.50.1",
+ "@rollup/rollup-darwin-x64": "4.50.1",
+ "@rollup/rollup-freebsd-arm64": "4.50.1",
+ "@rollup/rollup-freebsd-x64": "4.50.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.50.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.50.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.50.1",
+ "@rollup/rollup-linux-arm64-musl": "4.50.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.50.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.50.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.50.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.50.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.50.1",
+ "@rollup/rollup-linux-x64-gnu": "4.50.1",
+ "@rollup/rollup-linux-x64-musl": "4.50.1",
+ "@rollup/rollup-openharmony-arm64": "4.50.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.50.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.50.1",
+ "@rollup/rollup-win32-x64-msvc": "4.50.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz",
+ "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz",
+ "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz",
+ "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz",
+ "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz",
+ "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz",
+ "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz",
+ "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz",
+ "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz",
+ "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz",
+ "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz",
+ "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz",
+ "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz",
+ "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz",
+ "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz",
+ "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz",
+ "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz",
+ "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz",
+ "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz",
+ "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz",
+ "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "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.4.1",
+ "license": "ISC"
+ },
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.34.3",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.4",
+ "semver": "^7.7.2"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.3",
+ "@img/sharp-darwin-x64": "0.34.3",
+ "@img/sharp-libvips-darwin-arm64": "1.2.0",
+ "@img/sharp-libvips-darwin-x64": "1.2.0",
+ "@img/sharp-libvips-linux-arm": "1.2.0",
+ "@img/sharp-libvips-linux-arm64": "1.2.0",
+ "@img/sharp-libvips-linux-ppc64": "1.2.0",
+ "@img/sharp-libvips-linux-s390x": "1.2.0",
+ "@img/sharp-libvips-linux-x64": "1.2.0",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.0",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.0",
+ "@img/sharp-linux-arm": "0.34.3",
+ "@img/sharp-linux-arm64": "0.34.3",
+ "@img/sharp-linux-ppc64": "0.34.3",
+ "@img/sharp-linux-s390x": "0.34.3",
+ "@img/sharp-linux-x64": "0.34.3",
+ "@img/sharp-linuxmusl-arm64": "0.34.3",
+ "@img/sharp-linuxmusl-x64": "0.34.3",
+ "@img/sharp-wasm32": "0.34.3",
+ "@img/sharp-win32-arm64": "0.34.3",
+ "@img/sharp-win32-ia32": "0.34.3",
+ "@img/sharp-win32-x64": "0.34.3"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz",
+ "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==",
+ "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.0"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz",
+ "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz",
+ "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz",
+ "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz",
+ "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz",
+ "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz",
+ "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz",
+ "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz",
+ "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz",
+ "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==",
+ "cpu": [
+ "arm"
+ ],
+ "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.0"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz",
+ "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==",
+ "cpu": [
+ "arm64"
+ ],
+ "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.0"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz",
+ "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "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.0"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz",
+ "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "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.0"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz",
+ "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "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.0"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz",
+ "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "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.0"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz",
+ "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==",
+ "cpu": [
+ "x64"
+ ],
+ "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.0"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-wasm32": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz",
+ "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.4.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp/node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz",
+ "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==",
+ "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/sharp/node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz",
+ "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==",
+ "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/sharp/node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz",
+ "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==",
+ "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/shiki": {
+ "version": "3.12.2",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.12.2",
+ "@shikijs/engine-javascript": "3.12.2",
+ "@shikijs/engine-oniguruma": "3.12.2",
+ "@shikijs/langs": "3.12.2",
+ "@shikijs/themes": "3.12.2",
+ "@shikijs/types": "3.12.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.4",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "license": "MIT"
+ },
+ "node_modules/sitemap": {
+ "version": "8.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "^17.0.5",
+ "@types/sax": "^1.2.1",
+ "arg": "^5.0.0",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "sitemap": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=6.0.0"
+ }
+ },
+ "node_modules/sitemap/node_modules/@types/node": {
+ "version": "17.0.45",
+ "license": "MIT"
+ },
+ "node_modules/smol-toml": {
+ "version": "1.4.2",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/cyyynthia"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "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",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stream-replace-string": {
+ "version": "2.0.0",
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "7.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "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/strip-ansi": {
+ "version": "7.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/style-to-js": {
+ "version": "1.1.17",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.9"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.9",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.4"
+ }
+ },
+ "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/tiny-inflate": {
+ "version": "1.0.3",
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "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/tr46": {
+ "version": "0.0.3",
+ "license": "MIT"
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/tsconfck": {
+ "version": "3.1.6",
+ "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",
+ "license": "0BSD"
+ },
+ "node_modules/type-fest": {
+ "version": "4.41.0",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.2",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.1",
+ "license": "MIT"
+ },
+ "node_modules/ultrahtml": {
+ "version": "1.6.0",
+ "license": "MIT"
+ },
+ "node_modules/uncrypto": {
+ "version": "0.1.3",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "7.11.0",
+ "license": "MIT"
+ },
+ "node_modules/unicode-properties": {
+ "version": "1.4.1",
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.0",
+ "unicode-trie": "^2.0.0"
+ }
+ },
+ "node_modules/unicode-trie": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "pako": "^0.2.5",
+ "tiny-inflate": "^1.0.0"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "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.5.2",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "^3.0.0",
+ "ofetch": "^1.4.1",
+ "ohash": "^2.0.0"
+ }
+ },
+ "node_modules/unist-util-find-after": {
+ "version": "5.0.0",
+ "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.0",
+ "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",
+ "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",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position-from-estree": {
+ "version": "2.0.0",
+ "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",
+ "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",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "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",
+ "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.1",
+ "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.1",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "^3.1.3",
+ "chokidar": "^4.0.3",
+ "destr": "^2.0.5",
+ "h3": "^1.15.4",
+ "lru-cache": "^10.4.3",
+ "node-fetch-native": "^1.6.7",
+ "ofetch": "^1.4.1",
+ "ufo": "^1.6.1"
+ },
+ "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.0.3 || ^7.0.0",
+ "@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.0.1",
+ "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/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "license": "MIT"
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "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",
+ "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",
+ "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": "6.3.6",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "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.1",
+ "license": "MIT",
+ "workspaces": [
+ "tests/deps/*",
+ "tests/projects/*",
+ "tests/projects/workspace/packages/*"
+ ],
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/web-namespaces": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which-pm-runs": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "9.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/xxhash-wasm": {
+ "version": "1.1.0",
+ "license": "MIT"
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.2.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yocto-spinner": {
+ "version": "0.2.3",
+ "license": "MIT",
+ "dependencies": {
+ "yoctocolors": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=18.19"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.25.76",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-to-json-schema": {
+ "version": "3.24.6",
+ "license": "ISC",
+ "peerDependencies": {
+ "zod": "^3.24.1"
+ }
+ },
+ "node_modules/zod-to-ts": {
+ "version": "1.2.0",
+ "peerDependencies": {
+ "typescript": "^4.9.4 || ^5.0.2",
+ "zod": "^3"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index dee10170..6e387b5e 100644
--- a/package.json
+++ b/package.json
@@ -1,21 +1,26 @@
{
- "license": "UNLICENSED",
- "private": true,
+ "name": "html2rss-website",
+ "type": "module",
+ "version": "0.0.1",
"scripts": {
- "lint": "yarn lint:stylelint && yarn lint:prettier",
- "lint:stylelint": "stylelint assets/**/*.scss",
- "lint:prettier": "prettier --check .",
- "lintfix": "yarn lintfix:stylelint && yarn lintfix:prettier",
- "lintfix:stylelint": "stylelint --fix assets/**/*.scss",
- "lintfix:prettier": "prettier --write ."
+ "dev": "astro dev",
+ "start": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "astro": "astro",
+ "update-data": "ruby bin/data-update",
+ "build:full": "npm run update-data && npm run build",
+ "lint": "prettier --check .",
+ "lintfix": "prettier --write ."
},
- "devDependencies": {
- "prettier": "3.6.2",
- "stylelint": "16.24.0",
- "stylelint-config-recess-order": "7.3.0",
- "stylelint-order": "7.0.0",
- "stylelint-config-recommended-scss": "16.0.1",
- "stylelint-scss": "6.12.1"
+ "dependencies": {
+ "@astrojs/sitemap": "^3.6.0",
+ "@astrojs/starlight": "^0.35.3",
+ "astro": "^5.6.1",
+ "sharp": "^0.34.2"
},
- "packageManager": "yarn@1.22.22"
+ "devDependencies": {
+ "prettier": "^3.0.0",
+ "prettier-plugin-astro": "^0.14.0"
+ }
}
diff --git a/prettier.config.js b/prettier.config.js
new file mode 100644
index 00000000..dedce05a
--- /dev/null
+++ b/prettier.config.js
@@ -0,0 +1,34 @@
+/** @type {import("prettier").Config} */
+export default {
+ // Global settings
+ printWidth: 110,
+ singleQuote: false,
+ trailingComma: 'all',
+ plugins: ['prettier-plugin-astro'],
+
+ // File-specific overrides
+ overrides: [
+ {
+ // Astro files need special parser
+ files: '*.astro',
+ options: {
+ parser: 'astro',
+ },
+ },
+ {
+ // Markdown and prose files should preserve natural line breaks
+ files: '*.{html,md,mdx}',
+ options: {
+ proseWrap: 'preserve', // Don't force rewrapping of prose content
+ },
+ },
+ {
+ // JavaScript/TypeScript files use single quotes and ES5 trailing commas
+ files: '*.{js,ts,jsx,tsx}',
+ options: {
+ singleQuote: true,
+ trailingComma: 'es5',
+ },
+ },
+ ],
+};
diff --git a/public/assets/android-chrome-192x192.png b/public/assets/android-chrome-192x192.png
new file mode 100644
index 00000000..75aee0e9
Binary files /dev/null and b/public/assets/android-chrome-192x192.png differ
diff --git a/public/assets/android-chrome-512x512.png b/public/assets/android-chrome-512x512.png
new file mode 100644
index 00000000..14de528b
Binary files /dev/null and b/public/assets/android-chrome-512x512.png differ
diff --git a/public/assets/apple-touch-icon.png b/public/assets/apple-touch-icon.png
new file mode 100644
index 00000000..7620245c
Binary files /dev/null and b/public/assets/apple-touch-icon.png differ
diff --git a/public/assets/browserconfig.xml b/public/assets/browserconfig.xml
new file mode 100644
index 00000000..f4c5ce10
--- /dev/null
+++ b/public/assets/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #111111
+
+
+
diff --git a/public/assets/favicon-16x16.png b/public/assets/favicon-16x16.png
new file mode 100644
index 00000000..3186b418
Binary files /dev/null and b/public/assets/favicon-16x16.png differ
diff --git a/public/assets/favicon-32x32.png b/public/assets/favicon-32x32.png
new file mode 100644
index 00000000..8577e1a9
Binary files /dev/null and b/public/assets/favicon-32x32.png differ
diff --git a/public/assets/favicon.ico b/public/assets/favicon.ico
new file mode 100644
index 00000000..0a3e0b1d
Binary files /dev/null and b/public/assets/favicon.ico differ
diff --git a/public/assets/icon.png b/public/assets/icon.png
new file mode 100644
index 00000000..1f5ade57
Binary files /dev/null and b/public/assets/icon.png differ
diff --git a/public/assets/logo.png b/public/assets/logo.png
new file mode 100644
index 00000000..2be23113
Binary files /dev/null and b/public/assets/logo.png differ
diff --git a/public/assets/mstile-144x144.png b/public/assets/mstile-144x144.png
new file mode 100644
index 00000000..9f7dd617
Binary files /dev/null and b/public/assets/mstile-144x144.png differ
diff --git a/public/assets/mstile-150x150.png b/public/assets/mstile-150x150.png
new file mode 100644
index 00000000..08ccc4d6
Binary files /dev/null and b/public/assets/mstile-150x150.png differ
diff --git a/public/assets/mstile-310x150.png b/public/assets/mstile-310x150.png
new file mode 100644
index 00000000..81721191
Binary files /dev/null and b/public/assets/mstile-310x150.png differ
diff --git a/public/assets/mstile-310x310.png b/public/assets/mstile-310x310.png
new file mode 100644
index 00000000..e5d09653
Binary files /dev/null and b/public/assets/mstile-310x310.png differ
diff --git a/public/assets/mstile-70x70.png b/public/assets/mstile-70x70.png
new file mode 100644
index 00000000..1dfe5e37
Binary files /dev/null and b/public/assets/mstile-70x70.png differ
diff --git a/public/assets/safari-pinned-tab.svg b/public/assets/safari-pinned-tab.svg
new file mode 100644
index 00000000..d90a7357
--- /dev/null
+++ b/public/assets/safari-pinned-tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/assets/site.webmanifest b/public/assets/site.webmanifest
new file mode 100644
index 00000000..5f134d03
--- /dev/null
+++ b/public/assets/site.webmanifest
@@ -0,0 +1,22 @@
+{
+ "name": "html2rss - Turn Any Website Into RSS",
+ "short_name": "html2rss",
+ "description": "Create RSS feeds from any website - no coding required. Turn blogs, news sites, and forums into RSS feeds you can follow in your favorite reader.",
+ "start_url": "/",
+ "scope": "/",
+ "icons": [
+ {
+ "src": "/assets/images/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/assets/images/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#111111",
+ "background_color": "#111111",
+ "display": "standalone"
+}
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 00000000..10bf0ba9
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,5 @@
+User-agent: *
+Allow: /
+Disallow: /feed-directory/
+
+Sitemap: https://html2rss.github.io/sitemap.xml
diff --git a/ruby-gem/how-to/advanced-content-extraction.md b/ruby-gem/how-to/advanced-content-extraction.md
deleted file mode 100644
index 7d5845af..00000000
--- a/ruby-gem/how-to/advanced-content-extraction.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-layout: default
-title: Advanced Content Extraction
-nav_order: 3
-parent: How-To Guides
-grand_parent: Ruby Gem
----
-
-# Advanced Content Extraction with Selectors
-
-While basic selectors are straightforward, you can achieve very precise content extraction by combining selectors with different extractors and post-processors.
-
-## Extractors
-
-Learn how to extract specific attributes (like `src` for images) or static values. See [Extractors]({{ '/ruby-gem/reference/selectors/extractors' | relative_url }}).
-
-## Post Processors
-
-Manipulate extracted text, sanitize HTML, convert Markdown, or apply custom logic. See [Post Processors]({{ '/ruby-gem/reference/selectors/post-processors' | relative_url }}).
diff --git a/ruby-gem/how-to/custom-http-requests.md b/ruby-gem/how-to/custom-http-requests.md
deleted file mode 100644
index 4885f7c7..00000000
--- a/ruby-gem/how-to/custom-http-requests.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-layout: default
-title: Custom HTTP Requests
-nav_order: 4
-parent: How-To Guides
-grand_parent: Ruby Gem
----
-
-# Customizing HTTP Requests
-
-You might need to send custom HTTP headers (e.g., `User-Agent`, `Authorization`) to access certain content or interact with APIs.
-
-## Solution
-
-Configure [custom HTTP headers]({{ '/ruby-gem/reference/headers' | relative_url }}) in your feed configuration.
diff --git a/ruby-gem/how-to/handling-dynamic-content.md b/ruby-gem/how-to/handling-dynamic-content.md
deleted file mode 100644
index 4148a2e5..00000000
--- a/ruby-gem/how-to/handling-dynamic-content.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-layout: default
-title: Handling Dynamic Content
-nav_order: 6
-parent: How-To Guides
-grand_parent: Ruby Gem
----
-
-# Handling Dynamic Content and JavaScript
-
-Some websites load their content dynamically using JavaScript. The default `html2rss` strategy might not see this content.
-
-## Solution
-
-Use the [`browserless` strategy]({{ '/ruby-gem/reference/strategy' | relative_url }}) to render JavaScript-heavy websites with a headless browser.
diff --git a/ruby-gem/how-to/index.md b/ruby-gem/how-to/index.md
deleted file mode 100644
index 9cdcd8be..00000000
--- a/ruby-gem/how-to/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: default
-title: How-To Guides
-parent: Ruby Gem
-nav_order: 2
-has_children: true
----
-
-# How-To Guides
-
-This section provides practical examples and solutions for common tasks when using the `html2rss` gem.
diff --git a/ruby-gem/how-to/styling-rss-feed.md b/ruby-gem/how-to/styling-rss-feed.md
deleted file mode 100644
index 9e417211..00000000
--- a/ruby-gem/how-to/styling-rss-feed.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-layout: default
-title: Styling Your RSS Feed
-nav_order: 7
-parent: How-To Guides
-grand_parent: Ruby Gem
----
-
-# Styling Your RSS Feed
-
-You can make your RSS feed look good in a web browser by attaching stylesheets.
-
-## Solution
-
-Add [stylesheets]({{ '/ruby-gem/reference/stylesheets' | relative_url }}) to your feed configuration.
diff --git a/ruby-gem/index.md b/ruby-gem/index.md
deleted file mode 100644
index b208cd33..00000000
--- a/ruby-gem/index.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: default
-title: Ruby Gem
-nav_order: 3
-has_children: true
----
-
-# The html2rss Ruby Gem
-
-This section provides comprehensive documentation for the `html2rss` Ruby gem.
-
-## Getting Started
-
-If you are new to `html2rss`, we recommend starting with the [tutorials]({{ '/ruby-gem/tutorials' | relative_url }}).
-
-## Documentation Sections
-
-- **[Tutorials]({{ '/ruby-gem/tutorials' | relative_url }})**: Step-by-step guides to help you get started with `html2rss`.
-- **[How-To Guides]({{ '/ruby-gem/how-to' | relative_url }})**: Practical examples and solutions for common tasks.
-- **[Reference]({{ '/ruby-gem/reference' | relative_url }})**: Detailed information on configuration options.
diff --git a/ruby-gem/reference/headers.md b/ruby-gem/reference/headers.md
deleted file mode 100644
index e55b6f11..00000000
--- a/ruby-gem/reference/headers.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-layout: default
-title: Headers
-nav_order: 6
-parent: Reference
-grand_parent: Ruby Gem
----
-
-# Headers
-
-The `headers` key allows you to set custom HTTP headers for your requests. This is useful for accessing APIs or other protected content.
-
-## Configuration
-
-You can add any number of headers to your configuration:
-
-```yaml
-headers:
- User-Agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
- Authorization: "Bearer YOUR_TOKEN"
- Accept: "application/json"
-```
-
-## Dynamic Parameters
-
-You can also use dynamic parameters in your headers to pass values at runtime. See [Dynamic Parameters]({{ '/ruby-gem/how-to/dynamic-parameters' | relative_url }}) for more information.
diff --git a/ruby-gem/reference/index.md b/ruby-gem/reference/index.md
deleted file mode 100644
index d5fa2e33..00000000
--- a/ruby-gem/reference/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: default
-title: Reference
-parent: Ruby Gem
-nav_order: 3
-has_children: true
----
-
-# Reference
-
-This section provides detailed information on the various configuration options available in `html2rss`.
diff --git a/ruby-gem/reference/stylesheets.md b/ruby-gem/reference/stylesheets.md
deleted file mode 100644
index ca8545ad..00000000
--- a/ruby-gem/reference/stylesheets.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-layout: default
-title: Stylesheets
-nav_order: 5
-parent: Reference
-grand_parent: Ruby Gem
-permalink: /ruby-gem/reference/stylesheets
----
-
-# Stylesheets
-
-The `stylesheets` key allows you to add CSS or XSLT stylesheets to your RSS feed, improving its appearance in web browsers.
-
-## Configuration
-
-You can add multiple stylesheets to your configuration:
-
-```yaml
-stylesheets:
- - href: "/path/to/style.xsl"
- media: "all"
- type: "text/xsl"
- - href: "https://example.com/rss.css"
- media: "all"
- type: "text/css"
-```
-
-## Further Reading
-
-- [How to Format RSS with CSS](https://www.lifewire.com/how-to-format-rss-3469302)
-- [XSLT: Extensible Stylesheet Language Transformations](https://developer.mozilla.org/en-US/docs/Web/XSLT)
diff --git a/ruby-gem/tutorials/index.md b/ruby-gem/tutorials/index.md
deleted file mode 100644
index 6c33bae9..00000000
--- a/ruby-gem/tutorials/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: default
-title: Tutorials
-nav_order: 2
-parent: Ruby Gem
-has_children: true
----
-
-# Tutorials
-
-This section provides step-by-step tutorials to help you get started with the `html2rss` Ruby gem.
diff --git a/src/assets/logo.png b/src/assets/logo.png
new file mode 100644
index 00000000..2be23113
Binary files /dev/null and b/src/assets/logo.png differ
diff --git a/src/components/FeedDirectory.astro b/src/components/FeedDirectory.astro
new file mode 100644
index 00000000..f9b88fb6
--- /dev/null
+++ b/src/components/FeedDirectory.astro
@@ -0,0 +1,489 @@
+---
+import { configs } from "../data/loadConfigs";
+import { Icon, LinkButton } from "@astrojs/starlight/components";
+
+// Simple helper functions
+function getFeedUrl(
+ config: {
+ domain: string;
+ name: string;
+ url_parameters?: Record;
+ },
+ instanceUrl: string,
+ params: Record = {},
+) {
+ const baseUrl = instanceUrl.endsWith("/") ? instanceUrl : `${instanceUrl}/`;
+ let url = `${baseUrl}${config.domain}/${config.name}.rss`;
+
+ const queryParams = new URLSearchParams();
+ Object.keys(config.url_parameters || {}).forEach((key) => {
+ if (params[key]) queryParams.append(key, params[key]);
+ });
+
+ const queryString = queryParams.toString();
+ if (queryString) url += `?${queryString}`;
+ return url;
+}
+
+// Don't generate static URLs to avoid exposing instance URL in build
+const staticFeedUrls = configs.map((config) => ({
+ ...config,
+ staticFeedUrl: "#", // Placeholder that will be updated by JavaScript
+}));
+---
+
+
+
+
+ Instance URL
+
+
+ Search Feeds
+
+
+
+
+ {
+ staticFeedUrls.map((config, index) => (
+
+
+
+
+ <>
+ {config.domain}
+ /
+ {config.name}
+ >
+
+
+ {config.channel?.url && (
+
+ )}
+
+
+
+ {!config.valid_channel_url && Object.keys(config.url_parameters || {}).length > 0 ? (
+
+
+ Configure
+
+ ) : (
+
+ )}
+
+
+
+
+
+ Edit
+
+
+
+
+ {!config.valid_channel_url && Object.keys(config.url_parameters || {}).length > 0 && (
+
+ )}
+
+ ))
+ }
+
+
+
+
+
+
+
diff --git a/src/components/feed-directory.js b/src/components/feed-directory.js
new file mode 100644
index 00000000..d7d42f07
--- /dev/null
+++ b/src/components/feed-directory.js
@@ -0,0 +1,179 @@
+// Feed Directory JavaScript functionality
+// Simple, focused functions for maintainability
+
+// Simple debounce helper
+function debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+}
+
+// Simple fuzzy search
+function fuzzyMatch(text, query) {
+ if (!query) return true;
+ const lowerText = text.toLowerCase();
+ const lowerQuery = query.toLowerCase();
+ let textIndex = 0;
+ let queryIndex = 0;
+ while (queryIndex < lowerQuery.length && textIndex < lowerText.length) {
+ if (lowerQuery[queryIndex] === lowerText[textIndex]) queryIndex++;
+ textIndex++;
+ }
+ return queryIndex === lowerQuery.length;
+}
+
+// Search functionality
+function setupSearch(searchInput, feedItems) {
+ if (!searchInput) return;
+
+ searchInput.addEventListener(
+ 'input',
+ debounce((e) => {
+ const query = e.target.value.toLowerCase();
+ feedItems.forEach((item) => {
+ const searchableText = item.dataset.searchable?.toLowerCase() || '';
+ item.style.display = fuzzyMatch(searchableText, query) ? 'flex' : 'none';
+ });
+ }, 150)
+ );
+}
+
+// Instance URL updates
+function setupInstanceUrlUpdates(instanceInput, defaultInstanceUrl, updateFeedUrls) {
+ if (!instanceInput) return;
+
+ instanceInput.addEventListener(
+ 'input',
+ debounce((e) => {
+ const instanceUrl = e.target.value || defaultInstanceUrl;
+ updateFeedUrls(instanceUrl);
+ }, 300)
+ );
+}
+
+// Parameter forms toggle
+function setupParameterForms(updateFeedUrls) {
+ document.querySelectorAll('.configure-button').forEach((button) => {
+ button.addEventListener('click', (e) => {
+ const targetId = e.target.closest('button')?.dataset.target;
+ const form = document.getElementById(targetId);
+ if (!form) return;
+
+ const isExpanded = !form.hidden;
+ form.hidden = isExpanded;
+ const button = e.target.closest('button');
+ if (button) {
+ button.setAttribute('aria-expanded', !isExpanded);
+ const span = button.querySelector('span');
+ if (span) {
+ span.textContent = isExpanded ? 'Configure' : 'Hide';
+ }
+ }
+
+ if (!isExpanded) updateFeedUrls();
+ });
+ });
+}
+
+// Close forms
+function setupCloseForms() {
+ document.querySelectorAll('[data-close-form]').forEach((button) => {
+ button.addEventListener('click', (e) => {
+ const form = e.target.closest('.parameter-form');
+ const toggle = document.querySelector(`[data-target="${form?.id}"]`);
+ if (!form || !toggle) return;
+
+ form.hidden = true;
+ toggle.setAttribute('aria-expanded', 'false');
+ const span = toggle.querySelector('span');
+ if (span) {
+ span.textContent = 'Configure';
+ }
+ });
+ });
+}
+
+// Parameter input updates
+function setupParameterInputs(updateFeedUrls) {
+ document.querySelectorAll('.form-input').forEach((input) => {
+ input.addEventListener(
+ 'input',
+ debounce(() => updateFeedUrls(), 200)
+ );
+ });
+}
+
+// Update feed URLs
+function createUpdateFeedUrlsFunction() {
+ return function updateFeedUrls(instanceUrl) {
+ document.querySelectorAll('[data-feed-url]').forEach((link) => {
+ const item = link.closest('[data-domain]');
+ if (!item) return;
+
+ const domain = item.dataset.domain;
+ const name = item.dataset.name;
+ if (!domain || !name) return;
+
+ // Get parameters
+ const params = {};
+ item.querySelectorAll('[data-param-key]').forEach((input) => {
+ if (input.value) params[input.dataset.paramKey] = input.value;
+ });
+
+ // Build URL
+ let url = instanceUrl.endsWith('/') ? instanceUrl : `${instanceUrl}/`;
+ url += `${domain}/${name}.rss`;
+
+ const queryParams = new URLSearchParams();
+ Object.entries(params).forEach(([key, value]) => queryParams.append(key, value));
+ const queryString = queryParams.toString();
+ if (queryString) url += `?${queryString}`;
+
+ link.href = url;
+ });
+ };
+}
+
+// Main initialization
+function initializeFeedDirectory() {
+ const defaultInstanceUrl = atob('aHR0cHM6Ly8xLmgyci53b3JrZXJzLmRldi8=');
+ let instanceUrl = defaultInstanceUrl;
+ const searchInput = document.getElementById('search-input');
+ const feedItems = document.querySelectorAll('[data-domain]');
+ const instanceInput = document.getElementById('instance-url-input');
+
+ // Initialize instance URL field
+ if (instanceInput) {
+ instanceInput.value = defaultInstanceUrl;
+ instanceUrl = defaultInstanceUrl;
+ }
+
+ // Create update function with current instance URL
+ const updateFeedUrls = createUpdateFeedUrlsFunction();
+
+ // Setup all functionality
+ setupSearch(searchInput, feedItems);
+ setupInstanceUrlUpdates(instanceInput, defaultInstanceUrl, (newUrl) => {
+ instanceUrl = newUrl;
+ updateFeedUrls(instanceUrl);
+ });
+ setupParameterForms(() => updateFeedUrls(instanceUrl));
+ setupCloseForms();
+ setupParameterInputs(() => updateFeedUrls(instanceUrl));
+
+ // Initialize feed URLs on page load
+ updateFeedUrls(instanceUrl);
+}
+
+// Initialize when DOM is ready
+if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', initializeFeedDirectory);
+} else {
+ initializeFeedDirectory();
+}
diff --git a/src/content.config.ts b/src/content.config.ts
new file mode 100644
index 00000000..6a7b7a02
--- /dev/null
+++ b/src/content.config.ts
@@ -0,0 +1,7 @@
+import { defineCollection } from 'astro:content';
+import { docsLoader } from '@astrojs/starlight/loaders';
+import { docsSchema } from '@astrojs/starlight/schema';
+
+export const collections = {
+ docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
+};
diff --git a/about.md b/src/content/docs/about.mdx
similarity index 60%
rename from about.md
rename to src/content/docs/about.mdx
index 7e00d5f6..25b40e40 100644
--- a/about.md
+++ b/src/content/docs/about.mdx
@@ -1,14 +1,11 @@
---
-layout: default
title: About html2rss
-nav_order: 2
+description: Learn about html2rss, the open-source RSS feed generator that helps you follow any website. Discover our mission, principles, and the team behind this powerful tool.
---
-# About html2rss
+`html2rss` is an open-source project dedicated to empowering you to take control of your web content. In an age where many websites don't offer traditional RSS feeds, `html2rss` provides a robust and flexible solution to convert almost any HTML content into a structured RSS format.
-`html2rss` is an open-source project dedicated to empowering you to take control of your web content. In an age where traditional RSS feeds are often missing, `html2rss` provides a robust and flexible solution to convert almost any HTML content into a structured RSS format.
-
-Started in 2018, the project has evolved into a comprehensive suite of tools designed to help you create and consume RSS feeds effortlessly.
+Since its founding in 2018, the project has evolved into a comprehensive suite of tools designed to help you create and consume RSS feeds effortlessly.
---
@@ -23,7 +20,7 @@ Our project is guided by these core principles:
- **Open Source:** Fostering a collaborative environment where the community can contribute and improve the project.
- **Reliability:** Striving for a stable and dependable tool that consistently delivers.
-For insights into our ongoing development, project roadmap, and how you can get involved, please visit our [Get Involved]({{ '/get-involved' | relative_url }}) page.
+For insights into our ongoing development, project roadmap, and how you can get involved, please visit our [Get Involved](/get-involved/) page.
---
@@ -31,4 +28,4 @@ For insights into our ongoing development, project roadmap, and how you can get
`html2rss` is maintained by a dedicated group of volunteers and contributors from around the world. We are passionate about open source and committed to continuously improving the project.
-Want to join us? Check out our [Contributing Guide]({{ '/get-involved/contributing' | relative_url }})!
+Want to join us? Check out our [Contributing Guide](/get-involved/contributing/)!
diff --git a/src/content/docs/common-use-cases.mdx b/src/content/docs/common-use-cases.mdx
new file mode 100644
index 00000000..f870c006
--- /dev/null
+++ b/src/content/docs/common-use-cases.mdx
@@ -0,0 +1,114 @@
+---
+title: "Common Use Cases"
+description: "See how people use html2rss to stay updated with their favorite websites. Real examples for personal and business use cases."
+---
+
+Discover how people are using html2rss to take control of their web content consumption. These real-world examples show the power and flexibility of creating custom RSS feeds.
+
+---
+
+## Personal Use Cases
+
+### Following Your Favorite Bloggers
+
+Many bloggers don't offer RSS feeds, but you can create them with html2rss. Follow writers you love without relying on social media algorithms.
+
+**Example:** Create a feed for a personal blog that only posts to social media.
+
+### Job Hunting
+
+Track job postings from multiple company websites in one place. Never miss an opportunity again.
+
+**Example:** Follow job boards, company career pages, and industry-specific job sites.
+
+### Local News
+
+Follow your local newspaper or community website to stay informed about your neighborhood.
+
+**Example:** Create feeds for local news sites, community forums, and city government updates.
+
+### Academic Research
+
+Follow new papers and research in your field from multiple sources.
+
+**Example:** Track arXiv submissions, journal publications, and conference proceedings.
+
+### Product Updates
+
+Get notified when software you use releases updates, new features, or security patches.
+
+**Example:** Follow product blogs, changelog pages, and release notes.
+
+### Hobby Communities
+
+Follow forums, communities, and websites related to your hobbies and interests.
+
+**Example:** Track gaming forums, photography communities, or cooking blogs.
+
+---
+
+## Business Use Cases
+
+### Competitor Monitoring
+
+Track what your competitors are posting about - new products, features, or announcements.
+
+**Example:** Follow competitor blogs, press releases, and social media updates.
+
+### Industry News
+
+Follow multiple industry publications in one feed to stay ahead of trends.
+
+**Example:** Aggregate news from industry blogs, trade publications, and thought leaders.
+
+### Customer Support
+
+Monitor customer feedback and support requests across different platforms.
+
+**Example:** Track support forums, review sites, and social media mentions.
+
+### Content Marketing
+
+Follow industry influencers and competitors for content inspiration.
+
+**Example:** Track competitor blogs, industry newsletters, and thought leadership content.
+
+---
+
+## Technical Use Cases
+
+### API Monitoring
+
+Track API documentation updates and changelogs.
+
+**Example:** Follow API documentation sites, developer blogs, and changelog pages.
+
+### Security Updates
+
+Monitor security advisories and vulnerability reports.
+
+**Example:** Track security blogs, CVE databases, and vendor security pages.
+
+### Open Source Projects
+
+Follow multiple open source projects and their updates.
+
+**Example:** Track project blogs, release notes, and community discussions.
+
+---
+
+## Getting Started with Your Use Case
+
+1. **Identify the websites** you want to follow
+2. **Check our [Feed Directory](/feed-directory/)** to see if feeds already exist
+3. **Try the [Web App](/web-application/getting-started)** to create feeds easily
+4. **Learn advanced techniques** with our [Config Guide](/html2rss-configs/)
+
+---
+
+## Need Help?
+
+- **Can't find what you're looking for?** [Browse our Feed Directory](/feed-directory/)
+- **Want to create custom feeds?** [Try the Web App](/web-application/getting-started)
+- **Need advanced features?** [Check our Ruby Gem docs](/ruby-gem/)
+- **Have questions?** [Join our community discussions](https://github.com/orgs/html2rss/discussions)
diff --git a/src/content/docs/feed-directory/index.mdx b/src/content/docs/feed-directory/index.mdx
new file mode 100644
index 00000000..e0a3bf94
--- /dev/null
+++ b/src/content/docs/feed-directory/index.mdx
@@ -0,0 +1,33 @@
+---
+title: "Feed Directory"
+description: "Browse pre-built configurations to create RSS feeds for various websites."
+head:
+ - tag: meta
+ attrs:
+ name: robots
+ content: noindex
+---
+
+This directory contains a list of pre-built configurations to create RSS feeds for various websites.
+
+## Instance URL
+
+An Instance URL is the address of a running `html2rss-web` application. You can use a public instance, but we encourage you to host your own.
+
+[🚀 Host Your Own Instance (and share it!)](/web-application/how-to/deployment)
+
+Find more public instances on the [community-run wiki](https://github.com/html2rss/html2rss-web/wiki/Instances).
+
+---
+
+import FeedDirectory from "../../../components/FeedDirectory.astro";
+
+
+
+---
+
+## Contribute to the Directory
+
+The feed configurations in this directory are community-driven. If you've created a new feed configuration, we encourage you to share it with the community.
+
+[Contribute on GitHub](https://github.com/html2rss/html2rss-configs)
diff --git a/get-involved/contributing.md b/src/content/docs/get-involved/contributing.mdx
similarity index 87%
rename from get-involved/contributing.md
rename to src/content/docs/get-involved/contributing.mdx
index a5306b83..8beff244 100644
--- a/get-involved/contributing.md
+++ b/src/content/docs/get-involved/contributing.mdx
@@ -1,12 +1,8 @@
---
-layout: default
title: Contributing
-parent: Get Involved
-nav_order: 10
+description: Learn how to contribute to the html2rss project
---
-# Contributing to html2rss
-
We're thrilled that you're interested in contributing to `html2rss`! There are many ways to get involved, and we welcome contributions of all kinds.
---
@@ -46,7 +42,7 @@ After you're done, you can test your feed config by running `bundle exec html2rs
### 2. Improve this Website
-This website is built with Jekyll and is hosted on GitHub Pages. If you have any ideas for improving the documentation or the design, we'd love to hear from you.
+This website is built with Astro and Starlight and is hosted on GitHub Pages. If you have any ideas for improving the documentation or the design, we'd love to hear from you.
[**Find the source code on GitHub**](https://github.com/html2rss/html2rss.github.io)
@@ -54,13 +50,13 @@ This website is built with Jekyll and is hosted on GitHub Pages. If you have any
The [`html2rss-web`](https://github.com/html2rss/html2rss-web) project is a web application that allows you to create and manage your RSS feeds through a user-friendly interface. You can host your own public instance to help other users create feeds.
-[**Learn how to host a public instance**]({{ '/web-application/how-to/deployment' | relative_url }})
+[**Learn how to host a public instance**](/web-application/how-to/deployment)
### 4. Improve the `html2rss` Gem
Are you a Ruby developer? You can help us improve the core `html2rss` gem. Whether you're fixing a bug, adding a new feature, or improving the documentation, your contributions are welcome.
-[**Check out the documentation for the `html2rss` Gem**]({{ '/ruby-gem/' | relative_url }})
+[**Check out the documentation for the `html2rss` Gem**](/ruby-gem/)
### 5. Report Bugs & Discuss Features
diff --git a/get-involved/discussions.md b/src/content/docs/get-involved/discussions.mdx
similarity index 83%
rename from get-involved/discussions.md
rename to src/content/docs/get-involved/discussions.mdx
index 3025e5f5..43dfbd59 100644
--- a/get-involved/discussions.md
+++ b/src/content/docs/get-involved/discussions.mdx
@@ -1,12 +1,8 @@
---
-layout: default
title: Join Community Discussions
-nav_order: 2
-parent: Get Involved
+description: Connect with the html2rss community through GitHub discussions
---
-# Join Community Discussions
-
Connect with other users and contributors by joining our community discussions on GitHub. This is a vibrant space for general questions, sharing tips, discussing ideas, and getting feedback from the community.
[**💬 Join Discussions on GitHub**](https://github.com/orgs/html2rss/discussions)
diff --git a/src/content/docs/get-involved/index.mdx b/src/content/docs/get-involved/index.mdx
new file mode 100644
index 00000000..f56546ea
--- /dev/null
+++ b/src/content/docs/get-involved/index.mdx
@@ -0,0 +1,14 @@
+---
+title: "Get Involved"
+description: "Engage with the html2rss project. Contribute and connect with the community."
+sidebar:
+ label: "Overview"
+---
+
+Engage with the `html2rss` project. Contribute and connect with the community.
+
+- [**Project Roadmap**](https://github.com/orgs/html2rss/projects/3/views/1): View current work, plans, and priorities.
+- [**Report Bugs & Discuss Features**](/get-involved/issues-and-features): Report bugs or propose features.
+- [**Join Community Discussions**](/get-involved/discussions): Connect with users and contributors.
+- [**Contribute to html2rss**](/get-involved/contributing): Contribute code, documentation, or feed configurations.
+- [**Sponsoring**](/get-involved/sponsoring)
diff --git a/get-involved/issues-and-features.md b/src/content/docs/get-involved/issues-and-features.mdx
similarity index 93%
rename from get-involved/issues-and-features.md
rename to src/content/docs/get-involved/issues-and-features.mdx
index 7cd9611a..060bba77 100644
--- a/get-involved/issues-and-features.md
+++ b/src/content/docs/get-involved/issues-and-features.mdx
@@ -1,12 +1,8 @@
---
-layout: default
title: Report Bugs & Discuss Features
-nav_order: 1
-parent: Get Involved
+description: Learn how to report bugs and suggest new features for html2rss
---
-# Report Bugs & Discuss Features
-
We appreciate your help in improving `html2rss`! Please follow these guidelines when reporting issues or suggesting new features.
---
diff --git a/get-involved/sponsoring.md b/src/content/docs/get-involved/sponsoring.mdx
similarity index 90%
rename from get-involved/sponsoring.md
rename to src/content/docs/get-involved/sponsoring.mdx
index 8b39384a..6bc7a3de 100644
--- a/get-involved/sponsoring.md
+++ b/src/content/docs/get-involved/sponsoring.mdx
@@ -1,12 +1,8 @@
---
-layout: default
title: Sponsoring
-parent: Get Involved
-nav_order: 4
+description: Support the html2rss project through sponsorship
---
-# Sponsoring html2rss
-
`html2rss` is an open-source project, and its development is made possible by the support of our community. If you find `html2rss` useful, please consider sponsoring the project.
## Why Sponsor?
diff --git a/src/content/docs/html2rss-configs.mdx b/src/content/docs/html2rss-configs.mdx
new file mode 100644
index 00000000..c8c0782f
--- /dev/null
+++ b/src/content/docs/html2rss-configs.mdx
@@ -0,0 +1,188 @@
+---
+title: "Write Your Own Feed Configs"
+description: "Step-by-step guide to writing YAML configuration files for custom RSS feeds. Take control when ready-made feeds aren't enough."
+---
+
+When ready-made feeds aren't enough, you can write your own configuration files to create custom RSS feeds for any website. This guide shows you how to take full control with YAML configs.
+
+**Prerequisites:** You should be familiar with the [Web Application](/web-application/getting-started) or [Ruby Gem](/ruby-gem/installation) before diving into custom configurations.
+
+---
+
+## When to Use Custom Configs
+
+**Use custom configs when:**
+
+- **Ready-made feeds don't exist** for the website you want to follow
+- **Existing feeds are incomplete** or missing important content
+- **You need specific formatting** or data extraction
+- **The website has complex structure** that requires custom selectors
+- **You want to combine data** from multiple sources
+
+**Don't need custom configs?** Check the [Feed Directory](/feed-directory/) first - there might already be a working feed for your website.
+
+---
+
+## Quick Start
+
+**Need a feed right now?**
+
+1. **[Try the web app](/web-application/getting-started)** - No coding required
+2. **[Browse ready-made feeds](/feed-directory/)** - Use what others created
+3. **Create a config** - When you need custom control (see below)
+
+**Ready to create a config?** Jump to [Your First Config](#your-first-config).
+
+### For html2rss-web Users
+
+If you're using html2rss-web, you can add your config to the `feeds.yml` file:
+
+1. **Find the example** - Check out the [`example` feed config](https://github.com/html2rss/html2rss-web/blob/master/config/feeds.yml#L9)
+2. **Add your config** to the `feeds.yml` file
+3. **Test it** by visiting your html2rss-web instance
+4. **Debug** using browser developer tools if needed
+
+---
+
+## How It Works
+
+A config file is a simple "recipe" that tells html2rss:
+
+1. **Which website** to look at
+2. **What content** to find
+3. **How to organize** it into an RSS feed
+
+### The `channel` Block
+
+This tells html2rss basic information about your feed - like giving it a name and telling it which website to look at.
+
+**Example:**
+
+```yaml
+channel:
+ url: https://example.com/blog
+ title: My Awesome Blog
+```
+
+This says: "Look at this website and call the feed 'My Awesome Blog'"
+
+### The `selectors` Block
+
+This is where you tell the html2rss engine exactly what to find on the page. You use CSS selectors (like you might use in web design) to point to specific parts of the webpage.
+
+**Example:**
+
+```yaml
+selectors:
+ items:
+ selector: "article.post"
+ title:
+ selector: "h2 a"
+ link:
+ selector: "h2 a"
+ attribute: href
+```
+
+This says: "Find each article, get the title from the h2 anchor, and get the link from the same h2 anchor's href attribute"
+
+**Need more details?** Check our [complete guide to selectors](/ruby-gem/reference/selectors/) for all the options.
+
+## Configuration Options
+
+html2rss-web supports all the same configuration options as the html2rss Ruby gem:
+
+- **Basic selectors** for title, description, and links
+- **Advanced features** like custom headers and dynamic parameters
+- **Multiple strategies** for different types of websites
+- **Post-processing** to clean up extracted content
+
+---
+
+## Your First Config
+
+**Step 1:** Look at the website you want to create a feed for. Right-click → "View Page Source" to see the HTML structure.
+
+**Step 2:** Create a file called `example.com.yml` with this basic structure:
+
+```yaml
+channel:
+ url: https://example.com/blog
+ title: My Blog
+
+selectors:
+ items:
+ selector: "article.post"
+ title:
+ selector: "h2 a"
+ link:
+ selector: "h2 a"
+ attribute: href
+```
+
+**Step 3:** Test it with the [web app](/web-application/) or [Ruby gem](/ruby-gem/installation).
+
+**Need help?** See our [detailed tutorial](/ruby-gem/tutorials/your-first-feed/) or [troubleshooting guide](/troubleshooting/troubleshooting) for common issues.
+
+---
+
+## Troubleshooting
+
+**Common issues when writing configs:**
+
+- **No items found?** Check your selectors with browser tools (F12) - the `items.selector` might not match the page structure
+- **Invalid YAML?** Use spaces, not tabs, and ensure proper indentation
+- **Website not loading?** Check the URL and try accessing it in your browser
+- **Missing content?** Some websites load content with JavaScript - you may need to use the `browserless` strategy
+- **Wrong data extracted?** Verify your selectors are pointing to the right elements
+
+**Need more help?** See our [comprehensive troubleshooting guide](/troubleshooting/troubleshooting) or ask in [GitHub Discussions](https://github.com/orgs/html2rss/discussions).
+
+---
+
+## Advanced Features
+
+**Dynamic parameters, custom headers, and more:** See our [advanced features guide](/ruby-gem/how-to/advanced-features/).
+
+---
+
+## Contributing
+
+**Share your config with the community:**
+
+1. Go to [html2rss-configs on GitHub](https://github.com/html2rss/html2rss-configs)
+2. Click "Fork" → "Add file" → Create `domain.com.yml`
+3. Paste your config → "Commit new file" → "Open pull request"
+
+**Need help?** See our [contribution guide](https://github.com/html2rss/html2rss-configs/blob/main/CONTRIBUTING.md).
+
+---
+
+## Next Steps
+
+**🎉 Congratulations!** You've learned the basics of creating html2rss configuration files.
+
+### What's Next?
+
+**For Beginners:**
+
+- **[Browse the Feed Directory](/feed-directory/)** - See real-world examples
+- **[Try html2rss-web](/web-application/getting-started)** - Create feeds without coding
+- **[Learn more about selectors](/ruby-gem/reference/selectors/)** - Master CSS selectors
+
+**For Contributors:**
+
+- **[Submit your config via GitHub Web](https://github.com/html2rss/html2rss-configs)** - No Git knowledge required!
+- **[Browse existing configs](https://github.com/html2rss/html2rss-configs/tree/master/lib/html2rss/configs)** - See real examples
+- **[Join discussions](https://github.com/orgs/html2rss/discussions)** - Connect with other users
+
+**For Developers:**
+
+- **[Ruby Gem Documentation](/ruby-gem/)** - Full API reference
+- **[Advanced Features](/ruby-gem/how-to/advanced-features/)** - Learn advanced techniques
+- **[Custom HTTP Requests](/ruby-gem/how-to/custom-http-requests/)** - Handle complex scenarios
+
+### Need More Help?
+
+- **[Troubleshooting](/troubleshooting/)** - Get help with common issues
+- **[Community Forum](https://github.com/html2rss/html2rss-configs/discussions)** - Ask questions and share ideas
+- **[Report Issues](https://github.com/html2rss/html2rss-configs/issues)** - Found a bug? Let us know!
diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx
new file mode 100644
index 00000000..9ea27341
--- /dev/null
+++ b/src/content/docs/index.mdx
@@ -0,0 +1,85 @@
+---
+title: "Turn Any Website Into an RSS Feed - Never Miss Updates Again"
+description: "Create RSS feeds from any website - no coding required. Turn blogs, news sites, and forums into RSS feeds you can follow in your favorite reader. Free, open source, and easy to use."
+---
+
+Ever wished you could follow your favorite websites like a social media feed? The html2rss project makes it possible by creating RSS feeds for any website - even ones that don't offer them.
+
+## 🚀 Get Started in 30 Seconds
+
+**Try it now:** [Browse Ready-Made Feeds](/feed-directory/) | [Create Your First Feed](/web-application/getting-started)
+
+---
+
+## Why RSS Still Matters Today
+
+**Real examples of what you can do:**
+
+- Follow your favorite blogs without social media algorithms
+- Get notified when your local news site posts about your neighborhood
+- Track job postings from multiple company websites
+- Monitor product updates from software vendors
+- Follow academic papers from your field
+
+**RSS vs Social Media:**
+
+- ✅ **No algorithms** deciding what you see
+- ✅ **No ads** or sponsored content
+- ✅ **Works with any feed reader** you choose
+- ✅ **Your data stays private**
+- ✅ **Never miss updates** - automatic notifications
+- ✅ **Save time** - no more manual checking
+
+---
+
+## What is html2rss?
+
+html2rss is a user-friendly tool that turns any website into an RSS feed. Think of it as a translator that converts website content into a format your feed reader can understand.
+
+**Two ways to use html2rss:**
+
+- **🌐 Web App** - Point, click, done! Perfect for everyone
+- **⚙️ Ruby Gem** - For developers who want to code their own feeds
+
+---
+
+## 🎯 Choose Your Path
+
+### I'm Getting Started with RSS
+
+1. **[See Examples First](/feed-directory/)** - Browse 100+ ready-made feeds
+2. **[Try the Web App](/web-application/getting-started)** - Create feeds without coding
+3. **[Learn More](/about/)** - Understand how it all works
+
+### I Want to Create Custom Feeds
+
+1. **[Web App](/web-application/getting-started)** - Start with the easy interface
+2. **[Ruby Gem](/ruby-gem/installation)** - For advanced customization
+3. **[Config Guide](/html2rss-configs/)** - Learn to write your own configs
+
+### I'm a Developer
+
+1. **[Ruby Gem Docs](/ruby-gem/)** - Full API reference
+2. **[Advanced Features](/ruby-gem/how-to/advanced-features/)** - Custom HTTP requests, etc.
+3. **[Contribute](/get-involved/contributing/)** - Help improve the project
+
+---
+
+## 🌟 What People Are Using html2rss For
+
+- **News & Blogs:** Follow your favorite writers without social media
+- **Job Hunting:** Track job postings from multiple company sites
+- **Product Updates:** Get notified when software you use gets updated
+- **Academic Research:** Follow new papers in your field
+- **Local News:** Stay updated on your neighborhood and city
+- **Hobby Communities:** Follow forums and communities you care about
+
+[Browse all examples in our Feed Directory →](/feed-directory/)
+
+---
+
+## 🔧 Common Issues?
+
+**Feed not working?** Check our [troubleshooting guide](/troubleshooting/troubleshooting)
+**Need help?** Join our [community discussions](https://github.com/orgs/html2rss/discussions)
+**Found a bug?** [Report it on GitHub](https://github.com/html2rss/html2rss/issues)
diff --git a/src/content/docs/ruby-gem/how-to/advanced-content-extraction.mdx b/src/content/docs/ruby-gem/how-to/advanced-content-extraction.mdx
new file mode 100644
index 00000000..e17231df
--- /dev/null
+++ b/src/content/docs/ruby-gem/how-to/advanced-content-extraction.mdx
@@ -0,0 +1,14 @@
+---
+title: "Advanced Content Extraction"
+description: "While basic selectors are straightforward, you can achieve very precise content extraction by combining selectors with different extractors and post-processors."
+---
+
+While basic selectors are straightforward, you can achieve very precise content extraction by combining selectors with different extractors and post-processors.
+
+## Extractors
+
+Learn how to extract specific attributes (like `src` for images) or static values. See [Extractors](/ruby-gem/reference/selectors/extractors).
+
+## Post Processors
+
+Manipulate extracted text, sanitize HTML, convert Markdown, or apply custom logic. See [Post Processors](/ruby-gem/reference/selectors/post-processors).
diff --git a/src/content/docs/ruby-gem/how-to/advanced-features.mdx b/src/content/docs/ruby-gem/how-to/advanced-features.mdx
new file mode 100644
index 00000000..3be3a575
--- /dev/null
+++ b/src/content/docs/ruby-gem/how-to/advanced-features.mdx
@@ -0,0 +1,117 @@
+---
+title: "Advanced Features"
+description: "Advanced features and performance optimizations for html2rss."
+---
+
+This guide covers advanced features and performance optimizations for html2rss.
+
+## Parallel Processing
+
+html2rss uses parallel processing to improve performance when scraping multiple items. This happens automatically and doesn't require any configuration.
+
+### How It Works
+
+- **Auto-source scraping:** Multiple scrapers run in parallel to analyze the page
+- **Item processing:** Each scraped item is processed in parallel
+- **Performance benefit:** Significantly faster when dealing with many items
+
+### Performance Tips
+
+1. **Use appropriate selectors:** More specific selectors reduce processing time
+2. **Limit items when possible:** Use CSS selectors that target only the content you need
+3. **Cache responses:** The web application caches responses automatically
+4. **Choose the right strategy:** Use `faraday` for static content, `browserless` only when JavaScript is required
+
+## Memory Optimization
+
+html2rss is designed to be memory-efficient:
+
+- **Frozen objects:** Parsed content is frozen to prevent accidental modifications
+- **Efficient data structures:** Uses `Set` instead of `Array` for lookups
+- **Minimal allocations:** Prefers bang methods to avoid unnecessary memory allocations
+
+## Large Feed Handling
+
+For websites with many items:
+
+```yaml
+# Use specific selectors to limit items
+selectors:
+ items:
+ selector: ".article:not(.advertisement)" # Exclude ads
+ title:
+ selector: "h2" # More specific than generic selectors
+```
+
+## Error Recovery
+
+html2rss includes built-in error handling:
+
+- **Graceful degradation:** If one scraper fails, others continue
+- **Detailed logging:** Set `LOG_LEVEL=debug` for detailed information
+- **Validation:** Configuration is validated before processing
+
+## Custom Headers for Performance
+
+Optimize requests with appropriate headers:
+
+```yaml
+headers:
+ Accept: "text/html,application/xhtml+xml" # Avoid JSON if not needed
+ Accept-Encoding: "gzip, deflate" # Enable compression
+```
+
+## Monitoring and Debugging
+
+### Enable Debug Logging
+
+```bash
+LOG_LEVEL=debug html2rss feed config.yml
+```
+
+### Web Application Health Checks
+
+Use the health check endpoint to monitor feed generation:
+
+```bash
+curl -u username:password http://localhost:3000/health_check.txt
+```
+
+## Article Validation
+
+html2rss includes built-in validation for articles to ensure feed quality:
+
+### Validation Rules
+
+Articles are considered valid if they have:
+
+- A non-empty URL
+- Either a title OR description (or both)
+- A unique ID
+
+### Invalid Articles
+
+Invalid articles are automatically filtered out to prevent empty or broken feed items.
+
+### Custom Validation
+
+You can add custom validation by using post-processors:
+
+```yaml
+selectors:
+ title:
+ selector: "h2"
+ post_process:
+ - name: "gsub"
+ pattern: "^\\s*$"
+ replacement: "Untitled"
+```
+
+## Best Practices
+
+1. **Test configurations:** Always test your configurations before deploying
+2. **Monitor performance:** Use health checks to detect issues early
+3. **Keep selectors simple:** Complex selectors are harder to maintain
+4. **Use auto-source when possible:** It's often more reliable than manual selectors
+5. **Handle errors gracefully:** Implement proper error handling in your applications
+6. **Validate your data:** Ensure your selectors return valid content
diff --git a/src/content/docs/ruby-gem/how-to/backward-compatibility.mdx b/src/content/docs/ruby-gem/how-to/backward-compatibility.mdx
new file mode 100644
index 00000000..7ea074f8
--- /dev/null
+++ b/src/content/docs/ruby-gem/how-to/backward-compatibility.mdx
@@ -0,0 +1,49 @@
+---
+title: "Backward Compatibility"
+description: "html2rss maintains backward compatibility with older configuration formats and attribute names."
+---
+
+html2rss maintains backward compatibility with older configuration formats and attribute names.
+
+## Renamed Attributes
+
+Some attribute names have been renamed for clarity, but the old names still work:
+
+| Current Name | Legacy Names | Description |
+| -------------- | -------------------- | ---------------------------- |
+| `published_at` | `updated`, `pubDate` | Publication date of the item |
+
+### Example
+
+Both of these configurations work identically:
+
+```yaml
+# Current format (recommended)
+selectors:
+ published_at:
+ selector: ".date"
+
+# Legacy format (still supported)
+selectors:
+ updated:
+ selector: ".date"
+```
+
+## Migration Guide
+
+If you're upgrading from an older version of html2rss:
+
+1. **Update attribute names**: Replace `updated` with `published_at` in your configurations
+2. **Test your feeds**: Verify that all feeds still work correctly after the update
+
+## Deprecated Features
+
+The following features are deprecated but still supported:
+
+- **Legacy attribute names**: While still supported, use the current names for new configurations
+
+## Getting Help
+
+If you encounter issues with backward compatibility:
+
+- **Report issues**: Open an issue if you find compatibility problems
diff --git a/src/content/docs/ruby-gem/how-to/custom-http-requests.mdx b/src/content/docs/ruby-gem/how-to/custom-http-requests.mdx
new file mode 100644
index 00000000..231f8860
--- /dev/null
+++ b/src/content/docs/ruby-gem/how-to/custom-http-requests.mdx
@@ -0,0 +1,157 @@
+---
+title: "Custom HTTP Requests"
+description: "Learn how to customize HTTP requests with custom headers, authentication, and API interactions for html2rss."
+---
+
+Some websites require custom HTTP headers, authentication, or specific request configurations to access their content. html2rss makes it easy to customize your requests to handle these scenarios.
+
+## When You Need Custom Headers
+
+You might need custom HTTP requests when:
+
+- **APIs require authentication** (Bearer tokens, API keys)
+- **Websites block default user agents** (need to appear as a real browser)
+- **Content is behind login** (session cookies, authorization headers)
+- **Rate limiting** (custom headers to identify your requests)
+- **Content negotiation** (specific Accept headers for different formats)
+
+## Basic Configuration
+
+Add a `headers` section to your feed configuration:
+
+```yaml
+headers:
+ User-Agent: "Mozilla/5.0 (compatible; html2rss/1.0)"
+ Authorization: "Bearer YOUR_API_TOKEN"
+ Accept: "application/json"
+channel:
+ url: https://api.example.com/posts
+selectors:
+ items:
+ selector: ".post"
+ title:
+ selector: "h2"
+```
+
+## Common Use Cases
+
+### API Authentication
+
+Many APIs require authentication tokens:
+
+```yaml
+headers:
+ Authorization: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
+ X-API-Key: "your-api-key-here"
+```
+
+### User Agent Spoofing
+
+Some websites block requests that don't look like real browsers:
+
+```yaml
+headers:
+ User-Agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
+ Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+ Accept-Language: "en-US,en;q=0.5"
+ Accept-Encoding: "gzip, deflate"
+```
+
+### Content Type Negotiation
+
+Request specific content types:
+
+```yaml
+headers:
+ Accept: "application/json" # For JSON APIs
+ Accept: "text/html" # For HTML content
+ Accept: "application/rss+xml" # For RSS feeds
+```
+
+### Custom API Headers
+
+Some APIs require specific headers:
+
+```yaml
+headers:
+ X-Requested-With: "XMLHttpRequest"
+ X-Custom-Header: "your-value"
+ Content-Type: "application/json"
+```
+
+## Dynamic Headers
+
+You can use dynamic parameters in headers for runtime values:
+
+```yaml
+headers:
+ Authorization: "Bearer {{api_token}}"
+ X-User-ID: "{{user_id}}"
+```
+
+See our [Dynamic Parameters guide](/ruby-gem/how-to/dynamic-parameters) for more details.
+
+## Testing Your Headers
+
+Test your configuration to ensure headers work correctly:
+
+```bash
+# Test with curl first
+curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/posts
+
+# Then test with html2rss
+html2rss feed your-config.yml
+```
+
+## Troubleshooting
+
+### Common Issues
+
+- **401 Unauthorized**: Check your authentication headers
+- **403 Forbidden**: Verify API keys and permissions
+- **429 Too Many Requests**: Add rate limiting or different user agents
+- **Empty responses**: Some APIs require specific Accept headers
+
+### Debug Tips
+
+1. **Use browser developer tools** to see what headers successful requests use
+2. **Test with curl** before configuring html2rss
+3. **Check API documentation** for required headers
+4. **Enable debug logging** to see what headers are being sent
+
+## Advanced Examples
+
+### GitHub API
+
+```yaml
+headers:
+ Authorization: "token YOUR_GITHUB_TOKEN"
+ Accept: "application/vnd.github.v3+json"
+ User-Agent: "html2rss/1.0"
+channel:
+ url: https://api.github.com/repos/owner/repo/issues
+```
+
+### Reddit API
+
+```yaml
+headers:
+ User-Agent: "html2rss/1.0 by your-username"
+ Accept: "application/json"
+channel:
+ url: https://www.reddit.com/r/programming.json
+```
+
+## Related Topics
+
+- **[Headers Reference](/ruby-gem/reference/headers)** - Complete headers documentation
+- **[Dynamic Parameters](/ruby-gem/how-to/dynamic-parameters)** - Runtime header values
+- **[Scraping JSON APIs](/ruby-gem/how-to/scraping-json)** - Working with JSON responses
+- **[Strategy Selection](/ruby-gem/reference/strategy)** - Choose the right strategy for your needs
+- **[Troubleshooting](/troubleshooting/troubleshooting)** - Common issues and solutions
+
+## Need More Help?
+
+- **[Community Discussions](https://github.com/orgs/html2rss/discussions)** - Ask for help
+- **[Advanced Features](/ruby-gem/how-to/advanced-features/)** - Performance optimization
+- **[Ruby Gem Documentation](/ruby-gem/)** - Complete API reference
diff --git a/ruby-gem/how-to/dynamic-parameters.md b/src/content/docs/ruby-gem/how-to/dynamic-parameters.mdx
similarity index 61%
rename from ruby-gem/how-to/dynamic-parameters.md
rename to src/content/docs/ruby-gem/how-to/dynamic-parameters.mdx
index b3d1f2cb..a1a63d9a 100644
--- a/ruby-gem/how-to/dynamic-parameters.md
+++ b/src/content/docs/ruby-gem/how-to/dynamic-parameters.mdx
@@ -1,13 +1,8 @@
---
-layout: default
title: Dynamic Parameters
-nav_order: 5
-parent: How-To Guides
-grand_parent: Ruby Gem
+description: "Learn how to use dynamic parameters in URLs and headers for creating reusable feed configurations. Pass runtime values to customize feeds."
---
-# Dynamic Parameters in URLs and Headers
-
For websites with similar structures but varying content based on a parameter in the URL or headers, you can use dynamic parameters.
## Solution
@@ -34,3 +29,10 @@ html2rss feed the_feed_config.yml --params id:42 foo:bar
- The `% s` syntax in the URL and headers is a placeholder for dynamic parameters.
- You provide the actual values for these parameters at runtime using the `--params` option.
- This allows you to reuse the same feed configuration for multiple similar pages or APIs.
+
+## Related Topics
+
+- **[Custom HTTP Requests](/ruby-gem/how-to/custom-http-requests/)** - Using dynamic parameters in headers
+- **[Headers Reference](/ruby-gem/reference/headers)** - Complete headers documentation
+- **[Troubleshooting](/troubleshooting/troubleshooting)** - Common issues with dynamic parameters
+- **[Advanced Features](/ruby-gem/how-to/advanced-features/)** - Performance optimization tips
diff --git a/src/content/docs/ruby-gem/how-to/handling-dynamic-content.mdx b/src/content/docs/ruby-gem/how-to/handling-dynamic-content.mdx
new file mode 100644
index 00000000..c0e5e379
--- /dev/null
+++ b/src/content/docs/ruby-gem/how-to/handling-dynamic-content.mdx
@@ -0,0 +1,35 @@
+---
+title: Handling Dynamic Content
+description: "Learn how to handle JavaScript-heavy websites and dynamic content with html2rss. Use browserless strategy for sites that load content dynamically."
+---
+
+Some websites load their content dynamically using JavaScript. The default `html2rss` strategy might not see this content.
+
+## Solution
+
+Use the [`browserless` strategy](/ruby-gem/reference/strategy) to render JavaScript-heavy websites with a headless browser.
+
+## When to Use Browserless
+
+The `browserless` strategy is necessary when:
+
+- **Content loads after page load** - JavaScript fetches data from APIs
+- **Single Page Applications (SPAs)** - React, Vue, Angular apps
+- **Infinite scroll** - Content loads as you scroll
+- **Dynamic forms** - Content changes based on user interaction
+
+## Performance Considerations
+
+The `browserless` strategy is slower than the default `faraday` strategy because it:
+
+- Launches a headless Chrome browser
+- Renders the full page with JavaScript
+- Takes more memory and CPU resources
+
+**Use `faraday` for static content** and only switch to `browserless` when necessary.
+
+## Related Topics
+
+- **[Strategy Reference](/ruby-gem/reference/strategy)** - Complete strategy documentation
+- **[Troubleshooting](/troubleshooting/troubleshooting)** - Common issues with dynamic content
+- **[Advanced Features](/ruby-gem/how-to/advanced-features/)** - Performance optimization tips
diff --git a/ruby-gem/how-to/managing-feed-configs.md b/src/content/docs/ruby-gem/how-to/managing-feed-configs.mdx
similarity index 81%
rename from ruby-gem/how-to/managing-feed-configs.md
rename to src/content/docs/ruby-gem/how-to/managing-feed-configs.mdx
index 7509bb3b..61278ce5 100644
--- a/ruby-gem/how-to/managing-feed-configs.md
+++ b/src/content/docs/ruby-gem/how-to/managing-feed-configs.mdx
@@ -1,13 +1,8 @@
---
-layout: default
title: Managing Feed Configs
-parent: How-To Guides
-grand_parent: Ruby Gem
-nav_order: 7
+description: "Learn how to manage feed configurations with YAML files. Organize, version control, and maintain your html2rss feed configurations effectively."
---
-# Managing Feed Configurations with YAML
-
For easier management, especially when using the CLI or `html2rss-web`, you can store your feed configurations in a YAML file.
## Global and Feed-Specific Configurations
@@ -17,7 +12,7 @@ You can define global settings that apply to all feeds, and then define individu
```yml
# Global settings
headers:
- "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1"
+ "User-Agent": "Mozilla/5.0 (compatible; html2rss/1.0; Mobile)"
"Accept": "text/html"
# Feed-specific settings
diff --git a/ruby-gem/how-to/scraping-json.md b/src/content/docs/ruby-gem/how-to/scraping-json.mdx
similarity index 91%
rename from ruby-gem/how-to/scraping-json.md
rename to src/content/docs/ruby-gem/how-to/scraping-json.mdx
index 8dde33fb..758b75f5 100644
--- a/ruby-gem/how-to/scraping-json.md
+++ b/src/content/docs/ruby-gem/how-to/scraping-json.mdx
@@ -1,13 +1,8 @@
---
-layout: default
title: Scraping JSON Responses
-parent: How-To Guides
-grand_parent: Ruby Gem
-nav_order: 6
+description: "Learn how to scrape JSON APIs and responses with html2rss. Convert JSON to XML and use CSS selectors for data extraction."
---
-# Scraping JSON Responses
-
When a website returns a JSON response (i.e., with a `Content-Type` of `application/json`), `html2rss` converts the JSON to XML, allowing you to use CSS selectors for data extraction.
> [!NOTE]
diff --git a/src/content/docs/ruby-gem/index.mdx b/src/content/docs/ruby-gem/index.mdx
new file mode 100644
index 00000000..903e4128
--- /dev/null
+++ b/src/content/docs/ruby-gem/index.mdx
@@ -0,0 +1,18 @@
+---
+title: "Ruby Gem"
+description: "Complete documentation for the html2rss Ruby gem. Create custom RSS feeds programmatically with full control over scraping and feed generation."
+sidebar:
+ label: "Overview"
+---
+
+This section provides comprehensive documentation for the `html2rss` Ruby gem.
+
+## Getting Started
+
+If you are getting started with `html2rss`, we recommend starting with the [tutorials](/ruby-gem/tutorials).
+
+## Documentation Sections
+
+- **[Tutorials](/ruby-gem/tutorials)**: Step-by-step guides to help you get started with `html2rss`.
+- **[How-To Guides](/ruby-gem/how-to)**: Practical examples and solutions for common tasks.
+- **[Reference](/ruby-gem/reference)**: Detailed information on configuration options.
diff --git a/ruby-gem/installation.md b/src/content/docs/ruby-gem/installation.mdx
similarity index 59%
rename from ruby-gem/installation.md
rename to src/content/docs/ruby-gem/installation.mdx
index 01dce3de..2d388c9c 100644
--- a/ruby-gem/installation.md
+++ b/src/content/docs/ruby-gem/installation.mdx
@@ -1,19 +1,15 @@
---
-layout: default
-title: Installation
-nav_order: 1
-parent: Ruby Gem
+title: "Installation"
+description: "Install the html2rss Ruby gem on your system. Choose from multiple installation methods including gem install, Bundler, or GitHub Codespaces."
---
-# Installation
-
-This guide will walk you through the process of installing html2rss on your system. html2rss can be installed in several ways, depending on your preferred method and environment.
+This guide will walk you through installing the html2rss Ruby gem on your system. Choose the method that works best for your setup - we'll walk you through each option step by step.
---
### Prerequisites
-- **Ruby:** html2rss is built with Ruby. Ensure you have Ruby installed (version 3.2 or higher required). You can check your Ruby version by running `ruby -v` in your terminal. If you don't have Ruby, visit [ruby-lang.org](https://www.ruby-lang.org/en/documentation/installation/) for installation instructions.
+- **Ruby:** html2rss is built with Ruby. Ensure you have a compatible version of Ruby installed. You can check your Ruby version by running `ruby -v` in your terminal. If you don't have Ruby, visit [ruby-lang.org](https://www.ruby-lang.org/en/documentation/installation/) for installation instructions.
- **Bundler (Recommended):** Bundler is a Ruby gem that manages your application's dependencies. It's highly recommended for a smooth installation. Install it with `gem install bundler`.
---
@@ -49,7 +45,7 @@ For a quick start without local setup, you can develop html2rss directly in your
[](https://github.com/codespaces/new?repo=html2rss/html2rss)
-The Codespace comes pre-configured with Ruby 3.4, all dependencies, and VS Code extensions ready to go!
+The Codespace comes pre-configured with Ruby, all dependencies, and VS Code extensions ready to go!
---
@@ -61,10 +57,10 @@ To ensure html2rss is installed correctly, open your terminal and run:
html2rss --version
```
-You should see the installed version number. If you encounter any issues, please refer to the [Troubleshooting Guide]({{ "/support/troubleshooting" | relative_url }}).
+You should see the installed version number. If you encounter any issues, please refer to the [Troubleshooting Guide](/troubleshooting/troubleshooting).
---
### Next Steps
-Now that html2rss is installed, let's create your [first RSS feed]({{ '/ruby-gem/tutorials/your-first-feed' | relative_url }})!
+Now that html2rss is installed, let's create your [first RSS feed](/ruby-gem/tutorials/your-first-feed)!
diff --git a/ruby-gem/reference/auto-source.md b/src/content/docs/ruby-gem/reference/auto-source.mdx
similarity index 81%
rename from ruby-gem/reference/auto-source.md
rename to src/content/docs/ruby-gem/reference/auto-source.mdx
index ffac4f36..654608dc 100644
--- a/ruby-gem/reference/auto-source.md
+++ b/src/content/docs/ruby-gem/reference/auto-source.mdx
@@ -1,13 +1,8 @@
---
-layout: default
title: Auto Source
-nav_order: 5
-parent: Reference
-grand_parent: Ruby Gem
+description: "Learn about the auto_source scraper that automatically finds items on a page. No CSS selectors needed - html2rss intelligently detects content."
---
-# Auto Source
-
The `auto_source` scraper automatically finds items on a page, so you don't have to specify CSS selectors.
To enable it, add `auto_source: {}` to your configuration:
@@ -57,3 +52,7 @@ auto_source:
keep_different_domain: false # default: true
min_words_title: 4 # default: 3
```
+
+---
+
+For detailed documentation on the Ruby API, see the [official YARD documentation](https://www.rubydoc.info/gems/html2rss).
diff --git a/ruby-gem/reference/channel.md b/src/content/docs/ruby-gem/reference/channel.mdx
similarity index 86%
rename from ruby-gem/reference/channel.md
rename to src/content/docs/ruby-gem/reference/channel.mdx
index 696e5466..73f2c06b 100644
--- a/ruby-gem/reference/channel.md
+++ b/src/content/docs/ruby-gem/reference/channel.mdx
@@ -1,13 +1,8 @@
---
-layout: default
title: Channel
-nav_order: 1
-parent: Reference
-grand_parent: Ruby Gem
+description: "Learn about the channel configuration block for RSS feed metadata. Configure feed title, description, author, and other RSS channel properties."
---
-# Channel
-
The `channel` configuration block defines the metadata for your RSS feed.
```yaml
@@ -32,3 +27,7 @@ channel:
| `ttl` | Optional | The "time to live" for the feed in minutes. Defaults to the `max-age` from the response headers, or `360`. |
| `language` | Optional | The language of the feed. Defaults to the `lang` attribute of the `` tag. |
| `time_zone` | Optional | The time zone for parsing dates. See the [list of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). |
+
+---
+
+For detailed documentation on the Ruby API, see the [official YARD documentation](https://www.rubydoc.info/gems/html2rss).
diff --git a/ruby-gem/reference/cli-reference.md b/src/content/docs/ruby-gem/reference/cli-reference.mdx
similarity index 93%
rename from ruby-gem/reference/cli-reference.md
rename to src/content/docs/ruby-gem/reference/cli-reference.mdx
index 1b4e29aa..b5d84ad3 100644
--- a/ruby-gem/reference/cli-reference.md
+++ b/src/content/docs/ruby-gem/reference/cli-reference.mdx
@@ -1,13 +1,8 @@
---
-layout: default
title: CLI Reference
-nav_order: 7
-parent: Reference
-grand_parent: Ruby Gem
+description: Complete reference for the html2rss command-line interface
---
-# CLI Reference
-
This section provides a reference for the `html2rss` command-line interface (CLI).
For detailed documentation on the Ruby API, please refer to the official YARD documentation.
diff --git a/src/content/docs/ruby-gem/reference/headers.mdx b/src/content/docs/ruby-gem/reference/headers.mdx
new file mode 100644
index 00000000..58de18a2
--- /dev/null
+++ b/src/content/docs/ruby-gem/reference/headers.mdx
@@ -0,0 +1,25 @@
+---
+title: Headers
+description: "Learn how to set custom HTTP headers for html2rss requests. Add authentication, user agents, and API keys to access protected content."
+---
+
+The `headers` key allows you to set custom HTTP headers for your requests. This is useful for accessing APIs or other protected content.
+
+## Configuration
+
+You can add any number of headers to your configuration:
+
+```yaml
+headers:
+ User-Agent: "Mozilla/5.0 (compatible; html2rss/1.0)"
+ Authorization: "Bearer YOUR_TOKEN"
+ Accept: "application/json"
+```
+
+## Dynamic Parameters
+
+You can also use dynamic parameters in your headers to pass values at runtime. See [Dynamic Parameters](/ruby-gem/how-to/dynamic-parameters) for more information.
+
+---
+
+For detailed documentation on the Ruby API, see the [official YARD documentation](https://www.rubydoc.info/gems/html2rss).
diff --git a/ruby-gem/reference/selectors.md b/src/content/docs/ruby-gem/reference/selectors.mdx
similarity index 72%
rename from ruby-gem/reference/selectors.md
rename to src/content/docs/ruby-gem/reference/selectors.mdx
index b9894552..db68d043 100644
--- a/ruby-gem/reference/selectors.md
+++ b/src/content/docs/ruby-gem/reference/selectors.mdx
@@ -1,13 +1,8 @@
---
-layout: default
-title: Selectors
-parent: Reference
-grand_parent: Ruby Gem
-nav_order: 3
+title: "Selectors"
+description: "The selectors scraper gives you fine-grained control over content extraction using CSS selectors."
---
-# Selectors
-
The `selectors` scraper gives you fine-grained control over content extraction using CSS selectors.
> A valid RSS item requires at least a `title` or a `description`.
@@ -37,20 +32,36 @@ selectors:
enhance: true # default: true
```
+## Item Ordering
+
+You can control the order of items in your feed:
+
+```yml
+selectors:
+ items:
+ selector: ".article"
+ order: "reverse" # Reverse the order of items (newest first)
+```
+
+Available options:
+
+- `"reverse"`: Reverses the order of items (useful when the website shows oldest items first)
+- Default: Items appear in the order they are found on the page
+
## RSS 2.0 Selectors
While you can define any named selector, only the following are used in the final RSS feed:
-| RSS 2.0 Tag | `html2rss` Name |
+| RSS 2.0 Tag | `html2rss` Name | Notes |
| ------------- | --------------- | ------------------------------ |
-| `title` | `title` |
-| `description` | `description` |
-| `link` | `url` |
-| `author` | `author` |
-| `category` | `categories` |
-| `guid` | `guid` |
-| `enclosure` | `enclosure` |
-| `pubDate` | `published_at` |
+| `title` | `title` | |
+| `description` | `description` | |
+| `link` | `url` | |
+| `author` | `author` | |
+| `category` | `categories` | |
+| `guid` | `guid` | |
+| `enclosure` | `enclosure` | |
+| `pubDate` | `published_at` | |
| `comments` | `comments` | ⚠️ _Not currently implemented_ |
## Selector Options
@@ -138,3 +149,7 @@ selectors:
attribute: "src"
content_type: "audio/mp3"
```
+
+---
+
+For detailed documentation on the Ruby API, see the [official YARD documentation](https://www.rubydoc.info/gems/html2rss).
diff --git a/ruby-gem/reference/strategy.md b/src/content/docs/ruby-gem/reference/strategy.mdx
similarity index 78%
rename from ruby-gem/reference/strategy.md
rename to src/content/docs/ruby-gem/reference/strategy.mdx
index 1368be73..e10cfd3a 100644
--- a/ruby-gem/reference/strategy.md
+++ b/src/content/docs/ruby-gem/reference/strategy.mdx
@@ -1,14 +1,8 @@
---
-layout: default
title: Strategy
-nav_order: 4
-parent: Reference
-grand_parent: Ruby Gem
-permalink: /ruby-gem/reference/strategy
+description: "Learn about different strategies for fetching website content with html2rss. Choose between faraday and browserless strategies for optimal performance."
---
-# Strategy
-
The `strategy` key defines how `html2rss` fetches a website's content.
- **`faraday`** (default): Makes a direct HTTP request. It is fast but does not execute JavaScript.
@@ -51,3 +45,7 @@ BROWSERLESS_IO_API_TOKEN="6R0W53R135510"
# Use the browserless strategy
html2rss feed --strategy=browserless my_config.yml
```
+
+---
+
+For detailed documentation on the Ruby API, see the [official YARD documentation](https://www.rubydoc.info/gems/html2rss).
diff --git a/src/content/docs/ruby-gem/reference/stylesheets.mdx b/src/content/docs/ruby-gem/reference/stylesheets.mdx
new file mode 100644
index 00000000..6c62e91c
--- /dev/null
+++ b/src/content/docs/ruby-gem/reference/stylesheets.mdx
@@ -0,0 +1,38 @@
+---
+title: Stylesheets
+description: "Learn how to add CSS and XSLT stylesheets to your RSS feeds. Customize the appearance and formatting of your generated RSS feeds."
+---
+
+The `stylesheets` key allows you to add CSS or XSLT stylesheets to your RSS feed, improving its appearance in web browsers. This makes your RSS feeds look professional and branded when viewed directly in a browser.
+
+## Why Style Your RSS Feed?
+
+Styling your RSS feed provides several benefits:
+
+- **Professional appearance** when viewed in browsers
+- **Brand consistency** with your website's design
+- **Better user experience** for direct feed access
+- **Custom formatting** for different content types
+
+## Configuration
+
+You can add multiple stylesheets to your configuration:
+
+```yaml
+stylesheets:
+ - href: "/path/to/style.xsl"
+ media: "all"
+ type: "text/xsl"
+ - href: "https://example.com/rss.css"
+ media: "all"
+ type: "text/css"
+```
+
+## Further Reading
+
+- [How to Format RSS with CSS](https://www.lifewire.com/how-to-format-rss-3469302)
+- [XSLT: Extensible Stylesheet Language Transformations](https://developer.mozilla.org/en-US/docs/Web/XSLT)
+
+---
+
+For detailed documentation on the Ruby API, see the [official YARD documentation](https://www.rubydoc.info/gems/html2rss).
diff --git a/src/content/docs/ruby-gem/tutorials/index.mdx b/src/content/docs/ruby-gem/tutorials/index.mdx
new file mode 100644
index 00000000..276095ee
--- /dev/null
+++ b/src/content/docs/ruby-gem/tutorials/index.mdx
@@ -0,0 +1,8 @@
+---
+title: "Tutorials"
+description: "This section provides step-by-step tutorials to help you get started with the html2rss Ruby gem."
+sidebar:
+ label: "Overview"
+---
+
+This section provides step-by-step tutorials to help you get started with the `html2rss` Ruby gem.
diff --git a/ruby-gem/tutorials/simple-blog-list.md b/src/content/docs/ruby-gem/tutorials/simple-blog-list.mdx
similarity index 91%
rename from ruby-gem/tutorials/simple-blog-list.md
rename to src/content/docs/ruby-gem/tutorials/simple-blog-list.mdx
index f05cb2e6..df36c40c 100644
--- a/ruby-gem/tutorials/simple-blog-list.md
+++ b/src/content/docs/ruby-gem/tutorials/simple-blog-list.mdx
@@ -1,13 +1,8 @@
---
-layout: default
-title: Scraping a Simple Blog List
-nav_order: 3
-parent: Tutorials
-grand_parent: Ruby Gem
+title: "Scraping a Simple Blog List"
+description: "This example demonstrates how to create a feed from a typical blog that has a list of articles on its homepage."
---
-# Tutorial: Scraping a Simple Blog List
-
This example demonstrates how to create a feed from a typical blog that has a list of articles on its homepage.
---
diff --git a/ruby-gem/tutorials/your-first-feed.md b/src/content/docs/ruby-gem/tutorials/your-first-feed.mdx
similarity index 87%
rename from ruby-gem/tutorials/your-first-feed.md
rename to src/content/docs/ruby-gem/tutorials/your-first-feed.mdx
index 5a356ca6..55474896 100644
--- a/ruby-gem/tutorials/your-first-feed.md
+++ b/src/content/docs/ruby-gem/tutorials/your-first-feed.mdx
@@ -1,13 +1,8 @@
---
-layout: default
-title: Your First Feed
-nav_order: 2
-parent: Tutorials
-grand_parent: Ruby Gem
+title: "Your First Feed"
+description: "Welcome to html2rss! This guide will walk you through creating your first RSS feed."
---
-# Your First Feed: A Step-by-Step Guide
-
Welcome to `html2rss`! This guide will walk you through creating your first RSS feed. We'll start with the easiest method and gradually introduce more powerful options.
---
@@ -63,4 +58,4 @@ This configuration tells `html2rss`:
- The `title` of each item is the text of the `` tag.
- The `url` of each item is the `href` attribute of the ` ` tag.
-This is just the beginning! From here, you can dive deep into the full range of [configuration options]({{ '/ruby-gem/configuration' | relative_url }}) to create the perfect feed.
+This is just the beginning! From here, you can dive deep into the full range of [configuration options](/ruby-gem/reference) to create the perfect feed.
diff --git a/support/troubleshooting.md b/src/content/docs/troubleshooting/troubleshooting.mdx
similarity index 58%
rename from support/troubleshooting.md
rename to src/content/docs/troubleshooting/troubleshooting.mdx
index 7a881c4e..b8c16832 100644
--- a/support/troubleshooting.md
+++ b/src/content/docs/troubleshooting/troubleshooting.mdx
@@ -1,11 +1,8 @@
---
-layout: default
-title: Troubleshooting
-nav_order: 6
+title: "Troubleshooting"
+description: "This guide provides solutions to common issues encountered when using html2rss."
---
-# Troubleshooting
-
This guide provides solutions to common issues encountered when using `html2rss`.
## Essential Tools
@@ -23,6 +20,17 @@ If your feed is empty, check the following:
- **URL:** Ensure the `url` in your configuration is correct and accessible.
- **`items.selector`:** Verify that the `items.selector` matches the elements on the page.
- **Website Changes:** Websites change their HTML structure frequently. Your selectors may be outdated.
+- **JavaScript Content:** If the content is loaded via JavaScript, use the `browserless` strategy instead of `faraday`.
+- **Authentication:** Some sites require authentication - check if you need to add headers or use a different strategy.
+
+### Configuration Errors
+
+Common configuration-related errors:
+
+- **`UnsupportedResponseContentType`:** The website returned content that html2rss can't parse (not HTML or JSON).
+- **`UnsupportedStrategy`:** The specified strategy is not available. Use `faraday` or `browserless`.
+- **`Configuration must include at least 'selectors' or 'auto_source'`:** You need to specify either manual selectors or enable auto-source.
+- **`stylesheet.type invalid`:** Only `text/css` and `text/xsl` are supported for stylesheets.
### Missing Item Parts
@@ -36,7 +44,7 @@ If parts of your items (e.g., title, link) are missing, check the following:
If you are having issues with date/time parsing, check the following:
-- **`time_format`:** Ensure the `time_format` in your configuration matches the date string on the website.
+- **Date Format:** The `parse_time` post-processor automatically detects common date formats using Ruby's `Time.parse`. Ensure your date strings are in a recognizable format.
- **`time_zone`:** Specify the correct `time_zone` if the website uses a specific time zone.
### `html2rss` Command Not Found
@@ -46,6 +54,15 @@ If you are getting a "command not found" error, try the following:
- **Re-install:** Re-install `html2rss` to ensure it is installed correctly: `gem install html2rss`.
- **Check `PATH`:** Ensure that the directory where Ruby gems are installed is in your system's `PATH`.
+### Web Application Errors
+
+For html2rss-web specific issues:
+
+- **`401 Unauthorized`:** Check your `AUTO_SOURCE_USERNAME` and `AUTO_SOURCE_PASSWORD` environment variables.
+- **`403 Forbidden`:** The URL is not in the `AUTO_SOURCE_ALLOWED_URLS` list, or the origin is not in `AUTO_SOURCE_ALLOWED_ORIGINS`.
+- **`500 Internal Server Error`:** Check the application logs for detailed error information.
+- **Health check failures:** Use the `/health_check.txt` endpoint to identify which specific feed configurations are broken.
+
## Tips & Tricks
- **Mobile Redirects:** Check that the channel URL does not redirect to a mobile page with a different markup structure.
diff --git a/web-application/installation.md b/src/content/docs/web-application/getting-started.mdx
similarity index 50%
rename from web-application/installation.md
rename to src/content/docs/web-application/getting-started.mdx
index c7907b69..8205de55 100644
--- a/web-application/installation.md
+++ b/src/content/docs/web-application/getting-started.mdx
@@ -1,41 +1,67 @@
---
-layout: default
-title: Installation
-nav_order: 2
-parent: Web Application
+title: "Getting Started"
+description: "Learn how to use html2rss-web to create RSS feeds from any website. Step-by-step guide for beginners with no technical knowledge required."
+sidebar:
+ order: 2
---
-# Installation
+Ready to create RSS feeds? Choose your path below. No technical knowledge required!
+
+## Quick Start Options
+
+### Option 1: Use a Public Instance (Easiest)
+
+**Try html2rss-web right now:**
+
+1. **Go to a public html2rss-web instance** (see our [community wiki](https://github.com/html2rss/html2rss-web/wiki/Instances) for available instances)
+2. **Enter a website URL** you want to create a feed for
+3. **Click "Generate Feed"** and copy the RSS URL
+4. **Add to your feed reader** (any RSS reader app)
+
+**Perfect for:** Testing, quick feeds, or if you don't want to install anything.
+
+### Option 2: Install Your Own Instance
+
+**For full control and custom feeds:**
+
+1. **Follow the installation steps below**
+2. **Create custom feeds** for any website
+3. **Run your own instance** with all features
+
+**Perfect for:** Power users, custom configurations, or when you need reliability.
+
+---
+
+## Installation Guide
This guide will help you set up your own copy of html2rss-web on your computer. Don't worry - we'll walk you through every step!
-## What You'll Need
+### What You'll Need
- **Docker** - A tool that makes installation simple (like an app store for server software)
- **About 10 minutes** - The whole process is quick and automated
-**Don't have Docker?** [Install it first](https://docs.docker.com/get-started/) - it's free and works on Windows, Mac, and Linux.
+**Don't have Docker?** [Install it first](https://docs.docker.com/get-started/) - it's free and works on all major operating systems.
-## Step 1: Create a Folder
+### Step 1: Create a Folder
Create a new folder on your computer to store html2rss-web files:
-**On Windows:** Right-click → New Folder → Name it "html2rss-web"
-**On Mac/Linux:** Open Terminal and run:
+**Create a new folder** on your computer and name it "html2rss-web". You can do this through your file manager or terminal:
```bash
mkdir html2rss-web
cd html2rss-web
```
-## Step 2: Create the Configuration File
+### Step 2: Create the Configuration File
Create a file called `docker-compose.yml` in your new folder. This file tells Docker how to set up html2rss-web with all the features you need.
**How to create the file:**
-- **On Windows:** Right-click in the folder → New → Text Document → Rename it to `docker-compose.yml` (make sure to change the extension)
-- **On Mac/Linux:** Use any text editor to create the file
+- **Using a text editor:** Create a new file and save it as `docker-compose.yml`
+- **Using terminal:** Use any text editor to create the file
```yaml
services:
@@ -75,29 +101,26 @@ services:
TOKEN: 6R0W53R135510
```
-## Step 3: Download the Feed List
+### Step 3: Download the Feed List
html2rss-web needs a list of feeds to work with. Download our pre-made list:
-**On Windows:** Right-click [this link](https://raw.githubusercontent.com/html2rss/html2rss-web/master/config/feeds.yml) → Save As → Name it "feeds.yml" → Save in your html2rss-web folder
+**Download the feeds.yml file:**
-**On Mac/Linux:** Open Terminal in your html2rss-web folder and run:
+- **Using your browser:** Right-click [this link](https://raw.githubusercontent.com/html2rss/html2rss-web/master/config/feeds.yml) → Save As → Name it "feeds.yml" → Save in your html2rss-web folder
+- **Using terminal:** Open Terminal in your html2rss-web folder and run:
```bash
curl https://raw.githubusercontent.com/html2rss/html2rss-web/master/config/feeds.yml -o feeds.yml
```
-## Step 4: Start html2rss-web
+### Step 4: Start html2rss-web
Now start html2rss-web:
-**On Windows:** Open Command Prompt in your html2rss-web folder and run:
+**Start html2rss-web:**
-```cmd
-docker compose up -d
-```
-
-**On Mac/Linux:** In Terminal, run:
+Open a terminal in your html2rss-web folder and run:
```bash
docker compose up -d
@@ -113,9 +136,12 @@ docker compose up -d
**If you see the interface, congratulations!** You've successfully set up html2rss-web.
+---
+
## Next Steps
-- **Try it out!** Visit `http://localhost:3000` to see html2rss-web in action
+**Ready to create feeds?**
+
- **Browse existing feeds** - Check out what's already available
-- **Create your first feed** - Follow our [How-To Guides]({{ '/web-application/how-to/' | relative_url }}) to make custom feeds
-- **Need help?** Check our [troubleshooting guide]({{ '/support/troubleshooting' | relative_url }}) if something doesn't work
+- **Create your first feed** - Follow our [How-To Guides](/web-application/how-to/) to make custom feeds
+- **Need help?** Check our [troubleshooting guide](/troubleshooting/troubleshooting) if something doesn't work
diff --git a/src/content/docs/web-application/how-to/automatic-updates.mdx b/src/content/docs/web-application/how-to/automatic-updates.mdx
new file mode 100644
index 00000000..913d9e44
--- /dev/null
+++ b/src/content/docs/web-application/how-to/automatic-updates.mdx
@@ -0,0 +1,10 @@
+---
+title: "Automatic Updates"
+description: "Learn how to set up automatic updates for html2rss-web using watchtower. Keep your Docker containers updated automatically with the latest features."
+sidebar:
+ order: 10
+---
+
+The [watchtower](https://containrrr.dev/watchtower/) service automatically pulls running Docker images and checks for updates. If an update is available, it will automatically start the updated image with the same configuration as the running one. Please read its manual.
+
+The `docker-compose.yml` in the [Installation Guide](/web-application/installation) contains a service description for watchtower.
diff --git a/src/content/docs/web-application/how-to/deployment.mdx b/src/content/docs/web-application/how-to/deployment.mdx
new file mode 100644
index 00000000..c1e556d2
--- /dev/null
+++ b/src/content/docs/web-application/how-to/deployment.mdx
@@ -0,0 +1,62 @@
+---
+title: "Deployment & Production"
+description: "Deploy html2rss-web to production with Docker. Learn best practices for hosting public instances with security, monitoring, and reliability."
+---
+
+html2rss-web is published on Docker Hub, making it easy to deploy with Docker. The `docker-compose.yml` from our [Installation Guide](/web-application/getting-started) provides a solid foundation for both development and production use.
+
+## Quick Start
+
+If you've already set up html2rss-web locally, you're ready to deploy it to production. The same Docker configuration works for both environments.
+
+## Production Best Practices
+
+When hosting a **public instance** that others will use, please follow these essential guidelines:
+
+### Security Essentials
+
+- **Use a reverse proxy** (nginx, Apache, or Cloudflare) to handle SSL termination and rate limiting
+- **Enable HTTPS only** - redirect all HTTP traffic to HTTPS
+- **Set strong passwords** for health check and auto-source authentication
+- **Restrict access** to admin endpoints and sensitive configuration
+
+### Reliability & Monitoring
+
+- **Enable auto-updates** using watchtower or similar tools
+- **Monitor the health check endpoint** (`/health_check.txt`) to detect issues early
+- **Set up logging** to track errors and performance
+- **Use environment variables** for configuration instead of hardcoded values
+
+### Performance Optimization
+
+- **Configure appropriate resource limits** for your Docker containers
+- **Use a CDN** for static assets if serving many users
+- **Monitor memory usage** - html2rss-web can be memory-intensive with large feeds
+- **Set up caching** for frequently accessed feeds
+
+## Environment Configuration
+
+For production, update your environment variables:
+
+```yaml
+environment:
+ RACK_ENV: production
+ LOG_LEVEL: warn
+ HEALTH_CHECK_USERNAME: your-secure-username
+ HEALTH_CHECK_PASSWORD: your-very-secure-password
+ BASE_URL: https://your-domain.com
+```
+
+## Share Your Instance
+
+Once your instance is running smoothly:
+
+- **[Add it to our community wiki](https://github.com/html2rss/html2rss-web/wiki/Instances)** so others can discover it
+- **Test thoroughly** with various feed types before sharing
+- **Monitor usage** and be prepared to scale if needed
+
+## Need Help?
+
+- **Deployment issues?** Check our [troubleshooting guide](/troubleshooting/troubleshooting)
+- **Security questions?** Join our [community discussions](https://github.com/orgs/html2rss/discussions)
+- **Want to contribute?** See our [contributing guide](/get-involved/contributing)
diff --git a/web-application/how-to/setup-for-development.md b/src/content/docs/web-application/how-to/setup-for-development.mdx
similarity index 87%
rename from web-application/how-to/setup-for-development.md
rename to src/content/docs/web-application/how-to/setup-for-development.mdx
index 0209b650..d585bc45 100644
--- a/web-application/how-to/setup-for-development.md
+++ b/src/content/docs/web-application/how-to/setup-for-development.mdx
@@ -1,13 +1,8 @@
---
-layout: default
-title: Setup for development
-nav_order: 5
-parent: How-To Guides
-grand_parent: Web Application
+title: "Setup for development"
+description: "Check out the git repository and set up your development environment."
---
-# Setup for development
-
Check out the git repository and…
### Using Docker
diff --git a/web-application/how-to/use-automatic-feed-generation.md b/src/content/docs/web-application/how-to/use-automatic-feed-generation.mdx
similarity index 84%
rename from web-application/how-to/use-automatic-feed-generation.md
rename to src/content/docs/web-application/how-to/use-automatic-feed-generation.mdx
index 9ada3e3d..020126d8 100644
--- a/web-application/how-to/use-automatic-feed-generation.md
+++ b/src/content/docs/web-application/how-to/use-automatic-feed-generation.mdx
@@ -1,13 +1,8 @@
---
-layout: default
-title: Use automatic feed generation
-nav_order: 2
-parent: How-To Guides
-grand_parent: Web Application
+title: "Use automatic feed generation"
+description: "This feature lets you create RSS feeds automatically - just enter a website URL and html2rss-web figures out the rest!"
---
-# Automatic Feed Generation
-
This feature lets you create RSS feeds automatically - just enter a website URL and html2rss-web figures out the rest!
> **Note:** This feature is disabled by default for security reasons.
diff --git a/web-application/how-to/use-included-configs.md b/src/content/docs/web-application/how-to/use-included-configs.mdx
similarity index 67%
rename from web-application/how-to/use-included-configs.md
rename to src/content/docs/web-application/how-to/use-included-configs.mdx
index 92013a06..1155acac 100644
--- a/web-application/how-to/use-included-configs.md
+++ b/src/content/docs/web-application/how-to/use-included-configs.mdx
@@ -1,18 +1,13 @@
---
-layout: default
-title: Use the included configs
-parent: How-To Guides
-grand_parent: Web Application
-nav_order: 3
+title: "Use the included configs"
+description: "html2rss-web comes with hundreds of ready-made feeds for popular websites! No configuration needed - just use the URLs."
---
-# Using Pre-Made Feeds
-
html2rss-web comes with hundreds of ready-made feeds for popular websites! No configuration needed - just use the URLs.
## How to Use Them
-1. **Find a feed** in the [Feed Directory]({{ '/feed-directory' | relative_url }})
+1. **Find a feed** in the [Feed Directory](/feed-directory/)
2. **Copy the URL** (it looks like `domainname.tld/whatever.rss`)
3. **Add it to your feed reader** - paste the URL and you're done!
diff --git a/web-application/index.md b/src/content/docs/web-application/index.mdx
similarity index 60%
rename from web-application/index.md
rename to src/content/docs/web-application/index.mdx
index f4e22bf4..dfe62b6c 100644
--- a/web-application/index.md
+++ b/src/content/docs/web-application/index.mdx
@@ -1,17 +1,16 @@
---
-layout: default
-title: Web Application
-nav_order: 2
-has_children: true
+title: "Web Application"
+description: "html2rss-web is an easy-to-use web application that creates RSS feeds from any website. No coding required - just point, click, and get your RSS feed."
+sidebar:
+ label: "Overview"
+ order: 1
---
-# html2rss-web
-
This web application scrapes websites to build and deliver RSS 2.0 feeds. It is a powerful tool for creating custom RSS feeds.
## Get Started
-Our **[Getting Started guide]({{ '/web-application/getting-started' | relative_url }})** covers essential first steps, from understanding the application to installing your own instance.
+Our **[Getting Started guide](/web-application/getting-started)** covers essential first steps, from understanding the application to installing your own instance.
## Key Features
diff --git a/web-application/reference/env-variables.md b/src/content/docs/web-application/reference/env-variables.mdx
similarity index 77%
rename from web-application/reference/env-variables.md
rename to src/content/docs/web-application/reference/env-variables.mdx
index f92d4746..11b050fd 100644
--- a/web-application/reference/env-variables.md
+++ b/src/content/docs/web-application/reference/env-variables.mdx
@@ -1,31 +1,26 @@
---
-layout: default
-title: ENV variables
-nav_order: 1
-parent: Reference
-grand_parent: Web Application
+title: "ENV variables"
+description: "Configuration reference for html2rss-web environment variables."
---
-# Configuration Reference
-
## Supported ENV variables
-| Name | Description |
-| ------------------------------ | ---------------------------------- |
-| `BASE_URL` | default: '' |
-| `LOG_LEVEL` | default: 'warn' |
-| `HEALTH_CHECK_USERNAME` | default: auto-generated on start |
-| `HEALTH_CHECK_PASSWORD` | default: auto-generated on start |
-| | |
-| `AUTO_SOURCE_ENABLED` | default: false |
-| `AUTO_SOURCE_USERNAME` | no default. |
-| `AUTO_SOURCE_PASSWORD` | no default. |
-| `AUTO_SOURCE_ALLOWED_ORIGINS` | no default. |
-| | |
-| `PORT` | default: 3000 |
-| `RACK_ENV` | default: 'development' |
-| `RACK_TIMEOUT_SERVICE_TIMEOUT` | default: 15 |
-| `WEB_CONCURRENCY` | default: 2 |
-| `WEB_MAX_THREADS` | default: 5 |
-| | |
-| `SENTRY_DSN` | no default. |
+| Name | Description |
+| ------------------------------ | -------------------------------- |
+| `BASE_URL` | default: 'http://localhost:3000' |
+| `LOG_LEVEL` | default: 'warn' |
+| `HEALTH_CHECK_USERNAME` | default: auto-generated on start |
+| `HEALTH_CHECK_PASSWORD` | default: auto-generated on start |
+| | |
+| `AUTO_SOURCE_ENABLED` | default: false |
+| `AUTO_SOURCE_USERNAME` | no default. |
+| `AUTO_SOURCE_PASSWORD` | no default. |
+| `AUTO_SOURCE_ALLOWED_ORIGINS` | no default. |
+| | |
+| `PORT` | default: 3000 |
+| `RACK_ENV` | default: 'development' |
+| `RACK_TIMEOUT_SERVICE_TIMEOUT` | default: 15 |
+| `WEB_CONCURRENCY` | default: 2 |
+| `WEB_MAX_THREADS` | default: 5 |
+| | |
+| `SENTRY_DSN` | no default. |
diff --git a/src/content/docs/web-application/reference/index.mdx b/src/content/docs/web-application/reference/index.mdx
new file mode 100644
index 00000000..f8956e7d
--- /dev/null
+++ b/src/content/docs/web-application/reference/index.mdx
@@ -0,0 +1,9 @@
+---
+title: "Reference"
+description: "This section contains detailed reference material."
+sidebar:
+ label: "Reference"
+ order: 20
+---
+
+This section contains detailed reference material.
diff --git a/web-application/reference/monitoring.md b/src/content/docs/web-application/reference/monitoring.mdx
similarity index 85%
rename from web-application/reference/monitoring.md
rename to src/content/docs/web-application/reference/monitoring.mdx
index d328aa26..a4d7645a 100644
--- a/web-application/reference/monitoring.md
+++ b/src/content/docs/web-application/reference/monitoring.mdx
@@ -1,13 +1,8 @@
---
-layout: default
-title: Monitoring
-parent: Reference
-grand_parent: Web Application
-nav_order: 3
+title: "Monitoring"
+description: "Runtime monitoring and application performance monitoring for html2rss-web."
---
-# Monitoring
-
## Runtime monitoring via `GET /health_check.txt`
It is recommended to set up monitoring of the `/health_check.txt` endpoint. With that, you can find out when one of _your own_ configs breaks. The endpoint uses HTTP Basic authentication.
@@ -24,7 +19,7 @@ To get notified when one of your configs breaks, set up monitoring of this endpo
[UptimeRobot's free plan](https://uptimerobot.com/) is sufficient for basic monitoring (every 5 minutes).
Create a monitor of type _Keyword_ with this information and make it aware of your username and password:
-
+
## Application Performance Monitoring using Sentry
diff --git a/web-application/reference/versioning-and-releases.md b/src/content/docs/web-application/reference/versioning-and-releases.mdx
similarity index 75%
rename from web-application/reference/versioning-and-releases.md
rename to src/content/docs/web-application/reference/versioning-and-releases.mdx
index ce47eaaf..63de78d2 100644
--- a/web-application/reference/versioning-and-releases.md
+++ b/src/content/docs/web-application/reference/versioning-and-releases.mdx
@@ -1,13 +1,8 @@
---
-layout: default
title: Versioning and releases
-parent: Reference
-grand_parent: Web Application
-nav_order: 5
+description: Learn about versioning and release strategy for html2rss-web
---
-# Versioning and releases
-
This web application is distributed in a [rolling release](https://en.wikipedia.org/wiki/Rolling_release) fashion from the `master` branch.
For the latest commit passing GitHub CI/CD on the master branch, an updated Docker image will be pushed to [Docker Hub: `gilcreator/html2rss-web`](https://hub.docker.com/r/gilcreator/html2rss-web).
@@ -15,4 +10,4 @@ The [SBOM](https://en.wikipedia.org/wiki/Software_supply_chain) is embedded in t
GitHub's @dependabot is enabled for dependency updates and they are automatically merged to the `master` branch when the CI gives the green light.
-If you use Docker, you should update to the latest image automatically by [setting up _watchtower_ as described]({{ '/web-application/how-to/automatic-updates' | relative_url }}).
+If you use Docker, you should update to the latest image automatically by [setting up _watchtower_ as described](/web-application/how-to/automatic-updates).
diff --git a/src/data/configs.json b/src/data/configs.json
new file mode 100644
index 00000000..3ae423f1
--- /dev/null
+++ b/src/data/configs.json
@@ -0,0 +1,641 @@
+[
+ {
+ "domain": "adfc.de",
+ "name": "pressemitteilungen",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.adfc.de/presse/pressemitteilungen/",
+ "time_zone": "Europe/Berlin",
+ "ttl": 720,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "apnews.com",
+ "name": "hub",
+ "valid_channel_url": false,
+ "url_parameters": {
+ "section": "String"
+ },
+ "default_parameters": {
+ "section": "news"
+ },
+ "channel": {
+ "url": "https://apnews.com/%s",
+ "language": "en",
+ "ttl": 120,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "avherald.com",
+ "name": "index",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://avherald.com/",
+ "language": "en",
+ "ttl": 120,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "bbc.co.uk",
+ "name": "available_episodes",
+ "valid_channel_url": false,
+ "url_parameters": {
+ "id": "String"
+ },
+ "default_parameters": {
+ "id": "b006wkfp"
+ },
+ "channel": {
+ "url": "https://www.bbc.co.uk/programmes/%s/episodes/player",
+ "time_zone": "UTC",
+ "ttl": 720
+ }
+ },
+ {
+ "domain": "bbc.com",
+ "name": "mundo",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.bbc.com/mundo",
+ "language": "es",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "blog.mondediplo.net",
+ "name": "feed",
+ "valid_channel_url": false,
+ "url_parameters": {
+ "blog": "String"
+ },
+ "default_parameters": {
+ "blog": "-Defense-en-ligne-"
+ },
+ "channel": {
+ "url": "https://blog.mondediplo.net/%s",
+ "time_zone": "Europe/Paris",
+ "title": "blog.mondediplo.net: %s",
+ "ttl": 120
+ }
+ },
+ {
+ "domain": "canarianweekly.com",
+ "name": "front",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.canarianweekly.com/",
+ "time_zone": "Europe/London",
+ "ttl": 720,
+ "language": "en"
+ }
+ },
+ {
+ "domain": "cinemascore.com",
+ "name": "index",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://webapp.cinemascore.com/guest/surveys",
+ "ttl": 720,
+ "json": true,
+ "time_zone": "America/Los_Angeles"
+ }
+ },
+ {
+ "domain": "cleanenergywire.org",
+ "name": "news",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.cleanenergywire.org/news-archive",
+ "time_zone": "Europe/Berlin",
+ "ttl": 360
+ }
+ },
+ {
+ "domain": "cnet.com",
+ "name": "section_sub",
+ "valid_channel_url": false,
+ "url_parameters": {
+ "section": "String",
+ "sub": "String"
+ },
+ "default_parameters": {
+ "section": "news",
+ "sub": "tech"
+ },
+ "channel": {
+ "url": "https://www.cnet.com/%s/%s/",
+ "language": "en",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "computerbase.de",
+ "name": "meistgelesen",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "title": "computerbase.de: meistgelesen",
+ "url": "https://www.computerbase.de",
+ "time_zone": "Europe/Berlin",
+ "ttl": 360,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "cutle.fish",
+ "name": "index",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://cutle.fish/",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "deraktionaer.de",
+ "name": "meistgelesen",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "title": "deraktionaer.de: meistgelesen",
+ "url": "https://deraktionaer.de/",
+ "time_zone": "Europe/Berlin",
+ "ttl": 360,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "developer.apple.com",
+ "name": "tutorials_data_documentation_technotes_json",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "json": true,
+ "url": "https://developer.apple.com/tutorials/data/documentation/Technotes.json",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "dfs.de",
+ "name": "pressemitteilungen",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.dfs.de/homepage/de/medien/presse/",
+ "time_zone": "Europe/Berlin",
+ "ttl": 1440,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "dsw-info.de",
+ "name": "presse",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.dsw-info.de/presse",
+ "time_zone": "Europe/Berlin",
+ "ttl": 720,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "espn.com",
+ "name": "f1",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.espn.com/f1/",
+ "time_zone": "UTC",
+ "ttl": 60
+ }
+ },
+ {
+ "domain": "fia.com",
+ "name": "documents",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.fia.com/documents/championships/fia-formula-one-world-championship-14/season/season-2025-2071",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "formula1.com",
+ "name": "latest",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.formula1.com/en/latest/all.html",
+ "time_zone": "UTC",
+ "ttl": 120
+ }
+ },
+ {
+ "domain": "github.com",
+ "name": "releases",
+ "valid_channel_url": false,
+ "url_parameters": {
+ "username": "String",
+ "repository": "String"
+ },
+ "default_parameters": {
+ "username": "nuxt",
+ "repository": "nuxt.js"
+ },
+ "channel": {
+ "url": "https://github.com/%s/%s/releases",
+ "time_zone": "UTC",
+ "ttl": 720,
+ "description": "Releases of %s/%s on github.com."
+ }
+ },
+ {
+ "domain": "iaapa.org",
+ "name": "news",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.iaapa.org/news",
+ "time_zone": "UTC",
+ "ttl": 720
+ }
+ },
+ {
+ "domain": "imdb.com",
+ "name": "ratings",
+ "valid_channel_url": false,
+ "url_parameters": {
+ "user_id": "String"
+ },
+ "default_parameters": {
+ "user_id": "ur7019649"
+ },
+ "channel": {
+ "url": "https://www.imdb.com/user/%s/ratings",
+ "time_zone": "UTC",
+ "ttl": 1440
+ }
+ },
+ {
+ "domain": "ingenieur.de",
+ "name": "karriere_arbeitsleben_heiko_mell",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.ingenieur.de/karriere/arbeitsleben/heiko-mell/",
+ "language": "de-DE",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "kinocheck.de",
+ "name": "filmstarts",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://kinocheck.de/filmstarts",
+ "time_zone": "Europe/Berlin",
+ "ttl": 1440,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "newyorker.com",
+ "name": "magazine",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.newyorker.com/magazine",
+ "language": "en",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "nomanssky.com",
+ "name": "news",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.nomanssky.com/news/",
+ "language": "en-GB",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "pankow.lebensmittel-kontrollergebnisse.de",
+ "name": "search",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://pankow.lebensmittel-kontrollergebnisse.de/Search",
+ "language": "de",
+ "ttl": 360,
+ "time_zone": "Europe/Berlin"
+ }
+ },
+ {
+ "domain": "phys.org",
+ "name": "weekly",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://phys.org/weekly-news/",
+ "time_zone": "Europe/London",
+ "ttl": 1440
+ }
+ },
+ {
+ "domain": "rbb24.de",
+ "name": "meistgeklickt",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "title": "rbb24.de: meistgeklickt",
+ "url": "https://rbb24.de/",
+ "time_zone": "Europe/Berlin",
+ "ttl": 30,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "robinwood.de",
+ "name": "aktuelles",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.robinwood.de/was-gibt-es-neues/aktuelles",
+ "time_zone": "Europe/Berlin",
+ "ttl": 720,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "s3.amazonaws.com",
+ "name": "popular_movies",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://s3.amazonaws.com/popular-movies/movies.json",
+ "time_zone": "UTC",
+ "ttl": 1440,
+ "json": true
+ }
+ },
+ {
+ "domain": "sebastianvettel.de",
+ "name": "news",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://sebastianvettel.de/news/",
+ "language": "de-DE",
+ "ttl": 8640,
+ "time_zone": "Europe/Berlin"
+ }
+ },
+ {
+ "domain": "softwareleadweekly.com",
+ "name": "issues",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://softwareleadweekly.com/issues",
+ "time_zone": "UTC",
+ "ttl": 720
+ }
+ },
+ {
+ "domain": "solarthermalworld.org",
+ "name": "news",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://solarthermalworld.org/news",
+ "time_zone": "UTC",
+ "ttl": 180
+ }
+ },
+ {
+ "domain": "spektrum.de",
+ "name": "meistgelesen",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "title": "spektrum.de: meistgelesen",
+ "url": "https://www.spektrum.de/",
+ "time_zone": "Europe/Berlin",
+ "ttl": 60,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "spiegel.de",
+ "name": "impressum_autor",
+ "valid_channel_url": false,
+ "url_parameters": {
+ "id": "String"
+ },
+ "default_parameters": {
+ "id": "975b6ae0-0001-0003-0000-000000018282"
+ },
+ "channel": {
+ "url": "https://www.spiegel.de/impressum/autor-%s",
+ "time_zone": "Europe/Berlin",
+ "ttl": 180,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "stackoverflow.com",
+ "name": "hot_network_questions",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "title": "stackoverflow.com: Hot Network Questions",
+ "url": "https://stackoverflow.com/questions",
+ "time_zone": "America/New_York",
+ "ttl": 30
+ }
+ },
+ {
+ "domain": "steuerzahler.de",
+ "name": "news",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.steuerzahler.de/news",
+ "time_zone": "Europe/Berlin",
+ "ttl": 720,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "stripes.com",
+ "name": "index",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.stripes.com/",
+ "language": "en",
+ "ttl": 360,
+ "time_zone": "America/New_York"
+ }
+ },
+ {
+ "domain": "support.apple.com",
+ "name": "en_gb_ht201222",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://support.apple.com/en-gb/HT201222",
+ "language": "en",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "support.apple.com",
+ "name": "exchange_repair",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://support.apple.com/exchange_repair",
+ "time_zone": "America/Los_Angeles",
+ "ttl": 720
+ }
+ },
+ {
+ "domain": "teneriffa-news.com",
+ "name": "news",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.teneriffa-news.com/news",
+ "time_zone": "Europe/Lisbon",
+ "ttl": 720,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "test.de",
+ "name": "archiv",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.test.de/archiv/",
+ "language": "de",
+ "ttl": 360,
+ "time_zone": "Europe/Berlin"
+ }
+ },
+ {
+ "domain": "theguardian.com",
+ "name": "international_mostpopular",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "title": "theguardian.com: International most popular",
+ "url": "https://www.theguardian.com/international",
+ "time_zone": "Europe/London",
+ "ttl": 60
+ }
+ },
+ {
+ "domain": "thoughtworks.com",
+ "name": "insights",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.thoughtworks.com/insights",
+ "language": "en",
+ "ttl": 360,
+ "time_zone": "UTC"
+ }
+ },
+ {
+ "domain": "tourismusnetzwerk-brandenburg.de",
+ "name": "aktuelle_nachrichten",
+ "valid_channel_url": true,
+ "url_parameters": {},
+ "default_parameters": {},
+ "channel": {
+ "url": "https://www.tourismusnetzwerk-brandenburg.de/nc/aktuelle-nachrichten/",
+ "time_zone": "Europe/Berlin",
+ "ttl": 720,
+ "language": "de"
+ }
+ },
+ {
+ "domain": "webentwickler-jobs.de",
+ "name": "in",
+ "valid_channel_url": false,
+ "url_parameters": {
+ "region": "String"
+ },
+ "default_parameters": {
+ "region": "berlin"
+ },
+ "channel": {
+ "url": "https://www.webentwickler-jobs.de/in/%s",
+ "language": "de",
+ "ttl": 360,
+ "time_zone": "Europe/Berlin"
+ }
+ }
+]
diff --git a/src/data/loadConfigs.ts b/src/data/loadConfigs.ts
new file mode 100644
index 00000000..272735a4
--- /dev/null
+++ b/src/data/loadConfigs.ts
@@ -0,0 +1,34 @@
+import fs from 'fs';
+import path from 'path';
+
+export interface Config {
+ domain: string;
+ name: string;
+ valid_channel_url: boolean;
+ url_parameters: Record;
+ default_parameters: Record;
+ channel: {
+ url: string;
+ time_zone?: string;
+ ttl?: number;
+ language?: string;
+ title?: string;
+ json?: boolean;
+ };
+}
+
+export function loadConfigs(): Config[] {
+ try {
+ const filePath = path.join(process.cwd(), 'src/data/configs.json');
+ const fileContents = fs.readFileSync(filePath, 'utf8');
+ const data = JSON.parse(fileContents) as Config[];
+ return data || [];
+ } catch (error) {
+ console.error('Error loading configs:', error);
+ // Fallback to empty array if file doesn't exist
+ return [];
+ }
+}
+
+// Load configs from the generated JSON file
+export const configs = loadConfigs();
diff --git a/src/types/global.d.ts b/src/types/global.d.ts
new file mode 100644
index 00000000..6245b996
--- /dev/null
+++ b/src/types/global.d.ts
@@ -0,0 +1,7 @@
+declare global {
+ interface Window {
+ feedDirectoryData: any[];
+ }
+}
+
+export {};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..8bf91d3b
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "include": [".astro/types.d.ts", "**/*"],
+ "exclude": ["dist"]
+}
diff --git a/web-README.md b/web-README.md
deleted file mode 100644
index 3cf33d72..00000000
--- a/web-README.md
+++ /dev/null
@@ -1,251 +0,0 @@
-
-
-# html2rss-web
-
-This web application scrapes websites to build and deliver RSS 2.0 feeds.
-
-**Features:**
-
-- Provides stable URLs for feeds generated by automatic sourcing.
-- [Create your custom feeds](#how-to-build-your-rss-feeds)!
-- Comes with plenty of [included configs](https://github.com/html2rss/html2rss-configs) out of the box.
-- Handles request caching.
-- Sets caching-related HTTP headers.
-
-The functionality of scraping websites and building the RSS feeds is provided by the Ruby gem [`html2rss`](https://github.com/html2rss/html2rss).
-
-## Get started
-
-This application should be used with Docker. It is designed to require as little maintenance as possible. See [Versioning and Releases](#versioning-and-releases) and [consider automatic updates](#docker-automatically-keep-the-html2rss-web-image-up-to-date).
-
-### With Docker
-
-```sh
-docker run -p 3000:3000 gilcreator/html2rss-web
-```
-
-Then open in your browser and click the example feed link.
-
-This is the quickest way to get started. However, it's also the option with the least flexibility: it doesn't allow you to use custom feed configs and doesn't update automatically.
-
-If you want more flexibility and automatic updates sound good to you, read on to get started _with docker compose_…
-
-### With `docker compose`
-
-Create a `docker-compose.yml` file and paste the following into it:
-
-```yaml
-services:
- html2rss-web:
- image: gilcreator/html2rss-web
- ports:
- - "3000:3000"
- volumes:
- - type: bind
- source: ./feeds.yml
- target: /app/config/feeds.yml
- read_only: true
- environment:
- RACK_ENV: production
- HEALTH_CHECK_USERNAME: health
- HEALTH_CHECK_PASSWORD: please-set-YOUR-OWN-veeeeeery-l0ng-aNd-h4rd-to-gue55-Passw0rd!
- # AUTO_SOURCE_ENABLED: 'true'
- # AUTO_SOURCE_USERNAME: foobar
- # AUTO_SOURCE_PASSWORD: A-Unique-And-Long-Password-For-Your-Own-Instance
- ## to allow just requests originating from the local host
- # AUTO_SOURCE_ALLOWED_ORIGINS: 127.0.0.1:3000
- ## to allow multiple origins, seperate those via comma:
- # AUTO_SOURCE_ALLOWED_ORIGINS: example.com,h2r.host.tld
- BROWSERLESS_IO_WEBSOCKET_URL: ws://browserless:3001
- BROWSERLESS_IO_API_TOKEN: 6R0W53R135510
-
- watchtower:
- image: containrrr/watchtower
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock
- - "~/.docker/config.json:/config.json"
- command: --cleanup --interval 7200
-
- browserless:
- image: "ghcr.io/browserless/chromium"
- ports:
- - "3001:3001"
- environment:
- PORT: 3001
- CONCURRENT: 10
- TOKEN: 6R0W53R135510
-```
-
-Start it up with: `docker compose up`.
-
-If you have not created your `feeds.yml` yet, download [this `feeds.yml` as a blueprint](https://raw.githubusercontent.com/html2rss/html2rss-web/master/config/feeds.yml) into the directory containing the `docker-compose.yml`.
-
-## Docker: Automatically keep the html2rss-web image up-to-date
-
-The [watchtower](https://containrrr.dev/watchtower/) service automatically pulls running Docker images and checks for updates. If an update is available, it will automatically start the updated image with the same configuration as the running one. Please read its manual.
-
-The `docker-compose.yml` above contains a service description for watchtower.
-
-## How to use automatic feed generation
-
-> [!NOTE]
-> This feature is disabled by default.
-
-To enable the `auto_source` feature, comment in the env variables in the `docker-compose.yml` file from above and change the values accordingly:
-
-```yaml
-environment:
- ## … snip ✁
- AUTO_SOURCE_ENABLED: "true"
- AUTO_SOURCE_USERNAME: foobar
- AUTO_SOURCE_PASSWORD: A-Unique-And-Long-Password-For-Your-Own-Instance
- ## to allow just requests originating from the local host
- AUTO_SOURCE_ALLOWED_ORIGINS: 127.0.0.1:3000
- ## to allow multiple origins, seperate those via comma:
- # AUTO_SOURCE_ALLOWED_ORIGINS: example.com,h2r.host.tld
- ## … snap ✃
-```
-
-Restart the container and open .
-When asked, enter your username and password.
-
-Then enter the URL of a website and click on the _Generate_ button.
-
-## How to use the included configs
-
-html2rss-web comes with many feed configs out of the box. [See the file list of all configs.](https://github.com/html2rss/html2rss-configs/tree/master/lib/html2rss/configs)
-
-To use a config from there, build the URL like this:
-
-| | |
-| ------------------------ | ----------------------------- |
-| `lib/html2rss/configs/` | `domainname.tld/whatever.yml` |
-| Would become this URL: | |
-| `http://localhost:3000/` | `domainname.tld/whatever.rss` |
-| | `^^^^^^^^^^^^^^^^^^^^^^^^^^^` |
-
-## How to build your RSS feeds
-
-To build your own RSS feed, you need to create a _feed config_.\
-That _feed config_ goes into the file `feeds.yml`.\
-Check out the [`example` feed config](https://github.com/html2rss/html2rss-web/blob/master/config/feeds.yml#L9).
-
-Please refer to [html2rss' README for a description of _the feed config and its options_](https://github.com/html2rss/html2rss#the-feed-config-and-its-options). html2rss-web is just a small web application that builds on html2rss.
-
-## Versioning and releases
-
-This web application is distributed in a [rolling release](https://en.wikipedia.org/wiki/Rolling_release) fashion from the `master` branch.
-
-For the latest commit passing GitHub CI/CD on the master branch, an updated Docker image will be pushed to [Docker Hub: `gilcreator/html2rss-web`](https://hub.docker.com/r/gilcreator/html2rss-web).
-The [SBOM](https://en.wikipedia.org/wiki/Software_supply_chain) is embedded in the Docker image.
-
-GitHub's @dependabot is enabled for dependency updates and they are automatically merged to the `master` branch when the CI gives the green light.
-
-If you use Docker, you should update to the latest image automatically by [setting up _watchtower_ as described](#get-started).
-
-## Use in production
-
-This app is published on Docker Hub and therefore easy to use with Docker.\
-The above `docker-compose.yml` is a good starting point.
-
-If you're going to host a public instance, _please, please, please_:
-
-- Put the application behind a reverse proxy.
-- Allow outside connections only via HTTPS.
-- Have an auto-update strategy (e.g., watchtower).
-- Monitor your `/health_check.txt` endpoint.
-- [Let the world know and add your instance to the wiki](https://github.com/html2rss/html2rss-web/wiki/Instances) -- thank you!
-
-### Supported ENV variables
-
-| Name | Description |
-| ------------------------------ | ---------------------------------- |
-| `BASE_URL` | default: '' |
-| `LOG_LEVEL` | default: 'warn' |
-| `HEALTH_CHECK_USERNAME` | default: auto-generated on start |
-| `HEALTH_CHECK_PASSWORD` | default: auto-generated on start |
-| | |
-| `AUTO_SOURCE_ENABLED` | default: false |
-| `AUTO_SOURCE_USERNAME` | no default. |
-| `AUTO_SOURCE_PASSWORD` | no default. |
-| `AUTO_SOURCE_ALLOWED_ORIGINS` | no default. |
-| | |
-| `PORT` | default: 3000 |
-| `RACK_ENV` | default: 'development' |
-| `RACK_TIMEOUT_SERVICE_TIMEOUT` | default: 15 |
-| `WEB_CONCURRENCY` | default: 2 |
-| `WEB_MAX_THREADS` | default: 5 |
-| | |
-| `SENTRY_DSN` | no default. |
-
-### Runtime monitoring via `GET /health_check.txt`
-
-It is recommended to set up monitoring of the `/health_check.txt` endpoint. With that, you can find out when one of _your own_ configs breaks. The endpoint uses HTTP Basic authentication.
-
-First, set the username and password via these environment variables: `HEALTH_CHECK_USERNAME` and `HEALTH_CHECK_PASSWORD`. If these are not set, html2rss-web will generate a new random username and password on _each_ start.
-
-An authenticated `GET /health_check.txt` request will respond with:
-
-- If the feeds are generatable: `success`.
-- Otherwise: the names of the broken configs.
-
-To get notified when one of your configs breaks, set up monitoring of this endpoint.
-
-[UptimeRobot's free plan](https://uptimerobot.com/) is sufficient for basic monitoring (every 5 minutes).\
-Create a monitor of type _Keyword_ with this information and make it aware of your username and password:
-
-
-
-### Application Performance Monitoring using Sentry
-
-When you specify `SENTRY_DSN` in your environment variables, the application will be setup to use Sentry.
-
-## Setup for development
-
-Check out the git repository and…
-
-### Using Docker
-
-This approach allows you to experiment without installing Ruby on your machine.
-All you need to do is install and run Docker.
-
-```sh
-# Build image from Dockerfile and name/tag it as html2rss-web:
-docker build -t html2rss-web -f Dockerfile .
-
-# Run the image and name it html2rss-web-dev:
-docker run \
- --detach \
- --mount type=bind,source=$(pwd)/config,target=/app/config \
- --name html2rss-web-dev \
- html2rss-web
-
-# Open an interactive TTY with the shell `sh`:
-docker exec -ti html2rss-web-dev sh
-
-# Stop and clean up the container
-docker stop html2rss-web-dev
-docker rm html2rss-web-dev
-
-# Remove the image
-docker rmi html2rss-web
-```
-
-### Using installed Ruby
-
-If you're comfortable with installing Ruby directly on your machine, follow these instructions:
-
-1. Install Ruby `>= 3.2`
-2. `gem install bundler foreman`
-3. `bundle`
-4. `foreman start`
-
-_html2rss-web_ now listens on port **3000** for requests.
-
-## Contribute
-
-Contributions are welcome!
-
-Open a pull request with your changes,\
-open an issue, or\
-[join discussions on html2rss](https://github.com/orgs/html2rss/discussions).
diff --git a/web-application/getting-started.md b/web-application/getting-started.md
deleted file mode 100644
index 2b1f64b5..00000000
--- a/web-application/getting-started.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-layout: default
-title: Getting Started
-nav_order: 2
-parent: Web Application
----
-
-# Getting Started with html2rss-web
-
-Welcome! This guide will help you create RSS feeds from any website using the html2rss-web application.
-
-## What is html2rss-web?
-
-html2rss-web is a user-friendly web application that turns any website into an RSS feed. It's part of the html2rss project, which also includes a Ruby gem for developers. Think of html2rss-web as a translator that converts website content into a format your feed reader can understand.
-
-## Why Use RSS Feeds?
-
-Instead of visiting 20 different websites every day, you can:
-
-- **Get all updates in one place** - your feed reader
-- **Never miss new content** - automatic notifications
-- **Save time** - no more manual checking
-- **Stay organized** - categorize and filter content
-
-## Quick Start Options
-
-### Option 1: Browse Ready-Made Feeds (Easiest)
-
-1. **[Feed Directory]({{ '/feed-directory' | relative_url }})** - See what's already available
-2. **Copy the RSS URL** and add it to your feed reader
-
-### Option 2: Install Your Own Instance
-
-1. **[Installation Guide]({{ '/web-application/installation' | relative_url }})** - Set up your own copy
-2. **[Create Custom Feeds]({{ '/web-application/how-to/' | relative_url }})** - Make feeds for any website
-
-**New to RSS?** We recommend starting with the [Feed Directory]({{ '/feed-directory' | relative_url }}) to see examples, then installing html2rss-web to create your own feeds.
diff --git a/web-application/how-to/automatic-updates.md b/web-application/how-to/automatic-updates.md
deleted file mode 100644
index 7385944d..00000000
--- a/web-application/how-to/automatic-updates.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-layout: default
-title: Automatic Updates
-nav_order: 3
-parent: How-To Guides
-grand_parent: Web Application
----
-
-# Automatic Updates with Watchtower
-
-The [watchtower](https://containrrr.dev/watchtower/) service automatically pulls running Docker images and checks for updates. If an update is available, it will automatically start the updated image with the same configuration as the running one. Please read its manual.
-
-The `docker-compose.yml` in the [Installation Guide]({{ '/web-application/installation' | relative_url }}) contains a service description for watchtower.
diff --git a/web-application/how-to/deployment.md b/web-application/how-to/deployment.md
deleted file mode 100644
index d9f853f8..00000000
--- a/web-application/how-to/deployment.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: default
-title: Deployment
-nav_order: 4
-parent: How-To Guides
-grand_parent: Web Application
----
-
-# Deployment
-
-This app is published on Docker Hub and therefore easy to use with Docker.
-The `docker-compose.yml` in the [Installation Guide]({{ '/web-application/installation' | relative_url }}) is a good starting point.
-
-If you're going to host a public instance, _please, please, please_:
-
-- Put the application behind a reverse proxy.
-- Allow outside connections only via HTTPS.
-- Have an auto-update strategy (e.g., watchtower).
-- Monitor your `/health_check.txt` endpoint.
-- [Let the world know and add your instance to the wiki](https://github.com/html2rss/html2rss-web/wiki/Instances) -- thank you!
diff --git a/web-application/how-to/index.md b/web-application/how-to/index.md
deleted file mode 100644
index d3adaa99..00000000
--- a/web-application/how-to/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: default
-title: How-To Guides
-nav_order: 3
-parent: Web Application
-has_children: true
----
-
-# How-To Guides
-
-This section provides guides on how to perform specific tasks with html2rss-web.
diff --git a/web-application/how-to/use-in-production.md b/web-application/how-to/use-in-production.md
deleted file mode 100644
index a322c41d..00000000
--- a/web-application/how-to/use-in-production.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: default
-title: Use in production
-nav_order: 4
-parent: How-To Guides
-grand_parent: Web Application
----
-
-# Use in production
-
-This app is published on Docker Hub and therefore easy to use with Docker.
-The above `docker-compose.yml` is a good starting point.
-
-If you're going to host a public instance, _please, please, please_:
-
-- Put the application behind a reverse proxy.
-- Allow outside connections only via HTTPS.
-- Have an auto-update strategy (e.g., watchtower).
-- Monitor your `/health_check.txt` endpoint.
-- [Let the world know and add your instance to the wiki](https://github.com/html2rss/html2rss-web/wiki/Instances) -- thank you!
diff --git a/web-application/reference/index.md b/web-application/reference/index.md
deleted file mode 100644
index a9e19dd7..00000000
--- a/web-application/reference/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: default
-title: Reference
-nav_order: 4
-parent: Web Application
-has_children: true
----
-
-# Reference
-
-This section contains detailed reference material.
diff --git a/web-application/tutorials/building-feeds.md b/web-application/tutorials/building-feeds.md
deleted file mode 100644
index 64e28b98..00000000
--- a/web-application/tutorials/building-feeds.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-layout: default
-title: Building your RSS feeds
-nav_order: 1
-parent: Tutorials
-grand_parent: Web Application
----
-
-# How to build your RSS feeds
-
-To build your own RSS feed, you need to create a _feed config_.
-That _feed config_ goes into the file `feeds.yml`.
-Check out the [`example` feed config](https://github.com/html2rss/html2rss-web/blob/master/config/feeds.yml#L9).
-
-Please refer to [html2rss' README for a description of _the feed config and its options_](https://github.com/html2rss/html2rss#the-feed-config-and-its-options). html2rss-web is just a small web application that builds on html2rss.
diff --git a/web-application/tutorials/index.md b/web-application/tutorials/index.md
deleted file mode 100644
index 788baee0..00000000
--- a/web-application/tutorials/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-layout: default
-title: Tutorials
-parent: Web Application
-nav_order: 3
-has_children: true
----
-
-# Tutorials
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index c7521124..00000000
--- a/yarn.lock
+++ /dev/null
@@ -1,845 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@babel/code-frame@^7.0.0":
- version "7.10.1"
- resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz"
- integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==
- dependencies:
- "@babel/highlight" "^7.10.1"
-
-"@babel/helper-validator-identifier@^7.10.1":
- version "7.10.1"
- resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz"
- integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==
-
-"@babel/highlight@^7.10.1":
- version "7.10.1"
- resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz"
- integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==
- dependencies:
- "@babel/helper-validator-identifier" "^7.10.1"
- chalk "^2.0.0"
- js-tokens "^4.0.0"
-
-"@csstools/css-parser-algorithms@^3.0.5":
- version "3.0.5"
- resolved "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz"
- integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==
-
-"@csstools/css-tokenizer@^3.0.4":
- version "3.0.4"
- resolved "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz"
- integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==
-
-"@csstools/media-query-list-parser@^4.0.3":
- version "4.0.3"
- resolved "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz"
- integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==
-
-"@csstools/selector-specificity@^5.0.0":
- version "5.0.0"
- resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz"
- integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==
-
-"@dual-bundle/import-meta-resolve@^4.1.0":
- version "4.1.0"
- resolved "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz"
- integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==
-
-"@keyv/serialize@^1.1.0":
- version "1.1.0"
- resolved "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz"
- integrity sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==
-
-"@nodelib/fs.scandir@2.1.3":
- version "2.1.3"
- resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz"
- integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
- dependencies:
- "@nodelib/fs.stat" "2.0.3"
- run-parallel "^1.1.9"
-
-"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
- version "2.0.3"
- resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz"
- integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
-
-"@nodelib/fs.walk@^1.2.3":
- version "1.2.4"
- resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz"
- integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
- dependencies:
- "@nodelib/fs.scandir" "2.1.3"
- fastq "^1.6.0"
-
-ajv@^8.0.1:
- version "8.3.0"
- resolved "https://registry.npmjs.org/ajv/-/ajv-8.3.0.tgz"
- integrity sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q==
- dependencies:
- fast-deep-equal "^3.1.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
- uri-js "^4.2.2"
-
-ansi-regex@^5.0.1:
- version "5.0.1"
- resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
- integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
-
-ansi-styles@^3.2.1:
- version "3.2.1"
- resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
- integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
- dependencies:
- color-convert "^1.9.0"
-
-ansi-styles@^4.0.0:
- version "4.3.0"
- resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
- integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
- dependencies:
- color-convert "^2.0.1"
-
-argparse@^2.0.1:
- version "2.0.1"
- resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
- integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-
-array-union@^2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
- integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-
-astral-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz"
- integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-
-balanced-match@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz"
- integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
-
-braces@^3.0.3:
- version "3.0.3"
- resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
- integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
- dependencies:
- fill-range "^7.1.1"
-
-cacheable@^1.10.4:
- version "1.10.4"
- resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-1.10.4.tgz#874c7ac005e9127e1daa3b09dbb4fd01743a4e91"
- integrity sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==
- dependencies:
- hookified "^1.11.0"
- keyv "^5.5.0"
-
-callsites@^3.0.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
- integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-
-chalk@^2.0.0:
- version "2.4.2"
- resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
- integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
- dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
-
-color-convert@^1.9.0:
- version "1.9.3"
- resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
- integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
- dependencies:
- color-name "1.1.3"
-
-color-convert@^2.0.1:
- version "2.0.1"
- resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
- dependencies:
- color-name "~1.1.4"
-
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
- integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
-
-color-name@~1.1.4:
- version "1.1.4"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-colord@^2.9.3:
- version "2.9.3"
- resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz"
- integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
-
-cosmiconfig@^9.0.0:
- version "9.0.0"
- resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz"
- integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==
- dependencies:
- env-paths "^2.2.1"
- import-fresh "^3.3.0"
- js-yaml "^4.1.0"
- parse-json "^5.2.0"
-
-css-functions-list@^3.2.3:
- version "3.2.3"
- resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz"
- integrity sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==
-
-css-tree@^3.0.1, css-tree@^3.1.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz"
- integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==
- dependencies:
- mdn-data "2.12.2"
- source-map-js "^1.0.1"
-
-cssesc@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
- integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-
-debug@^4.4.1:
- version "4.4.1"
- resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz"
- integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
- dependencies:
- ms "^2.1.3"
-
-dir-glob@^3.0.1:
- version "3.0.1"
- resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
- integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
- dependencies:
- path-type "^4.0.0"
-
-emoji-regex@^8.0.0:
- version "8.0.0"
- resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
- integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-env-paths@^2.2.1:
- version "2.2.1"
- resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz"
- integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
-
-error-ex@^1.3.1:
- version "1.3.2"
- resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
- integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
- dependencies:
- is-arrayish "^0.2.1"
-
-escape-string-regexp@^1.0.5:
- version "1.0.5"
- resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
- integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-
-fast-deep-equal@^3.1.1:
- version "3.1.3"
- resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
- integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-
-fast-glob@^3.2.9, fast-glob@^3.3.3:
- version "3.3.3"
- resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz"
- integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
- dependencies:
- "@nodelib/fs.stat" "^2.0.2"
- "@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.2"
- merge2 "^1.3.0"
- micromatch "^4.0.8"
-
-fastest-levenshtein@^1.0.16:
- version "1.0.16"
- resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz"
- integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
-
-fastq@^1.6.0:
- version "1.8.0"
- resolved "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz"
- integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
- dependencies:
- reusify "^1.0.4"
-
-file-entry-cache@^10.1.4:
- version "10.1.4"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.1.4.tgz#1e81441517dc33ba5fe14421d96dc5fe7e37e820"
- integrity sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==
- dependencies:
- flat-cache "^6.1.13"
-
-fill-range@^7.1.1:
- version "7.1.1"
- resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz"
- integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
- dependencies:
- to-regex-range "^5.0.1"
-
-flat-cache@^6.1.13:
- version "6.1.13"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.13.tgz#7428e97be2aa918f371e880ebbf7f61ff48f33fa"
- integrity sha512-gmtS2PaUjSPa4zjObEIn4WWliKyZzYljgxODBfxugpK6q6HU9ClXzgCJ+nlcPKY9Bt090ypTOLIFWkV0jbKFjw==
- dependencies:
- cacheable "^1.10.4"
- flatted "^3.3.3"
- hookified "^1.11.0"
-
-flatted@^3.3.3:
- version "3.3.3"
- resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz"
- integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
-
-glob-parent@^5.1.2:
- version "5.1.2"
- resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
- integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
- dependencies:
- is-glob "^4.0.1"
-
-global-modules@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz"
- integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
- dependencies:
- global-prefix "^3.0.0"
-
-global-prefix@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz"
- integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
- dependencies:
- ini "^1.3.5"
- kind-of "^6.0.2"
- which "^1.3.1"
-
-globby@^11.1.0:
- version "11.1.0"
- resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
- integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
- dependencies:
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.2.9"
- ignore "^5.2.0"
- merge2 "^1.4.1"
- slash "^3.0.0"
-
-globjoin@^0.1.4:
- version "0.1.4"
- resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz"
- integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=
-
-has-flag@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
- integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
-
-has-flag@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-hookified@^1.11.0:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.12.0.tgz#eb4097ed1459211eef47fe85a8b3382c5f633996"
- integrity sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==
-
-html-tags@^3.3.1:
- version "3.3.1"
- resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz"
- integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==
-
-ignore@^5.2.0:
- version "5.3.2"
- resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
- integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
-
-ignore@^7.0.5:
- version "7.0.5"
- resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz"
- integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==
-
-import-fresh@^3.3.0:
- version "3.3.0"
- resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
- integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
- dependencies:
- parent-module "^1.0.0"
- resolve-from "^4.0.0"
-
-imurmurhash@^0.1.4:
- version "0.1.4"
- resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
- integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
-
-ini@^1.3.5:
- version "1.3.8"
- resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
-is-arrayish@^0.2.1:
- version "0.2.1"
- resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
- integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
-
-is-extglob@^2.1.1:
- version "2.1.1"
- resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
- integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-
-is-fullwidth-code-point@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
- integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-glob@^4.0.1:
- version "4.0.1"
- resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-is-plain-object@^5.0.0:
- version "5.0.0"
- resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz"
- integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-
-js-tokens@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
- integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-
-js-yaml@^4.1.0:
- version "4.1.0"
- resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
- integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
- dependencies:
- argparse "^2.0.1"
-
-json-parse-even-better-errors@^2.3.0:
- version "2.3.1"
- resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
- integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
-
-json-schema-traverse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
- integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-
-keyv@^5.5.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.5.0.tgz#0ad5037484a7e01b033df7018033b5cc9ca7884f"
- integrity sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==
- dependencies:
- "@keyv/serialize" "^1.1.0"
-
-kind-of@^6.0.2:
- version "6.0.3"
- resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
- integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
-
-known-css-properties@^0.36.0:
- version "0.36.0"
- resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz"
- integrity sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==
-
-known-css-properties@^0.37.0:
- version "0.37.0"
- resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz"
- integrity sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==
-
-lines-and-columns@^1.1.6:
- version "1.1.6"
- resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz"
- integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
-
-lodash.truncate@^4.4.2:
- version "4.4.2"
- resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz"
- integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
-
-mathml-tag-names@^2.1.3:
- version "2.1.3"
- resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz"
- integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
-
-mdn-data@2.12.2:
- version "2.12.2"
- resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz"
- integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==
-
-mdn-data@^2.21.0:
- version "2.21.0"
- resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.21.0.tgz"
- integrity sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ==
-
-meow@^13.2.0:
- version "13.2.0"
- resolved "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz"
- integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==
-
-merge2@^1.3.0, merge2@^1.4.1:
- version "1.4.1"
- resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
- integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-
-micromatch@^4.0.8:
- version "4.0.8"
- resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz"
- integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
- dependencies:
- braces "^3.0.3"
- picomatch "^2.3.1"
-
-ms@^2.1.3:
- version "2.1.3"
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
-nanoid@^3.3.11:
- version "3.3.11"
- resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
- integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
-
-normalize-path@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-parent-module@^1.0.0:
- version "1.0.1"
- resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
- integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
- dependencies:
- callsites "^3.0.0"
-
-parse-json@^5.2.0:
- version "5.2.0"
- resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
- integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- error-ex "^1.3.1"
- json-parse-even-better-errors "^2.3.0"
- lines-and-columns "^1.1.6"
-
-path-type@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
- integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-
-picocolors@^1.1.1:
- version "1.1.1"
- resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
- integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-
-picomatch@^2.3.1:
- version "2.3.1"
- resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
- integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-postcss-media-query-parser@^0.2.3:
- version "0.2.3"
- resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz"
- integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
-
-postcss-resolve-nested-selector@^0.1.6:
- version "0.1.6"
- resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz"
- integrity sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==
-
-postcss-safe-parser@^7.0.1:
- version "7.0.1"
- resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz"
- integrity sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==
-
-postcss-scss@^4.0.9:
- version "4.0.9"
- resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz"
- integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==
-
-postcss-selector-parser@^7.1.0:
- version "7.1.0"
- resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz"
- integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==
- dependencies:
- cssesc "^3.0.0"
- util-deprecate "^1.0.2"
-
-postcss-sorting@^9.1.0:
- version "9.1.0"
- resolved "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-9.1.0.tgz"
- integrity sha512-Mn8KJ45HNNG6JBpBizXcyf6LqY/qyqetGcou/nprDnFwBFBLGj0j/sNKV2lj2KMOVOwdXu14aEzqJv8CIV6e8g==
-
-postcss-value-parser@^4.2.0:
- version "4.2.0"
- resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
- integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-
-postcss@^8.5.3, postcss@^8.5.6:
- version "8.5.6"
- resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
- integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
- dependencies:
- nanoid "^3.3.11"
- picocolors "^1.1.1"
- source-map-js "^1.2.1"
-
-prettier@3.6.2:
- version "3.6.2"
- resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz"
- integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
-
-punycode@^2.1.0:
- version "2.1.1"
- resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
-require-from-string@^2.0.2:
- version "2.0.2"
- resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
- integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-
-resolve-from@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
- integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-
-resolve-from@^5.0.0:
- version "5.0.0"
- resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
- integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-
-reusify@^1.0.4:
- version "1.0.4"
- resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
- integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-
-run-parallel@^1.1.9:
- version "1.1.9"
- resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz"
- integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
-
-signal-exit@^4.0.1:
- version "4.0.2"
- resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz"
- integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==
-
-slash@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
- integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-
-slice-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz"
- integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
- dependencies:
- ansi-styles "^4.0.0"
- astral-regex "^2.0.0"
- is-fullwidth-code-point "^3.0.0"
-
-source-map-js@^1.0.1:
- version "1.0.2"
- resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
- integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
-
-source-map-js@^1.2.1:
- 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==
-
-string-width@^4.2.3:
- version "4.2.3"
- resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
- integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.1"
-
-strip-ansi@^6.0.1:
- version "6.0.1"
- resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
- integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
- dependencies:
- ansi-regex "^5.0.1"
-
-stylelint-config-recess-order@7.3.0:
- version "7.3.0"
- resolved "https://registry.yarnpkg.com/stylelint-config-recess-order/-/stylelint-config-recess-order-7.3.0.tgz#0f29306e4ab667cc80a6e6490f9b010a3a14b16a"
- integrity sha512-1LZhQi/D6OljSLRKejMEzbZA8h0AKkJH7p2y+eValc9ltWRGVznjnZsNLVCOwYpKk7GlYMLNVYTc9WpA0W3TYQ==
-
-stylelint-config-recommended-scss@16.0.1:
- version "16.0.1"
- resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-16.0.1.tgz#10ac6dab288832695a4f96f4cdc77a68aa7eca9f"
- integrity sha512-wfpU6kmTUwPEHMACYdpt5wLM/aS44+sqE8yk82LkOkA7yVpAuTZDwd3m9762d0mRnNCn0JMUx4XfDVDmbb8hTA==
- dependencies:
- postcss-scss "^4.0.9"
- stylelint-config-recommended "^17.0.0"
- stylelint-scss "^6.12.1"
-
-stylelint-config-recommended@^17.0.0:
- version "17.0.0"
- resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz#4f77c70609b2d7093cc60bb48adfabdde434aa5d"
- integrity sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==
-
-stylelint-order@7.0.0:
- version "7.0.0"
- resolved "https://registry.npmjs.org/stylelint-order/-/stylelint-order-7.0.0.tgz"
- integrity sha512-rSWxx0KscYfxU02wEskKXES9lkRzuuONMMNkZ7SUc6uiF3tDKm7e+sE0Ax/SBlG4TUf1sp1R6f3/SlsPGmzthg==
- dependencies:
- postcss "^8.5.3"
- postcss-sorting "^9.1.0"
-
-stylelint-scss@6.12.1, stylelint-scss@^6.12.1:
- version "6.12.1"
- resolved "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz"
- integrity sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==
- dependencies:
- css-tree "^3.0.1"
- is-plain-object "^5.0.0"
- known-css-properties "^0.36.0"
- mdn-data "^2.21.0"
- postcss-media-query-parser "^0.2.3"
- postcss-resolve-nested-selector "^0.1.6"
- postcss-selector-parser "^7.1.0"
- postcss-value-parser "^4.2.0"
-
-stylelint@16.24.0:
- version "16.24.0"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.24.0.tgz#a436920636732b496a55665997f2804d1d63b5b6"
- integrity sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==
- dependencies:
- "@csstools/css-parser-algorithms" "^3.0.5"
- "@csstools/css-tokenizer" "^3.0.4"
- "@csstools/media-query-list-parser" "^4.0.3"
- "@csstools/selector-specificity" "^5.0.0"
- "@dual-bundle/import-meta-resolve" "^4.1.0"
- balanced-match "^2.0.0"
- colord "^2.9.3"
- cosmiconfig "^9.0.0"
- css-functions-list "^3.2.3"
- css-tree "^3.1.0"
- debug "^4.4.1"
- fast-glob "^3.3.3"
- fastest-levenshtein "^1.0.16"
- file-entry-cache "^10.1.4"
- global-modules "^2.0.0"
- globby "^11.1.0"
- globjoin "^0.1.4"
- html-tags "^3.3.1"
- ignore "^7.0.5"
- imurmurhash "^0.1.4"
- is-plain-object "^5.0.0"
- known-css-properties "^0.37.0"
- mathml-tag-names "^2.1.3"
- meow "^13.2.0"
- micromatch "^4.0.8"
- normalize-path "^3.0.0"
- picocolors "^1.1.1"
- postcss "^8.5.6"
- postcss-resolve-nested-selector "^0.1.6"
- postcss-safe-parser "^7.0.1"
- postcss-selector-parser "^7.1.0"
- postcss-value-parser "^4.2.0"
- resolve-from "^5.0.0"
- string-width "^4.2.3"
- supports-hyperlinks "^3.2.0"
- svg-tags "^1.0.0"
- table "^6.9.0"
- write-file-atomic "^5.0.1"
-
-supports-color@^5.3.0:
- version "5.5.0"
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
- integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@^7.0.0:
- version "7.2.0"
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
- integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
- dependencies:
- has-flag "^4.0.0"
-
-supports-hyperlinks@^3.2.0:
- version "3.2.0"
- resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz"
- integrity sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==
- dependencies:
- has-flag "^4.0.0"
- supports-color "^7.0.0"
-
-svg-tags@^1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz"
- integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
-
-table@^6.9.0:
- version "6.9.0"
- resolved "https://registry.npmjs.org/table/-/table-6.9.0.tgz"
- integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==
- dependencies:
- ajv "^8.0.1"
- lodash.truncate "^4.4.2"
- slice-ansi "^4.0.0"
- string-width "^4.2.3"
- strip-ansi "^6.0.1"
-
-to-regex-range@^5.0.1:
- version "5.0.1"
- resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
- integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
- dependencies:
- is-number "^7.0.0"
-
-uri-js@^4.2.2:
- version "4.2.2"
- resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz"
- integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
- dependencies:
- punycode "^2.1.0"
-
-util-deprecate@^1.0.2:
- version "1.0.2"
- resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
- integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-
-which@^1.3.1:
- version "1.3.1"
- resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
- dependencies:
- isexe "^2.0.0"
-
-write-file-atomic@^5.0.1:
- version "5.0.1"
- resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz"
- integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==
- dependencies:
- imurmurhash "^0.1.4"
- signal-exit "^4.0.1"