├── src ├── s6 │ ├── nginx │ │ └── run │ ├── update-daemon │ │ └── run │ └── php-fpm │ │ └── run ├── local-overrides.js ├── ttrss.nginx.conf ├── wait-for.sh └── initialize.php ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── 04_feature_request_zh.yml │ ├── 03_feature_request.yml │ ├── 02_bug_report_zh.yml │ └── 01_bug_report.yml ├── dependabot.yml ├── FUNDING.yml ├── stale.yml ├── issue_template.md └── workflows │ ├── doc-release.yml │ └── build-release.yml ├── .gitignore ├── docs ├── .vitepress │ ├── theme │ │ ├── index.ts │ │ ├── custom.css │ │ └── Layout.vue │ └── config │ │ ├── index.ts │ │ ├── en.ts │ │ ├── shared.ts │ │ └── zh.ts ├── zh │ └── index.md └── index.md ├── .textlintrc ├── .dockerignore ├── .vscode └── settings.json ├── .editorconfig ├── .gitpod.yml ├── docker-compose.dev.yml ├── LICENSE ├── README.md ├── docker-entrypoint.sh ├── package.json ├── .devcontainer ├── docker-compose.yml └── devcontainer.json ├── docker-compose.yml ├── Dockerfile └── pnpm-lock.yaml /src/s6/nginx/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | exec /usr/sbin/nginx 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | docs/.vitepress/cache 3 | docs/.vitepress/dist 4 | -------------------------------------------------------------------------------- /src/s6/update-daemon/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | exec s6-setuidgid nobody php /var/www/update_daemon2.php 4 | -------------------------------------------------------------------------------- /src/s6/php-fpm/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | PHP_SUFFIX=${PHP_SUFFIX:-83} 4 | 5 | exec "/usr/sbin/php-fpm${PHP_SUFFIX}" --nodaemonize 6 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | import DefaultTheme from 'vitepress/theme'; 2 | import Layout from './Layout.vue'; 3 | import './custom.css'; 4 | 5 | export default { 6 | extends: DefaultTheme, 7 | Layout, 8 | } 9 | -------------------------------------------------------------------------------- /.textlintrc: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "ja-space-between-half-and-full-width": { 4 | "space": "always", 5 | "exceptPunctuation": true 6 | }, 7 | "en-capitalization": true 8 | } 9 | } -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .github/ 2 | .vscode/ 3 | node_modules/ 4 | docs/ 5 | pnpm-lock.yaml 6 | package.json 7 | renovate.json 8 | deploy-doc.sh 9 | CNAME 10 | .textlintrc 11 | .gitignore 12 | .dockerignore 13 | _config.yml 14 | Dockerfile 15 | docker-compose.yml 16 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "Feediron", 4 | "Feedly", 5 | "Heroku", 6 | "Reeder", 7 | "TTRSS's", 8 | "freestyler", 9 | "fulltext", 10 | "opencc", 11 | "postgres", 12 | "ttrss" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true 13 | -------------------------------------------------------------------------------- /docs/.vitepress/config/index.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress'; 2 | import { shared } from './shared'; 3 | import { en } from './en'; 4 | import { zh } from './zh'; 5 | 6 | export default defineConfig({ 7 | ...shared, 8 | 9 | locales: { 10 | root: { label: 'English', ...en }, 11 | zh: { label: '中文', ...zh }, 12 | } 13 | }) 14 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: docker 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | - package-ecosystem: github-actions 8 | directory: "/" 9 | schedule: 10 | interval: weekly 11 | - package-ecosystem: npm 12 | directory: "/" 13 | schedule: 14 | interval: weekly 15 | -------------------------------------------------------------------------------- /docs/.vitepress/config/en.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress'; 2 | 3 | export const en = defineConfig({ 4 | lang: 'en-GB', 5 | description: "🐋 A Dockerized powerful all-in-one Tiny Tiny RSS solution.", 6 | 7 | themeConfig: { 8 | nav: [ 9 | { text: 'Home', link: '/' }, 10 | { text: 'Sponsor', link: 'https://opencollective.com/Awesome-TTRSS' } 11 | ], 12 | }, 13 | }) 14 | -------------------------------------------------------------------------------- /src/local-overrides.js: -------------------------------------------------------------------------------- 1 | window.requestIdleCallback = 2 | window.requestIdleCallback || 3 | function(cb) { 4 | var start = Date.now(); 5 | return setTimeout(function() { 6 | cb({ 7 | didTimeout: false, 8 | timeRemaining: function() { 9 | return Math.max(0, 50 - (Date.now() - start)); 10 | }, 11 | }); 12 | }, 1); 13 | }; 14 | 15 | window.cancelIdleCallback = 16 | window.cancelIdleCallback || 17 | function(id) { 18 | clearTimeout(id); 19 | }; 20 | -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | # This configuration file was automatically generated by Gitpod. 2 | # Please adjust to your needs (see https://www.gitpod.io/docs/introduction/learn-gitpod/gitpod-yaml) 3 | # and commit this file to your remote git repository to share the goodness with others. 4 | 5 | # Learn more from ready-to-use templates: https://www.gitpod.io/docs/introduction/getting-started/quickstart 6 | 7 | ports: 8 | - port: 181 9 | onOpen: notify 10 | visibility: public 11 | 12 | tasks: 13 | - init: pnpm install 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/custom.css: -------------------------------------------------------------------------------- 1 | @media (min-width: 1440px) { 2 | .VPDoc:not(.has-sidebar) .container { 3 | max-width: 1284px !important; 4 | } 5 | .VPDoc:not(.has-sidebar) .content { 6 | max-width: 1044px !important; 7 | } 8 | } 9 | 10 | .VPDoc.has-aside .content-container { 11 | max-width: 980px !important; 12 | } 13 | 14 | .aside-container { 15 | width: 316px !important; 16 | } 17 | 18 | img { 19 | margin-top: 0.8rem; 20 | display: inline-block; 21 | } 22 | 23 | .VPNavBarTitle span { 24 | color: #e16723; 25 | } 26 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: HenryQW 4 | patreon: # Replace with a single Patreon username 5 | open_collective: #Awesome-TTRSS 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /docker-compose.dev.yml: -------------------------------------------------------------------------------- 1 | services: 2 | service.rss: 3 | build: 4 | context: . 5 | dockerfile: Dockerfile 6 | container_name: ttrss 7 | ports: 8 | - 181:80 9 | environment: 10 | - SELF_URL_PATH=http://localhost:181 # please change to your own domain 11 | - DB_PASS=ttrss # use the same password defined in `database.postgres` 12 | - PUID=1000 13 | - PGID=1000 14 | stdin_open: true 15 | tty: true 16 | restart: always 17 | 18 | database.postgres: 19 | image: postgres:18-alpine 20 | container_name: postgres 21 | environment: 22 | - POSTGRES_PASSWORD=ttrss # feel free to change the password 23 | restart: always 24 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 14 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | - "help wanted" 10 | # Label to use when marking an issue as stale 11 | staleLabel: wontfix 12 | # Comment to post when marking an issue as stale. Set to `false` to disable 13 | markComment: > 14 | This issue has been automatically marked as stale because it has not had 15 | recent activity in 14 days. It will be closed if no further activity occurs in 7 days. Thank you 16 | for your contributions. 17 | # Comment to post when closing a stale issue. Set to `false` to disable 18 | closeComment: false 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/04_feature_request_zh.yml: -------------------------------------------------------------------------------- 1 | name: ✨ 新需求 2 | description: 为项目提供新点子 3 | title: "[Feature] " 4 | labels: ['enhancement'] 5 | body: 6 | - type: textarea 7 | id: problem-description 8 | attributes: 9 | label: 该功能能够解决的问题 10 | description: 简洁明了地描述该需求能解决的问题。 11 | validations: 12 | required: true 13 | 14 | - type: textarea 15 | id: solution-description 16 | attributes: 17 | label: 形容理想的解决方案 18 | description: 简洁明了地描述所需要的解决方案。 19 | validations: 20 | required: true 21 | 22 | - type: textarea 23 | id: additional-context 24 | attributes: 25 | label: 其他 26 | description: 任何有助于解决方案开发的信息,如:某插件已实现相关功能。 27 | validations: 28 | required: false 29 | 30 | - type: markdown 31 | attributes: 32 | value: | 33 | 感谢您花时间提出新功能建议! 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2015 by Henry 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🐋 Awesome TTRSS 2 | 3 | [![Docker Pulls](https://img.shields.io/docker/pulls/wangqiru/ttrss.svg)](https://hub.docker.com/r/wangqiru/ttrss) 4 | [![Docker Stars](https://img.shields.io/docker/stars/wangqiru/ttrss.svg)](https://hub.docker.com/r/wangqiru/ttrss) 5 | [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FHenryQW%2FAwesome-TTRSS.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FHenryQW%2FAwesome-TTRSS?ref=badge_shield) 6 | 7 | 🐋 Awesome TTRSS aims to provide a powerful **Dockerized all-in-one** solution for [Tiny Tiny RSS](https://github.com/tt-rss/tt-rss), an open source RSS feed reader and aggregator written in PHP, with enhanced user experience via simplified deployment and a list of curated plugins. 8 | 9 | 📖 [Docs](http://ttrss.henry.wang) 10 | 11 | 🐋 Awesome TTRSS 旨在提供一个「容器化」的 [Tiny Tiny RSS](https://github.com/tt-rss/tt-rss)(一款基于 PHP 的免费开源 RSS 聚合阅读器)的一站式解决方案,通过提供简易的部署方式以及一些额外插件,以提升用户体验。 12 | 13 | 📖 [文档](http://ttrss.henry.wang/zh/) 14 | 15 | ## Donation 捐赠 16 | 17 | **Please consider donations to support [TTRSS](https://github.com/tt-rss/tt-rss) instead.** 18 | **请考虑捐助支持 [TTRSS](https://github.com/tt-rss/tt-rss).** 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/03_feature_request.yml: -------------------------------------------------------------------------------- 1 | name: ✨ Feature request 2 | description: Suggest an idea for this project 3 | title: "[Feature] " 4 | labels: ['enhancement'] 5 | body: 6 | - type: textarea 7 | id: problem-description 8 | attributes: 9 | label: Is your feature request related to a problem? Please describe. 10 | description: A clear and concise description of what the problem is. 11 | placeholder: I'm always frustrated when [...] 12 | validations: 13 | required: true 14 | 15 | - type: textarea 16 | id: solution-description 17 | attributes: 18 | label: Describe the solution you'd like 19 | description: A clear and concise description of what you want to happen. 20 | validations: 21 | required: true 22 | 23 | - type: textarea 24 | id: additional-context 25 | attributes: 26 | label: Additional context 27 | description: Add any other context about the feature request here, e.g. The feature is already implemented in someone's repo. 28 | validations: 29 | required: false 30 | 31 | - type: markdown 32 | attributes: 33 | value: | 34 | Thanks for taking the time to suggest a new feature! 35 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | 7 | 8 | - ## _What_ is the issue? 9 | 10 | 11 | 12 | - ## _What_ is your OS and its version? 13 | 14 | 15 | 16 | - ## _What_ is your installation method? 17 | 18 | 19 | 20 | - ### Docker 21 | 22 | - Did you build your own dockerfile (paste it here if possible)? 23 | 24 | - ### Old-fashion way 25 | 26 | - _What_ is your setup? (PHP version, database used, etc.) 27 | 28 | 29 | - ### Others 30 | 31 | - ## _Are_ there any error logs? 32 | 33 | 34 | 35 | - ## _How_ can the issue be replicated? 36 | 37 | 38 | 39 | - ## Other Comments 40 | 41 | 46 | -------------------------------------------------------------------------------- /docs/.vitepress/config/shared.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress'; 2 | import { search as zhSearch } from './zh'; 3 | 4 | // https://vitepress.dev/reference/site-config 5 | export const shared = defineConfig({ 6 | title: "🐋 Awesome TTRSS", 7 | 8 | themeConfig: { 9 | // https://vitepress.dev/reference/default-theme-config 10 | outline: [2, 3], 11 | socialLinks: [ 12 | { icon: 'github', link: 'https://github.com/HenryQW/Awesome-TTRSS' } 13 | ], 14 | editLink: { 15 | pattern: 'https://github.com/HenryQW/Awesome-TTRSS/edit/main/docs/:path' 16 | }, 17 | search: { 18 | provider: 'local', 19 | options: { 20 | detailedView: true, 21 | locales: { 22 | ...zhSearch, 23 | } 24 | } 25 | } 26 | }, 27 | 28 | lastUpdated: true, 29 | 30 | head: [ 31 | ['link', { rel: 'dns-prefetch', href: 'https://share.henry.wang' }], 32 | ['script', { async: '', src: 'https://www.googletagmanager.com/gtag/js?id=G-S0X56ZZMQB' }], 33 | [ 34 | 'script', 35 | {}, 36 | `window.dataLayer = window.dataLayer || []; 37 | function gtag(){dataLayer.push(arguments);} 38 | gtag('js', new Date()); 39 | gtag('config', 'G-S0X56ZZMQB');` 40 | ] 41 | ], 42 | 43 | markdown: { 44 | image: { 45 | lazyLoading: true 46 | } 47 | } 48 | }) 49 | -------------------------------------------------------------------------------- /docs/.vitepress/config/zh.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, type DefaultTheme } from 'vitepress'; 2 | 3 | export const zh = defineConfig({ 4 | lang: "zh-Hans", 5 | description: "🐋 一个「容器化」的 Tiny Tiny RSS 一站式解决方案。", 6 | 7 | themeConfig: { 8 | nav: [ 9 | { text: '首页', link: '/zh/' }, 10 | { text: '赞助', link: 'https://opencollective.com/Awesome-TTRSS' } 11 | ], 12 | editLink: { 13 | pattern: 'https://github.com/HenryQW/Awesome-TTRSS/edit/main/docs/:path', 14 | text: '在 GitHub 上编辑此页面' 15 | }, 16 | outline: { 17 | level: [2, 3], 18 | label: '页面导航' 19 | }, 20 | lastUpdated: { 21 | text: '最后更新于', 22 | }, 23 | }, 24 | }) 25 | 26 | export const search: DefaultTheme.LocalSearchOptions['locales'] = { 27 | zh: { 28 | translations: { 29 | button: { 30 | buttonText: '搜索', 31 | buttonAriaLabel: '搜索' 32 | }, 33 | modal: { 34 | displayDetails: '显示详情', 35 | resetButtonTitle: '重置搜索', 36 | backButtonTitle: '关闭搜索', 37 | noResultsText: '没有结果', 38 | footer: { 39 | selectText: '选择', 40 | selectKeyAriaLabel: '输入', 41 | navigateText: '导航', 42 | navigateUpKeyAriaLabel: '上箭头', 43 | navigateDownKeyAriaLabel: '下箭头', 44 | closeText: '关闭', 45 | closeKeyAriaLabel: 'esc' 46 | } 47 | } 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/ttrss.nginx.conf: -------------------------------------------------------------------------------- 1 | daemon off; 2 | pid /run/nginx.pid; 3 | worker_processes 1; 4 | 5 | events { 6 | worker_connections 1024; 7 | } 8 | 9 | http { 10 | include mime.types; 11 | default_type application/octet-stream; 12 | 13 | sendfile on; 14 | keepalive_timeout 65; 15 | gzip off; 16 | 17 | server { 18 | listen 80; 19 | root /var/www; 20 | 21 | index index.php index.html; 22 | 23 | location ~ /\. { 24 | return 404; 25 | } 26 | 27 | location / { 28 | try_files $uri $uri/ =404; 29 | } 30 | 31 | location ~ \.php$ { 32 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 33 | fastcgi_pass 127.0.0.1:9000; 34 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 35 | fastcgi_index index.php; 36 | include fastcgi_params; 37 | } 38 | location ~ /plugins\.local/.*/api/.*\.php(/|$) { 39 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 40 | set $path_info $fastcgi_path_info; 41 | fastcgi_param PATH_INFO $path_info; 42 | fastcgi_pass 127.0.0.1:9000; 43 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 44 | fastcgi_index index.php; 45 | include fastcgi_params; 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | # reset previously modified UrlHelper.php, in case ALLOW_PORTS is updated 6 | git checkout -- /var/www/classes/UrlHelper.php 7 | 8 | if [ "$ALLOW_PORTS" != "80,443" ]; then 9 | # open ports in the env 10 | ALLOW_PORTS="80, 443, $ALLOW_PORTS, ''" 11 | sed -i -r "s/(80, 443).*?('')/$ALLOW_PORTS/" /var/www/classes/UrlHelper.php 12 | # make custom ports be treated as standard ports (allows private IPs on these ports) 13 | sed -i -r "s/\\\$is_standard_port = .*;/\\\$is_standard_port = in_array(\\\$port, [$ALLOW_PORTS]);/" /var/www/classes/UrlHelper.php 14 | 15 | # modify BL to include ports 16 | # no longer needed after Nov 7,2025 https://github.com/tt-rss/tt-rss/pull/122 17 | # CODE="if (isset(\$parts['port'])) \$tmp .= ':' . \$parts['port']; \n" 18 | # sed -i "/if (isset(\$parts\['path'\]))/i $CODE" /var/www/classes/UrlHelper.php 19 | fi 20 | 21 | if [ "$FEED_LOG_QUIET" != "true" ]; then 22 | sed -i -r "s/--quiet/ /" /etc/s6/update-daemon/run 23 | else 24 | sed -i -r "s/\.php/.php --quiet/" /etc/s6/update-daemon/run 25 | fi 26 | 27 | if [ -n "$DB_USER_FILE" ]; then DB_USER="$(cat $DB_USER_FILE)"; fi 28 | 29 | if [ -n "$DB_PASS_FILE" ]; then DB_PASS="$(cat $DB_PASS_FILE)"; fi 30 | 31 | sh /wait-for.sh $DB_HOST:$DB_PORT -- php /initialize.php && sudo -E -u nobody php /var/www/update.php --update-schema=force-yes && exec s6-svscan /etc/s6/ 32 | 33 | exec "$@" 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docker-ttrss-plugins", 3 | "version": "1.0.0", 4 | "private": true, 5 | "repository": "git@github.com:HenryQW/docker-ttrss-plugins.git", 6 | "license": "MIT", 7 | "author": "Henry ", 8 | "type": "module", 9 | "scripts": { 10 | "docker:build": "docker rm ttrss -f && docker compose -f docker-compose.dev.yml up -d --build && docker logs ttrss -f", 11 | "docker:build:down": "docker compose -f docker-compose.dev.yml down", 12 | "docker:dev": "docker rm ttrss -f && docker compose -f docker-compose.yml up -d && docker logs ttrss -f", 13 | "docker:dev:down": "docker compose -f docker-compose.yml down", 14 | "docs:build": "vitepress build docs", 15 | "docs:dev": "vitepress dev docs", 16 | "docs:preview": "vitepress preview docs", 17 | "format": "prettier \"**/*.{js,json,md}\" --write", 18 | "textlint": "textlint \"**/*.md\"", 19 | "textlint:fix": "textlint \"**/*.md\" --fix" 20 | }, 21 | "devDependencies": { 22 | "textlint": "15.5.0", 23 | "textlint-rule-en-capitalization": "2.0.3", 24 | "textlint-rule-ja-space-between-half-and-full-width": "2.4.2", 25 | "vitepress": "1.6.4" 26 | }, 27 | "pnpm": { 28 | "onlyBuiltDependencies": [ 29 | "esbuild" 30 | ], 31 | "overrides": { 32 | "regexp.prototype.flags": "npm:@nolyfill/regexp.prototype.flags@^1", 33 | "safe-buffer": "npm:@nolyfill/safe-buffer@^1", 34 | "safer-buffer": "npm:@nolyfill/safer-buffer@^1", 35 | "side-channel": "npm:@nolyfill/side-channel@^1", 36 | "typedarray": "npm:@nolyfill/typedarray@^1" 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/wait-for.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | TIMEOUT=15 4 | QUIET=0 5 | 6 | echoerr() { 7 | if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi 8 | } 9 | 10 | usage() { 11 | exitcode="$1" 12 | cat << USAGE >&2 13 | Usage: 14 | $cmdname host:port [-t timeout] [-- command args] 15 | -q | --quiet Do not output any status messages 16 | -t TIMEOUT | --timeout=timeout Timeout in seconds, zero for no timeout 17 | -- COMMAND ARGS Execute command with args after the test finishes 18 | USAGE 19 | exit "$exitcode" 20 | } 21 | 22 | wait_for() { 23 | for i in `seq $TIMEOUT` ; do 24 | nc -z "$HOST" "$PORT" > /dev/null 2>&1 25 | 26 | result=$? 27 | if [ $result -eq 0 ] ; then 28 | if [ $# -gt 0 ] ; then 29 | exec "$@" 30 | fi 31 | exit 0 32 | fi 33 | sleep 1 34 | done 35 | echo "Operation timed out" >&2 36 | exit 1 37 | } 38 | 39 | while [ $# -gt 0 ] 40 | do 41 | case "$1" in 42 | *:* ) 43 | HOST=$(printf "%s\n" "$1"| cut -d : -f 1) 44 | PORT=$(printf "%s\n" "$1"| cut -d : -f 2) 45 | shift 1 46 | ;; 47 | -q | --quiet) 48 | QUIET=1 49 | shift 1 50 | ;; 51 | -t) 52 | TIMEOUT="$2" 53 | if [ "$TIMEOUT" = "" ]; then break; fi 54 | shift 2 55 | ;; 56 | --timeout=*) 57 | TIMEOUT="${1#*=}" 58 | shift 1 59 | ;; 60 | --) 61 | shift 62 | break 63 | ;; 64 | --help) 65 | usage 0 66 | ;; 67 | *) 68 | echoerr "Unknown argument: $1" 69 | usage 1 70 | ;; 71 | esac 72 | done 73 | 74 | if [ "$HOST" = "" -o "$PORT" = "" ]; then 75 | echoerr "Error: you need to provide a host and port to test." 76 | usage 2 77 | fi 78 | 79 | wait_for "$@" 80 | -------------------------------------------------------------------------------- /.github/workflows/doc-release.yml: -------------------------------------------------------------------------------- 1 | name: "[doc] CI for docs" 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - "docs/**" 9 | - "package.json" 10 | - "pnpm-lock.yaml" 11 | - ".github/workflows/doc-release.yml" 12 | pull_request: 13 | paths: 14 | - "docs/**" 15 | - "package.json" 16 | - "pnpm-lock.yaml" 17 | - ".github/workflows/doc-release.yml" 18 | 19 | jobs: 20 | build: 21 | runs-on: ubuntu-latest 22 | steps: 23 | - name: Checkout 24 | uses: actions/checkout@v6 25 | - uses: pnpm/action-setup@v4 26 | with: 27 | version: 10 28 | - name: Set up node 29 | uses: actions/setup-node@v6 30 | with: 31 | node-version: lts/* 32 | cache: "pnpm" 33 | - name: Install dependencies 34 | run: pnpm install 35 | - name: Build vitepress docs 36 | run: pnpm run docs:build 37 | - name: Deploy 38 | if: github.event_name == 'push' && github.ref == 'refs/heads/main' 39 | uses: peaceiris/actions-gh-pages@v4 40 | with: 41 | github_token: ${{ secrets.GITHUB_TOKEN }} 42 | publish_dir: ./docs/.vitepress/dist 43 | user_name: 'github-actions[bot]' 44 | user_email: '41898282+github-actions[bot]@users.noreply.github.com' 45 | keep_files: true 46 | 47 | automerge: 48 | if: github.actor == 'dependabot[bot]' && github.event_name == 'pull_request' 49 | needs: build 50 | runs-on: ubuntu-latest 51 | permissions: 52 | pull-requests: write 53 | contents: write 54 | steps: 55 | - uses: fastify/github-action-merge-dependabot@v3 56 | with: 57 | github-token: ${{ secrets.GITHUB_TOKEN }} 58 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/Layout.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 45 | 46 | 71 | -------------------------------------------------------------------------------- /.devcontainer/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | # Update this to the name of the service you want to work with in your docker-compose.yml file 4 | service.rss: 5 | # If you want add a non-root user to your Dockerfile, you can use the "remoteUser" 6 | # property in devcontainer.json to cause VS Code its sub-processes (terminals, tasks, 7 | # debugging) to execute as the user. Uncomment the next line if you want the entire 8 | # container to run as this user instead. Note that, on Linux, you may need to 9 | # ensure the UID and GID of the container user you create matches your local user. 10 | # See https://aka.ms/vscode-remote/containers/non-root for details. 11 | # 12 | # user: vscode 13 | 14 | # Uncomment if you want to override the service's Dockerfile to one in the .devcontainer 15 | # folder. Note that the path of the Dockerfile and context is relative to the *primary* 16 | # docker-compose.yml file (the first in the devcontainer.json "dockerComposeFile" 17 | # array). The sample below assumes your primary file is in the root of your project. 18 | # 19 | # build: 20 | # context: . 21 | # dockerfile: .devcontainer/Dockerfile 22 | 23 | volumes: 24 | # Update this to wherever you want VS Code to mount the folder of your project 25 | - .:/workspace:cached 26 | 27 | # Uncomment the next line to use Docker from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker-compose for details. 28 | # - /var/run/docker.sock:/var/run/docker.sock 29 | 30 | # Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust. 31 | # cap_add: 32 | # - SYS_PTRACE 33 | # security_opt: 34 | # - seccomp:unconfined 35 | 36 | # Overrides default command so things don't shut down after the process ends. 37 | command: /bin/sh -c "while sleep 1000; do :; done" 38 | 39 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.158.0/containers/docker-existing-docker-compose 3 | // If you want to run as a non-root user in the container, see .devcontainer/docker-compose.yml. 4 | { 5 | "name": "Existing Docker Compose (Extend)", 6 | // Update the 'dockerComposeFile' list if you have more compose files or use different names. 7 | // The .devcontainer/docker-compose.yml file contains any overrides you need/want to make. 8 | "dockerComposeFile": [ 9 | "../docker-compose.dev.yml", 10 | "docker-compose.yml" 11 | ], 12 | // The 'service' property is the name of the service for the container that VS Code should 13 | // use. Update this value and .devcontainer/docker-compose.yml to the real service name. 14 | "service": "service.rss", 15 | // The optional 'workspaceFolder' property is the path VS Code should open by default when 16 | // connected. This is typically a file mount in .devcontainer/docker-compose.yml 17 | "workspaceFolder": "/var/www", 18 | // Set *default* container specific settings.json values on container create. 19 | "settings": { 20 | "terminal.integrated.shell.linux": null 21 | }, 22 | // Add the IDs of extensions you want installed when the container is created. 23 | "extensions": [] 24 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 25 | // "forwardPorts": [], 26 | // Uncomment the next line if you want start specific services in your Docker Compose config. 27 | // "runServices": [], 28 | // Uncomment the next line if you want to keep your containers running after VS Code shuts down. 29 | // "shutdownAction": "none", 30 | // Uncomment the next line to run commands after the container is created - for example installing curl. 31 | // "postCreateCommand": "apt-get update && apt-get install -y curl", 32 | // Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root. 33 | // "remoteUser": "vscode" 34 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/02_bug_report_zh.yml: -------------------------------------------------------------------------------- 1 | name: 🐞 Bug 提交 2 | description: 提交详细报告有助于 bug 修复 3 | title: "[BUG]: " 4 | labels: ["bug"] 5 | body: 6 | - type: textarea 7 | id: bug-description 8 | attributes: 9 | label: Bug 描述 10 | description: 简洁明了地描述这个 bug。 11 | validations: 12 | required: true 13 | 14 | - type: checkboxes 15 | id: googled 16 | attributes: 17 | label: 你谷歌/百度了吗? 18 | options: 19 | - label: 是 20 | required: true 21 | 22 | - type: dropdown 23 | id: deployment-method 24 | attributes: 25 | label: 部署方法 26 | options: 27 | - Docker 28 | - Docker Compose 29 | - Other 30 | validations: 31 | required: true 32 | 33 | - type: input 34 | id: image-version 35 | attributes: 36 | label: 镜像版本 37 | description: e.g. latest, nightly, 19.8 38 | validations: 39 | required: true 40 | 41 | - type: input 42 | id: os 43 | attributes: 44 | label: 部署环境 45 | description: e.g. Ubuntu 24.04 46 | validations: 47 | required: true 48 | 49 | - type: input 50 | id: browser 51 | attributes: 52 | label: 浏览器 53 | description: e.g. Chrome, Safari 54 | validations: 55 | required: true 56 | 57 | - type: textarea 58 | id: reproduction-steps 59 | attributes: 60 | label: 复现步骤 61 | description: 复现该 bug 的详细步骤 62 | placeholder: | 63 | 1. 打开 '...' 64 | 2. 点击 '....' 65 | 3. 滑动至 '....' 66 | 4. 发现错误 67 | validations: 68 | required: true 69 | 70 | - type: textarea 71 | id: expected-behavior 72 | attributes: 73 | label: 预期结果 74 | description: 简洁明了地描述正确的预期结果该是怎样的。 75 | validations: 76 | required: true 77 | 78 | - type: textarea 79 | id: screenshots 80 | attributes: 81 | label: 截屏 82 | description: 如果可以提供截屏将有助于 bug 修复。 83 | validations: 84 | required: false 85 | 86 | - type: textarea 87 | id: error-logs 88 | attributes: 89 | label: 错误日志 90 | description: 当错误发生时,通过终端执行 `docker logs ttrss --tail 100` 获取日志,并将**相关错误日志**粘贴于此处。 91 | render: shell 92 | validations: 93 | required: false 94 | 95 | - type: textarea 96 | id: additional-context 97 | attributes: 98 | label: 其他 99 | description: 任何有助于 bug 修复的信息。 100 | validations: 101 | required: false 102 | 103 | - type: markdown 104 | attributes: 105 | value: | 106 | 感谢您花时间填写这份错误报告! 107 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | service.ttrss: 3 | image: wangqiru/ttrss:nightly 4 | container_name: ttrss 5 | ports: 6 | - 181:80 7 | environment: 8 | - SELF_URL_PATH=http://localhost:181 # please change to your own domain 9 | - DB_PASS=ttrss # use the same password defined in `database.postgres` 10 | - PUID=1000 11 | - PGID=1000 12 | volumes: 13 | - cache:/var/www/cache/ 14 | networks: 15 | - public_access 16 | - service_only 17 | - database_only 18 | stdin_open: true 19 | tty: true 20 | depends_on: 21 | - database.postgres 22 | restart: always 23 | healthcheck: 24 | test: ["CMD-SHELL", "curl -f http://localhost:80 || exit 1"] 25 | start_period: 30s 26 | interval: 30s 27 | timeout: 10s 28 | retries: 5 29 | 30 | service.mercury: # set Mercury Parser API endpoint to `service.mercury:3000` on TTRSS plugin setting page 31 | image: wangqiru/mercury-parser-api:latest 32 | container_name: mercury 33 | networks: 34 | - public_access 35 | - service_only 36 | restart: always 37 | 38 | service.opencc: # set OpenCC API endpoint to `service.opencc:3000` on TTRSS plugin setting page 39 | image: wangqiru/opencc-api-server:latest 40 | container_name: opencc 41 | environment: 42 | - NODE_ENV=production 43 | networks: 44 | - service_only 45 | restart: always 46 | 47 | database.postgres: 48 | image: postgres:16-alpine 49 | environment: 50 | - POSTGRES_PASSWORD=ttrss # feel free to change the password 51 | volumes: 52 | - ~/postgres/data/:/var/lib/postgresql/data # persist postgres data to ~/postgres/data/ on the host 53 | networks: 54 | - database_only 55 | restart: always 56 | healthcheck: 57 | test: ["CMD-SHELL", "pg_isready -U postgres"] 58 | start_period: 30s 59 | interval: 30s 60 | timeout: 10s 61 | retries: 5 62 | 63 | # utility.watchtower: 64 | # container_name: watchtower 65 | # image: nicholas-fedor/watchtower:latest 66 | # volumes: 67 | # - /var/run/docker.sock:/var/run/docker.sock 68 | # environment: 69 | # - WATCHTOWER_CLEANUP=true 70 | # - WATCHTOWER_POLL_INTERVAL=86400 71 | # restart: always 72 | 73 | # service.rsshub: 74 | # container_name: rsshub 75 | # image: diygod/rsshub:latest 76 | # environment: 77 | # NODE_ENV: production 78 | # DEBUG_INFO: false 79 | # LOGGER_LEVEL: error 80 | # NO_LOGFILES: true 81 | # networks: 82 | # - service_only 83 | # expose: 84 | # - 3000 85 | # restart: unless-stopped 86 | 87 | volumes: 88 | cache: 89 | 90 | networks: 91 | public_access: # Provide the access for ttrss UI 92 | service_only: # Provide the communication network between services only 93 | internal: true 94 | database_only: # Provide the communication between ttrss and database only 95 | internal: true 96 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/01_bug_report.yml: -------------------------------------------------------------------------------- 1 | name: 🐞 Bug report 2 | description: Create a report to help us improve 3 | title: "[BUG]: " 4 | labels: ["bug"] 5 | body: 6 | - type: textarea 7 | id: bug-description 8 | attributes: 9 | label: Describe the bug 10 | description: A clear and concise description of what the bug is. 11 | validations: 12 | required: true 13 | 14 | - type: checkboxes 15 | id: googled 16 | attributes: 17 | label: Have you googled? 18 | options: 19 | - label: 'Yes' 20 | required: true 21 | 22 | - type: dropdown 23 | id: deployment-method 24 | attributes: 25 | label: Deployment method 26 | options: 27 | - Docker 28 | - Docker Compose 29 | - Other 30 | validations: 31 | required: true 32 | 33 | - type: input 34 | id: image-version 35 | attributes: 36 | label: Version of the image used 37 | description: e.g. latest, nightly, 19.8 38 | validations: 39 | required: true 40 | 41 | - type: input 42 | id: os 43 | attributes: 44 | label: Host Operating System 45 | description: e.g. Ubuntu 24.04 46 | validations: 47 | required: true 48 | 49 | - type: input 50 | id: browser 51 | attributes: 52 | label: Browser 53 | description: e.g. Chrome, Safari 54 | validations: 55 | required: true 56 | 57 | - type: textarea 58 | id: reproduction-steps 59 | attributes: 60 | label: To Reproduce 61 | description: Steps to reproduce the behavior 62 | placeholder: | 63 | 1. Go to '...' 64 | 2. Click on '....' 65 | 3. Scroll down to '....' 66 | 4. See error 67 | validations: 68 | required: true 69 | 70 | - type: textarea 71 | id: expected-behavior 72 | attributes: 73 | label: Expected behavior 74 | description: A clear and concise description of what you expected to happen. 75 | validations: 76 | required: true 77 | 78 | - type: textarea 79 | id: screenshots 80 | attributes: 81 | label: Screenshots 82 | description: If applicable, add screenshots to help explain your problem. 83 | validations: 84 | required: false 85 | 86 | - type: textarea 87 | id: error-logs 88 | attributes: 89 | label: Error logs 90 | description: When the error occurs, execute `docker logs ttrss --tail 100` to obtain the error logs and paste the relevant logs here. 91 | render: shell 92 | validations: 93 | required: false 94 | 95 | - type: textarea 96 | id: additional-context 97 | attributes: 98 | label: Additional context 99 | description: Add any other context about the problem here. 100 | validations: 101 | required: false 102 | 103 | - type: markdown 104 | attributes: 105 | value: | 106 | Thanks for taking the time to fill out this bug report! 107 | -------------------------------------------------------------------------------- /.github/workflows/build-release.yml: -------------------------------------------------------------------------------- 1 | name: "[builder] CI for releases" 2 | 3 | on: 4 | repository_dispatch: 5 | types: build 6 | workflow_dispatch: ~ 7 | schedule: 8 | - cron: "0 0 * * *" 9 | push: 10 | branches: 11 | - main 12 | - dev 13 | paths: 14 | - "src/**" 15 | - "Dockerfile" 16 | - "docker-entrypoint.sh" 17 | - ".github/workflows/build-release.yml" 18 | pull_request: 19 | paths: 20 | - "src/**" 21 | - "Dockerfile" 22 | - "docker-entrypoint.sh" 23 | - ".github/workflows/build-release.yml" 24 | 25 | env: 26 | REGISTRY: ghcr.io 27 | IMAGE_NAME: ttrss 28 | 29 | jobs: 30 | build: 31 | runs-on: ubuntu-latest 32 | permissions: 33 | id-token: write 34 | contents: read 35 | attestations: write 36 | packages: write 37 | steps: 38 | - name: Checkout 39 | uses: actions/checkout@v6 40 | 41 | - name: Set up QEMU 42 | uses: docker/setup-qemu-action@v3 43 | 44 | - name: Set up Docker Buildx 45 | uses: docker/setup-buildx-action@v3 46 | 47 | - name: Dockerhub login 48 | if: github.event_name != 'pull_request' 49 | uses: docker/login-action@v3 50 | with: 51 | username: ${{ vars.DOCKER_USERNAME }} 52 | password: ${{ secrets.DOCKER_PASSWORD }} 53 | 54 | - name: Login to Container Registry 55 | if: github.event_name != 'pull_request' 56 | uses: docker/login-action@v3 57 | with: 58 | registry: ${{ env.REGISTRY }} 59 | username: ${{ github.actor }} 60 | password: ${{ secrets.GITHUB_TOKEN }} 61 | 62 | - name: Set tag 63 | id: tag 64 | uses: docker/metadata-action@v5 65 | with: 66 | images: | 67 | ${{ vars.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }} 68 | ${{ env.REGISTRY }}/${{ github.repository }} 69 | tags: | 70 | # latest 71 | type=raw,value=latest,enable=${{ github.event_name != 'schedule' && github.ref_name == 'main' }} 72 | type=raw,value=latest-{{ date 'YYYY-MM-DD' }},enable=${{ github.event_name != 'schedule' && github.ref_name == 'main' }} 73 | # branch 74 | type=ref,event=branch,enable=${{ github.event_name != 'schedule' && github.ref_name != 'main' }} 75 | type=ref,event=branch,suffix=-{{ date 'YYYY-MM-DD' }},enable=${{ github.event_name != 'schedule' && github.ref_name != 'main' }} 76 | # nightly 77 | type=raw,value=nightly,enable=${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || github.event_name == 'repository_dispatch') && github.ref_name == 'main' }} 78 | type=raw,value=nightly-{{ date 'YYYY-MM-DD' }},enable=${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || github.event_name == 'repository_dispatch') && github.ref_name == 'main' }} 79 | flavor: latest=false 80 | 81 | - name: Build dockerfile (with push) 82 | uses: docker/build-push-action@v6 83 | id: push 84 | with: 85 | context: . 86 | push: ${{ github.event_name != 'pull_request' }} 87 | tags: ${{ steps.tag.outputs.tags }} 88 | labels: ${{ steps.tag.outputs.labels }} 89 | platforms: linux/amd64,linux/arm/v7,linux/arm64 90 | cache-from: type=gha 91 | cache-to: type=gha,mode=max 92 | 93 | - name: Attest 94 | uses: actions/attest-build-provenance@v3 95 | if: ${{ github.event_name != 'pull_request' }} 96 | with: 97 | subject-name: | 98 | ${{ vars.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }} 99 | ${{ env.REGISTRY }}/${{ github.repository }} 100 | subject-digest: ${{ steps.push.outputs.digest }} 101 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM docker.io/alpine:3.23 AS builder 2 | 3 | # Download ttrss via git 4 | WORKDIR /var/www 5 | # https://stackoverflow.com/questions/36996046/how-to-prevent-dockerfile-caching-git-clone 6 | ADD https://api.github.com/repos/tt-rss/tt-rss/git/refs/heads/main /var/www/ttrss-version 7 | RUN apk add --update tar curl git \ 8 | && rm -rf /var/www/* \ 9 | && git clone https://github.com/tt-rss/tt-rss --depth=1 /var/www \ 10 | && rm -rf /var/www/tests \ 11 | && find /var/www -mindepth 1 -maxdepth 1 -name ".*" ! -name ".git" -exec rm -rf {} + 12 | 13 | # Download plugins 14 | WORKDIR /var/www/plugins.local 15 | 16 | RUN mkdir /var/www/plugins/fever mercury_fulltext feediron opencc api_newsplus options_per_feed remove_iframe_sandbox wallabag_v2 auth_oidc freshapi api_feedreader && \ 17 | ## Fever 18 | curl -sL https://github.com/DigitalDJ/tinytinyrss-fever-plugin/archive/master.tar.gz | \ 19 | tar xzvpf - --strip-components=1 -C /var/www/plugins/fever tinytinyrss-fever-plugin-master && \ 20 | ## Mercury Fulltext 21 | curl -sL https://github.com/HenryQW/mercury_fulltext/archive/master.tar.gz | \ 22 | tar xzvpf - --strip-components=1 -C mercury_fulltext mercury_fulltext-master && \ 23 | ## Feediron 24 | curl -sL https://github.com/feediron/ttrss_plugin-feediron/archive/master.tar.gz | \ 25 | tar xzvpf - --strip-components=1 -C feediron ttrss_plugin-feediron-master && \ 26 | ## OpenCC 27 | curl -sL https://github.com/HenryQW/ttrss_opencc/archive/master.tar.gz | \ 28 | tar xzvpf - --strip-components=1 -C opencc ttrss_opencc-master && \ 29 | ## News+ API 30 | curl -sL https://github.com/voidstern/tt-rss-newsplus-plugin/archive/master.tar.gz | \ 31 | tar xzvpf - --strip-components=2 -C api_newsplus tt-rss-newsplus-plugin-master/api_newsplus && \ 32 | ## Options per feed 33 | curl -sL https://github.com/entekadesign/options_per_feed/archive/master.tar.gz | \ 34 | tar xzvpf - --strip-components=1 -C options_per_feed options_per_feed-master && \ 35 | ## Remove iframe sandbox 36 | curl -sL https://github.com/DIYgod/ttrss-plugin-remove-iframe-sandbox/archive/master.tar.gz | \ 37 | tar xzvpf - --strip-components=1 -C remove_iframe_sandbox ttrss-plugin-remove-iframe-sandbox-master && \ 38 | ## Wallabag 39 | curl -sL https://github.com/joshp23/ttrss-to-wallabag-v2/archive/master.tar.gz | \ 40 | tar xzvpf - --strip-components=2 -C wallabag_v2 ttrss-to-wallabag-v2-master/wallabag_v2 && \ 41 | ## Auth OIDC 42 | curl -sL https://github.com/tt-rss/tt-rss-plugin-auth-oidc/archive/main.tar.gz | \ 43 | tar xzvpf - --strip-components=1 -C auth_oidc tt-rss-plugin-auth-oidc-main && \ 44 | ## FreshAPI 45 | curl -sL https://github.com/eric-pierce/freshapi/archive/master.tar.gz | \ 46 | tar xzvpf - --strip-components=1 -C freshapi freshapi-master && \ 47 | ## FeedReader API 48 | curl -sL https://raw.githubusercontent.com/jangernert/FeedReader/master/data/tt-rss-feedreader-plugin/api_feedreader/init.php -o api_feedreader/init.php 49 | 50 | # Download themes 51 | WORKDIR /var/www/themes.local 52 | 53 | # Fix safari: TypeError: window.requestIdleCallback is not a function 54 | # https://community.tt-rss.org/t/typeerror-window-requestidlecallback-is-not-a-function/1755/26 55 | # https://github.com/pladaria/requestidlecallback-polyfill 56 | # COPY src/local-overrides.js local-overrides.js 57 | # this polyfill is added to tt-rss after 1 years 7 months 58 | # https://github.com/HenryQW/Awesome-TTRSS/commit/1b077f26f8c40ce7dd7b2a0cf2263a3537118e07 59 | # https://github.com/tt-rss/tt-rss/commit/31ef788e02339452fa6241277e17f85067c33ba0 60 | 61 | ## Feedly 62 | RUN curl -sL https://github.com/levito/tt-rss-feedly-theme/archive/master.tar.gz | \ 63 | tar xzvpf - --strip-components=1 --wildcards -C . tt-rss-feedly-theme-master/feedly*.css tt-rss-feedly-theme-master/feedly/fonts && \ 64 | ## RSSHub 65 | curl -sL https://github.com/DIYgod/ttrss-theme-rsshub/archive/master.tar.gz | \ 66 | tar xzvpf - --strip-components=2 -C . ttrss-theme-rsshub-master/dist/rsshub.css && \ 67 | ## Feedlish 68 | curl -sL https://github.com/Gravemind/tt-rss-feedlish-theme/archive/master.tar.gz | \ 69 | tar xzvpf - --strip-components=1 --wildcards -C . tt-rss-feedlish-theme-master/feedlish*.css 70 | 71 | FROM docker.io/alpine:3.23 72 | 73 | LABEL maintainer="Henry" 74 | 75 | # Database default settings 76 | ENV DB_HOST=database.postgres 77 | ENV DB_PORT=5432 78 | ENV DB_USER=postgres 79 | ENV DB_NAME=ttrss 80 | ENV DB_PASS=ttrss 81 | ENV DB_SSLMODE=prefer 82 | 83 | # Some default settings 84 | ENV SELF_URL_PATH=http://localhost:181 85 | ENV ENABLE_PLUGINS=auth_internal,fever 86 | ENV SESSION_COOKIE_LIFETIME=24 87 | ENV SINGLE_USER_MODE=false 88 | ENV LOG_DESTINATION=sql 89 | ENV FEED_LOG_QUIET=false 90 | 91 | # Open up ports to bypass ttrss strict port checks, USE WITH CAUTION 92 | ENV ALLOW_PORTS="80,443" 93 | 94 | ENV PHP_SUFFIX=83 95 | 96 | WORKDIR /var/www 97 | 98 | COPY ./docker-entrypoint.sh /docker-entrypoint.sh 99 | COPY src/wait-for.sh /wait-for.sh 100 | COPY src/ttrss.nginx.conf /etc/nginx/nginx.conf 101 | COPY src/initialize.php /initialize.php 102 | COPY src/s6/ /etc/s6/ 103 | 104 | # Install dependencies 105 | RUN set -ex \ 106 | && chmod -x /wait-for.sh && chmod -x /docker-entrypoint.sh \ 107 | && PHP_PACKAGES="fpm ctype curl dom exif fileinfo gd iconv intl json mbstring opcache \ 108 | openssl pcntl pdo pdo_pgsql pecl-apcu phar posix session simplexml sockets sodium tokenizer xml xmlwriter zip \ 109 | gmp pecl-imagick" \ 110 | && EXT_LIST="" \ 111 | && for p in $PHP_PACKAGES; do \ 112 | EXT_LIST="$EXT_LIST php${PHP_SUFFIX}-$p"; \ 113 | done \ 114 | && apk add --update --no-cache git nginx s6 curl sudo tzdata \ 115 | php${PHP_SUFFIX} $EXT_LIST \ 116 | ca-certificates && rm -rf /var/cache/apk/* \ 117 | # Update libiconv as the default version is too low 118 | # Do not bump this dependency https://gitlab.alpinelinux.org/alpine/aports/-/issues/12328 119 | && apk add gnu-libiconv=1.15-r3 --update --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.13/community/ \ 120 | && if [ ! -e /usr/bin/php ]; then ln -s /usr/bin/php${PHP_SUFFIX} /usr/bin/php; fi \ 121 | && echo -e "opcache.enable_cli=1\nopcache.jit=1255\nopcache.jit_buffer_size=64M" >> /etc/php${PHP_SUFFIX}/php.ini \ 122 | # leftover files 123 | && rm -rf /var/www 124 | 125 | ENV LD_PRELOAD="/usr/lib/preloadable_libiconv.so php" 126 | 127 | # Copy TTRSS and plugins 128 | COPY --from=builder /var/www /var/www 129 | 130 | RUN chown nobody:nginx -R /var/www \ 131 | && git config --global --add safe.directory /var/www \ 132 | # https://github.com/tt-rss/tt-rss/commit/f57bb8ec244c39615d4ab247a7016aded11080a2 133 | && chown -R nobody:nginx /root 134 | 135 | EXPOSE 80 136 | 137 | ENTRYPOINT ["sh", "/docker-entrypoint.sh"] 138 | -------------------------------------------------------------------------------- /src/initialize.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | exec('CREATE DATABASE ' . ($config['DB_NAME']) . ' WITH OWNER ' . ($config['DB_USER'])); 117 | 118 | unset($pdo); 119 | 120 | $pdo = connectDatabase(false); 121 | 122 | try { 123 | $pdo->query('SELECT 1 FROM ttrss_feeds'); 124 | } catch (PDOException $e) { 125 | echo 'Database table not found, applying schema... ' . PHP_EOL; 126 | $schema = file_get_contents('sql/pgsql/schema.sql'); 127 | 128 | $schema = preg_replace('/--(.*?);/', '', $schema); 129 | $schema = preg_replace('/[\r\n]/', ' ', $schema); 130 | $schema = trim($schema, ' ;'); 131 | foreach (explode(';', $schema) as $stm) { 132 | $pdo->exec($stm); 133 | } 134 | 135 | $pdo->exec("CREATE EXTENSION IF NOT EXISTS pg_trgm"); 136 | unset($pdo); 137 | } 138 | } 139 | $contents = " $value) { 141 | if($value !== null){ 142 | $contents .= "\tputenv('TTRSS_" . $name . '='. $value . "');"; 143 | $contents .= "\r\n"; 144 | } 145 | } 146 | 147 | if (getenv('DISABLE_USER_IN_DAYS') !== false) { 148 | $contents .= "\tputenv('TTRSS_DAEMON_UPDATE_LOGIN_LIMIT=" . env('DISABLE_USER_IN_DAYS') . "');"; 149 | $contents .= "\r\n"; 150 | } 151 | 152 | 153 | file_put_contents($confpath, $contents); 154 | } 155 | 156 | 157 | function env($name, $default = null) 158 | { 159 | $v = getenv($name) ?: $default; 160 | 161 | return $v; 162 | } 163 | 164 | function env_bool($name) 165 | { 166 | $v = env($name); 167 | 168 | if($v!==null){ 169 | return filter_var($v, FILTER_VALIDATE_BOOLEAN); 170 | } 171 | 172 | return null; 173 | } 174 | 175 | function connectDatabase($create) 176 | { 177 | // Create the database 178 | if ($create) { 179 | $map = array('host' => 'HOST', 'port' => 'PORT', 'sslmode' => 'SSLMODE'); 180 | $dsn = 'pgsql:dbname=postgres;'; 181 | } 182 | // Seed tables 183 | else { 184 | $map = array('host' => 'HOST', 'port' => 'PORT' , 'dbname' =>'NAME', 'sslmode' => 'SSLMODE'); 185 | $dsn = 'pgsql:'; 186 | } 187 | 188 | foreach ($map as $d => $h) { 189 | if (getenv('DB_' . $h)!==null) { 190 | $dsn .= $d . '=' . getenv('DB_' . $h) . ';'; 191 | } 192 | } 193 | 194 | $pdo = new PDO($dsn, getenv('DB_USER'), getenv('DB_PASS')); 195 | $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 196 | 197 | return $pdo; 198 | } 199 | 200 | function checkConnection($create) 201 | { 202 | try { 203 | connectDatabase($create); 204 | return true; 205 | } catch (PDOException $e) { 206 | echo $e; 207 | return false; 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /docs/zh/index.md: -------------------------------------------------------------------------------- 1 | # 🐋 Awesome TTRSS 2 | 3 | ![Docker Pulls](https://img.shields.io/docker/pulls/wangqiru/ttrss.svg) ![Docker Stars](https://img.shields.io/docker/stars/wangqiru/ttrss.svg) ![Docker Automated build](https://img.shields.io/docker/automated/wangqiru/ttrss.svg) ![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FHenryQW%2FAwesome-TTRSS.svg?type=shield) 4 | 5 | ## 关于 6 | 7 | [Tiny Tiny RSS](https://tt-rss.org/) 是一款基于 PHP 的免费开源 RSS 聚合阅读器。🐋 Awesome TTRSS 旨在提供一个 **「一站式容器化」** 的 Tiny Tiny RSS 解决方案,通过提供简易的部署方式以及一些额外插件,以提升用户体验。 8 | 9 | ## 鸣谢 10 | 11 | [![赞助者](https://opencollective.com/awesome-ttrss/backers.svg)](https://opencollective.com/awesome-ttrss#support) 12 | 13 | ## 部署 14 | 15 | 推荐使用一台 VPS 来部署您的 Awesome TTRSS 实例,[DigitalOcean](https://m.do.co/c/d6ef3c80105c) 提供高性价比的 VPS 仅需 \$5/月。 16 | 17 | Awesome TTRSS 支持多架构 (暂不包括 OpenCC API)。 18 | 19 | ### 通过 Docker 部署 20 | 21 | ```bash 22 | docker run -it --name ttrss --restart=always \ 23 | -e SELF_URL_PATH=[ TTRSS 实例地址 ] \ 24 | -e DB_HOST=[ 数据库地址 ] \ 25 | -e DB_PORT=[ 数据库端口 ] \ 26 | -e DB_NAME=[ 数据库名称 ] \ 27 | -e DB_USER=[ 数据库用户名 ] \ 28 | -e DB_PASS=[ 数据库密码 ] \ 29 | -p [ 容器对外映射端口 ]:80 \ 30 | -d wangqiru/ttrss 31 | ``` 32 | 33 | ### 通过 Docker Compose 部署 34 | 35 | [docker-compose.yml](https://github.com/HenryQW/Awesome-TTRSS/blob/main/docker-compose.yml) 包含了 4 个镜像: 36 | 37 | 1. [TTRSS](https://hub.docker.com/r/wangqiru/ttrss) 38 | 2. [PostgreSQL](https://hub.docker.com/_/postgres) 39 | 3. [Mercury Parser API](https://hub.docker.com/r/wangqiru/mercury-parser-api) 40 | 4. [OpenCC API](https://hub.docker.com/r/wangqiru/opencc-api-server) 41 | 5. [RSSHub](https://docs.rsshub.app/) 42 | 43 | #### 步骤 44 | 45 | 1. 下载 [docker-compose.yml](https://github.com/HenryQW/Awesome-TTRSS/blob/main/docker-compose.yml) 至任意目录。 46 | 2. 更改 `docker-compose.yml` 中的设置,请务必更改 postgres 用户密码。 47 | 3. 通过终端在同目录下运行 `docker compose up -d` 后等待部署完成。 48 | 4. 默认通过 181 端口访问 TTRSS,默认账户:`admin` 密码:`password`,请第一时间更改。 49 | 5. `wangqiru/mercury-parser-api` 及 `wangqiru/opencc-api-server` 为支持高级功能而加入的可选服务类容器,删除不会影响 TTRSS 基础功能。 50 | 51 | ### 支持的环境变量列表 52 | 53 | - `SELF_URL_PATH`: TTRSS 实例地址。**🔴 请注意,该变量值必须与你在浏览器中用于访问 TTRSS 的 URL 保持完全一致,否则 TTRSS 将无法启动。** 54 | - `DB_HOST`: 数据库地址 55 | - `DB_PORT`: 数据库端口 56 | - `DB_NAME`: 数据库名字 57 | - `DB_USER`: 数据库用户名 58 | - `DB_PASS`: 数据库密码 59 | - `DB_SSLMODE`: 数据库 SSL 连接模式,默认为 `prefer` 60 | - `DB_USER_FILE`: Docker Secrets 支持(替代 DB_USE),包含数据库用户名的文件 61 | - `DB_PASS_FILE`: Docker Secrets 支持(替代 DB_PASS),包含数据库密码的文件 62 | - `ENABLE_PLUGINS`: 全局启用的插件名称,其中 `auth_internal` 为必须启用的登录插件 63 | - `ALLOW_PORTS`: 逗号分隔端口号,如`1200,3000`。允许订阅非 80,443 端口的源。**🔴 谨慎使用。** 64 | - `SESSION_COOKIE_LIFETIME`: 使用网页版登陆时 cookie 过期时间,单位为小时,默认为 `24` 小时 65 | - `HTTP_PROXY`: `ip:port`, TTRSS 实例的全局代理。为源地址添加单独代理请使用 [Options per Feed](#options-per-feed) 66 | - `DISABLE_USER_IN_DAYS`: 当用户 X 天后没有登录后,停止为其自动更新订阅源,直至用户再次登陆 67 | - `FEED_LOG_QUIET`: `true` 禁用订阅源更新所产生的日志打印 68 | 69 | 更多环境变量,参见 [官方 tt-rss 文档](https://github.com/tt-rss/tt-rss/blob/main/classes/Config.php)。 70 | 71 | ### 配置 HTTPS 72 | 73 | TTRSS 容器自身不负责使用 HTTPS 加密通信。参见下方的样例自行配置 Caddy 或 Nginx 反向代理。使用 [Let's Encrypt](https://letsencrypt.org/) 可以获取免费 SSL 证书。 74 | 75 | ```shell 76 | # Caddyfile 77 | ttrssdev.henry.wang { 78 | reverse_proxy 127.0.0.1:181 79 | encode zstd gzip 80 | } 81 | ``` 82 | 83 | ```shell 84 | # nginx.conf 85 | upstream ttrssdev { 86 | server 127.0.0.1:181; 87 | } 88 | 89 | server { 90 | listen 80; 91 | server_name ttrssdev.henry.wang; 92 | return 301 https://ttrssdev.henry.wang$request_uri; 93 | } 94 | 95 | server { 96 | listen 443 ssl; 97 | gzip on; 98 | server_name ttrssdev.henry.wang; 99 | 100 | ssl_certificate /etc/letsencrypt/live/ttrssdev.henry.wang/fullchain.pem; 101 | ssl_certificate_key /etc/letsencrypt/live/ttrssdev.henry.wang/privkey.pem; 102 | 103 | location / { 104 | proxy_redirect off; 105 | proxy_pass http://ttrssdev; 106 | 107 | proxy_set_header Host $http_host; 108 | proxy_set_header X-Real-IP $remote_addr; 109 | proxy_set_header X-Forwarded-Ssl on; 110 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 111 | proxy_set_header X-Forwarded-Proto $scheme; 112 | proxy_set_header X-Frame-Options SAMEORIGIN; 113 | 114 | client_max_body_size 100m; 115 | client_body_buffer_size 128k; 116 | 117 | proxy_buffer_size 4k; 118 | proxy_buffers 4 32k; 119 | proxy_busy_buffers_size 64k; 120 | proxy_temp_file_write_size 64k; 121 | } 122 | } 123 | ``` 124 | 125 | **🔴 请注意, [你需要更新 `SELF_URL_PATH` 环境变量。](#supported-environment-variables)** 126 | 127 | ## 更新 128 | 129 | Awesome TTRSS 会自动监控 TTRSS 官方更新并与之同步,这意味着更新会比较频繁。 130 | 131 | [TTRSS 官方不再释出 tag](https://community.tt-rss.org/t/versioning-changes-for-trunk/2974)。 `wangqiru/ttrss:nightly` 会与 [官方 main branch](https://github.com/tt-rss/tt-rss) 同步。 132 | 133 | ::: warning 134 | 135 | `latest` 标签的镜像仅在 [Awesome-TTRSS](https://github.com/HenryQW/Awesome-TTRSS) 发生更改时发布,它不会定期与 TTRSS 上游同步。同时不推荐从 `nightly` 切换到 `latest`,因为可能导致数据丢失。 136 | 137 | ::: 138 | 139 | ### 手动更新 140 | 141 | 通过以下命令进行手动更新: 142 | 143 | ```bash 144 | docker pull wangqiru/ttrss:nightly 145 | # docker pull wangqiru/mercury-parser-api:latest 146 | # docker pull wangqiru/opencc-api-server:latest 147 | docker compose up -d # 如果您没有使用 docker compose,我确信您知道该怎么做。 148 | ``` 149 | 150 | ### 自动更新 151 | 152 | [样例 Docker Compose](#通过-docker-compose-部署) 中包含了 [Watchtower](https://github.com/nicholas-fedor/watchtower),它会自动拉取并更新您所有的服务容器 (包括当前系统上运行的非 Awesome TTRSS 服务的容器)。该服务默认关闭,**启用前请确认它将不会影响您其他的服务容器。** 153 | 154 | 您也可以设置 watchtower 忽略您的其他容器: 155 | 156 | ```yml 157 | service.mercury: 158 | image: wangqiru/mercury-parser-api:latest 159 | container_name: mercury 160 | expose: 161 | - 3000 162 | restart: always 163 | # ⬇️ 这将使 Watchtower 跳过对 mercury-parser-api 的更新检测 164 | labels: 165 | - com.centurylinklabs.watchtower.enable=false 166 | ``` 167 | 168 | ## 数据库更新或迁移 169 | 170 | Postgres 大版本更新 (15->16) 需要额外的步骤来确保服务正常运行。 171 | 为了更好地优化 Awesome TTRSS,有时候可能会推出一些破坏性更新。 172 | 173 | ### 步骤 174 | 175 | ::: warning 176 | 177 | 在升级时,请勿跳过多个大版本,例如直接从 13.x 升级到 16.x 是不支援的,并可能导致数据丢失。 178 | 179 | ::: 180 | 181 | 这些步骤演示了如何进行 Postgres 大版本更新(从 15.x 至 16.x),或者从其他镜像迁移至 postgres:alpine。 182 | 183 | 1. 停止所有服务容器: 184 | 185 | ```bash 186 | docker compose stop 187 | ``` 188 | 189 | 2. 复制 Postgres 数据卷 `~/postgres/data/`(或者你在 Docker Compose 中指定的目录)至其他任何地方作为备份,这非常重要! 190 | 3. 执行如下命令来导出所有数据: 191 | 192 | ```bash 193 | docker exec postgres pg_dumpall -c -U 数据库用户名 > export.sql 194 | ``` 195 | 196 | 4. 删除 Postgres 数据卷 `~/postgres/data/`。 197 | 5. 根据最新 [docker-compose.yml](https://github.com/HenryQW/Awesome-TTRSS/blob/main/docker-compose.yml) 中的`database.postgres` 部份来更新你的 Docker Compose 文件(**注意 `DB_NAME` 不可更改**),并启动: 198 | 199 | ```bash 200 | docker compose up -d 201 | ``` 202 | 203 | 6. 执行如下命令来导入所有数据: 204 | 205 | ```bash 206 | cat export.sql | docker exec -i postgres psql -U 数据库用户名 207 | ``` 208 | 209 | 7. 测试所有服务是否正常工作,现在你可以移除步骤二中的备份了。 210 | 211 | ## 插件 212 | 213 | ### [Mercury 全文获取](https://github.com/HenryQW/mercury_fulltext) 214 | 215 | 全文内容提取插件,配合单独的 Mercury Parser API 服务器使用。[样例 Docker Compose](#通过-docker-compose-部署) 中已经包含了 [HenryQW/mercury-parser-api](https://github.com/HenryQW/mercury-parser-api) 服务器。 216 | 217 | #### 设置步骤 218 | 219 | 1. 在设置中启用 `mercury-fulltext` 插件 220 | ![启用 Mercury](https://share.henry.wang/92AGp5/x9xYB93cnX+) 221 | 2. 在设置中填入 Mercury Parser API 地址 222 | ![填入 Mercury Parser API 地址](https://share.henry.wang/9HJemY/BlTnDhuUGC+) 223 | 224 | 使用 Awesome-TTRSS 部署的 mercury 可填写`service.mercury:3000`。 225 | 226 | #### 全文提取按钮 227 | 228 | 229 | 230 | ### [FreshRSS / Google Reader API](https://github.com/eric-pierce/freshapi) 231 | 232 | FreshRSS / Google Reader API 插件,用于 Tiny-Tiny RSS 233 | 234 | #### Steps 235 | 236 | 1. 导航到 Tiny Tiny RSS 中的“首选项”菜单,然后选中 “General” “Enable API”下的框 237 | ![enable API](https://private-user-images.githubusercontent.com/551464/366939059-f79e6fe3-bfb0-4989-a0fb-0bda4ac8b84d.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjcxMDYzNjMsIm5iZiI6MTcyNzEwNjA2MywicGF0aCI6Ii81NTE0NjQvMzY2OTM5MDU5LWY3OWU2ZmUzLWJmYjAtNDk4OS1hMGZiLTBiZGE0YWM4Yjg0ZC5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwOTIzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDkyM1QxNTQxMDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yYzJiNDE4ZjkwMDEwOTAzOWY3NWZkNTVlZDMzMmFmNTY0OTM5N2VkODlkNGIwYWZkM2Y0ODNhZTFkOGJhZDdiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.f78G7IsKszUMGS99y1ZPIpEwVjiwr3CaorTYKE-EXBI) 238 | 2. 偏好,打开插件菜单并启用 “freshapi” 239 | ![enable FreshAPI](https://private-user-images.githubusercontent.com/551464/366939183-68260e5f-bcb8-4e14-a416-3d31104d9006.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjcxMDYzNjMsIm5iZiI6MTcyNzEwNjA2MywicGF0aCI6Ii81NTE0NjQvMzY2OTM5MTgzLTY4MjYwZTVmLWJjYjgtNGUxNC1hNDE2LTNkMzExMDRkOTAwNi5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwOTIzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDkyM1QxNTQxMDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00YzkzNGRhNzcyMTQ1MWQ2Yjc1ZmVlY2VkYzY1YmE0MDY3OTE2Mzc2MDU2N2IyZDFjMjE3MDVhODNmYzE5YTE3JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.L8Y8AVEEXSCsT48xqWBEujvhZrOPwEwI0jfQz_OKdgI) 240 | 3. 配置移动应用程序时,请选择 “FreshRSS”或 “Google Reader API”。根据您的设置,您需要将客户指向 TT-RSS 安装。如果您使用子域来主持 TT-RSS,请使用 `https://yoursubdomain.yourdomain.com/plugins.local/freshapi/api/greader.php` . 如果您在根域上运行,请使用 `https://yourdomain.com/plugins.local/freshapi/api/greader.php` 241 | 4. 使用您的标准 TT-RSS 用户名和密码。如果您启用了 2 个因子身份验证(2FA)生成并使用应用程序密码。与所有处理身份验证的插件一样,强烈建议使用 [开启 HTTPS](#配置-https)。 242 | 243 | ### [Fever API](https://github.com/DigitalDJ/tinytinyrss-fever-plugin) 244 | 245 | 提供 Fever API 支持。 246 | 247 | #### 设置步骤 248 | 249 | 1. 在设置中启用 API。 250 | ![启用 API](https://share.henry.wang/X2AnXi/bVVDg9mGDm+) 251 | 2. 在插件设置中设置 Fever 密码。 252 | ![设置 Fever 密码](https://share.henry.wang/HspODo/xRSbZQheVN+) 253 | 3. 在支持 Fever 的阅读器用,使用 `https://[您的地址]/plugins/fever` 作为服务器地址。使用您的账号和步骤 2 中的密码登录。 254 | 4. 由于该插件使用未加盐的 MD5 加密密码进行通信,强烈建议 [开启 HTTPS](#配置-https)。 255 | 256 | ### [OpenCC 繁简转换](https://github.com/HenryQW/ttrss_opencc) 257 | 258 | 使用 [OpenCC](https://github.com/BYVoid/OpenCC) 为 TTRSS 提供中文繁转简的插件,需要配合单独的 OpenCC API 服务器使用。[样例 Docker Compose](#通过-docker-compose-部署) 中已经包含了 [HenryQW/OpenCC.henry.wang](https://github.com/HenryQW/OpenCC.henry.wang) 服务器。 259 | 260 | #### 设置步骤 261 | 262 | 1. 在设置中启用 `opencc` 插件 263 | ![启用 opencc](https://share.henry.wang/EvN5Nl/2RHNnMV2iP+) 264 | 2. 在设置中填入 OpenCC API 地址
265 | ![填入 OpenCC API 地址](https://share.henry.wang/pePHAz/oWXX3I18hW+) 266 | 267 | 使用 Awesome-TTRSS 部署的 OpenCC 可填写`service.opencc:3000`。 268 | 269 | #### 转换按钮 270 | 271 | 272 | 273 | ### [FeedReader API](https://github.com/jangernert/FeedReader/tree/master/data/tt-rss-feedreader-plugin) 274 | 275 | 提供 FeedReader API 支持。 276 | 277 | 系统插件,将 `api_feedreader` 添加到 **ENABLE_PLUGINS** 环境变量中以启用。 278 | 279 | 使用指南见 [FeedReader API](https://github.com/jangernert/FeedReader/tree/master/data/tt-rss-feedreader-plugin)。 280 | 281 | ### [News+ API](https://github.com/voidstern/tt-rss-newsplus-plugin/) 282 | 283 | 为 Android App [News+](http://github.com/noinnion/newsplus/) 和 iOS App [Fiery Feeds](http://cocoacake.net/apps/fiery/) 提供更快的同步速度。 284 | 285 | 系统插件,将 `api_newsplus` 添加到 **ENABLE_PLUGINS** 环境变量中以启用。 286 | 287 | 使用指南见 [News+ API](https://github.com/voidstern/tt-rss-newsplus-plugin/)。 288 | 289 | ### [Feediron](https://github.com/feediron/ttrss_plugin-feediron) 290 | 291 | 提供文章 DOM 操控能力的插件。 292 | 293 | 使用指南见 [Feediron](https://github.com/feediron/ttrss_plugin-feediron)。 294 | 295 | ### [Options per Feed](https://github.com/sergey-dryabzhinsky/options_per_feed) 296 | 297 | 提供单独为源地址配置代理、user-agent 以及 SSL 证书验证的能力。 298 | 299 | 使用指南见 [Options per Feed](https://github.com/sergey-dryabzhinsky/options_per_feed)。 300 | 301 | ### [Remove iframe sandbox](https://github.com/DIYgod/ttrss-plugin-remove-iframe-sandbox) 302 | 303 | ::: warning 注意 304 | 305 | 该插件与 `Fever API` 不能同时作为全局插件启用。如果您同时需要两者: 306 | 307 | 1. 在环境变量 `ENABLE_PLUGINS` 中移除 `fever` 并添加 `remove_iframe_sandbox` 作为全局插件启用。 308 | 2. 在登陆 TTRSS 后,通过设置将 `Fever API` 作为本地插件启用。 309 | 310 | ::: 311 | 312 | 移除 iframe 上的 sandbox 属性,以支持 feed 中直接播放嵌入视频。 313 | 314 | 使用指南见 [Remove iframe sandbox](https://github.com/DIYgod/ttrss-plugin-remove-iframe-sandbox)。 315 | 316 | ### [Wallabag v2](https://github.com/joshp23/ttrss-to-wallabag-v2) 317 | 318 | 保存文章至 Wallabag。 319 | 320 | 使用指南见 [Wallabag v2](https://github.com/joshp23/ttrss-to-wallabag-v2)。 321 | 322 | ### [Auth OIDC](https://github.com/tt-rss/tt-rss-plugin-auth-oidc) 323 | 324 | 这是一个系统插件,允许用户通过 OpenID Connect 提供程序(如 Keycloak)连接到 TTRSS。 325 | 326 | 通过将 `auth_oidc` 添加到环境变量 **ENABLE_PLUGINS** 来启用。 327 | 328 | 然后添加以下环境变量及相应的值: 329 | 330 | ```yaml 331 | AUTH_OIDC_NAME: "显示的 IDP 提供程序名称" 332 | AUTH_OIDC_URL: "https://oidc.hostname.com" 333 | AUTH_OIDC_CLIENT_ID: "test-rss" 334 | AUTH_OIDC_CLIENT_SECRET: "your-secret-token" 335 | ``` 336 | 337 | 有关更多详细信息,请参阅 [Auth OIDC](https://github.com/tt-rss/tt-rss-plugin-auth-oidc)。 338 | 339 | ## RSSHub 340 | 341 | 在示例的 [Docker Compose](https://github.com/HenryQW/Awesome-TTRSS/blob/main/docker-compose.yml) 中集成了一个最小化的 [RSSHub](https://docs.rsshub.app) URL(Docker 服务发现)添加来自 RSSHub 的 RSS 源,例如:`http://service.rsshub:3000/bbc`。 342 | 343 | 有关配置 RSSHub 的更多信息,请参考 [RSSHub 文档](https://docs.rsshub.app/)。 344 | 345 | ## 主题 346 | 347 | ### [Feedly](https://github.com/levito/tt-rss-feedly-theme) 348 | 349 | ![Feedly](https://share.henry.wang/f3WNje/Q7RoLBSUFp+) 350 | 351 | ### [RSSHub](https://github.com/DIYgod/ttrss-theme-rsshub) 352 | 353 | ![RSSHub](https://share.henry.wang/E5Lifa/1ykvdTWuew+) 354 | 355 | ## 使用建议 356 | 357 | - 推荐使用 [RSSHub](https://docs.rsshub.app/) 来发现更多有趣的订阅源。 358 | - 对于 iOS 和 macOS 用户,内置的 [Fever API 模拟插件](#fever-api) 提供 [Reeder 5](http://reederapp.com/) 后端支持。 359 | - 对于 Linux 用户,内置的 [FeedReader API](#feedreader-api) 提供 [FeedReader](https://jangernert.github.io/FeedReader/) 后端支持。 360 | 361 | ## 支持与帮助 362 | 363 | - 阅读此 [指南](https://henry.wang/2018/04/25/ttrss-docker-plugins-guide.html) 可能会有帮助。 364 | - 通过 [GitHub issue](https://github.com/HenryQW/Awesome-TTRSS/issues) 提交问题。 365 | - [直接捐助支持](https://tt-rss.org/)。 366 | 367 | ## 捐赠 368 | 369 | **请考虑直接捐助支持 [TTRSS](https://tt-rss.org/).** 370 | 371 | ## 许可 372 | 373 | MIT 374 | 375 | [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FHenryQW%2FAwesome-TTRSS.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FHenryQW%2FAwesome-TTRSS?ref=badge_large) 376 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # 🐋 Awesome TTRSS 2 | 3 | ![Docker Pulls](https://img.shields.io/docker/pulls/wangqiru/ttrss.svg) ![Docker Stars](https://img.shields.io/docker/stars/wangqiru/ttrss.svg) ![Docker Automated build](https://img.shields.io/docker/automated/wangqiru/ttrss.svg) ![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FHenryQW%2FAwesome-TTRSS.svg?type=shield) 4 | 5 | ## About 6 | 7 | 🐋 Awesome TTRSS aims to provide a powerful **Dockerized all-in-one** solution for [Tiny Tiny RSS](https://tt-rss.org/), an open source RSS feed reader and aggregator written in PHP, with enhanced user experience via simplified deployment and a list of curated plugins. 8 | 9 | ## Special Thanks 10 | 11 | [![Backers](https://opencollective.com/awesome-ttrss/backers.svg)](https://opencollective.com/awesome-ttrss#support) 12 | 13 | ## Deployment 14 | 15 | A VPS is highly recommended to host your Awesome TTRSS instance, a VPS can be obtained from as little as \$5/month at [DigitalOcean](https://m.do.co/c/d6ef3c80105c). 16 | 17 | Awesome TTRSS supports multiple architectures , except the OpenCC API. 18 | 19 | ### Deployment via Docker 20 | 21 | ```bash 22 | docker run -it --name ttrss --restart=always \ 23 | -e SELF_URL_PATH=[ your public URL ] \ 24 | -e DB_HOST=[ your DB address ] \ 25 | -e DB_PORT=[ your DB port ] \ 26 | -e DB_NAME=[ your DB name ] \ 27 | -e DB_USER=[ your DB user ] \ 28 | -e DB_PASS=[ your DB password ] \ 29 | -p [ public port ]:80 \ 30 | -d wangqiru/ttrss 31 | ``` 32 | 33 | ### Deployment via Docker Compose 34 | 35 | [docker-compose.yml](https://github.com/HenryQW/Awesome-TTRSS/blob/main/docker-compose.yml) include 4 docker images: 36 | 37 | 1. [TTRSS](https://hub.docker.com/r/wangqiru/ttrss) 38 | 2. [PostgreSQL](https://hub.docker.com/_/postgres) 39 | 3. [Mercury Parser API](https://hub.docker.com/r/wangqiru/mercury-parser-api) 40 | 4. [OpenCC API](https://hub.docker.com/r/wangqiru/opencc-api-server) 41 | 5. [RSSHub](https://docs.rsshub.app/) 42 | 43 | #### Steps 44 | 45 | 1. Download [docker-compose.yml](https://github.com/HenryQW/Awesome-TTRSS/blob/main/docker-compose.yml) to any directory. 46 | 2. Read `docker-compose.yml` and change the settings (please ensure you have changed the password for postgres). 47 | 3. Run `docker compose up -d` and wait for the deployment to finish. 48 | 4. Access TTRSS via port 181, with default credentials `admin` and `password`, please change them asap. 49 | 5. `wangqiru/mercury-parser-api` and `wangqiru/opencc-api-server` are optional service containers to support additional features, removing them will not affect TTRSS's basic functionalities. 50 | 51 | ### Supported Environment Variables 52 | 53 | - `SELF_URL_PATH`: The url to your TTRSS instance. **🔴 Please note that this value should be consistent with the URL you see in your browser address bar, otherwise TTRSS will not start.** 54 | - `DB_HOST`: The address of your database 55 | - `DB_PORT`: The port of your database 56 | - `DB_NAME`: The name of your database 57 | - `DB_USER`: The user of your Database 58 | - `DB_PASS`: The password of your database 59 | - `DB_SSLMODE`: The SSL mode for database connection, default is `prefer` 60 | - `DB_USER_FILE`: Docker Secrets support(alternative to DB_USER), the file containing the user of your database 61 | - `DB_PASS_FILE`: Docker Secrets support(alternative to DB_PASS), the file containing the password of your database 62 | - `ENABLE_PLUGINS`: The plugins you'd like to enable as global plugins, note that `auth_internal` is required 63 | - `ALLOW_PORTS`: Comma-separated port numbers, eg: `1200,3000`. Allow subscription of non-'80,443' port feed. **🔴 Use with caution.** 64 | - `SESSION_COOKIE_LIFETIME`: the expiry time in hours for your login session cookie in hours, default to `24` hours 65 | - `HTTP_PROXY`: In format of `ip:port`, the global proxy for your TTRSS instance. To set proxy on a per feed basis, use [Options per Feed](#options-per-feed) 66 | - `DISABLE_USER_IN_DAYS`: Disable feed update for inactive users after X days without login, until the user performs a login 67 | - `FEED_LOG_QUIET`: `true` will disable the printing of feed updating logs 68 | 69 | For more environment variables, please refer to the [official tt-rss documentation](https://github.com/tt-rss/tt-rss/blob/main/classes/Config.php). 70 | 71 | ### Configure HTTPS 72 | 73 | TTRSS container itself doesn't handle HTTPS traffic. Examples of configuring a Caddy or an Nginx reverse proxy with free SSL certificate from [Let's Encrypt](https://letsencrypt.org/) are shown below: 74 | 75 | ```shell 76 | # Caddyfile 77 | ttrssdev.henry.wang { 78 | reverse_proxy 127.0.0.1:181 79 | encode zstd gzip 80 | } 81 | ``` 82 | 83 | ```shell 84 | # nginx.conf 85 | upstream ttrssdev { 86 | server 127.0.0.1:181; 87 | } 88 | 89 | server { 90 | listen 80; 91 | server_name ttrssdev.henry.wang; 92 | return 301 https://ttrssdev.henry.wang$request_uri; 93 | } 94 | 95 | server { 96 | listen 443 ssl; 97 | gzip on; 98 | server_name ttrssdev.henry.wang; 99 | 100 | ssl_certificate /etc/letsencrypt/live/ttrssdev.henry.wang/fullchain.pem; 101 | ssl_certificate_key /etc/letsencrypt/live/ttrssdev.henry.wang/privkey.pem; 102 | 103 | location / { 104 | proxy_redirect off; 105 | proxy_pass http://ttrssdev; 106 | 107 | proxy_set_header Host $http_host; 108 | proxy_set_header X-Real-IP $remote_addr; 109 | proxy_set_header X-Forwarded-Ssl on; 110 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 111 | proxy_set_header X-Forwarded-Proto $scheme; 112 | proxy_set_header X-Frame-Options SAMEORIGIN; 113 | 114 | client_max_body_size 100m; 115 | client_body_buffer_size 128k; 116 | 117 | proxy_buffer_size 4k; 118 | proxy_buffers 4 32k; 119 | proxy_busy_buffers_size 64k; 120 | proxy_temp_file_write_size 64k; 121 | } 122 | } 123 | ``` 124 | 125 | **🔴 Please note that [the value in you `SELF_URL_PATH` should be changed as well.](#supported-environment-variables)** 126 | 127 | ## Update 128 | 129 | Awesome TTRSS automatically keeps up with TTRSS by mirroring the official releases, this means update can be issued frequently. 130 | 131 | Since [TTRSS stopped releasing tags](https://community.tt-rss.org/t/versioning-changes-for-trunk/2974), `wangqiru/ttrss:nightly` will sync with [TTRSS' main branch](https://github.com/tt-rss/tt-rss) periodically. 132 | 133 | ::: warning 134 | 135 | The `latest` tagged image is only released when there are changes in [Awesome-TTRSS](https://github.com/HenryQW/Awesome-TTRSS) itself, it will not sync with TTRSS upstream periodically. Moving from `nightly` to `latest` is not recommended as it may cause data loss. 136 | 137 | ::: 138 | 139 | ### Manual Update 140 | 141 | You can fetch the latest image manually: 142 | 143 | ```bash 144 | docker pull wangqiru/ttrss:nightly 145 | # docker pull wangqiru/mercury-parser-api:latest 146 | # docker pull wangqiru/opencc-api-server:latest 147 | docker compose up -d # If you didn't use docker compose, I'm sure you know what to do. 148 | ``` 149 | 150 | ### Auto Update 151 | 152 | The example [Docker Compose](#deployment-via-docker-compose) includes [Watchtower](https://github.com/nicholas-fedor/watchtower), which automatically pulls all containers included in Awesome TTRSS (and other containers running on your system) and refreshes your running services. By default, it's disabled, **make sure it will not affect your other service containers before enabling this.** 153 | 154 | To exclude images, check the following for disabling auto update for containers: 155 | 156 | ```yml 157 | service.mercury: 158 | image: wangqiru/mercury-parser-api:latest 159 | container_name: mercury 160 | expose: 161 | - 3000 162 | restart: always 163 | # ⬇️ this prevents Watchtower from auto updating mercury-parser-api 164 | labels: 165 | - com.centurylinklabs.watchtower.enable=false 166 | ``` 167 | 168 | ## Database Upgrade or Migration 169 | 170 | Postgres major version upgrades (15->16) will require some manual operations. 171 | Sometimes breaking changes will be introduced to further optimize Awesome TTRSS. 172 | 173 | ### Steps 174 | 175 | ::: warning 176 | 177 | Do not skip multiple major versions when upgrading Postgres, for example, upgrading from 13.x to 16.x directly is not supported and may cause data loss. 178 | 179 | ::: 180 | 181 | This section demonstrates the steps to upgrade Postgres major version (from 15.x to 16.x) or migrate from other images to postgres:alpine. 182 | 183 | 1. Stop all the service containers: 184 | 185 | ```bash 186 | docker compose stop 187 | ``` 188 | 189 | 2. Copy the Postgres data volume `~/postgres/data/` (or the location specified in your Docker Compose file) to somewhere else as a backup, **THIS IS IMPORTANT**. 190 | 3. Use the following command to dump all your data: 191 | 192 | ```bash 193 | docker exec postgres pg_dumpall -c -U YourUsername > export.sql 194 | ``` 195 | 196 | 4. Delete the Postgres data volume `~/postgres/data/`. 197 | 5. Update your Docker Compose file (**Note that the `DB_NAME` must not be changed**) with `database.postgres` section in the the latest [docker-compose.yml](https://github.com/HenryQW/Awesome-TTRSS/blob/main/docker-compose.yml), and bring it up: 198 | 199 | ```bash 200 | docker compose up -d 201 | ``` 202 | 203 | 6. Use the following command to restore all your data: 204 | 205 | ```bash 206 | cat export.sql | docker exec -i postgres psql -U YourUsername 207 | ``` 208 | 209 | 7. Test if everything works fine, and now you may remove the backup in step 2. 210 | 211 | ## Plugins 212 | 213 | ### [Mercury Fulltext Extraction](https://github.com/HenryQW/mercury_fulltext) 214 | 215 | Fetch fulltext of articles via a self-hosted Mercury Parser API. A separate Mercury Parser API is required, the example [Docker Compose](#deployment-via-docker-compose) has already included [such a server](https://github.com/HenryQW/mercury-parser-api). 216 | 217 | #### Steps 218 | 219 | 1. Enable `mercury-fulltext` plugin in preference 220 | ![enable Mercury](https://share.henry.wang/92AGp5/x9xYB93cnX+) 221 | 2. Enter Mercury Parser API endpoint 222 | ![enter Mercury Parser API endpoint](https://share.henry.wang/9HJemY/BlTnDhuUGC+) 223 | 224 | Use `service.mercury:3000` for Mercury instance deployed via Awesome-TTRSS. 225 | 226 | #### Extraction Button 227 | 228 | 229 | 230 | ### [FreshRSS / Google Reader API](https://github.com/eric-pierce/freshapi) 231 | 232 | A FreshRSS / Google Reader API Plugin for Tiny-Tiny RSS 233 | 234 | #### Steps 235 | 236 | 1. Navigate to the Preferences menu in Tiny Tiny RSS, and check the box under "General" titled "Enable API" 237 | ![enable API](https://private-user-images.githubusercontent.com/551464/366939059-f79e6fe3-bfb0-4989-a0fb-0bda4ac8b84d.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjcxMDYzNjMsIm5iZiI6MTcyNzEwNjA2MywicGF0aCI6Ii81NTE0NjQvMzY2OTM5MDU5LWY3OWU2ZmUzLWJmYjAtNDk4OS1hMGZiLTBiZGE0YWM4Yjg0ZC5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwOTIzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDkyM1QxNTQxMDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yYzJiNDE4ZjkwMDEwOTAzOWY3NWZkNTVlZDMzMmFmNTY0OTM5N2VkODlkNGIwYWZkM2Y0ODNhZTFkOGJhZDdiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.f78G7IsKszUMGS99y1ZPIpEwVjiwr3CaorTYKE-EXBI) 238 | 2. In Preferences, open the Plugin menu and enable "freshapi" 239 | ![enable FreshAPI](https://private-user-images.githubusercontent.com/551464/366939183-68260e5f-bcb8-4e14-a416-3d31104d9006.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjcxMDYzNjMsIm5iZiI6MTcyNzEwNjA2MywicGF0aCI6Ii81NTE0NjQvMzY2OTM5MTgzLTY4MjYwZTVmLWJjYjgtNGUxNC1hNDE2LTNkMzExMDRkOTAwNi5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwOTIzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDkyM1QxNTQxMDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00YzkzNGRhNzcyMTQ1MWQ2Yjc1ZmVlY2VkYzY1YmE0MDY3OTE2Mzc2MDU2N2IyZDFjMjE3MDVhODNmYzE5YTE3JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.L8Y8AVEEXSCsT48xqWBEujvhZrOPwEwI0jfQz_OKdgI) 240 | 3. When configuring your mobile app, select either "FreshRSS" or "Google Reader API". You'll need to point your client to your TT-RSS installation, depending on your setup. If you're using a subdomain to host TT-RSS then use `https://yoursubdomain.yourdomain.com/plugins.local/freshapi/api/greader.php`. If you're running on the root domain, use `https://yourdomain.com/plugins.local/freshapi/api/greader.php` as the server URL. 241 | 4. Use your standard TT-RSS username and password. If you've enabled 2 Factor Authentication (2FA) generate and use an App Password. As with all plugins which handle authentication, [using HTTPS](#configure-https) is strongly recommended. 242 | 243 | ### [Fever API](https://github.com/DigitalDJ/tinytinyrss-fever-plugin) 244 | 245 | Provide Fever API simulation. 246 | 247 | #### Steps 248 | 249 | 1. Enable API in preference 250 | ![enable API](https://share.henry.wang/X2AnXi/bVVDg9mGDm+) 251 | 2. Enter a password for Fever in preference 252 | ![enter a Fever password](https://share.henry.wang/HspODo/xRSbZQheVN+) 253 | 3. In supported RSS readers, use `https://[your url]/plugins/fever` as the target server address, with your account and the password set in Step 2. 254 | 4. The plugin communicates with TTRSS using an unsalted MD5 hash, [using HTTPS](#configure-https) is strongly recommended. 255 | 256 | ### [OpenCC Simp-Trad Chinese Conversion](https://github.com/HenryQW/ttrss_opencc) 257 | 258 | Conversion between Traditional and Simplified Chinese via [OpenCC](https://github.com/BYVoid/OpenCC) , a separate [OpenCC API Server](https://github.com/HenryQW/OpenCC.henry.wang) is required. The example [Docker Compose](#deployment-via-docker-compose) has already included [such a server](https://github.com/HenryQW/OpenCC.henry.wang). 259 | 260 | #### Steps 261 | 262 | 1. Enable `opencc` plugin in preference 263 | ![enable opencc](https://share.henry.wang/EvN5Nl/2RHNnMV2iP+) 264 | 2. Enter OpenCC API endpoint
265 | ![enter OpenCC API endpoint](https://share.henry.wang/pePHAz/oWXX3I18hW+) 266 | 267 | Use `service.opencc:3000` for OpenCC instance deployed via Awesome-TTRSS. 268 | 269 | #### Conversion Button 270 | 271 | 272 | 273 | ### [FeedReader API](https://github.com/jangernert/FeedReader/tree/master/data/tt-rss-feedreader-plugin) 274 | 275 | Provide FeedReader API support. 276 | 277 | System plugin, enabled by adding `api_feedreader` to the environment variable **ENABLE_PLUGINS**. 278 | 279 | Refer to [FeedReader API](https://github.com/jangernert/FeedReader/tree/master/data/tt-rss-feedreader-plugin) for more details. 280 | 281 | ### [News+ API](https://github.com/voidstern/tt-rss-newsplus-plugin/) 282 | 283 | Provide a faster two-way synchronization for Android App [News+](http://github.com/noinnion/newsplus/) and iOS App [Fiery Feeds](http://cocoacake.net/apps/fiery/) with TTRSS. 284 | 285 | System plugin, enabled by adding `api_newsplus` to the environment variable **ENABLE_PLUGINS**. 286 | 287 | Refer to [News+ API](https://github.com/voidstern/tt-rss-newsplus-plugin/) for more details. 288 | 289 | ### [Feediron](https://github.com/feediron/ttrss_plugin-feediron) 290 | 291 | Provide the ability to manipulate article DOMs. 292 | 293 | Refer to [Feediron](https://github.com/feediron/ttrss_plugin-feediron) for more details. 294 | 295 | ### [Options per Feed](https://github.com/sergey-dryabzhinsky/options_per_feed) 296 | 297 | Provide the ability to configure proxy, user-agent and SSL certificate verification on a per feed basis. 298 | 299 | Refer to [Options per Feed](https://github.com/sergey-dryabzhinsky/options_per_feed) for more details. 300 | 301 | ### [Remove iframe sandbox](https://github.com/DIYgod/ttrss-plugin-remove-iframe-sandbox) 302 | 303 | ::: warning 304 | 305 | If you are getting data via fever api, enable it by adding `remove_iframe_sandbox` to the environment variable **ENABLE_PLUGINS**. 306 | 307 | This plugin cannot be enabled in conjunction with `Fever API` as global plugins, if you require both plugins: 308 | 309 | 1. In `ENABLE_PLUGINS` replace `fever` with `remove_iframe_sandbox` to enable this as a global plugin. 310 | 2. Enable `Fever API` in the TTRSS preferences panel after login, as a local plugin. 311 | 312 | ::: 313 | 314 | Remove the sandbox attribute on iframes, thus enabling playback of embedded video in feeds. 315 | 316 | Refer to [Remove iframe sandbox](https://github.com/DIYgod/ttrss-plugin-remove-iframe-sandbox)。 317 | 318 | ### [Wallabag v2](https://github.com/joshp23/ttrss-to-wallabag-v2) 319 | 320 | Save articles to Wallabag. 321 | 322 | Refer to [Wallabag v2](https://github.com/joshp23/ttrss-to-wallabag-v2)。 323 | 324 | ### [Auth OIDC](https://github.com/tt-rss/tt-rss-plugin-auth-oidc) 325 | 326 | This is a system plugin, that allow users to connect through an OpenID Connect provider, like Keycloak, to TTRSS. 327 | 328 | Enable it by adding `auth_oidc` to the environment variable **ENABLE_PLUGINS**. 329 | 330 | Then add the following environments variables with according values : 331 | 332 | ```yaml 333 | AUTH_OIDC_NAME: "IDP provider name displayed" 334 | AUTH_OIDC_URL: "https://oidc.hostname.com" 335 | AUTH_OIDC_CLIENT_ID: "test-rss" 336 | AUTH_OIDC_CLIENT_SECRET: "your-secret-token" 337 | ``` 338 | 339 | Refer to [Auth OIDC](https://github.com/tt-rss/tt-rss-plugin-auth-oidc) for more details. 340 | 341 | ## RSSHub 342 | 343 | There is a minimal integration of [RSSHub](https://docs.rsshub.app) in the example [Docker Compose](https://github.com/HenryQW/Awesome-TTRSS/blob/main/docker-compose.yml). 344 | Once enabled, you can add RSS feeds from RSSHub via internal URL (docker service discovery), for example: `http://service.rsshub:3000/bbc`. 345 | 346 | For more information on configuring RSSHub, please refer to [RSSHub Docs](https://docs.rsshub.app/). 347 | 348 | ## Themes 349 | 350 | ### [Feedly](https://github.com/levito/tt-rss-feedly-theme) 351 | 352 | ![Feedly](https://share.henry.wang/f3WNje/Q7RoLBSUFp+) 353 | 354 | ### [RSSHub](https://github.com/DIYgod/ttrss-theme-rsshub) 355 | 356 | ![RSSHub](https://share.henry.wang/E5Lifa/1ykvdTWuew+) 357 | 358 | ## Recommendation 359 | 360 | - [RSSHub](https://docs.rsshub.app/en/) is an interesting place for discovering RSS feeds. 361 | - For iOS and macOS user, the integrated [Fever plugin](https://github.com/DigitalDJ/tinytinyrss-fever-plugin) supplies [Reeder 5](http://reederapp.com/) backend support. 362 | - For Android user, the integrated [Fever plugin](https://github.com/DigitalDJ/tinytinyrss-fever-plugin) supplies [News+](http://github.com/noinnion/newsplus/) backend support. 363 | - For Linux user, the integrated [FeedReader API](https://github.com/jangernert/FeedReader/tree/master/data/tt-rss-feedreader-plugin) supplies [FeedReader](https://jangernert.github.io/FeedReader/) backend support. 364 | 365 | ## Support and Help 366 | 367 | - Read [this guide](https://henry.wang/2018/04/25/ttrss-docker-plugins-guide.html) might help. 368 | - Open an issue via [GitHub issue](https://github.com/HenryQW/Awesome-TTRSS/issues). 369 | - [Direct donation to TTRSS](https://tt-rss.org/). 370 | 371 | ## Donation 372 | 373 | **Please consider donations to support [TTRSS](https://tt-rss.org/) directly.** 374 | 375 | ## License 376 | 377 | MIT 378 | 379 | [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FHenryQW%2FAwesome-TTRSS.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FHenryQW%2FAwesome-TTRSS?ref=badge_large) 380 | 381 | 382 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | overrides: 8 | regexp.prototype.flags: npm:@nolyfill/regexp.prototype.flags@^1 9 | safe-buffer: npm:@nolyfill/safe-buffer@^1 10 | safer-buffer: npm:@nolyfill/safer-buffer@^1 11 | side-channel: npm:@nolyfill/side-channel@^1 12 | typedarray: npm:@nolyfill/typedarray@^1 13 | 14 | importers: 15 | 16 | .: 17 | devDependencies: 18 | textlint: 19 | specifier: 15.5.0 20 | version: 15.5.0 21 | textlint-rule-en-capitalization: 22 | specifier: 2.0.3 23 | version: 2.0.3 24 | textlint-rule-ja-space-between-half-and-full-width: 25 | specifier: 2.4.2 26 | version: 2.4.2 27 | vitepress: 28 | specifier: 1.6.4 29 | version: 1.6.4(@algolia/client-search@5.46.0)(postcss@8.5.6)(search-insights@2.17.3) 30 | 31 | packages: 32 | 33 | '@algolia/abtesting@1.12.0': 34 | resolution: {integrity: sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==} 35 | engines: {node: '>= 14.0.0'} 36 | 37 | '@algolia/autocomplete-core@1.17.7': 38 | resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} 39 | 40 | '@algolia/autocomplete-plugin-algolia-insights@1.17.7': 41 | resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} 42 | peerDependencies: 43 | search-insights: '>= 1 < 3' 44 | 45 | '@algolia/autocomplete-preset-algolia@1.17.7': 46 | resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} 47 | peerDependencies: 48 | '@algolia/client-search': '>= 4.9.1 < 6' 49 | algoliasearch: '>= 4.9.1 < 6' 50 | 51 | '@algolia/autocomplete-shared@1.17.7': 52 | resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} 53 | peerDependencies: 54 | '@algolia/client-search': '>= 4.9.1 < 6' 55 | algoliasearch: '>= 4.9.1 < 6' 56 | 57 | '@algolia/client-abtesting@5.46.0': 58 | resolution: {integrity: sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==} 59 | engines: {node: '>= 14.0.0'} 60 | 61 | '@algolia/client-analytics@5.46.0': 62 | resolution: {integrity: sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==} 63 | engines: {node: '>= 14.0.0'} 64 | 65 | '@algolia/client-common@5.46.0': 66 | resolution: {integrity: sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==} 67 | engines: {node: '>= 14.0.0'} 68 | 69 | '@algolia/client-insights@5.46.0': 70 | resolution: {integrity: sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==} 71 | engines: {node: '>= 14.0.0'} 72 | 73 | '@algolia/client-personalization@5.46.0': 74 | resolution: {integrity: sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==} 75 | engines: {node: '>= 14.0.0'} 76 | 77 | '@algolia/client-query-suggestions@5.46.0': 78 | resolution: {integrity: sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==} 79 | engines: {node: '>= 14.0.0'} 80 | 81 | '@algolia/client-search@5.46.0': 82 | resolution: {integrity: sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==} 83 | engines: {node: '>= 14.0.0'} 84 | 85 | '@algolia/ingestion@1.46.0': 86 | resolution: {integrity: sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==} 87 | engines: {node: '>= 14.0.0'} 88 | 89 | '@algolia/monitoring@1.46.0': 90 | resolution: {integrity: sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==} 91 | engines: {node: '>= 14.0.0'} 92 | 93 | '@algolia/recommend@5.46.0': 94 | resolution: {integrity: sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==} 95 | engines: {node: '>= 14.0.0'} 96 | 97 | '@algolia/requester-browser-xhr@5.46.0': 98 | resolution: {integrity: sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==} 99 | engines: {node: '>= 14.0.0'} 100 | 101 | '@algolia/requester-fetch@5.46.0': 102 | resolution: {integrity: sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==} 103 | engines: {node: '>= 14.0.0'} 104 | 105 | '@algolia/requester-node-http@5.46.0': 106 | resolution: {integrity: sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==} 107 | engines: {node: '>= 14.0.0'} 108 | 109 | '@azu/format-text@1.0.2': 110 | resolution: {integrity: sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==} 111 | 112 | '@azu/style-format@1.0.1': 113 | resolution: {integrity: sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==} 114 | 115 | '@babel/code-frame@7.27.1': 116 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 117 | engines: {node: '>=6.9.0'} 118 | 119 | '@babel/helper-string-parser@7.27.1': 120 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 121 | engines: {node: '>=6.9.0'} 122 | 123 | '@babel/helper-validator-identifier@7.28.5': 124 | resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 125 | engines: {node: '>=6.9.0'} 126 | 127 | '@babel/parser@7.28.5': 128 | resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 129 | engines: {node: '>=6.0.0'} 130 | hasBin: true 131 | 132 | '@babel/types@7.28.5': 133 | resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 134 | engines: {node: '>=6.9.0'} 135 | 136 | '@cacheable/memory@2.0.6': 137 | resolution: {integrity: sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==} 138 | 139 | '@cacheable/utils@2.3.2': 140 | resolution: {integrity: sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg==} 141 | 142 | '@docsearch/css@3.8.2': 143 | resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} 144 | 145 | '@docsearch/js@3.8.2': 146 | resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} 147 | 148 | '@docsearch/react@3.8.2': 149 | resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} 150 | peerDependencies: 151 | '@types/react': '>= 16.8.0 < 19.0.0' 152 | react: '>= 16.8.0 < 19.0.0' 153 | react-dom: '>= 16.8.0 < 19.0.0' 154 | search-insights: '>= 1 < 3' 155 | peerDependenciesMeta: 156 | '@types/react': 157 | optional: true 158 | react: 159 | optional: true 160 | react-dom: 161 | optional: true 162 | search-insights: 163 | optional: true 164 | 165 | '@esbuild/aix-ppc64@0.21.5': 166 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 167 | engines: {node: '>=12'} 168 | cpu: [ppc64] 169 | os: [aix] 170 | 171 | '@esbuild/android-arm64@0.21.5': 172 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 173 | engines: {node: '>=12'} 174 | cpu: [arm64] 175 | os: [android] 176 | 177 | '@esbuild/android-arm@0.21.5': 178 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 179 | engines: {node: '>=12'} 180 | cpu: [arm] 181 | os: [android] 182 | 183 | '@esbuild/android-x64@0.21.5': 184 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 185 | engines: {node: '>=12'} 186 | cpu: [x64] 187 | os: [android] 188 | 189 | '@esbuild/darwin-arm64@0.21.5': 190 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 191 | engines: {node: '>=12'} 192 | cpu: [arm64] 193 | os: [darwin] 194 | 195 | '@esbuild/darwin-x64@0.21.5': 196 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 197 | engines: {node: '>=12'} 198 | cpu: [x64] 199 | os: [darwin] 200 | 201 | '@esbuild/freebsd-arm64@0.21.5': 202 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 203 | engines: {node: '>=12'} 204 | cpu: [arm64] 205 | os: [freebsd] 206 | 207 | '@esbuild/freebsd-x64@0.21.5': 208 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 209 | engines: {node: '>=12'} 210 | cpu: [x64] 211 | os: [freebsd] 212 | 213 | '@esbuild/linux-arm64@0.21.5': 214 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 215 | engines: {node: '>=12'} 216 | cpu: [arm64] 217 | os: [linux] 218 | 219 | '@esbuild/linux-arm@0.21.5': 220 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 221 | engines: {node: '>=12'} 222 | cpu: [arm] 223 | os: [linux] 224 | 225 | '@esbuild/linux-ia32@0.21.5': 226 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 227 | engines: {node: '>=12'} 228 | cpu: [ia32] 229 | os: [linux] 230 | 231 | '@esbuild/linux-loong64@0.21.5': 232 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 233 | engines: {node: '>=12'} 234 | cpu: [loong64] 235 | os: [linux] 236 | 237 | '@esbuild/linux-mips64el@0.21.5': 238 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 239 | engines: {node: '>=12'} 240 | cpu: [mips64el] 241 | os: [linux] 242 | 243 | '@esbuild/linux-ppc64@0.21.5': 244 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 245 | engines: {node: '>=12'} 246 | cpu: [ppc64] 247 | os: [linux] 248 | 249 | '@esbuild/linux-riscv64@0.21.5': 250 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 251 | engines: {node: '>=12'} 252 | cpu: [riscv64] 253 | os: [linux] 254 | 255 | '@esbuild/linux-s390x@0.21.5': 256 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 257 | engines: {node: '>=12'} 258 | cpu: [s390x] 259 | os: [linux] 260 | 261 | '@esbuild/linux-x64@0.21.5': 262 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 263 | engines: {node: '>=12'} 264 | cpu: [x64] 265 | os: [linux] 266 | 267 | '@esbuild/netbsd-x64@0.21.5': 268 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 269 | engines: {node: '>=12'} 270 | cpu: [x64] 271 | os: [netbsd] 272 | 273 | '@esbuild/openbsd-x64@0.21.5': 274 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 275 | engines: {node: '>=12'} 276 | cpu: [x64] 277 | os: [openbsd] 278 | 279 | '@esbuild/sunos-x64@0.21.5': 280 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 281 | engines: {node: '>=12'} 282 | cpu: [x64] 283 | os: [sunos] 284 | 285 | '@esbuild/win32-arm64@0.21.5': 286 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 287 | engines: {node: '>=12'} 288 | cpu: [arm64] 289 | os: [win32] 290 | 291 | '@esbuild/win32-ia32@0.21.5': 292 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 293 | engines: {node: '>=12'} 294 | cpu: [ia32] 295 | os: [win32] 296 | 297 | '@esbuild/win32-x64@0.21.5': 298 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 299 | engines: {node: '>=12'} 300 | cpu: [x64] 301 | os: [win32] 302 | 303 | '@iconify-json/simple-icons@1.2.62': 304 | resolution: {integrity: sha512-GpWQ294d4lraB3D2eBSSMROh1x9uKgpmyereLlGzVQjGZ7lbeFzby2ywXxyp4vEODmTDyf1/4WcOYs/yH4rJ5Q==} 305 | 306 | '@iconify/types@2.0.0': 307 | resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 308 | 309 | '@isaacs/cliui@8.0.2': 310 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 311 | engines: {node: '>=12'} 312 | 313 | '@jridgewell/sourcemap-codec@1.5.5': 314 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 315 | 316 | '@keyv/bigmap@1.3.0': 317 | resolution: {integrity: sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==} 318 | engines: {node: '>= 18'} 319 | peerDependencies: 320 | keyv: ^5.5.4 321 | 322 | '@keyv/serialize@1.1.1': 323 | resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} 324 | 325 | '@modelcontextprotocol/sdk@1.24.3': 326 | resolution: {integrity: sha512-YgSHW29fuzKKAHTGe9zjNoo+yF8KaQPzDC2W9Pv41E7/57IfY+AMGJ/aDFlgTLcVVELoggKE4syABCE75u3NCw==} 327 | engines: {node: '>=18'} 328 | peerDependencies: 329 | '@cfworker/json-schema': ^4.1.1 330 | zod: ^3.25 || ^4.0 331 | peerDependenciesMeta: 332 | '@cfworker/json-schema': 333 | optional: true 334 | 335 | '@nolyfill/regexp.prototype.flags@1.0.44': 336 | resolution: {integrity: sha512-/+2QxFmEhxBobW8xGXKO/KV2mBXF8OAkLwcd/fWVkqL4K7DOSZFQ4xvQQqEbdITcLWYTNTV4a6Xut4NmfwnAhg==} 337 | engines: {node: '>=12.4.0'} 338 | 339 | '@nolyfill/safe-buffer@1.0.44': 340 | resolution: {integrity: sha512-SqlKXtlhNTDMeZKey9jnnuPhi8YTl1lJuEcY9zbm5i4Pqe79UJJ8IJ9oiD6DhgI8KjYc+HtLzpQJNRdNYqb/hw==} 341 | engines: {node: '>=12.4.0'} 342 | 343 | '@nolyfill/safer-buffer@1.0.44': 344 | resolution: {integrity: sha512-Ouw1fMwjAy1V4MpnDASfu1DCPgkP0nNFteiiWbFoEGSqa7Vnmkb6if2c522N2WcMk+RuaaabQbC1F1D4/kTXcg==} 345 | engines: {node: '>=12.4.0'} 346 | 347 | '@nolyfill/shared@1.0.44': 348 | resolution: {integrity: sha512-NI1zxDh4LYL7PYlKKCwojjuc5CEZslywrOTKBNyodjmWjRiZ4AlCMs3Gp+zDoPQPNkYCSQp/luNojHmJWWfCbw==} 349 | 350 | '@nolyfill/side-channel@1.0.44': 351 | resolution: {integrity: sha512-y3SvzjuY1ygnzWA4Krwx/WaJAsTMP11DN+e21A8Fa8PW1oDtVB5NSRW7LWurAiS2oKRkuCgcjTYMkBuBkcPCRg==} 352 | engines: {node: '>=12.4.0'} 353 | 354 | '@nolyfill/typedarray@1.0.44': 355 | resolution: {integrity: sha512-1CY5H5w5EQqWFJSV06LVDD0rXO19jQMY+r+RlQ+1uJB4LY4JdaI+ODZZBpGjlzS65UJcc59oegkYlX9z8/AHNQ==} 356 | engines: {node: '>=12.4.0'} 357 | 358 | '@pkgjs/parseargs@0.11.0': 359 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 360 | engines: {node: '>=14'} 361 | 362 | '@rollup/rollup-android-arm-eabi@4.53.3': 363 | resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} 364 | cpu: [arm] 365 | os: [android] 366 | 367 | '@rollup/rollup-android-arm64@4.53.3': 368 | resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} 369 | cpu: [arm64] 370 | os: [android] 371 | 372 | '@rollup/rollup-darwin-arm64@4.53.3': 373 | resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} 374 | cpu: [arm64] 375 | os: [darwin] 376 | 377 | '@rollup/rollup-darwin-x64@4.53.3': 378 | resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} 379 | cpu: [x64] 380 | os: [darwin] 381 | 382 | '@rollup/rollup-freebsd-arm64@4.53.3': 383 | resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} 384 | cpu: [arm64] 385 | os: [freebsd] 386 | 387 | '@rollup/rollup-freebsd-x64@4.53.3': 388 | resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} 389 | cpu: [x64] 390 | os: [freebsd] 391 | 392 | '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 393 | resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} 394 | cpu: [arm] 395 | os: [linux] 396 | 397 | '@rollup/rollup-linux-arm-musleabihf@4.53.3': 398 | resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} 399 | cpu: [arm] 400 | os: [linux] 401 | 402 | '@rollup/rollup-linux-arm64-gnu@4.53.3': 403 | resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} 404 | cpu: [arm64] 405 | os: [linux] 406 | 407 | '@rollup/rollup-linux-arm64-musl@4.53.3': 408 | resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} 409 | cpu: [arm64] 410 | os: [linux] 411 | 412 | '@rollup/rollup-linux-loong64-gnu@4.53.3': 413 | resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} 414 | cpu: [loong64] 415 | os: [linux] 416 | 417 | '@rollup/rollup-linux-ppc64-gnu@4.53.3': 418 | resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} 419 | cpu: [ppc64] 420 | os: [linux] 421 | 422 | '@rollup/rollup-linux-riscv64-gnu@4.53.3': 423 | resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} 424 | cpu: [riscv64] 425 | os: [linux] 426 | 427 | '@rollup/rollup-linux-riscv64-musl@4.53.3': 428 | resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} 429 | cpu: [riscv64] 430 | os: [linux] 431 | 432 | '@rollup/rollup-linux-s390x-gnu@4.53.3': 433 | resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} 434 | cpu: [s390x] 435 | os: [linux] 436 | 437 | '@rollup/rollup-linux-x64-gnu@4.53.3': 438 | resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} 439 | cpu: [x64] 440 | os: [linux] 441 | 442 | '@rollup/rollup-linux-x64-musl@4.53.3': 443 | resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} 444 | cpu: [x64] 445 | os: [linux] 446 | 447 | '@rollup/rollup-openharmony-arm64@4.53.3': 448 | resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} 449 | cpu: [arm64] 450 | os: [openharmony] 451 | 452 | '@rollup/rollup-win32-arm64-msvc@4.53.3': 453 | resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} 454 | cpu: [arm64] 455 | os: [win32] 456 | 457 | '@rollup/rollup-win32-ia32-msvc@4.53.3': 458 | resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} 459 | cpu: [ia32] 460 | os: [win32] 461 | 462 | '@rollup/rollup-win32-x64-gnu@4.53.3': 463 | resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} 464 | cpu: [x64] 465 | os: [win32] 466 | 467 | '@rollup/rollup-win32-x64-msvc@4.53.3': 468 | resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} 469 | cpu: [x64] 470 | os: [win32] 471 | 472 | '@shikijs/core@2.5.0': 473 | resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} 474 | 475 | '@shikijs/engine-javascript@2.5.0': 476 | resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} 477 | 478 | '@shikijs/engine-oniguruma@2.5.0': 479 | resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} 480 | 481 | '@shikijs/langs@2.5.0': 482 | resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} 483 | 484 | '@shikijs/themes@2.5.0': 485 | resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} 486 | 487 | '@shikijs/transformers@2.5.0': 488 | resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} 489 | 490 | '@shikijs/types@2.5.0': 491 | resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} 492 | 493 | '@shikijs/vscode-textmate@10.0.2': 494 | resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} 495 | 496 | '@textlint/ast-node-types@15.5.0': 497 | resolution: {integrity: sha512-K0LEuuTo4rza8yDrlYkRdXLao8Iz/QBMsQdIxRrOOrLYb4HAtZaypZ78c+J6rDA1UlGxadZVLmkkiv4KV5fMKQ==} 498 | 499 | '@textlint/ast-node-types@4.4.3': 500 | resolution: {integrity: sha512-qi2jjgO6Tn3KNPGnm6B7p6QTEPvY95NFsIAaJuwbulur8iJUEenp1OnoUfiDaC/g2WPPEFkcfXpmnu8XEMFo2A==} 501 | 502 | '@textlint/ast-tester@15.5.0': 503 | resolution: {integrity: sha512-G/DhhuRETUVzRiZw2joZrEG52j2Lq9hY//ohVvxcFva9BI+NqYe4wyqg93QXYYg4jPDEgjX8yQ3CvdOlLvQvmA==} 504 | 505 | '@textlint/ast-traverse@15.5.0': 506 | resolution: {integrity: sha512-6icSA4t/rXuPtddaHGKPfSYTs6mNzrI3Up0n5Xm0dr3CIUL8sUlidhPDEN9fUQ2Gpy31enV+ftQeVcKdrbsR9Q==} 507 | 508 | '@textlint/config-loader@15.5.0': 509 | resolution: {integrity: sha512-JJH21QhL2KwaJblD2reDamC2xnLrIwkgv3uUkE3ZhmXbD2ruFKLas2egTXqKn1JPt5hlaGRtWwuOH7viFpTukA==} 510 | 511 | '@textlint/feature-flag@15.5.0': 512 | resolution: {integrity: sha512-MhoLoR6M8w2BtCc07H2R19i8ydtsr6+40u41u7Lc2ryBufjrTv5d/Uq4l/xniesRR4tm3x4HrM4HeeqY1RTiQA==} 513 | 514 | '@textlint/fixer-formatter@15.5.0': 515 | resolution: {integrity: sha512-iuG9mf5tl4PKWrpA0Coo14/OYCLc3ORFg3JZYaaAT97j4KQuRvKYJjMTKX5ygngbzamZvH32Ep6bCjfoLBF4fQ==} 516 | 517 | '@textlint/kernel@15.5.0': 518 | resolution: {integrity: sha512-xaq4H4wWd43zekWGXrf5OpmYCoExwLl0BxRySdbm0gtVFh6xPHd4uqjCrd+K2nZYuLw4hCdEMtGzQY4Kip5sdA==} 519 | 520 | '@textlint/linter-formatter@15.5.0': 521 | resolution: {integrity: sha512-DPTm2+VXKID41qKQWagg/4JynM6hEEpvbq0PlGsEoC4Xm7IqXIxFym3mSf5+ued0cuiIV1hR9kgXjqGdP035tw==} 522 | 523 | '@textlint/markdown-to-ast@15.5.0': 524 | resolution: {integrity: sha512-tZ+2nFT+kBx53Zk876e4fhNBrpIrgNBHWEMKLLxcOoQxxtrSVvghaCm0vjcGTUPrT6B2Sx2yxB35hMmBJy74Rg==} 525 | 526 | '@textlint/module-interop@15.5.0': 527 | resolution: {integrity: sha512-rqfouEhBEgZlR9umswWXXRBcmmSM28Trpr9b0duzgehKYVc7wSQCuQMagr6YBJa2NRMfRNinupusbJXMg0ij2A==} 528 | 529 | '@textlint/regexp-string-matcher@2.0.2': 530 | resolution: {integrity: sha512-OXLD9XRxMhd3S0LWuPHpiARQOI7z9tCOs0FsynccW2lmyZzHHFJ9/eR6kuK9xF459Qf+740qI5h+/0cx+NljzA==} 531 | 532 | '@textlint/resolver@15.5.0': 533 | resolution: {integrity: sha512-kK5nFbg5N3kVoZExQI/dnYjCInmTltvXDnuCRrBxHI01i6kO/o8R7Lc2aFkAZ6/NUZuRPalkyDdwZJke4/R2wg==} 534 | 535 | '@textlint/source-code-fixer@15.5.0': 536 | resolution: {integrity: sha512-z08omVKoHJ22qrG1tnrWtc2/m9XqsRMy4aNqyhSieMYkzVASFjLGf71xs8fdr5pcQ5xC+zGIT2MCQzTwzRSvsg==} 537 | 538 | '@textlint/text-to-ast@15.5.0': 539 | resolution: {integrity: sha512-j4U6Rsc+3ejjuejuWJTXbdYtq6yW/PCTRHJTt8718smJ8KfdS4rqTYR1kbnjU4w4OH0u6UVUigcpKlEmnbzr2g==} 540 | 541 | '@textlint/textlint-plugin-markdown@15.5.0': 542 | resolution: {integrity: sha512-1V5e8+dqs+TyBms/Cefa8ZQxZ2FZTDm6BBqpr/Y5xpmlzks3QVT8AbM0WZi8IeP1XNTLnTxXyr6ASFckMb9+vw==} 543 | 544 | '@textlint/textlint-plugin-text@15.5.0': 545 | resolution: {integrity: sha512-gcyagsQIB/D1YiPGA+RD0iUTPz10lpCdYUxRdPswsv4zY5BPathOkwFldbc4fdcX3ZveLgg/k8brjUT1wPKLZw==} 546 | 547 | '@textlint/types@15.5.0': 548 | resolution: {integrity: sha512-EjAPbuA+3NyQ9WyFP7iUlddi35F3mGrf4tb4cZM0nWywbtEJ3+XAYqL+5RsF0qFeSguxGir09NdZOWrG9wVOUQ==} 549 | 550 | '@textlint/utils@15.5.0': 551 | resolution: {integrity: sha512-r6IybQjfeAUKT2kMjsoSX7Z3eqGjBhJ6bucWt6JGMclfmrOmr9W8Xctm3lBgP12U2lEJs4kKlUh7npU44gHTlw==} 552 | 553 | '@types/estree@1.0.8': 554 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 555 | 556 | '@types/hast@3.0.4': 557 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 558 | 559 | '@types/linkify-it@5.0.0': 560 | resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} 561 | 562 | '@types/markdown-it@14.1.2': 563 | resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} 564 | 565 | '@types/mdast@3.0.15': 566 | resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} 567 | 568 | '@types/mdast@4.0.4': 569 | resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 570 | 571 | '@types/mdurl@2.0.0': 572 | resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} 573 | 574 | '@types/normalize-package-data@2.4.4': 575 | resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} 576 | 577 | '@types/unist@2.0.11': 578 | resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} 579 | 580 | '@types/unist@3.0.3': 581 | resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 582 | 583 | '@types/web-bluetooth@0.0.21': 584 | resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} 585 | 586 | '@ungap/structured-clone@1.3.0': 587 | resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 588 | 589 | '@vitejs/plugin-vue@5.2.4': 590 | resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} 591 | engines: {node: ^18.0.0 || >=20.0.0} 592 | peerDependencies: 593 | vite: ^5.0.0 || ^6.0.0 594 | vue: ^3.2.25 595 | 596 | '@vue/compiler-core@3.5.25': 597 | resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==} 598 | 599 | '@vue/compiler-dom@3.5.25': 600 | resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==} 601 | 602 | '@vue/compiler-sfc@3.5.25': 603 | resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==} 604 | 605 | '@vue/compiler-ssr@3.5.25': 606 | resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==} 607 | 608 | '@vue/devtools-api@7.7.9': 609 | resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} 610 | 611 | '@vue/devtools-kit@7.7.9': 612 | resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} 613 | 614 | '@vue/devtools-shared@7.7.9': 615 | resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} 616 | 617 | '@vue/reactivity@3.5.25': 618 | resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==} 619 | 620 | '@vue/runtime-core@3.5.25': 621 | resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==} 622 | 623 | '@vue/runtime-dom@3.5.25': 624 | resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==} 625 | 626 | '@vue/server-renderer@3.5.25': 627 | resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==} 628 | peerDependencies: 629 | vue: 3.5.25 630 | 631 | '@vue/shared@3.5.25': 632 | resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==} 633 | 634 | '@vueuse/core@12.8.2': 635 | resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} 636 | 637 | '@vueuse/integrations@12.8.2': 638 | resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} 639 | peerDependencies: 640 | async-validator: ^4 641 | axios: ^1 642 | change-case: ^5 643 | drauu: ^0.4 644 | focus-trap: ^7 645 | fuse.js: ^7 646 | idb-keyval: ^6 647 | jwt-decode: ^4 648 | nprogress: ^0.2 649 | qrcode: ^1.5 650 | sortablejs: ^1 651 | universal-cookie: ^7 652 | peerDependenciesMeta: 653 | async-validator: 654 | optional: true 655 | axios: 656 | optional: true 657 | change-case: 658 | optional: true 659 | drauu: 660 | optional: true 661 | focus-trap: 662 | optional: true 663 | fuse.js: 664 | optional: true 665 | idb-keyval: 666 | optional: true 667 | jwt-decode: 668 | optional: true 669 | nprogress: 670 | optional: true 671 | qrcode: 672 | optional: true 673 | sortablejs: 674 | optional: true 675 | universal-cookie: 676 | optional: true 677 | 678 | '@vueuse/metadata@12.8.2': 679 | resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} 680 | 681 | '@vueuse/shared@12.8.2': 682 | resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} 683 | 684 | accepts@2.0.0: 685 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 686 | engines: {node: '>= 0.6'} 687 | 688 | ajv-formats@3.0.1: 689 | resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} 690 | peerDependencies: 691 | ajv: ^8.0.0 692 | peerDependenciesMeta: 693 | ajv: 694 | optional: true 695 | 696 | ajv@8.17.1: 697 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 698 | 699 | algoliasearch@5.46.0: 700 | resolution: {integrity: sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==} 701 | engines: {node: '>= 14.0.0'} 702 | 703 | ansi-regex@5.0.1: 704 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 705 | engines: {node: '>=8'} 706 | 707 | ansi-regex@6.2.2: 708 | resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} 709 | engines: {node: '>=12'} 710 | 711 | ansi-styles@4.3.0: 712 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 713 | engines: {node: '>=8'} 714 | 715 | ansi-styles@6.2.3: 716 | resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} 717 | engines: {node: '>=12'} 718 | 719 | argparse@2.0.1: 720 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 721 | 722 | astral-regex@2.0.0: 723 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 724 | engines: {node: '>=8'} 725 | 726 | bail@1.0.5: 727 | resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} 728 | 729 | balanced-match@1.0.2: 730 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 731 | 732 | birpc@2.9.0: 733 | resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} 734 | 735 | body-parser@2.2.1: 736 | resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} 737 | engines: {node: '>=18'} 738 | 739 | boundary@1.0.1: 740 | resolution: {integrity: sha512-AaLhxHwYVh55iOTJncV3DE5o7RakEUSSj64XXEWRTiIhlp7aDI8qR0vY/k8Uw0Z234VjZi/iG/WxfrvqYPUCww==} 741 | 742 | boundary@2.0.0: 743 | resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} 744 | 745 | brace-expansion@2.0.2: 746 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 747 | 748 | buffer-from@1.1.2: 749 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 750 | 751 | bytes@3.1.2: 752 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 753 | engines: {node: '>= 0.8'} 754 | 755 | cacheable@2.3.0: 756 | resolution: {integrity: sha512-HHiAvOBmlcR2f3SQ7kdlYD8+AUJG+wlFZ/Ze8tl1Vzvz0MdOh8IYA/EFU4ve8t1/sZ0j4MGi7ST5MoTwHessQA==} 757 | 758 | ccount@1.1.0: 759 | resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} 760 | 761 | ccount@2.0.1: 762 | resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 763 | 764 | chalk@4.1.2: 765 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 766 | engines: {node: '>=10'} 767 | 768 | character-entities-html4@2.1.0: 769 | resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 770 | 771 | character-entities-legacy@1.1.4: 772 | resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} 773 | 774 | character-entities-legacy@3.0.0: 775 | resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 776 | 777 | character-entities@1.2.4: 778 | resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} 779 | 780 | character-reference-invalid@1.1.4: 781 | resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} 782 | 783 | charenc@0.0.2: 784 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 785 | 786 | cities-list@1.0.3: 787 | resolution: {integrity: sha512-UadgzcZiV38TvJXlGymITRvvxaR5PtlrS2M+RJICyvRNp3TnOCPA/5ZZuRn8yG6SexKy1x9I+IwFctZ39XbI/Q==} 788 | 789 | color-convert@2.0.1: 790 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 791 | engines: {node: '>=7.0.0'} 792 | 793 | color-name@1.1.4: 794 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 795 | 796 | comma-separated-tokens@2.0.3: 797 | resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 798 | 799 | concat-stream@2.0.0: 800 | resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} 801 | engines: {'0': node >= 6.0} 802 | 803 | content-disposition@1.0.1: 804 | resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} 805 | engines: {node: '>=18'} 806 | 807 | content-type@1.0.5: 808 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 809 | engines: {node: '>= 0.6'} 810 | 811 | cookie-signature@1.2.2: 812 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 813 | engines: {node: '>=6.6.0'} 814 | 815 | cookie@0.7.2: 816 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 817 | engines: {node: '>= 0.6'} 818 | 819 | copy-anything@4.0.5: 820 | resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} 821 | engines: {node: '>=18'} 822 | 823 | cors@2.8.5: 824 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 825 | engines: {node: '>= 0.10'} 826 | 827 | cross-spawn@7.0.6: 828 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 829 | engines: {node: '>= 8'} 830 | 831 | crypt@0.0.2: 832 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 833 | 834 | csstype@3.2.3: 835 | resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} 836 | 837 | debug@4.4.3: 838 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 839 | engines: {node: '>=6.0'} 840 | peerDependencies: 841 | supports-color: '*' 842 | peerDependenciesMeta: 843 | supports-color: 844 | optional: true 845 | 846 | deep-is@0.1.4: 847 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 848 | 849 | depd@2.0.0: 850 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 851 | engines: {node: '>= 0.8'} 852 | 853 | dequal@2.0.3: 854 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 855 | engines: {node: '>=6'} 856 | 857 | devlop@1.1.0: 858 | resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 859 | 860 | diff@5.2.0: 861 | resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} 862 | engines: {node: '>=0.3.1'} 863 | 864 | eastasianwidth@0.2.0: 865 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 866 | 867 | ee-first@1.1.1: 868 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 869 | 870 | emoji-regex-xs@1.0.0: 871 | resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} 872 | 873 | emoji-regex@8.0.0: 874 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 875 | 876 | emoji-regex@9.2.2: 877 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 878 | 879 | en-inflectors@1.0.12: 880 | resolution: {integrity: sha512-G9wwJMx9DQQzwom8J8e8ErVpI6h/Z5BpYusJCE2Q/2NfgBNYCesyNaCOOskZAhOrw2nmR4D8nYAv4Xv/INIbzw==} 881 | 882 | en-lexicon@1.0.11: 883 | resolution: {integrity: sha512-eanOw9551H6jMRpRK023+Nlss5qnuAi99drXcSUzQySsMrB43teDNbin/AbpOfnemQiTtuZChXYm2kEIR1Mhmg==} 884 | 885 | en-pos@1.0.16: 886 | resolution: {integrity: sha512-b/tYA8NNl2fuXn55deB81RwW6S9bJqgYjNMVmltUZxT1JZEzNsWvkZpKiXfOe4RlsB2t5O3s1B/BgnXDOAO1Zw==} 887 | 888 | en-stemmer@1.0.3: 889 | resolution: {integrity: sha512-sBeYsHLqZWACn/mTRLAMdYb/A53s55r4/nCB2UjKK96EBuRQ4t4GKl4V1pW/0hvzdncfYlZRT+JSIRxCtoYqbA==} 890 | 891 | encodeurl@2.0.0: 892 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 893 | engines: {node: '>= 0.8'} 894 | 895 | entities@4.5.0: 896 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 897 | engines: {node: '>=0.12'} 898 | 899 | esbuild@0.21.5: 900 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 901 | engines: {node: '>=12'} 902 | hasBin: true 903 | 904 | escape-html@1.0.3: 905 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 906 | 907 | escape-string-regexp@4.0.0: 908 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 909 | engines: {node: '>=10'} 910 | 911 | estree-walker@2.0.2: 912 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 913 | 914 | etag@1.8.1: 915 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 916 | engines: {node: '>= 0.6'} 917 | 918 | eventsource-parser@3.0.6: 919 | resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} 920 | engines: {node: '>=18.0.0'} 921 | 922 | eventsource@3.0.7: 923 | resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} 924 | engines: {node: '>=18.0.0'} 925 | 926 | express-rate-limit@7.5.1: 927 | resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} 928 | engines: {node: '>= 16'} 929 | peerDependencies: 930 | express: '>= 4.11' 931 | 932 | express@5.2.1: 933 | resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} 934 | engines: {node: '>= 18'} 935 | 936 | extend@3.0.2: 937 | resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 938 | 939 | fast-deep-equal@3.1.3: 940 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 941 | 942 | fast-equals@4.0.3: 943 | resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} 944 | 945 | fast-levenshtein@2.0.6: 946 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 947 | 948 | fast-uri@3.1.0: 949 | resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} 950 | 951 | fault@1.0.4: 952 | resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} 953 | 954 | file-entry-cache@10.1.4: 955 | resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} 956 | 957 | finalhandler@2.1.1: 958 | resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} 959 | engines: {node: '>= 18.0.0'} 960 | 961 | find-up-simple@1.0.1: 962 | resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} 963 | engines: {node: '>=18'} 964 | 965 | flat-cache@6.1.19: 966 | resolution: {integrity: sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==} 967 | 968 | flatted@3.3.3: 969 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 970 | 971 | focus-trap@7.6.6: 972 | resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==} 973 | 974 | foreground-child@3.3.1: 975 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 976 | engines: {node: '>=14'} 977 | 978 | format@0.2.2: 979 | resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} 980 | engines: {node: '>=0.4.x'} 981 | 982 | forwarded@0.2.0: 983 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 984 | engines: {node: '>= 0.6'} 985 | 986 | fresh@2.0.0: 987 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 988 | engines: {node: '>= 0.8'} 989 | 990 | fsevents@2.3.3: 991 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 992 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 993 | os: [darwin] 994 | 995 | glob@10.5.0: 996 | resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} 997 | hasBin: true 998 | 999 | has-flag@4.0.0: 1000 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1001 | engines: {node: '>=8'} 1002 | 1003 | hashery@1.3.0: 1004 | resolution: {integrity: sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==} 1005 | engines: {node: '>=20'} 1006 | 1007 | hast-util-to-html@9.0.5: 1008 | resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} 1009 | 1010 | hast-util-whitespace@3.0.0: 1011 | resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 1012 | 1013 | hookable@5.5.3: 1014 | resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} 1015 | 1016 | hookified@1.14.0: 1017 | resolution: {integrity: sha512-pi1ynXIMFx/uIIwpWJ/5CEtOHLGtnUB0WhGeeYT+fKcQ+WCQbm3/rrkAXnpfph++PgepNqPdTC2WTj8A6k6zoQ==} 1018 | 1019 | hosted-git-info@7.0.2: 1020 | resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} 1021 | engines: {node: ^16.14.0 || >=18.0.0} 1022 | 1023 | html-void-elements@3.0.0: 1024 | resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 1025 | 1026 | http-errors@2.0.1: 1027 | resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} 1028 | engines: {node: '>= 0.8'} 1029 | 1030 | humannames@1.0.5: 1031 | resolution: {integrity: sha512-FArOOhsfu1Rzc6wj8TZWTEpO/+TQOqhU0YNx+IyRaScE7HVanOwn8knN1OjjUngJOLaRqFSLjX0EzvMiNnT7zw==} 1032 | 1033 | iconv-lite@0.7.0: 1034 | resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} 1035 | engines: {node: '>=0.10.0'} 1036 | 1037 | index-to-position@1.2.0: 1038 | resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} 1039 | engines: {node: '>=18'} 1040 | 1041 | inherits@2.0.4: 1042 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1043 | 1044 | ipaddr.js@1.9.1: 1045 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1046 | engines: {node: '>= 0.10'} 1047 | 1048 | is-alphabetical@1.0.4: 1049 | resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} 1050 | 1051 | is-alphanumerical@1.0.4: 1052 | resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} 1053 | 1054 | is-buffer@1.1.6: 1055 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 1056 | 1057 | is-buffer@2.0.5: 1058 | resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} 1059 | engines: {node: '>=4'} 1060 | 1061 | is-decimal@1.0.4: 1062 | resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} 1063 | 1064 | is-fullwidth-code-point@3.0.0: 1065 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1066 | engines: {node: '>=8'} 1067 | 1068 | is-hexadecimal@1.0.4: 1069 | resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} 1070 | 1071 | is-plain-obj@2.1.0: 1072 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 1073 | engines: {node: '>=8'} 1074 | 1075 | is-promise@4.0.0: 1076 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 1077 | 1078 | is-what@5.5.0: 1079 | resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} 1080 | engines: {node: '>=18'} 1081 | 1082 | isexe@2.0.0: 1083 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1084 | 1085 | jackspeak@3.4.3: 1086 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1087 | 1088 | jose@6.1.3: 1089 | resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} 1090 | 1091 | js-tokens@4.0.0: 1092 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1093 | 1094 | js-yaml@4.1.1: 1095 | resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 1096 | hasBin: true 1097 | 1098 | json-schema-traverse@1.0.0: 1099 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1100 | 1101 | json5@2.2.3: 1102 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1103 | engines: {node: '>=6'} 1104 | hasBin: true 1105 | 1106 | keyv@5.5.5: 1107 | resolution: {integrity: sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==} 1108 | 1109 | levn@0.4.1: 1110 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1111 | engines: {node: '>= 0.8.0'} 1112 | 1113 | lodash.sortby@4.7.0: 1114 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 1115 | 1116 | lodash.truncate@4.4.2: 1117 | resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} 1118 | 1119 | lodash.uniq@4.5.0: 1120 | resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} 1121 | 1122 | lodash.uniqwith@4.5.0: 1123 | resolution: {integrity: sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==} 1124 | 1125 | lodash@4.17.21: 1126 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1127 | 1128 | longest-streak@2.0.4: 1129 | resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} 1130 | 1131 | lru-cache@10.4.3: 1132 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1133 | 1134 | magic-string@0.30.21: 1135 | resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1136 | 1137 | mark.js@8.11.1: 1138 | resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} 1139 | 1140 | markdown-table@2.0.0: 1141 | resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} 1142 | 1143 | match-index@1.0.3: 1144 | resolution: {integrity: sha512-1XjyBWqCvEFFUDW/MPv0RwbITRD4xQXOvKoPYtLDq8IdZTfdF/cQSo5Yn4qvhfSSZgjgkTFsqJD2wOUG4ovV8Q==} 1145 | 1146 | md5@2.3.0: 1147 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 1148 | 1149 | mdast-util-find-and-replace@1.1.1: 1150 | resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} 1151 | 1152 | mdast-util-footnote@0.1.7: 1153 | resolution: {integrity: sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==} 1154 | 1155 | mdast-util-from-markdown@0.8.5: 1156 | resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} 1157 | 1158 | mdast-util-frontmatter@0.2.0: 1159 | resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} 1160 | 1161 | mdast-util-gfm-autolink-literal@0.1.3: 1162 | resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} 1163 | 1164 | mdast-util-gfm-strikethrough@0.2.3: 1165 | resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} 1166 | 1167 | mdast-util-gfm-table@0.1.6: 1168 | resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} 1169 | 1170 | mdast-util-gfm-task-list-item@0.1.6: 1171 | resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} 1172 | 1173 | mdast-util-gfm@0.1.2: 1174 | resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} 1175 | 1176 | mdast-util-to-hast@13.2.1: 1177 | resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} 1178 | 1179 | mdast-util-to-markdown@0.6.5: 1180 | resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} 1181 | 1182 | mdast-util-to-string@2.0.0: 1183 | resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} 1184 | 1185 | media-typer@1.1.0: 1186 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 1187 | engines: {node: '>= 0.8'} 1188 | 1189 | merge-descriptors@2.0.0: 1190 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 1191 | engines: {node: '>=18'} 1192 | 1193 | micromark-extension-footnote@0.3.2: 1194 | resolution: {integrity: sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==} 1195 | 1196 | micromark-extension-frontmatter@0.2.2: 1197 | resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} 1198 | 1199 | micromark-extension-gfm-autolink-literal@0.5.7: 1200 | resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} 1201 | 1202 | micromark-extension-gfm-strikethrough@0.6.5: 1203 | resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} 1204 | 1205 | micromark-extension-gfm-table@0.4.3: 1206 | resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} 1207 | 1208 | micromark-extension-gfm-tagfilter@0.3.0: 1209 | resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} 1210 | 1211 | micromark-extension-gfm-task-list-item@0.3.3: 1212 | resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} 1213 | 1214 | micromark-extension-gfm@0.3.3: 1215 | resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} 1216 | 1217 | micromark-util-character@2.1.1: 1218 | resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 1219 | 1220 | micromark-util-encode@2.0.1: 1221 | resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 1222 | 1223 | micromark-util-sanitize-uri@2.0.1: 1224 | resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 1225 | 1226 | micromark-util-symbol@2.0.1: 1227 | resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 1228 | 1229 | micromark-util-types@2.0.2: 1230 | resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 1231 | 1232 | micromark@2.11.4: 1233 | resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} 1234 | 1235 | mime-db@1.54.0: 1236 | resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} 1237 | engines: {node: '>= 0.6'} 1238 | 1239 | mime-types@3.0.2: 1240 | resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} 1241 | engines: {node: '>=18'} 1242 | 1243 | minimatch@9.0.5: 1244 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1245 | engines: {node: '>=16 || 14 >=14.17'} 1246 | 1247 | minipass@7.1.2: 1248 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1249 | engines: {node: '>=16 || 14 >=14.17'} 1250 | 1251 | minisearch@7.2.0: 1252 | resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} 1253 | 1254 | mitt@3.0.1: 1255 | resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} 1256 | 1257 | ms@2.1.3: 1258 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1259 | 1260 | nanoid@3.3.11: 1261 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1262 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1263 | hasBin: true 1264 | 1265 | negotiator@1.0.0: 1266 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 1267 | engines: {node: '>= 0.6'} 1268 | 1269 | neotraverse@0.6.18: 1270 | resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} 1271 | engines: {node: '>= 10'} 1272 | 1273 | normalize-package-data@6.0.2: 1274 | resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} 1275 | engines: {node: ^16.14.0 || >=18.0.0} 1276 | 1277 | object-assign@4.1.1: 1278 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1279 | engines: {node: '>=0.10.0'} 1280 | 1281 | object_values@0.1.2: 1282 | resolution: {integrity: sha512-tZgUiKLraVH+4OAedBYrr4/K6KmAQw2RPNd1AuNdhLsuz5WP3VB7WuiKBWbOcjeqqAjus2ChIIWC8dSfmg7ReA==} 1283 | 1284 | on-finished@2.4.1: 1285 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1286 | engines: {node: '>= 0.8'} 1287 | 1288 | once@1.4.0: 1289 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1290 | 1291 | oniguruma-to-es@3.1.1: 1292 | resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} 1293 | 1294 | optionator@0.9.4: 1295 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1296 | engines: {node: '>= 0.8.0'} 1297 | 1298 | package-json-from-dist@1.0.1: 1299 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1300 | 1301 | parse-entities@2.0.0: 1302 | resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} 1303 | 1304 | parse-json@8.3.0: 1305 | resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} 1306 | engines: {node: '>=18'} 1307 | 1308 | parseurl@1.3.3: 1309 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1310 | engines: {node: '>= 0.8'} 1311 | 1312 | path-key@3.1.1: 1313 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1314 | engines: {node: '>=8'} 1315 | 1316 | path-scurry@1.11.1: 1317 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1318 | engines: {node: '>=16 || 14 >=14.18'} 1319 | 1320 | path-to-glob-pattern@2.0.1: 1321 | resolution: {integrity: sha512-tmciSlVyHnX0LC86+zSr+0LURw9rDPw8ilhXcmTpVUOnI6OsKdCzXQs5fTG10Bjz26IBdnKL3XIaP+QvGsk5YQ==} 1322 | 1323 | path-to-regexp@8.3.0: 1324 | resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} 1325 | 1326 | perfect-debounce@1.0.0: 1327 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 1328 | 1329 | picocolors@1.1.1: 1330 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1331 | 1332 | pkce-challenge@5.0.1: 1333 | resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} 1334 | engines: {node: '>=16.20.0'} 1335 | 1336 | pluralize@2.0.0: 1337 | resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} 1338 | 1339 | postcss@8.5.6: 1340 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1341 | engines: {node: ^10 || ^12 || >=14} 1342 | 1343 | preact@10.28.0: 1344 | resolution: {integrity: sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==} 1345 | 1346 | prelude-ls@1.2.1: 1347 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1348 | engines: {node: '>= 0.8.0'} 1349 | 1350 | property-information@7.1.0: 1351 | resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} 1352 | 1353 | proxy-addr@2.0.7: 1354 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1355 | engines: {node: '>= 0.10'} 1356 | 1357 | qified@0.5.3: 1358 | resolution: {integrity: sha512-kXuQdQTB6oN3KhI6V4acnBSZx8D2I4xzZvn9+wFLLFCoBNQY/sFnCW6c43OL7pOQ2HvGV4lnWIXNmgfp7cTWhQ==} 1359 | engines: {node: '>=20'} 1360 | 1361 | qs@6.14.0: 1362 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 1363 | engines: {node: '>=0.6'} 1364 | 1365 | range-parser@1.2.1: 1366 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1367 | engines: {node: '>= 0.6'} 1368 | 1369 | raw-body@3.0.2: 1370 | resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} 1371 | engines: {node: '>= 0.10'} 1372 | 1373 | rc-config-loader@4.1.3: 1374 | resolution: {integrity: sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==} 1375 | 1376 | read-package-up@11.0.0: 1377 | resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} 1378 | engines: {node: '>=18'} 1379 | 1380 | read-pkg@9.0.1: 1381 | resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} 1382 | engines: {node: '>=18'} 1383 | 1384 | readable-stream@3.6.2: 1385 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1386 | engines: {node: '>= 6'} 1387 | 1388 | regex-recursion@6.0.2: 1389 | resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} 1390 | 1391 | regex-utilities@2.3.0: 1392 | resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} 1393 | 1394 | regex@6.1.0: 1395 | resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} 1396 | 1397 | remark-footnotes@3.0.0: 1398 | resolution: {integrity: sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==} 1399 | 1400 | remark-frontmatter@3.0.0: 1401 | resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} 1402 | 1403 | remark-gfm@1.0.0: 1404 | resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} 1405 | 1406 | remark-parse@9.0.0: 1407 | resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} 1408 | 1409 | repeat-string@1.6.1: 1410 | resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} 1411 | engines: {node: '>=0.10'} 1412 | 1413 | require-from-string@2.0.2: 1414 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1415 | engines: {node: '>=0.10.0'} 1416 | 1417 | rfdc@1.4.1: 1418 | resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 1419 | 1420 | rollup@4.53.3: 1421 | resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} 1422 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1423 | hasBin: true 1424 | 1425 | router@2.2.0: 1426 | resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} 1427 | engines: {node: '>= 18'} 1428 | 1429 | search-insights@2.17.3: 1430 | resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} 1431 | 1432 | semver@7.7.3: 1433 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1434 | engines: {node: '>=10'} 1435 | hasBin: true 1436 | 1437 | send@1.2.0: 1438 | resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} 1439 | engines: {node: '>= 18'} 1440 | 1441 | sentence-splitter@3.2.3: 1442 | resolution: {integrity: sha512-eDqaz4MasTn6Mp3dagKzIbiNsJpgpueMEQqCJeN9F9XQRFLDGFJ0kX8R3uMp+mU7J58dWjr4q6eks/nUX/vnJQ==} 1443 | hasBin: true 1444 | 1445 | serve-static@2.2.0: 1446 | resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} 1447 | engines: {node: '>= 18'} 1448 | 1449 | setprototypeof@1.2.0: 1450 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1451 | 1452 | shebang-command@2.0.0: 1453 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1454 | engines: {node: '>=8'} 1455 | 1456 | shebang-regex@3.0.0: 1457 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1458 | engines: {node: '>=8'} 1459 | 1460 | shiki@2.5.0: 1461 | resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} 1462 | 1463 | signal-exit@4.1.0: 1464 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1465 | engines: {node: '>=14'} 1466 | 1467 | slice-ansi@4.0.0: 1468 | resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} 1469 | engines: {node: '>=10'} 1470 | 1471 | source-map-js@1.2.1: 1472 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1473 | engines: {node: '>=0.10.0'} 1474 | 1475 | space-separated-tokens@2.0.2: 1476 | resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 1477 | 1478 | spdx-correct@3.2.0: 1479 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1480 | 1481 | spdx-exceptions@2.5.0: 1482 | resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} 1483 | 1484 | spdx-expression-parse@3.0.1: 1485 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1486 | 1487 | spdx-license-ids@3.0.22: 1488 | resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} 1489 | 1490 | speakingurl@14.0.1: 1491 | resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} 1492 | engines: {node: '>=0.10.0'} 1493 | 1494 | statuses@2.0.2: 1495 | resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} 1496 | engines: {node: '>= 0.8'} 1497 | 1498 | string-width@4.2.3: 1499 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1500 | engines: {node: '>=8'} 1501 | 1502 | string-width@5.1.2: 1503 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1504 | engines: {node: '>=12'} 1505 | 1506 | string_decoder@1.3.0: 1507 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1508 | 1509 | stringify-entities@4.0.4: 1510 | resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 1511 | 1512 | strip-ansi@6.0.1: 1513 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1514 | engines: {node: '>=8'} 1515 | 1516 | strip-ansi@7.1.2: 1517 | resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} 1518 | engines: {node: '>=12'} 1519 | 1520 | structured-source@3.0.2: 1521 | resolution: {integrity: sha512-Ap7JHfKgmH40SUjumqyKTHYHNZ8GvGQskP34ks0ElHCDEig+bYGpmXVksxPSrgcY9rkJqhVMzfeg5GIpZelfpQ==} 1522 | 1523 | structured-source@4.0.0: 1524 | resolution: {integrity: sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==} 1525 | 1526 | superjson@2.2.6: 1527 | resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} 1528 | engines: {node: '>=16'} 1529 | 1530 | supports-color@7.2.0: 1531 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1532 | engines: {node: '>=8'} 1533 | 1534 | tabbable@6.3.0: 1535 | resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} 1536 | 1537 | table@6.9.0: 1538 | resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} 1539 | engines: {node: '>=10.0.0'} 1540 | 1541 | text-table@0.2.0: 1542 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1543 | 1544 | textlint-rule-en-capitalization@2.0.3: 1545 | resolution: {integrity: sha512-tIx2gzm3okWfK5+0NNV1ap21LHk9PTc2/IXNqFhd7RDVSqv7YFaZnhwL+UrBZXTEfOh6VgnTQd81Os2Akzas5g==} 1546 | 1547 | textlint-rule-helper@2.5.0: 1548 | resolution: {integrity: sha512-QIbFPtyqLy0g5BJn8mryk9iHzGYicNaFIpLFPiEnb4RXxrEGeQ2W2aARQ9yEXLIAqo+OwK4ndWBAWkbgJEPzTQ==} 1549 | 1550 | textlint-rule-ja-space-between-half-and-full-width@2.4.2: 1551 | resolution: {integrity: sha512-GqwSy0ivm4Q5Bok9LaOwfg+H1auLRMoMi2aY/7aSIrgvX/RD5aZ2Rk2lm3TTX42mR1UrQu8GDqktUEZfvQ913w==} 1552 | 1553 | textlint@15.5.0: 1554 | resolution: {integrity: sha512-CpdpwEKSewYMpKeoSFbMqTxKsyqjbJqPg+O3EUj0IsK3Lt+YD17mT3Rm7ryuHSbFB7Qw2EIdCx8Sjh+zfx7Heg==} 1555 | engines: {node: '>=20.0.0'} 1556 | hasBin: true 1557 | 1558 | toidentifier@1.0.1: 1559 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1560 | engines: {node: '>=0.6'} 1561 | 1562 | trim-lines@3.0.1: 1563 | resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 1564 | 1565 | trough@1.0.5: 1566 | resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} 1567 | 1568 | type-check@0.4.0: 1569 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1570 | engines: {node: '>= 0.8.0'} 1571 | 1572 | type-fest@4.41.0: 1573 | resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 1574 | engines: {node: '>=16'} 1575 | 1576 | type-is@2.0.1: 1577 | resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} 1578 | engines: {node: '>= 0.6'} 1579 | 1580 | unicorn-magic@0.1.0: 1581 | resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} 1582 | engines: {node: '>=18'} 1583 | 1584 | unified@9.2.2: 1585 | resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} 1586 | 1587 | unist-util-is@4.1.0: 1588 | resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} 1589 | 1590 | unist-util-is@6.0.1: 1591 | resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} 1592 | 1593 | unist-util-position@5.0.0: 1594 | resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 1595 | 1596 | unist-util-stringify-position@2.0.3: 1597 | resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} 1598 | 1599 | unist-util-stringify-position@4.0.0: 1600 | resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 1601 | 1602 | unist-util-visit-parents@3.1.1: 1603 | resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} 1604 | 1605 | unist-util-visit-parents@6.0.2: 1606 | resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} 1607 | 1608 | unist-util-visit@2.0.3: 1609 | resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} 1610 | 1611 | unist-util-visit@5.0.0: 1612 | resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1613 | 1614 | unpipe@1.0.0: 1615 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1616 | engines: {node: '>= 0.8'} 1617 | 1618 | util-deprecate@1.0.2: 1619 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1620 | 1621 | validate-npm-package-license@3.0.4: 1622 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1623 | 1624 | vary@1.1.2: 1625 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1626 | engines: {node: '>= 0.8'} 1627 | 1628 | vfile-message@2.0.4: 1629 | resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} 1630 | 1631 | vfile-message@4.0.3: 1632 | resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} 1633 | 1634 | vfile@4.2.1: 1635 | resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} 1636 | 1637 | vfile@6.0.3: 1638 | resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 1639 | 1640 | vite@5.4.21: 1641 | resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} 1642 | engines: {node: ^18.0.0 || >=20.0.0} 1643 | hasBin: true 1644 | peerDependencies: 1645 | '@types/node': ^18.0.0 || >=20.0.0 1646 | less: '*' 1647 | lightningcss: ^1.21.0 1648 | sass: '*' 1649 | sass-embedded: '*' 1650 | stylus: '*' 1651 | sugarss: '*' 1652 | terser: ^5.4.0 1653 | peerDependenciesMeta: 1654 | '@types/node': 1655 | optional: true 1656 | less: 1657 | optional: true 1658 | lightningcss: 1659 | optional: true 1660 | sass: 1661 | optional: true 1662 | sass-embedded: 1663 | optional: true 1664 | stylus: 1665 | optional: true 1666 | sugarss: 1667 | optional: true 1668 | terser: 1669 | optional: true 1670 | 1671 | vitepress@1.6.4: 1672 | resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} 1673 | hasBin: true 1674 | peerDependencies: 1675 | markdown-it-mathjax3: ^4 1676 | postcss: ^8 1677 | peerDependenciesMeta: 1678 | markdown-it-mathjax3: 1679 | optional: true 1680 | postcss: 1681 | optional: true 1682 | 1683 | vue@3.5.25: 1684 | resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==} 1685 | peerDependencies: 1686 | typescript: '*' 1687 | peerDependenciesMeta: 1688 | typescript: 1689 | optional: true 1690 | 1691 | which@2.0.2: 1692 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1693 | engines: {node: '>= 8'} 1694 | hasBin: true 1695 | 1696 | word-wrap@1.2.5: 1697 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1698 | engines: {node: '>=0.10.0'} 1699 | 1700 | wrap-ansi@7.0.0: 1701 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1702 | engines: {node: '>=10'} 1703 | 1704 | wrap-ansi@8.1.0: 1705 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1706 | engines: {node: '>=12'} 1707 | 1708 | wrappy@1.0.2: 1709 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1710 | 1711 | zod-to-json-schema@3.25.0: 1712 | resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} 1713 | peerDependencies: 1714 | zod: ^3.25 || ^4 1715 | 1716 | zod@3.25.76: 1717 | resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 1718 | 1719 | zwitch@1.0.5: 1720 | resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} 1721 | 1722 | zwitch@2.0.4: 1723 | resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 1724 | 1725 | snapshots: 1726 | 1727 | '@algolia/abtesting@1.12.0': 1728 | dependencies: 1729 | '@algolia/client-common': 5.46.0 1730 | '@algolia/requester-browser-xhr': 5.46.0 1731 | '@algolia/requester-fetch': 5.46.0 1732 | '@algolia/requester-node-http': 5.46.0 1733 | 1734 | '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0)(search-insights@2.17.3)': 1735 | dependencies: 1736 | '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0)(search-insights@2.17.3) 1737 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0) 1738 | transitivePeerDependencies: 1739 | - '@algolia/client-search' 1740 | - algoliasearch 1741 | - search-insights 1742 | 1743 | '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0)(search-insights@2.17.3)': 1744 | dependencies: 1745 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0) 1746 | search-insights: 2.17.3 1747 | transitivePeerDependencies: 1748 | - '@algolia/client-search' 1749 | - algoliasearch 1750 | 1751 | '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0)': 1752 | dependencies: 1753 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0) 1754 | '@algolia/client-search': 5.46.0 1755 | algoliasearch: 5.46.0 1756 | 1757 | '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0)': 1758 | dependencies: 1759 | '@algolia/client-search': 5.46.0 1760 | algoliasearch: 5.46.0 1761 | 1762 | '@algolia/client-abtesting@5.46.0': 1763 | dependencies: 1764 | '@algolia/client-common': 5.46.0 1765 | '@algolia/requester-browser-xhr': 5.46.0 1766 | '@algolia/requester-fetch': 5.46.0 1767 | '@algolia/requester-node-http': 5.46.0 1768 | 1769 | '@algolia/client-analytics@5.46.0': 1770 | dependencies: 1771 | '@algolia/client-common': 5.46.0 1772 | '@algolia/requester-browser-xhr': 5.46.0 1773 | '@algolia/requester-fetch': 5.46.0 1774 | '@algolia/requester-node-http': 5.46.0 1775 | 1776 | '@algolia/client-common@5.46.0': {} 1777 | 1778 | '@algolia/client-insights@5.46.0': 1779 | dependencies: 1780 | '@algolia/client-common': 5.46.0 1781 | '@algolia/requester-browser-xhr': 5.46.0 1782 | '@algolia/requester-fetch': 5.46.0 1783 | '@algolia/requester-node-http': 5.46.0 1784 | 1785 | '@algolia/client-personalization@5.46.0': 1786 | dependencies: 1787 | '@algolia/client-common': 5.46.0 1788 | '@algolia/requester-browser-xhr': 5.46.0 1789 | '@algolia/requester-fetch': 5.46.0 1790 | '@algolia/requester-node-http': 5.46.0 1791 | 1792 | '@algolia/client-query-suggestions@5.46.0': 1793 | dependencies: 1794 | '@algolia/client-common': 5.46.0 1795 | '@algolia/requester-browser-xhr': 5.46.0 1796 | '@algolia/requester-fetch': 5.46.0 1797 | '@algolia/requester-node-http': 5.46.0 1798 | 1799 | '@algolia/client-search@5.46.0': 1800 | dependencies: 1801 | '@algolia/client-common': 5.46.0 1802 | '@algolia/requester-browser-xhr': 5.46.0 1803 | '@algolia/requester-fetch': 5.46.0 1804 | '@algolia/requester-node-http': 5.46.0 1805 | 1806 | '@algolia/ingestion@1.46.0': 1807 | dependencies: 1808 | '@algolia/client-common': 5.46.0 1809 | '@algolia/requester-browser-xhr': 5.46.0 1810 | '@algolia/requester-fetch': 5.46.0 1811 | '@algolia/requester-node-http': 5.46.0 1812 | 1813 | '@algolia/monitoring@1.46.0': 1814 | dependencies: 1815 | '@algolia/client-common': 5.46.0 1816 | '@algolia/requester-browser-xhr': 5.46.0 1817 | '@algolia/requester-fetch': 5.46.0 1818 | '@algolia/requester-node-http': 5.46.0 1819 | 1820 | '@algolia/recommend@5.46.0': 1821 | dependencies: 1822 | '@algolia/client-common': 5.46.0 1823 | '@algolia/requester-browser-xhr': 5.46.0 1824 | '@algolia/requester-fetch': 5.46.0 1825 | '@algolia/requester-node-http': 5.46.0 1826 | 1827 | '@algolia/requester-browser-xhr@5.46.0': 1828 | dependencies: 1829 | '@algolia/client-common': 5.46.0 1830 | 1831 | '@algolia/requester-fetch@5.46.0': 1832 | dependencies: 1833 | '@algolia/client-common': 5.46.0 1834 | 1835 | '@algolia/requester-node-http@5.46.0': 1836 | dependencies: 1837 | '@algolia/client-common': 5.46.0 1838 | 1839 | '@azu/format-text@1.0.2': {} 1840 | 1841 | '@azu/style-format@1.0.1': 1842 | dependencies: 1843 | '@azu/format-text': 1.0.2 1844 | 1845 | '@babel/code-frame@7.27.1': 1846 | dependencies: 1847 | '@babel/helper-validator-identifier': 7.28.5 1848 | js-tokens: 4.0.0 1849 | picocolors: 1.1.1 1850 | 1851 | '@babel/helper-string-parser@7.27.1': {} 1852 | 1853 | '@babel/helper-validator-identifier@7.28.5': {} 1854 | 1855 | '@babel/parser@7.28.5': 1856 | dependencies: 1857 | '@babel/types': 7.28.5 1858 | 1859 | '@babel/types@7.28.5': 1860 | dependencies: 1861 | '@babel/helper-string-parser': 7.27.1 1862 | '@babel/helper-validator-identifier': 7.28.5 1863 | 1864 | '@cacheable/memory@2.0.6': 1865 | dependencies: 1866 | '@cacheable/utils': 2.3.2 1867 | '@keyv/bigmap': 1.3.0(keyv@5.5.5) 1868 | hookified: 1.14.0 1869 | keyv: 5.5.5 1870 | 1871 | '@cacheable/utils@2.3.2': 1872 | dependencies: 1873 | hashery: 1.3.0 1874 | keyv: 5.5.5 1875 | 1876 | '@docsearch/css@3.8.2': {} 1877 | 1878 | '@docsearch/js@3.8.2(@algolia/client-search@5.46.0)(search-insights@2.17.3)': 1879 | dependencies: 1880 | '@docsearch/react': 3.8.2(@algolia/client-search@5.46.0)(search-insights@2.17.3) 1881 | preact: 10.28.0 1882 | transitivePeerDependencies: 1883 | - '@algolia/client-search' 1884 | - '@types/react' 1885 | - react 1886 | - react-dom 1887 | - search-insights 1888 | 1889 | '@docsearch/react@3.8.2(@algolia/client-search@5.46.0)(search-insights@2.17.3)': 1890 | dependencies: 1891 | '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0)(search-insights@2.17.3) 1892 | '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.46.0)(algoliasearch@5.46.0) 1893 | '@docsearch/css': 3.8.2 1894 | algoliasearch: 5.46.0 1895 | optionalDependencies: 1896 | search-insights: 2.17.3 1897 | transitivePeerDependencies: 1898 | - '@algolia/client-search' 1899 | 1900 | '@esbuild/aix-ppc64@0.21.5': 1901 | optional: true 1902 | 1903 | '@esbuild/android-arm64@0.21.5': 1904 | optional: true 1905 | 1906 | '@esbuild/android-arm@0.21.5': 1907 | optional: true 1908 | 1909 | '@esbuild/android-x64@0.21.5': 1910 | optional: true 1911 | 1912 | '@esbuild/darwin-arm64@0.21.5': 1913 | optional: true 1914 | 1915 | '@esbuild/darwin-x64@0.21.5': 1916 | optional: true 1917 | 1918 | '@esbuild/freebsd-arm64@0.21.5': 1919 | optional: true 1920 | 1921 | '@esbuild/freebsd-x64@0.21.5': 1922 | optional: true 1923 | 1924 | '@esbuild/linux-arm64@0.21.5': 1925 | optional: true 1926 | 1927 | '@esbuild/linux-arm@0.21.5': 1928 | optional: true 1929 | 1930 | '@esbuild/linux-ia32@0.21.5': 1931 | optional: true 1932 | 1933 | '@esbuild/linux-loong64@0.21.5': 1934 | optional: true 1935 | 1936 | '@esbuild/linux-mips64el@0.21.5': 1937 | optional: true 1938 | 1939 | '@esbuild/linux-ppc64@0.21.5': 1940 | optional: true 1941 | 1942 | '@esbuild/linux-riscv64@0.21.5': 1943 | optional: true 1944 | 1945 | '@esbuild/linux-s390x@0.21.5': 1946 | optional: true 1947 | 1948 | '@esbuild/linux-x64@0.21.5': 1949 | optional: true 1950 | 1951 | '@esbuild/netbsd-x64@0.21.5': 1952 | optional: true 1953 | 1954 | '@esbuild/openbsd-x64@0.21.5': 1955 | optional: true 1956 | 1957 | '@esbuild/sunos-x64@0.21.5': 1958 | optional: true 1959 | 1960 | '@esbuild/win32-arm64@0.21.5': 1961 | optional: true 1962 | 1963 | '@esbuild/win32-ia32@0.21.5': 1964 | optional: true 1965 | 1966 | '@esbuild/win32-x64@0.21.5': 1967 | optional: true 1968 | 1969 | '@iconify-json/simple-icons@1.2.62': 1970 | dependencies: 1971 | '@iconify/types': 2.0.0 1972 | 1973 | '@iconify/types@2.0.0': {} 1974 | 1975 | '@isaacs/cliui@8.0.2': 1976 | dependencies: 1977 | string-width: 5.1.2 1978 | string-width-cjs: string-width@4.2.3 1979 | strip-ansi: 7.1.2 1980 | strip-ansi-cjs: strip-ansi@6.0.1 1981 | wrap-ansi: 8.1.0 1982 | wrap-ansi-cjs: wrap-ansi@7.0.0 1983 | 1984 | '@jridgewell/sourcemap-codec@1.5.5': {} 1985 | 1986 | '@keyv/bigmap@1.3.0(keyv@5.5.5)': 1987 | dependencies: 1988 | hashery: 1.3.0 1989 | hookified: 1.14.0 1990 | keyv: 5.5.5 1991 | 1992 | '@keyv/serialize@1.1.1': {} 1993 | 1994 | '@modelcontextprotocol/sdk@1.24.3(zod@3.25.76)': 1995 | dependencies: 1996 | ajv: 8.17.1 1997 | ajv-formats: 3.0.1(ajv@8.17.1) 1998 | content-type: 1.0.5 1999 | cors: 2.8.5 2000 | cross-spawn: 7.0.6 2001 | eventsource: 3.0.7 2002 | eventsource-parser: 3.0.6 2003 | express: 5.2.1 2004 | express-rate-limit: 7.5.1(express@5.2.1) 2005 | jose: 6.1.3 2006 | pkce-challenge: 5.0.1 2007 | raw-body: 3.0.2 2008 | zod: 3.25.76 2009 | zod-to-json-schema: 3.25.0(zod@3.25.76) 2010 | transitivePeerDependencies: 2011 | - supports-color 2012 | 2013 | '@nolyfill/regexp.prototype.flags@1.0.44': 2014 | dependencies: 2015 | '@nolyfill/shared': 1.0.44 2016 | 2017 | '@nolyfill/safe-buffer@1.0.44': {} 2018 | 2019 | '@nolyfill/safer-buffer@1.0.44': {} 2020 | 2021 | '@nolyfill/shared@1.0.44': {} 2022 | 2023 | '@nolyfill/side-channel@1.0.44': {} 2024 | 2025 | '@nolyfill/typedarray@1.0.44': {} 2026 | 2027 | '@pkgjs/parseargs@0.11.0': 2028 | optional: true 2029 | 2030 | '@rollup/rollup-android-arm-eabi@4.53.3': 2031 | optional: true 2032 | 2033 | '@rollup/rollup-android-arm64@4.53.3': 2034 | optional: true 2035 | 2036 | '@rollup/rollup-darwin-arm64@4.53.3': 2037 | optional: true 2038 | 2039 | '@rollup/rollup-darwin-x64@4.53.3': 2040 | optional: true 2041 | 2042 | '@rollup/rollup-freebsd-arm64@4.53.3': 2043 | optional: true 2044 | 2045 | '@rollup/rollup-freebsd-x64@4.53.3': 2046 | optional: true 2047 | 2048 | '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 2049 | optional: true 2050 | 2051 | '@rollup/rollup-linux-arm-musleabihf@4.53.3': 2052 | optional: true 2053 | 2054 | '@rollup/rollup-linux-arm64-gnu@4.53.3': 2055 | optional: true 2056 | 2057 | '@rollup/rollup-linux-arm64-musl@4.53.3': 2058 | optional: true 2059 | 2060 | '@rollup/rollup-linux-loong64-gnu@4.53.3': 2061 | optional: true 2062 | 2063 | '@rollup/rollup-linux-ppc64-gnu@4.53.3': 2064 | optional: true 2065 | 2066 | '@rollup/rollup-linux-riscv64-gnu@4.53.3': 2067 | optional: true 2068 | 2069 | '@rollup/rollup-linux-riscv64-musl@4.53.3': 2070 | optional: true 2071 | 2072 | '@rollup/rollup-linux-s390x-gnu@4.53.3': 2073 | optional: true 2074 | 2075 | '@rollup/rollup-linux-x64-gnu@4.53.3': 2076 | optional: true 2077 | 2078 | '@rollup/rollup-linux-x64-musl@4.53.3': 2079 | optional: true 2080 | 2081 | '@rollup/rollup-openharmony-arm64@4.53.3': 2082 | optional: true 2083 | 2084 | '@rollup/rollup-win32-arm64-msvc@4.53.3': 2085 | optional: true 2086 | 2087 | '@rollup/rollup-win32-ia32-msvc@4.53.3': 2088 | optional: true 2089 | 2090 | '@rollup/rollup-win32-x64-gnu@4.53.3': 2091 | optional: true 2092 | 2093 | '@rollup/rollup-win32-x64-msvc@4.53.3': 2094 | optional: true 2095 | 2096 | '@shikijs/core@2.5.0': 2097 | dependencies: 2098 | '@shikijs/engine-javascript': 2.5.0 2099 | '@shikijs/engine-oniguruma': 2.5.0 2100 | '@shikijs/types': 2.5.0 2101 | '@shikijs/vscode-textmate': 10.0.2 2102 | '@types/hast': 3.0.4 2103 | hast-util-to-html: 9.0.5 2104 | 2105 | '@shikijs/engine-javascript@2.5.0': 2106 | dependencies: 2107 | '@shikijs/types': 2.5.0 2108 | '@shikijs/vscode-textmate': 10.0.2 2109 | oniguruma-to-es: 3.1.1 2110 | 2111 | '@shikijs/engine-oniguruma@2.5.0': 2112 | dependencies: 2113 | '@shikijs/types': 2.5.0 2114 | '@shikijs/vscode-textmate': 10.0.2 2115 | 2116 | '@shikijs/langs@2.5.0': 2117 | dependencies: 2118 | '@shikijs/types': 2.5.0 2119 | 2120 | '@shikijs/themes@2.5.0': 2121 | dependencies: 2122 | '@shikijs/types': 2.5.0 2123 | 2124 | '@shikijs/transformers@2.5.0': 2125 | dependencies: 2126 | '@shikijs/core': 2.5.0 2127 | '@shikijs/types': 2.5.0 2128 | 2129 | '@shikijs/types@2.5.0': 2130 | dependencies: 2131 | '@shikijs/vscode-textmate': 10.0.2 2132 | '@types/hast': 3.0.4 2133 | 2134 | '@shikijs/vscode-textmate@10.0.2': {} 2135 | 2136 | '@textlint/ast-node-types@15.5.0': {} 2137 | 2138 | '@textlint/ast-node-types@4.4.3': {} 2139 | 2140 | '@textlint/ast-tester@15.5.0': 2141 | dependencies: 2142 | '@textlint/ast-node-types': 15.5.0 2143 | debug: 4.4.3 2144 | transitivePeerDependencies: 2145 | - supports-color 2146 | 2147 | '@textlint/ast-traverse@15.5.0': 2148 | dependencies: 2149 | '@textlint/ast-node-types': 15.5.0 2150 | 2151 | '@textlint/config-loader@15.5.0': 2152 | dependencies: 2153 | '@textlint/kernel': 15.5.0 2154 | '@textlint/module-interop': 15.5.0 2155 | '@textlint/resolver': 15.5.0 2156 | '@textlint/types': 15.5.0 2157 | '@textlint/utils': 15.5.0 2158 | debug: 4.4.3 2159 | rc-config-loader: 4.1.3 2160 | transitivePeerDependencies: 2161 | - supports-color 2162 | 2163 | '@textlint/feature-flag@15.5.0': {} 2164 | 2165 | '@textlint/fixer-formatter@15.5.0': 2166 | dependencies: 2167 | '@textlint/module-interop': 15.5.0 2168 | '@textlint/resolver': 15.5.0 2169 | '@textlint/types': 15.5.0 2170 | chalk: 4.1.2 2171 | debug: 4.4.3 2172 | diff: 5.2.0 2173 | string-width: 4.2.3 2174 | strip-ansi: 6.0.1 2175 | text-table: 0.2.0 2176 | transitivePeerDependencies: 2177 | - supports-color 2178 | 2179 | '@textlint/kernel@15.5.0': 2180 | dependencies: 2181 | '@textlint/ast-node-types': 15.5.0 2182 | '@textlint/ast-tester': 15.5.0 2183 | '@textlint/ast-traverse': 15.5.0 2184 | '@textlint/feature-flag': 15.5.0 2185 | '@textlint/source-code-fixer': 15.5.0 2186 | '@textlint/types': 15.5.0 2187 | '@textlint/utils': 15.5.0 2188 | debug: 4.4.3 2189 | fast-equals: 4.0.3 2190 | structured-source: 4.0.0 2191 | transitivePeerDependencies: 2192 | - supports-color 2193 | 2194 | '@textlint/linter-formatter@15.5.0': 2195 | dependencies: 2196 | '@azu/format-text': 1.0.2 2197 | '@azu/style-format': 1.0.1 2198 | '@textlint/module-interop': 15.5.0 2199 | '@textlint/resolver': 15.5.0 2200 | '@textlint/types': 15.5.0 2201 | chalk: 4.1.2 2202 | debug: 4.4.3 2203 | js-yaml: 4.1.1 2204 | lodash: 4.17.21 2205 | pluralize: 2.0.0 2206 | string-width: 4.2.3 2207 | strip-ansi: 6.0.1 2208 | table: 6.9.0 2209 | text-table: 0.2.0 2210 | transitivePeerDependencies: 2211 | - supports-color 2212 | 2213 | '@textlint/markdown-to-ast@15.5.0': 2214 | dependencies: 2215 | '@textlint/ast-node-types': 15.5.0 2216 | debug: 4.4.3 2217 | mdast-util-gfm-autolink-literal: 0.1.3 2218 | neotraverse: 0.6.18 2219 | remark-footnotes: 3.0.0 2220 | remark-frontmatter: 3.0.0 2221 | remark-gfm: 1.0.0 2222 | remark-parse: 9.0.0 2223 | structured-source: 4.0.0 2224 | unified: 9.2.2 2225 | transitivePeerDependencies: 2226 | - supports-color 2227 | 2228 | '@textlint/module-interop@15.5.0': {} 2229 | 2230 | '@textlint/regexp-string-matcher@2.0.2': 2231 | dependencies: 2232 | escape-string-regexp: 4.0.0 2233 | lodash.sortby: 4.7.0 2234 | lodash.uniq: 4.5.0 2235 | lodash.uniqwith: 4.5.0 2236 | 2237 | '@textlint/resolver@15.5.0': {} 2238 | 2239 | '@textlint/source-code-fixer@15.5.0': 2240 | dependencies: 2241 | '@textlint/types': 15.5.0 2242 | debug: 4.4.3 2243 | transitivePeerDependencies: 2244 | - supports-color 2245 | 2246 | '@textlint/text-to-ast@15.5.0': 2247 | dependencies: 2248 | '@textlint/ast-node-types': 15.5.0 2249 | 2250 | '@textlint/textlint-plugin-markdown@15.5.0': 2251 | dependencies: 2252 | '@textlint/markdown-to-ast': 15.5.0 2253 | '@textlint/types': 15.5.0 2254 | transitivePeerDependencies: 2255 | - supports-color 2256 | 2257 | '@textlint/textlint-plugin-text@15.5.0': 2258 | dependencies: 2259 | '@textlint/text-to-ast': 15.5.0 2260 | '@textlint/types': 15.5.0 2261 | 2262 | '@textlint/types@15.5.0': 2263 | dependencies: 2264 | '@textlint/ast-node-types': 15.5.0 2265 | 2266 | '@textlint/utils@15.5.0': {} 2267 | 2268 | '@types/estree@1.0.8': {} 2269 | 2270 | '@types/hast@3.0.4': 2271 | dependencies: 2272 | '@types/unist': 3.0.3 2273 | 2274 | '@types/linkify-it@5.0.0': {} 2275 | 2276 | '@types/markdown-it@14.1.2': 2277 | dependencies: 2278 | '@types/linkify-it': 5.0.0 2279 | '@types/mdurl': 2.0.0 2280 | 2281 | '@types/mdast@3.0.15': 2282 | dependencies: 2283 | '@types/unist': 2.0.11 2284 | 2285 | '@types/mdast@4.0.4': 2286 | dependencies: 2287 | '@types/unist': 3.0.3 2288 | 2289 | '@types/mdurl@2.0.0': {} 2290 | 2291 | '@types/normalize-package-data@2.4.4': {} 2292 | 2293 | '@types/unist@2.0.11': {} 2294 | 2295 | '@types/unist@3.0.3': {} 2296 | 2297 | '@types/web-bluetooth@0.0.21': {} 2298 | 2299 | '@ungap/structured-clone@1.3.0': {} 2300 | 2301 | '@vitejs/plugin-vue@5.2.4(vite@5.4.21)(vue@3.5.25)': 2302 | dependencies: 2303 | vite: 5.4.21 2304 | vue: 3.5.25 2305 | 2306 | '@vue/compiler-core@3.5.25': 2307 | dependencies: 2308 | '@babel/parser': 7.28.5 2309 | '@vue/shared': 3.5.25 2310 | entities: 4.5.0 2311 | estree-walker: 2.0.2 2312 | source-map-js: 1.2.1 2313 | 2314 | '@vue/compiler-dom@3.5.25': 2315 | dependencies: 2316 | '@vue/compiler-core': 3.5.25 2317 | '@vue/shared': 3.5.25 2318 | 2319 | '@vue/compiler-sfc@3.5.25': 2320 | dependencies: 2321 | '@babel/parser': 7.28.5 2322 | '@vue/compiler-core': 3.5.25 2323 | '@vue/compiler-dom': 3.5.25 2324 | '@vue/compiler-ssr': 3.5.25 2325 | '@vue/shared': 3.5.25 2326 | estree-walker: 2.0.2 2327 | magic-string: 0.30.21 2328 | postcss: 8.5.6 2329 | source-map-js: 1.2.1 2330 | 2331 | '@vue/compiler-ssr@3.5.25': 2332 | dependencies: 2333 | '@vue/compiler-dom': 3.5.25 2334 | '@vue/shared': 3.5.25 2335 | 2336 | '@vue/devtools-api@7.7.9': 2337 | dependencies: 2338 | '@vue/devtools-kit': 7.7.9 2339 | 2340 | '@vue/devtools-kit@7.7.9': 2341 | dependencies: 2342 | '@vue/devtools-shared': 7.7.9 2343 | birpc: 2.9.0 2344 | hookable: 5.5.3 2345 | mitt: 3.0.1 2346 | perfect-debounce: 1.0.0 2347 | speakingurl: 14.0.1 2348 | superjson: 2.2.6 2349 | 2350 | '@vue/devtools-shared@7.7.9': 2351 | dependencies: 2352 | rfdc: 1.4.1 2353 | 2354 | '@vue/reactivity@3.5.25': 2355 | dependencies: 2356 | '@vue/shared': 3.5.25 2357 | 2358 | '@vue/runtime-core@3.5.25': 2359 | dependencies: 2360 | '@vue/reactivity': 3.5.25 2361 | '@vue/shared': 3.5.25 2362 | 2363 | '@vue/runtime-dom@3.5.25': 2364 | dependencies: 2365 | '@vue/reactivity': 3.5.25 2366 | '@vue/runtime-core': 3.5.25 2367 | '@vue/shared': 3.5.25 2368 | csstype: 3.2.3 2369 | 2370 | '@vue/server-renderer@3.5.25(vue@3.5.25)': 2371 | dependencies: 2372 | '@vue/compiler-ssr': 3.5.25 2373 | '@vue/shared': 3.5.25 2374 | vue: 3.5.25 2375 | 2376 | '@vue/shared@3.5.25': {} 2377 | 2378 | '@vueuse/core@12.8.2': 2379 | dependencies: 2380 | '@types/web-bluetooth': 0.0.21 2381 | '@vueuse/metadata': 12.8.2 2382 | '@vueuse/shared': 12.8.2 2383 | vue: 3.5.25 2384 | transitivePeerDependencies: 2385 | - typescript 2386 | 2387 | '@vueuse/integrations@12.8.2(focus-trap@7.6.6)': 2388 | dependencies: 2389 | '@vueuse/core': 12.8.2 2390 | '@vueuse/shared': 12.8.2 2391 | vue: 3.5.25 2392 | optionalDependencies: 2393 | focus-trap: 7.6.6 2394 | transitivePeerDependencies: 2395 | - typescript 2396 | 2397 | '@vueuse/metadata@12.8.2': {} 2398 | 2399 | '@vueuse/shared@12.8.2': 2400 | dependencies: 2401 | vue: 3.5.25 2402 | transitivePeerDependencies: 2403 | - typescript 2404 | 2405 | accepts@2.0.0: 2406 | dependencies: 2407 | mime-types: 3.0.2 2408 | negotiator: 1.0.0 2409 | 2410 | ajv-formats@3.0.1(ajv@8.17.1): 2411 | optionalDependencies: 2412 | ajv: 8.17.1 2413 | 2414 | ajv@8.17.1: 2415 | dependencies: 2416 | fast-deep-equal: 3.1.3 2417 | fast-uri: 3.1.0 2418 | json-schema-traverse: 1.0.0 2419 | require-from-string: 2.0.2 2420 | 2421 | algoliasearch@5.46.0: 2422 | dependencies: 2423 | '@algolia/abtesting': 1.12.0 2424 | '@algolia/client-abtesting': 5.46.0 2425 | '@algolia/client-analytics': 5.46.0 2426 | '@algolia/client-common': 5.46.0 2427 | '@algolia/client-insights': 5.46.0 2428 | '@algolia/client-personalization': 5.46.0 2429 | '@algolia/client-query-suggestions': 5.46.0 2430 | '@algolia/client-search': 5.46.0 2431 | '@algolia/ingestion': 1.46.0 2432 | '@algolia/monitoring': 1.46.0 2433 | '@algolia/recommend': 5.46.0 2434 | '@algolia/requester-browser-xhr': 5.46.0 2435 | '@algolia/requester-fetch': 5.46.0 2436 | '@algolia/requester-node-http': 5.46.0 2437 | 2438 | ansi-regex@5.0.1: {} 2439 | 2440 | ansi-regex@6.2.2: {} 2441 | 2442 | ansi-styles@4.3.0: 2443 | dependencies: 2444 | color-convert: 2.0.1 2445 | 2446 | ansi-styles@6.2.3: {} 2447 | 2448 | argparse@2.0.1: {} 2449 | 2450 | astral-regex@2.0.0: {} 2451 | 2452 | bail@1.0.5: {} 2453 | 2454 | balanced-match@1.0.2: {} 2455 | 2456 | birpc@2.9.0: {} 2457 | 2458 | body-parser@2.2.1: 2459 | dependencies: 2460 | bytes: 3.1.2 2461 | content-type: 1.0.5 2462 | debug: 4.4.3 2463 | http-errors: 2.0.1 2464 | iconv-lite: 0.7.0 2465 | on-finished: 2.4.1 2466 | qs: 6.14.0 2467 | raw-body: 3.0.2 2468 | type-is: 2.0.1 2469 | transitivePeerDependencies: 2470 | - supports-color 2471 | 2472 | boundary@1.0.1: {} 2473 | 2474 | boundary@2.0.0: {} 2475 | 2476 | brace-expansion@2.0.2: 2477 | dependencies: 2478 | balanced-match: 1.0.2 2479 | 2480 | buffer-from@1.1.2: {} 2481 | 2482 | bytes@3.1.2: {} 2483 | 2484 | cacheable@2.3.0: 2485 | dependencies: 2486 | '@cacheable/memory': 2.0.6 2487 | '@cacheable/utils': 2.3.2 2488 | hookified: 1.14.0 2489 | keyv: 5.5.5 2490 | qified: 0.5.3 2491 | 2492 | ccount@1.1.0: {} 2493 | 2494 | ccount@2.0.1: {} 2495 | 2496 | chalk@4.1.2: 2497 | dependencies: 2498 | ansi-styles: 4.3.0 2499 | supports-color: 7.2.0 2500 | 2501 | character-entities-html4@2.1.0: {} 2502 | 2503 | character-entities-legacy@1.1.4: {} 2504 | 2505 | character-entities-legacy@3.0.0: {} 2506 | 2507 | character-entities@1.2.4: {} 2508 | 2509 | character-reference-invalid@1.1.4: {} 2510 | 2511 | charenc@0.0.2: {} 2512 | 2513 | cities-list@1.0.3: {} 2514 | 2515 | color-convert@2.0.1: 2516 | dependencies: 2517 | color-name: 1.1.4 2518 | 2519 | color-name@1.1.4: {} 2520 | 2521 | comma-separated-tokens@2.0.3: {} 2522 | 2523 | concat-stream@2.0.0: 2524 | dependencies: 2525 | buffer-from: 1.1.2 2526 | inherits: 2.0.4 2527 | readable-stream: 3.6.2 2528 | typedarray: '@nolyfill/typedarray@1.0.44' 2529 | 2530 | content-disposition@1.0.1: {} 2531 | 2532 | content-type@1.0.5: {} 2533 | 2534 | cookie-signature@1.2.2: {} 2535 | 2536 | cookie@0.7.2: {} 2537 | 2538 | copy-anything@4.0.5: 2539 | dependencies: 2540 | is-what: 5.5.0 2541 | 2542 | cors@2.8.5: 2543 | dependencies: 2544 | object-assign: 4.1.1 2545 | vary: 1.1.2 2546 | 2547 | cross-spawn@7.0.6: 2548 | dependencies: 2549 | path-key: 3.1.1 2550 | shebang-command: 2.0.0 2551 | which: 2.0.2 2552 | 2553 | crypt@0.0.2: {} 2554 | 2555 | csstype@3.2.3: {} 2556 | 2557 | debug@4.4.3: 2558 | dependencies: 2559 | ms: 2.1.3 2560 | 2561 | deep-is@0.1.4: {} 2562 | 2563 | depd@2.0.0: {} 2564 | 2565 | dequal@2.0.3: {} 2566 | 2567 | devlop@1.1.0: 2568 | dependencies: 2569 | dequal: 2.0.3 2570 | 2571 | diff@5.2.0: {} 2572 | 2573 | eastasianwidth@0.2.0: {} 2574 | 2575 | ee-first@1.1.1: {} 2576 | 2577 | emoji-regex-xs@1.0.0: {} 2578 | 2579 | emoji-regex@8.0.0: {} 2580 | 2581 | emoji-regex@9.2.2: {} 2582 | 2583 | en-inflectors@1.0.12: 2584 | dependencies: 2585 | en-stemmer: 1.0.3 2586 | 2587 | en-lexicon@1.0.11: 2588 | dependencies: 2589 | en-inflectors: 1.0.12 2590 | 2591 | en-pos@1.0.16: 2592 | dependencies: 2593 | cities-list: 1.0.3 2594 | en-inflectors: 1.0.12 2595 | en-lexicon: 1.0.11 2596 | humannames: 1.0.5 2597 | 2598 | en-stemmer@1.0.3: {} 2599 | 2600 | encodeurl@2.0.0: {} 2601 | 2602 | entities@4.5.0: {} 2603 | 2604 | esbuild@0.21.5: 2605 | optionalDependencies: 2606 | '@esbuild/aix-ppc64': 0.21.5 2607 | '@esbuild/android-arm': 0.21.5 2608 | '@esbuild/android-arm64': 0.21.5 2609 | '@esbuild/android-x64': 0.21.5 2610 | '@esbuild/darwin-arm64': 0.21.5 2611 | '@esbuild/darwin-x64': 0.21.5 2612 | '@esbuild/freebsd-arm64': 0.21.5 2613 | '@esbuild/freebsd-x64': 0.21.5 2614 | '@esbuild/linux-arm': 0.21.5 2615 | '@esbuild/linux-arm64': 0.21.5 2616 | '@esbuild/linux-ia32': 0.21.5 2617 | '@esbuild/linux-loong64': 0.21.5 2618 | '@esbuild/linux-mips64el': 0.21.5 2619 | '@esbuild/linux-ppc64': 0.21.5 2620 | '@esbuild/linux-riscv64': 0.21.5 2621 | '@esbuild/linux-s390x': 0.21.5 2622 | '@esbuild/linux-x64': 0.21.5 2623 | '@esbuild/netbsd-x64': 0.21.5 2624 | '@esbuild/openbsd-x64': 0.21.5 2625 | '@esbuild/sunos-x64': 0.21.5 2626 | '@esbuild/win32-arm64': 0.21.5 2627 | '@esbuild/win32-ia32': 0.21.5 2628 | '@esbuild/win32-x64': 0.21.5 2629 | 2630 | escape-html@1.0.3: {} 2631 | 2632 | escape-string-regexp@4.0.0: {} 2633 | 2634 | estree-walker@2.0.2: {} 2635 | 2636 | etag@1.8.1: {} 2637 | 2638 | eventsource-parser@3.0.6: {} 2639 | 2640 | eventsource@3.0.7: 2641 | dependencies: 2642 | eventsource-parser: 3.0.6 2643 | 2644 | express-rate-limit@7.5.1(express@5.2.1): 2645 | dependencies: 2646 | express: 5.2.1 2647 | 2648 | express@5.2.1: 2649 | dependencies: 2650 | accepts: 2.0.0 2651 | body-parser: 2.2.1 2652 | content-disposition: 1.0.1 2653 | content-type: 1.0.5 2654 | cookie: 0.7.2 2655 | cookie-signature: 1.2.2 2656 | debug: 4.4.3 2657 | depd: 2.0.0 2658 | encodeurl: 2.0.0 2659 | escape-html: 1.0.3 2660 | etag: 1.8.1 2661 | finalhandler: 2.1.1 2662 | fresh: 2.0.0 2663 | http-errors: 2.0.1 2664 | merge-descriptors: 2.0.0 2665 | mime-types: 3.0.2 2666 | on-finished: 2.4.1 2667 | once: 1.4.0 2668 | parseurl: 1.3.3 2669 | proxy-addr: 2.0.7 2670 | qs: 6.14.0 2671 | range-parser: 1.2.1 2672 | router: 2.2.0 2673 | send: 1.2.0 2674 | serve-static: 2.2.0 2675 | statuses: 2.0.2 2676 | type-is: 2.0.1 2677 | vary: 1.1.2 2678 | transitivePeerDependencies: 2679 | - supports-color 2680 | 2681 | extend@3.0.2: {} 2682 | 2683 | fast-deep-equal@3.1.3: {} 2684 | 2685 | fast-equals@4.0.3: {} 2686 | 2687 | fast-levenshtein@2.0.6: {} 2688 | 2689 | fast-uri@3.1.0: {} 2690 | 2691 | fault@1.0.4: 2692 | dependencies: 2693 | format: 0.2.2 2694 | 2695 | file-entry-cache@10.1.4: 2696 | dependencies: 2697 | flat-cache: 6.1.19 2698 | 2699 | finalhandler@2.1.1: 2700 | dependencies: 2701 | debug: 4.4.3 2702 | encodeurl: 2.0.0 2703 | escape-html: 1.0.3 2704 | on-finished: 2.4.1 2705 | parseurl: 1.3.3 2706 | statuses: 2.0.2 2707 | transitivePeerDependencies: 2708 | - supports-color 2709 | 2710 | find-up-simple@1.0.1: {} 2711 | 2712 | flat-cache@6.1.19: 2713 | dependencies: 2714 | cacheable: 2.3.0 2715 | flatted: 3.3.3 2716 | hookified: 1.14.0 2717 | 2718 | flatted@3.3.3: {} 2719 | 2720 | focus-trap@7.6.6: 2721 | dependencies: 2722 | tabbable: 6.3.0 2723 | 2724 | foreground-child@3.3.1: 2725 | dependencies: 2726 | cross-spawn: 7.0.6 2727 | signal-exit: 4.1.0 2728 | 2729 | format@0.2.2: {} 2730 | 2731 | forwarded@0.2.0: {} 2732 | 2733 | fresh@2.0.0: {} 2734 | 2735 | fsevents@2.3.3: 2736 | optional: true 2737 | 2738 | glob@10.5.0: 2739 | dependencies: 2740 | foreground-child: 3.3.1 2741 | jackspeak: 3.4.3 2742 | minimatch: 9.0.5 2743 | minipass: 7.1.2 2744 | package-json-from-dist: 1.0.1 2745 | path-scurry: 1.11.1 2746 | 2747 | has-flag@4.0.0: {} 2748 | 2749 | hashery@1.3.0: 2750 | dependencies: 2751 | hookified: 1.14.0 2752 | 2753 | hast-util-to-html@9.0.5: 2754 | dependencies: 2755 | '@types/hast': 3.0.4 2756 | '@types/unist': 3.0.3 2757 | ccount: 2.0.1 2758 | comma-separated-tokens: 2.0.3 2759 | hast-util-whitespace: 3.0.0 2760 | html-void-elements: 3.0.0 2761 | mdast-util-to-hast: 13.2.1 2762 | property-information: 7.1.0 2763 | space-separated-tokens: 2.0.2 2764 | stringify-entities: 4.0.4 2765 | zwitch: 2.0.4 2766 | 2767 | hast-util-whitespace@3.0.0: 2768 | dependencies: 2769 | '@types/hast': 3.0.4 2770 | 2771 | hookable@5.5.3: {} 2772 | 2773 | hookified@1.14.0: {} 2774 | 2775 | hosted-git-info@7.0.2: 2776 | dependencies: 2777 | lru-cache: 10.4.3 2778 | 2779 | html-void-elements@3.0.0: {} 2780 | 2781 | http-errors@2.0.1: 2782 | dependencies: 2783 | depd: 2.0.0 2784 | inherits: 2.0.4 2785 | setprototypeof: 1.2.0 2786 | statuses: 2.0.2 2787 | toidentifier: 1.0.1 2788 | 2789 | humannames@1.0.5: {} 2790 | 2791 | iconv-lite@0.7.0: 2792 | dependencies: 2793 | safer-buffer: '@nolyfill/safer-buffer@1.0.44' 2794 | 2795 | index-to-position@1.2.0: {} 2796 | 2797 | inherits@2.0.4: {} 2798 | 2799 | ipaddr.js@1.9.1: {} 2800 | 2801 | is-alphabetical@1.0.4: {} 2802 | 2803 | is-alphanumerical@1.0.4: 2804 | dependencies: 2805 | is-alphabetical: 1.0.4 2806 | is-decimal: 1.0.4 2807 | 2808 | is-buffer@1.1.6: {} 2809 | 2810 | is-buffer@2.0.5: {} 2811 | 2812 | is-decimal@1.0.4: {} 2813 | 2814 | is-fullwidth-code-point@3.0.0: {} 2815 | 2816 | is-hexadecimal@1.0.4: {} 2817 | 2818 | is-plain-obj@2.1.0: {} 2819 | 2820 | is-promise@4.0.0: {} 2821 | 2822 | is-what@5.5.0: {} 2823 | 2824 | isexe@2.0.0: {} 2825 | 2826 | jackspeak@3.4.3: 2827 | dependencies: 2828 | '@isaacs/cliui': 8.0.2 2829 | optionalDependencies: 2830 | '@pkgjs/parseargs': 0.11.0 2831 | 2832 | jose@6.1.3: {} 2833 | 2834 | js-tokens@4.0.0: {} 2835 | 2836 | js-yaml@4.1.1: 2837 | dependencies: 2838 | argparse: 2.0.1 2839 | 2840 | json-schema-traverse@1.0.0: {} 2841 | 2842 | json5@2.2.3: {} 2843 | 2844 | keyv@5.5.5: 2845 | dependencies: 2846 | '@keyv/serialize': 1.1.1 2847 | 2848 | levn@0.4.1: 2849 | dependencies: 2850 | prelude-ls: 1.2.1 2851 | type-check: 0.4.0 2852 | 2853 | lodash.sortby@4.7.0: {} 2854 | 2855 | lodash.truncate@4.4.2: {} 2856 | 2857 | lodash.uniq@4.5.0: {} 2858 | 2859 | lodash.uniqwith@4.5.0: {} 2860 | 2861 | lodash@4.17.21: {} 2862 | 2863 | longest-streak@2.0.4: {} 2864 | 2865 | lru-cache@10.4.3: {} 2866 | 2867 | magic-string@0.30.21: 2868 | dependencies: 2869 | '@jridgewell/sourcemap-codec': 1.5.5 2870 | 2871 | mark.js@8.11.1: {} 2872 | 2873 | markdown-table@2.0.0: 2874 | dependencies: 2875 | repeat-string: 1.6.1 2876 | 2877 | match-index@1.0.3: 2878 | dependencies: 2879 | regexp.prototype.flags: '@nolyfill/regexp.prototype.flags@1.0.44' 2880 | 2881 | md5@2.3.0: 2882 | dependencies: 2883 | charenc: 0.0.2 2884 | crypt: 0.0.2 2885 | is-buffer: 1.1.6 2886 | 2887 | mdast-util-find-and-replace@1.1.1: 2888 | dependencies: 2889 | escape-string-regexp: 4.0.0 2890 | unist-util-is: 4.1.0 2891 | unist-util-visit-parents: 3.1.1 2892 | 2893 | mdast-util-footnote@0.1.7: 2894 | dependencies: 2895 | mdast-util-to-markdown: 0.6.5 2896 | micromark: 2.11.4 2897 | transitivePeerDependencies: 2898 | - supports-color 2899 | 2900 | mdast-util-from-markdown@0.8.5: 2901 | dependencies: 2902 | '@types/mdast': 3.0.15 2903 | mdast-util-to-string: 2.0.0 2904 | micromark: 2.11.4 2905 | parse-entities: 2.0.0 2906 | unist-util-stringify-position: 2.0.3 2907 | transitivePeerDependencies: 2908 | - supports-color 2909 | 2910 | mdast-util-frontmatter@0.2.0: 2911 | dependencies: 2912 | micromark-extension-frontmatter: 0.2.2 2913 | 2914 | mdast-util-gfm-autolink-literal@0.1.3: 2915 | dependencies: 2916 | ccount: 1.1.0 2917 | mdast-util-find-and-replace: 1.1.1 2918 | micromark: 2.11.4 2919 | transitivePeerDependencies: 2920 | - supports-color 2921 | 2922 | mdast-util-gfm-strikethrough@0.2.3: 2923 | dependencies: 2924 | mdast-util-to-markdown: 0.6.5 2925 | 2926 | mdast-util-gfm-table@0.1.6: 2927 | dependencies: 2928 | markdown-table: 2.0.0 2929 | mdast-util-to-markdown: 0.6.5 2930 | 2931 | mdast-util-gfm-task-list-item@0.1.6: 2932 | dependencies: 2933 | mdast-util-to-markdown: 0.6.5 2934 | 2935 | mdast-util-gfm@0.1.2: 2936 | dependencies: 2937 | mdast-util-gfm-autolink-literal: 0.1.3 2938 | mdast-util-gfm-strikethrough: 0.2.3 2939 | mdast-util-gfm-table: 0.1.6 2940 | mdast-util-gfm-task-list-item: 0.1.6 2941 | mdast-util-to-markdown: 0.6.5 2942 | transitivePeerDependencies: 2943 | - supports-color 2944 | 2945 | mdast-util-to-hast@13.2.1: 2946 | dependencies: 2947 | '@types/hast': 3.0.4 2948 | '@types/mdast': 4.0.4 2949 | '@ungap/structured-clone': 1.3.0 2950 | devlop: 1.1.0 2951 | micromark-util-sanitize-uri: 2.0.1 2952 | trim-lines: 3.0.1 2953 | unist-util-position: 5.0.0 2954 | unist-util-visit: 5.0.0 2955 | vfile: 6.0.3 2956 | 2957 | mdast-util-to-markdown@0.6.5: 2958 | dependencies: 2959 | '@types/unist': 2.0.11 2960 | longest-streak: 2.0.4 2961 | mdast-util-to-string: 2.0.0 2962 | parse-entities: 2.0.0 2963 | repeat-string: 1.6.1 2964 | zwitch: 1.0.5 2965 | 2966 | mdast-util-to-string@2.0.0: {} 2967 | 2968 | media-typer@1.1.0: {} 2969 | 2970 | merge-descriptors@2.0.0: {} 2971 | 2972 | micromark-extension-footnote@0.3.2: 2973 | dependencies: 2974 | micromark: 2.11.4 2975 | transitivePeerDependencies: 2976 | - supports-color 2977 | 2978 | micromark-extension-frontmatter@0.2.2: 2979 | dependencies: 2980 | fault: 1.0.4 2981 | 2982 | micromark-extension-gfm-autolink-literal@0.5.7: 2983 | dependencies: 2984 | micromark: 2.11.4 2985 | transitivePeerDependencies: 2986 | - supports-color 2987 | 2988 | micromark-extension-gfm-strikethrough@0.6.5: 2989 | dependencies: 2990 | micromark: 2.11.4 2991 | transitivePeerDependencies: 2992 | - supports-color 2993 | 2994 | micromark-extension-gfm-table@0.4.3: 2995 | dependencies: 2996 | micromark: 2.11.4 2997 | transitivePeerDependencies: 2998 | - supports-color 2999 | 3000 | micromark-extension-gfm-tagfilter@0.3.0: {} 3001 | 3002 | micromark-extension-gfm-task-list-item@0.3.3: 3003 | dependencies: 3004 | micromark: 2.11.4 3005 | transitivePeerDependencies: 3006 | - supports-color 3007 | 3008 | micromark-extension-gfm@0.3.3: 3009 | dependencies: 3010 | micromark: 2.11.4 3011 | micromark-extension-gfm-autolink-literal: 0.5.7 3012 | micromark-extension-gfm-strikethrough: 0.6.5 3013 | micromark-extension-gfm-table: 0.4.3 3014 | micromark-extension-gfm-tagfilter: 0.3.0 3015 | micromark-extension-gfm-task-list-item: 0.3.3 3016 | transitivePeerDependencies: 3017 | - supports-color 3018 | 3019 | micromark-util-character@2.1.1: 3020 | dependencies: 3021 | micromark-util-symbol: 2.0.1 3022 | micromark-util-types: 2.0.2 3023 | 3024 | micromark-util-encode@2.0.1: {} 3025 | 3026 | micromark-util-sanitize-uri@2.0.1: 3027 | dependencies: 3028 | micromark-util-character: 2.1.1 3029 | micromark-util-encode: 2.0.1 3030 | micromark-util-symbol: 2.0.1 3031 | 3032 | micromark-util-symbol@2.0.1: {} 3033 | 3034 | micromark-util-types@2.0.2: {} 3035 | 3036 | micromark@2.11.4: 3037 | dependencies: 3038 | debug: 4.4.3 3039 | parse-entities: 2.0.0 3040 | transitivePeerDependencies: 3041 | - supports-color 3042 | 3043 | mime-db@1.54.0: {} 3044 | 3045 | mime-types@3.0.2: 3046 | dependencies: 3047 | mime-db: 1.54.0 3048 | 3049 | minimatch@9.0.5: 3050 | dependencies: 3051 | brace-expansion: 2.0.2 3052 | 3053 | minipass@7.1.2: {} 3054 | 3055 | minisearch@7.2.0: {} 3056 | 3057 | mitt@3.0.1: {} 3058 | 3059 | ms@2.1.3: {} 3060 | 3061 | nanoid@3.3.11: {} 3062 | 3063 | negotiator@1.0.0: {} 3064 | 3065 | neotraverse@0.6.18: {} 3066 | 3067 | normalize-package-data@6.0.2: 3068 | dependencies: 3069 | hosted-git-info: 7.0.2 3070 | semver: 7.7.3 3071 | validate-npm-package-license: 3.0.4 3072 | 3073 | object-assign@4.1.1: {} 3074 | 3075 | object_values@0.1.2: {} 3076 | 3077 | on-finished@2.4.1: 3078 | dependencies: 3079 | ee-first: 1.1.1 3080 | 3081 | once@1.4.0: 3082 | dependencies: 3083 | wrappy: 1.0.2 3084 | 3085 | oniguruma-to-es@3.1.1: 3086 | dependencies: 3087 | emoji-regex-xs: 1.0.0 3088 | regex: 6.1.0 3089 | regex-recursion: 6.0.2 3090 | 3091 | optionator@0.9.4: 3092 | dependencies: 3093 | deep-is: 0.1.4 3094 | fast-levenshtein: 2.0.6 3095 | levn: 0.4.1 3096 | prelude-ls: 1.2.1 3097 | type-check: 0.4.0 3098 | word-wrap: 1.2.5 3099 | 3100 | package-json-from-dist@1.0.1: {} 3101 | 3102 | parse-entities@2.0.0: 3103 | dependencies: 3104 | character-entities: 1.2.4 3105 | character-entities-legacy: 1.1.4 3106 | character-reference-invalid: 1.1.4 3107 | is-alphanumerical: 1.0.4 3108 | is-decimal: 1.0.4 3109 | is-hexadecimal: 1.0.4 3110 | 3111 | parse-json@8.3.0: 3112 | dependencies: 3113 | '@babel/code-frame': 7.27.1 3114 | index-to-position: 1.2.0 3115 | type-fest: 4.41.0 3116 | 3117 | parseurl@1.3.3: {} 3118 | 3119 | path-key@3.1.1: {} 3120 | 3121 | path-scurry@1.11.1: 3122 | dependencies: 3123 | lru-cache: 10.4.3 3124 | minipass: 7.1.2 3125 | 3126 | path-to-glob-pattern@2.0.1: {} 3127 | 3128 | path-to-regexp@8.3.0: {} 3129 | 3130 | perfect-debounce@1.0.0: {} 3131 | 3132 | picocolors@1.1.1: {} 3133 | 3134 | pkce-challenge@5.0.1: {} 3135 | 3136 | pluralize@2.0.0: {} 3137 | 3138 | postcss@8.5.6: 3139 | dependencies: 3140 | nanoid: 3.3.11 3141 | picocolors: 1.1.1 3142 | source-map-js: 1.2.1 3143 | 3144 | preact@10.28.0: {} 3145 | 3146 | prelude-ls@1.2.1: {} 3147 | 3148 | property-information@7.1.0: {} 3149 | 3150 | proxy-addr@2.0.7: 3151 | dependencies: 3152 | forwarded: 0.2.0 3153 | ipaddr.js: 1.9.1 3154 | 3155 | qified@0.5.3: 3156 | dependencies: 3157 | hookified: 1.14.0 3158 | 3159 | qs@6.14.0: 3160 | dependencies: 3161 | side-channel: '@nolyfill/side-channel@1.0.44' 3162 | 3163 | range-parser@1.2.1: {} 3164 | 3165 | raw-body@3.0.2: 3166 | dependencies: 3167 | bytes: 3.1.2 3168 | http-errors: 2.0.1 3169 | iconv-lite: 0.7.0 3170 | unpipe: 1.0.0 3171 | 3172 | rc-config-loader@4.1.3: 3173 | dependencies: 3174 | debug: 4.4.3 3175 | js-yaml: 4.1.1 3176 | json5: 2.2.3 3177 | require-from-string: 2.0.2 3178 | transitivePeerDependencies: 3179 | - supports-color 3180 | 3181 | read-package-up@11.0.0: 3182 | dependencies: 3183 | find-up-simple: 1.0.1 3184 | read-pkg: 9.0.1 3185 | type-fest: 4.41.0 3186 | 3187 | read-pkg@9.0.1: 3188 | dependencies: 3189 | '@types/normalize-package-data': 2.4.4 3190 | normalize-package-data: 6.0.2 3191 | parse-json: 8.3.0 3192 | type-fest: 4.41.0 3193 | unicorn-magic: 0.1.0 3194 | 3195 | readable-stream@3.6.2: 3196 | dependencies: 3197 | inherits: 2.0.4 3198 | string_decoder: 1.3.0 3199 | util-deprecate: 1.0.2 3200 | 3201 | regex-recursion@6.0.2: 3202 | dependencies: 3203 | regex-utilities: 2.3.0 3204 | 3205 | regex-utilities@2.3.0: {} 3206 | 3207 | regex@6.1.0: 3208 | dependencies: 3209 | regex-utilities: 2.3.0 3210 | 3211 | remark-footnotes@3.0.0: 3212 | dependencies: 3213 | mdast-util-footnote: 0.1.7 3214 | micromark-extension-footnote: 0.3.2 3215 | transitivePeerDependencies: 3216 | - supports-color 3217 | 3218 | remark-frontmatter@3.0.0: 3219 | dependencies: 3220 | mdast-util-frontmatter: 0.2.0 3221 | micromark-extension-frontmatter: 0.2.2 3222 | 3223 | remark-gfm@1.0.0: 3224 | dependencies: 3225 | mdast-util-gfm: 0.1.2 3226 | micromark-extension-gfm: 0.3.3 3227 | transitivePeerDependencies: 3228 | - supports-color 3229 | 3230 | remark-parse@9.0.0: 3231 | dependencies: 3232 | mdast-util-from-markdown: 0.8.5 3233 | transitivePeerDependencies: 3234 | - supports-color 3235 | 3236 | repeat-string@1.6.1: {} 3237 | 3238 | require-from-string@2.0.2: {} 3239 | 3240 | rfdc@1.4.1: {} 3241 | 3242 | rollup@4.53.3: 3243 | dependencies: 3244 | '@types/estree': 1.0.8 3245 | optionalDependencies: 3246 | '@rollup/rollup-android-arm-eabi': 4.53.3 3247 | '@rollup/rollup-android-arm64': 4.53.3 3248 | '@rollup/rollup-darwin-arm64': 4.53.3 3249 | '@rollup/rollup-darwin-x64': 4.53.3 3250 | '@rollup/rollup-freebsd-arm64': 4.53.3 3251 | '@rollup/rollup-freebsd-x64': 4.53.3 3252 | '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 3253 | '@rollup/rollup-linux-arm-musleabihf': 4.53.3 3254 | '@rollup/rollup-linux-arm64-gnu': 4.53.3 3255 | '@rollup/rollup-linux-arm64-musl': 4.53.3 3256 | '@rollup/rollup-linux-loong64-gnu': 4.53.3 3257 | '@rollup/rollup-linux-ppc64-gnu': 4.53.3 3258 | '@rollup/rollup-linux-riscv64-gnu': 4.53.3 3259 | '@rollup/rollup-linux-riscv64-musl': 4.53.3 3260 | '@rollup/rollup-linux-s390x-gnu': 4.53.3 3261 | '@rollup/rollup-linux-x64-gnu': 4.53.3 3262 | '@rollup/rollup-linux-x64-musl': 4.53.3 3263 | '@rollup/rollup-openharmony-arm64': 4.53.3 3264 | '@rollup/rollup-win32-arm64-msvc': 4.53.3 3265 | '@rollup/rollup-win32-ia32-msvc': 4.53.3 3266 | '@rollup/rollup-win32-x64-gnu': 4.53.3 3267 | '@rollup/rollup-win32-x64-msvc': 4.53.3 3268 | fsevents: 2.3.3 3269 | 3270 | router@2.2.0: 3271 | dependencies: 3272 | debug: 4.4.3 3273 | depd: 2.0.0 3274 | is-promise: 4.0.0 3275 | parseurl: 1.3.3 3276 | path-to-regexp: 8.3.0 3277 | transitivePeerDependencies: 3278 | - supports-color 3279 | 3280 | search-insights@2.17.3: {} 3281 | 3282 | semver@7.7.3: {} 3283 | 3284 | send@1.2.0: 3285 | dependencies: 3286 | debug: 4.4.3 3287 | encodeurl: 2.0.0 3288 | escape-html: 1.0.3 3289 | etag: 1.8.1 3290 | fresh: 2.0.0 3291 | http-errors: 2.0.1 3292 | mime-types: 3.0.2 3293 | ms: 2.1.3 3294 | on-finished: 2.4.1 3295 | range-parser: 1.2.1 3296 | statuses: 2.0.2 3297 | transitivePeerDependencies: 3298 | - supports-color 3299 | 3300 | sentence-splitter@3.2.3: 3301 | dependencies: 3302 | '@textlint/ast-node-types': 4.4.3 3303 | concat-stream: 2.0.0 3304 | object_values: 0.1.2 3305 | structured-source: 3.0.2 3306 | 3307 | serve-static@2.2.0: 3308 | dependencies: 3309 | encodeurl: 2.0.0 3310 | escape-html: 1.0.3 3311 | parseurl: 1.3.3 3312 | send: 1.2.0 3313 | transitivePeerDependencies: 3314 | - supports-color 3315 | 3316 | setprototypeof@1.2.0: {} 3317 | 3318 | shebang-command@2.0.0: 3319 | dependencies: 3320 | shebang-regex: 3.0.0 3321 | 3322 | shebang-regex@3.0.0: {} 3323 | 3324 | shiki@2.5.0: 3325 | dependencies: 3326 | '@shikijs/core': 2.5.0 3327 | '@shikijs/engine-javascript': 2.5.0 3328 | '@shikijs/engine-oniguruma': 2.5.0 3329 | '@shikijs/langs': 2.5.0 3330 | '@shikijs/themes': 2.5.0 3331 | '@shikijs/types': 2.5.0 3332 | '@shikijs/vscode-textmate': 10.0.2 3333 | '@types/hast': 3.0.4 3334 | 3335 | signal-exit@4.1.0: {} 3336 | 3337 | slice-ansi@4.0.0: 3338 | dependencies: 3339 | ansi-styles: 4.3.0 3340 | astral-regex: 2.0.0 3341 | is-fullwidth-code-point: 3.0.0 3342 | 3343 | source-map-js@1.2.1: {} 3344 | 3345 | space-separated-tokens@2.0.2: {} 3346 | 3347 | spdx-correct@3.2.0: 3348 | dependencies: 3349 | spdx-expression-parse: 3.0.1 3350 | spdx-license-ids: 3.0.22 3351 | 3352 | spdx-exceptions@2.5.0: {} 3353 | 3354 | spdx-expression-parse@3.0.1: 3355 | dependencies: 3356 | spdx-exceptions: 2.5.0 3357 | spdx-license-ids: 3.0.22 3358 | 3359 | spdx-license-ids@3.0.22: {} 3360 | 3361 | speakingurl@14.0.1: {} 3362 | 3363 | statuses@2.0.2: {} 3364 | 3365 | string-width@4.2.3: 3366 | dependencies: 3367 | emoji-regex: 8.0.0 3368 | is-fullwidth-code-point: 3.0.0 3369 | strip-ansi: 6.0.1 3370 | 3371 | string-width@5.1.2: 3372 | dependencies: 3373 | eastasianwidth: 0.2.0 3374 | emoji-regex: 9.2.2 3375 | strip-ansi: 7.1.2 3376 | 3377 | string_decoder@1.3.0: 3378 | dependencies: 3379 | safe-buffer: '@nolyfill/safe-buffer@1.0.44' 3380 | 3381 | stringify-entities@4.0.4: 3382 | dependencies: 3383 | character-entities-html4: 2.1.0 3384 | character-entities-legacy: 3.0.0 3385 | 3386 | strip-ansi@6.0.1: 3387 | dependencies: 3388 | ansi-regex: 5.0.1 3389 | 3390 | strip-ansi@7.1.2: 3391 | dependencies: 3392 | ansi-regex: 6.2.2 3393 | 3394 | structured-source@3.0.2: 3395 | dependencies: 3396 | boundary: 1.0.1 3397 | 3398 | structured-source@4.0.0: 3399 | dependencies: 3400 | boundary: 2.0.0 3401 | 3402 | superjson@2.2.6: 3403 | dependencies: 3404 | copy-anything: 4.0.5 3405 | 3406 | supports-color@7.2.0: 3407 | dependencies: 3408 | has-flag: 4.0.0 3409 | 3410 | tabbable@6.3.0: {} 3411 | 3412 | table@6.9.0: 3413 | dependencies: 3414 | ajv: 8.17.1 3415 | lodash.truncate: 4.4.2 3416 | slice-ansi: 4.0.0 3417 | string-width: 4.2.3 3418 | strip-ansi: 6.0.1 3419 | 3420 | text-table@0.2.0: {} 3421 | 3422 | textlint-rule-en-capitalization@2.0.3: 3423 | dependencies: 3424 | en-pos: 1.0.16 3425 | sentence-splitter: 3.2.3 3426 | textlint-rule-helper: 2.5.0 3427 | 3428 | textlint-rule-helper@2.5.0: 3429 | dependencies: 3430 | '@textlint/ast-node-types': 15.5.0 3431 | structured-source: 4.0.0 3432 | unist-util-visit: 2.0.3 3433 | 3434 | textlint-rule-ja-space-between-half-and-full-width@2.4.2: 3435 | dependencies: 3436 | '@textlint/regexp-string-matcher': 2.0.2 3437 | match-index: 1.0.3 3438 | textlint-rule-helper: 2.5.0 3439 | 3440 | textlint@15.5.0: 3441 | dependencies: 3442 | '@modelcontextprotocol/sdk': 1.24.3(zod@3.25.76) 3443 | '@textlint/ast-node-types': 15.5.0 3444 | '@textlint/ast-traverse': 15.5.0 3445 | '@textlint/config-loader': 15.5.0 3446 | '@textlint/feature-flag': 15.5.0 3447 | '@textlint/fixer-formatter': 15.5.0 3448 | '@textlint/kernel': 15.5.0 3449 | '@textlint/linter-formatter': 15.5.0 3450 | '@textlint/module-interop': 15.5.0 3451 | '@textlint/resolver': 15.5.0 3452 | '@textlint/textlint-plugin-markdown': 15.5.0 3453 | '@textlint/textlint-plugin-text': 15.5.0 3454 | '@textlint/types': 15.5.0 3455 | '@textlint/utils': 15.5.0 3456 | debug: 4.4.3 3457 | file-entry-cache: 10.1.4 3458 | glob: 10.5.0 3459 | md5: 2.3.0 3460 | optionator: 0.9.4 3461 | path-to-glob-pattern: 2.0.1 3462 | rc-config-loader: 4.1.3 3463 | read-package-up: 11.0.0 3464 | structured-source: 4.0.0 3465 | zod: 3.25.76 3466 | transitivePeerDependencies: 3467 | - '@cfworker/json-schema' 3468 | - supports-color 3469 | 3470 | toidentifier@1.0.1: {} 3471 | 3472 | trim-lines@3.0.1: {} 3473 | 3474 | trough@1.0.5: {} 3475 | 3476 | type-check@0.4.0: 3477 | dependencies: 3478 | prelude-ls: 1.2.1 3479 | 3480 | type-fest@4.41.0: {} 3481 | 3482 | type-is@2.0.1: 3483 | dependencies: 3484 | content-type: 1.0.5 3485 | media-typer: 1.1.0 3486 | mime-types: 3.0.2 3487 | 3488 | unicorn-magic@0.1.0: {} 3489 | 3490 | unified@9.2.2: 3491 | dependencies: 3492 | '@types/unist': 2.0.11 3493 | bail: 1.0.5 3494 | extend: 3.0.2 3495 | is-buffer: 2.0.5 3496 | is-plain-obj: 2.1.0 3497 | trough: 1.0.5 3498 | vfile: 4.2.1 3499 | 3500 | unist-util-is@4.1.0: {} 3501 | 3502 | unist-util-is@6.0.1: 3503 | dependencies: 3504 | '@types/unist': 3.0.3 3505 | 3506 | unist-util-position@5.0.0: 3507 | dependencies: 3508 | '@types/unist': 3.0.3 3509 | 3510 | unist-util-stringify-position@2.0.3: 3511 | dependencies: 3512 | '@types/unist': 2.0.11 3513 | 3514 | unist-util-stringify-position@4.0.0: 3515 | dependencies: 3516 | '@types/unist': 3.0.3 3517 | 3518 | unist-util-visit-parents@3.1.1: 3519 | dependencies: 3520 | '@types/unist': 2.0.11 3521 | unist-util-is: 4.1.0 3522 | 3523 | unist-util-visit-parents@6.0.2: 3524 | dependencies: 3525 | '@types/unist': 3.0.3 3526 | unist-util-is: 6.0.1 3527 | 3528 | unist-util-visit@2.0.3: 3529 | dependencies: 3530 | '@types/unist': 2.0.11 3531 | unist-util-is: 4.1.0 3532 | unist-util-visit-parents: 3.1.1 3533 | 3534 | unist-util-visit@5.0.0: 3535 | dependencies: 3536 | '@types/unist': 3.0.3 3537 | unist-util-is: 6.0.1 3538 | unist-util-visit-parents: 6.0.2 3539 | 3540 | unpipe@1.0.0: {} 3541 | 3542 | util-deprecate@1.0.2: {} 3543 | 3544 | validate-npm-package-license@3.0.4: 3545 | dependencies: 3546 | spdx-correct: 3.2.0 3547 | spdx-expression-parse: 3.0.1 3548 | 3549 | vary@1.1.2: {} 3550 | 3551 | vfile-message@2.0.4: 3552 | dependencies: 3553 | '@types/unist': 2.0.11 3554 | unist-util-stringify-position: 2.0.3 3555 | 3556 | vfile-message@4.0.3: 3557 | dependencies: 3558 | '@types/unist': 3.0.3 3559 | unist-util-stringify-position: 4.0.0 3560 | 3561 | vfile@4.2.1: 3562 | dependencies: 3563 | '@types/unist': 2.0.11 3564 | is-buffer: 2.0.5 3565 | unist-util-stringify-position: 2.0.3 3566 | vfile-message: 2.0.4 3567 | 3568 | vfile@6.0.3: 3569 | dependencies: 3570 | '@types/unist': 3.0.3 3571 | vfile-message: 4.0.3 3572 | 3573 | vite@5.4.21: 3574 | dependencies: 3575 | esbuild: 0.21.5 3576 | postcss: 8.5.6 3577 | rollup: 4.53.3 3578 | optionalDependencies: 3579 | fsevents: 2.3.3 3580 | 3581 | vitepress@1.6.4(@algolia/client-search@5.46.0)(postcss@8.5.6)(search-insights@2.17.3): 3582 | dependencies: 3583 | '@docsearch/css': 3.8.2 3584 | '@docsearch/js': 3.8.2(@algolia/client-search@5.46.0)(search-insights@2.17.3) 3585 | '@iconify-json/simple-icons': 1.2.62 3586 | '@shikijs/core': 2.5.0 3587 | '@shikijs/transformers': 2.5.0 3588 | '@shikijs/types': 2.5.0 3589 | '@types/markdown-it': 14.1.2 3590 | '@vitejs/plugin-vue': 5.2.4(vite@5.4.21)(vue@3.5.25) 3591 | '@vue/devtools-api': 7.7.9 3592 | '@vue/shared': 3.5.25 3593 | '@vueuse/core': 12.8.2 3594 | '@vueuse/integrations': 12.8.2(focus-trap@7.6.6) 3595 | focus-trap: 7.6.6 3596 | mark.js: 8.11.1 3597 | minisearch: 7.2.0 3598 | shiki: 2.5.0 3599 | vite: 5.4.21 3600 | vue: 3.5.25 3601 | optionalDependencies: 3602 | postcss: 8.5.6 3603 | transitivePeerDependencies: 3604 | - '@algolia/client-search' 3605 | - '@types/node' 3606 | - '@types/react' 3607 | - async-validator 3608 | - axios 3609 | - change-case 3610 | - drauu 3611 | - fuse.js 3612 | - idb-keyval 3613 | - jwt-decode 3614 | - less 3615 | - lightningcss 3616 | - nprogress 3617 | - qrcode 3618 | - react 3619 | - react-dom 3620 | - sass 3621 | - sass-embedded 3622 | - search-insights 3623 | - sortablejs 3624 | - stylus 3625 | - sugarss 3626 | - terser 3627 | - typescript 3628 | - universal-cookie 3629 | 3630 | vue@3.5.25: 3631 | dependencies: 3632 | '@vue/compiler-dom': 3.5.25 3633 | '@vue/compiler-sfc': 3.5.25 3634 | '@vue/runtime-dom': 3.5.25 3635 | '@vue/server-renderer': 3.5.25(vue@3.5.25) 3636 | '@vue/shared': 3.5.25 3637 | 3638 | which@2.0.2: 3639 | dependencies: 3640 | isexe: 2.0.0 3641 | 3642 | word-wrap@1.2.5: {} 3643 | 3644 | wrap-ansi@7.0.0: 3645 | dependencies: 3646 | ansi-styles: 4.3.0 3647 | string-width: 4.2.3 3648 | strip-ansi: 6.0.1 3649 | 3650 | wrap-ansi@8.1.0: 3651 | dependencies: 3652 | ansi-styles: 6.2.3 3653 | string-width: 5.1.2 3654 | strip-ansi: 7.1.2 3655 | 3656 | wrappy@1.0.2: {} 3657 | 3658 | zod-to-json-schema@3.25.0(zod@3.25.76): 3659 | dependencies: 3660 | zod: 3.25.76 3661 | 3662 | zod@3.25.76: {} 3663 | 3664 | zwitch@1.0.5: {} 3665 | 3666 | zwitch@2.0.4: {} 3667 | --------------------------------------------------------------------------------