diff --git a/.cursor/rules/read-copilot-instructions.mdc b/.cursor/rules/read-copilot-instructions.mdc new file mode 100644 index 00000000..fdbbd686 --- /dev/null +++ b/.cursor/rules/read-copilot-instructions.mdc @@ -0,0 +1,12 @@ +--- +description: Read and follow .github/copilot-instructions.md for this repo +alwaysApply: true +--- + +Before assisting, open and read `.github/copilot-instructions.md`. +Follow it as the authoritative source for coding practices, docs style, security, and compliance for this project. + +If the file is missing, say so, ask to create it, and proceed with safe defaults. +When “Copilot” is mentioned in that file, interpret it as referring to **you (Cursor)**. +Summarize the relevant sections into your working context before you act. + diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 31d56467..83773214 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -8,11 +8,7 @@ "postStartCommand": "make serve", "customizations": { "vscode": { - "extensions": [ - "sissel.shopify-liquid", - "esbenp.prettier-vscode", - "ms-vscode.makefile-tools" - ] + "extensions": ["esbenp.prettier-vscode", "ms-vscode.makefile-tools"] } } } diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..15aa810d --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,88 @@ +# html2rss.github.io – Copilot Instructions + +# Role and Objective + +You are an Expert in modern web development, Astro, and Starlight documentation. +You are focused on creating accessible, fast, and maintainable documentation websites. +You are documenting the [html2rss project](https://github.com/html2rss/) and its components. +You are tasked to ensure high-quality, user-friendly documentation that helps users understand and utilize html2rss effectively. This is not limited to just writing content, but also includes structuring, and UX-optimizing the site. + +## Purpose + +Build and maintain the html2rss documentation website using Astro and Starlight. +Create comprehensive, user-friendly documentation that showcases html2rss capabilities. + +## Core Stack + +- **Astro** – static site generator +- **Starlight** – documentation framework for Astro +- **TypeScript** – type safety +- **MDX** – enhanced markdown with components + +## Architecture + +- **Content** – MDX files in `src/content/docs/` +- **Components** – reusable UI components in `src/components/` +- **Pages** – custom pages in `src/pages/` +- **Styling** – CSS modules or Tailwind +- **Assets** – images, icons in `public/` + +## Coding Rules + +- Target modern browsers (ES2020+) +- Use TypeScript for all `.ts` files +- Prefer functional components +- Use semantic HTML +- Follow accessibility guidelines (WCAG 2.1) +- Optimize for Core Web Vitals +- Use Astro's built-in optimizations + +## Content Rules + +- Write clear, concise documentation, which a human who is not fully-fluent in "Technology" can understand and work with. +- Use active voice +- Include code examples +- Add interactive demos where helpful +- Keep navigation logical +- Use consistent terminology +- Ensure the Site Navigation is assembled in a logical and user-friendly manner. +- Prevent adding (and remove existing) "technical clutter" content. +- follow AIDA-model to craft ensure content is engaging and SEO-friendly + +## Performance & SEO + +- Optimize images (WebP, proper sizing) +- Use Astro's built-in lazy loading +- Implement proper meta tags +- Ensure fast page loads +- Use semantic HTML structure +- Add structured data where appropriate + +## Do ✅ + +- Follow Astro best practices +- Use Starlight's built-in features +- Write accessible content +- Test on multiple devices +- Optimize for search engines +- Keep dependencies updated + +## Don't ❌ + +- Don't add unnecessary JavaScript +- Don't ignore accessibility +- Don't use outdated patterns +- Don't skip mobile optimization +- Don't overcomplicate navigation + +## Workflow + +1. Read existing content patterns +2. Code → test locally with `npm run dev` +3. Build → verify with `npm run build` +4. Deploy → ensure all pages work + +## AI Reference + +- [Astro Documentation](https://docs.astro.build/) +- [Starlight Documentation](https://starlight.astro.build/) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index dfd1c521..09f40c47 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -18,24 +18,29 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + cache: "npm" + - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: 3.4 bundler-cache: true + - name: Install dependencies + run: npm ci + - name: Build the site - env: - JEKYLL_ENV: production - run: | - ./bin/data-update - bundle exec jekyll build + run: npm run build:full - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: _site - path: _site + name: dist + path: dist deploy: runs-on: ubuntu-latest @@ -49,14 +54,14 @@ jobs: - name: Download artifact uses: actions/download-artifact@v4 with: - name: _site - path: _site + name: dist + path: dist - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./_site + publish_dir: ./dist publish_branch: master force_orphan: true user_name: "github-actions[bot]" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 06e512b0..ebed3256 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -19,10 +19,10 @@ jobs: uses: actions/setup-node@v4 with: node-version: "24" - cache: "yarn" + cache: "npm" - name: Install dependencies - run: yarn install --frozen-lockfile + run: npm ci - name: Run linters - run: yarn lint + run: make lint diff --git a/.gitignore b/.gitignore index 3fda8a10..6240da8b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,21 @@ -_data/configs.yml -_site -.jekyll-cache -.jekyll-metadata -.sass-cache -node_modules +# build output +dist/ +# generated types +.astro/ + +# dependencies node_modules/ -vendor + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/.prettierignore b/.prettierignore index 12024b60..31f5f67f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,3 @@ _site node_modules -yarn.lock +package-lock.json diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index f3bcd4c9..00000000 --- a/.prettierrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": false, - "trailingComma": "all" -} diff --git a/.stylelintrc.json b/.stylelintrc.json deleted file mode 100644 index 2fdfa307..00000000 --- a/.stylelintrc.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "extends": [ - "stylelint-config-recommended", - "stylelint-config-recommended-scss", - "stylelint-config-recess-order" - ], - "rules": { - "no-descending-specificity": null, - "declaration-block-single-line-max-declarations": 1, - "media-feature-name-no-unknown": [ - true, - { - "ignoreMediaFeatureNames": ["prefers-color-scheme"] - } - ], - "property-no-unknown": [ - true, - { - "ignoreProperties": ["system", "symbols", "suffix"] - } - ], - "font-family-no-missing-generic-family-keyword": null, - "selector-type-no-unknown": [ - true, - { - "ignore": ["custom-elements", "default-namespace"], - "ignoreNamespaces": ["---", "@font-face"] - } - ] - }, - "ignoreFiles": [ - "assets/css/sass/syntax-highlighting.scss", - "assets/css/main.scss" - ] -} diff --git a/404.html b/404.html deleted file mode 100644 index ad24f2b7..00000000 --- a/404.html +++ /dev/null @@ -1,41 +0,0 @@ ---- -permalink: /404.html -layout: default ---- - -

404 - Page Not Found

- -

Sorry, the page you're looking for doesn't exist.

- -

Here are some helpful links to get you back on track:

- - - -

- If you think this is an error, please - report it on GitHub. -

diff --git a/Gemfile b/Gemfile index 78156f51..56e0f1b4 100644 --- a/Gemfile +++ b/Gemfile @@ -2,29 +2,5 @@ source 'https://rubygems.org' -gem 'jekyll', '~> 4.4' -gem 'just-the-docs' - gem 'html2rss', git: 'https://github.com/html2rss/html2rss.git' gem 'html2rss-configs', git: 'https://github.com/html2rss/html2rss-configs.git' - -group :jekyll_plugins do - gem 'jekyll-feed', '~> 0.17' - gem 'jekyll-loading-lazy' - gem 'jekyll-sitemap' - gem 'jekyll-target-blank' -end - -# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem -# and associated library. -platforms :mingw, :x64_mingw, :mswin, :jruby do - gem 'tzinfo', '~> 2.0' - gem 'tzinfo-data' -end - -# Performance-booster for watching directories on Windows -gem 'wdm', '~> 0.1.1', platforms: %i[mingw x64_mingw mswin] - -group :development do - gem 'rubocop', '~> 1.80' -end diff --git a/Gemfile.lock b/Gemfile.lock index 551d14b2..b128db9c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -32,13 +32,10 @@ GEM specs: addressable (2.8.7) public_suffix (>= 2.0.2, < 7.0) - ast (2.4.3) base64 (0.3.0) bigdecimal (3.2.3) - colorator (1.1.0) concurrent-ruby (1.3.5) crass (1.0.6) - csv (3.3.5) dry-configurable (1.3.0) dry-core (~> 1.1) zeitwerk (~> 2.6) @@ -74,10 +71,6 @@ GEM dry-initializer (~> 3.2) dry-schema (~> 1.14) zeitwerk (~> 2.6) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - eventmachine (1.2.7) faraday (2.13.4) faraday-net_http (>= 2.0, < 3.5) json @@ -86,147 +79,40 @@ GEM faraday (>= 1, < 3) faraday-net_http (3.4.1) net-http (>= 0.5.0) - ffi (1.17.2-aarch64-linux-gnu) - ffi (1.17.2-arm64-darwin) - ffi (1.17.2-x86_64-linux-gnu) - forwardable-extended (2.6.0) - google-protobuf (4.32.1-aarch64-linux-gnu) - bigdecimal - rake (>= 13) - google-protobuf (4.32.1-arm64-darwin) - bigdecimal - rake (>= 13) - google-protobuf (4.32.1-x86_64-linux-gnu) - bigdecimal - rake (>= 13) - http_parser.rb (0.8.0) - i18n (1.14.7) - concurrent-ruby (~> 1.0) - jekyll (4.4.1) - addressable (~> 2.4) - base64 (~> 0.2) - colorator (~> 1.0) - csv (~> 3.0) - em-websocket (~> 0.5) - i18n (~> 1.0) - jekyll-sass-converter (>= 2.0, < 4.0) - jekyll-watch (~> 2.0) - json (~> 2.6) - kramdown (~> 2.3, >= 2.3.1) - kramdown-parser-gfm (~> 1.0) - liquid (~> 4.0) - mercenary (~> 0.3, >= 0.3.6) - pathutil (~> 0.9) - rouge (>= 3.0, < 5.0) - safe_yaml (~> 1.0) - terminal-table (>= 1.8, < 4.0) - webrick (~> 1.7) - jekyll-feed (0.17.0) - jekyll (>= 3.7, < 5.0) - jekyll-include-cache (0.2.1) - jekyll (>= 3.7, < 5.0) - jekyll-loading-lazy (0.1.1) - jekyll (>= 3.0, < 5.0) - nokogiri (>= 1.10, < 2.0) - jekyll-sass-converter (3.1.0) - sass-embedded (~> 1.75) - jekyll-seo-tag (2.8.0) - jekyll (>= 3.8, < 5.0) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-target-blank (2.0.2) - jekyll (>= 3.0, < 5.0) - nokogiri (~> 1.10) - jekyll-watch (2.2.1) - listen (~> 3.0) json (2.13.2) - just-the-docs (0.10.1) - jekyll (>= 3.8.5) - jekyll-include-cache - jekyll-seo-tag (>= 2.0) - rake (>= 12.3.1) kramdown (2.5.1) rexml (>= 3.3.9) - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - language_server-protocol (3.17.0.5) - lint_roller (1.1.0) - liquid (4.0.4) - listen (3.9.0) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) logger (1.7.0) - mercenary (0.4.0) mime-types (3.7.0) logger mime-types-data (~> 3.2025, >= 3.2025.0507) - mime-types-data (3.2025.0909) + mime-types-data (3.2025.0916) net-http (0.6.0) uri - nokogiri (1.18.10-aarch64-linux-gnu) - racc (~> 1.4) nokogiri (1.18.10-arm64-darwin) racc (~> 1.4) nokogiri (1.18.10-x86_64-linux-gnu) racc (~> 1.4) parallel (1.27.0) - parser (3.3.9.0) - ast (~> 2.4.1) - racc - pathutil (0.16.2) - forwardable-extended (~> 2.6) - prism (1.5.1) public_suffix (6.0.2) puppeteer-ruby (0.45.6) concurrent-ruby (>= 1.1, < 1.4) mime-types (>= 3.0) websocket-driver (>= 0.6.0) racc (1.8.1) - rainbow (3.1.1) - rake (13.3.0) - rb-fsevent (0.11.2) - rb-inotify (0.11.1) - ffi (~> 1.0) - regexp_parser (2.11.2) + regexp_parser (2.11.3) reverse_markdown (3.0.0) nokogiri rexml (3.4.4) - rouge (4.6.0) rss (0.3.1) rexml - rubocop (1.80.2) - json (~> 2.3) - language_server-protocol (~> 3.17.0.2) - lint_roller (~> 1.1.0) - parallel (~> 1.10) - parser (>= 3.3.0.2) - rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.46.0, < 2.0) - ruby-progressbar (~> 1.7) - unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.46.0) - parser (>= 3.3.7.2) - prism (~> 1.4) - ruby-progressbar (1.13.0) - safe_yaml (1.0.5) sanitize (7.0.0) crass (~> 1.0.2) nokogiri (>= 1.16.8) - sass-embedded (1.92.1-aarch64-linux-gnu) - google-protobuf (~> 4.31) - sass-embedded (1.92.1-arm64-darwin) - google-protobuf (~> 4.31) - sass-embedded (1.92.1-x86_64-linux-gnu) - google-protobuf (~> 4.31) - terminal-table (3.0.2) - unicode-display_width (>= 1.1.1, < 3) thor (1.4.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - unicode-display_width (2.6.0) uri (1.0.3) - webrick (1.9.1) websocket-driver (0.8.0) base64 websocket-extensions (>= 0.1.0) @@ -234,24 +120,12 @@ GEM zeitwerk (2.7.3) PLATFORMS - aarch64-linux - arm64-darwin-23 arm64-darwin-24 x86_64-linux DEPENDENCIES html2rss! html2rss-configs! - jekyll (~> 4.4) - jekyll-feed (~> 0.17) - jekyll-loading-lazy - jekyll-sitemap - jekyll-target-blank - just-the-docs - rubocop (~> 1.80) - tzinfo (~> 2.0) - tzinfo-data - wdm (~> 0.1.1) BUNDLED WITH - 2.5.17 + 2.7.1 diff --git a/Makefile b/Makefile index 595a0c63..f809ba7c 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,27 @@ -default: setup clean lintfix serve +default: setup clean lintfix dev setup: - yarn check || yarn + npm ci bundle check || bundle make update -lint: - yarn lint - make lint-ruby +dev: + npm run dev -lintfix: - yarn lintfix - make lintfix-ruby +build: + npm run build -lint-ruby: - bundle exec rubocop +preview: + npm run preview -lintfix-ruby: - bundle exec rubocop -a +build-full: + npm run build:full + +lint: + npm run lint + +lintfix: + npm run lintfix clean: find . -type d -empty -delete @@ -26,6 +30,3 @@ clean: update: bundle update html2rss-configs bin/data-update - -serve: setup - bundle exec jekyll s --drafts --trace diff --git a/README.md b/README.md index a4dbd361..044845b4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,39 @@ # html2rss.github.io -This repository hosts the documentation and website for `html2rss`, a tool for creating RSS feeds from any website. +This repository hosts the documentation and website for `html2rss`, a tool for creating RSS feeds from any +website. + +## 🚀 Getting Started (Developers) + +### Prerequisites + +- Node.js (for Astro) +- Ruby (for data updates) + +### Quick Setup + +```bash +# Install dependencies and start development server +make setup +``` + +### 💻 Try in Browser + +You can develop html2rss directly in your browser using GitHub Codespaces: + +[Open in GitHub Codespaces](https://github.com/codespaces/new?repo=html2rss/html2rss) + +The Codespace provides a cloud development environment with Node.js and Ruby pre-installed. Run `make setup` to install dependencies and get started! + +### Available Commands + +- `make setup` - Install dependencies and start dev server +- `make dev` - Start Astro development server +- `make build` - Build for production +- `make preview` - Preview production build +- `make build-full` - Update data and build for production +- `make lintfix` - Fix code formatting +- `make update` - Update feed data ## 🌐 Community & Resources @@ -20,4 +53,5 @@ This repository hosts the documentation and website for `html2rss`, a tool for c ## Contributing -Contributions are welcome! See our [Get Involved page](https://html2rss.github.io/get-involved) for details on discussions, reporting issues, and contributing. +Contributions are welcome! See our [Get Involved page](https://html2rss.github.io/get-involved) for details on +discussions, reporting issues, and contributing. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 2b4b1444..00000000 --- a/_config.yml +++ /dev/null @@ -1,67 +0,0 @@ -# Required changes -# - the subpath of your site, e.g. /blog -baseurl: "/" -# - the base hostname & protocol for your site, e.g. http://example.com -url: "https://html2rss.github.io" - -permalink: /blog/:year/:title - -title: html2rss - -description: | - html2rss brings back RSS. It's an open source project with decentralised - instances. These instances generate RSS feeds for websites which do not offer - them. - -github_username: "html2rss" - -theme: just-the-docs -color_scheme: dark - -logo: assets/images/logo.png - -aux_links: - "GitHub": - - "https://github.com/html2rss" - -# Footer "Edit this page on GitHub" link text -gh_edit_link: true # show or hide edit this page link -gh_edit_link_text: "Edit this page on GitHub." -gh_edit_repository: "https://github.com/html2rss/html2rss.github.io" # the github URL for your repo -gh_edit_branch: "main" # the branch that your docs is served from -gh_edit_view_mode: "tree" - -sass: - style: compressed - sass_dir: assets/css/sass - -plugins: - - jekyll-feed - - jekyll-loading-lazy - - jekyll-sitemap - - jekyll-target-blank - -exclude: - - .git/ - - .github/ - - .gitignore - - .jekyll-cache/ - - .nvmrc - - .rubocop.yml - - .ruby-version - - .sass-cache/ - - .stylelintrc.json - - bin/ - - Gemfile - - Gemfile.lock - - gemfiles/ - - Makefile - - node_modules/ - - package.json - - vendor - - vendor/bundle/ - - vendor/cache/ - - vendor/gems/ - - vendor/ruby/ - - yarn.error - - yarn.lock diff --git a/_data/.keep b/_data/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/_includes/head_custom.html b/_includes/head_custom.html deleted file mode 100644 index 1972ed66..00000000 --- a/_includes/head_custom.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
diff --git a/assets/css/main.scss b/assets/css/main.scss deleted file mode 100644 index c76854d5..00000000 --- a/assets/css/main.scss +++ /dev/null @@ -1,13 +0,0 @@ ---- ---- - -// You need to include this stylesheet in your pages manually with: -// -// -// -// @import files directly from the sass/ directory:; - -@import "base"; -@import "feed-directory"; -// Don't write any SCSS in this file as stylelint does not fix it, -// just use the sass directory. diff --git a/assets/css/sass/base.scss b/assets/css/sass/base.scss deleted file mode 100644 index 9c95075f..00000000 --- a/assets/css/sass/base.scss +++ /dev/null @@ -1,47 +0,0 @@ -:root { - --color-text: inherit; - --color-accent: rgba(0, 128, 0, 0.5); - --color-accent-bg: rgba(0, 128, 0, 0.15); - --color-error: #f00; - --color-error-bg: #fff0f0; - --font-family-mono: monospace; - --font-size-base: 1rem; - --line-height-base: 1.5; - --spacing-xs: 0.25rem; - --spacing-sm: 0.5rem; - --button-padding-y: 0.4em; - --button-padding-x: 0.75em; - --border-radius-sm: 0.25em; - --transition-border: border-color 0.2s linear; - --transition-shadow: box-shadow 0.2s ease-in-out; -} - -details { - transition: all 0.2s ease-in-out; -} - -summary { - cursor: pointer; - outline: none; -} - -summary:hover { - color: var(--link-color); -} - -#configs input[name="instance"], -#configs input[name="search"] { - inline-size: 100%; -} - -.noscript { - padding: var(--spacing-sm); - font-weight: 600; - color: var(--color-error); - background: var(--color-error-bg); - border: 1px solid var(--color-error); -} - -.svg-defs-hidden { - display: none; -} diff --git a/assets/css/sass/feed-directory.scss b/assets/css/sass/feed-directory.scss deleted file mode 100644 index 855fa400..00000000 --- a/assets/css/sass/feed-directory.scss +++ /dev/null @@ -1,193 +0,0 @@ -.feed-directory__filters { - position: sticky; - top: 0; - height: fit-content; - z-index: 2; - - border: 1px solid var(--border-color); - border-radius: var(--border-radius); - margin-bottom: var(--spacing-lg); - display: flex; - flex-wrap: wrap; - gap: var(--spacing-lg); - align-items: flex-start; -} - -.feed-directory__item { - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: var(--spacing-sm); - - padding: var(--spacing-sm); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); - margin-bottom: 1px; /* Minimal gap between items */ - - transition: var(--transition-base); - background-color: var(--color-bg); -} - -.feed-directory__item:hover { - box-shadow: var(--box-shadow); -} - -.feed-directory__item-info { - display: flex; - flex-direction: column; - flex: 1; - gap: var(--spacing-xs); - margin-inline-end: var(--spacing-sm); -} - -.feed-directory__item-main { - display: flex; - justify-content: space-between; - align-items: center; - gap: var(--spacing-sm); - min-height: 2rem; /* Compact height for list feel */ -} - -h3.feed-directory__item-name { - font-size: var(--font-size-h4); - font-weight: var(--font-weight-bold); - color: var(--color-text); - margin: 0; - padding: 0; - flex: 1; - min-width: 0; /* Allow text to wrap */ - line-height: 1.4; -} - -.feed-directory__item-param-toggle { - display: flex; - align-items: center; - gap: var(--spacing-xs); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-normal); - color: var(--color-text-light); - background-color: var(--code-block-bg-color); - padding: var(--spacing-xs) var(--spacing-sm); - border-radius: var(--border-radius-sm); - border: 1px solid var(--border-color); - white-space: nowrap; - cursor: pointer; - transition: var(--transition-base); - flex-shrink: 0; -} - -.feed-directory__item-param-toggle:hover { - background-color: var(--border-color); - color: var(--color-text); -} - -.feed-directory__param-icon { - width: 14px; - height: 14px; - flex-shrink: 0; -} - -.feed-directory__item-url { - font-size: var(--font-size-sm); - color: var(--color-text-light); - word-break: break-word; - margin: 0; -} - -.feed-directory__item-param-form__buttons { - display: flex; - justify-content: flex-end; -} - -.feed-directory__item-actions { - display: flex; - align-items: center; - gap: var(--spacing-sm); - flex-shrink: 0; -} - -.feed-directory__item-actions button { - background-color: unset; - border: 1px; - text-align: center; - padding: 0; - cursor: pointer; -} - -.feed-directory__item-actions__rss-icon, -.feed-directory__item-actions__edit-icon, -.feed-directory__item-actions__settings-icon { - inline-size: 1.2rem; - block-size: 1.2rem; -} - -.feed-directory__item-actions__rss-icon:hover, -.feed-directory__item-actions__edit-icon:hover, -.feed-directory__item-actions__settings-icon:hover { - color: var(--link-color); -} - -.feed-directory__fieldset { - border: none; - padding: 0; - flex: 1 1 45%; - min-width: 280px; - margin-bottom: 0; -} - -.feed-directory__fieldset legend { - padding: 0 var(--spacing-xs); - margin-bottom: var(--spacing-sm); -} - -.feed-directory__item-param-form { - margin-top: var(--spacing-xs); - padding: var(--spacing-xs); - border-top: 1px solid var(--border-color); - background-color: var(--code-block-bg-color); - border-radius: var(--border-radius-sm); - animation: slideDown 0.2s ease-out; -} - -@keyframes slideDown { - from { - opacity: 0; - transform: translateY(-10px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.feed-directory__item-param-form__group { - margin-block-end: var(--spacing-xs); - display: flex; - align-items: center; - gap: var(--spacing-sm); -} - -.feed-directory__item-param-form__label { - font-size: 0.85em; - font-weight: var(--font-weight-normal); - color: var(--color-text); - flex-shrink: 0; - min-width: 80px; -} - -.feed-directory__item-param-form__input { - inline-size: 100%; - padding: var(--spacing-xs) var(--spacing-sm); - border: 1px solid var(--border-color); - border-radius: var(--border-radius-sm); - color: var(--color-text); -} - -.feed-directory__item-param-form__code { - font-size: var(--font-size-sm); - padding: var(--spacing-xs) var(--spacing-sm); - border-radius: var(--border-radius-sm); - background-color: var(--code-block-bg-color); - color: var(--code-block-color); - word-break: break-all; -} diff --git a/assets/images/site.webmanifest b/assets/images/site.webmanifest index 0c8e62dd..5f134d03 100644 --- a/assets/images/site.webmanifest +++ b/assets/images/site.webmanifest @@ -1,6 +1,9 @@ { - "name": "", - "short_name": "", + "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", diff --git a/assets/js/.keep b/assets/js/.keep deleted file mode 100644 index 19cfab25..00000000 --- a/assets/js/.keep +++ /dev/null @@ -1 +0,0 @@ -add files to this dir diff --git a/assets/js/feed-directory/index.js b/assets/js/feed-directory/index.js deleted file mode 100644 index 6f944786..00000000 --- a/assets/js/feed-directory/index.js +++ /dev/null @@ -1,124 +0,0 @@ -document.addEventListener("alpine:init", () => { - Alpine.data("feedDirectory", () => ({ - instanceUrl: atob("aHR0cHM6Ly8xLmgyci53b3JrZXJzLmRldi8="), - searchQuery: "", - configs: window.feedDirectoryData, - - fuzzyMatch(text, query) { - 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; - }, - - filterConfig(configName) { - if (!this.searchQuery) { - return true; - } - return this.fuzzyMatch(configName, this.searchQuery); - }, - - getFeedUrl(config, params = {}) { - let url = this.instanceUrl.endsWith("/") - ? this.instanceUrl - : `${this.instanceUrl}/`; - url += `${config.domain}/${config.name}.rss`; - - const queryParams = new URLSearchParams(); - - if (config.url_parameters) { - for (const key of Object.keys(config.url_parameters)) { - if (params[key]) { - queryParams.append(key, params[key]); - } - } - } - - const queryString = queryParams.toString(); - if (queryString) { - url += `?${queryString}`; - } - - return url; - }, - })); - - Alpine.data("feedItemData", (index) => ({ - config: window.feedDirectoryData[index], - params: {}, - pathPreview: "", - showParamsForm: false, - toggleParamsForm() { - this.showParamsForm = !this.showParamsForm; - }, - dynamicParamsInterpolate(string, params) { - return string.replace(/%<(\w+)>s/g, (_, key) => { - if (!(key in params)) { - throw new Error(`Missing value for placeholder: ${key}`); - } - return params[key]; - }); - }, - - initializeDefaultParameters() { - Object.entries(this.config.url_parameters).forEach(([key, fallback]) => { - const inputId = `${this.config.domain}-${this.config.name}-${key}`; - const input = document.getElementById(inputId); - - if (input && this.config.default_parameters[key]) { - // Set the actual value in the input field - input.value = this.config.default_parameters[key]; - // Also set placeholder as fallback - input.placeholder = this.config.default_parameters[key]; - } - }); - - // Now set params with default values (this will trigger the watcher) - this.params = { ...this.config.default_parameters }; - }, - - init() { - if (!this.config) return; - - // Initialize params first - this.params = {}; - - // Set default values in input fields after DOM is ready - if (this.config.default_parameters && !this.config.valid_channel_url) { - this.$nextTick(() => { - this.initializeDefaultParameters(); - }); - } - - if (!this.config.valid_channel_url) { - this.$watch("params", (value) => { - let params = {}; - - Object.entries(this.config.url_parameters).forEach( - ([key, fallback]) => { - const val = value[key]; - params[key] = val || `{${fallback}}`; - }, - ); - - try { - this.pathPreview = this.dynamicParamsInterpolate( - this.config.channel.url, - params, - ); - } catch (error) { - console.error("Error interpolating parameters:", error); - } - }); - } - }, - })); -}); diff --git a/assets/js/main.js b/assets/js/main.js deleted file mode 100644 index 2f7bb21c..00000000 --- a/assets/js/main.js +++ /dev/null @@ -1,14 +0,0 @@ -// You need to include this stylesheet on your pages with: -// -// - -(() => { - document.addEventListener("DOMContentLoaded", () => { - // do stuff - }); -})(); diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 00000000..b473a7fd --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,326 @@ +// @ts-check +import { defineConfig } from "astro/config"; +import starlight from "@astrojs/starlight"; +import sitemap from "@astrojs/sitemap"; + +// https://astro.build/config +export default defineConfig({ + site: "https://html2rss.github.io", + base: "/", + redirects: { + // Only redirect actual old Jekyll URLs that need to be redirected + }, + build: { + inlineStylesheets: "auto", + }, + image: { + domains: ["html2rss.github.io"], + remotePatterns: [ + { + protocol: "https", + hostname: "html2rss.github.io", + }, + ], + }, + vite: { + build: { + rollupOptions: { + output: { + manualChunks: { + vendor: ["@astrojs/starlight"], + }, + }, + }, + }, + }, + integrations: [ + sitemap({ + filter: (page) => { + // Simple path-based exclusion for known noindex pages + return !page.includes("/feed-directory/"); + }, + }), + starlight({ + title: "html2rss", + description: + "html2rss brings back RSS. It's an open source project with decentralised instances. These instances generate RSS feeds for websites which do not offer them.", + logo: { + src: "./src/assets/logo.png", + replacesTitle: true, + alt: "html2rss logo - Turn any website into RSS", + }, + head: [ + { + tag: "meta", + attrs: { + name: "mobile-web-app-capable", + content: "yes", + }, + }, + { + tag: "meta", + attrs: { + name: "apple-mobile-web-app-capable", + content: "yes", + }, + }, + { + tag: "meta", + attrs: { + name: "apple-mobile-web-app-status-bar-style", + content: "black", + }, + }, + { + tag: "meta", + attrs: { + name: "referrer", + content: "no-referrer", + }, + }, + { + tag: "meta", + attrs: { + name: "theme-color", + content: "#111111", + }, + }, + { + tag: "meta", + attrs: { + name: "keywords", + content: + "RSS, feed, web scraping, automation, open source, Ruby, Astro, Starlight, html2rss, RSS generator, website to RSS", + }, + }, + { + tag: "meta", + attrs: { + name: "author", + content: "html2rss team", + }, + }, + { + tag: "meta", + attrs: { + name: "robots", + content: "index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1", + }, + }, + { + tag: "meta", + attrs: { + property: "og:type", + content: "website", + }, + }, + { + tag: "meta", + attrs: { + property: "og:site_name", + content: "html2rss", + }, + }, + { + tag: "meta", + attrs: { + property: "og:locale", + content: "en_US", + }, + }, + { + tag: "link", + attrs: { + rel: "apple-touch-icon", + sizes: "180x180", + href: "/assets/images/apple-touch-icon.png", + }, + }, + { + tag: "link", + attrs: { + rel: "icon", + type: "image/png", + sizes: "32x32", + href: "/assets/images/favicon-32x32.png", + }, + }, + { + tag: "link", + attrs: { + rel: "icon", + type: "image/png", + sizes: "16x16", + href: "/assets/images/favicon-16x16.png", + }, + }, + { + tag: "link", + attrs: { + rel: "manifest", + href: "/assets/images/site.webmanifest", + }, + }, + { + tag: "link", + attrs: { + rel: "mask-icon", + href: "/assets/images/safari-pinned-tab.svg", + color: "#111111", + }, + }, + { + tag: "link", + attrs: { + rel: "shortcut icon", + href: "/assets/images/favicon.ico", + }, + }, + { + tag: "link", + attrs: { + rel: "preload", + href: "/assets/images/logo.png", + as: "image", + type: "image/png", + }, + }, + { + tag: "script", + attrs: { + "data-goatcounter": "https://html2rss.goatcounter.com/count", + async: true, + src: "//gc.zgo.at/count.js", + }, + }, + { + tag: "script", + attrs: { + type: "application/ld+json", + }, + content: JSON.stringify({ + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "html2rss", + description: + "html2rss brings back RSS. It's an open source project with decentralised instances. These instances generate RSS feeds for websites which do not offer them.", + url: "https://html2rss.github.io", + applicationCategory: "DeveloperApplication", + operatingSystem: "Web", + offers: { + "@type": "Offer", + price: "0", + priceCurrency: "USD", + }, + author: { + "@type": "Organization", + name: "html2rss", + url: "https://github.com/html2rss", + }, + license: "https://github.com/html2rss/html2rss/blob/main/LICENSE", + codeRepository: "https://github.com/html2rss/html2rss", + programmingLanguage: "Ruby", + keywords: "RSS, feed, web scraping, automation, open source, Ruby, Astro, Starlight", + featureList: [ + "Create RSS feeds from any website", + "No coding required", + "Open source", + "Decentralized instances", + "Web application interface", + "Ruby gem for developers", + ], + }), + }, + ], + social: [ + { + icon: "github", + label: "GitHub", + href: "https://github.com/html2rss", + }, + ], + editLink: { + baseUrl: "https://github.com/html2rss/html2rss.github.io/edit/main/", + }, + sidebar: [ + { + label: "Home", + link: "/", + }, + { + label: "Common Use Cases", + link: "/common-use-cases", + }, + { + label: "Feed Directory", + link: "/feed-directory/", + }, + { + label: "Web Application", + collapsed: true, + items: [ + "web-application", + "web-application/getting-started", + { + label: "How-to", + autogenerate: { directory: "web-application/how-to" }, + }, + { + label: "Reference", + autogenerate: { directory: "web-application/reference" }, + }, + { + label: "Tutorials", + autogenerate: { directory: "web-application/tutorials" }, + }, + ], + }, + { + label: "Ruby Gem", + collapsed: true, + items: [ + "ruby-gem", + "ruby-gem/installation", + { + label: "How-to", + autogenerate: { directory: "ruby-gem/how-to" }, + }, + { + label: "Reference", + autogenerate: { directory: "ruby-gem/reference" }, + }, + { + label: "Tutorials", + autogenerate: { directory: "ruby-gem/tutorials" }, + }, + ], + }, + { + label: "Write Your Own Feed Configs", + link: "/html2rss-configs", + }, + { + label: "About", + link: "/about", + }, + { + label: "Get Involved", + collapsed: false, + autogenerate: { directory: "get-involved" }, + }, + { + label: "Troubleshooting", + collapsed: true, + autogenerate: { directory: "troubleshooting" }, + }, + ], + defaultLocale: "root", + locales: { + root: { + label: "English", + lang: "en", + }, + }, + }), + ], +}); diff --git a/bin/data-update b/bin/data-update index 74690ab3..8c8e35eb 100755 --- a/bin/data-update +++ b/bin/data-update @@ -9,6 +9,7 @@ require 'html2rss' require 'html2rss/configs' require 'uri' require 'yaml' +require 'json' file_names = Html2rss::Configs.file_names.sort @@ -55,6 +56,9 @@ output = file_names.map do |file_name| } end -config_file = File.join(__dir__, '..', '_data/configs.yml') +config_file = File.join(__dir__, '..', 'src/data/configs.json') FileUtils.touch config_file -File.write(config_file, output.to_yaml) + +json_content = JSON.pretty_generate(output) + +File.write(config_file, json_content) diff --git a/configs.md b/configs.md deleted file mode 100644 index b1cab598..00000000 --- a/configs.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -permalink: /configs/ ---- - - - - - - - -

If you are not redirected automatically, follow this link to the feed directory.

- - diff --git a/feed-directory/index.html b/feed-directory/index.html deleted file mode 100644 index e9fa6165..00000000 --- a/feed-directory/index.html +++ /dev/null @@ -1,235 +0,0 @@ ---- -layout: default -title: Feed Directory -nav_order: 2 -noindex: true -has_children: true ---- - -
-

Welcome to the Feed Directory!

-

- 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!) - -

- Find more public instances on the - - community-run wiki. -

-
- -
- - - - - -
-
-
- Instance URL - -
- -
- Search - -
-
-
- {% for config in site.data.configs %} -
-
- {% if config.channel.url %} -
-

- {% if config.valid_channel_url %} - - {{ config.channel.url | escape }} - - {% else %} - {{ config.channel.url | escape }} - - {% endif %} -

- {% unless config.valid_channel_url %} - - {% endunless %} -
- {% endif %} {% unless config.valid_channel_url %} -
-
- {% for param in config.url_parameters %} -
- - -
- {% endfor %} -
- -
-
-
- {% endunless %} -
- -
- {% if config.valid_channel_url %} - - - - - - {% else %} - - - - - - {% endif %} - - - - - -
-
- {% endfor %} -
-
- -
- -
-

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 - -
- - - diff --git a/get-involved/index.md b/get-involved/index.md deleted file mode 100644 index fae6ba28..00000000 --- a/get-involved/index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -title: Get Involved -nav_order: 5 -has_children: true ---- - -# Get Involved - -- [**Sponsoring**]({{ '/get-involved/sponsoring' | relative_url }}) - -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' | relative_url }}): Report bugs or propose features. -- [**Join Community Discussions**]({{ '/get-involved/discussions' | relative_url }}): Connect with users and contributors. -- [**Contribute to html2rss**]({{ '/get-involved/contributing' | relative_url }}): Contribute code, documentation, or feed configurations. diff --git a/html2rss-configs/index.md b/html2rss-configs/index.md deleted file mode 100644 index afb265b5..00000000 --- a/html2rss-configs/index.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -layout: default -title: html2rss-configs -has_children: false -nav_order: 5 ---- - -# Creating Custom RSS Feeds - -Want to create RSS feeds for websites that don't offer them? This guide shows you how to write simple configuration files that tell the html2rss engine exactly what content to extract. - -**Don't worry if you're not technical** - we'll explain everything step by step! - -You can see examples of what others have created in the [Feed Directory]({{ '/feed-directory/' | relative_url }}). - ---- - -## How It Works - -Think of the html2rss engine as a smart assistant that needs instructions. You give it a simple "recipe" (called a config file) that tells it: - -1. **Which website** to look at -2. **What content** to find (articles, posts, etc.) -3. **How to organize** that content into an RSS feed - -The recipe is written in YAML - a simple format that's easy to read and write. Both html2rss-web and the html2rss Ruby gem use these same configuration files. - -### The `channel` Block - -This tells the html2rss engine 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" -``` - -This says: "Find each article, get the title from the h2 link, and get the link from the same h2 link" - -**Need more details?** Check our [complete guide to selectors]({{ '/ruby-gem/reference/selectors/' | relative_url }}) for all the options. - ---- - -## Tutorial: Your First Feed - -Let's create a simple RSS feed step by step. We'll use a basic blog as our example. - -### Step 1: Look at the Website - -First, visit the website you want to create a feed for. Right-click and "View Page Source" to see the HTML structure. Look for patterns like this: - -```html -
-
-

First Post

-

This is the summary of the first post.

-
-
-

Second Post

-

This is the summary of the second post.

-
-
-``` - -**What we see:** Each article is wrapped in `
`, titles are in `

` 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 +})); +--- + +

+ +
+ + + + + +
+ +
+ { + staticFeedUrls.map((config, index) => ( +
+
+ + +
+ {!config.valid_channel_url && Object.keys(config.url_parameters || {}).length > 0 ? ( + + ) : ( +
+ )} + + + + RSS + + + + + 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 [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](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: -![A screenshot showing the Keyword Monitor: a name, the instance's URL to /health_check.txt, and an interval.](docs/uptimerobot_monitor.jpg) +![A screenshot showing the Keyword Monitor: a name, the instance's URL to /health_check.txt, and an interval.](/assets/images/uptimerobot_monitor.jpg) ## 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 logo](https://github.com/html2rss/html2rss/raw/master/support/logo.png) - -# 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: - -![A screenshot showing the Keyword Monitor: a name, the instance's URL to /health_check.txt, and an interval.](docs/uptimerobot_monitor.jpg) - -### 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"