diff --git a/.github/ISSUE_TEMPLATE/BUGS.yml b/.github/ISSUE_TEMPLATE/BUGS.yml index 64dab21b7..18358ff12 100644 --- a/.github/ISSUE_TEMPLATE/BUGS.yml +++ b/.github/ISSUE_TEMPLATE/BUGS.yml @@ -1,13 +1,10 @@ name: "Bug Report πŸͺ²" description: Report an issue or possible bug with the functionality of the Solid docs website. (Not related to the content of the site.) title: "[Bug]: " -labels: [ - "bug", - "pending review" -] -assignees: -- danieljcafonso -- atilafassina +labels: ["bug", "pending review"] +assignees: + - danieljcafonso + - atilafassina body: - type: textarea @@ -25,13 +22,13 @@ body: description: Please indicate on which page(s) the issue occurs. placeholder: https://docs.solidjs.com/concepts/intro-to-reactivity validations: - required: true + required: true - type: textarea id: expected attributes: label: "πŸ€” Expected Behavior" description: Please describe what the expected behavior should be. - placeholder: When on this page, I expected . . . + placeholder: When on this page, I expected . . . validations: required: true - type: textarea @@ -39,7 +36,7 @@ body: attributes: label: "πŸ‘€ Current Behavior" description: Please describe what the current behavior is. - placeholder: But instead, on this page I'm noticing . . . + placeholder: But instead, on this page I'm noticing . . . validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/CONTENT.yml b/.github/ISSUE_TEMPLATE/CONTENT.yml index 477a961ee..1b1ebe748 100644 --- a/.github/ISSUE_TEMPLATE/CONTENT.yml +++ b/.github/ISSUE_TEMPLATE/CONTENT.yml @@ -1,11 +1,9 @@ name: "Content Report πŸ“„" title: "[Content]:" description: Report an issue with existing content. -labels: [ - "improve documentation", "pending review" -] -assignees: -- ladybluenotes +labels: ["improve documentation", "pending review"] +assignees: + - ladybluenotes body: - type: markdown attributes: @@ -25,7 +23,7 @@ body: description: Please provide the URL of the page(s) affected. placeholder: https://docs.solidjs.com/concepts/intro-to-reactivity validations: - required: true + required: true - type: textarea id: generalDesc attributes: @@ -33,11 +31,11 @@ body: description: Let us know what's wrong! placeholder: "..." validations: - required: true + required: true - type: textarea id: incorrectContent attributes: label: "πŸ–₯️ Reproduction in StackBlitz (if reporting incorrect content or code samples)" description: If you are reporting incorrect content or code samples, you can also attach a reproduction in stackblitz. validations: - required: false + required: false diff --git a/.github/ISSUE_TEMPLATE/REQUEST.yml b/.github/ISSUE_TEMPLATE/REQUEST.yml index 55479fe1e..f1aef4ba5 100644 --- a/.github/ISSUE_TEMPLATE/REQUEST.yml +++ b/.github/ISSUE_TEMPLATE/REQUEST.yml @@ -1,11 +1,9 @@ name: "Request πŸ’‘" title: "[Request]:" description: Share an idea. -labels: [ - "request", "pending review" -] +labels: ["request", "pending review"] assignees: -- ladybluenotes + - ladybluenotes body: - type: markdown attributes: @@ -14,7 +12,7 @@ body: id: request-topic attributes: label: "What is this request related to?" - options: + options: - Request - Styling - Feature @@ -27,7 +25,7 @@ body: description: Please provide the URL of the page(s) or section this idea is related to. placeholder: https://docs.solidjs.com/concepts/intro-to-reactivity validations: - required: false + required: false - type: textarea id: generalDesc attributes: @@ -35,7 +33,7 @@ body: description: Please provide a general description or bullet points about what you would like to see added. placeholder: "..." validations: - required: true + required: true - type: textarea id: example attributes: @@ -43,4 +41,4 @@ body: description: If you would like to suggest code samples please attach a working reproduction. placeholder: "..." validations: - required: false + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b10530443..06c228009 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,4 +2,4 @@ blank_issues_enabled: true contact_links: - name: Support & Community πŸ’ url: https://discord.com/invite/solidjs - about: 'This issue tracker is not for support questions. Our Discord server hosts the community of Solid users. Come join us to discuss Solid or find assistance!' + about: "This issue tracker is not for support questions. Our Discord server hosts the community of Solid users. Come join us to discuss Solid or find assistance!" diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1a6d7de3a..b9f88f0cc 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,6 +4,7 @@ - [ ] This PR references an issue (except for typos, broken links, or other minor problems) ### Description(required) + ### Related issues & labels diff --git a/.github/actions/install/action.yml b/.github/actions/install/action.yml index d5f890a02..17ced68c1 100644 --- a/.github/actions/install/action.yml +++ b/.github/actions/install/action.yml @@ -7,13 +7,12 @@ runs: - name: Setup pnpm uses: pnpm/action-setup@v4 with: - version: 9 - run_install: false + version: 10 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: - node-version: 20 + node-version: 24 cache: pnpm - name: Install dependencies diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..35b5a9c30 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + assignees: + - "ladybluenotes" + group: + minor-patch: + applies-to: + - + patterns: + - "*" + update-types: + - "minor" + - "patch" diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml new file mode 100644 index 000000000..d3a2f92fb --- /dev/null +++ b/.github/workflows/autofix.yml @@ -0,0 +1,31 @@ +name: autofix.ci + +on: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: write + +jobs: + autofix: + name: autofix + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5.0.0 + with: + fetch-depth: 0 + - name: Setup Tools + uses: ./.github/actions/install + - name: Fix lint issues + run: pnpm lint:fix + - name: Fix formatting + run: pnpm format + - name: Apply fixes + uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 + with: + commit-message: "ci: apply automated fixes" diff --git a/.github/workflows/orama_sync.yml b/.github/workflows/orama_sync.yml index 1da8d02f4..ab1e5df91 100644 --- a/.github/workflows/orama_sync.yml +++ b/.github/workflows/orama_sync.yml @@ -8,19 +8,23 @@ on: paths: - "**.mdx" +permissions: + contents: read + pull-requests: read + jobs: build: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 + - uses: pnpm/action-setup@v4 with: - version: 9 + version: 10 - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 24.x cache: pnpm - name: Install dependencies run: pnpm i @@ -28,4 +32,5 @@ jobs: run: pnpm sync:orama env: ORAMA_PRIVATE_API_KEY: ${{ secrets.ORAMA_PRIVATE_API_KEY }} - ORAMA_PRIVATE_INDEX_ID: ${{ secrets.ORAMA_PRIVATE_INDEX_ID }} + ORAMA_DATASOURCE_ID: ${{ secrets.ORAMA_DATASOURCE_ID }} + ORAMA_PROJECT_ID: ${{ secrets.ORAMA_PROJECT_ID }} diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index ed34e8af5..9c4e09ba8 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -4,17 +4,21 @@ on: push: branches: - main - pull_request: branches: - main +permissions: + contents: read + actions: read + security-events: read + jobs: typecheck: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install tools & dependencies uses: ./.github/actions/install @@ -29,10 +33,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install tools & dependencies uses: ./.github/actions/install - name: Lint code run: pnpm check:lint + + - name: Check formatting + run: pnpm exec prettier . --check diff --git a/.prettierignore b/.prettierignore index 97ea5f250..44ceb5a9c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,5 @@ .solid dist *.min.* -package-lock.json \ No newline at end of file +package-lock.json +.github diff --git a/.prettierrc b/.prettierrc index 1d91c6a99..bfe5b02fa 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,5 +4,5 @@ "semi": true, "singleQuote": false, "useTabs": true, - "plugins": ["prettier-plugin-tailwindcss"] + "plugins": ["prettier-plugin-tailwindcss"] } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 26b11b8c7..1e94e9a22 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -133,13 +133,13 @@ Though it is not a hard requirement, we'd deeply appreciate if you could recomme 1. Create a dictionary file in `src/i18n/dictionaries/{locale}/ui.ts`. The name should follow our locale convention. - - language (ISO 639-1 - set 1): https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes - - country code(optional) (ISO 3166-1 alpha-2): https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 - - E.g.: Canadian French would be: `fr-ca` +- language (ISO 639-1 - set 1): https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes +- country code(optional) (ISO 3166-1 alpha-2): https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 +- E.g.: Canadian French would be: `fr-ca` 2. Add the `import` and language information to the objects in the barrel file: `./src/i18n/dictionaries/index.ts`. So it will be identified by the routing system, and an entry its added to the language dropdown. 3. Add the language to the `array` in `./scripts/collections/index.mjs` so internal files are created. -4. Add the important UI translations to `./src/i18n/dictionaries/{locale}/ui.ts` +4. Add the important UI translations to `./src/i18n/dictionaries/{locale}/ui.ts` 5. Add at least the index page `./src/routes/{locale}/index.mdx`, so others and yourself could see things in action. #### Adding translations to a supported language diff --git a/README.md b/README.md index 3c48337e6..035aea0fd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Solid Docs +

+ Solid Documentation +

Welcome to Solid's documentation! diff --git a/WRITING.md b/WRITING.md index f1e371efc..2f0473a13 100644 --- a/WRITING.md +++ b/WRITING.md @@ -188,6 +188,27 @@ Do: Check the [Solid homepage](https://www.solidjs.com) Don't: Click [here](https://www.solidjs.com) to go to the Solid homepage. ``` +## Reference pages + +Reference pages document the API surface. +Keep them concise and easy to scan. + +Include: + +- Imports +- Signatures +- Parameters +- Return values +- Short examples + +Avoid: + +- Narrative context or β€œwhy” +- Usage guidance (β€œwhen to use”, best practices) +- Long notes + +If explanation is needed, link to a guide or how-to page. + ## Voice and tone So far, we've dealt with how your contributions should look and function. diff --git a/app.config.ts b/app.config.ts index 24f7049e4..3313de230 100644 --- a/app.config.ts +++ b/app.config.ts @@ -87,6 +87,8 @@ export default defineConfig( "install-dev": "npm i :content -D", "install-global": "npm i :content -g", "install-local": "npm i", + remove: "npm remove :content", + update: "npm update :content", run: "npm run :content", exec: "npx :content", create: "npm init :content", @@ -96,6 +98,8 @@ export default defineConfig( "install-dev": "pnpm i :content -D", "install-global": "pnpm i :content -g", "install-local": "pnpm i", + remove: "pnpm remove :content", + update: "pnpm update :content", run: "pnpm :content", exec: "pnpx :content", create: "pnpm create :content", @@ -105,6 +109,8 @@ export default defineConfig( "install-dev": "yarn add :content -D", "install-global": "yarn add :content -g", "install-local": "yarn i", + remove: "yarn remove :content", + update: "yarn upgrade :content", run: "yarn :content", exec: "yarn dlx :content", create: "yarn create :content", @@ -114,6 +120,8 @@ export default defineConfig( "install-dev": "bun i :content -d", "install-global": "bun i :content -g", "install-local": "bun i", + remove: "bun remove :content", + update: "bun update :content", run: "bun run :content", exec: "bunx :content", create: "bun create :content", @@ -123,6 +131,8 @@ export default defineConfig( "install-dev": "deno add npm::content -D", "install-global": "deno add npm::content -g", "install-local": "deno i", + remove: "deno remove npm::content", + update: "deno update npm::content", run: "deno run :content", exec: "dpx :content", create: "deno init --npm :content", diff --git a/env.d.ts b/env.d.ts index df07a8100..eaa53030d 100644 --- a/env.d.ts +++ b/env.d.ts @@ -10,8 +10,10 @@ interface ImportMeta { declare namespace NodeJS { interface ProcessEnv { + readonly ORAMA_PROJECT_ID: string; + readonly ORAMA_DATASOURCE_ID: string; + readonly ORAMA_PUBLIC_API_KEY: string; readonly ORAMA_PRIVATE_API_KEY: string; - readonly ORAMA_PRIVATE_INDEX_ID: string; } } diff --git a/eslint.config.ts b/eslint.config.ts index 5cb595e0c..6497c04d0 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -4,7 +4,9 @@ import * as globals from "globals"; import tseslint from "typescript-eslint"; import tsParser from "@typescript-eslint/parser"; -export default [ +export default tseslint.config( + eslint.configs.recommended, + tseslint.configs.recommended, { name: "global-ignores", ignores: [ @@ -18,8 +20,6 @@ export default [ "scripts/", ], }, - eslint.configs.recommended, - ...tseslint.configs.recommended, { files: ["**/*.{ts,tsx}"], languageOptions: { @@ -53,5 +53,5 @@ export default [ }, ], }, - }, -]; + } +); diff --git a/lunaria.config.json b/lunaria.config.json deleted file mode 100644 index 63fd45cd1..000000000 --- a/lunaria.config.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "./node_modules/@lunariajs/core/config.schema.json", - "repository": { - "name": "solidjs/solid-docs-next", - "branch": "main", - "hosting": "github" - }, - "defaultLocale": { - "label": "English", - "lang": "en" - }, - "files": [ - { - "type": "universal", - "location": "src/routes/**/*.{mdx,md}", - "pattern": "src/routes/@lang/@path" - }, - { - "location": "src/i18n/dictionaries/**/ui.ts", - "pattern": "src/i18n/dictionaries/@lang/@path", - "type": "dictionary" - } - ], - "locales": [ - { - "label": "PortuguΓͺs do Brasil", - "lang": "pt-br" - } - ], - "outDir": "./public/i18n-status", - "dashboard": { - "site": "https://docs.solidjs.com/i18n-status", - "title": "Solid Docs Translation Status", - "description": "Translation progress tracker for the Solid Docs site", - "basesToHide": ["src/routes/", "src/i18n/dictionaries/"], - "favicon": { - "external": [ - { - "link": "https://docs.solidjs.com/favicon.ico", - "type": "image/x-icon" - }, - { - "link": "https://docs.solidjs.com/favicon.svg", - "type": "image/svg+xml" - } - ] - }, - "customCss": ["./lunaria/styles.css"], - "ui": { - "statusByLocale.heading": "Translation progress by locale", - "statusByLocale.incompleteLocalizationLink": "incomplete translation", - "statusByLocale.outdatedLocalizationLink": "outdated translation", - "statusByLocale.completeLocalization": "This translation is complete, amazing job! πŸŽ‰", - "statusByFile.heading": "Translation status by file" - } - } -} diff --git a/lunaria/styles.css b/lunaria/styles.css deleted file mode 100644 index cd92464a8..000000000 --- a/lunaria/styles.css +++ /dev/null @@ -1,4 +0,0 @@ -:root { - --tw-bg-opacity: 1; - background-color: rgb(15 23 42 / var(--tw-bg-opacity)); -} diff --git a/osmium/README.md b/osmium/README.md new file mode 100644 index 000000000..453b8b80f --- /dev/null +++ b/osmium/README.md @@ -0,0 +1,26 @@ +# Osmium + +Official SolidJS docs theme for SolidBase. + +## Installation + +```sh +npm i solidbase-osmium +``` + +In your `vite.config.ts`: + +```ts +import { osmium } from "solidbase-osmium"; + +const solidBase = createSolidBase(osmium); + +export default defineConfig({ + ...solidBase.startConfig({ + ... + }), + plugins: [solidBase.plugin({ ... })], +}) +``` + +More information in the [SolidBase docs for consuming a theme.](https://solidbase.dev/guide/customization/custom-themes#consuming-a-theme) diff --git a/osmium/package.json b/osmium/package.json new file mode 100644 index 000000000..bcbed4480 --- /dev/null +++ b/osmium/package.json @@ -0,0 +1,19 @@ +{ + "name": "solidbase-osmium", + "version": "0.0.0", + "description": "Official SolidJS docs theme for SolidBase.", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "url": "https://github.com/solidjs/solid-docs" + }, + "keywords": [ + "solid", + "solidjs", + "solidbase", + "theme" + ], + "license": "MIT" +} diff --git a/package.json b/package.json index 2a068d1cf..d3624487c 100644 --- a/package.json +++ b/package.json @@ -8,60 +8,60 @@ "sync": "node scripts/collections/index.mjs", "sync:orama": "pnpm build && node scripts/sync-orama.mjs", "dev": "pnpm sync && vinxi dev", - "build": "pnpm sync && pnpm build:sitemap && pnpm build:lunaria && NODE_OPTIONS=\"--max-old-space-size=8192\" vinxi build", + "build": "pnpm sync && pnpm build:sitemap && pnpm build:llms && NODE_OPTIONS=\"--max-old-space-size=8192\" vinxi build", + "build:llms": "node scripts/llms-gen.js", "build:sitemap": "node scripts/generateSitemap.js", "start": "vinxi start", "e2e": "npx playwright test", - "build:lunaria": "lunaria build", - "preview:lunaria": "lunaria preview", - "check:lint": "eslint .", + "format": "prettier . --write", + "lint:fix": "eslint --flag unstable_native_nodejs_ts_config . --fix", + "check:lint": "eslint --flag unstable_native_nodejs_ts_config .", "check:types": "tsc --noEmit" }, "dependencies": { - "@kobalte/core": "^0.13.10", - "@kobalte/solidbase": "^0.2.16", - "@lunariajs/core": "^0.1.1", - "@oramacloud/client": "^2.1.4", - "@solid-primitives/event-listener": "^2.4.1", - "@solid-primitives/marker": "^0.2.1", - "@solid-primitives/media": "^2.3.1", + "@kobalte/core": "^0.13.11", + "@kobalte/solidbase": "^0.2.20", + "@orama/core": "^1.2.19", + "@solid-primitives/event-listener": "^2.4.5", + "@solid-primitives/marker": "^0.2.2", + "@solid-primitives/media": "^2.3.5", "@solid-primitives/platform": "^0.2.1", "@solidjs/meta": "^0.29.4", - "@solidjs/router": "^0.15.3", - "@solidjs/start": "^1.1.4", - "dotenv": "^16.5.0", - "glob": "^11.0.2", + "@solidjs/router": "^0.15.4", + "@solidjs/start": "^1.3.2", + "dotenv": "^17.3.1", + "glob": "^13.0.6", "gray-matter": "^4.0.3", - "postcss": "^8.5.5", - "shiki": "^3.6.0", - "sitemap": "^8.0.0", + "postcss": "^8.5.8", + "shiki": "^4.0.2", + "sitemap": "^9.0.1", "solid-heroicons": "^3.2.4", - "solid-js": "^1.9.7", + "solid-js": "^1.9.12", "solid-list": "^0.3.0", "vinxi": "^0.5.7", - "zod": "^3.25.62" + "zod": "^4.3.6" }, "devDependencies": { - "@eslint/js": "^9.29.0", + "@eslint/js": "^9.39.4", "@kobalte/tailwindcss": "^0.9.0", "@orama/crawly": "^0.0.6", - "@tailwindcss/typography": "^0.5.16", - "@types/node": "^24.0.1", - "@typescript-eslint/eslint-plugin": "^8.34.0", - "@typescript-eslint/parser": "^8.34.0", - "autoprefixer": "^10.4.21", - "eslint": "^9.28.0", + "@tailwindcss/typography": "^0.5.19", + "@types/node": "^25.5.0", + "@typescript-eslint/eslint-plugin": "^8.54.0", + "@typescript-eslint/parser": "^8.56.1", + "autoprefixer": "^10.4.27", + "eslint": "^9.39.2", "eslint-plugin-solid": "^0.14.5", - "globals": "^16.2.0", - "prettier": "3.5.3", - "prettier-plugin-tailwindcss": "^0.6.13", - "tailwindcss": "^3.4.17", - "typescript": "^5.8.3", - "typescript-eslint": "^8.34.0", + "globals": "^17.4.0", + "prettier": "3.8.1", + "prettier-plugin-tailwindcss": "^0.7.2", + "tailwindcss": "^3.4.19", + "typescript": "^5.9.3", + "typescript-eslint": "^8.58.0", "vite": "^6.3.5" }, "engines": { - "node": ">=18", - "pnpm": ">=9" + "node": ">=24", + "pnpm": ">=10" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 29a7dd19d..a23a0c06a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,1919 +1,3124 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: - .: dependencies: - '@kobalte/core': - specifier: ^0.13.10 - version: 0.13.10(solid-js@1.9.7) - '@kobalte/solidbase': - specifier: ^0.2.16 - version: 0.2.16(@algolia/client-search@5.14.2)(@solidjs/start@1.1.4(solid-js@1.9.7)(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)))(@vue/compiler-sfc@3.5.16)(acorn@8.15.0)(expressive-code@0.40.2)(react@18.3.1)(search-insights@2.17.3)(solid-js@1.9.7)(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) - '@lunariajs/core': - specifier: ^0.1.1 - version: 0.1.1 - '@oramacloud/client': - specifier: ^2.1.4 - version: 2.1.4 - '@solid-primitives/event-listener': - specifier: ^2.4.1 - version: 2.4.1(solid-js@1.9.7) - '@solid-primitives/marker': - specifier: ^0.2.1 - version: 0.2.1(solid-js@1.9.7) - '@solid-primitives/media': - specifier: ^2.3.1 - version: 2.3.1(solid-js@1.9.7) - '@solid-primitives/platform': + "@kobalte/core": + specifier: ^0.13.11 + version: 0.13.11(solid-js@1.9.12) + "@kobalte/solidbase": + specifier: ^0.2.20 + version: 0.2.20(@solidjs/start@1.3.2(solid-js@1.9.12)(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)))(@vue/compiler-sfc@3.5.16)(solid-js@1.9.12)(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) + "@orama/core": + specifier: ^1.2.19 + version: 1.2.19 + "@solid-primitives/event-listener": + specifier: ^2.4.5 + version: 2.4.5(solid-js@1.9.12) + "@solid-primitives/marker": + specifier: ^0.2.2 + version: 0.2.2(solid-js@1.9.12) + "@solid-primitives/media": + specifier: ^2.3.5 + version: 2.3.5(solid-js@1.9.12) + "@solid-primitives/platform": specifier: ^0.2.1 - version: 0.2.1(solid-js@1.9.7) - '@solidjs/meta': + version: 0.2.1(solid-js@1.9.12) + "@solidjs/meta": specifier: ^0.29.4 - version: 0.29.4(solid-js@1.9.7) - '@solidjs/router': - specifier: ^0.15.3 - version: 0.15.3(solid-js@1.9.7) - '@solidjs/start': - specifier: ^1.1.4 - version: 1.1.4(solid-js@1.9.7)(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) + version: 0.29.4(solid-js@1.9.12) + "@solidjs/router": + specifier: ^0.15.4 + version: 0.15.4(solid-js@1.9.12) + "@solidjs/start": + specifier: ^1.3.2 + version: 1.3.2(solid-js@1.9.12)(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^17.3.1 + version: 17.3.1 glob: - specifier: ^11.0.2 - version: 11.0.2 + specifier: ^13.0.6 + version: 13.0.6 gray-matter: specifier: ^4.0.3 version: 4.0.3 postcss: - specifier: ^8.5.5 - version: 8.5.5 + specifier: ^8.5.8 + version: 8.5.8 shiki: - specifier: ^3.6.0 - version: 3.6.0 + specifier: ^4.0.2 + version: 4.0.2 sitemap: - specifier: ^8.0.0 - version: 8.0.0 + specifier: ^9.0.1 + version: 9.0.1 solid-heroicons: specifier: ^3.2.4 - version: 3.2.4(solid-js@1.9.7) + version: 3.2.4(solid-js@1.9.12) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.12 + version: 1.9.12 solid-list: specifier: ^0.3.0 - version: 0.3.0(solid-js@1.9.7) + version: 0.3.0(solid-js@1.9.12) vinxi: specifier: ^0.5.7 - version: 0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) + version: 0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) zod: - specifier: ^3.25.62 - version: 3.25.62 + specifier: ^4.3.6 + version: 4.3.6 devDependencies: - '@eslint/js': - specifier: ^9.29.0 - version: 9.29.0 - '@kobalte/tailwindcss': + "@eslint/js": + specifier: ^9.39.4 + version: 9.39.4 + "@kobalte/tailwindcss": specifier: ^0.9.0 - version: 0.9.0(tailwindcss@3.4.17) - '@orama/crawly': + version: 0.9.0(tailwindcss@3.4.19(yaml@2.8.1)) + "@orama/crawly": specifier: ^0.0.6 version: 0.0.6 - '@tailwindcss/typography': - specifier: ^0.5.16 - version: 0.5.16(tailwindcss@3.4.17) - '@types/node': - specifier: ^24.0.1 - version: 24.0.1 - '@typescript-eslint/eslint-plugin': - specifier: ^8.34.0 - version: 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^8.34.0 - version: 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + "@tailwindcss/typography": + specifier: ^0.5.19 + version: 0.5.19(tailwindcss@3.4.19(yaml@2.8.1)) + "@types/node": + specifier: ^25.5.0 + version: 25.5.0 + "@typescript-eslint/eslint-plugin": + specifier: ^8.54.0 + version: 8.54.0(@typescript-eslint/parser@8.56.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/parser": + specifier: ^8.56.1 + version: 8.56.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) autoprefixer: - specifier: ^10.4.21 - version: 10.4.21(postcss@8.5.5) + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.8) eslint: - specifier: ^9.28.0 - version: 9.28.0(jiti@2.4.2) + specifier: ^9.39.2 + version: 9.39.2(jiti@1.21.7) eslint-plugin-solid: specifier: ^0.14.5 - version: 0.14.5(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + version: 0.14.5(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) globals: - specifier: ^16.2.0 - version: 16.2.0 + specifier: ^17.4.0 + version: 17.4.0 prettier: - specifier: 3.5.3 - version: 3.5.3 + specifier: 3.8.1 + version: 3.8.1 prettier-plugin-tailwindcss: - specifier: ^0.6.13 - version: 0.6.13(prettier@3.5.3) + specifier: ^0.7.2 + version: 0.7.2(prettier@3.8.1) tailwindcss: - specifier: ^3.4.17 - version: 3.4.17 + specifier: ^3.4.19 + version: 3.4.19(yaml@2.8.1) typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 typescript-eslint: - specifier: ^8.34.0 - version: 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.58.0 + version: 8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) - -packages: - - '@algolia/autocomplete-core@1.17.7': - resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7': - resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.17.7': - resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.7': - resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/client-abtesting@5.14.2': - resolution: {integrity: sha512-7fq1tWIy1aNJEaNHxWy3EwDkuo4k22+NBnxq9QlYVSLLXtr6HqmAm6bQgNNzGT3vm21iKqWO9efk+HIhEM1SzQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.14.2': - resolution: {integrity: sha512-5Nm5cOOyAGcY+hKNJVmR2jgoGn1nvoANS8W5EfB8yAaUqUxL3lFNUHSkFafAMTCOcVKNDkZQYjUDbOOfdYJLqw==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.14.2': - resolution: {integrity: sha512-BW1Qzhh9tMKEsWSQQsiOEcHAd6g7zxq9RpPVmyxbDO/O4eA4vyN+Qz5Jzo686kuYdIQKqIPCEtob/JM89tk57g==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.14.2': - resolution: {integrity: sha512-17zg6pqifKORvvrMIqW6HhwUry9RKRXLgADrgFjZ6PZvGB4oVs12dwRG2/HMrIlpxd9cjeQfdlEgHj6lbAf6QA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.14.2': - resolution: {integrity: sha512-5IYt8vbmTA52xyuaZKFwiRoDPeh7hiOC9aBZqqp9fVs6BU01djI/T8pGJXawvwczltCPYzNsdbllV3rqiDbxmQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.14.2': - resolution: {integrity: sha512-gvCX/cczU76Bu1sGcxxTdoIwxe+FnuC1IlW9SF/gzxd3ZzsgzBpzD2puIJqt9fHQsjLxVGkJqKev2FtExnJYZg==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.14.2': - resolution: {integrity: sha512-0imdBZDjqxrshw0+eyJUgnkRAbS2W93UQ3BVj8VjN4xQylIMf0fWs72W7MZFdHlH78JJYydevgzqvGMcV0Z1CA==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.14.2': - resolution: {integrity: sha512-/p4rBNkW0fgCpCwrwre+jHfzlFQsLemgaAQqyui8NPxw95Wgf3p+DKxYzcmh8dygT7ub7FwztTW+uURLX1uqIQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.14.2': - resolution: {integrity: sha512-81R57Y/mS0uNhWpu6cNEfkbkADLW4bP0BNjuPpxAypobv7WzYycUnbMvv1YkN6OsociB4+3M7HfsVzj4Nc09vA==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.14.2': - resolution: {integrity: sha512-OwELnAZxCUyfjYjqsrFmC7Vfa12kqwbDdLUV0oi4j+4pxDsfPgkiZ6iCH2uPw6X8VK88Hl3InPt+RPaZvcrCWg==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.14.2': - resolution: {integrity: sha512-irUvkK+TGBhyivtNCIIbVgNUgbUoHOSk8m/kFX4ddto/PUPmLFRRNNnMHtJ1+OzrJ/uD3Am4FUK2Yt+xgQr05w==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.14.2': - resolution: {integrity: sha512-UNBg5mM4MIYdxPuVjyDL22BC6P87g7WuM91Z1Ky0J19aEGvCSF+oR+9autthROFXdRnAa1rACOjuqn95iBbKpw==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.14.2': - resolution: {integrity: sha512-CTFA03YiLcnpP+JoLRqjHt5pqDHuKWJpLsIBY/60Gmw8pjALZ3TwvbAquRX4Vy+yrin178NxMuU+ilZ54f2IrQ==} - engines: {node: '>= 14.0.0'} - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@antfu/install-pkg@1.0.0': - resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + version: 6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) - '@antfu/utils@8.1.1': - resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + osmium: {} - '@babel/code-frame@7.25.7': - resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} - engines: {node: '>=6.9.0'} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.8': - resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.25.8': - resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.25.7': - resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.25.7': - resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.18.6': - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.25.7': - resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.25.7': - resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} +packages: + "@alloc/quick-lru@5.2.0": + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: ">=10" } + + "@ampproject/remapping@2.3.0": + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: ">=6.0.0" } + + "@antfu/install-pkg@1.1.0": + resolution: + { + integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==, + } + + "@antfu/utils@9.3.0": + resolution: + { + integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==, + } + + "@babel/code-frame@7.25.7": + resolution: + { + integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==, + } + engines: { node: ">=6.9.0" } + + "@babel/code-frame@7.26.2": + resolution: + { + integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/code-frame@7.29.0": + resolution: + { + integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==, + } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.25.8": + resolution: + { + integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==, + } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.29.0": + resolution: + { + integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==, + } + engines: { node: ">=6.9.0" } + + "@babel/core@7.25.8": + resolution: + { + integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==, + } + engines: { node: ">=6.9.0" } + + "@babel/core@7.29.0": + resolution: + { + integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==, + } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.25.7": + resolution: + { + integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==, + } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.29.1": + resolution: + { + integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.25.7": + resolution: + { + integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.28.6": + resolution: + { + integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-globals@7.28.0": + resolution: + { + integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.18.6": + resolution: + { + integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.25.7": + resolution: + { + integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.28.6": + resolution: + { + integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.25.7": + resolution: + { + integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.25.7': - resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0 + + "@babel/helper-module-transforms@7.28.6": + resolution: + { + integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-simple-access@7.25.7': - resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.7': - resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.7': - resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.25.7': - resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.25.7': - resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.25.7': - resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.8': - resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} - engines: {node: '>=6.0.0'} + "@babel/core": ^7.0.0 + + "@babel/helper-plugin-utils@7.25.7": + resolution: + { + integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-plugin-utils@7.28.6": + resolution: + { + integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-simple-access@7.25.7": + resolution: + { + integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.25.7": + resolution: + { + integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.27.1": + resolution: + { + integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.25.7": + resolution: + { + integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.28.5": + resolution: + { + integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.25.7": + resolution: + { + integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.27.1": + resolution: + { + integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.25.7": + resolution: + { + integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.28.6": + resolution: + { + integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==, + } + engines: { node: ">=6.9.0" } + + "@babel/highlight@7.25.7": + resolution: + { + integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.25.8": + resolution: + { + integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==, + } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} - engines: {node: '>=6.0.0'} + "@babel/parser@7.29.0": + resolution: + { + integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==, + } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/plugin-syntax-jsx@7.25.7': - resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-jsx@7.25.7": + resolution: + { + integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.25.7': - resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-jsx@7.28.6": + resolution: + { + integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-typescript@7.25.7": + resolution: + { + integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.27.1': - resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-typescript@7.28.6": + resolution: + { + integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==, + } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.27.1': - resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/template@7.25.7': - resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.7': - resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.25.8': - resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.9': - resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} - engines: {node: '>=6.9.0'} - - '@bprogress/core@1.1.18': - resolution: {integrity: sha512-+khsDSJ7jv1L9LU34jnEsNqY6tXViSZDOeoxd09Ws8zVXzFjatRzWwBpiDQqTqyVZc0nlOxkkumFDtAgDJwY2A==} - - '@clack/core@0.3.4': - resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} - - '@cloudflare/kv-asset-handler@0.4.0': - resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} - engines: {node: '>=18.0.0'} - - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - - '@corvu/utils@0.4.2': - resolution: {integrity: sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA==} + "@babel/core": ^7.0.0-0 + + "@babel/template@7.25.7": + resolution: + { + integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==, + } + engines: { node: ">=6.9.0" } + + "@babel/template@7.28.6": + resolution: + { + integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.25.7": + resolution: + { + integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==, + } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.29.0": + resolution: + { + integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.25.8": + resolution: + { + integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.27.6": + resolution: + { + integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.29.0": + resolution: + { + integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==, + } + engines: { node: ">=6.9.0" } + + "@bprogress/core@1.3.4": + resolution: + { + integrity: sha512-q/AqpurI/1uJzOrQROuZWixn/+ARekh+uvJGwLCP6HQ/EqAX4SkvNf618tSBxL4NysC0MwqAppb/mRw6Tzi61w==, + } + + "@cloudflare/kv-asset-handler@0.4.0": + resolution: + { + integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==, + } + engines: { node: ">=18.0.0" } + + "@colors/colors@1.6.0": + resolution: + { + integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==, + } + engines: { node: ">=0.1.90" } + + "@corvu/utils@0.4.2": + resolution: + { + integrity: sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA==, + } peerDependencies: solid-js: ^1.8 - '@ctrl/tinycolor@4.1.0': - resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} - engines: {node: '>=14'} - - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - - '@deno/shim-deno-test@0.5.0': - resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} - - '@deno/shim-deno@0.19.2': - resolution: {integrity: sha512-q3VTHl44ad8T2Tw2SpeAvghdGOjlnLPDNO2cpOxwMrBE/PVas6geWpbpIgrM+czOCH0yejp0yi8OaTuB+NU40Q==} - - '@dependents/detective-less@5.0.1': - resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} - engines: {node: '>=18'} - - '@docsearch/css@3.8.0': - resolution: {integrity: sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==} - - '@docsearch/js@3.8.0': - resolution: {integrity: sha512-PVuV629f5UcYRtBWqK7ID6vNL5647+2ADJypwTjfeBIrJfwPuHtzLy39hMGMfFK+0xgRyhTR0FZ83EkdEraBlg==} - - '@docsearch/react@3.8.0': - resolution: {integrity: sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} - engines: {node: '>=18'} + "@ctrl/tinycolor@4.2.0": + resolution: + { + integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==, + } + engines: { node: ">=14" } + + "@dabh/diagnostics@2.0.3": + resolution: + { + integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==, + } + + "@deno/shim-deno-test@0.5.0": + resolution: + { + integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==, + } + + "@deno/shim-deno@0.19.2": + resolution: + { + integrity: sha512-q3VTHl44ad8T2Tw2SpeAvghdGOjlnLPDNO2cpOxwMrBE/PVas6geWpbpIgrM+czOCH0yejp0yi8OaTuB+NU40Q==, + } + + "@dependents/detective-less@5.0.1": + resolution: + { + integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==, + } + engines: { node: ">=18" } + + "@docsearch/css@3.9.0": + resolution: + { + integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==, + } + + "@esbuild/aix-ppc64@0.25.5": + resolution: + { + integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.25.5": + resolution: + { + integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==, + } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.25.5": + resolution: + { + integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==, + } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.25.5": + resolution: + { + integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==, + } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.25.5": + resolution: + { + integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==, + } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.25.5": + resolution: + { + integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.25.5": + resolution: + { + integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.25.5": + resolution: + { + integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==, + } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.25.5": + resolution: + { + integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==, + } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.25.5": + resolution: + { + integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==, + } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.25.5": + resolution: + { + integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==, + } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.25.5": + resolution: + { + integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==, + } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.25.5": + resolution: + { + integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==, + } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.25.5": + resolution: + { + integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.25.5": + resolution: + { + integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==, + } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.25.5": + resolution: + { + integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==, + } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.25.5": + resolution: + { + integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==, + } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} - engines: {node: '>=18'} + "@esbuild/netbsd-arm64@0.25.5": + resolution: + { + integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.25.5": + resolution: + { + integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.25.5": + resolution: + { + integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.25.5": + resolution: + { + integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==, + } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.25.5": + resolution: + { + integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==, + } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.25.5": + resolution: + { + integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.25.5": + resolution: + { + integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==, + } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.25.5": + resolution: + { + integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==, + } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@eslint-community/eslint-utils@4.9.0": + resolution: + { + integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.20.1': - resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.2.3': - resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.0': - resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.28.0': - resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.29.0': - resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.3.2': - resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@expressive-code/core@0.40.2': - resolution: {integrity: sha512-gXY3v7jbgz6nWKvRpoDxK4AHUPkZRuJsM79vHX/5uhV9/qX6Qnctp/U/dMHog/LCVXcuOps+5nRmf1uxQVPb3w==} - - '@expressive-code/plugin-collapsible-sections@0.40.2': - resolution: {integrity: sha512-EtfuluXKk3CdFMAeCJoDsUJo/s+Yh9b+kX0hNHeFlZ/W2/H8FmdZ9Pu+Qel41vw4yP6AyiQpsamquO7bzlakug==} - - '@expressive-code/plugin-frames@0.40.2': - resolution: {integrity: sha512-aLw5IlDlZWb10Jo/TTDCVsmJhKfZ7FJI83Zo9VDrV0OBlmHAg7klZqw68VDz7FlftIBVAmMby53/MNXPnMjTSQ==} - - '@expressive-code/plugin-line-numbers@0.40.2': - resolution: {integrity: sha512-YMLkn68n9a9DI/4fQW/f6QJ33uQUzHmGdV3pDl+f6fVTxv7rvhRja+UtPksm0ZJpft6vrrACV8wS2TaH77SBzw==} - - '@expressive-code/plugin-shiki@0.40.2': - resolution: {integrity: sha512-t2HMR5BO6GdDW1c1ISBTk66xO503e/Z8ecZdNcr6E4NpUfvY+MRje+LtrcvbBqMwWBBO8RpVKcam/Uy+1GxwKQ==} - - '@expressive-code/plugin-text-markers@0.40.2': - resolution: {integrity: sha512-/XoLjD67K9nfM4TgDlXAExzMJp6ewFKxNpfUw4F7q5Ecy+IU3/9zQQG/O70Zy+RxYTwKGw2MA9kd7yelsxnSmw==} - - '@fastify/busboy@3.1.1': - resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} - - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - - '@floating-ui/dom@1.6.11': - resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} - - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - - '@fontsource-variable/inter@5.1.1': - resolution: {integrity: sha512-OpXFTmiH6tHkYijMvQTycFKBLK4X+SRV6tet1m4YOUH7SzIIlMqDja+ocDtiCA72UthBH/vF+3ZtlMr2rN/wIw==} - - '@fontsource-variable/jetbrains-mono@5.1.2': - resolution: {integrity: sha512-syGEJ/N4FFisAXegxtbe1etYpo2T630dqCbYufPf7Dli/hMKSoSUIm3wK4q5RsGFRxWno1WecfnsgZA1jRK0EQ==} - - '@fontsource-variable/lexend@5.1.2': - resolution: {integrity: sha512-5gY4aYZXvhCNrpqa7f/JmRnUyRMAPqGdE0IXicbqvusj+jEwuj1JuiLPl61hTbGntQP+sMZsDHECBhlrEY/8iQ==} - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@iconify/utils@2.3.0': - resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} - - '@internationalized/date@3.5.6': - resolution: {integrity: sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw==} - - '@internationalized/number@3.5.4': - resolution: {integrity: sha512-h9huwWjNqYyE2FXZZewWqmCdkw1HeFds5q4Siuoms3hUQC5iPJK3aBmkFZoDSLN4UD0Bl8G22L/NdHpeOr+/7A==} - - '@ioredis/commands@1.2.0': - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + "@eslint-community/eslint-utils@4.9.1": + resolution: + { + integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@kobalte/core@0.13.10': - resolution: {integrity: sha512-lzP64ThxZqZB6O6MnMq6w7DxK38o2ClbW3Ob6afUI6p86cUMz5Hb4rdysvYI6m1TKYlOAlFODKkoRznqybQohw==} + "@eslint-community/regexpp@4.12.2": + resolution: + { + integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + "@eslint/config-array@0.21.1": + resolution: + { + integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/config-helpers@0.4.2": + resolution: + { + integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/core@0.17.0": + resolution: + { + integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/eslintrc@3.3.3": + resolution: + { + integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.39.2": + resolution: + { + integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.39.4": + resolution: + { + integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/object-schema@2.1.7": + resolution: + { + integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/plugin-kit@0.4.1": + resolution: + { + integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@expressive-code/core@0.40.2": + resolution: + { + integrity: sha512-gXY3v7jbgz6nWKvRpoDxK4AHUPkZRuJsM79vHX/5uhV9/qX6Qnctp/U/dMHog/LCVXcuOps+5nRmf1uxQVPb3w==, + } + + "@expressive-code/core@0.41.3": + resolution: + { + integrity: sha512-9qzohqU7O0+JwMEEgQhnBPOw5DtsQRBXhW++5fvEywsuX44vCGGof1SL5OvPElvNgaWZ4pFZAFSlkNOkGyLwSQ==, + } + + "@expressive-code/plugin-collapsible-sections@0.40.2": + resolution: + { + integrity: sha512-EtfuluXKk3CdFMAeCJoDsUJo/s+Yh9b+kX0hNHeFlZ/W2/H8FmdZ9Pu+Qel41vw4yP6AyiQpsamquO7bzlakug==, + } + + "@expressive-code/plugin-frames@0.40.2": + resolution: + { + integrity: sha512-aLw5IlDlZWb10Jo/TTDCVsmJhKfZ7FJI83Zo9VDrV0OBlmHAg7klZqw68VDz7FlftIBVAmMby53/MNXPnMjTSQ==, + } + + "@expressive-code/plugin-frames@0.41.3": + resolution: + { + integrity: sha512-rFQtmf/3N2CK3Cq/uERweMTYZnBu+CwxBdHuOftEmfA9iBE7gTVvwpbh82P9ZxkPLvc40UMhYt7uNuAZexycRQ==, + } + + "@expressive-code/plugin-line-numbers@0.40.2": + resolution: + { + integrity: sha512-YMLkn68n9a9DI/4fQW/f6QJ33uQUzHmGdV3pDl+f6fVTxv7rvhRja+UtPksm0ZJpft6vrrACV8wS2TaH77SBzw==, + } + + "@expressive-code/plugin-shiki@0.40.2": + resolution: + { + integrity: sha512-t2HMR5BO6GdDW1c1ISBTk66xO503e/Z8ecZdNcr6E4NpUfvY+MRje+LtrcvbBqMwWBBO8RpVKcam/Uy+1GxwKQ==, + } + + "@expressive-code/plugin-shiki@0.41.3": + resolution: + { + integrity: sha512-RlTARoopzhFJIOVHLGvuXJ8DCEme/hjV+ZnRJBIxzxsKVpGPW4Oshqg9xGhWTYdHstTsxO663s0cdBLzZj9TQA==, + } + + "@expressive-code/plugin-text-markers@0.40.2": + resolution: + { + integrity: sha512-/XoLjD67K9nfM4TgDlXAExzMJp6ewFKxNpfUw4F7q5Ecy+IU3/9zQQG/O70Zy+RxYTwKGw2MA9kd7yelsxnSmw==, + } + + "@expressive-code/plugin-text-markers@0.41.3": + resolution: + { + integrity: sha512-SN8tkIzDpA0HLAscEYD2IVrfLiid6qEdE9QLlGVSxO1KEw7qYvjpbNBQjUjMr5/jvTJ7ys6zysU2vLPHE0sb2g==, + } + + "@fastify/busboy@3.1.1": + resolution: + { + integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==, + } + + "@floating-ui/core@1.6.8": + resolution: + { + integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==, + } + + "@floating-ui/dom@1.6.11": + resolution: + { + integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==, + } + + "@floating-ui/utils@0.2.8": + resolution: + { + integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==, + } + + "@fontsource-variable/inter@5.2.8": + resolution: + { + integrity: sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ==, + } + + "@fontsource-variable/jetbrains-mono@5.2.8": + resolution: + { + integrity: sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==, + } + + "@fontsource-variable/lexend@5.2.11": + resolution: + { + integrity: sha512-0hgEQ4O7Nh8fxL/WWmspJf0BErbocRkZwtLRGey/V4mUUqxfF7QUwqhcdzwpjom3NYCniY4uzQ5wYD7r9/92tQ==, + } + + "@humanfs/core@0.19.1": + resolution: + { + integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, + } + engines: { node: ">=18.18.0" } + + "@humanfs/node@0.16.7": + resolution: + { + integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==, + } + engines: { node: ">=18.18.0" } + + "@humanwhocodes/module-importer@1.0.1": + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + "@humanwhocodes/retry@0.4.3": + resolution: + { + integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, + } + engines: { node: ">=18.18" } + + "@iarna/toml@2.2.5": + resolution: + { + integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==, + } + + "@iconify/types@2.0.0": + resolution: + { + integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==, + } + + "@iconify/utils@3.0.2": + resolution: + { + integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==, + } + + "@internationalized/date@3.5.6": + resolution: + { + integrity: sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw==, + } + + "@internationalized/number@3.5.4": + resolution: + { + integrity: sha512-h9huwWjNqYyE2FXZZewWqmCdkw1HeFds5q4Siuoms3hUQC5iPJK3aBmkFZoDSLN4UD0Bl8G22L/NdHpeOr+/7A==, + } + + "@ioredis/commands@1.2.0": + resolution: + { + integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==, + } + + "@isaacs/cliui@8.0.2": + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + + "@isaacs/fs-minipass@4.0.1": + resolution: + { + integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==, + } + engines: { node: ">=18.0.0" } + + "@jridgewell/gen-mapping@0.3.13": + resolution: + { + integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, + } + + "@jridgewell/remapping@2.3.5": + resolution: + { + integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, + } + + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/source-map@0.3.6": + resolution: + { + integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, + } + + "@jridgewell/sourcemap-codec@1.5.5": + resolution: + { + integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, + } + + "@jridgewell/trace-mapping@0.3.25": + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } + + "@jridgewell/trace-mapping@0.3.31": + resolution: + { + integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, + } + + "@kobalte/core@0.13.11": + resolution: + { + integrity: sha512-hK7TYpdib/XDb/r/4XDBFaO9O+3ZHz4ZWryV4/3BfES+tSQVgg2IJupDnztKXB0BqbSRy/aWlHKw1SPtNPYCFQ==, + } peerDependencies: solid-js: ^1.8.15 - '@kobalte/solidbase@0.2.16': - resolution: {integrity: sha512-WRvGfPTVkiYAMGw19GKq+bswQ4UbJoL2qzdUrkNNNW+JorQbeENk3TsVq4RdE9ePFHvV9OnDt01g8CzmAgDM8g==} - engines: {node: '>=22'} + "@kobalte/solidbase@0.2.20": + resolution: + { + integrity: sha512-fglO0gDRU0Fl7pIoD0LxrWnow5S05+BA/4gG/01QSpENcgDd8kkWKA3Gu/OrIykdxSqu2Njp/p59us1Jjgxrdg==, + } + engines: { node: ">=22" } peerDependencies: - '@solidjs/start': ^1.0.8 + "@solidjs/start": ^1.0.8 solid-js: ^1.9.1 vinxi: ^0.5.3 vite: ^6.1.1 - '@kobalte/tailwindcss@0.9.0': - resolution: {integrity: sha512-WbueJTVRiO4yrmfHIBwp07y3M5iibJ/gauEAQ7mOyg1tZulvpO7SM/UdgzX95a9a0KDt1mQFxwO7RmpOUXWOWA==} + "@kobalte/tailwindcss@0.9.0": + resolution: + { + integrity: sha512-WbueJTVRiO4yrmfHIBwp07y3M5iibJ/gauEAQ7mOyg1tZulvpO7SM/UdgzX95a9a0KDt1mQFxwO7RmpOUXWOWA==, + } peerDependencies: tailwindcss: ^3.3.3 - '@kobalte/utils@0.9.1': - resolution: {integrity: sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w==} + "@kobalte/utils@0.9.1": + resolution: + { + integrity: sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w==, + } peerDependencies: solid-js: ^1.8.8 - '@kwsites/file-exists@1.1.1': - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - - '@kwsites/promise-deferred@1.1.1': - resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - - '@lunariajs/core@0.1.1': - resolution: {integrity: sha512-sAqM9+DVsLe3xHM9wu2pEnKGYMs/bWS9qpR+CGHol3RihOELnOQTzHddXbdB1MtgesbI8dnQuG64Ocd8KkWsng==} - engines: {node: '>=18.17.0'} + "@mapbox/node-pre-gyp@2.0.0": + resolution: + { + integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==, + } + engines: { node: ">=18" } hasBin: true - '@mapbox/node-pre-gyp@2.0.0': - resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} - engines: {node: '>=18'} - hasBin: true - - '@mdx-js/mdx@3.1.0': - resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} - - '@netlify/binary-info@1.0.0': - resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} - - '@netlify/blobs@9.1.2': - resolution: {integrity: sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==} - engines: {node: ^14.16.0 || >=16.0.0} - - '@netlify/dev-utils@2.2.0': - resolution: {integrity: sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==} - engines: {node: ^14.16.0 || >=16.0.0} - - '@netlify/functions@3.1.10': - resolution: {integrity: sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==} - engines: {node: '>=14.0.0'} - - '@netlify/open-api@2.37.0': - resolution: {integrity: sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==} - engines: {node: '>=14.8.0'} - - '@netlify/runtime-utils@1.3.1': - resolution: {integrity: sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==} - engines: {node: '>=16.0.0'} - - '@netlify/serverless-functions-api@1.41.2': - resolution: {integrity: sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==} - engines: {node: '>=18.0.0'} - - '@netlify/serverless-functions-api@2.1.1': - resolution: {integrity: sha512-MNYfEmZC6F7ZExOrB/Hrfkif7JW2Cbid9y5poTFEJ6rcAhCLQB8lo0SGlQrFXgKvXowXB14IjpOubaQu2zsyfg==} - engines: {node: '>=18.0.0'} - - '@netlify/zip-it-and-ship-it@12.1.4': - resolution: {integrity: sha512-/wM1c0iyym/7SlowbgqTuu/+tJS8CDDs4vLhSizKntFl3VOeDVX0kr9qriH9wA2hYstwGSuHsEgEAnKdMcDBOg==} - engines: {node: '>=18.14.0'} + "@mdx-js/mdx@3.1.1": + resolution: + { + integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==, + } + + "@netlify/binary-info@1.0.0": + resolution: + { + integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==, + } + + "@netlify/blobs@9.1.2": + resolution: + { + integrity: sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==, + } + engines: { node: ^14.16.0 || >=16.0.0 } + + "@netlify/dev-utils@2.2.0": + resolution: + { + integrity: sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==, + } + engines: { node: ^14.16.0 || >=16.0.0 } + + "@netlify/functions@3.1.10": + resolution: + { + integrity: sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==, + } + engines: { node: ">=14.0.0" } + + "@netlify/open-api@2.37.0": + resolution: + { + integrity: sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==, + } + engines: { node: ">=14.8.0" } + + "@netlify/runtime-utils@1.3.1": + resolution: + { + integrity: sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==, + } + engines: { node: ">=16.0.0" } + + "@netlify/serverless-functions-api@1.41.2": + resolution: + { + integrity: sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==, + } + engines: { node: ">=18.0.0" } + + "@netlify/serverless-functions-api@2.1.1": + resolution: + { + integrity: sha512-MNYfEmZC6F7ZExOrB/Hrfkif7JW2Cbid9y5poTFEJ6rcAhCLQB8lo0SGlQrFXgKvXowXB14IjpOubaQu2zsyfg==, + } + engines: { node: ">=18.0.0" } + + "@netlify/zip-it-and-ship-it@12.1.4": + resolution: + { + integrity: sha512-/wM1c0iyym/7SlowbgqTuu/+tJS8CDDs4vLhSizKntFl3VOeDVX0kr9qriH9wA2hYstwGSuHsEgEAnKdMcDBOg==, + } + engines: { node: ">=18.14.0" } hasBin: true - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@orama/crawly@0.0.6': - resolution: {integrity: sha512-8u0pv9IvKrYaO9gbOe7hcZ757Kd6y6qqyN5uPXXPJmAk0nXc2p172YsZEp8NzanZgvcH6G6t1XsG74t7Mptchw==} - - '@orama/cuid2@2.2.3': - resolution: {integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==} - - '@orama/orama@3.1.7': - resolution: {integrity: sha512-6yB0117ZjsgNevZw3LP+bkrZa9mU/POPVaXgzMPOBbBc35w2P3R+1vMMhEfC06kYCpd5bf0jodBaTkYQW5TVeQ==} - engines: {node: '>= 20.0.0'} - - '@oramacloud/client@2.1.4': - resolution: {integrity: sha512-uNPFs4wq/iOPbggCwTkVNbIr64Vfd7ZS/h+cricXVnzXWocjDTfJ3wLL4lr0qiSu41g8z+eCAGBqJ30RO2O4AA==} - - '@parcel/watcher-android-arm64@2.4.1': - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} - engines: {node: '>= 10.0.0'} + "@noble/hashes@1.8.0": + resolution: + { + integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==, + } + engines: { node: ^14.21.3 || >=16 } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + + "@orama/core@1.2.19": + resolution: + { + integrity: sha512-AVEI0eG/a1RUQK+tBloRMppQf46Ky4kIYKEVjo0V0VfIGZHdLOE2PJR4v949kFwiTnfSJCUaxgwM74FCA1uHUA==, + } + + "@orama/crawly@0.0.6": + resolution: + { + integrity: sha512-8u0pv9IvKrYaO9gbOe7hcZ757Kd6y6qqyN5uPXXPJmAk0nXc2p172YsZEp8NzanZgvcH6G6t1XsG74t7Mptchw==, + } + + "@orama/cuid2@2.2.3": + resolution: + { + integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==, + } + + "@orama/oramacore-events-parser@0.0.5": + resolution: + { + integrity: sha512-yAuSwog+HQBAXgZ60TNKEwu04y81/09mpbYBCmz1RCxnr4ObNY2JnPZI7HmALbjAhLJ8t5p+wc2JHRK93ubO4w==, + } + + "@parcel/watcher-android-arm64@2.4.1": + resolution: + { + integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [android] - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-android-arm64@2.5.1": + resolution: + { + integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.4.1': - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-darwin-arm64@2.4.1": + resolution: + { + integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-darwin-arm64@2.5.1": + resolution: + { + integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.4.1': - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-darwin-x64@2.4.1": + resolution: + { + integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-darwin-x64@2.5.1": + resolution: + { + integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.4.1': - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-freebsd-x64@2.4.1": + resolution: + { + integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [freebsd] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-freebsd-x64@2.5.1": + resolution: + { + integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.4.1': - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm-glibc@2.4.1": + resolution: + { + integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] - - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} - engines: {node: '>= 10.0.0'} + libc: [glibc] + + "@parcel/watcher-linux-arm-glibc@2.5.1": + resolution: + { + integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] - - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} - engines: {node: '>= 10.0.0'} + libc: [glibc] + + "@parcel/watcher-linux-arm-musl@2.5.1": + resolution: + { + integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==, + } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] - - '@parcel/watcher-linux-arm64-glibc@2.4.1': - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} - engines: {node: '>= 10.0.0'} + libc: [musl] + + "@parcel/watcher-linux-arm64-glibc@2.4.1": + resolution: + { + integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] - - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} - engines: {node: '>= 10.0.0'} + libc: [glibc] + + "@parcel/watcher-linux-arm64-glibc@2.5.1": + resolution: + { + integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] - - '@parcel/watcher-linux-arm64-musl@2.4.1': - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} - engines: {node: '>= 10.0.0'} + libc: [glibc] + + "@parcel/watcher-linux-arm64-musl@2.4.1": + resolution: + { + integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] - - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} - engines: {node: '>= 10.0.0'} + libc: [musl] + + "@parcel/watcher-linux-arm64-musl@2.5.1": + resolution: + { + integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] - - '@parcel/watcher-linux-x64-glibc@2.4.1': - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} - engines: {node: '>= 10.0.0'} + libc: [musl] + + "@parcel/watcher-linux-x64-glibc@2.4.1": + resolution: + { + integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [linux] - - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} - engines: {node: '>= 10.0.0'} + libc: [glibc] + + "@parcel/watcher-linux-x64-glibc@2.5.1": + resolution: + { + integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [linux] - - '@parcel/watcher-linux-x64-musl@2.4.1': - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} - engines: {node: '>= 10.0.0'} + libc: [glibc] + + "@parcel/watcher-linux-x64-musl@2.4.1": + resolution: + { + integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [linux] - - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} - engines: {node: '>= 10.0.0'} + libc: [musl] + + "@parcel/watcher-linux-x64-musl@2.5.1": + resolution: + { + integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [linux] - - '@parcel/watcher-wasm@2.3.0': - resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} - engines: {node: '>= 10.0.0'} + libc: [musl] + + "@parcel/watcher-wasm@2.3.0": + resolution: + { + integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==, + } + engines: { node: ">= 10.0.0" } bundledDependencies: - napi-wasm - '@parcel/watcher-wasm@2.5.1': - resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-wasm@2.5.1": + resolution: + { + integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==, + } + engines: { node: ">= 10.0.0" } bundledDependencies: - napi-wasm - '@parcel/watcher-win32-arm64@2.4.1': - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-arm64@2.4.1": + resolution: + { + integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [win32] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-arm64@2.5.1": + resolution: + { + integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==, + } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.4.1': - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-ia32@2.4.1": + resolution: + { + integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==, + } + engines: { node: ">= 10.0.0" } cpu: [ia32] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-ia32@2.5.1": + resolution: + { + integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==, + } + engines: { node: ">= 10.0.0" } cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.4.1': - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-x64@2.4.1": + resolution: + { + integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-x64@2.5.1": + resolution: + { + integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==, + } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [win32] - '@parcel/watcher@2.4.1': - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} - engines: {node: '>= 10.0.0'} - - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} - engines: {node: '>= 10.0.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@poppinss/colors@4.1.4': - resolution: {integrity: sha512-FA+nTU8p6OcSH4tLDY5JilGYr1bVWHpNmcLr7xmMEdbWmKHa+3QZ+DqefrXKmdjO/brHTnQZo20lLSjaO7ydog==} - engines: {node: '>=18.16.0'} - - '@poppinss/dumper@0.6.3': - resolution: {integrity: sha512-iombbn8ckOixMtuV1p3f8jN6vqhXefNjJttoPaJDMeIk/yIGhkkL3OrHkEjE9SRsgoAx1vBUU2GtgggjvA5hCA==} - - '@poppinss/exception@1.2.1': - resolution: {integrity: sha512-aQypoot0HPSJa6gDPEPTntc1GT6QINrSbgRlRhadGW2WaYqUK3tK4Bw9SBMZXhmxd3GeAlZjVcODHgiu+THY7A==} - engines: {node: '>=18'} - - '@rollup/plugin-alias@5.1.1': - resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} - engines: {node: '>=14.0.0'} + "@parcel/watcher@2.4.1": + resolution: + { + integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==, + } + engines: { node: ">= 10.0.0" } + + "@parcel/watcher@2.5.1": + resolution: + { + integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==, + } + engines: { node: ">= 10.0.0" } + + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + + "@poppinss/colors@4.1.4": + resolution: + { + integrity: sha512-FA+nTU8p6OcSH4tLDY5JilGYr1bVWHpNmcLr7xmMEdbWmKHa+3QZ+DqefrXKmdjO/brHTnQZo20lLSjaO7ydog==, + } + engines: { node: ">=18.16.0" } + + "@poppinss/dumper@0.6.3": + resolution: + { + integrity: sha512-iombbn8ckOixMtuV1p3f8jN6vqhXefNjJttoPaJDMeIk/yIGhkkL3OrHkEjE9SRsgoAx1vBUU2GtgggjvA5hCA==, + } + + "@poppinss/exception@1.2.1": + resolution: + { + integrity: sha512-aQypoot0HPSJa6gDPEPTntc1GT6QINrSbgRlRhadGW2WaYqUK3tK4Bw9SBMZXhmxd3GeAlZjVcODHgiu+THY7A==, + } + engines: { node: ">=18" } + + "@prettier/cli@0.6.0": + resolution: + { + integrity: sha512-kPQDTB+FPjvj23SmBH4T9uGCxMVS1cyJSY9dbOHGOC29nL9gR5gwZ4b4uMj4QRB0uE5K9c7avbAo+gvUbcZb4Q==, + } + hasBin: true + peerDependencies: + prettier: ^3.1.0 || ^4.0.0 + + "@rollup/plugin-alias@5.1.1": + resolution: + { + integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/plugin-commonjs@28.0.3': - resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==} - engines: {node: '>=16.0.0 || 14 >= 14.17'} + "@rollup/plugin-commonjs@28.0.3": + resolution: + { + integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==, + } + engines: { node: ">=16.0.0 || 14 >= 14.17" } peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/plugin-inject@5.0.5': - resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} - engines: {node: '>=14.0.0'} + "@rollup/plugin-inject@5.0.5": + resolution: + { + integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/plugin-json@6.1.0': - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} + "@rollup/plugin-json@6.1.0": + resolution: + { + integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/plugin-node-resolve@16.0.1': - resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} - engines: {node: '>=14.0.0'} + "@rollup/plugin-node-resolve@16.0.1": + resolution: + { + integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/plugin-replace@6.0.2': - resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} - engines: {node: '>=14.0.0'} + "@rollup/plugin-replace@6.0.2": + resolution: + { + integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/plugin-terser@0.4.4': - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} + "@rollup/plugin-terser@0.4.4": + resolution: + { + integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} - engines: {node: '>=14.0.0'} + "@rollup/pluginutils@5.1.4": + resolution: + { + integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.43.0': - resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} + "@rollup/rollup-android-arm-eabi@4.43.0": + resolution: + { + integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==, + } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.43.0': - resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} + "@rollup/rollup-android-arm64@4.43.0": + resolution: + { + integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==, + } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.43.0': - resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} + "@rollup/rollup-darwin-arm64@4.43.0": + resolution: + { + integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==, + } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.43.0': - resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} + "@rollup/rollup-darwin-x64@4.43.0": + resolution: + { + integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==, + } cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.43.0': - resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} + "@rollup/rollup-freebsd-arm64@4.43.0": + resolution: + { + integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==, + } cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.43.0': - resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} + "@rollup/rollup-freebsd-x64@4.43.0": + resolution: + { + integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==, + } cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.43.0': - resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} + "@rollup/rollup-linux-arm-gnueabihf@4.43.0": + resolution: + { + integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==, + } cpu: [arm] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.43.0': - resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} + "@rollup/rollup-linux-arm-musleabihf@4.43.0": + resolution: + { + integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==, + } cpu: [arm] os: [linux] + libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.43.0': - resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} + "@rollup/rollup-linux-arm64-gnu@4.43.0": + resolution: + { + integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==, + } cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.43.0': - resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} + "@rollup/rollup-linux-arm64-musl@4.43.0": + resolution: + { + integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==, + } cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-loongarch64-gnu@4.43.0': - resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} + "@rollup/rollup-linux-loongarch64-gnu@4.43.0": + resolution: + { + integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==, + } cpu: [loong64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': - resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} + "@rollup/rollup-linux-powerpc64le-gnu@4.43.0": + resolution: + { + integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==, + } cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.43.0': - resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} + "@rollup/rollup-linux-riscv64-gnu@4.43.0": + resolution: + { + integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==, + } cpu: [riscv64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.43.0': - resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} + "@rollup/rollup-linux-riscv64-musl@4.43.0": + resolution: + { + integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==, + } cpu: [riscv64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.43.0': - resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} + "@rollup/rollup-linux-s390x-gnu@4.43.0": + resolution: + { + integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==, + } cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.43.0': - resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} + "@rollup/rollup-linux-x64-gnu@4.43.0": + resolution: + { + integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==, + } cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.43.0': - resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} + "@rollup/rollup-linux-x64-musl@4.43.0": + resolution: + { + integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==, + } cpu: [x64] os: [linux] + libc: [musl] - '@rollup/rollup-win32-arm64-msvc@4.43.0': - resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} + "@rollup/rollup-win32-arm64-msvc@4.43.0": + resolution: + { + integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==, + } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.43.0': - resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} + "@rollup/rollup-win32-ia32-msvc@4.43.0": + resolution: + { + integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==, + } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.43.0': - resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} + "@rollup/rollup-win32-x64-msvc@4.43.0": + resolution: + { + integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==, + } cpu: [x64] os: [win32] - '@shikijs/core@1.29.2': - resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} - - '@shikijs/core@3.6.0': - resolution: {integrity: sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==} - - '@shikijs/engine-javascript@1.29.2': - resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - - '@shikijs/engine-javascript@3.6.0': - resolution: {integrity: sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==} - - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - - '@shikijs/engine-oniguruma@3.6.0': - resolution: {integrity: sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==} - - '@shikijs/langs@1.29.2': - resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} - - '@shikijs/langs@3.6.0': - resolution: {integrity: sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==} - - '@shikijs/themes@1.29.2': - resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} - - '@shikijs/themes@3.6.0': - resolution: {integrity: sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==} - - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - - '@shikijs/types@3.6.0': - resolution: {integrity: sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sindresorhus/is@7.0.2': - resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} - engines: {node: '>=18'} - - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - - '@solid-primitives/clipboard@1.5.10': - resolution: {integrity: sha512-ohwlrBP4j+Qjksg01CFWaP/USpzX78dBNVA1DPRZkf/vJgytX0T6KMc2YxF6o8fs6ePIYSI8Nt3sKxF0sh1q+Q==} + "@shikijs/core@1.29.2": + resolution: + { + integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==, + } + + "@shikijs/core@3.23.0": + resolution: + { + integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==, + } + + "@shikijs/core@4.0.2": + resolution: + { + integrity: sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==, + } + engines: { node: ">=20" } + + "@shikijs/engine-javascript@1.29.2": + resolution: + { + integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==, + } + + "@shikijs/engine-javascript@3.23.0": + resolution: + { + integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==, + } + + "@shikijs/engine-javascript@4.0.2": + resolution: + { + integrity: sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==, + } + engines: { node: ">=20" } + + "@shikijs/engine-oniguruma@1.29.2": + resolution: + { + integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==, + } + + "@shikijs/engine-oniguruma@3.23.0": + resolution: + { + integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==, + } + + "@shikijs/engine-oniguruma@4.0.2": + resolution: + { + integrity: sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==, + } + engines: { node: ">=20" } + + "@shikijs/langs@1.29.2": + resolution: + { + integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==, + } + + "@shikijs/langs@3.23.0": + resolution: + { + integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==, + } + + "@shikijs/langs@4.0.2": + resolution: + { + integrity: sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==, + } + engines: { node: ">=20" } + + "@shikijs/primitive@4.0.2": + resolution: + { + integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==, + } + engines: { node: ">=20" } + + "@shikijs/themes@1.29.2": + resolution: + { + integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==, + } + + "@shikijs/themes@3.23.0": + resolution: + { + integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==, + } + + "@shikijs/themes@4.0.2": + resolution: + { + integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==, + } + engines: { node: ">=20" } + + "@shikijs/types@1.29.2": + resolution: + { + integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==, + } + + "@shikijs/types@3.23.0": + resolution: + { + integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==, + } + + "@shikijs/types@4.0.2": + resolution: + { + integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==, + } + engines: { node: ">=20" } + + "@shikijs/vscode-textmate@10.0.2": + resolution: + { + integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==, + } + + "@sindresorhus/is@7.0.2": + resolution: + { + integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==, + } + engines: { node: ">=18" } + + "@sindresorhus/merge-streams@2.3.0": + resolution: + { + integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==, + } + engines: { node: ">=18" } + + "@solid-primitives/clipboard@1.6.2": + resolution: + { + integrity: sha512-lJHjyjjOFNcPFmLanY9+dShS1OwJUVuaJneSQNEm4yDrJ1t6eY8JKEslSVcTQDoNzVvNPDLHHm3/q4uGXsB14A==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/context@0.2.3': - resolution: {integrity: sha512-6/e8qu9qJf48FJ+sxc/B782NdgFw5TvI8+r6U0gHizumfZcWZg8FAJqvRZAiwlygkUNiTQOGTeO10LVbMm0kvg==} + "@solid-primitives/context@0.2.3": + resolution: + { + integrity: sha512-6/e8qu9qJf48FJ+sxc/B782NdgFw5TvI8+r6U0gHizumfZcWZg8FAJqvRZAiwlygkUNiTQOGTeO10LVbMm0kvg==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/event-listener@2.4.1': - resolution: {integrity: sha512-Xc/lBCeuh9LwzR4lYbMDtopwWK7N9b4o+FmI4uoI8DOtVGYi0Ip20DG8PtwHk+g31lHgvwtFFVKfnUx2UaqZJg==} + "@solid-primitives/event-listener@2.4.5": + resolution: + { + integrity: sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/keyboard@1.2.8': - resolution: {integrity: sha512-pJtcbkjozS6L1xvTht9rPpyPpX55nAkfBzbFWdf3y0Suwh6qClTibvvObzKOf7uzQ+8aZRDH4LsoGmbTKXtJjQ==} + "@solid-primitives/keyboard@1.3.3": + resolution: + { + integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/keyed@1.2.2': - resolution: {integrity: sha512-oBziY40JK4XmJ57XGkFl8j0GtEarSu0hhjdkUQgqL/U0QQE3TZrRo9uhgH7I6VGJKBKG7SAraTPE6S5lVLM1ow==} + "@solid-primitives/keyed@1.2.2": + resolution: + { + integrity: sha512-oBziY40JK4XmJ57XGkFl8j0GtEarSu0hhjdkUQgqL/U0QQE3TZrRo9uhgH7I6VGJKBKG7SAraTPE6S5lVLM1ow==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/map@0.4.13': - resolution: {integrity: sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==} + "@solid-primitives/map@0.4.13": + resolution: + { + integrity: sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/marker@0.2.1': - resolution: {integrity: sha512-SMMpll47iQgiA+1tR0pSGSQoE/+osuLm45i0OlDnEJZoMaTUq0rwAF+ZV2MxMEaWNxn0cT+ikYIgg/oZOsXFmw==} + "@solid-primitives/marker@0.2.2": + resolution: + { + integrity: sha512-aMAWEKcsBZRQJZs43aIAfXsKLP0EaHX48gUIRfXM2YnxVK/wtk1dJPWzWuaVbBloVhtsfUKMDlzSgdgrNLc+CQ==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/media@2.3.1': - resolution: {integrity: sha512-UTX8LAaQS7k3rvekme8y5ihOrt5SJpgkw7xyUySlPhIapD7JxlhYncQoSFsys5D1XPCgI/3snobpvbanRcrTAw==} + "@solid-primitives/media@2.3.5": + resolution: + { + integrity: sha512-LX9fB5WDaK87FMDtUB1qokBOfT2et9Uobv/zZaKLH9caFSz4+P70MBKEIBHcZQy+9MV5M2XvGYLTbLskjkzMjA==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/platform@0.1.2': - resolution: {integrity: sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==} + "@solid-primitives/platform@0.1.2": + resolution: + { + integrity: sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/platform@0.2.1': - resolution: {integrity: sha512-902jki7Q88/JNl4PIAg9h3lWFC3W/9y4OrpK9cmaYRobD3V5qyXAWTlM4aAKPfwpABhTFu9Ky07FPcfF9hWp+Q==} + "@solid-primitives/platform@0.2.1": + resolution: + { + integrity: sha512-902jki7Q88/JNl4PIAg9h3lWFC3W/9y4OrpK9cmaYRobD3V5qyXAWTlM4aAKPfwpABhTFu9Ky07FPcfF9hWp+Q==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/props@3.1.11': - resolution: {integrity: sha512-jZAKWwvDRHjiydIumDgMj68qviIbowQ1ci7nkEAgzgvanNkhKSQV8iPgR2jMk1uv7S2ZqXYHslVQTgJel/TEyg==} + "@solid-primitives/props@3.1.11": + resolution: + { + integrity: sha512-jZAKWwvDRHjiydIumDgMj68qviIbowQ1ci7nkEAgzgvanNkhKSQV8iPgR2jMk1uv7S2ZqXYHslVQTgJel/TEyg==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/refs@1.0.8': - resolution: {integrity: sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw==} + "@solid-primitives/refs@1.0.8": + resolution: + { + integrity: sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/resize-observer@2.0.26': - resolution: {integrity: sha512-KbPhwal6ML9OHeUTZszBbt6PYSMj89d4wVCLxlvDYL4U0+p+xlCEaqz6v9dkCwm/0Lb+Wed7W5T1dQZCP3JUUw==} + "@solid-primitives/resize-observer@2.0.26": + resolution: + { + integrity: sha512-KbPhwal6ML9OHeUTZszBbt6PYSMj89d4wVCLxlvDYL4U0+p+xlCEaqz6v9dkCwm/0Lb+Wed7W5T1dQZCP3JUUw==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/rootless@1.4.5': - resolution: {integrity: sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww==} + "@solid-primitives/rootless@1.5.3": + resolution: + { + integrity: sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/rootless@1.5.1': - resolution: {integrity: sha512-G4eNC6F3ufRT2Mjbodl7rSOH7uq/Emqs3S7/BIBWgh+V/IFUtvu6WELeqSrk4FJX3T/kKKvC+T8gXhepExSWyg==} + "@solid-primitives/scroll@2.1.3": + resolution: + { + integrity: sha512-Ejq/Z7zKo/6eIEFr1bFLzXFxiGBCMLuqCM8QB8urr3YdPzjSETFLzYRWUyRiDWaBQN0F7k0SY6S7ig5nWOP7vg==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/scroll@2.0.23': - resolution: {integrity: sha512-kO0YpXKEUHaAnHp3zIsHYmxxuKXO3/LxVhZQHHmhqsmUY6A5IBObkSkoQ/ChIPl/WMKE7ynxEq40OgRmhvyUSw==} + "@solid-primitives/static-store@0.0.8": + resolution: + { + integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.0.8': - resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==} + "@solid-primitives/static-store@0.1.3": + resolution: + { + integrity: sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.1.1': - resolution: {integrity: sha512-daXWvpLjd+4hbYdGaaEJ2kKFuFhshvfIBFLveW7mfk2BWHl9lGQVwUuExp3qllkK9ONA9p+5D2cpwBQosv8odQ==} + "@solid-primitives/storage@4.3.3": + resolution: + { + integrity: sha512-ACbNwMZ1s8VAvld6EUXkDkX/US3IhtlPLxg6+B2s9MwNUugwdd51I98LPEaHrdLpqPmyzqgoJe0TxEFlf3Dqrw==, + } peerDependencies: + "@tauri-apps/plugin-store": "*" solid-js: ^1.6.12 - - '@solid-primitives/storage@4.3.1': - resolution: {integrity: sha512-xAJsY2pvXrAaCai4N2grmWY3xh5om9suTDVzGkRF5JBpDzs3Apk+xIovdTErbW0iCzXIEefENXb9xmSzdjuLYA==} - peerDependencies: - '@tauri-apps/plugin-store': '*' - solid-js: ^1.6.12 - solid-start: '*' + solid-start: "*" peerDependenciesMeta: - '@tauri-apps/plugin-store': + "@tauri-apps/plugin-store": optional: true solid-start: optional: true - '@solid-primitives/trigger@1.1.0': - resolution: {integrity: sha512-00BbAiXV66WwjHuKZc3wr0+GLb9C24mMUmi3JdTpNFgHBbrQGrIHubmZDg36c5/7wH+E0GQtOOanwQS063PO+A==} - peerDependencies: - solid-js: ^1.6.12 - - '@solid-primitives/utils@6.2.3': - resolution: {integrity: sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ==} + "@solid-primitives/trigger@1.1.0": + resolution: + { + integrity: sha512-00BbAiXV66WwjHuKZc3wr0+GLb9C24mMUmi3JdTpNFgHBbrQGrIHubmZDg36c5/7wH+E0GQtOOanwQS063PO+A==, + } peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/utils@6.3.1': - resolution: {integrity: sha512-4/Z59nnwu4MPR//zWZmZm2yftx24jMqQ8CSd/JobL26TPfbn4Ph8GKNVJfGJWShg1QB98qObJSskqizbTvcLLA==} + "@solid-primitives/utils@6.4.0": + resolution: + { + integrity: sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A==, + } peerDependencies: solid-js: ^1.6.12 - '@solidjs/meta@0.29.4': - resolution: {integrity: sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g==} + "@solidjs/meta@0.29.4": + resolution: + { + integrity: sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g==, + } peerDependencies: - solid-js: '>=1.8.4' + solid-js: ">=1.8.4" - '@solidjs/router@0.15.3': - resolution: {integrity: sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==} + "@solidjs/router@0.15.4": + resolution: + { + integrity: sha512-WOpgg9a9T638cR+5FGbFi/IV4l2FpmBs1GpIMSPa0Ce9vyJN7Wts+X2PqMf9IYn0zUj2MlSJtm1gp7/HI/n5TQ==, + } peerDependencies: solid-js: ^1.8.6 - '@solidjs/start@1.1.4': - resolution: {integrity: sha512-ma1TBYqoTju87tkqrHExMReM5Z/+DTXSmi30CCTavtwuR73Bsn4rVGqm528p4sL2koRMfAuBMkrhuttjzhL68g==} + "@solidjs/start@1.3.2": + resolution: + { + integrity: sha512-tasDl3utVbtP0rr4InB3ntBIFV2upvEiFrOOCkRrAA3yBfjx9elpxnc94sJQXo65PNYdAAAkPIC6h93vLrtwHg==, + } peerDependencies: - vinxi: ^0.5.3 - - '@speed-highlight/core@1.2.7': - resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} - - '@swc/helpers@0.5.13': - resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} - - '@tailwindcss/typography@0.5.16': - resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + vinxi: ^0.5.7 + + "@speed-highlight/core@1.2.7": + resolution: + { + integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==, + } + + "@swc/helpers@0.5.13": + resolution: + { + integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==, + } + + "@tailwindcss/typography@0.5.19": + resolution: + { + integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==, + } peerDependencies: - tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - - '@tanstack/directive-functions-plugin@1.121.0': - resolution: {integrity: sha512-XMLdFvp0OT7sRVlxEPvsqRDn3ufhgmbli7YPrde8quypNJxK0Pwg2AVNTqGGLUZeI81i8CQXTZOXW+GdVXcHBA==} - engines: {node: '>=12'} + tailwindcss: ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + + "@tanstack/directive-functions-plugin@1.121.21": + resolution: + { + integrity: sha512-B9z/HbF7gJBaRHieyX7f2uQ4LpLLAVAEutBZipH6w+CYD6RHRJvSVPzECGHF7icFhNWTiJQL2QR6K07s59yzEw==, + } + engines: { node: ">=12" } peerDependencies: - vite: '>=6.0.0' - - '@tanstack/router-utils@1.121.0': - resolution: {integrity: sha512-+gOHZdEVjOTTdk8Z7J/NVG0KdvzxFeUYjINYZEqQDRKoxEg8f+Npram0MXGy8N15OyZrsm+KHR1vMFZ2yEvZkw==} - engines: {node: '>=12'} - - '@tanstack/server-functions-plugin@1.121.0': - resolution: {integrity: sha512-gz3Mpn4t1cB3ZJLaeTJ6GS2wpAis24qJHvqyFQrTKjRiz8LOHqsGDOnT5vgA5Vdjlv3alZiyhPW7WFFctsI/VA==} - engines: {node: '>=12'} - - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - - '@types/braces@3.0.4': - resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - - '@types/micromatch@4.0.9': - resolution: {integrity: sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node@17.0.45': - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - - '@types/node@24.0.1': - resolution: {integrity: sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - - '@types/sax@1.2.7': - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - - '@types/ungap__structured-clone@1.2.0': - resolution: {integrity: sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@typescript-eslint/eslint-plugin@8.34.0': - resolution: {integrity: sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + vite: ">=6.0.0" + + "@tanstack/router-utils@1.161.4": + resolution: + { + integrity: sha512-r8TpjyIZoqrXXaf2DDyjd44gjGBoyE+/oEaaH68yLI9ySPO1gUWmQENZ1MZnmBnpUGN24NOZxdjDLc8npK0SAw==, + } + engines: { node: ">=20.19" } + + "@tanstack/server-functions-plugin@1.121.21": + resolution: + { + integrity: sha512-a05fzK+jBGacsSAc1vE8an7lpBh4H0PyIEcivtEyHLomgSeElAJxm9E2It/0nYRZ5Lh23m0okbhzJNaYWZpAOg==, + } + engines: { node: ">=12" } + + "@types/babel__core@7.20.5": + resolution: + { + integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, + } + + "@types/babel__generator@7.27.0": + resolution: + { + integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==, + } + + "@types/babel__template@7.4.4": + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + } + + "@types/babel__traverse@7.28.0": + resolution: + { + integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==, + } + + "@types/braces@3.0.4": + resolution: + { + integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==, + } + + "@types/debug@4.1.12": + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + + "@types/estree-jsx@1.0.5": + resolution: + { + integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, + } + + "@types/estree@1.0.7": + resolution: + { + integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==, + } + + "@types/estree@1.0.8": + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } + + "@types/hast@3.0.4": + resolution: + { + integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, + } + + "@types/json-schema@7.0.15": + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + + "@types/mdast@4.0.4": + resolution: + { + integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, + } + + "@types/mdx@2.0.13": + resolution: + { + integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==, + } + + "@types/micromatch@4.0.9": + resolution: + { + integrity: sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg==, + } + + "@types/ms@2.1.0": + resolution: + { + integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, + } + + "@types/node@24.12.0": + resolution: + { + integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==, + } + + "@types/node@25.5.0": + resolution: + { + integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==, + } + + "@types/normalize-package-data@2.4.4": + resolution: + { + integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, + } + + "@types/resolve@1.20.2": + resolution: + { + integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==, + } + + "@types/sax@1.2.7": + resolution: + { + integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==, + } + + "@types/triple-beam@1.3.5": + resolution: + { + integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==, + } + + "@types/ungap__structured-clone@1.2.0": + resolution: + { + integrity: sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==, + } + + "@types/unist@2.0.11": + resolution: + { + integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, + } + + "@types/unist@3.0.3": + resolution: + { + integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, + } + + "@types/yauzl@2.10.3": + resolution: + { + integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, + } + + "@typescript-eslint/eslint-plugin@8.54.0": + resolution: + { + integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - '@typescript-eslint/parser': ^8.34.0 + "@typescript-eslint/parser": ^8.54.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/parser@8.34.0': - resolution: {integrity: sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/eslint-plugin@8.58.0": + resolution: + { + integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/project-service@8.34.0': - resolution: {integrity: sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/parser": ^8.58.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + + "@typescript-eslint/parser@8.56.1": + resolution: + { + integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/scope-manager@8.34.0': - resolution: {integrity: sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.34.0': - resolution: {integrity: sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/parser@8.58.0": + resolution: + { + integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/type-utils@8.34.0': - resolution: {integrity: sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + + "@typescript-eslint/project-service@8.34.0": + resolution: + { + integrity: sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + + "@typescript-eslint/project-service@8.54.0": + resolution: + { + integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/project-service@8.56.1": + resolution: + { + integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/project-service@8.58.0": + resolution: + { + integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + + "@typescript-eslint/scope-manager@8.34.0": + resolution: + { + integrity: sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/scope-manager@8.54.0": + resolution: + { + integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/scope-manager@8.56.1": + resolution: + { + integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/scope-manager@8.58.0": + resolution: + { + integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/tsconfig-utils@8.34.0": + resolution: + { + integrity: sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + + "@typescript-eslint/tsconfig-utils@8.54.0": + resolution: + { + integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/tsconfig-utils@8.56.1": + resolution: + { + integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/tsconfig-utils@8.58.0": + resolution: + { + integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + + "@typescript-eslint/type-utils@8.54.0": + resolution: + { + integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/types@8.34.0': - resolution: {integrity: sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.34.0': - resolution: {integrity: sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/type-utils@8.58.0": + resolution: + { + integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/utils@8.34.0': - resolution: {integrity: sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + + "@typescript-eslint/types@8.34.0": + resolution: + { + integrity: sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/types@8.54.0": + resolution: + { + integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/types@8.56.1": + resolution: + { + integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/types@8.58.0": + resolution: + { + integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/typescript-estree@8.34.0": + resolution: + { + integrity: sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + + "@typescript-eslint/typescript-estree@8.54.0": + resolution: + { + integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/typescript-estree@8.56.1": + resolution: + { + integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/typescript-estree@8.58.0": + resolution: + { + integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + + "@typescript-eslint/utils@8.34.0": + resolution: + { + integrity: sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/visitor-keys@8.34.0': - resolution: {integrity: sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript/vfs@1.6.1': - resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} + typescript: ">=4.8.4 <5.9.0" + + "@typescript-eslint/utils@8.54.0": + resolution: + { + integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '*' - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - '@vercel/nft@0.29.4': - resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} - engines: {node: '>=18'} + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/utils@8.58.0": + resolution: + { + integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + + "@typescript-eslint/visitor-keys@8.34.0": + resolution: + { + integrity: sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/visitor-keys@8.54.0": + resolution: + { + integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/visitor-keys@8.56.1": + resolution: + { + integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/visitor-keys@8.58.0": + resolution: + { + integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript/vfs@1.6.2": + resolution: + { + integrity: sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==, + } + peerDependencies: + typescript: "*" + + "@ungap/structured-clone@1.3.0": + resolution: + { + integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, + } + + "@vercel/nft@0.29.4": + resolution: + { + integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==, + } + engines: { node: ">=18" } hasBin: true - '@vinxi/listhen@1.5.6': - resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} + "@vinxi/listhen@1.5.6": + resolution: + { + integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==, + } hasBin: true - '@vinxi/plugin-directives@0.5.0': - resolution: {integrity: sha512-zpgPWoul5vKbNH5GASHtHa7InwQWElmVdOexvyO4Nfvz7CeYfAAQ5/BAV01sVJPks4dfsLnBCegAgRPRykdUeA==} + "@vinxi/plugin-directives@0.5.1": + resolution: + { + integrity: sha512-pH/KIVBvBt7z7cXrUH/9uaqcdxjegFC7+zvkZkdOyWzs+kQD5KPf3cl8kC+5ayzXHT+OMlhGhyitytqN3cGmHg==, + } peerDependencies: - vinxi: ^0.5.0 + vinxi: ^0.5.5 - '@vinxi/server-components@0.5.0': - resolution: {integrity: sha512-2p6ZYzoqF7ZAriU0rC9KJWSX/n5qHhUBs7x04SLYzmy9lFxQNw3YHsmsA4b3aHDU+Mxw26wyFwvIbrL6eU3Gyw==} + "@vinxi/server-components@0.5.1": + resolution: + { + integrity: sha512-0BsG95qac3dkhfdRZxqzqYWJE4NvPL7ILlV43B6K6ho1etXWB2e5b0IxsUAUbyqpqiXM7mSRivojuXjb2G4OsQ==, + } peerDependencies: - vinxi: ^0.5.0 - - '@vue/compiler-core@3.5.16': - resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} - - '@vue/compiler-dom@3.5.16': - resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==} - - '@vue/compiler-sfc@3.5.16': - resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==} - - '@vue/compiler-ssr@3.5.16': - resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==} - - '@vue/shared@3.5.16': - resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==} - - '@whatwg-node/disposablestack@0.0.6': - resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} - engines: {node: '>=18.0.0'} - - '@whatwg-node/fetch@0.10.8': - resolution: {integrity: sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg==} - engines: {node: '>=18.0.0'} - - '@whatwg-node/node-fetch@0.7.21': - resolution: {integrity: sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw==} - engines: {node: '>=18.0.0'} - - '@whatwg-node/promise-helpers@1.3.2': - resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} - engines: {node: '>=16.0.0'} - - '@whatwg-node/server@0.9.71': - resolution: {integrity: sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==} - engines: {node: '>=18.0.0'} + vinxi: ^0.5.5 + + "@vue/compiler-core@3.5.16": + resolution: + { + integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==, + } + + "@vue/compiler-dom@3.5.16": + resolution: + { + integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==, + } + + "@vue/compiler-sfc@3.5.16": + resolution: + { + integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==, + } + + "@vue/compiler-ssr@3.5.16": + resolution: + { + integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==, + } + + "@vue/shared@3.5.16": + resolution: + { + integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==, + } + + "@whatwg-node/disposablestack@0.0.6": + resolution: + { + integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==, + } + engines: { node: ">=18.0.0" } + + "@whatwg-node/fetch@0.10.8": + resolution: + { + integrity: sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg==, + } + engines: { node: ">=18.0.0" } + + "@whatwg-node/node-fetch@0.7.21": + resolution: + { + integrity: sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw==, + } + engines: { node: ">=18.0.0" } + + "@whatwg-node/promise-helpers@1.3.2": + resolution: + { + integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==, + } + engines: { node: ">=16.0.0" } + + "@whatwg-node/server@0.9.71": + resolution: + { + integrity: sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==, + } + engines: { node: ">=18.0.0" } abbrev@3.0.1: - resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} - engines: {node: ^18.17.0 || >=20.5.0} + resolution: + { + integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==, + } + engines: { node: ^18.17.0 || >=20.5.0 } abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: ">=6.5" } acorn-import-attributes@1.9.5: - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + resolution: + { + integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==, + } peerDependencies: acorn: ^8 acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-loose@8.4.0: - resolution: {integrity: sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==} - engines: {node: '>=0.4.0'} + acorn-loose@8.5.2: + resolution: + { + integrity: sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==, + } + engines: { node: ">=0.4.0" } acorn-typescript@1.4.13: - resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + resolution: + { + integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==, + } peerDependencies: - acorn: '>=8.9.0' + acorn: ">=8.9.0" - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} + acorn@8.15.0: + resolution: + { + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, + } + engines: { node: ">=0.4.0" } hasBin: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} + acorn@8.16.0: + resolution: + { + integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==, + } + engines: { node: ">=0.4.0" } hasBin: true agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==, + } + engines: { node: ">= 14" } ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - algoliasearch@5.14.2: - resolution: {integrity: sha512-aYjI4WLamMxbhdJ2QAA99VbDCJOGzMOdT2agh57bi40n86ufkhZSIAf6mkocr7NmtBLtwCnSHvD5NJ+Ky5elWw==} - engines: {node: '>= 14.0.0'} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + resolution: + { + integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==, + } - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-purge@1.1.0: + resolution: + { + integrity: sha512-sa1KWMANfZurQkYemaVNNJh8gRF0iUJvcVNxvjPlYM9pPPTB0v+VKH/mFRz4s6gXA8plimQXorJSqJgutxUs8g==, + } - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.2.2: + resolution: + { + integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==, + } + engines: { node: ">=12" } ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + ansi-styles@6.2.3: + resolution: + { + integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, + } + engines: { node: ">=12" } + + ansi-truncate@1.4.0: + resolution: + { + integrity: sha512-p6d2MrNs/mbpdXFT08fGabIg4pbgnUbbhrsoFfxWV5L3zFKw7tUkYUxGY3xCGJUPohENM80Q4sWkl/VDEN3pZg==, + } + + ansis@4.2.0: + resolution: + { + integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==, + } + engines: { node: ">=14" } any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==, + } + engines: { node: ">= 14" } archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==, + } + engines: { node: ">= 14" } arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } ast-module-types@6.0.1: - resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==, + } + engines: { node: ">=18" } ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==, + } + engines: { node: ">=4" } astring@1.9.0: - resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + resolution: + { + integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==, + } hasBin: true async-sema@3.1.1: - resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + resolution: + { + integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==, + } async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, + } + + atomically@2.1.0: + resolution: + { + integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==, + } + + autoprefixer@10.4.27: + resolution: + { + integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==, + } + engines: { node: ^10 || ^12 || >=14 } hasBin: true peerDependencies: postcss: ^8.1.0 b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - - babel-dead-code-elimination@1.0.10: - resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} - - babel-plugin-jsx-dom-expressions@0.39.2: - resolution: {integrity: sha512-rCkSYFuLl5/XD+BXjZk1XxFAsIBgNe9WZ7xBHjQV1dBliI64kO+EWktAD3b6Bj/SXk+LpVXFyMVydhnI35svWQ==} + resolution: + { + integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==, + } + + babel-dead-code-elimination@1.0.12: + resolution: + { + integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==, + } + + babel-plugin-jsx-dom-expressions@0.40.5: + resolution: + { + integrity: sha512-8TFKemVLDYezqqv4mWz+PhRrkryTzivTGu0twyLrOkVZ0P63COx2Y04eVsUjFlwSOXui1z3P3Pn209dokWnirg==, + } peerDependencies: - '@babel/core': ^7.20.12 + "@babel/core": ^7.20.12 - babel-preset-solid@1.9.2: - resolution: {integrity: sha512-rWx968GIDghgFStRDQaoqelGspEm9rgPci/yNzNPFlkzMqHaL2yob+t7BbzyqZw5b9/llkzjqUNIOybT9Z9mcg==} + babel-preset-solid@1.9.10: + resolution: + { + integrity: sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==, + } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 + solid-js: ^1.9.10 + peerDependenciesMeta: + solid-js: + optional: true bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, + } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - balanced-match@3.0.1: - resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + balanced-match@4.0.4: + resolution: + { + integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==, + } + engines: { node: 18 || 20 || >=22 } bare-events@2.5.4: - resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + resolution: + { + integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==, + } base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + baseline-browser-mapping@2.10.0: + resolution: + { + integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==, + } + engines: { node: ">=6.0.0" } + hasBin: true bcp-47-match@2.0.3: - resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + resolution: + { + integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==, + } binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: ">=8" } bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + resolution: + { + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, + } boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } boxen@8.0.1: - resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} - engines: {node: '>=18'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - brace-expansion@4.0.1: - resolution: {integrity: sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==, + } + engines: { node: ">=18" } + + brace-expansion@1.1.12: + resolution: + { + integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, + } + + brace-expansion@2.0.3: + resolution: + { + integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==, + } + + brace-expansion@5.0.3: + resolution: + { + integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==, + } + engines: { node: 18 || 20 || >=22 } + + brace-expansion@5.0.5: + resolution: + { + integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==, + } + engines: { node: 18 || 20 || >=22 } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: ">=8" } + + browserslist@4.28.1: + resolution: + { + integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + resolution: + { + integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, + } buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==, + } + engines: { node: ">=8.0.0" } buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, + } + engines: { node: ">=6" } c12@3.0.4: - resolution: {integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==} + resolution: + { + integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==, + } peerDependencies: magicast: ^0.3.5 peerDependenciesMeta: @@ -1921,254 +3126,452 @@ packages: optional: true call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: ">= 0.4" } call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, + } + engines: { node: ">= 0.4" } callsite@1.0.0: - resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + resolution: + { + integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==, + } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: ">= 6" } camelcase@8.0.0: - resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} - engines: {node: '>=16'} - - caniuse-lite@1.0.30001722: - resolution: {integrity: sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==} + resolution: + { + integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==, + } + engines: { node: ">=16" } + + caniuse-lite@1.0.30001775: + resolution: + { + integrity: sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==, + } ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + + chalk@5.6.2: + resolution: + { + integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + resolution: + { + integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, + } cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + resolution: + { + integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==, + } cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==, + } + engines: { node: ">= 6" } chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: ">= 8.10.0" } chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + resolution: + { + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + } + engines: { node: ">= 14.16.0" } chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==, + } + engines: { node: ">=18" } citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + resolution: + { + integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==, + } cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==, + } + engines: { node: ">=10" } clipboardy@4.0.0: - resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==, + } + engines: { node: ">=18" } cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, + } + engines: { node: ">=0.10.0" } collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + resolution: + { + integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==, + } color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + resolution: + { + integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==, + } colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + resolution: + { + integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==, + } comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, + } + engines: { node: ">=14" } commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, + } + engines: { node: ">=18" } commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: ">= 6" } common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + resolution: + { + integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==, + } commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + resolution: + { + integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, + } compatx@0.2.0: - resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} + resolution: + { + integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==, + } compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==, + } + engines: { node: ">= 14" } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + resolution: + { + integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, + } confbox@0.2.2: - resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + resolution: + { + integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==, + } consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} + resolution: + { + integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==, + } + engines: { node: ^14.18.0 || >=16.10.0 } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } cookie-es@1.2.2: - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + resolution: + { + integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==, + } cookie-es@2.0.0: - resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + resolution: + { + integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==, + } cookie@1.0.2: - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==, + } + engines: { node: ">=18" } copy-file@11.0.0: - resolution: {integrity: sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==, + } + engines: { node: ">=18" } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, + } + engines: { node: ">=0.8" } hasBin: true crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==, + } + engines: { node: ">= 14" } cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==, + } + engines: { node: ">=12.0.0" } croner@9.0.0: - resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==} - engines: {node: '>=18.0'} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==, + } + engines: { node: ">=18.0" } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: ">= 8" } crossws@0.3.4: - resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} + resolution: + { + integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==, + } crossws@0.3.5: - resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + resolution: + { + integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==, + } css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + resolution: + { + integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, + } - css-selector-parser@3.0.5: - resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + css-selector-parser@3.1.3: + resolution: + { + integrity: sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg==, + } css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + } + engines: { node: ">= 6" } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } hasBin: true - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: + { + integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, + } data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } dax-sh@0.43.2: - resolution: {integrity: sha512-uULa1sSIHgXKGCqJ/pA0zsnzbHlVnuq7g8O2fkHokWFNwEGIhh5lAJlxZa1POG5En5ba7AU4KcBAvGQWMMf8rg==} + resolution: + { + integrity: sha512-uULa1sSIHgXKGCqJ/pA0zsnzbHlVnuq7g8O2fkHokWFNwEGIhh5lAJlxZa1POG5En5ba7AU4KcBAvGQWMMf8rg==, + } + deprecated: This package has moved to simply be 'dax' instead of 'dax-sh' db0@0.3.2: - resolution: {integrity: sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==} + resolution: + { + integrity: sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==, + } peerDependencies: - '@electric-sql/pglite': '*' - '@libsql/client': '*' - better-sqlite3: '*' - drizzle-orm: '*' - mysql2: '*' - sqlite3: '*' + "@electric-sql/pglite": "*" + "@libsql/client": "*" + better-sqlite3: "*" + drizzle-orm: "*" + mysql2: "*" + sqlite3: "*" peerDependenciesMeta: - '@electric-sql/pglite': + "@electric-sql/pglite": optional: true - '@libsql/client': + "@libsql/client": optional: true better-sqlite3: optional: true @@ -2180,434 +3583,800 @@ packages: optional: true debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} + debug@4.4.3: + resolution: + { + integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, + } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true decache@4.6.2: - resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + resolution: + { + integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==, + } - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.2.0: + resolution: + { + integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==, + } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: ">=0.10.0" } define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: ">=8" } defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + resolution: + { + integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==, + } denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, + } + engines: { node: ">=0.10" } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } destr@2.0.5: - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + resolution: + { + integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==, + } destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: ">=0.10" } hasBin: true detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==, + } + engines: { node: ">=8" } detective-amd@6.0.1: - resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==, + } + engines: { node: ">=18" } hasBin: true detective-cjs@6.0.1: - resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==, + } + engines: { node: ">=18" } detective-es6@5.0.1: - resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==, + } + engines: { node: ">=18" } detective-postcss@7.0.1: - resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} - engines: {node: ^14.0.0 || >=16.0.0} + resolution: + { + integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==, + } + engines: { node: ^14.0.0 || >=16.0.0 } peerDependencies: postcss: ^8.4.47 detective-sass@6.0.1: - resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==, + } + engines: { node: ">=18" } detective-scss@5.0.1: - resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==, + } + engines: { node: ">=18" } detective-stylus@5.0.1: - resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==, + } + engines: { node: ">=18" } detective-typescript@14.0.0: - resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==, + } + engines: { node: ">=18" } peerDependencies: typescript: ^5.4.4 detective-vue2@2.2.0: - resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==, + } + engines: { node: ">=18" } peerDependencies: typescript: ^5.4.4 + dettle@1.0.5: + resolution: + { + integrity: sha512-ZVyjhAJ7sCe1PNXEGveObOH9AC8QvMga3HJIghHawtG7mE4K5pW9nz/vDGAr/U7a3LWgdOzEE7ac9MURnyfaTA==, + } + devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + resolution: + { + integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, + } didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==, + } + engines: { node: ">=0.3.1" } + + diff@8.0.3: + resolution: + { + integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==, + } + engines: { node: ">=0.3.1" } direction@2.0.1: - resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + resolution: + { + integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==, + } hasBin: true dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + resolution: + { + integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, + } dot-prop@9.0.0: - resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} - engines: {node: '>=18'} - - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==, + } + engines: { node: ">=18" } + + dotenv@16.6.1: + resolution: + { + integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==, + } + engines: { node: ">=12" } + + dotenv@17.3.1: + resolution: + { + integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==, + } + engines: { node: ">=12" } dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: ">= 0.4" } duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + resolution: + { + integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, + } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } - electron-to-chromium@1.5.166: - resolution: {integrity: sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==} + electron-to-chromium@1.5.302: + resolution: + { + integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==, + } emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + resolution: + { + integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==, + } emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + resolution: + { + integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==, + } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + resolution: + { + integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==, + } encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: ">= 0.8" } encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, + } + engines: { node: ">= 0.8" } end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + + entities@6.0.1: + resolution: + { + integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, + } + engines: { node: ">=0.12" } env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } error-stack-parser-es@1.0.5: - resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + resolution: + { + integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==, + } error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + resolution: + { + integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==, + } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: ">= 0.4" } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + resolution: + { + integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, + } es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: ">= 0.4" } esast-util-from-estree@2.0.0: - resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + resolution: + { + integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==, + } esast-util-from-js@2.0.1: - resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + resolution: + { + integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==, + } esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==, + } + engines: { node: ">=18" } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: ">=6" } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: ">=12" } escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, + } + engines: { node: ">=6.0" } hasBin: true eslint-plugin-solid@0.14.5: - resolution: {integrity: sha512-nfuYK09ah5aJG/oEN6P1qziy1zLgW4PDWe75VNPi4CEFYk1x2AEqwFeQfEPR7gNn0F2jOeqKhx2E+5oNCOBYWQ==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-nfuYK09ah5aJG/oEN6P1qziy1zLgW4PDWe75VNPi4CEFYk1x2AEqwFeQfEPR7gNn0F2jOeqKhx2E+5oNCOBYWQ==, + } + engines: { node: ">=18.0.0" } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - typescript: '>=4.8.4' + typescript: ">=4.8.4" eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.28.0: - resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + eslint-visitor-keys@5.0.1: + resolution: + { + integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } + + eslint@9.39.2: + resolution: + { + integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true peerDependencies: - jiti: '*' + jiti: "*" peerDependenciesMeta: jiti: optional: true espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } hasBin: true esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, + } + engines: { node: ">=0.10" } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + resolution: + { + integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==, + } estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + resolution: + { + integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==, + } estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + resolution: + { + integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==, + } estree-util-scope@1.0.0: - resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + resolution: + { + integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==, + } estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + resolution: + { + integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==, + } - estree-util-value-to-estree@3.2.1: - resolution: {integrity: sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==} + estree-util-value-to-estree@3.5.0: + resolution: + { + integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==, + } estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + resolution: + { + integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==, + } estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: ">= 0.6" } event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: ">=6" } eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: ">=0.8.x" } execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: ">=16.17" } expressive-code-twoslash@0.4.0: - resolution: {integrity: sha512-7HffO04pYLNHX0P8/8xX+pdgWYpFWdP9/gYi7dAH1nSAxO1W7pQHW4Ly6OXD3fs4SChkGP/PWkE4oLo6CeXTfg==} + resolution: + { + integrity: sha512-7HffO04pYLNHX0P8/8xX+pdgWYpFWdP9/gYi7dAH1nSAxO1W7pQHW4Ly6OXD3fs4SChkGP/PWkE4oLo6CeXTfg==, + } peerDependencies: - '@expressive-code/core': ^0.40.0 + "@expressive-code/core": ^0.40.0 expressive-code: ^0.40.0 typescript: ^5.7 expressive-code@0.40.2: - resolution: {integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==} + resolution: + { + integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==, + } + + expressive-code@0.41.3: + resolution: + { + integrity: sha512-YLnD62jfgBZYrXIPQcJ0a51Afv9h8VlWqEGK9uU2T5nL/5rb8SnA86+7+mgCZe5D34Tff5RNEA5hjNVJYHzrFg==, + } exsolve@1.0.5: - resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + resolution: + { + integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==, + } + + exsolve@1.0.8: + resolution: + { + integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==, + } extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, + } + engines: { node: ">=0.10.0" } extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} + resolution: + { + integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, + } + engines: { node: ">= 10.17.0" } hasBin: true fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, + } fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, + } + engines: { node: ">=8.6.0" } + + fast-ignore@1.1.3: + resolution: + { + integrity: sha512-xTo4UbrOKfEQgOFlPaqFScodTV/Wf3KATEqCZZSMh6OP4bcez0lTsqww3n3/Fve1q9u0jmfDP0q0nOhH4POZEg==, + } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + fast-string-truncated-width@3.0.3: + resolution: + { + integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==, + } + + fast-string-width@3.0.2: + resolution: + { + integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==, + } + + fastq@1.20.1: + resolution: + { + integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==, + } fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + resolution: + { + integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==, + } fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + resolution: + { + integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, + } - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.6: + resolution: + { + integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==, + } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: + { + integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, + } + engines: { node: ">=12.0.0" } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2615,967 +4384,1805 @@ packages: optional: true fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + resolution: + { + integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==, + } fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + } + engines: { node: ^12.20 || >= 14.13 } file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: ">=16.0.0" } file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: ">=8" } filter-obj@6.1.0: - resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==, + } + engines: { node: ">=18" } + + find-up-json@2.0.5: + resolution: + { + integrity: sha512-1zZZUfD1GOOEEd1AqwbRmCkCCv1O9t0vOpCYgmzfJqKty8WKaKlDyxWej8Aew+vI5lvDiTviaQuaVuu6GzlHzQ==, + } + + find-up-path@1.0.1: + resolution: + { + integrity: sha512-cl4Sfxufq9WK848L887b4r+NVZoBjMeB4QydPZ+pXbp6Jt2nUVspTo2svNOm48stIIeSxtuCsULa9+e+LMTzwA==, + } find-up-simple@1.0.1: - resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==, + } + engines: { node: ">=18" } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==, + } + engines: { node: ">=18" } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + resolution: + { + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, + } + engines: { node: ">=16" } + + flatted@3.3.3: + resolution: + { + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, + } fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + resolution: + { + integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==, + } follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, + } + engines: { node: ">=4.0" } peerDependencies: - debug: '*' + debug: "*" peerDependenciesMeta: debug: optional: true - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} + foreground-child@3.3.1: + resolution: + { + integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, + } + engines: { node: ">=14" } format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} + resolution: + { + integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==, + } + engines: { node: ">=0.4.x" } formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + } + engines: { node: ">=12.20.0" } + + fraction.js@5.3.4: + resolution: + { + integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==, + } fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: ">= 0.6" } fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, + } + engines: { node: ">= 0.8" } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + + function-once@3.0.1: + resolution: + { + integrity: sha512-bE3E8REk4jANDot3l0sLFkXgywBwzFKsmbwdnVHLJUnt/3kV6dNG0oJJqoRBuS1Z9Lr4ZoQgwV0ZNLDgWDbv7Q==, + } gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } get-amd-module-type@6.0.1: - resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==, + } + engines: { node: ">=18" } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + + get-current-package@1.0.1: + resolution: + { + integrity: sha512-c/Rw5ByDQ+zg+Lh/emBWv0bDpugEFdmXPR6/srIemVtIvol0XbT0JAr8Db0cX+Jj/xY9wj1wdjeq2qNB35Tayg==, + } get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==, + } + engines: { node: ">=18" } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: ">= 0.4" } get-port-please@3.1.2: - resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} - - get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==, + } get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: ">= 0.4" } get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + } + engines: { node: ">=8" } get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: ">=16" } giget@2.0.0: - resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + resolution: + { + integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==, + } hasBin: true github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + resolution: + { + integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, + } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + + glob@10.5.0: + resolution: + { + integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==, + } + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@11.0.2: - resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} - engines: {node: 20 || >=22} - hasBin: true + glob@13.0.6: + resolution: + { + integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==, + } + engines: { node: 18 || 20 || >=22 } globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, + } + engines: { node: ">=18" } globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - - globals@16.2.0: - resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==, + } + engines: { node: ">=18" } + + globals@17.4.0: + resolution: + { + integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==, + } + engines: { node: ">=18" } globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==, + } + engines: { node: ">=18" } gonzales-pe@4.3.0: - resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} - engines: {node: '>=0.6.0'} + resolution: + { + integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==, + } + engines: { node: ">=0.6.0" } hasBin: true gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: ">= 0.4" } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + grammex@3.1.11: + resolution: + { + integrity: sha512-HNwLkgRg9SqTAd1N3Uh/MnKwTBTzwBxTOPbXQ8pb0tpwydjk90k4zRE8JUn9fMUiRwKtXFZ1TWFmms3dZHN+Fg==, + } + + graphmatch@1.1.0: + resolution: + { + integrity: sha512-0E62MaTW5rPZVRLyIJZG/YejmdA/Xr1QydHEw3Vt+qOKkMIOE8WDLc9ZX2bmAjtJFZcId4lEdrdmASsEy7D1QA==, + } gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==, + } + engines: { node: ">=6.0" } gzip-size@7.0.0: - resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } h3@1.15.3: - resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} + resolution: + { + integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==, + } has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: ">= 0.4" } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } + + hast-util-from-parse5@8.0.3: + resolution: + { + integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==, + } hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + resolution: + { + integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, + } hast-util-heading-rank@3.0.0: - resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + resolution: + { + integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==, + } hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + resolution: + { + integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, + } hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.0.4: - resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} - - hast-util-select@6.0.3: - resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==} - - hast-util-to-estree@3.1.0: - resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + resolution: + { + integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, + } + + hast-util-raw@9.1.0: + resolution: + { + integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==, + } + + hast-util-select@6.0.4: + resolution: + { + integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==, + } + + hast-util-to-estree@3.1.3: + resolution: + { + integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==, + } hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + resolution: + { + integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==, + } - hast-util-to-jsx-runtime@2.3.2: - resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + hast-util-to-jsx-runtime@2.3.6: + resolution: + { + integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==, + } hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + resolution: + { + integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, + } hast-util-to-string@3.0.1: - resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + resolution: + { + integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==, + } hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + resolution: + { + integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==, + } hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + resolution: + { + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, + } - hastscript@9.0.0: - resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + hastscript@9.0.1: + resolution: + { + integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==, + } hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + resolution: + { + integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, + } hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==, + } + engines: { node: ^16.14.0 || >=18.0.0 } html-entities@2.3.3: - resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + resolution: + { + integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==, + } html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - - html-to-image@1.11.11: - resolution: {integrity: sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==} + resolution: + { + integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==, + } + engines: { node: ">=8" } + + html-to-image@1.11.13: + resolution: + { + integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==, + } html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + resolution: + { + integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, + } htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + resolution: + { + integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==, + } http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, + } + engines: { node: ">=8.0.0" } http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + resolution: + { + integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==, + } + engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, + } + engines: { node: ">= 14" } httpxy@0.1.7: - resolution: {integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==} + resolution: + { + integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==, + } human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: ">=16.17.0" } ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, + } + engines: { node: ">= 4" } ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, + } + engines: { node: ">= 4" } + + import-fresh@3.3.1: + resolution: + { + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, + } + engines: { node: ">=6" } + + import-meta-resolve@4.2.0: + resolution: + { + integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==, + } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } index-to-position@1.1.0: - resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==, + } + engines: { node: ">=18" } inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + ini-simple-parser@1.0.1: + resolution: + { + integrity: sha512-myU5nhF2miBQP3tO/giUi+8BI9QhfM/XRZd0RD7G0p+40K6KPAwxMDtH3UEtJ2XJZbd+ZiQOoGh432DTYfzNVQ==, + } inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + resolution: + { + integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==, + } + + inline-style-parser@0.2.6: + resolution: + { + integrity: sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==, + } + + ionstore@1.0.1: + resolution: + { + integrity: sha512-g+99vyka3EiNFJCnbq3NxegjV211RzGtkDUMbZGB01Con8ZqUmMx/FpWMeqgDXOqgM7QoVeDhe+CfYCWznaDVA==, + } ioredis@5.6.1: - resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} - engines: {node: '>=12.22.0'} + resolution: + { + integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==, + } + engines: { node: ">=12.22.0" } iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + resolution: + { + integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==, + } is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + resolution: + { + integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, + } is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + resolution: + { + integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, + } is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==, + } + engines: { node: ">=6" } is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, + } + engines: { node: ">= 0.4" } is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + resolution: + { + integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, + } is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: ">=8" } hasBin: true is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } hasBin: true is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, + } + engines: { node: ">=0.10.0" } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + resolution: + { + integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, + } is-html@2.0.0: - resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==, + } + engines: { node: ">=8" } is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, + } + engines: { node: ">=14.16" } hasBin: true is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + resolution: + { + integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, + } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } is-path-inside@4.0.0: - resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==, + } + engines: { node: ">=12" } is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, + } + engines: { node: ">=8" } is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: ">=12" } is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + resolution: + { + integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==, + } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==, + } + engines: { node: ">=18" } is-url-superb@4.0.0: - resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==, + } + engines: { node: ">=10" } is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + resolution: + { + integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==, + } is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} + resolution: + { + integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, + } + engines: { node: ">=12.13" } is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: ">=8" } is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, + } + engines: { node: ">=16" } is64bit@2.0.0: - resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==, + } + engines: { node: ">=18" } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, + } + engines: { node: ">=16" } jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } + + jiti@1.21.7: + resolution: + { + integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==, + } hasBin: true - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.6.1: + resolution: + { + integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==, + } hasBin: true js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + resolution: + { + integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, + } js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: + { + integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==, + } hasBin: true jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, + } + engines: { node: ">=6" } hasBin: true jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: ">=6" } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + json-sorted-stringify@1.0.2: + resolution: + { + integrity: sha512-6UiiM9hRn9P+nfznAif3TsmulMJTvlmfNDN8mAmDUvDW/JbSyczdgT0w7NVJvWQwMS83iLnYkH2IXNRZUB4iFg==, + } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } hasBin: true junk@4.0.1: - resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==, + } + engines: { node: ">=12.20" } jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==, + } + engines: { node: ">=18" } + + kasi@1.1.1: + resolution: + { + integrity: sha512-pzBwGWFIjf84T/8aD0XzMli1T3Ckr/jVLh6v0Jskwiv5ehmcgDM+vpYFSk8WzGn4ed4HqgaifTgQUHzzZHa+Qw==, + } kebab-case@1.0.2: - resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} + resolution: + { + integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==, + } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: ">=0.10.0" } kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, + } + engines: { node: ">= 8" } knitwork@1.2.0: - resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + resolution: + { + integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==, + } known-css-properties@0.30.0: - resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + resolution: + { + integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==, + } kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + resolution: + { + integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==, + } kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + resolution: + { + integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==, + } lambda-local@2.2.0: - resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==, + } + engines: { node: ">=8" } hasBin: true lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + resolution: + { + integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, + } + engines: { node: ">= 0.6.3" } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, + } + engines: { node: ">=14" } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } listhen@1.9.0: - resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} + resolution: + { + integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==, + } hasBin: true - local-pkg@1.1.1: - resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} - engines: {node: '>=14'} + local-pkg@1.1.2: + resolution: + { + integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==, + } + engines: { node: ">=14" } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + resolution: + { + integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, + } lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + resolution: + { + integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, + } lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + resolution: + { + integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==, + } lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + resolution: + { + integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==, + } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } logform@2.7.0: - resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==, + } + engines: { node: ">= 12.0.0" } + + lomemo@1.0.1: + resolution: + { + integrity: sha512-g8CnVp7UYypeQKpXpMzyrJoDzhOoqVQYSJApoq/cFI3vGxXoHQ+6lH5cApW9XwzVy5SL9/Owil7/JxbKckw0Lg==, + } longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } + + lru-cache@11.2.6: + resolution: + { + integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==, + } + engines: { node: 20 || >=22 } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } luxon@3.6.1: - resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} - engines: {node: '>=12'} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + resolution: + { + integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==, + } + engines: { node: ">=12" } + + magic-string@0.30.21: + resolution: + { + integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, + } magicast@0.2.11: - resolution: {integrity: sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g==} + resolution: + { + integrity: sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g==, + } magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + resolution: + { + integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==, + } markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} - - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + resolution: + { + integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==, + } + engines: { node: ">=16" } + + markdown-table@3.0.4: + resolution: + { + integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==, + } math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdast-util-directive@3.0.0: - resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} - - mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: ">= 0.4" } + + mdast-util-directive@3.1.0: + resolution: + { + integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==, + } + + mdast-util-find-and-replace@3.0.2: + resolution: + { + integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==, + } mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + resolution: + { + integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, + } mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + resolution: + { + integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==, + } mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + resolution: + { + integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==, + } - mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + mdast-util-gfm-footnote@2.1.0: + resolution: + { + integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==, + } mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + resolution: + { + integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, + } mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + resolution: + { + integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, + } mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + resolution: + { + integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, + } mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + resolution: + { + integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==, + } mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + resolution: + { + integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==, + } mdast-util-mdx-jsx@3.2.0: - resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + resolution: + { + integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==, + } mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + resolution: + { + integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==, + } mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + resolution: + { + integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==, + } mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + resolution: + { + integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, + } mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + resolution: + { + integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==, + } + + mdast-util-to-hast@13.2.1: + resolution: + { + integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==, + } + + mdast-util-to-markdown@2.1.2: + resolution: + { + integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==, + } mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + resolution: + { + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, + } mdast-util-toc@7.1.0: - resolution: {integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==} + resolution: + { + integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==, + } merge-anything@5.1.7: - resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} - engines: {node: '>=12.13'} + resolution: + { + integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==, + } + engines: { node: ">=12.13" } merge-options@3.0.4: - resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==, + } + engines: { node: ">=10" } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } micro-api-client@3.3.0: - resolution: {integrity: sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==} + resolution: + { + integrity: sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==, + } - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-core-commonmark@2.0.3: + resolution: + { + integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==, + } micromark-extension-directive@3.0.2: - resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + resolution: + { + integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==, + } micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + resolution: + { + integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==, + } micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + resolution: + { + integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==, + } micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + resolution: + { + integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==, + } micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + resolution: + { + integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==, + } - micromark-extension-gfm-table@2.1.0: - resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + micromark-extension-gfm-table@2.1.1: + resolution: + { + integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==, + } micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + resolution: + { + integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, + } micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + resolution: + { + integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==, + } micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} - - micromark-extension-mdx-jsx@3.0.1: - resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + resolution: + { + integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, + } + + micromark-extension-mdx-expression@3.0.1: + resolution: + { + integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==, + } + + micromark-extension-mdx-jsx@3.0.2: + resolution: + { + integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==, + } micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + resolution: + { + integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==, + } micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + resolution: + { + integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==, + } micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - - micromark-factory-mdx-expression@2.0.2: - resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} - - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} - - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} - - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - - micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} - - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} - - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + resolution: + { + integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==, + } + + micromark-factory-destination@2.0.1: + resolution: + { + integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==, + } + + micromark-factory-label@2.0.1: + resolution: + { + integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==, + } + + micromark-factory-mdx-expression@2.0.3: + resolution: + { + integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==, + } + + micromark-factory-space@2.0.1: + resolution: + { + integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==, + } + + micromark-factory-title@2.0.1: + resolution: + { + integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==, + } + + micromark-factory-whitespace@2.0.1: + resolution: + { + integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==, + } + + micromark-util-character@2.1.1: + resolution: + { + integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==, + } + + micromark-util-chunked@2.0.1: + resolution: + { + integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==, + } + + micromark-util-classify-character@2.0.1: + resolution: + { + integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==, + } + + micromark-util-combine-extensions@2.0.1: + resolution: + { + integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==, + } + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: + { + integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==, + } + + micromark-util-decode-string@2.0.1: + resolution: + { + integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==, + } + + micromark-util-encode@2.0.1: + resolution: + { + integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==, + } + + micromark-util-events-to-acorn@2.0.3: + resolution: + { + integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==, + } + + micromark-util-html-tag-name@2.0.1: + resolution: + { + integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==, + } + + micromark-util-normalize-identifier@2.0.1: + resolution: + { + integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==, + } + + micromark-util-resolve-all@2.0.1: + resolution: + { + integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==, + } + + micromark-util-sanitize-uri@2.0.1: + resolution: + { + integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, + } + + micromark-util-subtokenize@2.1.0: + resolution: + { + integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==, + } + + micromark-util-symbol@2.0.1: + resolution: + { + integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, + } + + micromark-util-types@2.0.2: + resolution: + { + integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==, + } + + micromark@4.0.2: + resolution: + { + integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==, + } micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: ">=8.6" } mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, + } + engines: { node: ">= 0.6" } mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==, + } + engines: { node: ">= 0.6" } mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: ">=4" } hasBin: true mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: ">=10.0.0" } hasBin: true mime@4.0.7: - resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==, + } + engines: { node: ">=16" } hasBin: true mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - minimatch@10.0.2: - resolution: {integrity: sha512-+9TJCIYXgZ2Dm5LxVCFsa8jOm+evMwXHFI0JM1XROmkfkpz8/iLLDh+TwSmyIBrs6C6Xu9294/fq8cBA+P6AqA==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + + minimatch@10.2.2: + resolution: + { + integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==, + } + engines: { node: 18 || 20 || >=22 } + + minimatch@10.2.5: + resolution: + { + integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==, + } + engines: { node: 18 || 20 || >=22 } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + + minimatch@5.1.9: + resolution: + { + integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==, + } + engines: { node: ">=10" } + + minimatch@9.0.9: + resolution: + { + integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==, + } + engines: { node: ">=16 || 14 >=14.17" } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + minipass@7.1.3: + resolution: + { + integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==, + } + engines: { node: ">=16 || 14 >=14.17" } minizlib@3.0.2: - resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==, + } + engines: { node: ">= 18" } mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==, + } + engines: { node: ">=10" } hasBin: true mlly@1.7.2: - resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} + resolution: + { + integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==, + } mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + resolution: + { + integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==, + } + + mlly@1.8.0: + resolution: + { + integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==, + } module-definition@6.0.1: - resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==, + } + engines: { node: ">=18" } hasBin: true ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } netlify@13.3.5: - resolution: {integrity: sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==} - engines: {node: ^14.16.0 || >=16.0.0} + resolution: + { + integrity: sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==, + } + engines: { node: ^14.16.0 || >=16.0.0 } nitropack@2.11.12: - resolution: {integrity: sha512-e2AdQrEY1IVoNTdyjfEQV93xkqz4SQxAMR0xWF8mZUUHxMLm6S4nPzpscjksmT4OdUxl0N8/DCaGjKQ9ghdodA==} - engines: {node: ^16.11.0 || >=17.0.0} + resolution: + { + integrity: sha512-e2AdQrEY1IVoNTdyjfEQV93xkqz4SQxAMR0xWF8mZUUHxMLm6S4nPzpscjksmT4OdUxl0N8/DCaGjKQ9ghdodA==, + } + engines: { node: ^16.11.0 || >=17.0.0 } hasBin: true peerDependencies: xml2js: ^0.6.2 @@ -3584,18 +6191,31 @@ packages: optional: true node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + resolution: + { + integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, + } node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + deprecated: Use your platform's native DOMException instead node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + resolution: + { + integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==, + } node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -3603,347 +6223,610 @@ packages: optional: true node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + resolution: + { + integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==, + } hasBin: true node-mock-http@1.0.0: - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + resolution: + { + integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==, + } - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.27: + resolution: + { + integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==, + } node-source-walk@7.0.1: - resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==, + } + engines: { node: ">=18" } nopt@8.1.0: - resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} - engines: {node: ^18.17.0 || >=20.5.0} + resolution: + { + integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==, + } + engines: { node: ^18.17.0 || >=20.5.0 } hasBin: true normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==, + } + engines: { node: ^16.14.0 || >=18.0.0 } normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==, + } + engines: { node: ">=0.10.0" } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } nypm@0.6.0: - resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} - engines: {node: ^14.16.0 || >=16.10.0} + resolution: + { + integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==, + } + engines: { node: ^14.16.0 || >=16.10.0 } hasBin: true object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: ">= 0.4" } ofetch@1.4.1: - resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + resolution: + { + integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==, + } ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + resolution: + { + integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==, + } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: ">= 0.8" } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + resolution: + { + integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==, + } onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + resolution: + { + integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==, + } oniguruma-to-es@2.3.0: - resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} + resolution: + { + integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==, + } - oniguruma-to-es@4.3.3: - resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + oniguruma-to-es@4.3.4: + resolution: + { + integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==, + } open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: ">=12" } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: ">= 0.8.0" } p-event@6.0.1: - resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} - engines: {node: '>=16.17'} + resolution: + { + integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==, + } + engines: { node: ">=16.17" } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } p-map@7.0.3: - resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==, + } + engines: { node: ">=18" } p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==, + } + engines: { node: ">=14.16" } p-wait-for@5.0.2: - resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==, + } + engines: { node: ">=12" } package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + resolution: + { + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, + } - package-manager-detector@0.2.10: - resolution: {integrity: sha512-1wlNZK7HW+UE3eGCcMv3hDaYokhspuIeH6enXSnCL1eEZSVDsy/dYwo/4CczhUsrKLA1SSXB+qce8Glw5DEVtw==} + package-manager-detector@1.5.0: + resolution: + { + integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==, + } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + + parse-entities@4.0.2: + resolution: + { + integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, + } parse-gitignore@2.0.0: - resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==, + } + engines: { node: ">=14" } parse-json@8.3.0: - resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==, + } + engines: { node: ">=18" } + + parse-numeric-range@1.3.0: + resolution: + { + integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==, + } parse5-htmlparser2-tree-adapter@7.1.0: - resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + resolution: + { + integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==, + } parse5@7.2.0: - resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} + resolution: + { + integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==, + } + + parse5@7.3.0: + resolution: + { + integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==, + } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: ">= 0.8" } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: ">=16 || 14 >=14.18" } + + path-scurry@2.0.2: + resolution: + { + integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==, + } + engines: { node: 18 || 20 || >=22 } path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + resolution: + { + integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, + } path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==, + } + engines: { node: ">=18" } pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + resolution: + { + integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, + } pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + resolution: + { + integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, + } perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + resolution: + { + integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==, + } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + } + engines: { node: ">=12" } + + picomatch@4.0.3: + resolution: + { + integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, + } + engines: { node: ">=12" } pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: ">=0.10.0" } + + pioppo@1.2.1: + resolution: + { + integrity: sha512-1oErGVWD6wFDPmrJWEY1Cj2p829UGT6Fw9OItYFxLkWtBjCvQSMC8wA5IcAR5ms/6gqiY8pnJvIV/+/Imyobew==, + } + + pirates@4.0.7: + resolution: + { + integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, + } + engines: { node: ">= 6" } pkg-types@1.2.1: - resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + resolution: + { + integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==, + } pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + resolution: + { + integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, + } pkg-types@2.1.0: - resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + resolution: + { + integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==, + } + + pkg-types@2.3.0: + resolution: + { + integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==, + } postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: ">=14.0.0" } peerDependencies: postcss: ^8.0.0 - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} + postcss-js@4.1.0: + resolution: + { + integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==, + } + engines: { node: ^12 || ^14 || >= 16 } peerDependencies: postcss: ^8.4.21 - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + postcss-load-config@6.0.1: + resolution: + { + integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==, + } + engines: { node: ">= 18" } peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' + jiti: ">=1.21.0" + postcss: ">=8.0.9" + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: + optional: true + yaml: optional: true postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} + resolution: + { + integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, + } + engines: { node: ">=12.0" } peerDependencies: postcss: ^8.2.14 postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, + } + engines: { node: ">=4" } postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, + } + engines: { node: ">=4" } postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } postcss-values-parser@6.0.2: - resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==, + } + engines: { node: ">=10" } peerDependencies: postcss: ^8.2.9 - postcss@8.5.5: - resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} - engines: {node: ^10 || ^12 || >=14} - - preact@10.24.3: - resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + postcss@8.5.8: + resolution: + { + integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==, + } + engines: { node: ^10 || ^12 || >=14 } precinct@12.2.0: - resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==, + } + engines: { node: ">=18" } hasBin: true prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-plugin-tailwindcss@0.6.13: - resolution: {integrity: sha512-uQ0asli1+ic8xrrSmIOaElDu0FacR4x69GynTh2oZjFY10JUt6EEumTQl5tB4fMeD6I1naKd+4rXQQ7esT2i1g==} - engines: {node: '>=14.21.3'} + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + prettier-plugin-tailwindcss@0.7.2: + resolution: + { + integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==, + } + engines: { node: ">=20.19" } peerDependencies: - '@ianvs/prettier-plugin-sort-imports': '*' - '@prettier/plugin-pug': '*' - '@shopify/prettier-plugin-liquid': '*' - '@trivago/prettier-plugin-sort-imports': '*' - '@zackad/prettier-plugin-twig': '*' + "@ianvs/prettier-plugin-sort-imports": "*" + "@prettier/plugin-hermes": "*" + "@prettier/plugin-oxc": "*" + "@prettier/plugin-pug": "*" + "@shopify/prettier-plugin-liquid": "*" + "@trivago/prettier-plugin-sort-imports": "*" + "@zackad/prettier-plugin-twig": "*" prettier: ^3.0 - prettier-plugin-astro: '*' - prettier-plugin-css-order: '*' - prettier-plugin-import-sort: '*' - prettier-plugin-jsdoc: '*' - prettier-plugin-marko: '*' - prettier-plugin-multiline-arrays: '*' - prettier-plugin-organize-attributes: '*' - prettier-plugin-organize-imports: '*' - prettier-plugin-sort-imports: '*' - prettier-plugin-style-order: '*' - prettier-plugin-svelte: '*' + prettier-plugin-astro: "*" + prettier-plugin-css-order: "*" + prettier-plugin-jsdoc: "*" + prettier-plugin-marko: "*" + prettier-plugin-multiline-arrays: "*" + prettier-plugin-organize-attributes: "*" + prettier-plugin-organize-imports: "*" + prettier-plugin-sort-imports: "*" + prettier-plugin-svelte: "*" peerDependenciesMeta: - '@ianvs/prettier-plugin-sort-imports': + "@ianvs/prettier-plugin-sort-imports": + optional: true + "@prettier/plugin-hermes": optional: true - '@prettier/plugin-pug': + "@prettier/plugin-oxc": optional: true - '@shopify/prettier-plugin-liquid': + "@prettier/plugin-pug": optional: true - '@trivago/prettier-plugin-sort-imports': + "@shopify/prettier-plugin-liquid": optional: true - '@zackad/prettier-plugin-twig': + "@trivago/prettier-plugin-sort-imports": + optional: true + "@zackad/prettier-plugin-twig": optional: true prettier-plugin-astro: optional: true prettier-plugin-css-order: optional: true - prettier-plugin-import-sort: - optional: true prettier-plugin-jsdoc: optional: true prettier-plugin-marko: @@ -3956,226 +6839,428 @@ packages: optional: true prettier-plugin-sort-imports: optional: true - prettier-plugin-style-order: - optional: true prettier-plugin-svelte: optional: true - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} + prettier@3.8.1: + resolution: + { + integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==, + } + engines: { node: ">=14" } hasBin: true - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} + prettier@4.0.0-alpha.10: + resolution: + { + integrity: sha512-auyI68pnS9LmLRQCRuRBQaoqWU3Jnrifbhc+patuIGd1gzB/5h2CW1fa3Lub45R03ah+wzxbB2DNV1S1wzz9QQ==, + } + engines: { node: ">=14" } + hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-bytes@6.1.1: + resolution: + { + integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, + } + engines: { node: ^14.13.1 || >=16.0.0 } process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: ">= 0.6.0" } + + promise-make-counter@1.0.2: + resolution: + { + integrity: sha512-FJAxTBWQuQoAs4ZOYuKX1FHXxEgKLEzBxUvwr4RoOglkTpOjWuM+RXsK3M9q5lMa8kjqctUrhwYeZFT4ygsnag==, + } + + promise-make-naked@2.1.2: + resolution: + { + integrity: sha512-y7s8ZuHIG56JYspB24be9GFkXA1zXL85Ur9u1DKrW/tvyUoPxWgBjnalK6Nc6l7wHBcAW0c3PO07+XOsWTRuhg==, + } + + promise-make-naked@3.0.2: + resolution: + { + integrity: sha512-B+b+kQ1YrYS7zO7P7bQcoqqMUizP06BOyNSBEnB5VJKDSWo8fsVuDkfSmwdjF0JsRtaNh83so5MMFJ95soH5jg==, + } + + promise-resolve-timeout@2.0.1: + resolution: + { + integrity: sha512-90Qzzu5SmR+ksmTPsc79121NZGtEiPvKACQLCl6yofknRx5xJI9kNj3oDVSX6dVTneF8Ju6+xpVFdDSzb7cNcg==, + } property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + resolution: + { + integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==, + } - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: + { + integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==, + } pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + resolution: + { + integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, + } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + resolution: + { + integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==, + } + engines: { node: ">=0.6" } + + quansync@0.2.11: + resolution: + { + integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==, + } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } quote-unquote@1.0.0: - resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + resolution: + { + integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==, + } radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + resolution: + { + integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==, + } randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } rc9@2.1.2: - resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==, + } read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } read-package-up@11.0.0: - resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==, + } + engines: { node: ">=18" } read-pkg@9.0.1: - resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==, + } + engines: { node: ">=18" } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + resolution: + { + integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==, + } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - recast@0.23.9: - resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + } + engines: { node: ">= 14.18.0" } + + recast@0.23.11: + resolution: + { + integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==, + } + engines: { node: ">= 4" } recma-build-jsx@1.0.0: - resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - - recma-jsx@1.0.0: - resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + resolution: + { + integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==, + } + + recma-jsx@1.0.1: + resolution: + { + integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 recma-parse@1.0.0: - resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + resolution: + { + integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==, + } recma-stringify@1.0.0: - resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + resolution: + { + integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==, + } redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, + } + engines: { node: ">=4" } redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, + } + engines: { node: ">=4" } regex-recursion@5.1.1: - resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + resolution: + { + integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==, + } regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + resolution: + { + integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==, + } regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + resolution: + { + integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==, + } regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + resolution: + { + integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==, + } - regex@6.0.1: - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regex@6.1.0: + resolution: + { + integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==, + } rehype-autolink-headings@7.1.0: - resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + resolution: + { + integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==, + } rehype-expressive-code@0.40.2: - resolution: {integrity: sha512-+kn+AMGCrGzvtH8Q5lC6Y5lnmTV/r33fdmi5QU/IH1KPHKobKr5UnLwJuqHv5jBTSN/0v2wLDS7RTM73FVzqmQ==} + resolution: + { + integrity: sha512-+kn+AMGCrGzvtH8Q5lC6Y5lnmTV/r33fdmi5QU/IH1KPHKobKr5UnLwJuqHv5jBTSN/0v2wLDS7RTM73FVzqmQ==, + } rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + resolution: + { + integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==, + } rehype-recma@1.0.0: - resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + resolution: + { + integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==, + } rehype-slug@6.0.0: - resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + resolution: + { + integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==, + } - remark-directive@3.0.0: - resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + remark-directive@3.0.1: + resolution: + { + integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==, + } remark-frontmatter@5.0.0: - resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} - - remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - - remark-mdx@3.1.0: - resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + resolution: + { + integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==, + } + + remark-gfm@4.0.1: + resolution: + { + integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==, + } + + remark-mdx@3.1.1: + resolution: + { + integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==, + } remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + resolution: + { + integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, + } - remark-rehype@11.1.1: - resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + remark-rehype@11.1.2: + resolution: + { + integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==, + } remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + resolution: + { + integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, + } remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + resolution: + { + integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, + } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } require-package-name@2.0.1: - resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + resolution: + { + integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==, + } requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolution: + { + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: ">=8" } resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, + } + engines: { node: ">= 0.4" } hasBin: true - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.11: + resolution: + { + integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==, + } + engines: { node: ">= 0.4" } hasBin: true resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + resolution: + { + integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, + } hasBin: true - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.1.0: + resolution: + { + integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } rollup-plugin-visualizer@5.14.0: - resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==, + } + engines: { node: ">=18" } hasBin: true peerDependencies: rolldown: 1.x @@ -4187,562 +7272,1126 @@ packages: optional: true rollup@4.43.0: - resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + resolution: + { + integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==, + } + engines: { node: ">=10" } + + sax@1.5.0: + resolution: + { + integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==, + } + engines: { node: ">=11.0.0" } scule@1.3.0: - resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + resolution: + { + integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==, + } section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==, + } + engines: { node: ">=4" } semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==, + } + engines: { node: ">=10" } + hasBin: true + + semver@7.7.4: + resolution: + { + integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==, + } + engines: { node: ">=10" } hasBin: true send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, + } + engines: { node: ">= 0.8.0" } send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==, + } + engines: { node: ">= 18" } serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - seroval-plugins@1.1.1: - resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, + } + + seroval-plugins@1.5.0: + resolution: + { + integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==, + } + engines: { node: ">=10" } peerDependencies: seroval: ^1.0 - seroval-plugins@1.3.2: - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} - engines: {node: '>=10'} + seroval-plugins@1.5.1: + resolution: + { + integrity: sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw==, + } + engines: { node: ">=10" } peerDependencies: seroval: ^1.0 - seroval@1.1.1: - resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==} - engines: {node: '>=10'} + seroval@1.5.0: + resolution: + { + integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==, + } + engines: { node: ">=10" } - seroval@1.3.2: - resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} - engines: {node: '>=10'} + seroval@1.5.1: + resolution: + { + integrity: sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==, + } + engines: { node: ">=10" } serve-placeholder@2.0.2: - resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} + resolution: + { + integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==, + } serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, + } + engines: { node: ">= 0.8.0" } serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==, + } + engines: { node: ">= 18" } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } shiki@1.29.2: - resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - - shiki@3.6.0: - resolution: {integrity: sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==} + resolution: + { + integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==, + } + + shiki@3.23.0: + resolution: + { + integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==, + } + + shiki@4.0.2: + resolution: + { + integrity: sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==, + } + engines: { node: ">=20" } side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: ">= 0.4" } side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: ">= 0.4" } side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: ">= 0.4" } side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: ">= 0.4" } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-git@3.27.0: - resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - sitemap@8.0.0: - resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==} - engines: {node: '>=14.0.0', npm: '>=6.0.0'} + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } + + sitemap@9.0.1: + resolution: + { + integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==, + } + engines: { node: ">=20.19.5", npm: ">=10.8.2" } hasBin: true slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==, + } + engines: { node: ">=14.16" } slugify@1.6.6: - resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==, + } + engines: { node: ">=8.0.0" } smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + resolution: + { + integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==, + } solid-heroicons@3.2.4: - resolution: {integrity: sha512-u6BMdFLvkJnvUGYzdFcWp1wvJ4hb9Y1zd3AbZ9D3bUmmiy9jBzNZX+RcqBCI2EKRvdQwAb1UB9bkESfqfhayDg==} + resolution: + { + integrity: sha512-u6BMdFLvkJnvUGYzdFcWp1wvJ4hb9Y1zd3AbZ9D3bUmmiy9jBzNZX+RcqBCI2EKRvdQwAb1UB9bkESfqfhayDg==, + } peerDependencies: - solid-js: '>= ^1.2.5' + solid-js: ">= ^1.2.5" - solid-js@1.9.7: - resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} + solid-js@1.9.12: + resolution: + { + integrity: sha512-QzKaSJq2/iDrWR1As6MHZQ8fQkdOBf8GReYb7L5iKwMGceg7HxDcaOHk0at66tNgn9U2U7dXo8ZZpLIAmGMzgw==, + } solid-list@0.3.0: - resolution: {integrity: sha512-t4hx/F/l8Vmq+ib9HtZYl7Z9F1eKxq3eKJTXlvcm7P7yI4Z8O7QSOOEVHb/K6DD7M0RxzVRobK/BS5aSfLRwKg==} + resolution: + { + integrity: sha512-t4hx/F/l8Vmq+ib9HtZYl7Z9F1eKxq3eKJTXlvcm7P7yI4Z8O7QSOOEVHb/K6DD7M0RxzVRobK/BS5aSfLRwKg==, + } peerDependencies: solid-js: ^1.8 solid-mdx@0.0.7: - resolution: {integrity: sha512-dYKGOu5ZiaX3sfEMZYtfyXm30u33kF+T/pr67CMeyHzENDkWD3st4XEJ12Akp0J0PG9jzyHe5sAAKEXSnEcDEw==} + resolution: + { + integrity: sha512-dYKGOu5ZiaX3sfEMZYtfyXm30u33kF+T/pr67CMeyHzENDkWD3st4XEJ12Akp0J0PG9jzyHe5sAAKEXSnEcDEw==, + } peerDependencies: solid-js: ^1.2.6 - vite: '*' + vite: "*" solid-presence@0.1.8: - resolution: {integrity: sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==} + resolution: + { + integrity: sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==, + } peerDependencies: solid-js: ^1.8 solid-prevent-scroll@0.1.10: - resolution: {integrity: sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw==} + resolution: + { + integrity: sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw==, + } peerDependencies: solid-js: ^1.8 solid-refresh@0.6.3: - resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + resolution: + { + integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==, + } peerDependencies: solid-js: ^1.3 - solid-use@0.9.0: - resolution: {integrity: sha512-8TGwB4m3qQ7qKo8Lg0pi/ZyyGVmQIjC4sPyxRCH7VPds0BzSsT734PhP3jhR6zMJxoYHM+uoivjq0XdpzXeOJg==} - engines: {node: '>=10'} + solid-use@0.9.1: + resolution: + { + integrity: sha512-UwvXDVPlrrbj/9ewG9ys5uL2IO4jSiwys2KPzK4zsnAcmEl7iDafZWW1Mo4BSEWOmQCGK6IvpmGHo1aou8iOFw==, + } + engines: { node: ">=10" } peerDependencies: solid-js: ^1.7 source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: ">=0.10.0" } source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + + source-map@0.7.6: + resolution: + { + integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==, + } + engines: { node: ">= 12" } space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + resolution: + { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + resolution: + { + integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==, + } + + specialist@1.4.5: + resolution: + { + integrity: sha512-4mPQEREzBUW2hzlXX/dWFbQdUWzpkqvMFVpUAdRlo1lUlhKMObDHiAo09oZ94x4cS3uWMJebPOTn+GaQYLfv3Q==, + } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + resolution: + { + integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==, + } stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + resolution: + { + integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==, + } standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + resolution: + { + integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, + } statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, + } + engines: { node: ">= 0.8" } std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + resolution: + { + integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==, + } std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + resolution: + { + integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, + } + + stdin-blocker@2.0.1: + resolution: + { + integrity: sha512-NEcAEpag+gE/Iivx1prq1AFPwnmgmcyHNvGZLUqGBoOE/7DZtmhtP9iYqJt8ymueFL+kknhfEebAMWbrWp3FJw==, + } streamx@2.22.1: - resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + resolution: + { + integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==, + } + + string-escape-regex@1.0.1: + resolution: + { + integrity: sha512-cdSXOHSJ32K/T2dbj9t7rJwonujaOkaINpa1zsXT+PNFIv1zuPjtr0tXanCvUhN2bIu2IB0z/C7ksl+Qsy44nA==, + } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: ">=18" } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + resolution: + { + integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, + } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-ansi@7.1.2: + resolution: + { + integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==, + } + engines: { node: ">=12" } strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==, + } + engines: { node: ">=0.10.0" } strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + resolution: + { + integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==, + } + + strip-literal@3.1.0: + resolution: + { + integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==, + } + + stubborn-fs@2.0.0: + resolution: + { + integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==, + } + + stubborn-utils@1.0.2: + resolution: + { + integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==, + } + + style-to-js@1.1.19: + resolution: + { + integrity: sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ==, + } + + style-to-object@1.0.12: + resolution: + { + integrity: sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw==, + } style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==, + } + + sucrase@3.35.1: + resolution: + { + integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==, + } + engines: { node: ">=16 || 14 >=14.17" } hasBin: true - supports-color@10.0.0: - resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} - engines: {node: '>=18'} + supports-color@10.2.2: + resolution: + { + integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==, + } + engines: { node: ">=18" } supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } system-architecture@0.1.0: - resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} - engines: {node: '>=18'} - - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==, + } + engines: { node: ">=18" } + + tailwindcss@3.4.19: + resolution: + { + integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==, + } + engines: { node: ">=14.0.0" } hasBin: true tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + resolution: + { + integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==, + } tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} - - terracotta@1.0.6: - resolution: {integrity: sha512-yVrmT/Lg6a3tEbeYEJH8ksb1PYkR5FA9k5gr1TchaSNIiA2ZWs5a+koEbePXwlBP0poaV7xViZ/v50bQFcMgqw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==, + } + engines: { node: ">=18" } + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + terracotta@1.1.0: + resolution: + { + integrity: sha512-kfQciWUBUBgYkXu7gh3CK3FAJng/iqZslAaY08C+k1Hdx17aVEpcFFb/WPaysxAfcupNH3y53s/pc53xxZauww==, + } + engines: { node: ">=10" } peerDependencies: solid-js: ^1.8 terser@5.42.0: - resolution: {integrity: sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==, + } + engines: { node: ">=10" } hasBin: true text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + resolution: + { + integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==, + } text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + resolution: + { + integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==, + } thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: ">=0.8" } thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } + + tiny-bin@1.11.3: + resolution: + { + integrity: sha512-CrBbiKsvJN4bHSDA0cPau4t5KWdGUUAcTXQ8bB14XNqNY+68UZF4Zo7WRVdHLq0j0GYZjIRbNDg+zJbJXDEXeg==, + } + + tiny-colors@2.2.2: + resolution: + { + integrity: sha512-Elmv7JL+dX0c78caKEelH1nHHBskHzJkaqBRgVvQuxsvVA/Z9Fa2R3ZZtfmkkajcd18e96RLMwJvtFqC8jsZWA==, + } + + tiny-cursor@2.0.1: + resolution: + { + integrity: sha512-28ytGEfb7m/8Gdflv+wSo5qRM01fROo2CjJVYon6yYbzPsc3ap3Ps5CZXuS19pIROwswSvZMGbEQ7kWnokdUGA==, + } + + tiny-editorconfig@1.0.1: + resolution: + { + integrity: sha512-V6AW3vnBrhhtYBPdTFTMaPNlziyNdyReG5wTbfYnKSy6nHScI/vfmtFuDx9sjpgOCutK+QpW+LVAl4QigdLssw==, + } tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + resolution: + { + integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, + } + + tiny-jsonc@1.0.2: + resolution: + { + integrity: sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw==, + } + + tiny-levenshtein@1.1.0: + resolution: + { + integrity: sha512-sU4wduNrjb2e51rgPOTy6nx3ag8pQPFA9XQCQQsFmECWEDS23LEoYsZv3fhVuJNIcxzBNMvCDDb7e/PPOP+vxw==, + } + + tiny-parse-argv@2.8.2: + resolution: + { + integrity: sha512-RnIDHQ+r9zMuslQWVoRxfKVOumteeheQqbwNYJyQxzM2vzx/vdN5xAeL64F3rQOpfbVdxFkhM4zPDyfq7SxsBQ==, + } + + tiny-readdir-glob@1.23.2: + resolution: + { + integrity: sha512-+47FIdgzEtZj03mOyq9iAljlZZNleqSEwe3i6Uzkzec5axbMg32Vp78U2fLo4TiCMv9gzjnno7yJn34z5pXECw==, + } + + tiny-readdir@2.7.4: + resolution: + { + integrity: sha512-721U+zsYwDirjr8IM6jqpesD/McpZooeFi3Zc6mcjy1pse2C+v19eHPFRqz4chGXZFw7C3KITDjAtHETc2wj7Q==, + } + + tiny-spinner@2.0.5: + resolution: + { + integrity: sha512-OIGogtfEbA2IQdCBgF0zI3EjpFyiUEd6Uj5j0q5jhIPPq8pgNR83D0t9WIckbD2FzPann8lH/uLf1vX0YIu04w==, + } + + tiny-truncate@1.0.5: + resolution: + { + integrity: sha512-v69A1bjP624gxzBEvvshTMcwU2tkMcuAOIXAjJj0AG7aR+/YFmBYSw3rEKo0Ma2SCX7coeq9MNnUHQo1wZmMHw==, + } + + tiny-updater@3.5.3: + resolution: + { + integrity: sha512-wEUssfOOkVLg2raSaRbyZDHpVCDj6fnp7UjynpNE4XGuF+Gkj8GRRMoHdfk73VzLQs/AHKsbY8fCxXNz8Hx4Qg==, + } tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } + + tinyexec@1.0.2: + resolution: + { + integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==, + } + engines: { node: ">=18" } tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==, + } + engines: { node: ">=12.0.0" } + + tinyglobby@0.2.15: + resolution: + { + integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, + } + engines: { node: ">=12.0.0" } tmp-promise@3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + resolution: + { + integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==, + } tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} + resolution: + { + integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==, + } + engines: { node: ">=14.14" } to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + resolution: + { + integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==, + } tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} + resolution: + { + integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==, + } + engines: { node: ">= 14.0.0" } trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} + resolution: + { + integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, + } + + ts-api-utils@2.4.0: + resolution: + { + integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==, + } + engines: { node: ">=18.12" } peerDependencies: - typescript: '>=4.8.4' + typescript: ">=4.8.4" + + ts-api-utils@2.5.0: + resolution: + { + integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==, + } + engines: { node: ">=18.12" } + peerDependencies: + typescript: ">=4.8.4" ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tslib@2.8.0: - resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } twoslash-protocol@0.2.12: - resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} + resolution: + { + integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==, + } twoslash@0.2.12: - resolution: {integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==} + resolution: + { + integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==, + } peerDependencies: - typescript: '*' + typescript: "*" type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - - typescript-eslint@8.34.0: - resolution: {integrity: sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==, + } + engines: { node: ">=16" } + + typescript-eslint@8.58.0: + resolution: + { + integrity: sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + + typescript@5.9.3: + resolution: + { + integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, + } + engines: { node: ">=14.17" } hasBin: true ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + resolution: + { + integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==, + } ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + resolution: + { + integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==, + } ultrahtml@1.6.0: - resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} - - ultramatter@0.0.4: - resolution: {integrity: sha512-1f/hO3mR+/Hgue4eInOF/Qm/wzDqwhYha4DxM0hre9YIUyso3fE2XtrAU6B4njLqTC8CM49EZaYgsVSa+dXHGw==} + resolution: + { + integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==, + } uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + resolution: + { + integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, + } unctx@2.4.1: - resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} + resolution: + { + integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==, + } undici-types@5.28.4: - resolution: {integrity: sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww==} - - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + resolution: + { + integrity: sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww==, + } + + undici-types@7.16.0: + resolution: + { + integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==, + } + + undici-types@7.18.2: + resolution: + { + integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==, + } unenv@1.10.0: - resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + resolution: + { + integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==, + } unenv@2.0.0-rc.17: - resolution: {integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==} + resolution: + { + integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==, + } unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, + } + engines: { node: ">=18" } unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==, + } + engines: { node: ">=18" } unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - - unimport@4.1.2: - resolution: {integrity: sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==, + } + + unimport@4.2.0: + resolution: + { + integrity: sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==, + } + engines: { node: ">=18.12.0" } unimport@5.0.1: - resolution: {integrity: sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ==, + } + engines: { node: ">=18.12.0" } unist-builder@4.0.0: - resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} + resolution: + { + integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==, + } unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + resolution: + { + integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, + } - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.1: + resolution: + { + integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==, + } unist-util-mdx-define@1.1.2: - resolution: {integrity: sha512-9ncH7i7TN5Xn7/tzX5bE3rXgz1X/u877gYVAUB3mLeTKYJmQHmqKTDBi6BTGXV7AeolBCI9ErcVsOt2qryoD0g==} + resolution: + { + integrity: sha512-9ncH7i7TN5Xn7/tzX5bE3rXgz1X/u877gYVAUB3mLeTKYJmQHmqKTDBi6BTGXV7AeolBCI9ErcVsOt2qryoD0g==, + } unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + resolution: + { + integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==, + } unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + resolution: + { + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, + } unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + resolution: + { + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, + } - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.2: + resolution: + { + integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==, + } unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + resolution: + { + integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, + } + + unist-util-visit@5.1.0: + resolution: + { + integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==, + } unist@0.0.1: - resolution: {integrity: sha512-bnzuF8b6d47WubA4a5yLqFbuZz/v/NS6eRwUIdOaDmsqzwTlyv8yS1g3M7ISdtBQrigPD3qKK87Cu7zhEfCF3A==} + resolution: + { + integrity: sha512-bnzuF8b6d47WubA4a5yLqFbuZz/v/NS6eRwUIdOaDmsqzwTlyv8yS1g3M7ISdtBQrigPD3qKK87Cu7zhEfCF3A==, + } deprecated: Use @types/unist instead unixify@1.0.0: - resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} - engines: {node: '>=0.10.0'} - - unplugin-auto-import@19.1.1: - resolution: {integrity: sha512-sCGZZrSR1Bc8RfN8Q0RUDxXtC20rdAt7UB4lDyq8MNtKVHiXXh+5af6Nz4JRp9Q+7HjnbgQfQox0TkEymjdUAQ==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==, + } + engines: { node: ">=0.10.0" } + + unplugin-auto-import@19.3.0: + resolution: + { + integrity: sha512-iIi0u4Gq2uGkAOGqlPJOAMI8vocvjh1clGTfSK4SOrJKrt+tirrixo/FjgBwXQNNdS7ofcr7OxzmOb/RjWxeEQ==, + } + engines: { node: ">=14" } peerDependencies: - '@nuxt/kit': ^3.2.2 - '@vueuse/core': '*' + "@nuxt/kit": ^3.2.2 + "@vueuse/core": "*" peerDependenciesMeta: - '@nuxt/kit': + "@nuxt/kit": optional: true - '@vueuse/core': + "@vueuse/core": optional: true - unplugin-icons@22.1.0: - resolution: {integrity: sha512-ect2ZNtk1Zgwb0NVHd0C1IDW/MV+Jk/xaq4t8o6rYdVS3+L660ZdD5kTSQZvsgdwCvquRw+/wYn75hsweRjoIA==} + unplugin-icons@22.5.0: + resolution: + { + integrity: sha512-MBlMtT5RuMYZy4TZgqUL2OTtOdTUVsS1Mhj6G1pEzMlFJlEnq6mhUfoIt45gBWxHcsOdXJDWLg3pRZ+YmvAVWQ==, + } peerDependencies: - '@svgr/core': '>=7.0.0' - '@svgx/core': ^1.0.1 - '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + "@svgr/core": ">=7.0.0" + "@svgx/core": ^1.0.1 + "@vue/compiler-sfc": ^3.0.2 || ^2.7.0 svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 vue-template-compiler: ^2.6.12 vue-template-es2015-compiler: ^1.9.0 peerDependenciesMeta: - '@svgr/core': + "@svgr/core": optional: true - '@svgx/core': + "@svgx/core": optional: true - '@vue/compiler-sfc': + "@vue/compiler-sfc": optional: true svelte: optional: true @@ -4752,64 +8401,90 @@ packages: optional: true unplugin-utils@0.2.4: - resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==, + } + engines: { node: ">=18.12.0" } + + unplugin-utils@0.2.5: + resolution: + { + integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==, + } + engines: { node: ">=18.12.0" } unplugin@1.16.1: - resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==, + } + engines: { node: ">=14.0.0" } + + unplugin@2.3.10: + resolution: + { + integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==, + } + engines: { node: ">=18.12.0" } unplugin@2.3.5: - resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==, + } + engines: { node: ">=18.12.0" } unstorage@1.16.0: - resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} + resolution: + { + integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==, + } peerDependencies: - '@azure/app-configuration': ^1.8.0 - '@azure/cosmos': ^4.2.0 - '@azure/data-tables': ^13.3.0 - '@azure/identity': ^4.6.0 - '@azure/keyvault-secrets': ^4.9.0 - '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 || ^7.0.0 - '@deno/kv': '>=0.9.0' - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 - '@planetscale/database': ^1.19.0 - '@upstash/redis': ^1.34.3 - '@vercel/blob': '>=0.27.1' - '@vercel/kv': ^1.0.1 + "@azure/app-configuration": ^1.8.0 + "@azure/cosmos": ^4.2.0 + "@azure/data-tables": ^13.3.0 + "@azure/identity": ^4.6.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.26.0 + "@capacitor/preferences": ^6.0.3 || ^7.0.0 + "@deno/kv": ">=0.9.0" + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 + "@vercel/blob": ">=0.27.1" + "@vercel/kv": ^1.0.1 aws4fetch: ^1.0.20 - db0: '>=0.2.1' + db0: ">=0.2.1" idb-keyval: ^6.2.1 ioredis: ^5.4.2 uploadthing: ^7.4.4 peerDependenciesMeta: - '@azure/app-configuration': + "@azure/app-configuration": optional: true - '@azure/cosmos': + "@azure/cosmos": optional: true - '@azure/data-tables': + "@azure/data-tables": optional: true - '@azure/identity': + "@azure/identity": optional: true - '@azure/keyvault-secrets': + "@azure/keyvault-secrets": optional: true - '@azure/storage-blob': + "@azure/storage-blob": optional: true - '@capacitor/preferences': + "@capacitor/preferences": optional: true - '@deno/kv': + "@deno/kv": optional: true - '@netlify/blobs': + "@netlify/blobs": optional: true - '@planetscale/database': + "@planetscale/database": optional: true - '@upstash/redis': + "@upstash/redis": optional: true - '@vercel/blob': + "@vercel/blob": optional: true - '@vercel/kv': + "@vercel/kv": optional: true aws4fetch: optional: true @@ -4823,88 +8498,136 @@ packages: optional: true untun@0.1.3: - resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + resolution: + { + integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==, + } hasBin: true untyped@2.0.0: - resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} + resolution: + { + integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==, + } hasBin: true unwasm@0.3.9: - resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + resolution: + { + integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==, + } + + update-browserslist-db@1.2.3: + resolution: + { + integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, + } hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: ">= 4.21.0" uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + resolution: + { + integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==, + } uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } urlpattern-polyfill@10.1.0: - resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + resolution: + { + integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==, + } urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + resolution: + { + integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==, + } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + resolution: + { + integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==, + } hasBin: true - validate-html-nesting@1.2.2: - resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + resolution: + { + integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==, + } - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: + { + integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==, + } vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + resolution: + { + integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==, + } vinxi@0.5.7: - resolution: {integrity: sha512-8+xsAx/+J+QENGV2igI29u1/gvlFKeXYBAsIk1OOzt9USmLxyaqBHf+GvkiZ8QgPTFP9OyA2w+TuPynyushr7g==} + resolution: + { + integrity: sha512-8+xsAx/+J+QENGV2igI29u1/gvlFKeXYBAsIk1OOzt9USmLxyaqBHf+GvkiZ8QgPTFP9OyA2w+TuPynyushr7g==, + } hasBin: true - vite-plugin-solid@2.11.2: - resolution: {integrity: sha512-/OXVasW5OIRSFXnqzMgm8X3hPvf+JTbGecjQhmk7QnbDFq4hqdLssuYAWw9GsJGfzUPiMHM3ME2Y2XHPsTWmkw==} + vite-plugin-solid@2.11.10: + resolution: + { + integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==, + } peerDependencies: - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + "@testing-library/jest-dom": ^5.16.6 || ^5.17.0 || ^6.* solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: - '@testing-library/jest-dom': + "@testing-library/jest-dom": optional: true vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { + integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - '@types/node': + "@types/node": optional: true jiti: optional: true @@ -4927,1085 +8650,1016 @@ packages: yaml: optional: true - vitefu@1.0.5: - resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==} + vitefu@1.1.2: + resolution: + { + integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==, + } peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0 peerDependenciesMeta: vite: optional: true web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + resolution: + { + integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, + } web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==, + } + engines: { node: ">= 8" } webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + resolution: + { + integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==, + } + + webworker-shim@1.1.4: + resolution: + { + integrity: sha512-W/40L5W6ZQyGhYr3hJ7N/2SjdK5OdFtnYm94j6xlRyjckegXnIGwz0EdxdkQx6VGTglJjK8mqBhMz3fd3AY4bg==, + } whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + + when-exit@2.1.5: + resolution: + { + integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==, + } which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } hasBin: true which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, + } + engines: { node: ^16.13.0 || >=18.0.0 } hasBin: true widest-line@5.0.0: - resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==, + } + engines: { node: ">=18" } winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==, + } + engines: { node: ">= 12.0.0" } winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==, + } + engines: { node: ">= 12.0.0" } word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: ">=0.10.0" } + + worktank@2.7.3: + resolution: + { + integrity: sha512-M0fesnpttBPdvNYBdzRvLDsacN0na9RYWFxwmM/x1+/6mufjduv9/9vBObK8EXDqxRMX/SOYJabpo0UCYYBUdQ==, + } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, + } + engines: { node: ">=18" } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } write-file-atomic@6.0.0: - resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} - engines: {node: ^18.17.0 || >=20.5.0} + resolution: + { + integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==, + } + engines: { node: ^18.17.0 || >=20.5.0 } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - - yaml@2.6.0: - resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} - engines: {node: '>= 14'} - hasBin: true - - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} + resolution: + { + integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==, + } + engines: { node: ">=18" } + + yaml@2.8.1: + resolution: + { + integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==, + } + engines: { node: ">= 14.6" } hasBin: true yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + resolution: + { + integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, + } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + yocto-queue@1.2.2: + resolution: + { + integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==, + } + engines: { node: ">=12.20" } youch-core@0.3.2: - resolution: {integrity: sha512-fusrlIMLeRvTFYLUjJ9KzlGC3N+6MOPJ68HNj/yJv2nz7zq8t4HEviLms2gkdRPUS7F5rZ5n+pYx9r88m6IE1g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-fusrlIMLeRvTFYLUjJ9KzlGC3N+6MOPJ68HNj/yJv2nz7zq8t4HEviLms2gkdRPUS7F5rZ5n+pYx9r88m6IE1g==, + } + engines: { node: ">=18" } youch@4.1.0-beta.8: - resolution: {integrity: sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==, + } + engines: { node: ">=18" } + + zeptomatch-escape@1.0.1: + resolution: + { + integrity: sha512-kAc5HzvnF66djCYDqpsS46Y/FKi+4pe/KJRmTmm/hwmoaNYzmm6bBY07cdkxmJCdY018S5UeQn4yP+9X2x1MbQ==, + } + + zeptomatch-explode@1.0.1: + resolution: + { + integrity: sha512-7cUQASLLRGZ20+zEQcEgQ9z/gH1+jSfrNg4KfRJSxF1QU2fpymAwWvnAxl69GD5pr3IV0V9vo3ke2np//Nh4tQ==, + } + + zeptomatch-is-static@1.0.1: + resolution: + { + integrity: sha512-bN9q7H/UdXhkub01WE7b7Grg07jLldNnIWG2T1IpBq5NtvcQ4DwFbNiGGapnbKHUdWiCNjg/bIvixV88nj9gog==, + } + + zeptomatch-unescape@1.0.1: + resolution: + { + integrity: sha512-xhSFkKV0aQ03e/eiN4VhOTwJhcqfH7SMiGHrWKw9gXi+0EVJAxJ8Gt4ehozYsYLhUXL1JFbP1g3EE6ZmkStB0g==, + } + + zeptomatch@2.1.0: + resolution: + { + integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==, + } zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} - - zod@3.25.62: - resolution: {integrity: sha512-YCxsr4DmhPcrKPC9R1oBHQNlQzlJEyPAId//qTau/vBee9uO8K6prmRq4eMkOyxvBfH4wDPIPdLx9HVMWIY3xA==} + resolution: + { + integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==, + } + engines: { node: ">= 14" } + + zod@3.25.76: + resolution: + { + integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, + } + + zod@4.3.6: + resolution: + { + integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==, + } zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } snapshots: + "@alloc/quick-lru@5.2.0": {} - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2) - '@algolia/client-search': 5.14.2 - algoliasearch: 5.14.2 - - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2)': - dependencies: - '@algolia/client-search': 5.14.2 - algoliasearch: 5.14.2 - - '@algolia/client-abtesting@5.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/client-analytics@5.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/client-common@5.14.2': {} - - '@algolia/client-insights@5.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/client-personalization@5.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/client-query-suggestions@5.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/client-search@5.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/ingestion@1.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/monitoring@1.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/recommend@5.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - - '@algolia/requester-browser-xhr@5.14.2': + "@ampproject/remapping@2.3.0": dependencies: - '@algolia/client-common': 5.14.2 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.25 - '@algolia/requester-fetch@5.14.2': + "@antfu/install-pkg@1.1.0": dependencies: - '@algolia/client-common': 5.14.2 + package-manager-detector: 1.5.0 + tinyexec: 1.0.2 - '@algolia/requester-node-http@5.14.2': - dependencies: - '@algolia/client-common': 5.14.2 - - '@alloc/quick-lru@5.2.0': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@antfu/install-pkg@1.0.0': - dependencies: - package-manager-detector: 0.2.10 - tinyexec: 0.3.2 - - '@antfu/utils@8.1.1': {} + "@antfu/utils@9.3.0": {} - '@babel/code-frame@7.25.7': + "@babel/code-frame@7.25.7": dependencies: - '@babel/highlight': 7.25.7 + "@babel/highlight": 7.25.7 picocolors: 1.1.1 - '@babel/code-frame@7.26.2': + "@babel/code-frame@7.26.2": dependencies: - '@babel/helper-validator-identifier': 7.27.1 + "@babel/helper-validator-identifier": 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.27.1': + "@babel/code-frame@7.29.0": dependencies: - '@babel/helper-validator-identifier': 7.27.1 + "@babel/helper-validator-identifier": 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.25.8': {} + "@babel/compat-data@7.25.8": {} - '@babel/compat-data@7.27.5': {} + "@babel/compat-data@7.29.0": {} - '@babel/core@7.25.8': + "@babel/core@7.25.8": dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/helper-compilation-targets': 7.25.7 - '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) - '@babel/helpers': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/template': 7.25.7 - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 + "@ampproject/remapping": 2.3.0 + "@babel/code-frame": 7.25.7 + "@babel/generator": 7.25.7 + "@babel/helper-compilation-targets": 7.25.7 + "@babel/helper-module-transforms": 7.25.7(@babel/core@7.25.8) + "@babel/helpers": 7.25.7 + "@babel/parser": 7.25.8 + "@babel/template": 7.25.7 + "@babel/traverse": 7.25.7 + "@babel/types": 7.25.8 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/core@7.27.4': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + "@babel/core@7.29.0": + dependencies: + "@babel/code-frame": 7.29.0 + "@babel/generator": 7.29.1 + "@babel/helper-compilation-targets": 7.28.6 + "@babel/helper-module-transforms": 7.28.6(@babel/core@7.29.0) + "@babel/helpers": 7.28.6 + "@babel/parser": 7.29.0 + "@babel/template": 7.28.6 + "@babel/traverse": 7.29.0 + "@babel/types": 7.29.0 + "@jridgewell/remapping": 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.25.7': + "@babel/generator@7.25.7": dependencies: - '@babel/types': 7.25.8 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + "@babel/types": 7.29.0 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.25 jsesc: 3.0.2 - '@babel/generator@7.27.5': + "@babel/generator@7.29.1": dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + "@babel/parser": 7.29.0 + "@babel/types": 7.29.0 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + "@babel/helper-compilation-targets@7.25.7": dependencies: - '@babel/types': 7.27.6 - - '@babel/helper-compilation-targets@7.25.7': - dependencies: - '@babel/compat-data': 7.25.8 - '@babel/helper-validator-option': 7.25.7 - browserslist: 4.25.0 + "@babel/compat-data": 7.25.8 + "@babel/helper-validator-option": 7.25.7 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-compilation-targets@7.27.2': + "@babel/helper-compilation-targets@7.28.6": dependencies: - '@babel/compat-data': 7.27.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 + "@babel/compat-data": 7.29.0 + "@babel/helper-validator-option": 7.27.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-member-expression-to-functions@7.27.1': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color + "@babel/helper-globals@7.28.0": {} - '@babel/helper-module-imports@7.18.6': + "@babel/helper-module-imports@7.18.6": dependencies: - '@babel/types': 7.25.8 + "@babel/types": 7.29.0 - '@babel/helper-module-imports@7.25.7': + "@babel/helper-module-imports@7.25.7": dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 + "@babel/traverse": 7.29.0 + "@babel/types": 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': + "@babel/helper-module-imports@7.28.6": dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + "@babel/traverse": 7.29.0 + "@babel/types": 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8)': + "@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8)": dependencies: - '@babel/core': 7.25.8 - '@babel/helper-module-imports': 7.25.7 - '@babel/helper-simple-access': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - '@babel/traverse': 7.25.7 + "@babel/core": 7.25.8 + "@babel/helper-module-imports": 7.25.7 + "@babel/helper-simple-access": 7.25.7 + "@babel/helper-validator-identifier": 7.25.7 + "@babel/traverse": 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + "@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)": dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + "@babel/core": 7.29.0 + "@babel/helper-module-imports": 7.28.6 + "@babel/helper-validator-identifier": 7.28.5 + "@babel/traverse": 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.27.6 - - '@babel/helper-plugin-utils@7.25.7': {} - - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color + "@babel/helper-plugin-utils@7.25.7": {} - '@babel/helper-simple-access@7.25.7': - dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 - transitivePeerDependencies: - - supports-color + "@babel/helper-plugin-utils@7.28.6": {} - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + "@babel/helper-simple-access@7.25.7": dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + "@babel/traverse": 7.29.0 + "@babel/types": 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.25.7': {} + "@babel/helper-string-parser@7.25.7": {} - '@babel/helper-string-parser@7.25.9': {} + "@babel/helper-string-parser@7.27.1": {} - '@babel/helper-string-parser@7.27.1': {} + "@babel/helper-validator-identifier@7.25.7": {} - '@babel/helper-validator-identifier@7.25.7': {} + "@babel/helper-validator-identifier@7.28.5": {} - '@babel/helper-validator-identifier@7.25.9': {} + "@babel/helper-validator-option@7.25.7": {} - '@babel/helper-validator-identifier@7.27.1': {} + "@babel/helper-validator-option@7.27.1": {} - '@babel/helper-validator-option@7.25.7': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.25.7': + "@babel/helpers@7.25.7": dependencies: - '@babel/template': 7.25.7 - '@babel/types': 7.25.8 + "@babel/template": 7.28.6 + "@babel/types": 7.29.0 - '@babel/helpers@7.27.6': + "@babel/helpers@7.28.6": dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + "@babel/template": 7.28.6 + "@babel/types": 7.29.0 - '@babel/highlight@7.25.7': + "@babel/highlight@7.25.7": dependencies: - '@babel/helper-validator-identifier': 7.25.7 + "@babel/helper-validator-identifier": 7.28.5 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/parser@7.25.8': - dependencies: - '@babel/types': 7.25.8 - - '@babel/parser@7.27.5': + "@babel/parser@7.25.8": dependencies: - '@babel/types': 7.27.6 + "@babel/types": 7.29.0 - '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.8)': + "@babel/parser@7.29.0": dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + "@babel/types": 7.29.0 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': + "@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.8)": dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + "@babel/core": 7.25.8 + "@babel/helper-plugin-utils": 7.25.7 - '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.8)': + "@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)": dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + "@babel/core": 7.29.0 + "@babel/helper-plugin-utils": 7.28.6 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': + "@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.8)": dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 + "@babel/core": 7.25.8 + "@babel/helper-plugin-utils": 7.25.7 - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': + "@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)": dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color + "@babel/core": 7.29.0 + "@babel/helper-plugin-utils": 7.28.6 - '@babel/template@7.25.7': + "@babel/template@7.25.7": dependencies: - '@babel/code-frame': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 + "@babel/code-frame": 7.29.0 + "@babel/parser": 7.29.0 + "@babel/types": 7.29.0 - '@babel/template@7.27.2': + "@babel/template@7.28.6": dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + "@babel/code-frame": 7.29.0 + "@babel/parser": 7.29.0 + "@babel/types": 7.29.0 - '@babel/traverse@7.25.7': + "@babel/traverse@7.25.7": dependencies: - '@babel/code-frame': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/template': 7.25.7 - '@babel/types': 7.25.8 - debug: 4.3.7 + "@babel/code-frame": 7.29.0 + "@babel/generator": 7.25.7 + "@babel/parser": 7.29.0 + "@babel/template": 7.28.6 + "@babel/types": 7.29.0 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.27.4': + "@babel/traverse@7.29.0": dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - debug: 4.4.1 - globals: 11.12.0 + "@babel/code-frame": 7.29.0 + "@babel/generator": 7.29.1 + "@babel/helper-globals": 7.28.0 + "@babel/parser": 7.29.0 + "@babel/template": 7.28.6 + "@babel/types": 7.29.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.25.8': + "@babel/types@7.25.8": dependencies: - '@babel/helper-string-parser': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 + "@babel/helper-string-parser": 7.25.7 + "@babel/helper-validator-identifier": 7.25.7 to-fast-properties: 2.0.0 - '@babel/types@7.26.9': + "@babel/types@7.27.6": dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + "@babel/helper-string-parser": 7.27.1 + "@babel/helper-validator-identifier": 7.28.5 - '@babel/types@7.27.6': + "@babel/types@7.29.0": dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@bprogress/core@1.1.18': {} + "@babel/helper-string-parser": 7.27.1 + "@babel/helper-validator-identifier": 7.28.5 - '@clack/core@0.3.4': - dependencies: - picocolors: 1.1.1 - sisteransi: 1.0.5 + "@bprogress/core@1.3.4": {} - '@cloudflare/kv-asset-handler@0.4.0': + "@cloudflare/kv-asset-handler@0.4.0": dependencies: mime: 3.0.0 - '@colors/colors@1.6.0': {} + "@colors/colors@1.6.0": {} - '@corvu/utils@0.4.2(solid-js@1.9.7)': + "@corvu/utils@0.4.2(solid-js@1.9.12)": dependencies: - '@floating-ui/dom': 1.6.11 - solid-js: 1.9.7 + "@floating-ui/dom": 1.6.11 + solid-js: 1.9.12 - '@ctrl/tinycolor@4.1.0': {} + "@ctrl/tinycolor@4.2.0": {} - '@dabh/diagnostics@2.0.3': + "@dabh/diagnostics@2.0.3": dependencies: colorspace: 1.1.4 enabled: 2.0.0 kuler: 2.0.0 - '@deno/shim-deno-test@0.5.0': {} + "@deno/shim-deno-test@0.5.0": {} - '@deno/shim-deno@0.19.2': + "@deno/shim-deno@0.19.2": dependencies: - '@deno/shim-deno-test': 0.5.0 + "@deno/shim-deno-test": 0.5.0 which: 4.0.0 - '@dependents/detective-less@5.0.1': + "@dependents/detective-less@5.0.1": dependencies: gonzales-pe: 4.3.0 node-source-walk: 7.0.1 - '@docsearch/css@3.8.0': {} - - '@docsearch/js@3.8.0(@algolia/client-search@5.14.2)(react@18.3.1)(search-insights@2.17.3)': - dependencies: - '@docsearch/react': 3.8.0(@algolia/client-search@5.14.2)(react@18.3.1)(search-insights@2.17.3) - preact: 10.24.3 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - - '@docsearch/react@3.8.0(@algolia/client-search@5.14.2)(react@18.3.1)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.14.2)(algoliasearch@5.14.2) - '@docsearch/css': 3.8.0 - algoliasearch: 5.14.2 - optionalDependencies: - react: 18.3.1 - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' + "@docsearch/css@3.9.0": {} - '@esbuild/aix-ppc64@0.25.5': + "@esbuild/aix-ppc64@0.25.5": optional: true - '@esbuild/android-arm64@0.25.5': + "@esbuild/android-arm64@0.25.5": optional: true - '@esbuild/android-arm@0.25.5': + "@esbuild/android-arm@0.25.5": optional: true - '@esbuild/android-x64@0.25.5': + "@esbuild/android-x64@0.25.5": optional: true - '@esbuild/darwin-arm64@0.25.5': + "@esbuild/darwin-arm64@0.25.5": optional: true - '@esbuild/darwin-x64@0.25.5': + "@esbuild/darwin-x64@0.25.5": optional: true - '@esbuild/freebsd-arm64@0.25.5': + "@esbuild/freebsd-arm64@0.25.5": optional: true - '@esbuild/freebsd-x64@0.25.5': + "@esbuild/freebsd-x64@0.25.5": optional: true - '@esbuild/linux-arm64@0.25.5': + "@esbuild/linux-arm64@0.25.5": optional: true - '@esbuild/linux-arm@0.25.5': + "@esbuild/linux-arm@0.25.5": optional: true - '@esbuild/linux-ia32@0.25.5': + "@esbuild/linux-ia32@0.25.5": optional: true - '@esbuild/linux-loong64@0.25.5': + "@esbuild/linux-loong64@0.25.5": optional: true - '@esbuild/linux-mips64el@0.25.5': + "@esbuild/linux-mips64el@0.25.5": optional: true - '@esbuild/linux-ppc64@0.25.5': + "@esbuild/linux-ppc64@0.25.5": optional: true - '@esbuild/linux-riscv64@0.25.5': + "@esbuild/linux-riscv64@0.25.5": optional: true - '@esbuild/linux-s390x@0.25.5': + "@esbuild/linux-s390x@0.25.5": optional: true - '@esbuild/linux-x64@0.25.5': + "@esbuild/linux-x64@0.25.5": optional: true - '@esbuild/netbsd-arm64@0.25.5': + "@esbuild/netbsd-arm64@0.25.5": optional: true - '@esbuild/netbsd-x64@0.25.5': + "@esbuild/netbsd-x64@0.25.5": optional: true - '@esbuild/openbsd-arm64@0.25.5': + "@esbuild/openbsd-arm64@0.25.5": optional: true - '@esbuild/openbsd-x64@0.25.5': + "@esbuild/openbsd-x64@0.25.5": optional: true - '@esbuild/sunos-x64@0.25.5': + "@esbuild/sunos-x64@0.25.5": optional: true - '@esbuild/win32-arm64@0.25.5': + "@esbuild/win32-arm64@0.25.5": optional: true - '@esbuild/win32-ia32@0.25.5': + "@esbuild/win32-ia32@0.25.5": optional: true - '@esbuild/win32-x64@0.25.5': + "@esbuild/win32-x64@0.25.5": optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': + "@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@1.21.7))": dependencies: - eslint: 9.28.0(jiti@2.4.2) + eslint: 9.39.2(jiti@1.21.7) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.1': {} + "@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@1.21.7))": + dependencies: + eslint: 9.39.2(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + "@eslint-community/regexpp@4.12.2": {} - '@eslint/config-array@0.20.1': + "@eslint/config-array@0.21.1": dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + "@eslint/object-schema": 2.1.7 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.3': {} - - '@eslint/core@0.14.0': + "@eslint/config-helpers@0.4.2": dependencies: - '@types/json-schema': 7.0.15 + "@eslint/core": 0.17.0 - '@eslint/core@0.15.0': + "@eslint/core@0.17.0": dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 - '@eslint/eslintrc@3.3.1': + "@eslint/eslintrc@3.3.3": dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 + import-fresh: 3.3.1 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.28.0': {} + "@eslint/js@9.39.2": {} - '@eslint/js@9.29.0': {} + "@eslint/js@9.39.4": {} - '@eslint/object-schema@2.1.6': {} + "@eslint/object-schema@2.1.7": {} - '@eslint/plugin-kit@0.3.2': + "@eslint/plugin-kit@0.4.1": dependencies: - '@eslint/core': 0.15.0 + "@eslint/core": 0.17.0 levn: 0.4.1 - '@expressive-code/core@0.40.2': + "@expressive-code/core@0.40.2": + dependencies: + "@ctrl/tinycolor": 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.8 + postcss-nested: 6.2.0(postcss@8.5.8) + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.2 + + "@expressive-code/core@0.41.3": dependencies: - '@ctrl/tinycolor': 4.1.0 - hast-util-select: 6.0.3 + "@ctrl/tinycolor": 4.2.0 + hast-util-select: 6.0.4 hast-util-to-html: 9.0.5 hast-util-to-text: 4.0.2 - hastscript: 9.0.0 - postcss: 8.5.5 - postcss-nested: 6.2.0(postcss@8.5.5) + hastscript: 9.0.1 + postcss: 8.5.8 + postcss-nested: 6.2.0(postcss@8.5.8) unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 + + "@expressive-code/plugin-collapsible-sections@0.40.2": + dependencies: + "@expressive-code/core": 0.40.2 - '@expressive-code/plugin-collapsible-sections@0.40.2': + "@expressive-code/plugin-frames@0.40.2": dependencies: - '@expressive-code/core': 0.40.2 + "@expressive-code/core": 0.40.2 - '@expressive-code/plugin-frames@0.40.2': + "@expressive-code/plugin-frames@0.41.3": dependencies: - '@expressive-code/core': 0.40.2 + "@expressive-code/core": 0.41.3 - '@expressive-code/plugin-line-numbers@0.40.2': + "@expressive-code/plugin-line-numbers@0.40.2": dependencies: - '@expressive-code/core': 0.40.2 + "@expressive-code/core": 0.40.2 - '@expressive-code/plugin-shiki@0.40.2': + "@expressive-code/plugin-shiki@0.40.2": dependencies: - '@expressive-code/core': 0.40.2 + "@expressive-code/core": 0.40.2 shiki: 1.29.2 - '@expressive-code/plugin-text-markers@0.40.2': + "@expressive-code/plugin-shiki@0.41.3": + dependencies: + "@expressive-code/core": 0.41.3 + shiki: 3.23.0 + + "@expressive-code/plugin-text-markers@0.40.2": + dependencies: + "@expressive-code/core": 0.40.2 + + "@expressive-code/plugin-text-markers@0.41.3": dependencies: - '@expressive-code/core': 0.40.2 + "@expressive-code/core": 0.41.3 - '@fastify/busboy@3.1.1': {} + "@fastify/busboy@3.1.1": {} - '@floating-ui/core@1.6.8': + "@floating-ui/core@1.6.8": dependencies: - '@floating-ui/utils': 0.2.8 + "@floating-ui/utils": 0.2.8 - '@floating-ui/dom@1.6.11': + "@floating-ui/dom@1.6.11": dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 + "@floating-ui/core": 1.6.8 + "@floating-ui/utils": 0.2.8 - '@floating-ui/utils@0.2.8': {} + "@floating-ui/utils@0.2.8": {} - '@fontsource-variable/inter@5.1.1': {} + "@fontsource-variable/inter@5.2.8": {} - '@fontsource-variable/jetbrains-mono@5.1.2': {} + "@fontsource-variable/jetbrains-mono@5.2.8": {} - '@fontsource-variable/lexend@5.1.2': {} + "@fontsource-variable/lexend@5.2.11": {} - '@humanfs/core@0.19.1': {} + "@humanfs/core@0.19.1": {} - '@humanfs/node@0.16.6': + "@humanfs/node@0.16.7": dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + "@humanfs/core": 0.19.1 + "@humanwhocodes/retry": 0.4.3 - '@humanwhocodes/module-importer@1.0.1': {} + "@humanwhocodes/module-importer@1.0.1": {} - '@humanwhocodes/retry@0.3.1': {} + "@humanwhocodes/retry@0.4.3": {} - '@humanwhocodes/retry@0.4.3': {} + "@iarna/toml@2.2.5": {} - '@iconify/types@2.0.0': {} + "@iconify/types@2.0.0": {} - '@iconify/utils@2.3.0': + "@iconify/utils@3.0.2": dependencies: - '@antfu/install-pkg': 1.0.0 - '@antfu/utils': 8.1.1 - '@iconify/types': 2.0.0 - debug: 4.4.1 + "@antfu/install-pkg": 1.1.0 + "@antfu/utils": 9.3.0 + "@iconify/types": 2.0.0 + debug: 4.4.3 globals: 15.15.0 kolorist: 1.8.0 - local-pkg: 1.1.1 - mlly: 1.7.4 + local-pkg: 1.1.2 + mlly: 1.8.0 transitivePeerDependencies: - supports-color - '@internationalized/date@3.5.6': + "@internationalized/date@3.5.6": dependencies: - '@swc/helpers': 0.5.13 + "@swc/helpers": 0.5.13 - '@internationalized/number@3.5.4': + "@internationalized/number@3.5.4": dependencies: - '@swc/helpers': 0.5.13 + "@swc/helpers": 0.5.13 - '@ioredis/commands@1.2.0': {} + "@ioredis/commands@1.2.0": {} - '@isaacs/cliui@8.0.2': + "@isaacs/cliui@8.0.2": dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': + "@isaacs/fs-minipass@4.0.1": dependencies: - minipass: 7.1.2 + minipass: 7.1.3 - '@jest/schemas@29.6.3': + "@jridgewell/gen-mapping@0.3.13": dependencies: - '@sinclair/typebox': 0.27.8 + "@jridgewell/sourcemap-codec": 1.5.5 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/gen-mapping@0.3.5': + "@jridgewell/remapping@2.3.5": dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/resolve-uri@3.1.2": {} - '@jridgewell/resolve-uri@3.1.2': {} + "@jridgewell/source-map@0.3.6": + dependencies: + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/set-array@1.2.1': {} + "@jridgewell/sourcemap-codec@1.5.5": {} - '@jridgewell/source-map@0.3.6': + "@jridgewell/trace-mapping@0.3.25": dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.5 - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': + "@jridgewell/trace-mapping@0.3.31": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.5 - '@kobalte/core@0.13.10(solid-js@1.9.7)': + "@kobalte/core@0.13.11(solid-js@1.9.12)": dependencies: - '@floating-ui/dom': 1.6.11 - '@internationalized/date': 3.5.6 - '@internationalized/number': 3.5.4 - '@kobalte/utils': 0.9.1(solid-js@1.9.7) - '@solid-primitives/props': 3.1.11(solid-js@1.9.7) - '@solid-primitives/resize-observer': 2.0.26(solid-js@1.9.7) - solid-js: 1.9.7 - solid-presence: 0.1.8(solid-js@1.9.7) - solid-prevent-scroll: 0.1.10(solid-js@1.9.7) + "@floating-ui/dom": 1.6.11 + "@internationalized/date": 3.5.6 + "@internationalized/number": 3.5.4 + "@kobalte/utils": 0.9.1(solid-js@1.9.12) + "@solid-primitives/props": 3.1.11(solid-js@1.9.12) + "@solid-primitives/resize-observer": 2.0.26(solid-js@1.9.12) + solid-js: 1.9.12 + solid-presence: 0.1.8(solid-js@1.9.12) + solid-prevent-scroll: 0.1.10(solid-js@1.9.12) - '@kobalte/solidbase@0.2.16(@algolia/client-search@5.14.2)(@solidjs/start@1.1.4(solid-js@1.9.7)(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)))(@vue/compiler-sfc@3.5.16)(acorn@8.15.0)(expressive-code@0.40.2)(react@18.3.1)(search-insights@2.17.3)(solid-js@1.9.7)(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))': + "@kobalte/solidbase@0.2.20(@solidjs/start@1.3.2(solid-js@1.9.12)(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)))(@vue/compiler-sfc@3.5.16)(solid-js@1.9.12)(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))": dependencies: - '@alloc/quick-lru': 5.2.0 - '@bprogress/core': 1.1.18 - '@docsearch/css': 3.8.0 - '@docsearch/js': 3.8.0(@algolia/client-search@5.14.2)(react@18.3.1)(search-insights@2.17.3) - '@expressive-code/core': 0.40.2 - '@expressive-code/plugin-collapsible-sections': 0.40.2 - '@expressive-code/plugin-frames': 0.40.2 - '@expressive-code/plugin-line-numbers': 0.40.2 - '@fontsource-variable/inter': 5.1.1 - '@fontsource-variable/jetbrains-mono': 5.1.2 - '@fontsource-variable/lexend': 5.1.2 - '@kobalte/core': 0.13.10(solid-js@1.9.7) - '@mdx-js/mdx': 3.1.0(acorn@8.15.0) - '@solid-primitives/clipboard': 1.5.10(solid-js@1.9.7) - '@solid-primitives/context': 0.2.3(solid-js@1.9.7) - '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) - '@solid-primitives/keyboard': 1.2.8(solid-js@1.9.7) - '@solid-primitives/media': 2.3.1(solid-js@1.9.7) - '@solid-primitives/platform': 0.1.2(solid-js@1.9.7) - '@solid-primitives/scroll': 2.0.23(solid-js@1.9.7) - '@solid-primitives/storage': 4.3.1(solid-js@1.9.7) - '@solidjs/meta': 0.29.4(solid-js@1.9.7) - '@solidjs/router': 0.15.3(solid-js@1.9.7) - '@solidjs/start': 1.1.4(solid-js@1.9.7)(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) - cross-spawn: 7.0.3 + "@alloc/quick-lru": 5.2.0 + "@bprogress/core": 1.3.4 + "@docsearch/css": 3.9.0 + "@expressive-code/core": 0.40.2 + "@expressive-code/plugin-collapsible-sections": 0.40.2 + "@expressive-code/plugin-frames": 0.40.2 + "@expressive-code/plugin-line-numbers": 0.40.2 + "@fontsource-variable/inter": 5.2.8 + "@fontsource-variable/jetbrains-mono": 5.2.8 + "@fontsource-variable/lexend": 5.2.11 + "@kobalte/core": 0.13.11(solid-js@1.9.12) + "@mdx-js/mdx": 3.1.1 + "@solid-primitives/clipboard": 1.6.2(solid-js@1.9.12) + "@solid-primitives/context": 0.2.3(solid-js@1.9.12) + "@solid-primitives/event-listener": 2.4.5(solid-js@1.9.12) + "@solid-primitives/keyboard": 1.3.3(solid-js@1.9.12) + "@solid-primitives/media": 2.3.5(solid-js@1.9.12) + "@solid-primitives/platform": 0.1.2(solid-js@1.9.12) + "@solid-primitives/scroll": 2.1.3(solid-js@1.9.12) + "@solid-primitives/storage": 4.3.3(solid-js@1.9.12) + "@solidjs/meta": 0.29.4(solid-js@1.9.12) + "@solidjs/router": 0.15.4(solid-js@1.9.12) + "@solidjs/start": 1.3.2(solid-js@1.9.12)(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) + cross-spawn: 7.0.6 + diff: 8.0.2 esast-util-from-js: 2.0.1 - estree-util-value-to-estree: 3.2.1 - expressive-code-twoslash: 0.4.0(@expressive-code/core@0.40.2)(expressive-code@0.40.2)(typescript@5.8.3) + estree-util-value-to-estree: 3.5.0 + expressive-code: 0.41.3 + expressive-code-twoslash: 0.4.0(@expressive-code/core@0.40.2)(expressive-code@0.41.3)(typescript@5.9.3) gray-matter: 4.0.3 - hastscript: 9.0.0 - mdast-util-find-and-replace: 3.0.1 + hastscript: 9.0.1 + magic-string: 0.30.21 + mdast-util-find-and-replace: 3.0.2 mdast-util-mdx-jsx: 3.2.0 + mdast-util-to-string: 4.0.0 mdast-util-toc: 7.1.0 + parse-numeric-range: 1.3.0 + prettier: 4.0.0-alpha.10 rehype-autolink-headings: 7.1.0 rehype-expressive-code: 0.40.2 rehype-raw: 7.0.0 rehype-slug: 6.0.0 - remark-directive: 3.0.0 + remark-directive: 3.0.1 remark-frontmatter: 5.0.0 - remark-gfm: 4.0.0 - solid-js: 1.9.7 - solid-mdx: 0.0.7(solid-js@1.9.7)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) + remark-gfm: 4.0.1 + solid-js: 1.9.12 + solid-mdx: 0.0.7(solid-js@1.9.12)(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) + source-map: 0.7.6 toml: 3.0.0 - typescript: 5.8.3 + typescript: 5.9.3 unified: 11.0.5 unist: 0.0.1 unist-builder: 4.0.0 unist-util-mdx-define: 1.1.2 unist-util-visit: 5.0.0 - unplugin-auto-import: 19.1.1 - unplugin-icons: 22.1.0(@vue/compiler-sfc@3.5.16) - vinxi: 0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) - yaml: 2.8.0 + unplugin-auto-import: 19.3.0 + unplugin-icons: 22.5.0(@vue/compiler-sfc@3.5.16) + vinxi: 0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) + yaml: 2.8.1 transitivePeerDependencies: - - '@algolia/client-search' - - '@nuxt/kit' - - '@svgr/core' - - '@svgx/core' - - '@tauri-apps/plugin-store' - - '@types/react' - - '@vue/compiler-sfc' - - '@vueuse/core' - - acorn - - expressive-code - - react - - react-dom - - search-insights + - "@nuxt/kit" + - "@svgr/core" + - "@svgx/core" + - "@tauri-apps/plugin-store" + - "@vue/compiler-sfc" + - "@vueuse/core" - solid-start - supports-color - svelte - vue-template-compiler - vue-template-es2015-compiler - '@kobalte/tailwindcss@0.9.0(tailwindcss@3.4.17)': + "@kobalte/tailwindcss@0.9.0(tailwindcss@3.4.19(yaml@2.8.1))": dependencies: - tailwindcss: 3.4.17 + tailwindcss: 3.4.19(yaml@2.8.1) - '@kobalte/utils@0.9.1(solid-js@1.9.7)': + "@kobalte/utils@0.9.1(solid-js@1.9.12)": dependencies: - '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) - '@solid-primitives/keyed': 1.2.2(solid-js@1.9.7) - '@solid-primitives/map': 0.4.13(solid-js@1.9.7) - '@solid-primitives/media': 2.3.1(solid-js@1.9.7) - '@solid-primitives/props': 3.1.11(solid-js@1.9.7) - '@solid-primitives/refs': 1.0.8(solid-js@1.9.7) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) - solid-js: 1.9.7 - - '@kwsites/file-exists@1.1.1': - dependencies: - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - - '@kwsites/promise-deferred@1.1.1': {} - - '@lunariajs/core@0.1.1': - dependencies: - '@clack/core': 0.3.4 - fast-glob: 3.3.3 - get-port: 7.1.0 - jiti: 1.21.6 - micromatch: 4.0.8 - path-to-regexp: 6.3.0 - picocolors: 1.1.1 - simple-git: 3.27.0 - ultramatter: 0.0.4 - zod: 3.25.62 - transitivePeerDependencies: - - supports-color + "@solid-primitives/event-listener": 2.4.5(solid-js@1.9.12) + "@solid-primitives/keyed": 1.2.2(solid-js@1.9.12) + "@solid-primitives/map": 0.4.13(solid-js@1.9.12) + "@solid-primitives/media": 2.3.5(solid-js@1.9.12) + "@solid-primitives/props": 3.1.11(solid-js@1.9.12) + "@solid-primitives/refs": 1.0.8(solid-js@1.9.12) + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@mapbox/node-pre-gyp@2.0.0': + "@mapbox/node-pre-gyp@2.0.0": dependencies: consola: 3.4.2 detect-libc: 2.0.4 https-proxy-agent: 7.0.6 node-fetch: 2.7.0 nopt: 8.1.0 - semver: 7.7.2 + semver: 7.7.4 tar: 7.4.3 transitivePeerDependencies: - encoding - supports-color - '@mdx-js/mdx@3.1.0(acorn@8.15.0)': + "@mdx-js/mdx@3.1.1": dependencies: - '@types/estree': 1.0.8 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 + "@types/estree": 1.0.8 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdx": 2.0.13 + acorn: 8.15.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.2 + hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.15.0) + recma-jsx: 1.0.1(acorn@8.15.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 - remark-mdx: 3.1.0 + remark-mdx: 3.1.1 remark-parse: 11.0.0 - remark-rehype: 11.1.1 - source-map: 0.7.4 + remark-rehype: 11.1.2 + source-map: 0.7.6 unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 transitivePeerDependencies: - - acorn - supports-color - '@netlify/binary-info@1.0.0': {} + "@netlify/binary-info@1.0.0": {} - '@netlify/blobs@9.1.2': + "@netlify/blobs@9.1.2": dependencies: - '@netlify/dev-utils': 2.2.0 - '@netlify/runtime-utils': 1.3.1 + "@netlify/dev-utils": 2.2.0 + "@netlify/runtime-utils": 1.3.1 - '@netlify/dev-utils@2.2.0': + "@netlify/dev-utils@2.2.0": dependencies: - '@whatwg-node/server': 0.9.71 + "@whatwg-node/server": 0.9.71 chokidar: 4.0.3 decache: 4.6.2 dot-prop: 9.0.0 @@ -6017,12 +9671,12 @@ snapshots: uuid: 11.1.0 write-file-atomic: 6.0.0 - '@netlify/functions@3.1.10(rollup@4.43.0)': + "@netlify/functions@3.1.10(rollup@4.43.0)": dependencies: - '@netlify/blobs': 9.1.2 - '@netlify/dev-utils': 2.2.0 - '@netlify/serverless-functions-api': 1.41.2 - '@netlify/zip-it-and-ship-it': 12.1.4(rollup@4.43.0) + "@netlify/blobs": 9.1.2 + "@netlify/dev-utils": 2.2.0 + "@netlify/serverless-functions-api": 1.41.2 + "@netlify/zip-it-and-ship-it": 12.1.4(rollup@4.43.0) cron-parser: 4.9.0 decache: 4.6.2 extract-zip: 2.0.1 @@ -6036,21 +9690,21 @@ snapshots: - rollup - supports-color - '@netlify/open-api@2.37.0': {} + "@netlify/open-api@2.37.0": {} - '@netlify/runtime-utils@1.3.1': {} + "@netlify/runtime-utils@1.3.1": {} - '@netlify/serverless-functions-api@1.41.2': {} + "@netlify/serverless-functions-api@1.41.2": {} - '@netlify/serverless-functions-api@2.1.1': {} + "@netlify/serverless-functions-api@2.1.1": {} - '@netlify/zip-it-and-ship-it@12.1.4(rollup@4.43.0)': + "@netlify/zip-it-and-ship-it@12.1.4(rollup@4.43.0)": dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@netlify/binary-info': 1.0.0 - '@netlify/serverless-functions-api': 2.1.1 - '@vercel/nft': 0.29.4(rollup@4.43.0) + "@babel/parser": 7.29.0 + "@babel/types": 7.27.6 + "@netlify/binary-info": 1.0.0 + "@netlify/serverless-functions-api": 2.1.1 + "@vercel/nft": 0.29.4(rollup@4.43.0) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.0.0 @@ -6065,245 +9719,271 @@ snapshots: junk: 4.0.1 locate-path: 7.2.0 merge-options: 3.0.4 - minimatch: 9.0.5 + minimatch: 9.0.9 normalize-path: 3.0.0 p-map: 7.0.3 path-exists: 5.0.0 precinct: 12.2.0 require-package-name: 2.0.1 resolve: 2.0.0-next.5 - semver: 7.7.2 + semver: 7.7.4 tmp-promise: 3.0.3 toml: 3.0.0 unixify: 1.0.0 urlpattern-polyfill: 8.0.2 yargs: 17.7.2 - zod: 3.25.62 + zod: 3.25.76 transitivePeerDependencies: - encoding - rollup - supports-color - '@noble/hashes@1.8.0': {} + "@noble/hashes@1.8.0": {} - '@nodelib/fs.scandir@2.1.5': + "@nodelib/fs.scandir@2.1.5": dependencies: - '@nodelib/fs.stat': 2.0.5 + "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + "@nodelib/fs.stat@2.0.5": {} - '@nodelib/fs.walk@1.2.8': + "@nodelib/fs.walk@1.2.8": dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.20.1 - '@orama/crawly@0.0.6': + "@orama/core@1.2.19": + dependencies: + "@orama/cuid2": 2.2.3 + "@orama/oramacore-events-parser": 0.0.5 + + "@orama/crawly@0.0.6": dependencies: cheerio: 1.0.0-rc.12 slugify: 1.6.6 - '@orama/cuid2@2.2.3': + "@orama/cuid2@2.2.3": dependencies: - '@noble/hashes': 1.8.0 + "@noble/hashes": 1.8.0 - '@orama/orama@3.1.7': {} - - '@oramacloud/client@2.1.4': - dependencies: - '@orama/cuid2': 2.2.3 - '@orama/orama': 3.1.7 - lodash: 4.17.21 + "@orama/oramacore-events-parser@0.0.5": {} - '@parcel/watcher-android-arm64@2.4.1': + "@parcel/watcher-android-arm64@2.4.1": optional: true - '@parcel/watcher-android-arm64@2.5.1': + "@parcel/watcher-android-arm64@2.5.1": optional: true - '@parcel/watcher-darwin-arm64@2.4.1': + "@parcel/watcher-darwin-arm64@2.4.1": optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + "@parcel/watcher-darwin-arm64@2.5.1": optional: true - '@parcel/watcher-darwin-x64@2.4.1': + "@parcel/watcher-darwin-x64@2.4.1": optional: true - '@parcel/watcher-darwin-x64@2.5.1': + "@parcel/watcher-darwin-x64@2.5.1": optional: true - '@parcel/watcher-freebsd-x64@2.4.1': + "@parcel/watcher-freebsd-x64@2.4.1": optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + "@parcel/watcher-freebsd-x64@2.5.1": optional: true - '@parcel/watcher-linux-arm-glibc@2.4.1': + "@parcel/watcher-linux-arm-glibc@2.4.1": optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + "@parcel/watcher-linux-arm-glibc@2.5.1": optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + "@parcel/watcher-linux-arm-musl@2.5.1": optional: true - '@parcel/watcher-linux-arm64-glibc@2.4.1': + "@parcel/watcher-linux-arm64-glibc@2.4.1": optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + "@parcel/watcher-linux-arm64-glibc@2.5.1": optional: true - '@parcel/watcher-linux-arm64-musl@2.4.1': + "@parcel/watcher-linux-arm64-musl@2.4.1": optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + "@parcel/watcher-linux-arm64-musl@2.5.1": optional: true - '@parcel/watcher-linux-x64-glibc@2.4.1': + "@parcel/watcher-linux-x64-glibc@2.4.1": optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + "@parcel/watcher-linux-x64-glibc@2.5.1": optional: true - '@parcel/watcher-linux-x64-musl@2.4.1': + "@parcel/watcher-linux-x64-musl@2.4.1": optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + "@parcel/watcher-linux-x64-musl@2.5.1": optional: true - '@parcel/watcher-wasm@2.3.0': + "@parcel/watcher-wasm@2.3.0": dependencies: is-glob: 4.0.3 micromatch: 4.0.8 - '@parcel/watcher-wasm@2.5.1': + "@parcel/watcher-wasm@2.5.1": dependencies: is-glob: 4.0.3 micromatch: 4.0.8 - '@parcel/watcher-win32-arm64@2.4.1': + "@parcel/watcher-win32-arm64@2.4.1": optional: true - '@parcel/watcher-win32-arm64@2.5.1': + "@parcel/watcher-win32-arm64@2.5.1": optional: true - '@parcel/watcher-win32-ia32@2.4.1': + "@parcel/watcher-win32-ia32@2.4.1": optional: true - '@parcel/watcher-win32-ia32@2.5.1': + "@parcel/watcher-win32-ia32@2.5.1": optional: true - '@parcel/watcher-win32-x64@2.4.1': + "@parcel/watcher-win32-x64@2.4.1": optional: true - '@parcel/watcher-win32-x64@2.5.1': + "@parcel/watcher-win32-x64@2.5.1": optional: true - '@parcel/watcher@2.4.1': + "@parcel/watcher@2.4.1": dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 micromatch: 4.0.8 node-addon-api: 7.1.1 optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.1 - '@parcel/watcher-darwin-arm64': 2.4.1 - '@parcel/watcher-darwin-x64': 2.4.1 - '@parcel/watcher-freebsd-x64': 2.4.1 - '@parcel/watcher-linux-arm-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-musl': 2.4.1 - '@parcel/watcher-linux-x64-glibc': 2.4.1 - '@parcel/watcher-linux-x64-musl': 2.4.1 - '@parcel/watcher-win32-arm64': 2.4.1 - '@parcel/watcher-win32-ia32': 2.4.1 - '@parcel/watcher-win32-x64': 2.4.1 - - '@parcel/watcher@2.5.1': + "@parcel/watcher-android-arm64": 2.4.1 + "@parcel/watcher-darwin-arm64": 2.4.1 + "@parcel/watcher-darwin-x64": 2.4.1 + "@parcel/watcher-freebsd-x64": 2.4.1 + "@parcel/watcher-linux-arm-glibc": 2.4.1 + "@parcel/watcher-linux-arm64-glibc": 2.4.1 + "@parcel/watcher-linux-arm64-musl": 2.4.1 + "@parcel/watcher-linux-x64-glibc": 2.4.1 + "@parcel/watcher-linux-x64-musl": 2.4.1 + "@parcel/watcher-win32-arm64": 2.4.1 + "@parcel/watcher-win32-ia32": 2.4.1 + "@parcel/watcher-win32-x64": 2.4.1 + + "@parcel/watcher@2.5.1": dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 micromatch: 4.0.8 node-addon-api: 7.1.1 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 - - '@pkgjs/parseargs@0.11.0': + "@parcel/watcher-android-arm64": 2.5.1 + "@parcel/watcher-darwin-arm64": 2.5.1 + "@parcel/watcher-darwin-x64": 2.5.1 + "@parcel/watcher-freebsd-x64": 2.5.1 + "@parcel/watcher-linux-arm-glibc": 2.5.1 + "@parcel/watcher-linux-arm-musl": 2.5.1 + "@parcel/watcher-linux-arm64-glibc": 2.5.1 + "@parcel/watcher-linux-arm64-musl": 2.5.1 + "@parcel/watcher-linux-x64-glibc": 2.5.1 + "@parcel/watcher-linux-x64-musl": 2.5.1 + "@parcel/watcher-win32-arm64": 2.5.1 + "@parcel/watcher-win32-ia32": 2.5.1 + "@parcel/watcher-win32-x64": 2.5.1 + + "@pkgjs/parseargs@0.11.0": optional: true - '@poppinss/colors@4.1.4': + "@poppinss/colors@4.1.4": dependencies: kleur: 4.1.5 - '@poppinss/dumper@0.6.3': + "@poppinss/dumper@0.6.3": dependencies: - '@poppinss/colors': 4.1.4 - '@sindresorhus/is': 7.0.2 - supports-color: 10.0.0 + "@poppinss/colors": 4.1.4 + "@sindresorhus/is": 7.0.2 + supports-color: 10.2.2 - '@poppinss/exception@1.2.1': {} + "@poppinss/exception@1.2.1": {} - '@rollup/plugin-alias@5.1.1(rollup@4.43.0)': + "@prettier/cli@0.6.0(prettier@4.0.0-alpha.10)": + dependencies: + "@iarna/toml": 2.2.5 + atomically: 2.1.0 + fast-ignore: 1.1.3 + find-up-json: 2.0.5 + function-once: 3.0.1 + import-meta-resolve: 4.2.0 + is-binary-path: 2.1.0 + js-yaml: 4.1.1 + json-sorted-stringify: 1.0.2 + json5: 2.2.3 + kasi: 1.1.1 + lomemo: 1.0.1 + pioppo: 1.2.1 + prettier: 4.0.0-alpha.10 + promise-resolve-timeout: 2.0.1 + specialist: 1.4.5 + tiny-editorconfig: 1.0.1 + tiny-jsonc: 1.0.2 + tiny-readdir-glob: 1.23.2 + tiny-spinner: 2.0.5 + worktank: 2.7.3 + zeptomatch: 2.1.0 + zeptomatch-escape: 1.0.1 + zeptomatch-is-static: 1.0.1 + + "@rollup/plugin-alias@5.1.1(rollup@4.43.0)": optionalDependencies: rollup: 4.43.0 - '@rollup/plugin-commonjs@28.0.3(rollup@4.43.0)': + "@rollup/plugin-commonjs@28.0.3(rollup@4.43.0)": dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.43.0) + "@rollup/pluginutils": 5.1.4(rollup@4.43.0) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.6(picomatch@4.0.2) + fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 - magic-string: 0.30.17 - picomatch: 4.0.2 + magic-string: 0.30.21 + picomatch: 4.0.3 optionalDependencies: rollup: 4.43.0 - '@rollup/plugin-inject@5.0.5(rollup@4.43.0)': + "@rollup/plugin-inject@5.0.5(rollup@4.43.0)": dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.43.0) + "@rollup/pluginutils": 5.1.4(rollup@4.43.0) estree-walker: 2.0.2 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: rollup: 4.43.0 - '@rollup/plugin-json@6.1.0(rollup@4.43.0)': + "@rollup/plugin-json@6.1.0(rollup@4.43.0)": dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.43.0) + "@rollup/pluginutils": 5.1.4(rollup@4.43.0) optionalDependencies: rollup: 4.43.0 - '@rollup/plugin-node-resolve@16.0.1(rollup@4.43.0)': + "@rollup/plugin-node-resolve@16.0.1(rollup@4.43.0)": dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.43.0) - '@types/resolve': 1.20.2 + "@rollup/pluginutils": 5.1.4(rollup@4.43.0) + "@types/resolve": 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.11 optionalDependencies: rollup: 4.43.0 - '@rollup/plugin-replace@6.0.2(rollup@4.43.0)': + "@rollup/plugin-replace@6.0.2(rollup@4.43.0)": dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.43.0) - magic-string: 0.30.17 + "@rollup/pluginutils": 5.1.4(rollup@4.43.0) + magic-string: 0.30.21 optionalDependencies: rollup: 4.43.0 - '@rollup/plugin-terser@0.4.4(rollup@4.43.0)': + "@rollup/plugin-terser@0.4.4(rollup@4.43.0)": dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 @@ -6311,554 +9991,760 @@ snapshots: optionalDependencies: rollup: 4.43.0 - '@rollup/pluginutils@5.1.4(rollup@4.43.0)': + "@rollup/pluginutils@5.1.4(rollup@4.43.0)": dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 4.43.0 - '@rollup/rollup-android-arm-eabi@4.43.0': + "@rollup/rollup-android-arm-eabi@4.43.0": optional: true - '@rollup/rollup-android-arm64@4.43.0': + "@rollup/rollup-android-arm64@4.43.0": optional: true - '@rollup/rollup-darwin-arm64@4.43.0': + "@rollup/rollup-darwin-arm64@4.43.0": optional: true - '@rollup/rollup-darwin-x64@4.43.0': + "@rollup/rollup-darwin-x64@4.43.0": optional: true - '@rollup/rollup-freebsd-arm64@4.43.0': + "@rollup/rollup-freebsd-arm64@4.43.0": optional: true - '@rollup/rollup-freebsd-x64@4.43.0': + "@rollup/rollup-freebsd-x64@4.43.0": optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.43.0': + "@rollup/rollup-linux-arm-gnueabihf@4.43.0": optional: true - '@rollup/rollup-linux-arm-musleabihf@4.43.0': + "@rollup/rollup-linux-arm-musleabihf@4.43.0": optional: true - '@rollup/rollup-linux-arm64-gnu@4.43.0': + "@rollup/rollup-linux-arm64-gnu@4.43.0": optional: true - '@rollup/rollup-linux-arm64-musl@4.43.0': + "@rollup/rollup-linux-arm64-musl@4.43.0": optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.43.0': + "@rollup/rollup-linux-loongarch64-gnu@4.43.0": optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': + "@rollup/rollup-linux-powerpc64le-gnu@4.43.0": optional: true - '@rollup/rollup-linux-riscv64-gnu@4.43.0': + "@rollup/rollup-linux-riscv64-gnu@4.43.0": optional: true - '@rollup/rollup-linux-riscv64-musl@4.43.0': + "@rollup/rollup-linux-riscv64-musl@4.43.0": optional: true - '@rollup/rollup-linux-s390x-gnu@4.43.0': + "@rollup/rollup-linux-s390x-gnu@4.43.0": optional: true - '@rollup/rollup-linux-x64-gnu@4.43.0': + "@rollup/rollup-linux-x64-gnu@4.43.0": optional: true - '@rollup/rollup-linux-x64-musl@4.43.0': + "@rollup/rollup-linux-x64-musl@4.43.0": optional: true - '@rollup/rollup-win32-arm64-msvc@4.43.0': + "@rollup/rollup-win32-arm64-msvc@4.43.0": optional: true - '@rollup/rollup-win32-ia32-msvc@4.43.0': + "@rollup/rollup-win32-ia32-msvc@4.43.0": optional: true - '@rollup/rollup-win32-x64-msvc@4.43.0': + "@rollup/rollup-win32-x64-msvc@4.43.0": optional: true - '@shikijs/core@1.29.2': + "@shikijs/core@1.29.2": dependencies: - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + "@shikijs/engine-javascript": 1.29.2 + "@shikijs/engine-oniguruma": 1.29.2 + "@shikijs/types": 1.29.2 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/core@3.6.0': + "@shikijs/core@3.23.0": dependencies: - '@shikijs/types': 3.6.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + "@shikijs/types": 3.23.0 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@1.29.2': + "@shikijs/core@4.0.2": dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 + "@shikijs/primitive": 4.0.2 + "@shikijs/types": 4.0.2 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 + hast-util-to-html: 9.0.5 + + "@shikijs/engine-javascript@1.29.2": + dependencies: + "@shikijs/types": 1.29.2 + "@shikijs/vscode-textmate": 10.0.2 oniguruma-to-es: 2.3.0 - '@shikijs/engine-javascript@3.6.0': + "@shikijs/engine-javascript@3.23.0": dependencies: - '@shikijs/types': 3.6.0 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.3 + "@shikijs/types": 3.23.0 + "@shikijs/vscode-textmate": 10.0.2 + oniguruma-to-es: 4.3.4 - '@shikijs/engine-oniguruma@1.29.2': + "@shikijs/engine-javascript@4.0.2": dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 + "@shikijs/types": 4.0.2 + "@shikijs/vscode-textmate": 10.0.2 + oniguruma-to-es: 4.3.4 - '@shikijs/engine-oniguruma@3.6.0': + "@shikijs/engine-oniguruma@1.29.2": dependencies: - '@shikijs/types': 3.6.0 - '@shikijs/vscode-textmate': 10.0.2 + "@shikijs/types": 1.29.2 + "@shikijs/vscode-textmate": 10.0.2 - '@shikijs/langs@1.29.2': + "@shikijs/engine-oniguruma@3.23.0": dependencies: - '@shikijs/types': 1.29.2 + "@shikijs/types": 3.23.0 + "@shikijs/vscode-textmate": 10.0.2 - '@shikijs/langs@3.6.0': + "@shikijs/engine-oniguruma@4.0.2": dependencies: - '@shikijs/types': 3.6.0 + "@shikijs/types": 4.0.2 + "@shikijs/vscode-textmate": 10.0.2 - '@shikijs/themes@1.29.2': + "@shikijs/langs@1.29.2": dependencies: - '@shikijs/types': 1.29.2 + "@shikijs/types": 1.29.2 - '@shikijs/themes@3.6.0': + "@shikijs/langs@3.23.0": dependencies: - '@shikijs/types': 3.6.0 + "@shikijs/types": 3.23.0 - '@shikijs/types@1.29.2': + "@shikijs/langs@4.0.2": dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + "@shikijs/types": 4.0.2 - '@shikijs/types@3.6.0': + "@shikijs/primitive@4.0.2": dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + "@shikijs/types": 4.0.2 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 - '@shikijs/vscode-textmate@10.0.2': {} + "@shikijs/themes@1.29.2": + dependencies: + "@shikijs/types": 1.29.2 - '@sinclair/typebox@0.27.8': {} + "@shikijs/themes@3.23.0": + dependencies: + "@shikijs/types": 3.23.0 - '@sindresorhus/is@7.0.2': {} + "@shikijs/themes@4.0.2": + dependencies: + "@shikijs/types": 4.0.2 - '@sindresorhus/merge-streams@2.3.0': {} + "@shikijs/types@1.29.2": + dependencies: + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 - '@solid-primitives/clipboard@1.5.10(solid-js@1.9.7)': + "@shikijs/types@3.23.0": dependencies: - '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) - solid-js: 1.9.7 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 - '@solid-primitives/context@0.2.3(solid-js@1.9.7)': + "@shikijs/types@4.0.2": dependencies: - solid-js: 1.9.7 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 + + "@shikijs/vscode-textmate@10.0.2": {} - '@solid-primitives/event-listener@2.4.1(solid-js@1.9.7)': + "@sindresorhus/is@7.0.2": {} + + "@sindresorhus/merge-streams@2.3.0": {} + + "@solid-primitives/clipboard@1.6.2(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/keyboard@1.2.8(solid-js@1.9.7)': + "@solid-primitives/context@0.2.3(solid-js@1.9.12)": dependencies: - '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) - '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) - '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) - solid-js: 1.9.7 + solid-js: 1.9.12 - '@solid-primitives/keyed@1.2.2(solid-js@1.9.7)': + "@solid-primitives/event-listener@2.4.5(solid-js@1.9.12)": dependencies: - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/map@0.4.13(solid-js@1.9.7)': + "@solid-primitives/keyboard@1.3.3(solid-js@1.9.12)": dependencies: - '@solid-primitives/trigger': 1.1.0(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/event-listener": 2.4.5(solid-js@1.9.12) + "@solid-primitives/rootless": 1.5.3(solid-js@1.9.12) + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/marker@0.2.1(solid-js@1.9.7)': + "@solid-primitives/keyed@1.2.2(solid-js@1.9.12)": dependencies: - solid-js: 1.9.7 + solid-js: 1.9.12 - '@solid-primitives/media@2.3.1(solid-js@1.9.7)': + "@solid-primitives/map@0.4.13(solid-js@1.9.12)": dependencies: - '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) - '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) - '@solid-primitives/static-store': 0.1.1(solid-js@1.9.7) - '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/trigger": 1.1.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/platform@0.1.2(solid-js@1.9.7)': + "@solid-primitives/marker@0.2.2(solid-js@1.9.12)": dependencies: - solid-js: 1.9.7 + solid-js: 1.9.12 - '@solid-primitives/platform@0.2.1(solid-js@1.9.7)': + "@solid-primitives/media@2.3.5(solid-js@1.9.12)": dependencies: - solid-js: 1.9.7 + "@solid-primitives/event-listener": 2.4.5(solid-js@1.9.12) + "@solid-primitives/rootless": 1.5.3(solid-js@1.9.12) + "@solid-primitives/static-store": 0.1.3(solid-js@1.9.12) + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/props@3.1.11(solid-js@1.9.7)': + "@solid-primitives/platform@0.1.2(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) - solid-js: 1.9.7 + solid-js: 1.9.12 - '@solid-primitives/refs@1.0.8(solid-js@1.9.7)': + "@solid-primitives/platform@0.2.1(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) - solid-js: 1.9.7 + solid-js: 1.9.12 - '@solid-primitives/resize-observer@2.0.26(solid-js@1.9.7)': + "@solid-primitives/props@3.1.11(solid-js@1.9.12)": dependencies: - '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) - '@solid-primitives/rootless': 1.4.5(solid-js@1.9.7) - '@solid-primitives/static-store': 0.0.8(solid-js@1.9.7) - '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/rootless@1.4.5(solid-js@1.9.7)': + "@solid-primitives/refs@1.0.8(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/rootless@1.5.1(solid-js@1.9.7)': + "@solid-primitives/resize-observer@2.0.26(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/event-listener": 2.4.5(solid-js@1.9.12) + "@solid-primitives/rootless": 1.5.3(solid-js@1.9.12) + "@solid-primitives/static-store": 0.0.8(solid-js@1.9.12) + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/scroll@2.0.23(solid-js@1.9.7)': + "@solid-primitives/rootless@1.5.3(solid-js@1.9.12)": dependencies: - '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) - '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) - '@solid-primitives/static-store': 0.0.8(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/static-store@0.0.8(solid-js@1.9.7)': + "@solid-primitives/scroll@2.1.3(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/event-listener": 2.4.5(solid-js@1.9.12) + "@solid-primitives/rootless": 1.5.3(solid-js@1.9.12) + "@solid-primitives/static-store": 0.1.3(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/static-store@0.1.1(solid-js@1.9.7)': + "@solid-primitives/static-store@0.0.8(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/storage@4.3.1(solid-js@1.9.7)': + "@solid-primitives/static-store@0.1.3(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/trigger@1.1.0(solid-js@1.9.7)': + "@solid-primitives/storage@4.3.3(solid-js@1.9.12)": dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/utils@6.2.3(solid-js@1.9.7)': + "@solid-primitives/trigger@1.1.0(solid-js@1.9.12)": dependencies: - solid-js: 1.9.7 + "@solid-primitives/utils": 6.4.0(solid-js@1.9.12) + solid-js: 1.9.12 - '@solid-primitives/utils@6.3.1(solid-js@1.9.7)': + "@solid-primitives/utils@6.4.0(solid-js@1.9.12)": dependencies: - solid-js: 1.9.7 + solid-js: 1.9.12 - '@solidjs/meta@0.29.4(solid-js@1.9.7)': + "@solidjs/meta@0.29.4(solid-js@1.9.12)": dependencies: - solid-js: 1.9.7 + solid-js: 1.9.12 - '@solidjs/router@0.15.3(solid-js@1.9.7)': + "@solidjs/router@0.15.4(solid-js@1.9.12)": dependencies: - solid-js: 1.9.7 + solid-js: 1.9.12 - '@solidjs/start@1.1.4(solid-js@1.9.7)(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))': + "@solidjs/start@1.3.2(solid-js@1.9.12)(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))": dependencies: - '@tanstack/server-functions-plugin': 1.121.0(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) - '@vinxi/plugin-directives': 0.5.0(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) - '@vinxi/server-components': 0.5.0(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) + "@tanstack/server-functions-plugin": 1.121.21(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) + "@vinxi/plugin-directives": 0.5.1(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) + "@vinxi/server-components": 0.5.1(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) + cookie-es: 2.0.0 defu: 6.1.4 error-stack-parser: 2.1.4 - html-to-image: 1.11.11 + html-to-image: 1.11.13 radix3: 1.1.2 - seroval: 1.1.1 - seroval-plugins: 1.1.1(seroval@1.1.1) + seroval: 1.5.0 + seroval-plugins: 1.5.0(seroval@1.5.0) shiki: 1.29.2 source-map-js: 1.2.1 - terracotta: 1.0.6(solid-js@1.9.7) - tinyglobby: 0.2.12 - vinxi: 0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) - vite-plugin-solid: 2.11.2(solid-js@1.9.7)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) + terracotta: 1.1.0(solid-js@1.9.12) + tinyglobby: 0.2.15 + vinxi: 0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) + vite-plugin-solid: 2.11.10(solid-js@1.9.12)(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) transitivePeerDependencies: - - '@testing-library/jest-dom' + - "@testing-library/jest-dom" - solid-js - supports-color - vite - '@speed-highlight/core@1.2.7': {} + "@speed-highlight/core@1.2.7": {} - '@swc/helpers@0.5.13': + "@swc/helpers@0.5.13": dependencies: - tslib: 2.8.0 + tslib: 2.8.1 - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)': + "@tailwindcss/typography@0.5.19(tailwindcss@3.4.19(yaml@2.8.1))": dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17 + tailwindcss: 3.4.19(yaml@2.8.1) - '@tanstack/directive-functions-plugin@1.121.0(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))': + "@tanstack/directive-functions-plugin@1.121.21(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))": dependencies: - '@babel/code-frame': 7.26.2 - '@babel/core': 7.27.4 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - '@tanstack/router-utils': 1.121.0 - babel-dead-code-elimination: 1.0.10 + "@babel/code-frame": 7.26.2 + "@babel/core": 7.29.0 + "@babel/traverse": 7.29.0 + "@babel/types": 7.29.0 + "@tanstack/router-utils": 1.161.4 + babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.121.0': + "@tanstack/router-utils@1.161.4": dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - ansis: 4.1.0 - diff: 8.0.2 + "@babel/core": 7.29.0 + "@babel/generator": 7.29.1 + "@babel/parser": 7.29.0 + "@babel/types": 7.29.0 + ansis: 4.2.0 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.3 + pathe: 2.0.3 + tinyglobby: 0.2.15 transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.121.0(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/core': 7.27.4 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - '@tanstack/directive-functions-plugin': 1.121.0(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) - babel-dead-code-elimination: 1.0.10 + "@tanstack/server-functions-plugin@1.121.21(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))": + dependencies: + "@babel/code-frame": 7.26.2 + "@babel/core": 7.29.0 + "@babel/plugin-syntax-jsx": 7.28.6(@babel/core@7.29.0) + "@babel/plugin-syntax-typescript": 7.28.6(@babel/core@7.29.0) + "@babel/template": 7.28.6 + "@babel/traverse": 7.29.0 + "@babel/types": 7.29.0 + "@tanstack/directive-functions-plugin": 1.121.21(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) + babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@types/acorn@4.0.6': - dependencies: - '@types/estree': 1.0.8 - - '@types/babel__core@7.20.5': + "@types/babel__core@7.20.5": dependencies: - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + "@babel/parser": 7.29.0 + "@babel/types": 7.29.0 + "@types/babel__generator": 7.27.0 + "@types/babel__template": 7.4.4 + "@types/babel__traverse": 7.28.0 - '@types/babel__generator@7.6.8': + "@types/babel__generator@7.27.0": dependencies: - '@babel/types': 7.25.8 + "@babel/types": 7.29.0 - '@types/babel__template@7.4.4': + "@types/babel__template@7.4.4": dependencies: - '@babel/parser': 7.25.8 - '@babel/types': 7.26.9 + "@babel/parser": 7.29.0 + "@babel/types": 7.29.0 - '@types/babel__traverse@7.20.6': + "@types/babel__traverse@7.28.0": dependencies: - '@babel/types': 7.26.9 + "@babel/types": 7.29.0 - '@types/braces@3.0.4': {} + "@types/braces@3.0.4": {} - '@types/debug@4.1.12': + "@types/debug@4.1.12": dependencies: - '@types/ms': 0.7.34 + "@types/ms": 2.1.0 - '@types/estree-jsx@1.0.5': + "@types/estree-jsx@1.0.5": dependencies: - '@types/estree': 1.0.8 - - '@types/estree@1.0.6': {} + "@types/estree": 1.0.8 - '@types/estree@1.0.7': {} + "@types/estree@1.0.7": {} - '@types/estree@1.0.8': {} + "@types/estree@1.0.8": {} - '@types/hast@3.0.4': + "@types/hast@3.0.4": dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 - '@types/json-schema@7.0.15': {} + "@types/json-schema@7.0.15": {} - '@types/mdast@4.0.4': + "@types/mdast@4.0.4": dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 - '@types/mdx@2.0.13': {} + "@types/mdx@2.0.13": {} - '@types/micromatch@4.0.9': + "@types/micromatch@4.0.9": dependencies: - '@types/braces': 3.0.4 + "@types/braces": 3.0.4 - '@types/ms@0.7.34': {} + "@types/ms@2.1.0": {} - '@types/node@17.0.45': {} + "@types/node@24.12.0": + dependencies: + undici-types: 7.16.0 - '@types/node@24.0.1': + "@types/node@25.5.0": dependencies: - undici-types: 7.8.0 + undici-types: 7.18.2 - '@types/normalize-package-data@2.4.4': {} + "@types/normalize-package-data@2.4.4": {} - '@types/resolve@1.20.2': {} + "@types/resolve@1.20.2": {} - '@types/sax@1.2.7': + "@types/sax@1.2.7": dependencies: - '@types/node': 24.0.1 + "@types/node": 25.5.0 - '@types/triple-beam@1.3.5': {} + "@types/triple-beam@1.3.5": {} - '@types/ungap__structured-clone@1.2.0': {} + "@types/ungap__structured-clone@1.2.0": {} - '@types/unist@2.0.11': {} + "@types/unist@2.0.11": {} - '@types/unist@3.0.3': {} + "@types/unist@3.0.3": {} - '@types/yauzl@2.10.3': + "@types/yauzl@2.10.3": dependencies: - '@types/node': 24.0.1 + "@types/node": 25.5.0 optional: true - '@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + "@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.56.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@eslint-community/regexpp": 4.12.2 + "@typescript-eslint/parser": 8.56.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.54.0 + "@typescript-eslint/type-utils": 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/utils": 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.54.0 + eslint: 9.39.2(jiti@1.21.7) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.34.0 - '@typescript-eslint/type-utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.34.0 - eslint: 9.28.0(jiti@2.4.2) - graphemer: 1.4.0 + "@eslint-community/regexpp": 4.12.2 + "@typescript-eslint/parser": 8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.58.0 + "@typescript-eslint/type-utils": 8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/utils": 8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.58.0 + eslint: 9.39.2(jiti@1.21.7) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/parser@8.56.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@typescript-eslint/scope-manager": 8.56.1 + "@typescript-eslint/types": 8.56.1 + "@typescript-eslint/typescript-estree": 8.56.1(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.56.1 + debug: 4.4.3 + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/parser@8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@typescript-eslint/scope-manager": 8.58.0 + "@typescript-eslint/types": 8.58.0 + "@typescript-eslint/typescript-estree": 8.58.0(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.58.0 + debug: 4.4.3 + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/project-service@8.34.0(typescript@5.9.3)": + dependencies: + "@typescript-eslint/tsconfig-utils": 8.58.0(typescript@5.9.3) + "@typescript-eslint/types": 8.58.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/project-service@8.54.0(typescript@5.9.3)": + dependencies: + "@typescript-eslint/tsconfig-utils": 8.58.0(typescript@5.9.3) + "@typescript-eslint/types": 8.58.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/project-service@8.56.1(typescript@5.9.3)": + dependencies: + "@typescript-eslint/tsconfig-utils": 8.56.1(typescript@5.9.3) + "@typescript-eslint/types": 8.56.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/project-service@8.58.0(typescript@5.9.3)": + dependencies: + "@typescript-eslint/tsconfig-utils": 8.58.0(typescript@5.9.3) + "@typescript-eslint/types": 8.58.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/scope-manager@8.34.0": + dependencies: + "@typescript-eslint/types": 8.34.0 + "@typescript-eslint/visitor-keys": 8.34.0 + + "@typescript-eslint/scope-manager@8.54.0": + dependencies: + "@typescript-eslint/types": 8.54.0 + "@typescript-eslint/visitor-keys": 8.54.0 + + "@typescript-eslint/scope-manager@8.56.1": + dependencies: + "@typescript-eslint/types": 8.56.1 + "@typescript-eslint/visitor-keys": 8.56.1 + + "@typescript-eslint/scope-manager@8.58.0": + dependencies: + "@typescript-eslint/types": 8.58.0 + "@typescript-eslint/visitor-keys": 8.58.0 + + "@typescript-eslint/tsconfig-utils@8.34.0(typescript@5.9.3)": + dependencies: + typescript: 5.9.3 + + "@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)": + dependencies: + typescript: 5.9.3 + + "@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)": + dependencies: + typescript: 5.9.3 + + "@typescript-eslint/tsconfig-utils@8.58.0(typescript@5.9.3)": + dependencies: + typescript: 5.9.3 + + "@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@typescript-eslint/types": 8.54.0 + "@typescript-eslint/typescript-estree": 8.54.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@1.21.7) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/type-utils@8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": + dependencies: + "@typescript-eslint/types": 8.58.0 + "@typescript-eslint/typescript-estree": 8.58.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@1.21.7) + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/types@8.34.0": {} + + "@typescript-eslint/types@8.54.0": {} + + "@typescript-eslint/types@8.56.1": {} + + "@typescript-eslint/types@8.58.0": {} + + "@typescript-eslint/typescript-estree@8.34.0(typescript@5.9.3)": + dependencies: + "@typescript-eslint/project-service": 8.34.0(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.34.0(typescript@5.9.3) + "@typescript-eslint/types": 8.34.0 + "@typescript-eslint/visitor-keys": 8.34.0 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.9 + semver: 7.7.4 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)": + dependencies: + "@typescript-eslint/project-service": 8.54.0(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.54.0(typescript@5.9.3) + "@typescript-eslint/types": 8.54.0 + "@typescript-eslint/visitor-keys": 8.54.0 + debug: 4.4.3 + minimatch: 9.0.9 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)": + dependencies: + "@typescript-eslint/project-service": 8.56.1(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.56.1(typescript@5.9.3) + "@typescript-eslint/types": 8.56.1 + "@typescript-eslint/visitor-keys": 8.56.1 + debug: 4.4.3 + minimatch: 10.2.2 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/typescript-estree@8.58.0(typescript@5.9.3)": + dependencies: + "@typescript-eslint/project-service": 8.58.0(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.58.0(typescript@5.9.3) + "@typescript-eslint/types": 8.58.0 + "@typescript-eslint/visitor-keys": 8.58.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + "@typescript-eslint/utils@8.34.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@typescript-eslint/scope-manager': 8.34.0 - '@typescript-eslint/types': 8.34.0 - '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.34.0 - debug: 4.3.7 - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.3 + "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.2(jiti@1.21.7)) + "@typescript-eslint/scope-manager": 8.34.0 + "@typescript-eslint/types": 8.34.0 + "@typescript-eslint/typescript-estree": 8.34.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.34.0(typescript@5.8.3)': + "@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@typescript-eslint/tsconfig-utils': 8.34.0(typescript@5.8.3) - '@typescript-eslint/types': 8.34.0 - debug: 4.3.7 - typescript: 5.8.3 + "@eslint-community/eslint-utils": 4.9.1(eslint@9.39.2(jiti@1.21.7)) + "@typescript-eslint/scope-manager": 8.54.0 + "@typescript-eslint/types": 8.54.0 + "@typescript-eslint/typescript-estree": 8.54.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.34.0': + "@typescript-eslint/utils@8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 8.34.0 - '@typescript-eslint/visitor-keys': 8.34.0 - - '@typescript-eslint/tsconfig-utils@8.34.0(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - - '@typescript-eslint/type-utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.1 - eslint: 9.28.0(jiti@2.4.2) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + "@eslint-community/eslint-utils": 4.9.1(eslint@9.39.2(jiti@1.21.7)) + "@typescript-eslint/scope-manager": 8.58.0 + "@typescript-eslint/types": 8.58.0 + "@typescript-eslint/typescript-estree": 8.58.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.34.0': {} + "@typescript-eslint/visitor-keys@8.34.0": + dependencies: + "@typescript-eslint/types": 8.34.0 + eslint-visitor-keys: 4.2.1 - '@typescript-eslint/typescript-estree@8.34.0(typescript@5.8.3)': + "@typescript-eslint/visitor-keys@8.54.0": dependencies: - '@typescript-eslint/project-service': 8.34.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.34.0(typescript@5.8.3) - '@typescript-eslint/types': 8.34.0 - '@typescript-eslint/visitor-keys': 8.34.0 - debug: 4.3.7 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color + "@typescript-eslint/types": 8.54.0 + eslint-visitor-keys: 4.2.1 - '@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + "@typescript-eslint/visitor-keys@8.56.1": dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.34.0 - '@typescript-eslint/types': 8.34.0 - '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color + "@typescript-eslint/types": 8.56.1 + eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.34.0': + "@typescript-eslint/visitor-keys@8.58.0": dependencies: - '@typescript-eslint/types': 8.34.0 - eslint-visitor-keys: 4.2.1 + "@typescript-eslint/types": 8.58.0 + eslint-visitor-keys: 5.0.1 - '@typescript/vfs@1.6.1(typescript@5.8.3)': + "@typescript/vfs@1.6.2(typescript@5.9.3)": dependencies: - debug: 4.4.1 - typescript: 5.8.3 + debug: 4.4.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@ungap/structured-clone@1.2.0': {} + "@ungap/structured-clone@1.3.0": {} - '@vercel/nft@0.29.4(rollup@4.43.0)': + "@vercel/nft@0.29.4(rollup@4.43.0)": dependencies: - '@mapbox/node-pre-gyp': 2.0.0 - '@rollup/pluginutils': 5.1.4(rollup@4.43.0) - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + "@mapbox/node-pre-gyp": 2.0.0 + "@rollup/pluginutils": 5.1.4(rollup@4.43.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 - glob: 10.4.5 + glob: 10.5.0 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.2 + picomatch: 4.0.3 resolve-from: 5.0.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vinxi/listhen@1.5.6': + "@vinxi/listhen@1.5.6": dependencies: - '@parcel/watcher': 2.4.1 - '@parcel/watcher-wasm': 2.3.0 + "@parcel/watcher": 2.4.1 + "@parcel/watcher-wasm": 2.3.0 citty: 0.1.6 clipboardy: 4.0.0 consola: 3.4.2 @@ -6866,7 +10752,7 @@ snapshots: get-port-please: 3.1.2 h3: 1.15.3 http-shutdown: 1.2.2 - jiti: 1.21.6 + jiti: 1.21.7 mlly: 1.7.2 node-forge: 1.3.1 pathe: 1.1.2 @@ -6875,88 +10761,88 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.0(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))': + "@vinxi/plugin-directives@0.5.1(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))": dependencies: - '@babel/parser': 7.25.8 - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - acorn-loose: 8.4.0 - acorn-typescript: 1.4.13(acorn@8.12.1) + "@babel/parser": 7.29.0 + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + acorn-loose: 8.5.2 + acorn-typescript: 1.4.13(acorn@8.16.0) astring: 1.9.0 magicast: 0.2.11 - recast: 0.23.9 - tslib: 2.8.0 - vinxi: 0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) + recast: 0.23.11 + tslib: 2.8.1 + vinxi: 0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) - '@vinxi/server-components@0.5.0(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0))': + "@vinxi/server-components@0.5.1(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1))": dependencies: - '@vinxi/plugin-directives': 0.5.0(vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) - acorn: 8.12.1 - acorn-loose: 8.4.0 - acorn-typescript: 1.4.13(acorn@8.12.1) + "@vinxi/plugin-directives": 0.5.1(vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) + acorn: 8.16.0 + acorn-loose: 8.5.2 + acorn-typescript: 1.4.13(acorn@8.16.0) astring: 1.9.0 magicast: 0.2.11 - recast: 0.23.9 - vinxi: 0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) + recast: 0.23.11 + vinxi: 0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) - '@vue/compiler-core@3.5.16': + "@vue/compiler-core@3.5.16": dependencies: - '@babel/parser': 7.27.5 - '@vue/shared': 3.5.16 + "@babel/parser": 7.29.0 + "@vue/shared": 3.5.16 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.16': + "@vue/compiler-dom@3.5.16": dependencies: - '@vue/compiler-core': 3.5.16 - '@vue/shared': 3.5.16 + "@vue/compiler-core": 3.5.16 + "@vue/shared": 3.5.16 - '@vue/compiler-sfc@3.5.16': + "@vue/compiler-sfc@3.5.16": dependencies: - '@babel/parser': 7.27.5 - '@vue/compiler-core': 3.5.16 - '@vue/compiler-dom': 3.5.16 - '@vue/compiler-ssr': 3.5.16 - '@vue/shared': 3.5.16 + "@babel/parser": 7.29.0 + "@vue/compiler-core": 3.5.16 + "@vue/compiler-dom": 3.5.16 + "@vue/compiler-ssr": 3.5.16 + "@vue/shared": 3.5.16 estree-walker: 2.0.2 - magic-string: 0.30.17 - postcss: 8.5.5 + magic-string: 0.30.21 + postcss: 8.5.8 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.16': + "@vue/compiler-ssr@3.5.16": dependencies: - '@vue/compiler-dom': 3.5.16 - '@vue/shared': 3.5.16 + "@vue/compiler-dom": 3.5.16 + "@vue/shared": 3.5.16 - '@vue/shared@3.5.16': {} + "@vue/shared@3.5.16": {} - '@whatwg-node/disposablestack@0.0.6': + "@whatwg-node/disposablestack@0.0.6": dependencies: - '@whatwg-node/promise-helpers': 1.3.2 + "@whatwg-node/promise-helpers": 1.3.2 tslib: 2.8.1 - '@whatwg-node/fetch@0.10.8': + "@whatwg-node/fetch@0.10.8": dependencies: - '@whatwg-node/node-fetch': 0.7.21 + "@whatwg-node/node-fetch": 0.7.21 urlpattern-polyfill: 10.1.0 - '@whatwg-node/node-fetch@0.7.21': + "@whatwg-node/node-fetch@0.7.21": dependencies: - '@fastify/busboy': 3.1.1 - '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/promise-helpers': 1.3.2 + "@fastify/busboy": 3.1.1 + "@whatwg-node/disposablestack": 0.0.6 + "@whatwg-node/promise-helpers": 1.3.2 tslib: 2.8.1 - '@whatwg-node/promise-helpers@1.3.2': + "@whatwg-node/promise-helpers@1.3.2": dependencies: tslib: 2.8.1 - '@whatwg-node/server@0.9.71': + "@whatwg-node/server@0.9.71": dependencies: - '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/fetch': 0.10.8 - '@whatwg-node/promise-helpers': 1.3.2 + "@whatwg-node/disposablestack": 0.0.6 + "@whatwg-node/fetch": 0.10.8 + "@whatwg-node/promise-helpers": 1.3.2 tslib: 2.8.1 abbrev@3.0.1: {} @@ -6965,32 +10851,30 @@ snapshots: dependencies: event-target-shim: 5.0.1 - acorn-import-attributes@1.9.5(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-import-attributes@1.9.5(acorn@8.16.0): dependencies: - acorn: 8.12.1 + acorn: 8.16.0 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 - acorn-loose@8.4.0: + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.12.1 + acorn: 8.16.0 - acorn-typescript@1.4.13(acorn@8.12.1): + acorn-loose@8.5.2: dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} + acorn: 8.16.0 - acorn@8.14.0: {} + acorn-typescript@1.4.13(acorn@8.16.0): + dependencies: + acorn: 8.16.0 acorn@8.15.0: {} + acorn@8.16.0: {} + agent-base@7.1.3: {} ajv@6.12.6: @@ -7000,29 +10884,15 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - algoliasearch@5.14.2: - dependencies: - '@algolia/client-abtesting': 5.14.2 - '@algolia/client-analytics': 5.14.2 - '@algolia/client-common': 5.14.2 - '@algolia/client-insights': 5.14.2 - '@algolia/client-personalization': 5.14.2 - '@algolia/client-query-suggestions': 5.14.2 - '@algolia/client-search': 5.14.2 - '@algolia/ingestion': 1.14.2 - '@algolia/monitoring': 1.14.2 - '@algolia/recommend': 5.14.2 - '@algolia/requester-browser-xhr': 5.14.2 - '@algolia/requester-fetch': 5.14.2 - '@algolia/requester-node-http': 5.14.2 - ansi-align@3.0.1: dependencies: string-width: 4.2.3 + ansi-purge@1.1.0: {} + ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@3.2.1: dependencies: @@ -7032,11 +10902,13 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} - ansi-styles@6.2.1: {} + ansi-truncate@1.4.0: + dependencies: + fast-string-truncated-width: 3.0.3 - ansis@4.1.0: {} + ansis@4.2.0: {} any-promise@1.3.0: {} @@ -7047,7 +10919,7 @@ snapshots: archiver-utils@5.0.2: dependencies: - glob: 10.4.5 + glob: 10.5.0 graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 @@ -7077,7 +10949,7 @@ snapshots: ast-types@0.16.1: dependencies: - tslib: 2.8.0 + tslib: 2.8.1 astring@1.9.0: {} @@ -7085,54 +10957,60 @@ snapshots: async@3.2.6: {} - autoprefixer@10.4.21(postcss@8.5.5): + atomically@2.1.0: dependencies: - browserslist: 4.25.0 - caniuse-lite: 1.0.30001722 - fraction.js: 4.3.7 - normalize-range: 0.1.2 + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + + autoprefixer@10.4.27(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001775 + fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.5 + postcss: 8.5.8 postcss-value-parser: 4.2.0 b4a@1.6.7: {} - babel-dead-code-elimination@1.0.10: + babel-dead-code-elimination@1.0.12: dependencies: - '@babel/core': 7.27.4 - '@babel/parser': 7.27.5 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + "@babel/core": 7.29.0 + "@babel/parser": 7.29.0 + "@babel/traverse": 7.29.0 + "@babel/types": 7.29.0 transitivePeerDependencies: - supports-color - babel-plugin-jsx-dom-expressions@0.39.2(@babel/core@7.25.8): + babel-plugin-jsx-dom-expressions@0.40.5(@babel/core@7.29.0): dependencies: - '@babel/core': 7.25.8 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.8) - '@babel/types': 7.25.8 + "@babel/core": 7.29.0 + "@babel/helper-module-imports": 7.18.6 + "@babel/plugin-syntax-jsx": 7.28.6(@babel/core@7.29.0) + "@babel/types": 7.29.0 html-entities: 2.3.3 - jest-diff: 29.7.0 - parse5: 7.2.0 - validate-html-nesting: 1.2.2 + parse5: 7.3.0 - babel-preset-solid@1.9.2(@babel/core@7.25.8): + babel-preset-solid@1.9.10(@babel/core@7.29.0)(solid-js@1.9.12): dependencies: - '@babel/core': 7.25.8 - babel-plugin-jsx-dom-expressions: 0.39.2(@babel/core@7.25.8) + "@babel/core": 7.29.0 + babel-plugin-jsx-dom-expressions: 0.40.5(@babel/core@7.29.0) + optionalDependencies: + solid-js: 1.9.12 bail@2.0.2: {} balanced-match@1.0.2: {} - balanced-match@3.0.1: {} + balanced-match@4.0.4: {} bare-events@2.5.4: optional: true base64-js@1.5.1: {} + baseline-browser-mapping@2.10.0: {} + bcp-47-match@2.0.3: {} binary-extensions@2.3.0: {} @@ -7147,40 +11025,41 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.4.1 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 7.2.0 type-fest: 4.41.0 widest-line: 5.0.0 wrap-ansi: 9.0.0 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.3: dependencies: balanced-match: 1.0.2 - brace-expansion@2.0.2: + brace-expansion@5.0.3: dependencies: - balanced-match: 1.0.2 + balanced-match: 4.0.4 - brace-expansion@4.0.1: + brace-expansion@5.0.5: dependencies: - balanced-match: 3.0.1 + balanced-match: 4.0.4 braces@3.0.3: dependencies: fill-range: 7.1.1 - browserslist@4.25.0: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001722 - electron-to-chromium: 1.5.166 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001775 + electron-to-chromium: 1.5.302 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) buffer-crc32@0.2.13: {} @@ -7200,10 +11079,10 @@ snapshots: chokidar: 4.0.3 confbox: 0.2.2 defu: 6.1.4 - dotenv: 16.5.0 + dotenv: 16.6.1 exsolve: 1.0.5 giget: 2.0.0 - jiti: 2.4.2 + jiti: 2.6.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 @@ -7230,7 +11109,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001722: {} + caniuse-lite@1.0.30001775: {} ccount@2.0.1: {} @@ -7245,7 +11124,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: {} + chalk@5.6.2: {} character-entities-html4@2.1.0: {} @@ -7401,12 +11280,6 @@ snapshots: croner@9.0.0: {} - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -7429,19 +11302,19 @@ snapshots: domutils: 3.1.0 nth-check: 2.1.1 - css-selector-parser@3.0.5: {} + css-selector-parser@3.1.3: {} css-what@6.1.0: {} cssesc@3.0.0: {} - csstype@3.1.3: {} + csstype@3.2.3: {} data-uri-to-buffer@4.0.1: {} dax-sh@0.43.2: dependencies: - '@deno/shim-deno': 0.19.2 + "@deno/shim-deno": 0.19.2 undici-types: 5.28.4 db0@0.3.2: {} @@ -7450,11 +11323,7 @@ snapshots: dependencies: ms: 2.0.0 - debug@4.3.7: - dependencies: - ms: 2.1.3 - - debug@4.4.1: + debug@4.4.3: dependencies: ms: 2.1.3 @@ -7462,7 +11331,7 @@ snapshots: dependencies: callsite: 1.0.0 - decode-named-character-reference@1.0.2: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -7504,11 +11373,11 @@ snapshots: dependencies: node-source-walk: 7.0.1 - detective-postcss@7.0.1(postcss@8.5.5): + detective-postcss@7.0.1(postcss@8.5.8): dependencies: is-url: 1.2.4 - postcss: 8.5.5 - postcss-values-parser: 6.0.2(postcss@8.5.5) + postcss: 8.5.8 + postcss-values-parser: 6.0.2(postcss@8.5.8) detective-sass@6.0.1: dependencies: @@ -7522,38 +11391,40 @@ snapshots: detective-stylus@5.0.1: {} - detective-typescript@14.0.0(typescript@5.8.3): + detective-typescript@14.0.0(typescript@5.9.3): dependencies: - '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) + "@typescript-eslint/typescript-estree": 8.58.0(typescript@5.9.3) ast-module-types: 6.0.1 node-source-walk: 7.0.1 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - detective-vue2@2.2.0(typescript@5.8.3): + detective-vue2@2.2.0(typescript@5.9.3): dependencies: - '@dependents/detective-less': 5.0.1 - '@vue/compiler-sfc': 3.5.16 + "@dependents/detective-less": 5.0.1 + "@vue/compiler-sfc": 3.5.16 detective-es6: 5.0.1 detective-sass: 6.0.1 detective-scss: 5.0.1 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.8.3) - typescript: 5.8.3 + detective-typescript: 14.0.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color + dettle@1.0.5: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 didyoumean@1.2.2: {} - diff-sequences@29.6.3: {} - diff@8.0.2: {} + diff@8.0.3: {} + direction@2.0.1: {} dlv@1.1.3: {} @@ -7580,7 +11451,9 @@ snapshots: dependencies: type-fest: 4.41.0 - dotenv@16.5.0: {} + dotenv@16.6.1: {} + + dotenv@17.3.1: {} dunder-proto@1.0.1: dependencies: @@ -7594,7 +11467,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.166: {} + electron-to-chromium@1.5.302: {} emoji-regex-xs@1.0.0: {} @@ -7616,6 +11489,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + env-paths@3.0.0: {} error-stack-parser-es@1.0.5: {} @@ -7636,45 +11511,45 @@ snapshots: esast-util-from-estree@2.0.0: dependencies: - '@types/estree-jsx': 1.0.5 + "@types/estree-jsx": 1.0.5 devlop: 1.1.0 estree-util-visit: 2.0.0 unist-util-position-from-estree: 2.0.0 esast-util-from-js@2.0.1: dependencies: - '@types/estree-jsx': 1.0.5 + "@types/estree-jsx": 1.0.5 acorn: 8.15.0 esast-util-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 + "@esbuild/aix-ppc64": 0.25.5 + "@esbuild/android-arm": 0.25.5 + "@esbuild/android-arm64": 0.25.5 + "@esbuild/android-x64": 0.25.5 + "@esbuild/darwin-arm64": 0.25.5 + "@esbuild/darwin-x64": 0.25.5 + "@esbuild/freebsd-arm64": 0.25.5 + "@esbuild/freebsd-x64": 0.25.5 + "@esbuild/linux-arm": 0.25.5 + "@esbuild/linux-arm64": 0.25.5 + "@esbuild/linux-ia32": 0.25.5 + "@esbuild/linux-loong64": 0.25.5 + "@esbuild/linux-mips64el": 0.25.5 + "@esbuild/linux-ppc64": 0.25.5 + "@esbuild/linux-riscv64": 0.25.5 + "@esbuild/linux-s390x": 0.25.5 + "@esbuild/linux-x64": 0.25.5 + "@esbuild/netbsd-arm64": 0.25.5 + "@esbuild/netbsd-x64": 0.25.5 + "@esbuild/openbsd-arm64": 0.25.5 + "@esbuild/openbsd-x64": 0.25.5 + "@esbuild/sunos-x64": 0.25.5 + "@esbuild/win32-arm64": 0.25.5 + "@esbuild/win32-ia32": 0.25.5 + "@esbuild/win32-x64": 0.25.5 escalade@3.2.0: {} @@ -7694,16 +11569,16 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-plugin-solid@0.14.5(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-solid@0.14.5(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) + "@typescript-eslint/utils": 8.34.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 known-css-properties: 0.30.0 style-to-object: 1.0.8 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7716,25 +11591,26 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.28.0(jiti@2.4.2): - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 - '@eslint/core': 0.14.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.28.0 - '@eslint/plugin-kit': 0.3.2 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 + eslint-visitor-keys@5.0.1: {} + + eslint@9.39.2(jiti@1.21.7): + dependencies: + "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.2(jiti@1.21.7)) + "@eslint-community/regexpp": 4.12.2 + "@eslint/config-array": 0.21.1 + "@eslint/config-helpers": 0.4.2 + "@eslint/core": 0.17.0 + "@eslint/eslintrc": 3.3.3 + "@eslint/js": 9.39.2 + "@eslint/plugin-kit": 0.4.1 + "@humanfs/node": 0.16.7 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.4.3 + "@types/estree": 1.0.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -7754,7 +11630,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 1.21.7 transitivePeerDependencies: - supports-color @@ -7778,11 +11654,11 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 estree-util-build-jsx@3.0.1: dependencies: - '@types/estree-jsx': 1.0.5 + "@types/estree-jsx": 1.0.5 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 @@ -7791,29 +11667,29 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: dependencies: - '@types/estree-jsx': 1.0.5 + "@types/estree-jsx": 1.0.5 astring: 1.9.0 - source-map: 0.7.4 + source-map: 0.7.6 - estree-util-value-to-estree@3.2.1: + estree-util-value-to-estree@3.5.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 estree-util-visit@2.0.0: dependencies: - '@types/estree-jsx': 1.0.5 - '@types/unist': 3.0.3 + "@types/estree-jsx": 1.0.5 + "@types/unist": 3.0.3 estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + "@types/estree": 1.0.8 esutils@2.0.3: {} @@ -7827,7 +11703,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -7837,27 +11713,36 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - expressive-code-twoslash@0.4.0(@expressive-code/core@0.40.2)(expressive-code@0.40.2)(typescript@5.8.3): + expressive-code-twoslash@0.4.0(@expressive-code/core@0.40.2)(expressive-code@0.41.3)(typescript@5.9.3): dependencies: - '@expressive-code/core': 0.40.2 - expressive-code: 0.40.2 + "@expressive-code/core": 0.40.2 + expressive-code: 0.41.3 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 - twoslash: 0.2.12(typescript@5.8.3) - typescript: 5.8.3 + twoslash: 0.2.12(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color expressive-code@0.40.2: dependencies: - '@expressive-code/core': 0.40.2 - '@expressive-code/plugin-frames': 0.40.2 - '@expressive-code/plugin-shiki': 0.40.2 - '@expressive-code/plugin-text-markers': 0.40.2 + "@expressive-code/core": 0.40.2 + "@expressive-code/plugin-frames": 0.40.2 + "@expressive-code/plugin-shiki": 0.40.2 + "@expressive-code/plugin-text-markers": 0.40.2 + + expressive-code@0.41.3: + dependencies: + "@expressive-code/core": 0.41.3 + "@expressive-code/plugin-frames": 0.41.3 + "@expressive-code/plugin-shiki": 0.41.3 + "@expressive-code/plugin-text-markers": 0.41.3 exsolve@1.0.5: {} + exsolve@1.0.8: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -7866,11 +11751,11 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.3 + "@types/yauzl": 2.10.3 transitivePeerDependencies: - supports-color @@ -7878,29 +11763,32 @@ snapshots: fast-fifo@1.3.2: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.3: + fast-ignore@1.1.3: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + grammex: 3.1.11 + string-escape-regex: 1.0.1 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fastq@1.17.1: + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fastq@1.20.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fault@2.0.1: dependencies: @@ -7910,13 +11798,13 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 - fdir@6.4.6(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 fecha@4.2.3: {} @@ -7937,6 +11825,12 @@ snapshots: filter-obj@6.1.0: {} + find-up-json@2.0.5: + dependencies: + find-up-path: 1.0.1 + + find-up-path@1.0.1: {} + find-up-simple@1.0.1: {} find-up@5.0.0: @@ -7952,18 +11846,18 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.1: {} + flatted@3.3.3: {} fn.name@1.1.0: {} follow-redirects@1.15.9: {} - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 format@0.2.2: {} @@ -7972,7 +11866,7 @@ snapshots: dependencies: fetch-blob: 3.2.0 - fraction.js@4.3.7: {} + fraction.js@5.3.4: {} fresh@0.5.2: {} @@ -7983,6 +11877,8 @@ snapshots: function-bind@1.1.2: {} + function-once@3.0.1: {} + gensync@1.0.0-beta.2: {} get-amd-module-type@6.0.1: @@ -7992,6 +11888,10 @@ snapshots: get-caller-file@2.0.5: {} + get-current-package@1.0.1: + dependencies: + find-up-json: 2.0.5 + get-east-asian-width@1.3.0: {} get-intrinsic@1.3.0: @@ -8009,8 +11909,6 @@ snapshots: get-port-please@3.1.2: {} - get-port@7.1.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -8041,23 +11939,20 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: + glob@10.5.0: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 + minimatch: 9.0.9 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.0.2: + glob@13.0.6: dependencies: - foreground-child: 3.3.0 - jackspeak: 4.1.1 - minimatch: 10.0.2 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 + minimatch: 10.2.2 + minipass: 7.1.3 + path-scurry: 2.0.2 globals@11.12.0: {} @@ -8065,11 +11960,11 @@ snapshots: globals@15.15.0: {} - globals@16.2.0: {} + globals@17.4.0: {} globby@14.1.0: dependencies: - '@sindresorhus/merge-streams': 2.3.0 + "@sindresorhus/merge-streams": 2.3.0 fast-glob: 3.3.3 ignore: 7.0.5 path-type: 6.0.0 @@ -8084,7 +11979,9 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} + grammex@3.1.11: {} + + graphmatch@1.1.0: {} gray-matter@4.0.3: dependencies: @@ -8119,72 +12016,72 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-from-parse5@8.0.1: + hast-util-from-parse5@8.0.3: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.5.0 + hastscript: 9.0.1 + property-information: 7.1.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 hast-util-has-property@3.0.0: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 hast-util-heading-rank@3.0.0: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 hast-util-is-element@3.0.0: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 hast-util-parse-selector@4.0.0: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 - hast-util-raw@9.0.4: + hast-util-raw@9.1.0: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + "@ungap/structured-clone": 1.3.0 + hast-util-from-parse5: 8.0.3 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - parse5: 7.2.0 + parse5: 7.3.0 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-select@6.0.3: + hast-util-select@6.0.4: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 bcp-47-match: 2.0.3 comma-separated-tokens: 2.0.3 - css-selector-parser: 3.0.5 + css-selector-parser: 3.1.3 devlop: 1.1.0 direction: 2.0.1 hast-util-has-property: 3.0.0 hast-util-to-string: 3.0.1 hast-util-whitespace: 3.0.0 nth-check: 2.1.1 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 unist-util-visit: 5.0.0 zwitch: 2.0.4 - hast-util-to-estree@3.1.0: + hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.8 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + "@types/estree": 1.0.8 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-attach-comments: 3.0.0 @@ -8193,9 +12090,9 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 + style-to-js: 1.1.19 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: @@ -8203,23 +12100,23 @@ snapshots: hast-util-to-html@9.0.5: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.2: + hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 + "@types/estree": 1.0.8 + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -8227,17 +12124,17 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 + style-to-js: 1.1.19 unist-util-position: 5.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color hast-util-to-parse5@8.0.0: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 property-information: 6.5.0 @@ -8247,33 +12144,25 @@ snapshots: hast-util-to-string@3.0.1: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 hast-util-to-text@4.0.2: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 - hastscript@8.0.0: + hastscript@9.0.1: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - - hastscript@9.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 hookable@5.5.3: {} @@ -8286,7 +12175,7 @@ snapshots: html-tags@3.3.1: {} - html-to-image@1.11.11: {} + html-to-image@1.11.13: {} html-void-elements@3.0.0: {} @@ -8318,7 +12207,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8332,26 +12221,32 @@ snapshots: ignore@7.0.5: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} index-to-position@1.1.0: {} inherits@2.0.4: {} - inline-style-parser@0.1.1: {} + ini-simple-parser@1.0.1: {} inline-style-parser@0.2.4: {} + inline-style-parser@0.2.6: {} + + ionstore@1.0.1: {} + ioredis@5.6.1: dependencies: - '@ioredis/commands': 1.2.0 + "@ioredis/commands": 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.3 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -8380,10 +12275,6 @@ snapshots: dependencies: builtin-modules: 3.3.0 - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -8426,7 +12317,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 is-stream@2.0.1: {} @@ -8460,26 +12351,13 @@ snapshots: jackspeak@3.4.3: dependencies: - '@isaacs/cliui': 8.0.2 + "@isaacs/cliui": 8.0.2 optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + "@pkgjs/parseargs": 0.11.0 - jest-get-type@29.6.3: {} + jiti@1.21.7: {} - jiti@1.21.6: {} - - jiti@2.4.2: {} + jiti@2.6.1: {} js-tokens@4.0.0: {} @@ -8490,7 +12368,7 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -8502,6 +12380,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-sorted-stringify@1.0.2: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -8510,6 +12390,8 @@ snapshots: jwt-decode@4.0.0: {} + kasi@1.1.1: {} + kebab-case@1.0.2: {} keyv@4.5.4: @@ -8533,7 +12415,7 @@ snapshots: lambda-local@2.2.0: dependencies: commander: 10.0.1 - dotenv: 16.5.0 + dotenv: 16.6.1 winston: 3.17.0 lazystream@1.0.1: @@ -8551,8 +12433,8 @@ snapshots: listhen@1.9.0: dependencies: - '@parcel/watcher': 2.5.1 - '@parcel/watcher-wasm': 2.5.1 + "@parcel/watcher": 2.5.1 + "@parcel/watcher-wasm": 2.5.1 citty: 0.1.6 clipboardy: 4.0.0 consola: 3.4.2 @@ -8561,7 +12443,7 @@ snapshots: get-port-please: 3.1.2 h3: 1.15.3 http-shutdown: 1.2.2 - jiti: 2.4.2 + jiti: 2.6.1 mlly: 1.7.4 node-forge: 1.3.1 pathe: 1.1.2 @@ -8570,11 +12452,11 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - local-pkg@1.1.1: + local-pkg@1.1.2: dependencies: - mlly: 1.7.4 - pkg-types: 2.1.0 - quansync: 0.2.10 + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 locate-path@6.0.0: dependencies: @@ -8586,39 +12468,32 @@ snapshots: lodash-es@4.17.21: {} - lodash.castarray@4.4.0: {} - lodash.debounce@4.0.8: {} lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} - lodash.isplainobject@4.0.6: {} - lodash.merge@4.6.2: {} lodash@4.17.21: {} logform@2.7.0: dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 + "@colors/colors": 1.6.0 + "@types/triple-beam": 1.3.5 fecha: 4.2.3 ms: 2.1.3 safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 - longest-streak@3.1.0: {} + lomemo@1.0.1: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - optional: true + longest-streak@3.1.0: {} lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.6: {} lru-cache@5.1.1: dependencies: @@ -8626,118 +12501,119 @@ snapshots: luxon@3.6.1: {} - magic-string@0.30.17: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + "@jridgewell/sourcemap-codec": 1.5.5 magicast@0.2.11: dependencies: - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 - recast: 0.23.9 + "@babel/parser": 7.29.0 + "@babel/types": 7.29.0 + recast: 0.23.11 magicast@0.3.5: dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + "@babel/parser": 7.29.0 + "@babel/types": 7.29.0 source-map-js: 1.2.1 markdown-extensions@2.0.0: {} - markdown-table@3.0.3: {} + markdown-table@3.0.4: {} math-intrinsics@1.1.0: {} - mdast-util-directive@3.0.0: + mdast-util-directive@3.1.0: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + ccount: 2.0.1 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 transitivePeerDependencies: - supports-color - mdast-util-find-and-replace@3.0.1: + mdast-util-find-and-replace@3.0.2: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 mdast-util-from-markdown@2.0.2: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.0.2 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color mdast-util-frontmatter@2.0.1: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color mdast-util-gfm-autolink-literal@2.0.1: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.0.0: + mdast-util-gfm-footnote@2.1.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color mdast-util-gfm-strikethrough@2.0.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm-table@2.0.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 devlop: 1.1.0 - markdown-table: 3.0.3 + markdown-table: 3.0.4 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm-task-list-item@2.0.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -8745,39 +12621,39 @@ snapshots: dependencies: mdast-util-from-markdown: 2.0.2 mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 mdast-util-gfm-table: 2.0.0 mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-mdx-expression@2.0.1: dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-mdx-jsx@3.2.0: dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 ccount: 2.0.1 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color @@ -8787,61 +12663,74 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-mdxjs-esm@2.0.1: dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-phrasing@4.1.0: dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 + "@types/mdast": 4.0.4 + unist-util-is: 6.0.1 mdast-util-to-hast@13.2.0: dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + "@ungap/structured-clone": 1.3.0 devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 + micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 - mdast-util-to-markdown@2.1.0: + mdast-util-to-hast@13.2.1: + dependencies: + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + "@ungap/structured-clone": 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 unist-util-visit: 5.0.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 mdast-util-toc@7.1.0: dependencies: - '@types/mdast': 4.0.4 - '@types/ungap__structured-clone': 1.2.0 - '@ungap/structured-clone': 1.2.0 + "@types/mdast": 4.0.4 + "@types/ungap__structured-clone": 1.2.0 + "@ungap/structured-clone": 1.3.0 github-slugger: 2.0.0 mdast-util-to-string: 4.0.0 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 unist-util-visit: 5.0.0 merge-anything@5.1.7: @@ -8858,286 +12747,284 @@ snapshots: micro-api-client@3.3.0: {} - micromark-core-commonmark@2.0.1: + micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-directive@3.0.2: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - parse-entities: 4.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 micromark-extension-frontmatter@2.0.0: dependencies: fault: 2.0.1 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-autolink-literal@2.1.0: dependencies: - micromark-util-character: 2.1.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-footnote@2.1.0: dependencies: devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-strikethrough@2.1.0: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-table@2.1.0: + micromark-extension-gfm-table@2.1.1: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm-tagfilter@2.0.0: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 micromark-extension-gfm-task-list-item@2.1.0: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-gfm@3.0.0: dependencies: micromark-extension-gfm-autolink-literal: 2.1.0 micromark-extension-gfm-footnote: 2.1.0 micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-table: 2.1.1 micromark-extension-gfm-tagfilter: 2.0.0 micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-mdx-expression@3.0.0: + micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.2 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-mdx-jsx@3.0.1: + micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.2 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 micromark-extension-mdx-md@2.0.0: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.1 + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-destination@2.0.0: + micromark-factory-destination@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-label@2.0.0: + micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-mdx-expression@2.0.2: + micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 - micromark-factory-space@2.0.0: + micromark-factory-space@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - micromark-factory-title@2.0.0: + micromark-factory-title@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-whitespace@2.0.0: + micromark-factory-whitespace@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-character@2.1.0: + micromark-util-character@2.1.1: dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-chunked@2.0.0: + micromark-util-chunked@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-classify-character@2.0.0: + micromark-util-classify-character@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-combine-extensions@2.0.0: + micromark-util-combine-extensions@2.0.1: dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-decode-numeric-character-reference@2.0.1: + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-decode-string@2.0.0: + micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - micromark-util-encode@2.0.0: {} + micromark-util-encode@2.0.1: {} - micromark-util-events-to-acorn@2.0.2: + micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.8 - '@types/unist': 3.0.3 + "@types/estree": 1.0.8 + "@types/unist": 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 - micromark-util-html-tag-name@2.0.0: {} + micromark-util-html-tag-name@2.0.1: {} - micromark-util-normalize-identifier@2.0.0: + micromark-util-normalize-identifier@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-resolve-all@2.0.0: + micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 - micromark-util-sanitize-uri@2.0.0: + micromark-util-sanitize-uri@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.1: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-symbol@2.0.0: {} + micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.0: {} + micromark-util-types@2.0.2: {} - micromark@4.0.0: + micromark@4.0.2: dependencies: - '@types/debug': 4.1.12 - debug: 4.4.1 - decode-named-character-reference: 1.0.2 + "@types/debug": 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -9160,46 +13047,57 @@ snapshots: mimic-fn@4.0.0: {} - minimatch@10.0.2: + minimatch@10.2.2: + dependencies: + brace-expansion: 5.0.3 + + minimatch@10.2.5: dependencies: - brace-expansion: 4.0.1 + brace-expansion: 5.0.5 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 - minimatch@5.1.6: + minimatch@5.1.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 - minimatch@9.0.5: + minimatch@9.0.9: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.3 minimist@1.2.8: {} - minipass@7.1.2: {} + minipass@7.1.3: {} minizlib@3.0.2: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 mkdirp@3.0.1: {} mlly@1.7.2: dependencies: - acorn: 8.14.0 + acorn: 8.16.0 pathe: 1.1.2 pkg-types: 1.2.1 ufo: 1.6.1 mlly@1.7.4: dependencies: - acorn: 8.14.0 + acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.5.4 + mlly@1.8.0: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + module-definition@6.0.1: dependencies: ast-module-types: 6.0.1 @@ -9221,7 +13119,7 @@ snapshots: netlify@13.3.5: dependencies: - '@netlify/open-api': 2.37.0 + "@netlify/open-api": 2.37.0 lodash-es: 4.17.21 micro-api-client: 3.3.0 node-fetch: 3.3.2 @@ -9230,16 +13128,16 @@ snapshots: nitropack@2.11.12: dependencies: - '@cloudflare/kv-asset-handler': 0.4.0 - '@netlify/functions': 3.1.10(rollup@4.43.0) - '@rollup/plugin-alias': 5.1.1(rollup@4.43.0) - '@rollup/plugin-commonjs': 28.0.3(rollup@4.43.0) - '@rollup/plugin-inject': 5.0.5(rollup@4.43.0) - '@rollup/plugin-json': 6.1.0(rollup@4.43.0) - '@rollup/plugin-node-resolve': 16.0.1(rollup@4.43.0) - '@rollup/plugin-replace': 6.0.2(rollup@4.43.0) - '@rollup/plugin-terser': 0.4.4(rollup@4.43.0) - '@vercel/nft': 0.29.4(rollup@4.43.0) + "@cloudflare/kv-asset-handler": 0.4.0 + "@netlify/functions": 3.1.10(rollup@4.43.0) + "@rollup/plugin-alias": 5.1.1(rollup@4.43.0) + "@rollup/plugin-commonjs": 28.0.3(rollup@4.43.0) + "@rollup/plugin-inject": 5.0.5(rollup@4.43.0) + "@rollup/plugin-json": 6.1.0(rollup@4.43.0) + "@rollup/plugin-node-resolve": 16.0.1(rollup@4.43.0) + "@rollup/plugin-replace": 6.0.2(rollup@4.43.0) + "@rollup/plugin-terser": 0.4.4(rollup@4.43.0) + "@vercel/nft": 0.29.4(rollup@4.43.0) archiver: 7.0.1 c12: 3.0.4(magicast@0.3.5) chokidar: 4.0.3 @@ -9264,11 +13162,11 @@ snapshots: hookable: 5.5.3 httpxy: 0.1.7 ioredis: 5.6.1 - jiti: 2.4.2 + jiti: 2.6.1 klona: 2.0.6 knitwork: 1.2.0 listhen: 1.9.0 - magic-string: 0.30.17 + magic-string: 0.30.21 magicast: 0.3.5 mime: 4.0.7 mlly: 1.7.4 @@ -9287,7 +13185,7 @@ snapshots: semver: 7.7.2 serve-placeholder: 2.0.2 serve-static: 2.2.0 - source-map: 0.7.4 + source-map: 0.7.6 std-env: 3.9.0 ufo: 1.6.1 ultrahtml: 1.6.0 @@ -9302,21 +13200,21 @@ snapshots: youch: 4.1.0-beta.8 youch-core: 0.3.2 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' + - "@azure/app-configuration" + - "@azure/cosmos" + - "@azure/data-tables" + - "@azure/identity" + - "@azure/keyvault-secrets" + - "@azure/storage-blob" + - "@capacitor/preferences" + - "@deno/kv" + - "@electric-sql/pglite" + - "@libsql/client" + - "@netlify/blobs" + - "@planetscale/database" + - "@upstash/redis" + - "@vercel/blob" + - "@vercel/kv" - aws4fetch - better-sqlite3 - drizzle-orm @@ -9350,11 +13248,11 @@ snapshots: node-mock-http@1.0.0: {} - node-releases@2.0.19: {} + node-releases@2.0.27: {} node-source-walk@7.0.1: dependencies: - '@babel/parser': 7.27.5 + "@babel/parser": 7.29.0 nopt@8.1.0: dependencies: @@ -9363,7 +13261,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.2 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -9372,8 +13270,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-range@0.1.2: {} - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -9387,7 +13283,7 @@ snapshots: citty: 0.1.6 consola: 3.4.2 pathe: 2.0.3 - pkg-types: 2.1.0 + pkg-types: 2.3.0 tinyexec: 0.3.2 object-assign@4.1.1: {} @@ -9428,10 +13324,10 @@ snapshots: regex: 5.1.1 regex-recursion: 5.1.1 - oniguruma-to-es@4.3.3: + oniguruma-to-es@4.3.4: dependencies: oniguruma-parser: 0.12.1 - regex: 6.0.1 + regex: 6.1.0 regex-recursion: 6.0.2 open@8.4.2: @@ -9459,7 +13355,7 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.2.1 + yocto-queue: 1.2.2 p-locate@5.0.0: dependencies: @@ -9479,21 +13375,18 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.10: - dependencies: - quansync: 0.2.10 + package-manager-detector@1.5.0: {} parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-entities@4.0.1: + parse-entities@4.0.2: dependencies: - '@types/unist': 2.0.11 - character-entities: 2.0.2 + "@types/unist": 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 @@ -9502,10 +13395,12 @@ snapshots: parse-json@8.3.0: dependencies: - '@babel/code-frame': 7.27.1 + "@babel/code-frame": 7.29.0 index-to-position: 1.1.0 type-fest: 4.41.0 + parse-numeric-range@1.3.0: {} + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 @@ -9515,6 +13410,10 @@ snapshots: dependencies: entities: 4.5.0 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -9530,12 +13429,12 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 7.1.3 - path-scurry@2.0.0: + path-scurry@2.0.2: dependencies: - lru-cache: 11.1.0 - minipass: 7.1.2 + lru-cache: 11.2.6 + minipass: 7.1.3 path-to-regexp@6.3.0: {} @@ -9555,20 +13454,27 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pify@2.3.0: {} - pirates@4.0.6: {} + pioppo@1.2.1: + dependencies: + dettle: 1.0.5 + when-exit: 2.1.5 + + pirates@4.0.7: {} pkg-types@1.2.1: dependencies: confbox: 0.1.8 - mlly: 1.7.2 + mlly: 1.8.0 pathe: 1.1.2 pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 pkg-types@2.1.0: @@ -9577,28 +13483,35 @@ snapshots: exsolve: 1.0.5 pathe: 2.0.3 - postcss-import@15.1.0(postcss@8.5.5): + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + + postcss-import@15.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.5 + postcss: 8.5.8 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.11 - postcss-js@4.0.1(postcss@8.5.5): + postcss-js@4.1.0(postcss@8.5.8): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.5 + postcss: 8.5.8 - postcss-load-config@4.0.2(postcss@8.5.5): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 - yaml: 2.6.0 optionalDependencies: - postcss: 8.5.5 + jiti: 1.21.7 + postcss: 8.5.8 + yaml: 2.8.1 - postcss-nested@6.2.0(postcss@8.5.5): + postcss-nested@6.2.0(postcss@8.5.8): dependencies: - postcss: 8.5.5 + postcss: 8.5.8 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -9613,64 +13526,70 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss-values-parser@6.0.2(postcss@8.5.5): + postcss-values-parser@6.0.2(postcss@8.5.8): dependencies: color-name: 1.1.4 is-url-superb: 4.0.0 - postcss: 8.5.5 + postcss: 8.5.8 quote-unquote: 1.0.0 - postcss@8.5.5: + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.24.3: {} - precinct@12.2.0: dependencies: - '@dependents/detective-less': 5.0.1 + "@dependents/detective-less": 5.0.1 commander: 12.1.0 detective-amd: 6.0.1 detective-cjs: 6.0.1 detective-es6: 5.0.1 - detective-postcss: 7.0.1(postcss@8.5.5) + detective-postcss: 7.0.1(postcss@8.5.8) detective-sass: 6.0.1 detective-scss: 5.0.1 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.8.3) - detective-vue2: 2.2.0(typescript@5.8.3) + detective-typescript: 14.0.0(typescript@5.9.3) + detective-vue2: 2.2.0(typescript@5.9.3) module-definition: 6.0.1 node-source-walk: 7.0.1 - postcss: 8.5.5 - typescript: 5.8.3 + postcss: 8.5.8 + typescript: 5.9.3 transitivePeerDependencies: - supports-color prelude-ls@1.2.1: {} - prettier-plugin-tailwindcss@0.6.13(prettier@3.5.3): + prettier-plugin-tailwindcss@0.7.2(prettier@3.8.1): dependencies: - prettier: 3.5.3 + prettier: 3.8.1 - prettier@3.5.3: {} + prettier@3.8.1: {} - pretty-bytes@6.1.1: {} - - pretty-format@29.7.0: + prettier@4.0.0-alpha.10: dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 + "@prettier/cli": 0.6.0(prettier@4.0.0-alpha.10) + + pretty-bytes@6.1.1: {} process-nextick-args@2.0.1: {} process@0.11.10: {} + promise-make-counter@1.0.2: + dependencies: + promise-make-naked: 3.0.2 + + promise-make-naked@2.1.2: {} + + promise-make-naked@3.0.2: {} + + promise-resolve-timeout@2.0.1: {} + property-information@6.5.0: {} - property-information@7.0.0: {} + property-information@7.1.0: {} pump@3.0.2: dependencies: @@ -9683,7 +13602,7 @@ snapshots: dependencies: side-channel: 1.1.0 - quansync@0.2.10: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} @@ -9702,13 +13621,6 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - react-is@18.3.1: {} - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - optional: true - read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -9721,7 +13633,7 @@ snapshots: read-pkg@9.0.1: dependencies: - '@types/normalize-package-data': 2.4.4 + "@types/normalize-package-data": 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.3.0 type-fest: 4.41.0 @@ -9753,7 +13665,7 @@ snapshots: readdir-glob@1.1.3: dependencies: - minimatch: 5.1.6 + minimatch: 5.1.9 readdirp@3.6.0: dependencies: @@ -9761,40 +13673,39 @@ snapshots: readdirp@4.1.2: {} - recast@0.23.9: + recast@0.23.11: dependencies: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.8.0 + tslib: 2.8.1 recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.15.0): + recma-jsx@1.0.1(acorn@8.15.0): dependencies: + acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 unified: 11.0.5 - transitivePeerDependencies: - - acorn recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -9820,14 +13731,14 @@ snapshots: dependencies: regex-utilities: 2.3.0 - regex@6.0.1: + regex@6.1.0: dependencies: regex-utilities: 2.3.0 rehype-autolink-headings@7.1.0: dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.2.0 + "@types/hast": 3.0.4 + "@ungap/structured-clone": 1.3.0 hast-util-heading-rank: 3.0.0 hast-util-is-element: 3.0.0 unified: 11.0.5 @@ -9839,30 +13750,30 @@ snapshots: rehype-raw@7.0.0: dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.0.4 + "@types/hast": 3.0.4 + hast-util-raw: 9.1.0 vfile: 6.0.3 rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - hast-util-to-estree: 3.1.0 + "@types/estree": 1.0.8 + "@types/hast": 3.0.4 + hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color rehype-slug@6.0.0: dependencies: - '@types/hast': 3.0.4 + "@types/hast": 3.0.4 github-slugger: 2.0.0 hast-util-heading-rank: 3.0.0 hast-util-to-string: 3.0.1 unist-util-visit: 5.0.0 - remark-directive@3.0.0: + remark-directive@3.0.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-directive: 3.0.0 + "@types/mdast": 4.0.4 + mdast-util-directive: 3.1.0 micromark-extension-directive: 3.0.2 unified: 11.0.5 transitivePeerDependencies: @@ -9870,16 +13781,16 @@ snapshots: remark-frontmatter@5.0.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 mdast-util-frontmatter: 2.0.1 micromark-extension-frontmatter: 2.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-gfm@4.0.0: + remark-gfm@4.0.1: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 mdast-util-gfm: 3.1.0 micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 @@ -9888,7 +13799,7 @@ snapshots: transitivePeerDependencies: - supports-color - remark-mdx@3.1.0: + remark-mdx@3.1.1: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -9897,25 +13808,25 @@ snapshots: remark-parse@11.0.0: dependencies: - '@types/mdast': 4.0.4 + "@types/mdast": 4.0.4 mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-rehype@11.1.1: + remark-rehype@11.1.2: dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 mdast-util-to-hast: 13.2.0 unified: 11.0.5 vfile: 6.0.3 remark-stringify@11.0.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.0 + "@types/mdast": 4.0.4 + mdast-util-to-markdown: 2.1.2 unified: 11.0.5 remove-trailing-separator@1.1.0: {} @@ -9936,9 +13847,9 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.8: + resolve@1.22.11: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -9948,41 +13859,41 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} rollup-plugin-visualizer@5.14.0(rollup@4.43.0): dependencies: open: 8.4.2 - picomatch: 4.0.2 - source-map: 0.7.4 + picomatch: 4.0.3 + source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: rollup: 4.43.0 rollup@4.43.0: dependencies: - '@types/estree': 1.0.7 + "@types/estree": 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.43.0 - '@rollup/rollup-android-arm64': 4.43.0 - '@rollup/rollup-darwin-arm64': 4.43.0 - '@rollup/rollup-darwin-x64': 4.43.0 - '@rollup/rollup-freebsd-arm64': 4.43.0 - '@rollup/rollup-freebsd-x64': 4.43.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.43.0 - '@rollup/rollup-linux-arm-musleabihf': 4.43.0 - '@rollup/rollup-linux-arm64-gnu': 4.43.0 - '@rollup/rollup-linux-arm64-musl': 4.43.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.43.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.43.0 - '@rollup/rollup-linux-riscv64-gnu': 4.43.0 - '@rollup/rollup-linux-riscv64-musl': 4.43.0 - '@rollup/rollup-linux-s390x-gnu': 4.43.0 - '@rollup/rollup-linux-x64-gnu': 4.43.0 - '@rollup/rollup-linux-x64-musl': 4.43.0 - '@rollup/rollup-win32-arm64-msvc': 4.43.0 - '@rollup/rollup-win32-ia32-msvc': 4.43.0 - '@rollup/rollup-win32-x64-msvc': 4.43.0 + "@rollup/rollup-android-arm-eabi": 4.43.0 + "@rollup/rollup-android-arm64": 4.43.0 + "@rollup/rollup-darwin-arm64": 4.43.0 + "@rollup/rollup-darwin-x64": 4.43.0 + "@rollup/rollup-freebsd-arm64": 4.43.0 + "@rollup/rollup-freebsd-x64": 4.43.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.43.0 + "@rollup/rollup-linux-arm-musleabihf": 4.43.0 + "@rollup/rollup-linux-arm64-gnu": 4.43.0 + "@rollup/rollup-linux-arm64-musl": 4.43.0 + "@rollup/rollup-linux-loongarch64-gnu": 4.43.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.43.0 + "@rollup/rollup-linux-riscv64-gnu": 4.43.0 + "@rollup/rollup-linux-riscv64-musl": 4.43.0 + "@rollup/rollup-linux-s390x-gnu": 4.43.0 + "@rollup/rollup-linux-x64-gnu": 4.43.0 + "@rollup/rollup-linux-x64-musl": 4.43.0 + "@rollup/rollup-win32-arm64-msvc": 4.43.0 + "@rollup/rollup-win32-ia32-msvc": 4.43.0 + "@rollup/rollup-win32-x64-msvc": 4.43.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -9995,12 +13906,10 @@ snapshots: safe-stable-stringify@2.5.0: {} - sax@1.4.1: {} + sax@1.5.0: {} scule@1.3.0: {} - search-insights@2.17.3: {} - section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 @@ -10010,6 +13919,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.4: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -10030,7 +13941,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -10048,17 +13959,17 @@ snapshots: dependencies: randombytes: 2.1.0 - seroval-plugins@1.1.1(seroval@1.1.1): + seroval-plugins@1.5.0(seroval@1.5.0): dependencies: - seroval: 1.1.1 + seroval: 1.5.0 - seroval-plugins@1.3.2(seroval@1.3.2): + seroval-plugins@1.5.1(seroval@1.5.1): dependencies: - seroval: 1.3.2 + seroval: 1.5.1 - seroval@1.1.1: {} + seroval@1.5.0: {} - seroval@1.3.2: {} + seroval@1.5.1: {} serve-placeholder@2.0.2: dependencies: @@ -10092,25 +14003,36 @@ snapshots: shiki@1.29.2: dependencies: - '@shikijs/core': 1.29.2 - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/langs': 1.29.2 - '@shikijs/themes': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - shiki@3.6.0: - dependencies: - '@shikijs/core': 3.6.0 - '@shikijs/engine-javascript': 3.6.0 - '@shikijs/engine-oniguruma': 3.6.0 - '@shikijs/langs': 3.6.0 - '@shikijs/themes': 3.6.0 - '@shikijs/types': 3.6.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + "@shikijs/core": 1.29.2 + "@shikijs/engine-javascript": 1.29.2 + "@shikijs/engine-oniguruma": 1.29.2 + "@shikijs/langs": 1.29.2 + "@shikijs/themes": 1.29.2 + "@shikijs/types": 1.29.2 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 + + shiki@3.23.0: + dependencies: + "@shikijs/core": 3.23.0 + "@shikijs/engine-javascript": 3.23.0 + "@shikijs/engine-oniguruma": 3.23.0 + "@shikijs/langs": 3.23.0 + "@shikijs/themes": 3.23.0 + "@shikijs/types": 3.23.0 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 + + shiki@4.0.2: + dependencies: + "@shikijs/core": 4.0.2 + "@shikijs/engine-javascript": 4.0.2 + "@shikijs/engine-oniguruma": 4.0.2 + "@shikijs/langs": 4.0.2 + "@shikijs/themes": 4.0.2 + "@shikijs/types": 4.0.2 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 side-channel-list@1.0.0: dependencies: @@ -10142,26 +14064,16 @@ snapshots: signal-exit@4.1.0: {} - simple-git@3.27.0: - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - sisteransi@1.0.5: {} - - sitemap@8.0.0: + sitemap@9.0.1: dependencies: - '@types/node': 17.0.45 - '@types/sax': 1.2.7 + "@types/node": 24.12.0 + "@types/sax": 1.2.7 arg: 5.0.2 - sax: 1.4.1 + sax: 1.5.0 slash@5.1.0: {} @@ -10169,48 +14081,48 @@ snapshots: smob@1.5.0: {} - solid-heroicons@3.2.4(solid-js@1.9.7): + solid-heroicons@3.2.4(solid-js@1.9.12): dependencies: - solid-js: 1.9.7 + solid-js: 1.9.12 - solid-js@1.9.7: + solid-js@1.9.12: dependencies: - csstype: 3.1.3 - seroval: 1.3.2 - seroval-plugins: 1.3.2(seroval@1.3.2) + csstype: 3.2.3 + seroval: 1.5.1 + seroval-plugins: 1.5.1(seroval@1.5.1) - solid-list@0.3.0(solid-js@1.9.7): + solid-list@0.3.0(solid-js@1.9.12): dependencies: - '@corvu/utils': 0.4.2(solid-js@1.9.7) - solid-js: 1.9.7 + "@corvu/utils": 0.4.2(solid-js@1.9.12) + solid-js: 1.9.12 - solid-mdx@0.0.7(solid-js@1.9.7)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)): + solid-mdx@0.0.7(solid-js@1.9.12)(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)): dependencies: - solid-js: 1.9.7 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) + solid-js: 1.9.12 + vite: 6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) - solid-presence@0.1.8(solid-js@1.9.7): + solid-presence@0.1.8(solid-js@1.9.12): dependencies: - '@corvu/utils': 0.4.2(solid-js@1.9.7) - solid-js: 1.9.7 + "@corvu/utils": 0.4.2(solid-js@1.9.12) + solid-js: 1.9.12 - solid-prevent-scroll@0.1.10(solid-js@1.9.7): + solid-prevent-scroll@0.1.10(solid-js@1.9.12): dependencies: - '@corvu/utils': 0.4.2(solid-js@1.9.7) - solid-js: 1.9.7 + "@corvu/utils": 0.4.2(solid-js@1.9.12) + solid-js: 1.9.12 - solid-refresh@0.6.3(solid-js@1.9.7): + solid-refresh@0.6.3(solid-js@1.9.12): dependencies: - '@babel/generator': 7.25.7 - '@babel/helper-module-imports': 7.25.7 - '@babel/types': 7.25.8 - solid-js: 1.9.7 + "@babel/generator": 7.29.1 + "@babel/helper-module-imports": 7.28.6 + "@babel/types": 7.29.0 + solid-js: 1.9.12 transitivePeerDependencies: - supports-color - solid-use@0.9.0(solid-js@1.9.7): + solid-use@0.9.1(solid-js@1.9.12): dependencies: - solid-js: 1.9.7 + solid-js: 1.9.12 source-map-js@1.2.1: {} @@ -10221,7 +14133,7 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} + source-map@0.7.6: {} space-separated-tokens@2.0.2: {} @@ -10239,6 +14151,13 @@ snapshots: spdx-license-ids@3.0.21: {} + specialist@1.4.5: + dependencies: + tiny-bin: 1.11.3 + tiny-colors: 2.2.2 + tiny-parse-argv: 2.8.2 + tiny-updater: 3.5.3 + sprintf-js@1.0.3: {} stack-trace@0.0.10: {} @@ -10255,6 +14174,8 @@ snapshots: std-env@3.9.0: {} + stdin-blocker@2.0.1: {} + streamx@2.22.1: dependencies: fast-fifo: 1.3.2 @@ -10262,6 +14183,8 @@ snapshots: optionalDependencies: bare-events: 2.5.4 + string-escape-regex@1.0.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -10272,13 +14195,13 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: emoji-regex: 10.4.0 get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string_decoder@1.1.1: dependencies: @@ -10297,9 +14220,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom-string@1.0.0: {} @@ -10311,25 +14234,39 @@ snapshots: dependencies: js-tokens: 9.0.1 - style-to-object@0.4.4: + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + stubborn-fs@2.0.0: dependencies: - inline-style-parser: 0.1.1 + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + + style-to-js@1.1.19: + dependencies: + style-to-object: 1.0.12 + + style-to-object@1.0.12: + dependencies: + inline-style-parser: 0.2.6 style-to-object@1.0.8: dependencies: inline-style-parser: 0.2.4 - sucrase@3.35.0: + sucrase@3.35.1: dependencies: - '@jridgewell/gen-mapping': 0.3.5 + "@jridgewell/gen-mapping": 0.3.13 commander: 4.1.1 - glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.6 + pirates: 4.0.7 + tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 - supports-color@10.0.0: {} + supports-color@10.2.2: {} supports-color@5.5.0: dependencies: @@ -10343,32 +14280,33 @@ snapshots: system-architecture@0.1.0: {} - tailwindcss@3.4.17: + tailwindcss@3.4.19(yaml@2.8.1): dependencies: - '@alloc/quick-lru': 5.2.0 + "@alloc/quick-lru": 5.2.0 arg: 5.0.2 chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.2 + fast-glob: 3.3.3 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.6 + jiti: 1.21.7 lilconfig: 3.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.5 - postcss-import: 15.1.0(postcss@8.5.5) - postcss-js: 4.0.1(postcss@8.5.5) - postcss-load-config: 4.0.2(postcss@8.5.5) - postcss-nested: 6.2.0(postcss@8.5.5) + postcss: 8.5.8 + postcss-import: 15.1.0(postcss@8.5.8) + postcss-js: 4.1.0(postcss@8.5.8) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.8.1) + postcss-nested: 6.2.0(postcss@8.5.8) postcss-selector-parser: 6.1.2 - resolve: 1.22.8 - sucrase: 3.35.0 + resolve: 1.22.11 + sucrase: 3.35.1 transitivePeerDependencies: - - ts-node + - tsx + - yaml tar-stream@3.1.7: dependencies: @@ -10378,22 +14316,22 @@ snapshots: tar@7.4.3: dependencies: - '@isaacs/fs-minipass': 4.0.1 + "@isaacs/fs-minipass": 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 + minipass: 7.1.3 minizlib: 3.0.2 mkdirp: 3.0.1 yallist: 5.0.0 - terracotta@1.0.6(solid-js@1.9.7): + terracotta@1.1.0(solid-js@1.9.12): dependencies: - solid-js: 1.9.7 - solid-use: 0.9.0(solid-js@1.9.7) + solid-js: 1.9.12 + solid-use: 0.9.1(solid-js@1.9.12) terser@5.42.0: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.15.0 + "@jridgewell/source-map": 0.3.6 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -10411,20 +14349,78 @@ snapshots: dependencies: any-promise: 1.3.0 + tiny-bin@1.11.3: + dependencies: + ansi-purge: 1.1.0 + fast-string-width: 3.0.2 + get-current-package: 1.0.1 + tiny-colors: 2.2.2 + tiny-levenshtein: 1.1.0 + tiny-parse-argv: 2.8.2 + tiny-updater: 3.5.3 + + tiny-colors@2.2.2: {} + + tiny-cursor@2.0.1: + dependencies: + when-exit: 2.1.5 + + tiny-editorconfig@1.0.1: + dependencies: + ini-simple-parser: 1.0.1 + zeptomatch: 2.1.0 + tiny-invariant@1.3.3: {} - tinyexec@0.3.2: {} + tiny-jsonc@1.0.2: {} + + tiny-levenshtein@1.1.0: {} - tinyglobby@0.2.12: + tiny-parse-argv@2.8.2: {} + + tiny-readdir-glob@1.23.2: dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 + tiny-readdir: 2.7.4 + zeptomatch: 2.1.0 + zeptomatch-explode: 1.0.1 + zeptomatch-is-static: 1.0.1 + zeptomatch-unescape: 1.0.1 + + tiny-readdir@2.7.4: + dependencies: + promise-make-counter: 1.0.2 + + tiny-spinner@2.0.5: + dependencies: + stdin-blocker: 2.0.1 + tiny-colors: 2.2.2 + tiny-cursor: 2.0.1 + tiny-truncate: 1.0.5 + + tiny-truncate@1.0.5: + dependencies: + ansi-truncate: 1.4.0 + + tiny-updater@3.5.3: + dependencies: + ionstore: 1.0.1 + tiny-colors: 2.2.2 + when-exit: 2.1.5 + + tinyexec@0.3.2: {} + + tinyexec@1.0.2: {} tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tmp-promise@3.0.3: dependencies: tmp: 0.2.3 @@ -10449,23 +14445,25 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.4.0(typescript@5.9.3): dependencies: - typescript: 5.8.3 + typescript: 5.9.3 - ts-interface-checker@0.1.13: {} + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 - tslib@2.8.0: {} + ts-interface-checker@0.1.13: {} tslib@2.8.1: {} twoslash-protocol@0.2.12: {} - twoslash@0.2.12(typescript@5.8.3): + twoslash@0.2.12(typescript@5.9.3): dependencies: - '@typescript/vfs': 1.6.1(typescript@5.8.3) + "@typescript/vfs": 1.6.2(typescript@5.9.3) twoslash-protocol: 0.2.12 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -10475,17 +14473,18 @@ snapshots: type-fest@4.41.0: {} - typescript-eslint@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.3 + "@typescript-eslint/eslint-plugin": 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/parser": 8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/typescript-estree": 8.58.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.58.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript@5.8.3: {} + typescript@5.9.3: {} ufo@1.5.4: {} @@ -10493,20 +14492,20 @@ snapshots: ultrahtml@1.6.0: {} - ultramatter@0.0.4: {} - uncrypto@0.1.3: {} unctx@2.4.1: dependencies: acorn: 8.15.0 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 unplugin: 2.3.5 undici-types@5.28.4: {} - undici-types@7.8.0: {} + undici-types@7.16.0: {} + + undici-types@7.18.2: {} unenv@1.10.0: dependencies: @@ -10530,7 +14529,7 @@ snapshots: unified@11.0.5: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 @@ -10538,58 +14537,58 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unimport@4.1.2: + unimport@4.2.0: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 - local-pkg: 1.1.1 - magic-string: 0.30.17 - mlly: 1.7.4 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.0 pathe: 2.0.3 - picomatch: 4.0.2 - pkg-types: 1.3.1 + picomatch: 4.0.3 + pkg-types: 2.3.0 scule: 1.3.0 - strip-literal: 3.0.0 - tinyglobby: 0.2.14 - unplugin: 2.3.5 - unplugin-utils: 0.2.4 + strip-literal: 3.1.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 unimport@5.0.1: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 - local-pkg: 1.1.1 - magic-string: 0.30.17 + local-pkg: 1.1.2 + magic-string: 0.30.21 mlly: 1.7.4 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 pkg-types: 2.1.0 scule: 1.3.0 strip-literal: 3.0.0 - tinyglobby: 0.2.14 - unplugin: 2.3.5 - unplugin-utils: 0.2.4 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 unist-builder@4.0.0: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-find-after@5.0.0: dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + "@types/unist": 3.0.3 + unist-util-is: 6.0.1 - unist-util-is@6.0.0: + unist-util-is@6.0.1: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-mdx-define@1.1.2: dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 + "@types/estree": 1.0.8 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 estree-util-is-identifier-name: 3.0.0 estree-util-scope: 1.0.0 estree-walker: 3.0.3 @@ -10597,26 +14596,32 @@ snapshots: unist-util-position-from-estree@2.0.0: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 - unist-util-visit-parents@6.0.1: + unist-util-visit-parents@6.0.2: dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + "@types/unist": 3.0.3 + unist-util-is: 6.0.1 unist-util-visit@5.0.0: dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + "@types/unist": 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unist-util-visit@5.1.0: + dependencies: + "@types/unist": 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 unist@0.0.1: {} @@ -10624,41 +14629,53 @@ snapshots: dependencies: normalize-path: 2.1.1 - unplugin-auto-import@19.1.1: + unplugin-auto-import@19.3.0: dependencies: - local-pkg: 1.1.1 - magic-string: 0.30.17 - picomatch: 4.0.2 - unimport: 4.1.2 - unplugin: 2.3.5 - unplugin-utils: 0.2.4 + local-pkg: 1.1.2 + magic-string: 0.30.21 + picomatch: 4.0.3 + unimport: 4.2.0 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 - unplugin-icons@22.1.0(@vue/compiler-sfc@3.5.16): + unplugin-icons@22.5.0(@vue/compiler-sfc@3.5.16): dependencies: - '@antfu/install-pkg': 1.0.0 - '@iconify/utils': 2.3.0 - debug: 4.4.1 - local-pkg: 1.1.1 - unplugin: 2.3.5 + "@antfu/install-pkg": 1.1.0 + "@iconify/utils": 3.0.2 + debug: 4.4.3 + local-pkg: 1.1.2 + unplugin: 2.3.10 optionalDependencies: - '@vue/compiler-sfc': 3.5.16 + "@vue/compiler-sfc": 3.5.16 transitivePeerDependencies: - supports-color unplugin-utils@0.2.4: dependencies: pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 + + unplugin-utils@0.2.5: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 unplugin@1.16.1: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 + webpack-virtual-modules: 0.6.2 + + unplugin@2.3.10: + dependencies: + "@jridgewell/remapping": 2.3.5 + acorn: 8.16.0 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 unplugin@2.3.5: dependencies: - acorn: 8.15.0 - picomatch: 4.0.2 + acorn: 8.16.0 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 unstorage@1.16.0(db0@0.3.2)(ioredis@5.6.1): @@ -10685,22 +14702,22 @@ snapshots: dependencies: citty: 0.1.6 defu: 6.1.4 - jiti: 2.4.2 + jiti: 2.6.1 knitwork: 1.2.0 scule: 1.3.0 unwasm@0.3.9: dependencies: knitwork: 1.2.0 - magic-string: 0.30.17 + magic-string: 0.30.21 mlly: 1.7.4 pathe: 1.1.2 pkg-types: 1.3.1 unplugin: 1.16.1 - update-browserslist-db@1.1.3(browserslist@4.25.0): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.25.0 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -10718,8 +14735,6 @@ snapshots: uuid@11.1.0: {} - validate-html-nesting@1.2.2: {} - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -10727,26 +14742,26 @@ snapshots: vfile-location@5.0.3: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 vfile: 6.0.3 - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 unist-util-stringify-position: 4.0.0 vfile@6.0.3: dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 + "@types/unist": 3.0.3 + vfile-message: 4.0.3 - vinxi@0.5.7(@types/node@24.0.1)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0): + vinxi@0.5.7(@types/node@25.5.0)(db0@0.3.2)(ioredis@5.6.1)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1): dependencies: - '@babel/core': 7.25.8 - '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.8) - '@types/micromatch': 4.0.9 - '@vinxi/listhen': 1.5.6 + "@babel/core": 7.25.8 + "@babel/plugin-syntax-jsx": 7.25.7(@babel/core@7.25.8) + "@babel/plugin-syntax-typescript": 7.25.7(@babel/core@7.25.8) + "@types/micromatch": 4.0.9 + "@vinxi/listhen": 1.5.6 boxen: 8.0.1 chokidar: 4.0.3 citty: 0.1.6 @@ -10774,25 +14789,25 @@ snapshots: unctx: 2.4.1 unenv: 1.10.0 unstorage: 1.16.0(db0@0.3.2)(ioredis@5.6.1) - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) - zod: 3.25.62 + vite: 6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) + zod: 3.25.76 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@planetscale/database' - - '@types/node' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' + - "@azure/app-configuration" + - "@azure/cosmos" + - "@azure/data-tables" + - "@azure/identity" + - "@azure/keyvault-secrets" + - "@azure/storage-blob" + - "@capacitor/preferences" + - "@deno/kv" + - "@electric-sql/pglite" + - "@libsql/client" + - "@netlify/blobs" + - "@planetscale/database" + - "@types/node" + - "@upstash/redis" + - "@vercel/blob" + - "@vercel/kv" - aws4fetch - better-sqlite3 - db0 @@ -10818,37 +14833,37 @@ snapshots: - xml2js - yaml - vite-plugin-solid@2.11.2(solid-js@1.9.7)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)): + vite-plugin-solid@2.11.10(solid-js@1.9.12)(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)): dependencies: - '@babel/core': 7.25.8 - '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.2(@babel/core@7.25.8) + "@babel/core": 7.29.0 + "@types/babel__core": 7.20.5 + babel-preset-solid: 1.9.10(@babel/core@7.29.0)(solid-js@1.9.12) merge-anything: 5.1.7 - solid-js: 1.9.7 - solid-refresh: 0.6.3(solid-js@1.9.7) - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) - vitefu: 1.0.5(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)) + solid-js: 1.9.12 + solid-refresh: 0.6.3(solid-js@1.9.12) + vite: 6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) + vitefu: 1.1.2(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0): + vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.5 + postcss: 8.5.8 rollup: 4.43.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.0.1 + "@types/node": 25.5.0 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 1.21.7 terser: 5.42.0 - yaml: 2.8.0 + yaml: 2.8.1 - vitefu@1.0.5(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0)): + vitefu@1.1.2(vite@6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1)): optionalDependencies: - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(terser@5.42.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@25.5.0)(jiti@1.21.7)(terser@5.42.0)(yaml@2.8.1) web-namespaces@2.0.1: {} @@ -10858,11 +14873,15 @@ snapshots: webpack-virtual-modules@0.6.2: {} + webworker-shim@1.1.4: {} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 + when-exit@2.1.5: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -10883,8 +14902,8 @@ snapshots: winston@3.17.0: dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 + "@colors/colors": 1.6.0 + "@dabh/diagnostics": 2.0.3 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -10897,6 +14916,11 @@ snapshots: word-wrap@1.2.5: {} + worktank@2.7.3: + dependencies: + promise-make-naked: 2.1.2 + webworker-shim: 1.1.4 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -10905,15 +14929,15 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi@9.0.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -10928,9 +14952,7 @@ snapshots: yallist@5.0.0: {} - yaml@2.6.0: {} - - yaml@2.8.0: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} @@ -10951,27 +14973,42 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.1: {} + yocto-queue@1.2.2: {} youch-core@0.3.2: dependencies: - '@poppinss/exception': 1.2.1 + "@poppinss/exception": 1.2.1 error-stack-parser-es: 1.0.5 youch@4.1.0-beta.8: dependencies: - '@poppinss/colors': 4.1.4 - '@poppinss/dumper': 0.6.3 - '@speed-highlight/core': 1.2.7 + "@poppinss/colors": 4.1.4 + "@poppinss/dumper": 0.6.3 + "@speed-highlight/core": 1.2.7 cookie: 1.0.2 youch-core: 0.3.2 + zeptomatch-escape@1.0.1: {} + + zeptomatch-explode@1.0.1: {} + + zeptomatch-is-static@1.0.1: {} + + zeptomatch-unescape@1.0.1: {} + + zeptomatch@2.1.0: + dependencies: + grammex: 3.1.11 + graphmatch: 1.1.0 + zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 readable-stream: 4.7.0 - zod@3.25.62: {} + zod@3.25.76: {} + + zod@4.3.6: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..7df8a59eb --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,8 @@ +minimumReleaseAge: 10080 # 1 week +minimumReleaseAgeExclude: + - "solid-js" + - "@solidjs/*" + - "@kobalte/solidbase" +packages: + - "." + - "osmium" diff --git a/public/assets/solid.svg b/public/assets/solid.svg index 97e194f76..670e06db1 100644 --- a/public/assets/solid.svg +++ b/public/assets/solid.svg @@ -1,5 +1,4 @@ - \ No newline at end of file + diff --git a/public/fonts/Geist-Bold.woff2 b/public/fonts/Geist-Bold.woff2 index d0562e48e..46f524f4f 100644 Binary files a/public/fonts/Geist-Bold.woff2 and b/public/fonts/Geist-Bold.woff2 differ diff --git a/public/fonts/Geist-Light.woff2 b/public/fonts/Geist-Light.woff2 index 56611204f..91896380e 100644 Binary files a/public/fonts/Geist-Light.woff2 and b/public/fonts/Geist-Light.woff2 differ diff --git a/public/fonts/Geist-Medium.woff2 b/public/fonts/Geist-Medium.woff2 index 76edd1051..ef6dbb211 100644 Binary files a/public/fonts/Geist-Medium.woff2 and b/public/fonts/Geist-Medium.woff2 differ diff --git a/public/fonts/Geist-Regular.woff2 b/public/fonts/Geist-Regular.woff2 index 2ebd0097e..0db0f1943 100644 Binary files a/public/fonts/Geist-Regular.woff2 and b/public/fonts/Geist-Regular.woff2 differ diff --git a/public/fonts/Geist-SemiBold.woff2 b/public/fonts/Geist-SemiBold.woff2 index a6c53e8b0..838452303 100644 Binary files a/public/fonts/Geist-SemiBold.woff2 and b/public/fonts/Geist-SemiBold.woff2 differ diff --git a/public/fonts/GeistMono-Bold.woff2 b/public/fonts/GeistMono-Bold.woff2 index 854b75ae2..aa9768d27 100644 Binary files a/public/fonts/GeistMono-Bold.woff2 and b/public/fonts/GeistMono-Bold.woff2 differ diff --git a/public/fonts/GeistMono-Medium.woff2 b/public/fonts/GeistMono-Medium.woff2 index aaf10d7ad..bb5834201 100644 Binary files a/public/fonts/GeistMono-Medium.woff2 and b/public/fonts/GeistMono-Medium.woff2 differ diff --git a/public/fonts/GeistMono-Regular.woff2 b/public/fonts/GeistMono-Regular.woff2 index 1603e0eb7..c27eb886c 100644 Binary files a/public/fonts/GeistMono-Regular.woff2 and b/public/fonts/GeistMono-Regular.woff2 differ diff --git a/public/fonts/GeistMono-SemiBold.woff2 b/public/fonts/GeistMono-SemiBold.woff2 index d973a8758..6bf41ef47 100644 Binary files a/public/fonts/GeistMono-SemiBold.woff2 and b/public/fonts/GeistMono-SemiBold.woff2 differ diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 000000000..052c911fe --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,233 @@ +# SolidJS Documentation +> Solid is a JavaScript library built around signals. It prioritizes a simple and predictable development experience, making it a great choice for developers of all skill levels. These are the documention for the main official projects. +> - SolidJS: The core library for building reactive user interfaces. +> - SolidStart: A full-stack framework for building web applications. +> - Solid Router: A routing library for building web applications. +> - Solid Meta: A library for managing the HTML head and meta tags. + +## SolidJS + +- [Overview](https://docs.solidjs.com/) +- [Quick start](https://docs.solidjs.com/quick-start) +- [Intro to reactivity](https://docs.solidjs.com/concepts/intro-to-reactivity) +- [Understanding JSX](https://docs.solidjs.com/concepts/understanding-jsx) +- [Basics](https://docs.solidjs.com/concepts/components/basics) +- [Class and style](https://docs.solidjs.com/concepts/components/class-style) +- [Event handlers](https://docs.solidjs.com/concepts/components/event-handlers) +- [Props](https://docs.solidjs.com/concepts/components/props) +- [Signals](https://docs.solidjs.com/concepts/signals) +- [Conditional rendering](https://docs.solidjs.com/concepts/control-flow/conditional-rendering) +- [Dynamic](https://docs.solidjs.com/concepts/control-flow/dynamic) +- [List rendering](https://docs.solidjs.com/concepts/control-flow/list-rendering) +- [Portal](https://docs.solidjs.com/concepts/control-flow/portal) +- [Error boundary](https://docs.solidjs.com/concepts/control-flow/error-boundary) +- [Effects](https://docs.solidjs.com/concepts/effects) +- [Derived signals](https://docs.solidjs.com/concepts/derived-values/derived-signals) +- [Memos](https://docs.solidjs.com/concepts/derived-values/memos) +- [Context](https://docs.solidjs.com/concepts/context) +- [Stores](https://docs.solidjs.com/concepts/stores) +- [Refs](https://docs.solidjs.com/concepts/refs) +- [Fine-grained reactivity](https://docs.solidjs.com/advanced-concepts/fine-grained-reactivity) +- [Styling your components](https://docs.solidjs.com/guides/styling-your-components) +- [SASS](https://docs.solidjs.com/guides/styling-components/sass) +- [LESS](https://docs.solidjs.com/guides/styling-components/less) +- [CSS modules](https://docs.solidjs.com/guides/styling-components/css-modules) +- [Macaron](https://docs.solidjs.com/guides/styling-components/macaron) +- [Tailwind CSS](https://docs.solidjs.com/guides/styling-components/tailwind) +- [UnoCSS](https://docs.solidjs.com/guides/styling-components/uno) +- [State management](https://docs.solidjs.com/guides/state-management) +- [Routing & navigation](https://docs.solidjs.com/guides/routing-and-navigation) +- [Complex state management](https://docs.solidjs.com/guides/complex-state-management) +- [Fetching data](https://docs.solidjs.com/guides/fetching-data) +- [Testing](https://docs.solidjs.com/guides/testing) +- [Deploy your app](https://docs.solidjs.com/guides/deploying-your-app) +- [AWS via Flightcontrol](https://docs.solidjs.com/guides/deployment-options/aws-via-flightcontrol) +- [AWS via SST](https://docs.solidjs.com/guides/deployment-options/aws-via-sst) +- [Cloudflare](https://docs.solidjs.com/guides/deployment-options/cloudflare) +- [Firebase](https://docs.solidjs.com/guides/deployment-options/firebase) +- [Netlify](https://docs.solidjs.com/guides/deployment-options/netlify) +- [Railway](https://docs.solidjs.com/guides/deployment-options/railway) +- [Vercel](https://docs.solidjs.com/guides/deployment-options/vercel) +- [Stormkit](https://docs.solidjs.com/guides/deployment-options/stormkit) +- [Zerops](https://docs.solidjs.com/guides/deployment-options/zerops) +- [Environment variables](https://docs.solidjs.com/configuration/environment-variables) +- [TypeScript](https://docs.solidjs.com/configuration/typescript) +- [createEffect](https://docs.solidjs.com/reference/basic-reactivity/create-effect) +- [createMemo](https://docs.solidjs.com/reference/basic-reactivity/create-memo) +- [createResource](https://docs.solidjs.com/reference/basic-reactivity/create-resource) +- [createSignal](https://docs.solidjs.com/reference/basic-reactivity/create-signal) +- [children](https://docs.solidjs.com/reference/component-apis/children) +- [createContext](https://docs.solidjs.com/reference/component-apis/create-context) +- [createUniqueId](https://docs.solidjs.com/reference/component-apis/create-unique-id) +- [lazy](https://docs.solidjs.com/reference/component-apis/lazy) +- [useContext](https://docs.solidjs.com/reference/component-apis/use-context) +- [](https://docs.solidjs.com/reference/components/dynamic) +- [](https://docs.solidjs.com/reference/components/error-boundary) +- [](https://docs.solidjs.com/reference/components/for) +- [](https://docs.solidjs.com/reference/components/index-component) +- [](https://docs.solidjs.com/reference/components/no-hydration) +- [](https://docs.solidjs.com/reference/components/portal) +- [](https://docs.solidjs.com/reference/components/show) +- [](https://docs.solidjs.com/reference/components/suspense) +- [](https://docs.solidjs.com/reference/components/suspense-list) +- [ / ](https://docs.solidjs.com/reference/components/switch-and-match) +- [createDynamic](https://docs.solidjs.com/reference/components/create-dynamic) +- [@once](https://docs.solidjs.com/reference/jsx-attributes/once) +- [attr:*](https://docs.solidjs.com/reference/jsx-attributes/attr) +- [bool:*](https://docs.solidjs.com/reference/jsx-attributes/bool) +- [classList](https://docs.solidjs.com/reference/jsx-attributes/classlist) +- [innerHTML](https://docs.solidjs.com/reference/jsx-attributes/innerhtml) +- [on:*](https://docs.solidjs.com/reference/jsx-attributes/on) +- [on*](https://docs.solidjs.com/reference/jsx-attributes/on_) +- [prop:*](https://docs.solidjs.com/reference/jsx-attributes/prop) +- [ref](https://docs.solidjs.com/reference/jsx-attributes/ref) +- [style](https://docs.solidjs.com/reference/jsx-attributes/style) +- [textContent](https://docs.solidjs.com/reference/jsx-attributes/textcontent) +- [use:*](https://docs.solidjs.com/reference/jsx-attributes/use) +- [onCleanup](https://docs.solidjs.com/reference/lifecycle/on-cleanup) +- [onMount](https://docs.solidjs.com/reference/lifecycle/on-mount) +- [batch](https://docs.solidjs.com/reference/reactive-utilities/batch) +- [catchError](https://docs.solidjs.com/reference/reactive-utilities/catch-error) +- [createRoot](https://docs.solidjs.com/reference/reactive-utilities/create-root) +- [from](https://docs.solidjs.com/reference/reactive-utilities/from) +- [getOwner](https://docs.solidjs.com/reference/reactive-utilities/get-owner) +- [indexArray](https://docs.solidjs.com/reference/reactive-utilities/index-array) +- [mapArray](https://docs.solidjs.com/reference/reactive-utilities/map-array) +- [mergeProps](https://docs.solidjs.com/reference/reactive-utilities/merge-props) +- [observable](https://docs.solidjs.com/reference/reactive-utilities/observable) +- [on](https://docs.solidjs.com/reference/reactive-utilities/on-util) +- [runWithOwner](https://docs.solidjs.com/reference/reactive-utilities/run-with-owner) +- [splitProps](https://docs.solidjs.com/reference/reactive-utilities/split-props) +- [startTransition](https://docs.solidjs.com/reference/reactive-utilities/start-transition) +- [untrack](https://docs.solidjs.com/reference/reactive-utilities/untrack) +- [useTransition](https://docs.solidjs.com/reference/reactive-utilities/use-transition) +- [DEV](https://docs.solidjs.com/reference/rendering/dev) +- [hydrate](https://docs.solidjs.com/reference/rendering/hydrate) +- [hydrationScript](https://docs.solidjs.com/reference/rendering/hydration-script) +- [isDev](https://docs.solidjs.com/reference/rendering/is-dev) +- [isServer](https://docs.solidjs.com/reference/rendering/is-server) +- [render](https://docs.solidjs.com/reference/rendering/render) +- [renderToStream](https://docs.solidjs.com/reference/rendering/render-to-stream) +- [renderToString](https://docs.solidjs.com/reference/rendering/render-to-string) +- [renderToStringAsync](https://docs.solidjs.com/reference/rendering/render-to-string-async) +- [createComputed](https://docs.solidjs.com/reference/secondary-primitives/create-computed) +- [createDeferred](https://docs.solidjs.com/reference/secondary-primitives/create-deferred) +- [createReaction](https://docs.solidjs.com/reference/secondary-primitives/create-reaction) +- [createRenderEffect](https://docs.solidjs.com/reference/secondary-primitives/create-render-effect) +- [createSelector](https://docs.solidjs.com/reference/secondary-primitives/create-selector) +- [createMutable](https://docs.solidjs.com/reference/store-utilities/create-mutable) +- [createStore](https://docs.solidjs.com/reference/store-utilities/create-store) +- [modifyMutable](https://docs.solidjs.com/reference/store-utilities/modify-mutable) +- [produce](https://docs.solidjs.com/reference/store-utilities/produce) +- [reconcile](https://docs.solidjs.com/reference/store-utilities/reconcile) +- [unwrap](https://docs.solidjs.com/reference/store-utilities/unwrap) +- [getRequestEvent](https://docs.solidjs.com/reference/server-utilities/get-request-event) + +## SolidStart + +- [Overview](https://docs.solidjs.com/solid-start/) +- [Getting started](https://docs.solidjs.com/solid-start/getting-started) +- [Migrating from v1](https://docs.solidjs.com/solid-start/migrating-from-v1) +- [Routing](https://docs.solidjs.com/solid-start/building-your-application/routing) +- [API routes](https://docs.solidjs.com/solid-start/building-your-application/api-routes) +- [CSS and styling](https://docs.solidjs.com/solid-start/building-your-application/css-and-styling) +- [Data fetching](https://docs.solidjs.com/solid-start/building-your-application/data-fetching) +- [Data mutation](https://docs.solidjs.com/solid-start/building-your-application/data-mutation) +- [Head and metadata](https://docs.solidjs.com/solid-start/building-your-application/head-and-metadata) +- [Route Pre-rendering](https://docs.solidjs.com/solid-start/building-your-application/route-prerendering) +- [Static assets](https://docs.solidjs.com/solid-start/building-your-application/static-assets) +- [Middleware](https://docs.solidjs.com/solid-start/advanced/middleware) +- [Sessions](https://docs.solidjs.com/solid-start/advanced/session) +- [Request events](https://docs.solidjs.com/solid-start/advanced/request-events) +- [Returning responses](https://docs.solidjs.com/solid-start/advanced/return-responses) +- [Serialization](https://docs.solidjs.com/solid-start/advanced/serialization) +- [Auth](https://docs.solidjs.com/solid-start/advanced/auth) +- [WebSocket endpoint](https://docs.solidjs.com/solid-start/advanced/websocket) +- [Security](https://docs.solidjs.com/solid-start/guides/security) +- [Data fetching](https://docs.solidjs.com/solid-start/guides/data-fetching) +- [Data mutation](https://docs.solidjs.com/solid-start/guides/data-mutation) +- [Service workers](https://docs.solidjs.com/solid-start/guides/service-workers) +- [app.config.ts](https://docs.solidjs.com/solid-start/reference/entrypoints/app-config) +- [app.tsx](https://docs.solidjs.com/solid-start/reference/entrypoints/app) +- [entry-client.tsx](https://docs.solidjs.com/solid-start/reference/entrypoints/entry-client) +- [entry-server.tsx](https://docs.solidjs.com/solid-start/reference/entrypoints/entry-server) +- [defineConfig](https://docs.solidjs.com/solid-start/reference/config/define-config) +- [FileRoutes](https://docs.solidjs.com/solid-start/reference/routing/file-routes) +- [clientOnly](https://docs.solidjs.com/solid-start/reference/client/client-only) +- [mount](https://docs.solidjs.com/solid-start/reference/client/mount) +- [StartClient](https://docs.solidjs.com/solid-start/reference/client/start-client) +- ["use server"](https://docs.solidjs.com/solid-start/reference/server/use-server) +- [createHandler](https://docs.solidjs.com/solid-start/reference/server/create-handler) +- [createMiddleware](https://docs.solidjs.com/solid-start/reference/server/create-middleware) +- [GET](https://docs.solidjs.com/solid-start/reference/server/get) +- [getServerFunctionMeta](https://docs.solidjs.com/solid-start/reference/server/get-server-function-meta) +- [HttpHeader](https://docs.solidjs.com/solid-start/reference/server/http-header) +- [HttpStatusCode](https://docs.solidjs.com/solid-start/reference/server/http-status-code) +- [StartServer](https://docs.solidjs.com/solid-start/reference/server/start-server) + +## Solid Router + +- [Overview](https://docs.solidjs.com/solid-router/) +- [Installation and setup](https://docs.solidjs.com/solid-router/getting-started/installation-and-setup) +- [Component routing](https://docs.solidjs.com/solid-router/getting-started/component) +- [Config-based routing](https://docs.solidjs.com/solid-router/getting-started/config) +- [Navigation](https://docs.solidjs.com/solid-router/concepts/navigation) +- [Path parameters](https://docs.solidjs.com/solid-router/concepts/path-parameters) +- [Search parameters](https://docs.solidjs.com/solid-router/concepts/search-parameters) +- [Catch-all routes](https://docs.solidjs.com/solid-router/concepts/catch-all) +- [Nesting routes](https://docs.solidjs.com/solid-router/concepts/nesting) +- [Layouts](https://docs.solidjs.com/solid-router/concepts/layouts) +- [Alternative routers](https://docs.solidjs.com/solid-router/concepts/alternative-routers) +- [Actions](https://docs.solidjs.com/solid-router/concepts/actions) +- [Single page applications](https://docs.solidjs.com/solid-router/rendering-modes/spa) +- [Server side rendering](https://docs.solidjs.com/solid-router/rendering-modes/ssr) +- [Queries](https://docs.solidjs.com/solid-router/data-fetching/queries) +- [Streaming](https://docs.solidjs.com/solid-router/data-fetching/streaming) +- [Revalidation](https://docs.solidjs.com/solid-router/data-fetching/revalidation) +- [Preload data](https://docs.solidjs.com/solid-router/data-fetching/how-to/preload-data) +- [Handle pending and error states](https://docs.solidjs.com/solid-router/data-fetching/how-to/handle-error-and-loading-states) +- [Preloading](https://docs.solidjs.com/solid-router/advanced-concepts/preloading) +- [Lazy loading](https://docs.solidjs.com/solid-router/advanced-concepts/lazy-loading) +- [Migration from v0.9.x](https://docs.solidjs.com/solid-router/guides/migration) +- [A](https://docs.solidjs.com/solid-router/reference/components/a) +- [HashRouter](https://docs.solidjs.com/solid-router/reference/components/hash-router) +- [MemoryRouter](https://docs.solidjs.com/solid-router/reference/components/memory-router) +- [Navigate](https://docs.solidjs.com/solid-router/reference/components/navigate) +- [Route](https://docs.solidjs.com/solid-router/reference/components/route) +- [Router](https://docs.solidjs.com/solid-router/reference/components/router) +- [action](https://docs.solidjs.com/solid-router/reference/data-apis/action) +- [cache](https://docs.solidjs.com/solid-router/reference/data-apis/cache) +- [createAsync](https://docs.solidjs.com/solid-router/reference/data-apis/create-async) +- [createAsyncStore](https://docs.solidjs.com/solid-router/reference/data-apis/create-async-store) +- [query](https://docs.solidjs.com/solid-router/reference/data-apis/query) +- [revalidate](https://docs.solidjs.com/solid-router/reference/data-apis/revalidate) +- [useAction](https://docs.solidjs.com/solid-router/reference/data-apis/use-action) +- [useSubmission](https://docs.solidjs.com/solid-router/reference/data-apis/use-submission) +- [useSubmissions](https://docs.solidjs.com/solid-router/reference/data-apis/use-submissions) +- [preload](https://docs.solidjs.com/solid-router/reference/preload-functions/preload) +- [useBeforeLeave](https://docs.solidjs.com/solid-router/reference/primitives/use-before-leave) +- [useCurrentMatches](https://docs.solidjs.com/solid-router/reference/primitives/use-current-matches) +- [useIsRouting](https://docs.solidjs.com/solid-router/reference/primitives/use-is-routing) +- [useLocation](https://docs.solidjs.com/solid-router/reference/primitives/use-location) +- [useMatch](https://docs.solidjs.com/solid-router/reference/primitives/use-match) +- [useNavigate](https://docs.solidjs.com/solid-router/reference/primitives/use-navigate) +- [useParams](https://docs.solidjs.com/solid-router/reference/primitives/use-params) +- [usePreloadRoute](https://docs.solidjs.com/solid-router/reference/primitives/use-preload-route) +- [useSearchParams](https://docs.solidjs.com/solid-router/reference/primitives/use-search-params) +- [json](https://docs.solidjs.com/solid-router/reference/response-helpers/json) +- [redirect](https://docs.solidjs.com/solid-router/reference/response-helpers/redirect) +- [reload](https://docs.solidjs.com/solid-router/reference/response-helpers/reload) + +## Solid Meta + +- [Overview](https://docs.solidjs.com/solid-meta/) +- [Install and configure](https://docs.solidjs.com/solid-meta/getting-started/installation-and-setup) +- [Client setup](https://docs.solidjs.com/solid-meta/getting-started/client-setup) +- [Server setup](https://docs.solidjs.com/solid-meta/getting-started/server-setup) +- [Base](https://docs.solidjs.com/solid-meta/reference/meta/base) +- [Link](https://docs.solidjs.com/solid-meta/reference/meta/link) +- [Meta](https://docs.solidjs.com/solid-meta/reference/meta/meta) +- [MetaProvider](https://docs.solidjs.com/solid-meta/reference/meta/metaprovider) +- [Style](https://docs.solidjs.com/solid-meta/reference/meta/style) +- [Title](https://docs.solidjs.com/solid-meta/reference/meta/title) +- [useHead](https://docs.solidjs.com/solid-meta/reference/meta/use-head) diff --git a/scripts/collections/build-file-tree.mjs b/scripts/collections/build-file-tree.mjs index 627fb0beb..198ff4150 100644 --- a/scripts/collections/build-file-tree.mjs +++ b/scripts/collections/build-file-tree.mjs @@ -44,7 +44,8 @@ export async function buildFileTree(entry = COLLECTIONS_ROOT) { const file = await fs.readFile(entryPath, "utf-8"); const parentSection = await getDirData(path.resolve(parentSegment)); - const { title, mainNavExclude, isDeprecated } = matter(file).data; + const { title, nav_title, mainNavExclude, isDeprecated } = + matter(file).data; /** * @todo @@ -61,7 +62,7 @@ export async function buildFileTree(entry = COLLECTIONS_ROOT) { .replace(/\.mdx?/, ""), slug: path.basename(entryPath, path.extname(entryPath)), parent: parentSection.title, - title, + title: nav_title ?? title, mainNavExclude, isDeprecated, isTranslated: true, diff --git a/scripts/collections/index.mjs b/scripts/collections/index.mjs index 9edb96298..3ce8189f6 100644 --- a/scripts/collections/index.mjs +++ b/scripts/collections/index.mjs @@ -72,5 +72,8 @@ export const COLLECTIONS_ROOT = "src/routes"; Object.keys(projectTrees).forEach((project) => writeFile(`${project}-entries.ts`, projectTrees[project]) ), + Object.keys(projectFlatEntries).forEach((project) => + writeFile(`${project}-flat-entries.js`, projectFlatEntries[project], true) + ), ]); })(); diff --git a/scripts/create-i18n-entries.mjs b/scripts/create-i18n-entries.mjs index 640a80238..317c97bd5 100644 --- a/scripts/create-i18n-entries.mjs +++ b/scripts/create-i18n-entries.mjs @@ -40,14 +40,14 @@ async function buildSectionList(entryList = [], locale, project = "") { ); if (existsSync(i18nEntryPath + ".mdx")) { - const { title, isDeprecated } = await getFrontMatterData( + const { title, nav_title, isDeprecated } = await getFrontMatterData( i18nEntryPath + ".mdx" ); sectionList.push({ ...entry, path: path.join(locale, entry.path), - title, + title: nav_title ?? title, isDeprecated, isTranslated: true, }); diff --git a/scripts/llms-gen.js b/scripts/llms-gen.js new file mode 100644 index 000000000..7002ae76d --- /dev/null +++ b/scripts/llms-gen.js @@ -0,0 +1,63 @@ +import entries from "../.solid/entriesList.js"; +import startEntries from "../.solid/solid-start-flat-entries.js"; +import routerEntries from "../.solid/solid-router-flat-entries.js"; +import metaEntries from "../.solid/solid-meta-flat-entries.js"; +import fs from "fs"; + +const generateLinkArray = (routes) => { + return routes.map((route) => ({ + title: route.title, + url: `https://docs.solidjs.com${route.path}`, + })); +}; + +const formatSection = (title, links) => { + const formattedLinks = links + .map((link) => `- [${link.title}](${link.url})`) + .join("\n"); + return `## ${title}\n\n${formattedLinks}`; +}; + +(async () => { + // SolidJS Core + const coreLinks = [ + ...generateLinkArray(entries.learn), + ...generateLinkArray(entries.reference), + ]; + + // SolidStart + const startLinks = [ + ...generateLinkArray(startEntries.learn), + ...generateLinkArray(startEntries.reference), + ]; + + // Solid Router + const routerLinks = [ + ...generateLinkArray(routerEntries.learn), + ...generateLinkArray(routerEntries.reference), + ]; + + // Solid Meta + const metaLinks = [ + ...generateLinkArray(metaEntries.learn), + ...generateLinkArray(metaEntries.reference), + ]; + + const output = `# SolidJS Documentation +> Solid is a JavaScript library built around signals. It prioritizes a simple and predictable development experience, making it a great choice for developers of all skill levels. These are the documention for the main official projects. +> - SolidJS: The core library for building reactive user interfaces. +> - SolidStart: A full-stack framework for building web applications. +> - Solid Router: A routing library for building web applications. +> - Solid Meta: A library for managing the HTML head and meta tags. + +${formatSection("SolidJS", coreLinks)} + +${formatSection("SolidStart", startLinks)} + +${formatSection("Solid Router", routerLinks)} + +${formatSection("Solid Meta", metaLinks)} +`; + + fs.writeFileSync("public/llms.txt", output, { encoding: "utf-8" }); +})(); diff --git a/scripts/sync-orama.mjs b/scripts/sync-orama.mjs index 8d72936d4..ea59b3901 100644 --- a/scripts/sync-orama.mjs +++ b/scripts/sync-orama.mjs @@ -1,10 +1,12 @@ import { readFileSync } from "node:fs"; import { globSync } from "glob"; +import { OramaCloud } from "@orama/core"; import { generalPurposeCrawler } from "@orama/crawly"; import "dotenv/config"; const ORAMA_PRIVATE_API_KEY = process.env.ORAMA_PRIVATE_API_KEY; -const ORAMA_PRIVATE_INDEX_ID = process.env.ORAMA_PRIVATE_INDEX_ID; +const ORAMA_DATASOURCE_ID = process.env.ORAMA_DATASOURCE_ID; +const ORAMA_PROJECT_ID = process.env.ORAMA_PROJECT_ID; const baseURL = new URL("../dist", import.meta.url).pathname; const HTMLFiles = globSync("**/*.html", { cwd: baseURL }); @@ -18,71 +20,47 @@ const pagesToIndex = HTMLFiles.flatMap((file) => { const productionDocsURL = `https://docs.solidjs.com/${path}`; - return { - ...generalPurposeCrawler(productionDocsURL, pageContent, { - parseCodeBlocks: false, - })[0], - contentWithCode: generalPurposeCrawler(productionDocsURL, pageContent)?.[0] - ?.content, - }; -}); + const content = generalPurposeCrawler(productionDocsURL, pageContent, { + parseCodeBlocks: false, + })[0]; + const contentWithCode = generalPurposeCrawler( + productionDocsURL, + pageContent, + { parseCodeBlocks: true } + )[0]; -async function emptyIndex() { - await fetch( - `https://api.oramasearch.com/api/v1/webhooks/${ORAMA_PRIVATE_INDEX_ID}/snapshot`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - authorization: `Bearer ${ORAMA_PRIVATE_API_KEY}`, - }, - body: JSON.stringify([]), - } - ); -} + const fullContent = { + title: content.title, + path: content.path, + content: content.content, + contentWithCode: contentWithCode.content, + }; -async function upsertFreshData() { - const batches = []; - const batchesSize = 25; + if (content?.category) { + fullContent.category = `enum('${content.category}')`; + } - for (let i = 0; i < pagesToIndex.length; i += batchesSize) { - const batch = pagesToIndex.slice(i, i + batchesSize); - batches.push(batch); + if (content?.section) { + fullContent.section = `enum('${content.section}')`; } - for (let i = 0; i < batches.length; i++) { - const batch = batches[i]; + return fullContent; +}); - await fetch( - `https://api.oramasearch.com/api/v1/webhooks/${ORAMA_PRIVATE_INDEX_ID}/notify`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - authorization: `Bearer ${ORAMA_PRIVATE_API_KEY}`, - }, - body: JSON.stringify({ - upsert: batch, - }), - } - ); - } -} +const orama = new OramaCloud({ + apiKey: ORAMA_PRIVATE_API_KEY, + projectId: ORAMA_PROJECT_ID, +}); -async function deployIndex() { - await fetch( - `https://api.oramasearch.com/api/v1/webhooks/${ORAMA_PRIVATE_INDEX_ID}/deploy`, - { - method: "POST", - headers: { - authorization: `Bearer ${ORAMA_PRIVATE_API_KEY}`, - }, - } - ); +const index = orama.index.set(ORAMA_DATASOURCE_ID); + +console.log(`[Orama] - Indexing ${pagesToIndex.length} documents to Orama...`); - console.log("Index deployed"); -} +const tempIndexId = `tempIndex-${Date.now()}`; +await index.createTemporaryIndex(tempIndexId); +const tempIdx = orama.index.set(tempIndexId); +await tempIdx.insertDocuments(pagesToIndex); +await index.swapTemporaryIndex(ORAMA_DATASOURCE_ID, tempIndexId); +await orama.index.delete(tempIndexId); -await emptyIndex(); -await upsertFreshData(); -await deployIndex(); +console.log(`[Orama] - Indexed ${pagesToIndex.length} documents to Orama.`); diff --git a/src/middleware/legacy-routes-redirect.ts b/src/middleware/legacy-routes-redirect.ts index fdf371f9b..647d1b38b 100644 --- a/src/middleware/legacy-routes-redirect.ts +++ b/src/middleware/legacy-routes-redirect.ts @@ -180,6 +180,8 @@ const LEGACY_ROUTES = { "/solid-router/reference/response-helpers/revalidate": "/solid-router/reference/data-apis/revalidate", + + "/solid-start/guides/data-loading": "/solid-start/guides/data-fetching", } as const; function isLegacyRoute(path: string): path is keyof typeof LEGACY_ROUTES { diff --git a/src/routes/advanced-concepts/fine-grained-reactivity.mdx b/src/routes/advanced-concepts/fine-grained-reactivity.mdx index 7907f064c..4570def9e 100644 --- a/src/routes/advanced-concepts/fine-grained-reactivity.mdx +++ b/src/routes/advanced-concepts/fine-grained-reactivity.mdx @@ -1,5 +1,19 @@ --- title: Fine-grained reactivity +use_cases: >- + optimizing performance, reducing re-renders, understanding solid fundamentals, + building efficient apps, custom reactive systems +tags: + - reactivity + - performance + - signals + - effects + - optimization + - fundamentals +version: "1.0" +description: >- + Master Solid's fine-grained reactivity system for targeted UI updates, optimal + performance, and efficient state management patterns. --- Reactivity ensures automatic responses to data changes, eliminating the need for manual updates to the user interface (UI). diff --git a/src/routes/concepts/components/basics.mdx b/src/routes/concepts/components/basics.mdx index 570f48108..f6de5807d 100644 --- a/src/routes/concepts/components/basics.mdx +++ b/src/routes/concepts/components/basics.mdx @@ -1,6 +1,20 @@ --- title: Basics order: 4 +use_cases: >- + starting new projects, creating components, understanding component structure, + building ui blocks, component organization +tags: + - components + - basics + - jsx + - lifecycle + - imports + - structure +version: "1.0" +description: >- + Learn Solid component fundamentals: creating reusable UI blocks, component + trees, lifecycles, and proper import/export patterns. --- Components are the building blocks of Solid applications. diff --git a/src/routes/concepts/components/class-style.mdx b/src/routes/concepts/components/class-style.mdx index a334d1e72..f710fcc38 100644 --- a/src/routes/concepts/components/class-style.mdx +++ b/src/routes/concepts/components/class-style.mdx @@ -1,6 +1,20 @@ --- title: Class and style order: 2 +use_cases: >- + styling components, dynamic theming, conditional styling, css integration, + responsive design, ui customization +tags: + - styling + - css + - classes + - themes + - dynamic + - ui +version: "1.0" +description: >- + Style Solid components with CSS classes and inline styles. Learn dynamic + styling, classList usage, and theme implementation. --- Similar to HTML, Solid uses `class` and `style` attributes to style elements via [CSS (Cascading Style Sheets)](https://developer.mozilla.org/en-US/docs/Glossary/CSS). @@ -37,9 +51,8 @@ This is because they are not reusable, and they can be difficult to maintain ove The `class` attribute allows you to style one or more elements through CSS rules. This provides a more structured approach to styling, as it allows you to reuse styles across multiple elements. -Classes are defined in CSS files, which are then imported into the component files that use them. -You can import these files using the `import` statement at the top of your component file. -Once imported into a component, the classes are scoped to that component and any of its children. +Classes are defined in CSS files. You can import these files using the `import` statement at the top of your component file. +The CSS file's contents will be inserted into a style tag in the document head. ```jsx import "./Card.css"; @@ -85,7 +98,7 @@ When the value is `true`, the class is applied; when `false`, it is removed. const [current, setCurrent] = createSignal("foo"); - - + <> +
{count()}
+ + + ); -}; +} ``` This offers a way to manage state across your components without having to pass props through intermediate elements. @@ -227,19 +233,19 @@ To solve this issue, a default value can be specified when creating a context ob import { useContext } from "solid-js"; function useMyContext() { - const value = useContext(MyContext); + const value = useContext(MyContext); - if (!value) { - throw new Error("Missing context Provider"); - } + if (!value) { + throw new Error("Missing context Provider"); + } - return value; + return value; } function Child() { - const value = useMyContext(); + const value = useMyContext(); - return
{value}
; + return
{value}
; } ``` @@ -262,10 +268,10 @@ As an example: ```ts title="/context/counter-component.tsx" function useCounterContext() { - const context = useContext(CounterContext) + const context = useContext(CounterContext); if (!context) { - throw new Error("can't find CounterContext") + throw new Error("can't find CounterContext"); } - return context + return context; } ``` diff --git a/src/routes/concepts/control-flow/conditional-rendering.mdx b/src/routes/concepts/control-flow/conditional-rendering.mdx index eecbdfe14..f2a344c41 100644 --- a/src/routes/concepts/control-flow/conditional-rendering.mdx +++ b/src/routes/concepts/control-flow/conditional-rendering.mdx @@ -1,6 +1,20 @@ --- -title: "Conditional rendering" +title: Conditional rendering order: 1 +use_cases: >- + showing/hiding content, loading states, error displays, user permissions, + dynamic ui, feature toggles +tags: + - conditional + - rendering + - show + - switch + - match + - ui +version: "1.0" +description: >- + Conditionally render UI elements in Solid using Show, Switch, and Match + components for clean, readable conditional logic. --- Conditional rendering is the process of displaying different UI elements based on certain conditions. @@ -18,38 +32,37 @@ When there is a change in the state or props it depends on, this property is re- This property can be a boolean value, or a function that returns a boolean value. ```jsx -import { Show } from "solid-js" +import { Show } from "solid-js"; -
Loading...
-
+
Loading...
+
; ``` `` has the `fallback` property that can be used to specify the content to be rendered when the condition evaluates to false. This property can return a JSX element. ```jsx -import { Show } from "solid-js" +import { Show } from "solid-js"; Loading...}>

Hi, I am {data().name}.

-
+
; ``` If there are multiple conditions that need to be handled, `` can be nested to handle each condition. ```jsx -import { Show } from "solid-js" +import { Show } from "solid-js"; -
Loading...
- -
Error: {data.error}
-
-
+
Loading...
+ +
Error: {data.error}
+
+
; ``` - ## Switch and Match When there are multiple conditions that need to be handled, it can be difficult to manage the logic flow with nested `` components. @@ -59,23 +72,23 @@ Similar to JavaScript's [switch/case](https://developer.mozilla.org/en-US/docs/W The first `` component that evaluates to true will have its children rendered, and the rest will be ignored. ```jsx -import { Switch, Match } from "solid-js" +import { Switch, Match } from "solid-js"; - -

Outcome 1

-
- -

Outcome 2

-
-
+ +

Outcome 1

+
+ +

Outcome 2

+
+; ``` Similar to ``, each `` component has a `when` property that is used to determine whether or not to render its children. An optional `fallback` property can also be passed to `` to specify the content be rendered when none of the `` components evaluate to true. ```jsx -import { Switch, Match } from "solid-js" +import { Switch, Match } from "solid-js"; Fallback content

}> @@ -84,5 +97,5 @@ import { Switch, Match } from "solid-js"

Outcome 2

-
+
; ``` diff --git a/src/routes/concepts/control-flow/data.json b/src/routes/concepts/control-flow/data.json index 3b874c4f0..e8261711d 100644 --- a/src/routes/concepts/control-flow/data.json +++ b/src/routes/concepts/control-flow/data.json @@ -2,9 +2,9 @@ "title": "Control flow", "pages": [ "conditional-rendering.mdx", - "dynamic.mdx", - "list-rendering.mdx", - "portal.mdx", - "error-boundary.mdx" + "dynamic.mdx", + "list-rendering.mdx", + "portal.mdx", + "error-boundary.mdx" ] } diff --git a/src/routes/concepts/control-flow/dynamic.mdx b/src/routes/concepts/control-flow/dynamic.mdx index 671eda05b..cebdc4db0 100644 --- a/src/routes/concepts/control-flow/dynamic.mdx +++ b/src/routes/concepts/control-flow/dynamic.mdx @@ -1,27 +1,41 @@ --- -title: "Dynamic" +title: Dynamic order: 2 +use_cases: >- + dynamic component selection, polymorphic components, runtime component + switching, flexible ui rendering, component factories +tags: + - dynamic + - components + - rendering + - polymorphic + - runtime + - flexible +version: "1.0" +description: >- + Render components dynamically at runtime with Solid's Dynamic component. Build + flexible UIs with runtime component selection. --- `` is a Solid component that allows you to render components dynamically based on data. By passing either a string representing a [native HTML element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element) or a component function to the `component` prop, you can render the chosen component with the remaining props you provide. ```jsx -import { createSignal, For } from "solid-js" -import { Dynamic } from "solid-js/web" +import { createSignal, For } from "solid-js"; +import { Dynamic } from "solid-js/web"; -const RedDiv = () =>
Red
-const GreenDiv = () =>
Green
-const BlueDiv = () =>
Blue
+const RedDiv = () =>
Red
; +const GreenDiv = () =>
Green
; +const BlueDiv = () =>
Blue
; const options = { red: RedDiv, green: GreenDiv, blue: BlueDiv, -} +}; function App() { - const [selected, setSelected] = createSignal("red") + const [selected, setSelected] = createSignal("red"); return ( <> @@ -30,12 +44,12 @@ function App() { onInput={(e) => setSelected(e.currentTarget.value)} > - {(color) => } + {(color) => } - ) + ); } ``` @@ -46,20 +60,20 @@ Once a color is selected, the `` component will render the chosen color For example, the following code renders the same result as the previous example: ```jsx -import { createSignal, Switch, Match, For } from "solid-js" +import { createSignal, Switch, Match, For } from "solid-js"; -const RedDiv = () =>
Red
-const GreenDiv = () =>
Green
-const BlueDiv = () =>
Blue
+const RedDiv = () =>
Red
; +const GreenDiv = () =>
Green
; +const BlueDiv = () =>
Blue
; const options = { red: RedDiv, green: GreenDiv, blue: BlueDiv, -} +}; function App() { - const [selected, setSelected] = createSignal("red") + const [selected, setSelected] = createSignal("red"); return ( <> @@ -68,7 +82,7 @@ function App() { onInput={(e) => setSelected(e.currentTarget.value)} > - {(color) => } + {(color) => } }> @@ -80,7 +94,7 @@ function App() {
- ) + ); } ``` @@ -92,11 +106,9 @@ When working with these components, you can pass [props](/concepts/components/pr This makes them available to the component you are rendering, similar to how you would pass props to components in JSX. ```jsx -import { Dynamic } from "solid-js/web" +import { Dynamic } from "solid-js/web"; function App() { - return ( - - ) + return ; } ``` diff --git a/src/routes/concepts/control-flow/error-boundary.mdx b/src/routes/concepts/control-flow/error-boundary.mdx index 961dd2941..692ee256c 100644 --- a/src/routes/concepts/control-flow/error-boundary.mdx +++ b/src/routes/concepts/control-flow/error-boundary.mdx @@ -1,6 +1,20 @@ --- -title: "Error boundary" +title: Error boundary order: 5 +use_cases: >- + error handling, crash prevention, user-friendly errors, app stability, error + recovery, debugging production issues +tags: + - errors + - boundary + - handling + - recovery + - stability + - debugging +version: "1.0" +description: >- + Catch and handle rendering errors gracefully with ErrorBoundary. Prevent app + crashes and provide user-friendly error recovery. --- By default, if part of an application throws an error during rendering, the entire application can crash, resulting in Solid removing its UI from the screen. diff --git a/src/routes/concepts/control-flow/list-rendering.mdx b/src/routes/concepts/control-flow/list-rendering.mdx index 3227d985b..c8f7bcb44 100644 --- a/src/routes/concepts/control-flow/list-rendering.mdx +++ b/src/routes/concepts/control-flow/list-rendering.mdx @@ -1,6 +1,21 @@ --- -title: "List rendering" +title: List rendering order: 3 +use_cases: >- + rendering arrays, dynamic lists, data iteration, tables, repeating elements, + collection display, performance optimization +tags: + - lists + - arrays + - for + - index + - iteration + - rendering + - performance +version: "1.0" +description: >- + Efficiently render dynamic lists in Solid using For and Index components. + Optimize performance for different data scenarios. --- List rendering allows you to generate multiple elements from a collection of data, such as an array or object, where each element corresponds to an item in the collection. @@ -30,18 +45,19 @@ Between the `` tags, the component requires a [callback function](https://d This structure resembles the callback used within JavaScript's [`map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) method, providing a familiar pattern to follow. The function receives two arguments: + - `item`: represents the current item in the data collection that is being rendered over. - `index`: the current item's index within the collection. You can access the current `item` and `index` to dynamically set attributes or content of the JSX elements. -Index is a [*signal*](/concepts/signals) and must be called as a function to retrieve its value. +Index is a [_signal_](/concepts/signals) and must be called as a function to retrieve its value. ```jsx {(item, index) => (
  • {item.name} @@ -72,7 +88,7 @@ This is because `` is more concerned with the **index** of the elements i Because of this, the `item` is a signal, allowing the _content_ at each index to change without a re-render while the index remains fixed. ```jsx -import { Index } from "solid-js" +import { Index } from "solid-js"; {(item, index) => ( @@ -80,12 +96,12 @@ import { Index } from "solid-js" {item().name} - {item().completed}
  • )} -
    +; ``` ## `` vs `` -`` is designed to be used when the *order* and *length* of the list may change frequently. +`` is designed to be used when the _order_ and _length_ of the list may change frequently. When the list value changes in ``, the entire list is re-rendered. However, if the array undergoes a change, such as an element shifting position, `` will manage this by simply **moving** the corresponding DOM node and **updating** the index. @@ -99,14 +115,14 @@ For example, when creating a list of static elements, such as a list of links, ` This is because it will only modify the indexes of the elements in the list, rather than re-rendering the entire list. ```jsx -import { createSignal, For } from "solid-js" +import { createSignal, For } from "solid-js"; function StringList() { - const [items, setItems] = createSignal(["Item 1", "Item 2", "Item 3"]) + const [items, setItems] = createSignal(["Item 1", "Item 2", "Item 3"]); return (
      - { // add the new item to the list @@ -114,13 +130,13 @@ function StringList() { /> {(item, index) => ( -
    • +
    • {item} - {index()}
    • )}
    - ) + ); } ``` @@ -129,11 +145,11 @@ If you were using ``, the entire list would be re-rendered when a value cha ``, instead, will update the content at the specified index, while the rest of the list remains unchanged. ```jsx -import { createSignal, Index } from "solid-js" +import { createSignal, Index } from "solid-js"; function FormList() { - const [inputs, setInputs] = createSignal(['input1','input2','input3']) - return( + const [inputs, setInputs] = createSignal(["input1", "input2", "input3"]); + return (
    {(input, index) => ( @@ -147,6 +163,6 @@ function FormList() { )}
    - ) + ); } -``` \ No newline at end of file +``` diff --git a/src/routes/concepts/control-flow/portal.mdx b/src/routes/concepts/control-flow/portal.mdx index 3c44995e4..356f4ad75 100644 --- a/src/routes/concepts/control-flow/portal.mdx +++ b/src/routes/concepts/control-flow/portal.mdx @@ -1,17 +1,31 @@ --- -title: "Portal" +title: Portal order: 3 +use_cases: >- + modals, popups, tooltips, dropdowns, z-index issues, overflow clipping, + rendering outside parent container +tags: + - portal + - modal + - popup + - dom + - z-index + - overflow +version: "1.0" +description: >- + Learn how Portal renders elements outside the normal DOM flow to solve z-index + and overflow issues for modals and popups. --- When an element requires rendering outside of the usual document flow, challenges related to stacking contents and z-index can interfere with the desired intention or look of an application. `` helps with this by putting elements in a different place in the document, bringing an element into the document flow so they can render as expected. ```jsx -import { Portal } from "solid-js/web" +import { Portal } from "solid-js/web"; - +; ``` The content nested within `` is rendered and positioned by default at the end of the document body. @@ -25,39 +39,38 @@ This can be changed by passing a `mount` prop to ``. The `mount` prop accepts a [DOM node](https://developer.mozilla.org/en-US/docs/Web/API/Node), which will be used as the mount point for the portal content. ```jsx -import { Portal } from "solid-js/web" +import { Portal } from "solid-js/web"; - +; ``` - Using `` can be particularly useful in cases where elements, like information popups, might be clipped or obscured due to the overflow settings of their parent elements. By putting the element outside of the parent element, it is no longer bound by the overflow settings of its parent. This creates a more accessible experience for users, as the content is no longer obscured. - :::note - `` will render wrapped unless specifically targeting `document.head`. +`` will render wrapped unless specifically targeting `document.head`. - This is so events propagate through the Portal according to the component hierarchy instead of the elements hierarchy. +This is so events propagate through the Portal according to the component hierarchy instead of the elements hierarchy. By default, children will wrap in a `
    `. If you portal into an SVG, then the `isSVG` prop must be used to avoid wrapping the children in a `
    ` and wrap in a `` instead. ```jsx -import { Portal } from "solid-js/web" +import { Portal } from "solid-js/web"; function Rect() { - return ( - - - - ); + return ( + + + + ); } function SVG() { - return ; + return ; } ``` + ::: diff --git a/src/routes/concepts/derived-values/derived-signals.mdx b/src/routes/concepts/derived-values/derived-signals.mdx index e0086fb45..6704f5fb9 100644 --- a/src/routes/concepts/derived-values/derived-signals.mdx +++ b/src/routes/concepts/derived-values/derived-signals.mdx @@ -1,6 +1,19 @@ --- title: Derived signals order: 1 +use_cases: >- + computed values, reactive calculations, dependent state, dynamic values from + signals +tags: + - signals + - reactivity + - derived + - computed + - state +version: "1.0" +description: >- + Create reactive derived values that automatically update when their + dependencies change using Solid's derived signals. --- Derived signals are functions that rely on one or more [signals](/concepts/signals) to produce a value. @@ -19,11 +32,11 @@ Similarly you can create a derived signal that relies on a store value because s To learn more about how stores work, [you can visit the stores section](/concepts/stores). ```js -const fullName = () => store.firstName + ' ' + store.lastName; +const fullName = () => store.firstName + " " + store.lastName; ``` -These dependent functions gain reactivity from the signal they access, ensuring that changes in the underlying data propagate throughout your application. -It is important to note that these functions do not store a value themselves; instead, they can update any effects or components that depend on them. +These dependent functions gain reactivity from the signal they access, ensuring that changes in the underlying data propagate throughout your application. +It is important to note that these functions do not store a value themselves; instead, they can update any effects or components that depend on them. If included within a component's body, these derived signals will trigger an update when necessary. While you can create derived values in this manner, Solid created the [`createMemo`](/reference/basic-reactivity/create-memo) primitive. diff --git a/src/routes/concepts/derived-values/memos.mdx b/src/routes/concepts/derived-values/memos.mdx index 1c80f75ea..1438e6436 100644 --- a/src/routes/concepts/derived-values/memos.mdx +++ b/src/routes/concepts/derived-values/memos.mdx @@ -1,6 +1,20 @@ --- title: Memos order: 2 +use_cases: >- + expensive computations, caching results, optimizing performance, derived + state, avoiding re-calculations +tags: + - memo + - performance + - caching + - optimization + - reactivity + - computed +version: "1.0" +description: >- + Optimize expensive computations with memos that cache results and only + recalculate when dependencies actually change. --- Memos are a type of reactive value that can be used to memoize derived state or expensive computations. @@ -18,16 +32,16 @@ Within this function, you can define the derived value or computations you wish When called, `createMemo` will return a **getter** function that reads the current value of the memo: ```jsx -import { createMemo, createSignal } from "solid-js" +import { createMemo, createSignal } from "solid-js"; -const [count, setCount] = createSignal(0) +const [count, setCount] = createSignal(0); -const isEven = createMemo(() => count() % 2 === 0) +const isEven = createMemo(() => count() % 2 === 0); -console.log(isEven()) // true +console.log(isEven()); // true -setCount(3) -console.log(isEven()) // false +setCount(3); +console.log(isEven()); // false ``` While memos look similar to effects, they are different in that they _return a value_. @@ -68,10 +82,10 @@ They, however, serve different purposes and each has their own unique behaviors. When working with memos, it is recommended that you leave them "pure". ```jsx -import { createSignal, createMemo } from "solid-js" +import { createSignal, createMemo } from "solid-js"; -const [count, setCount] = createSignal(0) -const isEven = createMemo(() => count() % 2 === 0) // example of a pure function +const [count, setCount] = createSignal(0); +const isEven = createMemo(() => count() % 2 === 0); // example of a pure function ``` A pure function is one that does not cause any side effects. @@ -81,17 +95,17 @@ When you introduce side effects into a memo, it can complicate the reactivity ch This can lead to unexpected behavior, such as infinite loops, that lead your application to crash. ```jsx -import { createSignal, createMemo } from "solid-js" +import { createSignal, createMemo } from "solid-js"; -const [count, setCount] = createSignal(0) -const [message, setMessage] = createSignal("") +const [count, setCount] = createSignal(0); +const [message, setMessage] = createSignal(""); const badMemo = createMemo(() => { if (count() > 10) { - setMessage("Count is too high!") // side effect + setMessage("Count is too high!"); // side effect } - return count() % 2 === 0 -}) + return count() % 2 === 0; +}); ``` These infinite loops can be triggered when a memo has a side effect that causes its dependencies to change. @@ -100,18 +114,18 @@ This will cause the memo to re-evaluate, which will then trigger the side effect This can be avoided by using a [`createEffect`](/reference/basic-reactivity/create-effect) to handle the side effects instead: ```jsx -import { createSignal, createMemo, createEffect } from "solid-js" +import { createSignal, createMemo, createEffect } from "solid-js"; -const [count, setCount] = createSignal(0) -const [message, setMessage] = createSignal("") +const [count, setCount] = createSignal(0); +const [message, setMessage] = createSignal(""); -const isEven = createMemo(() => count() % 2 === 0) +const isEven = createMemo(() => count() % 2 === 0); createEffect(() => { if (count() > 10) { - setMessage("Count is too high!") + setMessage("Count is too high!"); } -}) +}); ``` Here, the `createEffect` will handle the side effects, while the `isEven` memo will remain pure. @@ -130,18 +144,18 @@ This separation of concerns can help keep your code clean and easy to understand // effect - runs whenever `count` changes createEffect(() => { if (count() > 10) { - setMessage("Count is too high!") + setMessage("Count is too high!"); } else { - setMessage("") + setMessage(""); } -}) +}); // memo - only runs when `count` changes to or from a value greater than 10 const message = createMemo(() => { if (count() > 10) { - return "Count is too high!" + return "Count is too high!"; } else { - return "" + return ""; } -}) +}); ``` diff --git a/src/routes/concepts/effects.mdx b/src/routes/concepts/effects.mdx index f1e2cd54a..137975483 100644 --- a/src/routes/concepts/effects.mdx +++ b/src/routes/concepts/effects.mdx @@ -1,6 +1,19 @@ --- title: Effects order: 4 +use_cases: >- + side effects, dom manipulation, api calls, subscriptions, logging, reacting to + state changes +tags: + - effects + - side-effects + - reactivity + - lifecycle + - subscriptions +version: "1.0" +description: >- + Manage side effects like DOM updates, API calls, and subscriptions that + respond automatically to reactive state changes. --- Effects are functions that are triggered when the signals they depend on change. @@ -24,11 +37,17 @@ createEffect(() => { In this example, an effect is created that logs the current value of `count` to the console. When the value of `count` changes, the effect is triggered, causing it to run again and log the new value of `count`. +:::note +Effects are primarily intended for handling side effects that do not write to the reactive system. +It's best to avoid setting signals within effects, as this can lead to additional rendering or even infinite loops if not managed carefully. +Instead, it is recommended to use [createMemo](/reference/basic-reactivity/create-memo) to compute new values that rely on other reactive values. +::: + ## Managing dependencies Effects can be set to observe any number of dependencies. Dependencies are what allow an effect to track changes and respond accordingly. -These can include signals, variables, props, context, or any other reactive values. +These can include signals, props, context, or any other reactive values. When any of these change, the effect is notified and will run again to update its state. Upon initialization, an effect will run _once_, regardless of whether it has any dependencies. @@ -88,9 +107,9 @@ setMessage("World"); // Output: 1, "World" ``` :::note -When a signal updates, it notifies all of its subscribers sequentially but the *order can vary*. +When a signal updates, it notifies all of its subscribers sequentially but the _order can vary_. While effects are guaranteed to run when a signal updates, the execution might **not** be instantaneous. -This means that the order of execution of effects is *not guaranteed* and should not be relied upon. +This means that the order of execution of effects is _not guaranteed_ and should not be relied upon. ::: ### Nested effects diff --git a/src/routes/concepts/intro-to-reactivity.mdx b/src/routes/concepts/intro-to-reactivity.mdx index 5b885169d..5c826f62d 100644 --- a/src/routes/concepts/intro-to-reactivity.mdx +++ b/src/routes/concepts/intro-to-reactivity.mdx @@ -1,6 +1,20 @@ --- -title: "Intro to reactivity" +title: Intro to reactivity order: 1 +use_cases: >- + learning reactivity, understanding signals, reactive principles, state + management basics, getting started +tags: + - reactivity + - signals + - fundamentals + - state + - subscribers + - basics +version: "1.0" +description: >- + Master Solid's reactive system fundamentals: signals, subscribers, and + automatic UI updates for responsive applications. --- **Note**: While this guide is useful for understanding reactive systems, it does use some Solid-specific terminology. @@ -127,9 +141,9 @@ setCount(1); // `count` is not being tracked, so the console log will not update when `count` changes. ``` -Since initialization is a **one-time event**, if a signal is accessed _outside of a tracking scope_, it will not be tracked. +Initialization, or creation is a **one-time event** that doesn't cause tracking. To track a signal, it must be accessed within the scope of a subscriber. -Reactive primitives, such as [effects](/concepts/effects), can be used to create subscribers. +Reactive primitives, such as [memos](/concepts/derived-values/memos) can be used to create derived values from signals or other memos, and [effects](/concepts/effects) to create subscribers that use the reactive graph output once it's settled. ```jsx const [count, setCount] = createSignal(0); @@ -182,7 +196,8 @@ function Counter() { return (
    - Count: {count()}{/* βœ… will update whenever `count()` changes. */} + Count: {count()} + {/* βœ… will update whenever `count()` changes. */} diff --git a/src/routes/concepts/refs.mdx b/src/routes/concepts/refs.mdx index ad07eaede..a10a90c7c 100644 --- a/src/routes/concepts/refs.mdx +++ b/src/routes/concepts/refs.mdx @@ -1,5 +1,19 @@ --- title: Refs +use_cases: >- + dom access, element references, focus management, third-party libraries, + canvas manipulation, forwarding refs +tags: + - refs + - dom + - elements + - directives + - access + - forward +version: "1.0" +description: >- + Access and manipulate DOM elements directly using refs, forward refs between + components, and create custom directives. --- Refs, or references, are a special attribute that can be attached to any element, and are used to reference a DOM element or a component instance. @@ -20,9 +34,9 @@ JSX can be used as a value and assigned to a variable when looking to directly a ```tsx function Component() { - const myElement =

    My Element

    + const myElement =

    My Element

    ; - return
    {myElement}
    + return
    {myElement}
    ; } ``` @@ -46,7 +60,7 @@ function Component() {

    My Element

    - ) + ); } ``` @@ -54,9 +68,11 @@ These assignments occur at _creation time_ prior to the element being added to t If access to an element is needed before it is added to the DOM, you can use the callback form of `ref`: ```jsx -

    { - myElement = el // el is created but not yet added to the DOM - }}> +

    { + myElement = el; // el is created but not yet added to the DOM + }} +> My Element

    ``` @@ -69,6 +85,7 @@ confirm it. ```tsx let myElement!: HTMLDivElement; ``` + ::: ### Signals as refs @@ -114,21 +131,21 @@ To access the `ref` in the child component, it is passed as a prop: ```tsx // Parent component -import { Canvas } from "./Canvas.jsx" +import { Canvas } from "./Canvas.jsx"; function ParentComponent() { - let canvasRef + let canvasRef; const animateCanvas = () => { // Manipulate the canvas using canvasRef... - } + }; return (
    - ) + ); } // Child component @@ -137,7 +154,7 @@ function Canvas(props) {
    {/* Assign the ref to the canvas element */}
    - ) + ); } ``` @@ -158,8 +175,7 @@ Directives are like callback refs but they enable two extra features: A directive is essentially a function with a specific signature: ```typescript -function directive(element: Element, accessor: () => any): void - +function directive(element: Element, accessor: () => any): void; ``` - `element`: The DOM element that the directive is applied to. diff --git a/src/routes/concepts/signals.mdx b/src/routes/concepts/signals.mdx index aa59b6515..909443c31 100644 --- a/src/routes/concepts/signals.mdx +++ b/src/routes/concepts/signals.mdx @@ -1,6 +1,20 @@ --- title: Signals order: 2 +use_cases: >- + state management, reactive values, component state, updating ui, tracking + changes, basic reactivity +tags: + - signals + - state + - reactivity + - getter + - setter + - fundamentals +version: "1.0" +description: >- + Create reactive state with signals - the foundation of Solid's reactivity + system for automatic UI updates and tracking. --- Signals are the primary means of [managing state](/concepts/intro-to-reactivity#state-management) in your Solid application. @@ -80,7 +94,7 @@ function Counter() { ``` :::note -A tracking scope can be created by [`createEffect`](/reference/basic-reactivity/create-effect) or [`createMemo`](/reference/basic-reactivity/create-memo), which are other Solid primitives. +A tracking scope can be created by [`createEffect`](/reference/basic-reactivity/create-effect) or [`createMemo`](/reference/basic-reactivity/create-memo), which are other Solid primitives. Both functions subscribe to the signals accessed within them, establishing a dependency relationship. Once this relationship is established, the function is notified whenever the signal changes. diff --git a/src/routes/concepts/stores.mdx b/src/routes/concepts/stores.mdx index bf0fe6a7f..01eaf0184 100644 --- a/src/routes/concepts/stores.mdx +++ b/src/routes/concepts/stores.mdx @@ -1,11 +1,26 @@ --- title: Stores order: 6 +use_cases: >- + complex state, nested objects, arrays, shared state, fine-grained updates, + state trees, global state +tags: + - stores + - state + - objects + - arrays + - nested + - produce + - reconcile +version: "1.0" +description: >- + Manage complex nested state efficiently with stores that provide fine-grained + reactivity for objects and arrays in Solid. --- -Similar to [signals](/concepts/signals), stores are a state management primitive. -However, while signals manage a single piece of state, stores create a centralized location to reduce code redundancy. -Within Solid, these stores can spawn a collection of reactive signals, each corresponding to a particular property which can be useful when working with complex state. +Stores are a state management primitive that provide a centralized way to handle shared data and reduce redundancy. +Unlike [signals](/concepts/signals), which track a single value and trigger a full re-render when updated, stores maintain fine-grained reactivity by updating only the properties that change. +They can produce a collection of reactive signals, each linked to an individual property, making them well-suited for managing complex state efficiently. ## Creating a store @@ -15,7 +30,7 @@ Using JavaScript's [proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScri With stores, you can now target nested properties and elements within these structures to create a dynamic tree of reactive data. ```jsx -import { createStore } from "solid-js/store" +import { createStore } from "solid-js/store"; // Initialize store const [store, setStore] = createStore({ @@ -40,7 +55,7 @@ const [store, setStore] = createStore({ loggedIn: true, }, ], -}) +}); ``` ## Accessing store values @@ -48,7 +63,7 @@ const [store, setStore] = createStore({ Store properties can be accessed directly from the state proxy through directly referencing the targeted property: ```jsx -console.log(store.userCount) // Outputs: 3 +console.log(store.userCount); // Outputs: 3 ``` Accessing stores within a tracking scope follows a similar pattern to signals. @@ -57,7 +72,7 @@ This provides access to the store's value directly within a tracking scope: ```jsx const App = () => { - const [mySignal, setMySignal] = createSignal("This is a signal.") + const [mySignal, setMySignal] = createSignal("This is a signal."); const [store, setStore] = createStore({ userCount: 3, users: [ @@ -80,14 +95,14 @@ const App = () => { loggedIn: true, }, ], - }) + }); return (

    Hello, {store.users[0].username}

    {/* Accessing a store value */} {mySignal()} {/* Accessing a signal */}
    - ) -} + ); +}; ``` When a store is created, it starts with the initial state but does _not_ immediately set up signals to track changes. @@ -97,7 +112,6 @@ Once data is used within a tracking scope, such as within the return statement o For example, if you wanted to print out every new user, adding the console log below will not work because it is not within a tracked scope. - ```tsx ins={9} const App = () => { const [store, setStore] = createStore({ @@ -199,7 +213,7 @@ Separating the read and write capabilities of a store provides a valuable debugg This separation facilitates the tracking and control of the components that are accessing or changing the values. ::: :::advanced - A little hidden feature of stores is that you can also create nested stores to help with setting nested properties. +A little hidden feature of stores is that you can also create nested stores to help with setting nested properties. ```jsx const [store, setStore] = createStore({ @@ -220,9 +234,10 @@ This separation facilitates the tracking and control of the components that are ]) ``` - Changes made through `setUsers` will update the `store.users` property and reading `users` from this derived store will also be in sync with the values from `store.users`. - Note that the above relies on `store.users` to be set already in the existing store. +Changes made through `setUsers` will update the `store.users` property and reading `users` from this derived store will also be in sync with the values from `store.users`. + +Note that the above relies on `store.users` to be set already in the existing store. ::: @@ -253,8 +268,10 @@ Instead of relying on discovering individual indices, path syntax introduces sev ### Appending new values -To append new values to an array in a store, use the setter function with the spread operator (`...`) to create a new array that includes the existing items and the new ones. -For appending a single element, you can instead leverage the "path syntax" by specifying the array’s length as the index to set. +To append values to an array in a store, use the setter function with the spread operator (`...`) or the path syntax. Both methods add an element to the array but differ in how they modify it and their reactivity behavior. + +The spread operator creates a new array by copying the existing elements and adding the new one, effectively replacing the entire `store.users` array. +This replacement triggers reactivity for all effects that depend on the array or its properties. ```jsx setStore("users", (otherUsers) => [ @@ -265,16 +282,19 @@ setStore("users", (otherUsers) => [ location: "Nigeria", loggedIn: false, }, -]) +]); +``` -// can become +The path syntax adds the new element by assigning it to the index equal to `store.users.length`, directly modifying the existing array. +This triggers reactivity only for effects that depend on the new index or properties like `store.users.length`, making updates more efficient and targeted. +```jsx setStore("users", store.users.length, { id: 3, username: "michael584", location: "Nigeria", loggedIn: false, -}) +}); ``` ### Modifying multiple elements @@ -287,11 +307,11 @@ For example, if `store.users` is an array of objects, you can set the `loggedIn` property of several indices at once like so: ```jsx -setStore("users", [2, 7, 10], "loggedIn", false) +setStore("users", [2, 7, 10], "loggedIn", false); // equivalent to (but more efficient than): -setStore("users", 2, "loggedIn", false) -setStore("users", 7, "loggedIn", false) -setStore("users", 10, "loggedIn", false) +setStore("users", 2, "loggedIn", false); +setStore("users", 7, "loggedIn", false); +setStore("users", 10, "loggedIn", false); ``` This array syntax also works for object property names. @@ -299,10 +319,10 @@ For example, if `store.users` is an object mapping usernames to objects, you can set the `loggedIn` property of several users at once like so: ```jsx -setStore("users", ["me", "you"], "loggedIn", false) +setStore("users", ["me", "you"], "loggedIn", false); // equivalent to (but more efficient than): -setStore("users", ["me"], "loggedIn", false) -setStore("users", ["you"], "loggedIn", false) +setStore("users", ["me"], "loggedIn", false); +setStore("users", ["you"], "loggedIn", false); ``` For arrays specifically, you can specify a range of indices via an object @@ -311,10 +331,10 @@ For example, assuming `store.users` is an array again, you can set the `loggedIn` state for all users except index 0 as follows: ```jsx -setStore("users", { from: 1, to: store.users.length - 1 }, "loggedIn", false) +setStore("users", { from: 1, to: store.users.length - 1 }, "loggedIn", false); // equivalent to (but more efficient than): for (let i = 1; i <= store.users.length - 1; i++) { - setStore("users", i, "loggedIn", false) + setStore("users", i, "loggedIn", false); } ``` @@ -323,10 +343,15 @@ and thereby update a regular subset of elements. For example, you can set the `loggedIn` state for even-indexed users like so: ```jsx -setStore("users", { from: 0, to: store.users.length - 1, by: 2 }, "loggedIn", false) +setStore( + "users", + { from: 0, to: store.users.length - 1, by: 2 }, + "loggedIn", + false +); // equivalent to (but more efficient than): for (let i = 1; i <= store.users.length - 1; i += 2) { - setStore("users", i, "loggedIn", false) + setStore("users", i, "loggedIn", false); } ``` @@ -342,7 +367,7 @@ These functions receive the old value as an argument, allowing you to compute th This dynamic approach is particularly useful for complex transformations. ```jsx -setStore("users", 3, "loggedIn" , (loggedIn) => !loggedIn) +setStore("users", 3, "loggedIn", (loggedIn) => !loggedIn); ``` ### Filtering values @@ -353,14 +378,14 @@ This might include using methods like `.startsWith()`, `includes()`, or other co ```jsx // update users with username that starts with "t" -setStore("users", (user) => user.username.startsWith("t"), "loggedIn", false) +setStore("users", (user) => user.username.startsWith("t"), "loggedIn", false); // update users with location "Canada" -setStore("users", (user) => user.location == "Canada" , "loggedIn", false) +setStore("users", (user) => user.location == "Canada", "loggedIn", false); // update users with id 1, 2 or 3 -let ids = [1,2,3] -setStore("users", (user) => ids.includes(user.id) , "loggedIn", false) +let ids = [1, 2, 3]; +setStore("users", (user) => ids.includes(user.id), "loggedIn", false); ``` ## Modifying objects @@ -373,14 +398,14 @@ What this means, is that you can directly make the change to the store _without_ ```jsx setStore("users", 0, { id: 109, -}) +}); // is equivalent to setStore("users", 0, (user) => ({ ...user, id: 109, -})) +})); ``` ## Store utilities @@ -392,21 +417,21 @@ This utility provides a way to work with data as if it were a [mutable](https:// `produce` also provides a way to make changes to multiple properties at the same time which eliminates the need for multiple setter calls. ```jsx -import { produce } from "solid-js/store" +import { produce } from "solid-js/store"; // without produce -setStore("users", 0, "username", "newUsername") -setStore("users", 0, "location", "newLocation") +setStore("users", 0, "username", "newUsername"); +setStore("users", 0, "location", "newLocation"); // with produce setStore( "users", 0, produce((user) => { - user.username = "newUsername" - user.location = "newLocation" + user.username = "newUsername"; + user.location = "newLocation"; }) -) +); ``` `produce` and `setStore` do have distinct functionalities. @@ -423,15 +448,14 @@ When new information needs to be merged into an existing store `reconcile` can b `reconcile` will determine the differences between new and existing data and initiate updates only when there are _changed_ values, thereby avoiding unnecessary updates. ```jsx -import { createStore, reconcile } from "solid-js/stores" +import { createStore, reconcile } from "solid-js/store"; const [data, setData] = createStore({ - animals: ['cat', 'dog', 'bird', 'gorilla'] -}) - -const newData = getNewData() // eg. contains ['cat', 'dog', 'bird', 'gorilla', 'koala'] -setData('animals', reconcile(newData)) + animals: ["cat", "dog", "bird", "gorilla"], +}); +const newData = getNewData(); // eg. contains ['cat', 'dog', 'bird', 'gorilla', 'koala'] +setData("animals", reconcile(newData)); ``` In this example, the store will look for the differences between the existing and incoming data sets. @@ -448,13 +472,13 @@ Additionally, `unwrap` provides a means to interface with third-party libraries This utility acts as a bridge to facilitate smooth integrations with external components and simplifies the incorporation of stores into various applications and workflows. ```jsx -import { createStore, unwrap } from "solid-js/store" +import { createStore, unwrap } from "solid-js/store"; const [data, setData] = createStore({ animals: ["cat", "dog", "bird", "gorilla"], -}) +}); -const rawData = unwrap(data) +const rawData = unwrap(data); ``` To learn more about how to use Stores in practice, visit the [guide on complex state management](/guides/complex-state-management). diff --git a/src/routes/concepts/understanding-jsx.mdx b/src/routes/concepts/understanding-jsx.mdx index 8dea79978..9acda4e03 100644 --- a/src/routes/concepts/understanding-jsx.mdx +++ b/src/routes/concepts/understanding-jsx.mdx @@ -1,6 +1,20 @@ --- title: Understanding JSX order: 2 +use_cases: >- + writing components, html in javascript, dynamic content, templating, props + passing, event handling +tags: + - jsx + - components + - templates + - props + - html + - syntax +version: "1.0" +description: >- + Write HTML-like syntax in JavaScript with JSX to create reactive components + with dynamic expressions and event handlers. --- JSX is an extension for JavaScript. @@ -12,7 +26,7 @@ This provides a concise and readable way to create and represent components. Solid was designed to align closely with HTML standards. ```jsx -const element =

    I'm JSX!!

    +const element =

    I'm JSX!!

    ; ``` It offers a distinct advantage, however: to copy/paste solutions from resources like Stack Overflow; and to allow direct usage of templates from design tools. @@ -21,14 +35,14 @@ This lets you use dynamic expressions within your HTML by allowing variables and ```jsx const Component = () => { - const animal = { breed: "cat", name: "Midnight" } + const animal = { breed: "cat", name: "Midnight" }; return (

    I have a {animal.breed} named {animal.name}!

    - ) -} + ); +}; ``` This means JavaScript content can be rendered on web pages based on an application's state or logic. @@ -98,6 +112,7 @@ In JSX files, HTML attributes are used much like regular HTML, with a few key di Click me! ``` + ::: ### JSX properties (props) @@ -110,17 +125,17 @@ They connect the component with the data it requires, for seamless data flows an - **Static props**: In Solid's JSX, static props are integrated directly into the HTML by cloning the template and using them as attributes. - - **Dynamic props**: - Dynamic props rely on state, allowing the content or properties to be dynamic. - An example is changing the style of an element in response to interactions within an application. - This can be expressed in the form of signals (`value={value()}`). +- **Dynamic props**: + Dynamic props rely on state, allowing the content or properties to be dynamic. + An example is changing the style of an element in response to interactions within an application. + This can be expressed in the form of signals (`value={value()}`). - **Data transfer**: Props are also used to fill components with data that comes from resources, like [`createResource`](/reference/basic-reactivity/create-resource) calls. This results in components that react in real-time to data changes. :::note -Expressions, whether fixed or dynamic, get applied *in the order defined within the JSX*. +Expressions, whether fixed or dynamic, get applied _in the order defined within the JSX_. This works for a wide range of DOM elements, but will not work with elements that require attributes to be defined in a special order, such as input types with `type='range'`. When order influences an element's behavior, users must define the expressions in the order that the element is expected. diff --git a/src/routes/configuration/environment-variables.mdx b/src/routes/configuration/environment-variables.mdx index 292a9210a..6ccf8813f 100644 --- a/src/routes/configuration/environment-variables.mdx +++ b/src/routes/configuration/environment-variables.mdx @@ -1,5 +1,19 @@ --- title: Environment variables +use_cases: >- + api keys, configuration, secrets management, build-time config, + environment-specific settings +tags: + - environment + - variables + - config + - vite + - secrets + - deployment +version: "1.0" +description: >- + Configure public and private environment variables in Solid apps using Vite's + built-in support for secure configuration. --- Solid is built on top of [Vite](https://vitejs.dev/), which offers a convenient way to handle environment variables. @@ -62,8 +76,8 @@ function MyComponent() { These variables should only be accessed in your backend code, so it's best not to use the `VITE_` prefix for them. Instead, use `process.env` to access them. Depending on the [Nitro preset](https://nitro.build/deploy) chosen, they'll be made available automatically or they will require an external dependency such as [dotenv](https://www.npmjs.com/package/dotenv). ```jsx -DB_HOST="somedb://192.110.0" -DB_PASSWORD = super_secret_password_hash +DB_HOST = "somedb://192.110.0"; +DB_PASSWORD = super_secret_password_hash; ``` To access them, within your backend code, use `process.env`. @@ -82,11 +96,10 @@ For an example, check the pseudo-code below. It is also possible to make `process.env` type-safe via the same `env.d.ts` file. ```typescript - declare namespace NodeJS { interface ProcessEnv { - readonly DB_URL: string - readonly DB_PASSWORD: string + readonly DB_URL: string; + readonly DB_PASSWORD: string; } } ``` diff --git a/src/routes/configuration/typescript.mdx b/src/routes/configuration/typescript.mdx index 61b1a82af..6206710e7 100644 --- a/src/routes/configuration/typescript.mdx +++ b/src/routes/configuration/typescript.mdx @@ -1,5 +1,20 @@ --- title: TypeScript +use_cases: >- + type safety, code reliability, large projects, team collaboration, api + documentation, migrating from javascript +tags: + - typescript + - types + - migration + - configuration + - jsx + - development + - tooling +version: "1.0" +description: >- + Learn to configure TypeScript with SolidJS for enhanced type safety, better + IDE support, and reliable component development. --- [TypeScript](https://www.typescriptlang.org/) is a superset of JavaScript that enhances code reliability and predictability through the introduction of [static types](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html). @@ -58,7 +73,6 @@ typescript 2. Run the following command to generate a `tsconfig.json` file. - ```package-exec tsc --init ``` @@ -645,6 +659,7 @@ declare module "solid-js" { ``` :::note + New in v1.9.0 ::: @@ -685,8 +700,10 @@ To include specific native events, you can choose certain events (e.g. `mousemov ```ts declare module "solid-js" { namespace JSX { - interface CustomEvents - extends Pick {} + interface CustomEvents extends Pick< + HTMLElementEventMap, + "mousemove" | "pointermove" + > {} } } ``` diff --git a/src/routes/guides/complex-state-management.mdx b/src/routes/guides/complex-state-management.mdx index 068ab6e76..ee5aed88a 100644 --- a/src/routes/guides/complex-state-management.mdx +++ b/src/routes/guides/complex-state-management.mdx @@ -1,6 +1,20 @@ --- title: Complex state management order: 5 +use_cases: >- + scaling applications, multiple components, backend communication, state + synchronization, prop drilling, shared state +tags: + - stores + - state + - context + - scaling + - components + - management +version: "1.0" +description: >- + Master complex state management in Solid using stores and context to build + scalable, maintainable applications efficiently. --- As applications grow and start to involve many components, more intricate user interactions, and possibly communication with backend services, you may find that staying organized with more [basic state management methods](/guides/state-management) can become difficult to maintain. @@ -8,25 +22,27 @@ As applications grow and start to involve many components, more intricate user i Consider this example: ```jsx -import { For, createSignal, Show, createMemo } from "solid-js" +import { For, createSignal, Show, createMemo } from "solid-js"; const App = () => { - const [tasks, setTasks] = createSignal([]) - const [numberOfTasks, setNumberOfTasks] = createSignal(tasks.length) - const completedTasks = createMemo(() => tasks().filter((task) => task.completed)) - let input + const [tasks, setTasks] = createSignal([]); + const [numberOfTasks, setNumberOfTasks] = createSignal(tasks.length); + const completedTasks = createMemo(() => + tasks().filter((task) => task.completed) + ); + let input; const addTask = (text) => { - setTasks([...tasks(), { id: tasks().length, text, completed: false }]) - setNumberOfTasks(numberOfTasks() + 1) - } + setTasks([...tasks(), { id: tasks().length, text, completed: false }]); + setNumberOfTasks(numberOfTasks() + 1); + }; const toggleTask = (id) => { setTasks( tasks().map((task) => task.id !== id ? task : { ...task, completed: !task.completed } ) - ) - } + ); + }; return ( <> @@ -36,9 +52,9 @@ const App = () => {
    {(task) => { - const { id, text } = task - console.log(`Creating ${text}`) + const { id, text } = task; + console.log(`Creating ${text}`); return (
    { {text}
    - ) + ); }}
    - ) -} + ); +}; -export default App +export default App; ``` There are several challenges to managing state in this way: @@ -96,16 +112,16 @@ If you're new to the concept of stores, see the [stores section](/concepts/store To reduce the amount of signals that were used in the original example, you can do the following using a store: ```jsx -import { createStore } from "solid-js/store" +import { createStore } from "solid-js/store"; const App = () => { const [state, setState] = createStore({ tasks: [], numberOfTasks: 0, - }) -} + }); +}; -export default App +export default App; ``` Through using a store, you no longer need to keep track of separate signals for `tasks`, `numberOfTasks`, and `completedTasks`. @@ -115,22 +131,22 @@ Through using a store, you no longer need to keep track of separate signals for Once you have created your store, the values can be accessed directly through the first value returned by the `createStore` function: ```jsx -import { createStore } from "solid-js/store" +import { createStore } from "solid-js/store"; const App = () => { const [state, setState] = createStore({ tasks: [], numberOfTasks: 0, - }) + }); return ( <>

    My Task List for Today

    You have {state.numberOfTasks} task(s) for today! - ) -} + ); +}; -export default App +export default App; ``` Through `state.numberOfTasks`, the display will now show the store's value held in the `numberOfTasks` property. @@ -144,12 +160,12 @@ To create the signal so it reactively updates, you have to access the property w ```jsx // not reactive -setState("numberOfTasks", state.tasks.length) +setState("numberOfTasks", state.tasks.length); // reactive createEffect(() => { - setState("numberOfTasks", state.tasks.length) -}) + setState("numberOfTasks", state.tasks.length); +}); ``` ### Adding to an array @@ -163,8 +179,8 @@ const addTask = (text) => { id: state.tasks.length, text, completed: false, - }) -} + }); +}; ``` The setter in stores follow [path syntax](/concepts/stores#path-syntax-flexibility): `setStore("key", value)`. @@ -178,40 +194,40 @@ Something such as toggle function: ```jsx const toggleTask = (id) => { - const currentCompletedStatus = state.tasks[id].completed + const currentCompletedStatus = state.tasks[id].completed; setState( "tasks", (task) => task.id === id, "completed", !currentCompletedStatus - ) -} + ); +}; ``` Can be simplified using `produce`: ```jsx -import { produce } from "solid-js/store" +import { produce } from "solid-js/store"; const toggleTask = (id) => { setState( "tasks", (task) => task.id === id, produce((task) => { - task.completed = !task.completed + task.completed = !task.completed; }) - ) -} + ); +}; // You can also rewrite the `addTask` function through produce const addTask = (text) => { setState( "tasks", produce((task) => { - task.push({ id: state.tasks.length, text, completed: false }) + task.push({ id: state.tasks.length, text, completed: false }); }) - ) -} + ); +}; ``` Read about some of the other [advantages to using `produce`](/concepts/stores#store-updates-with-produce). @@ -222,9 +238,9 @@ Read about some of the other [advantages to using `produce`](/concepts/stores#st ```jsx // without produce batch(() => { - setState(0, "text", "I'm updated text") - setState(0, "completed", true) -}) + setState(0, "text", "I'm updated text"); + setState(0, "completed", true); +}); // with produce setState( @@ -233,7 +249,7 @@ setState( task.text = "I'm updated text"; task.completed = true; }) -) +); ``` ::: @@ -241,37 +257,37 @@ setState( The updated example: ```jsx -import { For, createEffect, Show } from "solid-js" -import { createStore, produce } from "solid-js/store" +import { For, createEffect, Show } from "solid-js"; +import { createStore, produce } from "solid-js/store"; const App = () => { - let input // lets you target the input value + let input; // lets you target the input value const [state, setState] = createStore({ tasks: [], numberOfTasks: 0, - }) + }); const addTask = (text) => { setState("tasks", state.tasks.length, { id: state.tasks.length, text, completed: false, - }) - } + }); + }; const toggleTask = (id) => { setState( "tasks", (task) => task.id === id, produce((task) => { - task.completed = !task.completed + task.completed = !task.completed; }) - ) - } + ); + }; createEffect(() => { - setState("numberOfTasks", state.tasks.length) - }) + setState("numberOfTasks", state.tasks.length); + }); return ( <> @@ -282,16 +298,16 @@ const App = () => { {(task) => { - const { id, text } = task + const { id, text } = task; return (
    { /> {text}
    - ) + ); }}
    - ) -} + ); +}; -export default App +export default App; ``` ## State sharing @@ -322,40 +338,40 @@ To use this, you need to create a context. This context will have a default value and can be consumed by any _descendant_ component. ```jsx -import { createContext } from "solid-js" +import { createContext } from "solid-js"; -const TaskContext = createContext() +const TaskContext = createContext(); ``` Your components will be wrapped with the `Provider` from the context, and passed with the values that you wish to share. ```jsx -import { createStore } from "solid-js/store" +import { createStore } from "solid-js/store"; const TaskApp = () => { const [state, setState] = createStore({ tasks: [], numberOfTasks: 0, - }) + }); return ( {/* Your components */} - ) -} + ); +}; ``` In any descendent component, you can consume the context values using `useContext`: ```jsx -import { useContext } from "solid-js" +import { useContext } from "solid-js"; const TaskList = () => { - const { state, setState } = useContext(TaskContext) + const { state, setState } = useContext(TaskContext); // Now you can use the shared state and functions -} +}; ``` For a deeper dive, please refer to our dedicated [page on context](/concepts/context). diff --git a/src/routes/guides/data.json b/src/routes/guides/data.json index 364f3f925..b31c85258 100644 --- a/src/routes/guides/data.json +++ b/src/routes/guides/data.json @@ -7,7 +7,7 @@ "routing-and-navigation.mdx", "complex-state-management.mdx", "fetching-data.mdx", - "testing.mdx", + "testing.mdx", "deploying-your-app.mdx", "deployment-options" ] diff --git a/src/routes/guides/deploying-your-app.mdx b/src/routes/guides/deploying-your-app.mdx index 74eb708ae..987a36bb0 100644 --- a/src/routes/guides/deploying-your-app.mdx +++ b/src/routes/guides/deploying-your-app.mdx @@ -1,6 +1,17 @@ --- title: Deploy your app order: 9 +use_cases: "production deployment, hosting, going live, app publishing, cloud deployment" +tags: + - deployment + - hosting + - production + - cloud + - publishing +version: "1.0" +description: >- + Deploy your Solid application to popular hosting platforms including + Cloudflare, Vercel, Netlify, AWS, and more with guides. --- Are you ready to deploy your Solid application? Follow our guides for different deployment services. diff --git a/src/routes/guides/deployment-options/aws-via-flightcontrol.mdx b/src/routes/guides/deployment-options/aws-via-flightcontrol.mdx index 2b094ecd3..5332ec5fa 100644 --- a/src/routes/guides/deployment-options/aws-via-flightcontrol.mdx +++ b/src/routes/guides/deployment-options/aws-via-flightcontrol.mdx @@ -2,6 +2,20 @@ title: AWS via Flightcontrol order: 1 mainNavExclude: true +use_cases: >- + aws deployment, automated deployments, continuous integration, github + integration, cloud hosting +tags: + - aws + - deployment + - flightcontrol + - automation + - github + - hosting +version: "1.0" +description: >- + Deploy Solid apps to AWS with Flightcontrol's automated platform featuring + GitHub integration and continuous deployment. --- [Flightcontrol](https://www.flightcontrol.dev/) is a platform that fully automates deployments to Amazon Web Services (AWS). diff --git a/src/routes/guides/deployment-options/aws-via-sst.mdx b/src/routes/guides/deployment-options/aws-via-sst.mdx index 3af978a20..218ed0aa3 100644 --- a/src/routes/guides/deployment-options/aws-via-sst.mdx +++ b/src/routes/guides/deployment-options/aws-via-sst.mdx @@ -2,6 +2,20 @@ title: AWS via SST order: 1 mainNavExclude: true +use_cases: >- + serverless deployment, aws lambda, container deployment, cloud infrastructure, + production deployment +tags: + - aws + - sst + - serverless + - lambda + - deployment + - containers +version: "1.0" +description: >- + Deploy SolidStart apps to AWS Lambda or containers using SST framework with + streamlined configuration and deployment. --- [SST](https://sst.dev/) is a framework for deploying applications to any cloud provider. It has a built-in way to deploy SolidStart apps to AWS Lambda. For additional details, you can [visit their docs](https://sst.dev/docs/). @@ -20,7 +34,7 @@ sst@latest init ```ts title="app.config.ts" server: { - preset: "aws-lambda-streaming" + preset: "aws-lambda-streaming"; } ``` diff --git a/src/routes/guides/deployment-options/cloudflare.mdx b/src/routes/guides/deployment-options/cloudflare.mdx index b7deb79c4..69844857a 100644 --- a/src/routes/guides/deployment-options/cloudflare.mdx +++ b/src/routes/guides/deployment-options/cloudflare.mdx @@ -2,6 +2,20 @@ title: Cloudflare order: 2 mainNavExclude: true +use_cases: >- + static site hosting, jamstack deployment, edge deployment, cdn hosting, web + publishing +tags: + - cloudflare + - pages + - deployment + - wrangler + - hosting + - jamstack +version: "1.0" +description: >- + Deploy Solid apps to Cloudflare Pages for fast, global edge hosting with + built-in CDN and simple Git integration setup. --- [Cloudflare Pages](https://pages.cloudflare.com/) is a JAMstack platform for frontend developers, where JAMstack stands for JavaScript, APIs, and Markup. @@ -80,7 +94,3 @@ wrangler pages deploy dist After running these commands, your project should be live. While the terminal may provide a link, it's more reliable to check your Cloudflare Pages dashboard for the deployed URL, which usually follows the format `project-name.pages.dev`. - -**Note:** -Make sure to navigate to the `Speed` -> `Optimization settings` section in your Cloudflare website dashboard and disable the `Auto Minify` option. -This is important as minification and comment removal can interfere with hydration. diff --git a/src/routes/guides/deployment-options/firebase.mdx b/src/routes/guides/deployment-options/firebase.mdx index 4908e29b7..3e41bda1c 100644 --- a/src/routes/guides/deployment-options/firebase.mdx +++ b/src/routes/guides/deployment-options/firebase.mdx @@ -2,6 +2,20 @@ title: Firebase order: 3 mainNavExclude: true +use_cases: >- + google cloud hosting, static hosting, firebase integration, web app + deployment, production hosting +tags: + - firebase + - google + - deployment + - hosting + - cli + - static +version: "1.0" +description: >- + Host your Solid application on Firebase with Google's infrastructure for + reliable static site hosting and easy deployment. --- [Firebase](https://firebase.google.com/) is an all-in-one app development platform by Google, offering a range of services from real-time databases to user authentication. diff --git a/src/routes/guides/deployment-options/netlify.mdx b/src/routes/guides/deployment-options/netlify.mdx index bff4a337b..8df46a343 100644 --- a/src/routes/guides/deployment-options/netlify.mdx +++ b/src/routes/guides/deployment-options/netlify.mdx @@ -2,6 +2,20 @@ title: Netlify order: 4 mainNavExclude: true +use_cases: >- + static site hosting, continuous deployment, git integration, web publishing, + jamstack hosting +tags: + - netlify + - deployment + - hosting + - git + - cli + - static +version: "1.0" +description: >- + Deploy Solid apps to Netlify with automatic builds from Git, instant + rollbacks, and powerful deployment features included. --- [Netlify](https://www.netlify.com/) is a widely-used hosting platform suitable for various types of projects. diff --git a/src/routes/guides/deployment-options/railway.mdx b/src/routes/guides/deployment-options/railway.mdx index fdc29fd7f..5dc90ab84 100644 --- a/src/routes/guides/deployment-options/railway.mdx +++ b/src/routes/guides/deployment-options/railway.mdx @@ -2,6 +2,20 @@ title: Railway order: 5 mainNavExclude: true +use_cases: >- + web app deployment, cloud hosting, github deployment, production hosting, + quick deployment +tags: + - railway + - deployment + - hosting + - cloud + - github + - cli +version: "1.0" +description: >- + Deploy Solid projects to Railway platform with GitHub integration, custom + domains, and straightforward deployment process. --- [Railway](https://railway.app/) is a well-known platform for deploying a variety of web and cloud-based projects. diff --git a/src/routes/guides/deployment-options/stormkit.mdx b/src/routes/guides/deployment-options/stormkit.mdx index 3c8b99749..10ef8df83 100644 --- a/src/routes/guides/deployment-options/stormkit.mdx +++ b/src/routes/guides/deployment-options/stormkit.mdx @@ -2,6 +2,20 @@ title: Stormkit order: 7 mainNavExclude: true +use_cases: >- + spa deployment, serverless functions, static hosting, git deployment, + production hosting +tags: + - stormkit + - deployment + - hosting + - serverless + - spa + - static +version: "1.0" +description: >- + Deploy Solid apps as static sites or SPAs on Stormkit with serverless + functions support and Git provider integration. --- [Stormkit](https://www.stormkit.io) is a deployment platform for static websites, single-page applications (SPAs), and serverless functions. @@ -14,7 +28,7 @@ mainNavExclude: true 4. Verify the build command in your Stormkit configuration. By default, Stormkit CI will run `npm run build` but you can specify a custom build command on this page. -5. Check output folder, unless its specified Stormkit will try to upload contents of build folder. +5. Check output folder, unless its specified Stormkit will try to upload contents of build folder. 6. Click the β€œDeploy Now” button to deploy your site. Stormkit CI will build your code and upload contents of it. diff --git a/src/routes/guides/deployment-options/vercel.mdx b/src/routes/guides/deployment-options/vercel.mdx index 7a68e272c..b5e389f9f 100644 --- a/src/routes/guides/deployment-options/vercel.mdx +++ b/src/routes/guides/deployment-options/vercel.mdx @@ -2,6 +2,20 @@ title: Vercel order: 6 mainNavExclude: true +use_cases: >- + deploying to production, hosting solid apps, ci/cd setup, automatic + deployments, serverless functions +tags: + - deployment + - hosting + - vercel + - production + - ci/cd + - serverless +version: "1.0" +description: >- + Deploy SolidStart apps to Vercel with automatic builds, serverless functions, + and GitHub integration for seamless production hosting. --- [Vercel](https://vercel.com/) is a widely-used platform specialized in hosting frontend projects. diff --git a/src/routes/guides/deployment-options/zerops.mdx b/src/routes/guides/deployment-options/zerops.mdx index bdad800a5..bd2c7d799 100644 --- a/src/routes/guides/deployment-options/zerops.mdx +++ b/src/routes/guides/deployment-options/zerops.mdx @@ -2,6 +2,21 @@ title: Zerops order: 7 mainNavExclude: true +use_cases: >- + deploying solid apps, static site hosting, ssr deployment, node.js hosting, + production deployment +tags: + - deployment + - hosting + - zerops + - static + - ssr + - node.js + - production +version: "1.0" +description: >- + Deploy SolidStart apps to Zerops cloud platform with support for both static + sites and SSR Node.js applications in production. --- [Zerops](https://zerops.io) is a dev-first cloud platform that can be used to deploy both Static and SSR Solid Node.js Apps. @@ -9,6 +24,7 @@ mainNavExclude: true For additional one-to-one support, details, and features, you can join the [Zerops Discord server](https://discord.gg/xxzmJSDKPT) and [visit the Zerops Docs](https://docs.zerops.io). Deploy and test Zerops Solid recipes with one click: + - [Deploy Solid Node.js & Static Together](https://app.zerops.io/recipe/solidjs) - [Node.js](https://github.com/zeropsio/recipe-solidjs-nodejs) and [Static](https://github.com/zeropsio/recipe-solidjs-static). - [Deploy Solid Node.js](https://app.zerops.io/recipe/solidjs-nodejs) - [Source Repository](https://github.com/zeropsio/recipe-solidjs-nodejs) - [Deploy Solid Static](https://app.zerops.io/recipe/solidjs-static) - [Source Repository](https://github.com/zeropsio/recipe-solidjs-static) @@ -28,11 +44,13 @@ There are two ways to set up a Zerops project and a service: 3. You'll be redirected to a page where you can choose a service. ##### For Static: + 1. Choose Static. 2. Scroll down and change the hostname to your preference. 3. Scroll down and click on the "Add New Static" button. ##### For SSR - Node.js: + 1. Choose `Node.js` and select `version 20`. 2. Scroll down and change the hostname to your preference. 3. Scroll down and click on the "Add New Node.js" button. @@ -44,6 +62,7 @@ There are two ways to set up a Zerops project and a service: 1. Go to your [Zerops dashboard](https://app.zerops.io/dashboard/projects) and click on your profile icon if you are a new user. If not, check your sidebar and click on `Import Project`. ##### Static: + ```yaml project: name: recipe-solidjs @@ -55,6 +74,7 @@ services: ``` ##### SSR - Node.js: + ```yaml project: name: recipe-solidjs @@ -66,6 +86,7 @@ services: ``` ## Add zerops.yml to your repository + The `zerops.yml` configuration file is used to tell Zerops how to build and run your application, it should be placed to the root of your appplication's repository. Example for **SSR (Server-Side Rendering)** Apps: @@ -110,18 +131,19 @@ zerops: run: base: static ``` + Push the changes to your GitHub/GitLab repository (necessary if you are planning to use GitHub/GitLab). ## Deploying your apps ### Triggering the pipeline automatically by connecting Github/Gitlab repository -You can push your project by [Triggering the pipeline using Zerops CLI](#triggering-the-pipeline-using-githubgitlab) or by connecting the app service with your [GitHub](https://docs.zerops.io/references/github-integration/) / [GitLab](https://docs.zerops.io/references/gitlab-integration) repository from inside the service detail. - +You can push your project by [Triggering the pipeline using Zerops CLI](#triggering-the-pipeline-using-githubgitlab) or by connecting the app service with your [GitHub](https://docs.zerops.io/references/github-integration/) / [GitLab](https://docs.zerops.io/references/gitlab-integration) repository from inside the service detail. ### Triggering the pipeline manually using Zerops CLI To download the zCLI binary directly, use [zCLI/releases](https://github.com/zeropsio/zcli/releases) or: + 1. Install the Zerops CLI using Terminal. Linux/MacOS @@ -144,10 +166,13 @@ Npm 2. Open Settings > [Access Token Management](https://app.zerops.io/settings/token-management) in the Zerops app and generate a new access token. 3. Log in using your access token with the following command: + ```bash zcli login ``` + 4. Navigate to the root of your app (where zerops.yml is located) and run the following command in Terminal to trigger the deploy: + ```bash zcli push ``` diff --git a/src/routes/guides/fetching-data.mdx b/src/routes/guides/fetching-data.mdx index 8bf0f9e24..c07b8fa1c 100644 --- a/src/routes/guides/fetching-data.mdx +++ b/src/routes/guides/fetching-data.mdx @@ -1,6 +1,21 @@ --- title: Fetching data order: 3 +use_cases: >- + api calls, async data loading, server communication, external data fetching, + loading states, error handling +tags: + - data + - fetching + - async + - api + - createresource + - suspense + - loading +version: "1.0" +description: >- + Master data fetching in Solid with createResource for async operations, + loading states, error handling, and Suspense boundaries. --- For most modern web applications, data fetching is a common task. @@ -23,11 +38,12 @@ These properties can be used to conditionally render JSX based on the current re The fetcher function that is created makes a call to get a user, which is then passed in as an argument to `createResource`. The signal returned from the `createResource` provides the properties that can assist with conditional rendering based on the current reactive state: -* `state`: The current status of the operation (`unresolved`, `pending`, `ready`, `refreshing`, or `errored`). -* `loading`: Indicates that the operation is currently in progress via a `boolean`. -* `error`: If the operation fails for any reason, this property will contain information about this error. -It may be a string with an error message, or an object with more detailed information. -* `latest`: The most recent data or result returned from the operation. + +- `state`: The current status of the operation (`unresolved`, `pending`, `ready`, `refreshing`, or `errored`). +- `loading`: Indicates that the operation is currently in progress via a `boolean`. +- `error`: If the operation fails for any reason, this property will contain information about this error. + It may be a string with an error message, or an object with more detailed information. +- `latest`: The most recent data or result returned from the operation. When there is a change in the source signal, an internal fetch process is triggered to retrieve new data based on this change. @@ -35,35 +51,35 @@ When there is a change in the source signal, an internal fetch process is trigge import { createSignal, createResource, Switch, Match, Show } from "solid-js"; const fetchUser = async (id) => { - const response = await fetch(`https://swapi.dev/api/people/${id}/`); - return response.json(); -} + const response = await fetch(`https://swapi.dev/api/people/${id}/`); + return response.json(); +}; function App() { - const [userId, setUserId] = createSignal(); - const [user] = createResource(userId, fetchUser); - - return ( -
    - setUserId(e.currentTarget.value)} - /> - -

    Loading...

    -
    - - - Error: {user.error} - - -
    {JSON.stringify(user())}
    -
    -
    -
    - ); + const [userId, setUserId] = createSignal(); + const [user] = createResource(userId, fetchUser); + + return ( +
    + setUserId(e.currentTarget.value)} + /> + +

    Loading...

    +
    + + + Error: {user.error} + + +
    {JSON.stringify(user())}
    +
    +
    +
    + ); } ``` @@ -77,12 +93,11 @@ However, if there's an error while fetching, the `user.error` block becomes `tru :::tip If you anticipate errors, you may want to wrap `createResource` in an [ErrorBoundary](/reference/components/error-boundary). - + ::: In addition to the `error` property, the `loading` property offers a way to display a loading state to the user during the fetch operation. - ## Calling multiple async events Although you can use `createResource` independently, Solid provides an alternative method for synchronizing the display of multiple asynchronous events. @@ -90,37 +105,43 @@ Although you can use `createResource` independently, Solid provides an alternati It allows you to display a fallback placeholder while waiting for all asynchronous events to resolve, preventing the display of partially loaded content: ```jsx -import { createSignal, createResource, Switch, Match, Suspense } from "solid-js"; +import { + createSignal, + createResource, + Switch, + Match, + Suspense, +} from "solid-js"; const fetchUser = async (id) => { - const response = await fetch(`https://swapi.dev/api/people/${id}/`); - return response.json(); -} + const response = await fetch(`https://swapi.dev/api/people/${id}/`); + return response.json(); +}; function App() { - const [userId, setUserId] = createSignal(); - const [user] = createResource(userId, fetchUser); - - return ( -
    - setUserId(e.currentTarget.value)} - /> - Loading...
    }> - - - Error: {user.error.message} - - -
    {JSON.stringify(user())}
    -
    -
    - -
    - ); + const [userId, setUserId] = createSignal(); + const [user] = createResource(userId, fetchUser); + + return ( +
    + setUserId(e.currentTarget.value)} + /> + Loading...
    }> + + + Error: {user.error.message} + + +
    {JSON.stringify(user())}
    +
    +
    + +
    + ); } ``` @@ -146,30 +167,26 @@ This functionality is particularly valuable in applications like task lists. For example, when users input a new task and click the `Add` button, the list will refresh immediately, regardless of the ongoing data communication with the server. ```jsx -import { For, createResource } from "solid-js" +import { For, createResource } from "solid-js"; function TodoList() { - const [tasks, { mutate }] = createResource(fetchTasksFromServer); - - return ( - <> -
      - - {(task) => ( -
    • {task.name}
    • - )} -
      -
    - - - ); + const [tasks, { mutate }] = createResource(fetchTasksFromServer); + + return ( + <> +
      + {(task) =>
    • {task.name}
    • }
      +
    + + + ); } ``` @@ -179,14 +196,14 @@ When real-time feedback is necessary, the `refetch` method can be used to reload This method can be particularly useful when data is constantly evolving, such as with real-time financial applications. ```jsx -import { createResource, onCleanup } from "solid-js" +import { createResource, onCleanup } from "solid-js"; function StockPriceTicker() { - const [prices, { refetch }] = createResource(fetchStockPrices); + const [prices, { refetch }] = createResource(fetchStockPrices); - const timer = setInterval(() => { - refetch() - }, 1000); - onCleanup(() => clearInterval(timer)) + const timer = setInterval(() => { + refetch(); + }, 1000); + onCleanup(() => clearInterval(timer)); } ``` diff --git a/src/routes/guides/routing-and-navigation.mdx b/src/routes/guides/routing-and-navigation.mdx index 1772310ba..2f1c991d8 100644 --- a/src/routes/guides/routing-and-navigation.mdx +++ b/src/routes/guides/routing-and-navigation.mdx @@ -1,6 +1,21 @@ --- title: Routing & navigation order: 4 +use_cases: >- + page navigation, url routing, spa routing, dynamic routes, nested layouts, + route parameters, lazy loading pages +tags: + - routing + - navigation + - routes + - spa + - lazy-loading + - parameters + - layouts +version: "1.0" +description: >- + Implement client-side routing in Solid apps with dynamic routes, nested + layouts, route parameters, and lazy-loaded components. --- [Solid Router](/solid-router) simplifies routing in Solid applications to help developers manage navigation and rendering by defining routes using JSX or objects passed via props. @@ -275,8 +290,7 @@ Instead of checking for the presence of a parameter, this allows for more comple ```jsx import { lazy } from "solid-js"; import { render } from "solid-js/web"; -import { Router, Route } from "@solidjs/router"; -import type { SegmentValidators } from "./types"; +import { Router, Route, type MatchFilters } from "@solidjs/router"; const User = lazy(() => import("./pages/User")); @@ -447,8 +461,7 @@ The preload function is then passed in the `` definition: You can export preload functions and data wrappers that correspond to routes from a dedicated `[route].data.js` or `[route].data.ts` file. This pattern provides a way to import the data function without loading anything else. -```jsx -// src/pages/users/[id].data.js +```tsx title="src/pages/users/[id].data.js" import { query } from "@solidjs/router"; export const getUser = query(async (id) => { @@ -468,8 +481,8 @@ The value of a preload function is passed to the page component when called at a This means you can initialize the page, or use [Data APIs](/solid-router/reference/data-apis/create-async). :::note - To prevent a fetch from happening more than once, or to trigger a refetch, you - can use the [`query` function](/solid-router/reference/data-apis/query). +To prevent a fetch from happening more than once, or to trigger a refetch, you +can use the [`query` function](/solid-router/reference/data-apis/query). ::: ```jsx title="index.jsx" @@ -493,10 +506,9 @@ render( ``` `[id].jsx` contains the component that gets rendered. -When you wrap the function within [`createAsync`](/solid-router/reference/data-apis/create-async) with the imported function, it will yield [a signal](/routes/concepts/signals) once the anticipated promise resolves. +When you wrap the function within [`createAsync`](/solid-router/reference/data-apis/create-async) with the imported function, it will yield [a signal](/concepts/signals) once the anticipated promise resolves. -```jsx -// [id].jsx +```tsx title="[id].tsx" import { createAsync } from "@solidjs/router"; import { getUser } from "./[id].data"; diff --git a/src/routes/guides/state-management.mdx b/src/routes/guides/state-management.mdx index b24814b16..c09d3d3c2 100644 --- a/src/routes/guides/state-management.mdx +++ b/src/routes/guides/state-management.mdx @@ -1,6 +1,21 @@ --- title: State management order: 2 +use_cases: >- + managing app state, component communication, data flow, reactive updates, + shared state, derived values +tags: + - state + - signals + - reactivity + - data-flow + - memos + - effects + - management +version: "1.0" +description: >- + Learn Solid's state management with signals, derived values, memos, and + effects for reactive data flow and component updates. --- State management is the process of handling and manipulating data that affects the behavior and presentation of a web application. @@ -159,7 +174,7 @@ Derived values can be created using a signal within a function, which can be ref This approach can be used to simplify the `doubleCount` example above, where the additional signal and effect can be replaced with a derived signal: ```jsx del={5, 11-13} ins={15} -import { createSignal } from "solid-js" +import { createSignal } from "solid-js"; function Counter() { const [count, setCount] = createSignal(0); @@ -173,7 +188,7 @@ function Counter() { setDoubleCount(count() * 2); // Update doubleCount whenever count changes }); - const doubleCount = () => count() * 2 + const doubleCount = () => count() * 2; return ( <> @@ -190,20 +205,20 @@ While this approach works for simple use cases, if `doubleCount` is used several The derived signal would be re-evaluated not just each time `count` is changed, but also for each use of `doubleCount()`. ```jsx del={10} ins={11-14, 20-21} -import { createSignal } from "solid-js" +import { createSignal } from "solid-js"; function Counter() { - const [count, setCount] = createSignal(0) + const [count, setCount] = createSignal(0); const increment = () => { - setCount(count() + 1) - } + setCount(count() + 1); + }; - const doubleCount = () => count() * 2 + const doubleCount = () => count() * 2; const doubleCount = () => { - console.log('doubleCount called') - return count() * 2 - } + console.log("doubleCount called"); + return count() * 2; + }; return ( <> @@ -213,7 +228,7 @@ function Counter() {
    Doubled count: {doubleCount()}
    - ) + ); } ``` @@ -229,24 +244,24 @@ When using a memo, the calculation will only run **once** when the value of `cou Using the [`createMemo`](/reference/basic-reactivity/create-memo) function, you can create a memoized value: ```jsx ins={15-18, 26-28} ins=", createMemo" -import { createSignal, createMemo } from "solid-js" +import { createSignal, createMemo } from "solid-js"; function Counter() { - const [count, setCount] = createSignal(0) + const [count, setCount] = createSignal(0); const increment = () => { setCount((prev) => prev + 1); }; const doubleCount = () => { - console.log('doubleCount called') - return count() * 2 - } + console.log("doubleCount called"); + return count() * 2; + }; const doubleCountMemo = createMemo(() => { - console.log('doubleCountMemo called') - return count() * 2 - }) + console.log("doubleCountMemo called"); + return count() * 2; + }); return ( <> diff --git a/src/routes/guides/styling-components/css-modules.mdx b/src/routes/guides/styling-components/css-modules.mdx index 98c704d8b..15e6a374c 100644 --- a/src/routes/guides/styling-components/css-modules.mdx +++ b/src/routes/guides/styling-components/css-modules.mdx @@ -2,6 +2,20 @@ title: CSS modules order: 3 mainNavExclude: true +use_cases: >- + component styling, scoped styles, style encapsulation, preventing css + conflicts, modular css +tags: + - styling + - css + - modules + - scoped + - components + - encapsulation +version: "1.0" +description: >- + Use CSS Modules in Solid for locally scoped styles, preventing global + conflicts and ensuring component style encapsulation. --- CSS Modules are CSS files where class names, animations, and media queries are scoped locally by default. diff --git a/src/routes/guides/styling-components/less.mdx b/src/routes/guides/styling-components/less.mdx index 7509fe916..e04cb2a56 100644 --- a/src/routes/guides/styling-components/less.mdx +++ b/src/routes/guides/styling-components/less.mdx @@ -2,6 +2,20 @@ title: LESS order: 2 mainNavExclude: true +use_cases: >- + css preprocessing, style variables, mixins, nested styles, programmatic + styling +tags: + - styling + - less + - preprocessor + - variables + - mixins + - css +version: "1.0" +description: >- + Integrate LESS preprocessor in Solid apps for variables, mixins, and + programmatic CSS features to write cleaner stylesheets. --- [LESS](https://lesscss.org/) is a preprocessor based on JavaScript. diff --git a/src/routes/guides/styling-components/macaron.mdx b/src/routes/guides/styling-components/macaron.mdx index 16ac4ad9c..1b980a119 100644 --- a/src/routes/guides/styling-components/macaron.mdx +++ b/src/routes/guides/styling-components/macaron.mdx @@ -2,6 +2,20 @@ title: Macaron order: 4 mainNavExclude: true +use_cases: >- + css-in-js styling, type-safe styles, styled components, variant-based styling, + compile-time css +tags: + - styling + - css-in-js + - macaron + - styled-components + - typescript + - variants +version: "1.0" +description: >- + Style Solid components with Macaron's compile-time CSS-in-JS, offering + type-safe styled components and variant-based styling. --- [Macaron](https://macaron.js.org/) is compile-time CSS-in-JS library that offers type safety. diff --git a/src/routes/guides/styling-components/sass.mdx b/src/routes/guides/styling-components/sass.mdx index becc12cd2..48edfc3c6 100644 --- a/src/routes/guides/styling-components/sass.mdx +++ b/src/routes/guides/styling-components/sass.mdx @@ -2,6 +2,21 @@ title: SASS order: 1 mainNavExclude: true +use_cases: >- + css preprocessing, nested styles, style variables, mixins, scss syntax, + modular styling +tags: + - styling + - sass + - scss + - preprocessor + - variables + - css + - mixins +version: "1.0" +description: >- + Configure SASS/SCSS in Solid projects for advanced CSS preprocessing with + variables, nesting, mixins, and modular stylesheets. --- [SASS](https://sass-lang.com/) is a popular CSS preprocessor that makes authoring CSS easier. @@ -51,7 +66,7 @@ import "./card.scss"; function Card() { return ( <> -
    +
    Hello, world!
    diff --git a/src/routes/guides/styling-components/tailwind-v3.mdx b/src/routes/guides/styling-components/tailwind-v3.mdx index 3ae214d9a..c6d3b82f9 100644 --- a/src/routes/guides/styling-components/tailwind-v3.mdx +++ b/src/routes/guides/styling-components/tailwind-v3.mdx @@ -2,6 +2,20 @@ title: Tailwind CSS v3 order: 7 mainNavExclude: true +use_cases: >- + utility-first css, rapid prototyping, responsive design, consistent styling, + atomic css classes +tags: + - styling + - tailwind + - utility-css + - responsive + - postcss + - atomic-css +version: "1.0" +description: >- + Set up Tailwind CSS v3 in Solid apps for utility-first styling, rapid + development, and consistent responsive design patterns. --- [Tailwind CSS v3](https://v3.tailwindcss.com/) is an on-demand utility CSS library that integrates seamlessly with Solid as a built-in PostCSS plugin. @@ -10,7 +24,6 @@ mainNavExclude: true 1. Install Tailwind CSS as a development dependency: - ```package-install-dev tailwindcss@3 postcss autoprefixer ``` @@ -76,8 +89,8 @@ Update your components to use Tailwind's utility classes: /* src/components/Card.jsx */ function Card() { return ( -
    -
    +
    +
    Hello, world!
    diff --git a/src/routes/guides/styling-components/tailwind.mdx b/src/routes/guides/styling-components/tailwind.mdx index 5bee79841..6b2aa004d 100644 --- a/src/routes/guides/styling-components/tailwind.mdx +++ b/src/routes/guides/styling-components/tailwind.mdx @@ -2,6 +2,20 @@ title: Tailwind CSS order: 5 mainNavExclude: true +use_cases: >- + styling components, utility classes, rapid ui development, responsive design, + production builds +tags: + - styling + - css + - tailwind + - postcss + - utilities + - design +version: "1.0" +description: >- + Set up Tailwind CSS v4 in your Solid app for utility-first styling. Configure + PostCSS, import styles, and build responsive UIs efficiently. --- :::note @@ -24,8 +38,8 @@ tailwindcss @tailwindcss/postcss postcss export default { plugins: { "@tailwindcss/postcss": {}, - } -} + }, +}; ``` For a deeper dive into configuration, you can check out the [Tailwind Official Documentation](https://tailwindcss.com/docs/configuration). @@ -38,7 +52,6 @@ Add an `@import` to your `src/index.css` file that imports Tailwind CSS. @import "tailwindcss"; ``` - ## Import your CSS file Import your `index.css` file into the root `index.jsx` or `index.tsx` file: @@ -67,8 +80,8 @@ Update your components to use Tailwind's utility classes: /* src/components/Card.jsx */ function Card() { return ( -
    -
    +
    +
    Hello, world!
    diff --git a/src/routes/guides/styling-components/uno.mdx b/src/routes/guides/styling-components/uno.mdx index e79499cc3..98a33c03d 100644 --- a/src/routes/guides/styling-components/uno.mdx +++ b/src/routes/guides/styling-components/uno.mdx @@ -2,6 +2,19 @@ title: UnoCSS order: 6 mainNavExclude: true +use_cases: >- + styling components, utility css, on-demand styles, vite integration, atomic + css +tags: + - styling + - css + - unocss + - vite + - utilities +version: "1.0" +description: >- + Integrate UnoCSS with Solid for on-demand utility CSS. Configure Vite plugin, + import styles, and create efficient atomic CSS designs quickly. --- [UnoCSS](https://unocss.dev/) is an on-demand utility CSS library that integrates seamlessly with Solid as a Vite plugin. diff --git a/src/routes/guides/styling-your-components.mdx b/src/routes/guides/styling-your-components.mdx index 611acbf3f..3b541c046 100644 --- a/src/routes/guides/styling-your-components.mdx +++ b/src/routes/guides/styling-your-components.mdx @@ -1,6 +1,19 @@ --- title: Styling your components order: 1 +use_cases: >- + styling components, choosing css solutions, css frameworks, preprocessors, + css-in-js +tags: + - styling + - css + - preprocessors + - css-in-js + - frameworks +version: "1.0" +description: >- + Explore Solid's flexible styling options: CSS preprocessors, CSS Modules, + CSS-in-JS, and utility frameworks for component styling needs. --- Solid provides flexible and versatile ways to style your components. diff --git a/src/routes/guides/testing.mdx b/src/routes/guides/testing.mdx index 5452f276b..06bd88b8a 100644 --- a/src/routes/guides/testing.mdx +++ b/src/routes/guides/testing.mdx @@ -1,6 +1,19 @@ --- title: Testing order: 6 +use_cases: >- + testing components, unit tests, integration tests, user interactions, test + coverage, quality assurance +tags: + - testing + - vitest + - components + - unit-tests + - quality +version: "1.0" +description: >- + Test Solid apps with Vitest and Testing Library. Write component tests, + simulate user interactions, and ensure code quality effectively. --- Testing your Solid applications is important to inspiring confidence in your codebase through preventing regressions. @@ -15,7 +28,6 @@ Testing your Solid applications is important to inspiring confidence in your cod - [`@testing-library/user-event`](https://testing-library.com/docs/user-event/intro) - used to simulate user events that are closer to reality - [`@testing-library/jest-dom`](https://testing-library.com/docs/ecosystem-jest-dom) - augments expect with helpful matchers - ### Adding testing packages The recommended testing framework for Solid applications is [vitest](https://vitest.dev). @@ -56,15 +68,15 @@ If using TypeScript, add `@testing-library/jest-dom` to `tsconfig.json#compilerO When using [SolidStart](/solid-start), create a `vitest.config.ts` file: ```ts title="vitest.config.ts" -import solid from "vite-plugin-solid" -import { defineConfig } from "vitest/config" +import solid from "vite-plugin-solid"; +import { defineConfig } from "vitest/config"; export default defineConfig({ - plugins: [solid()], - resolve: { - conditions: ["development", "browser"], - }, -}) + plugins: [solid()], + resolve: { + conditions: ["development", "browser"], + }, +}); ``` ## Writing tests @@ -81,31 +93,27 @@ To write tests for your components, create a `[name].test.tsx` file. The purpose of this file is to describe the intended behavior from a user's perspective in the form of unit tests: ```jsx tab title="Counter.test.jsx" -import { test, expect } from "vitest" -import { render } from "@solidjs/testing-library" -import userEvent from "@testing-library/user-event" -import { Counter } from "./Counter" +import { test, expect } from "vitest"; +import { render } from "@solidjs/testing-library"; +import userEvent from "@testing-library/user-event"; +import { Counter } from "./Counter"; -const user = userEvent.setup() +const user = userEvent.setup(); test("increments value", async () => { - const { getByRole } = render(() => ) - const counter = getByRole('button') - expect(counter).toHaveTextContent("1") - await user.click(counter) - expect(counter).toHaveTextContent("2") -}) + const { getByRole } = render(() => ); + const counter = getByRole("button"); + expect(counter).toHaveTextContent("1"); + await user.click(counter); + expect(counter).toHaveTextContent("2"); +}); ``` ```jsx tab title="Counter.jsx" export const Counter = () => { - const [count, setCount] = createSignal(1); - return ( - - ); -} + const [count, setCount] = createSignal(1); + return ; +}; ``` In the `test.jsx` file, [the `render` call from `@solidjs/testing-library`](https://testing-library.com/docs/solid-testing-library/api#render) is used to render the component and supply the props and context. @@ -137,30 +145,31 @@ environment 880ms, prepare 212ms) #### Rendering the component -The `render` function from `@solidjs/testing-library` creates the testing environment within the `test.tsx` file. +The `render` function from `@solidjs/testing-library` creates the testing environment within the `test.tsx` file. It sets up the container, rendering the component within it, and automatically registers it for clean-up after a successful test. Additionally, it manages wrapping the component in contexts as well as setting up a router. ```tsx frame="none" const renderResult = render( - () => , // @solidjs/testing-library requires a function - { // all options are optional - container, // manually set up your own container, will not be handled - baseElement, // parent of container in case it is not supplied - queries, // manually set up custom queries - hydrate, // set to `true` to use hydration - wrapper, // reusable wrapper component to supply context - location, // sets up a router pointed to the location if provided - } -) + () => , // @solidjs/testing-library requires a function + { + // all options are optional + container, // manually set up your own container, will not be handled + baseElement, // parent of container in case it is not supplied + queries, // manually set up custom queries + hydrate, // set to `true` to use hydration + wrapper, // reusable wrapper component to supply context + location, // sets up a router pointed to the location if provided + } +); const { - asFragment, // function returning the contents of the container - baseElement, // the parent of the container - container, // the container in which the component is rendered - debug, // a function giving some helpful debugging output - unmount, // manually removing the component from the container - ...queries, // functions to select elements from the container -} = renderResult + asFragment, // function returning the contents of the container + baseElement, // the parent of the container + container, // the container in which the component is rendered + debug, // a function giving some helpful debugging output + unmount, // manually removing the component from the container + ...queries // functions to select elements from the container +} = renderResult; ``` ##### Using the right queries @@ -181,7 +190,7 @@ The prefixes (`get`, `query`, and `find`) and the middle portion (`By` and `AllB - **getAllBy**: synchronous, throws if not found, returns array of matches - **queryBy**: synchronous, null if not found, error if more than 1 matches - **queryAllBy**: synchronous, returns array of zero or more matches -- **findBy**: asynchronous, rejected if not found within 1000ms or more than 1 matches, resolves wth element if found +- **findBy**: asynchronous, rejected if not found within 1000ms or more than 1 matches, resolves with element if found - **findAllBy**: asynchronous, rejected if not found within 1000ms, resolves with array of one or more element(s) By default, queries should start with `get...`. @@ -190,7 +199,7 @@ If there are multiple elements matching the same query, `getAllBy...` should be There are two exceptions when you should **not** start with `get...`: 1. If the `location` option is used or the component is based on resources, the router will be lazy-loaded; in this case, the first query after rendering needs to be `find...` -2. When testing something that is *not* rendered, you will need to find something that will be rendered at the same time; after that, use `queryAllBy...` to test if the result is an empty array (`[]`). +2. When testing something that is _not_ rendered, you will need to find something that will be rendered at the same time; after that, use `queryAllBy...` to test if the result is an empty array (`[]`). The query's suffix (Role, LabelText, ...) depends on the characteristics of the element you want to select. If possible, try to select for accessible attributes (roughly in the following order): @@ -202,7 +211,7 @@ If possible, try to select for accessible attributes (roughly in the following o - **DisplayValue**: form elements showing the given value (e.g. select elements) - **AltText**: images with alt text - **Title**: HTML elements with the `title` attribute or SVGs with the `` tag containing the given text -- **TestId**: queries by the `data-testid` attribute; a different data attribute can be setup via `configure({testIdAttribute: 'data-my-test-attribute'})`; TestId-queries are *not accessible*, so use them only as a last resort. +- **TestId**: queries by the `data-testid` attribute; a different data attribute can be setup via `configure({testIdAttribute: 'data-my-test-attribute'})`; TestId-queries are _not accessible_, so use them only as a last resort. For more information, check the [testing-library documentation](https://testing-library.com/docs/queries/about). @@ -211,29 +220,33 @@ For more information, check the [testing-library documentation](https://testing- Solid allows components to break through the DOM tree structure using [`<Portal>`](/reference/components/portal). This mechanism will still work in testing, so the content of the portals will break out of the testing container. In order to test this content, make sure to use the `screen` export to query the contents: ```jsx tab title="Toast.test.jsx" -import { test, expect } from "vitest" -import { render, screen } from "@solidjs/testing-library" -import { Toast } from "./Toast" +import { test, expect } from "vitest"; +import { render, screen } from "@solidjs/testing-library"; +import { Toast } from "./Toast"; test("increments value", async () => { - render(() => <Toast><p>This is a toast</p></Toast>) - const toast = screen.getByRole("log") - expect(toast).toHaveTextContent("This is a toast") -}) + render(() => ( + <Toast> + <p>This is a toast</p> + </Toast> + )); + const toast = screen.getByRole("log"); + expect(toast).toHaveTextContent("This is a toast"); +}); ``` ```jsx tab title="Toast.jsx" import { Portal } from "solid-js/web"; export const Toast = (props) => { - return ( - <Portal> - <div class="toast" role={props.role ?? "log"}> - {props.children} - </div> - </Portal> - ); -} + return ( + <Portal> + <div class="toast" role={props.role ?? "log"}> + {props.children} + </div> + </Portal> + ); +}; ``` #### Testing in context @@ -241,15 +254,15 @@ export const Toast = (props) => { If a component relies on some context, to wrap it use the `wrapper` option: ```tsx title="Context.test.tsx" -import { test, expect } from "vitest" -import { render } from "@solidjs/testing-library" -import { DataContext, DataConsumer } from "./Data" +import { test, expect } from "vitest"; +import { render } from "@solidjs/testing-library"; +import { DataContext, DataConsumer } from "./Data"; -const wrapper = (props) => <DataContext value="test" {...props} /> +const wrapper = (props) => <DataContext value="test" {...props} />; test("receives data from context", () => { - const { getByText } = render(() => <DataConsumer />, { wrapper }) - expect(getByText("test")).toBeInTheDocument() + const { getByText } = render(() => <DataConsumer />, { wrapper }); + expect(getByText("test")).toBeInTheDocument(); }); ``` @@ -257,8 +270,9 @@ Wrappers can be re-used if they are created externally. For wrappers with different values, a higher-order component creating the required wrappers can make the tests more concise: ```tsx -const createWrapper = (value) => (props) => - <DataContext value={value} {...props}/> +const createWrapper = (value) => (props) => ( + <DataContext value={value} {...props} /> +); ``` :::note[Using multiple providers] @@ -272,10 +286,10 @@ Since the `<Router>` component is lazily loaded, the first query after rendering ```tsx const { findByText } = render( - () => <Route path="/article/:id" component={Article} />, - { location: "/article/12345" } + () => <Route path="/article/:id" component={Article} />, + { location: "/article/12345" } ); -expect(await findByText("Article 12345")).toBeInTheDocument() +expect(await findByText("Article 12345")).toBeInTheDocument(); ``` #### Interacting with components @@ -289,7 +303,6 @@ For example, this means that a `click` event from the user would be accompanied The most convenient events to test are typically `click`, `keyboard` and `pointer` (to simulate touch events). To dive deeper into these events, you can learn about them in the [`user-event` documentation](https://testing-library.com/docs/user-event/intro). - ##### Using timers If you require a fake timer and want to use `vi.useFakeTimers()` in your tests, it must set it up with an `advanceTimers` option: @@ -325,7 +338,7 @@ describe("pre-login: sign-in", () => { `vitest` comes with the `expect` function to facilitate assertions that works like: ```tsx frame="none" -expect(subject)[assertion](value) +expect(subject)[assertion](value); ``` The command supports assertions like `toBe` (reference comparison) and `toEqual` (value comparison) out of the box. @@ -338,25 +351,23 @@ For testing inside the DOM, the package `@testing-library/jest-dom` augments it - [`.toHaveAccessibleDescription(description)`](https://github.com/testing-library/jest-dom?tab=readme-ov-file#tohaveaccessibledescription) - checks accessible description - and a [lot more](https://github.com/testing-library/jest-dom?tab=readme-ov-file#custom-matchers). - ### Directive testing [Directives](/reference/jsx-attributes/use) are reusable behaviors for elements. They receive the HTML element they are bound to as their first and an accessor of the directive prop as their second argument. To make testing them more concise, [`@solidjs/testing-library` has a `renderDirective`](https://testing-library.com/docs/solid-testing-library/api#renderdirective) function: - ```ts frame="none" const renderResult = renderDirective(directive, { - initialValue, // value initially added to the argument signal - targetElement, // opt. node name or element used as target for the directive - ...renderOptions, // see render options -}) + initialValue, // value initially added to the argument signal + targetElement, // opt. node name or element used as target for the directive + ...renderOptions, // see render options +}); const { - arg, // getter for the directive's argument - setArg, // setter for the directive's argument - ...renderResults, // see render results -} = renderResult + arg, // getter for the directive's argument + setArg, // setter for the directive's argument + ...renderResults // see render results +} = renderResult; ``` In `...renderResults`, the container will contain the `targetElement`, which defaults to a `<div>`. @@ -365,31 +376,31 @@ This, along with the ability to modify the `arg` signal, are helpful when testin If, for example, you have a directive that handles the [Fullscreen API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API), you can test it like this: ```ts tab title="fullscreen.test.ts" -import { test, expect, vi } from "vitest" -import { renderDirective } from "@solidjs/testing-library" -import { createFullScreen } from "./fullscreen" +import { test, expect, vi } from "vitest"; +import { renderDirective } from "@solidjs/testing-library"; +import { createFullScreen } from "./fullscreen"; test("toggles fullscreen", () => { - const targetElement = document.createElement("div") - const fs = vi.spyOn(targetElement, "fullscreen") - const [setArg, container] = renderDirective(createFullScreen, false) - setArg(true) - expect(fs).toHaveBeenCalled() -}) + const targetElement = document.createElement("div"); + const fs = vi.spyOn(targetElement, "fullscreen"); + const [setArg, container] = renderDirective(createFullScreen, false); + setArg(true); + expect(fs).toHaveBeenCalled(); +}); ``` ```ts tab title="fullscreen.ts" -import { Accessor } from "solid-js" +import { Accessor } from "solid-js"; export const fullscreen = (ref: HTMLElement, active: Accessor<boolean>) => - createEffect(() => { - const isActive = document.fullscreenElement === ref - if (active() && !isActive) { - ref.requestFullScreen().catch(() => {}) - } else if (!active() && isActive) { - document.exitFullScreen() - } - }) + createEffect(() => { + const isActive = document.fullscreenElement === ref; + if (active() && !isActive) { + ref.requestFullScreen().catch(() => {}); + } else if (!active() && isActive) { + document.exitFullScreen(); + } + }); ``` ### Primitive testing @@ -400,32 +411,31 @@ To avoid this, there is a [`renderHook` utility](https://testing-library.com/doc ```ts frame="none" const renderResult = renderHook(hook, { - initialProps, // an array with arguments being supplied to the hook - wrapper, // same as the wrapper optionss for `render` -}) + initialProps, // an array with arguments being supplied to the hook + wrapper, // same as the wrapper optionss for `render` +}); const { - result, // return value of the hook (mutable, destructuring fixes it) - cleanup, // manually remove the traces of the test from the DOM - owner, // the owner running the hook to use with `runWithOwner()` -} = renderResult + result, // return value of the hook (mutable, destructuring fixes it) + cleanup, // manually remove the traces of the test from the DOM + owner, // the owner running the hook to use with `runWithOwner()` +} = renderResult; ``` A primitive that manages the state of a counter could be tested like this: ```ts frame="none" -import { test, expect } from "vitest" -import { renderHook } from "@solidjs/testing-library" -import { createCounter } from "./counter" +import { test, expect } from "vitest"; +import { renderHook } from "@solidjs/testing-library"; +import { createCounter } from "./counter"; test("increments count", () => { - const { result } = renderHook(createCounter) - expect(result.count).toBe(0) - result.increment() - expect(result.count).toBe(1) -}) + const { result } = renderHook(createCounter); + expect(result.count).toBe(0); + result.increment(); + expect(result.count).toBe(1); +}); ``` - ### Testing effects Since effects may happen asynchronously, it can be difficult to test them. @@ -436,19 +446,19 @@ Any errors that would hit the next boundary are used to reject the returned prom An example test using `testEffect` may look like this: ```ts frame="none" -const [value, setValue] = createSignal(0) -return testEffect(done => - createEffect((run: number = 0) => { - if (run === 0) { - expect(value()).toBe(0) - setValue(1) - } else if (run === 1) { - expect(value()).toBe(1) - done() - } - return run + 1 - }) -) +const [value, setValue] = createSignal(0); +return testEffect((done) => + createEffect((run: number = 0) => { + if (run === 0) { + expect(value()).toBe(0); + setValue(1); + } else if (run === 1) { + expect(value()).toBe(1); + done(); + } + return run + 1; + }) +); ``` ### Benchmarks @@ -457,40 +467,51 @@ While Solid offers performance simplified, it is good to validate if that promis Vitest offers an experimental `bench` function to run benchmarks and compare the results inside the same `describe` block; for example if you had a `<List>` flow component similar to `<For>`, you could benchmark it like this: - ```jsx title="list.bench.jsx" -describe('list rendering', () => { - const ITEMS = 1000 - const renderedFor = new Set() - const listFor = Array.from({ length: ITEMS }, (_, i) => i) - bench('For', () => new Promise((resolve) => { - const ItemFor = (props) => { - onMount(() => { - renderedFor.add(props.number) - if (renderedFor.size === ITEMS) { resolve() } - }) - return <span>{props.number}</span> - } - render(() => <For each={listFor}> - {(item) => <ItemFor number={item} />} - </For>) - })) - - const renderedList = new Set() - const listList = Array.from({ length: ITEMS }, (_, i) => i) - bench('List', () => new Promise((resolve) => { - const ItemList = (props) => { - onMount(() => { - renderedList.add(props.number) - if (renderedList.size === ITEMS) { resolve() } - }) - return <span>{props.number}</span> - } - render(() => <List each={listList}> - {(item) => <ItemList number={item} />} - </List>) - })) -}) +describe("list rendering", () => { + const ITEMS = 1000; + const renderedFor = new Set(); + const listFor = Array.from({ length: ITEMS }, (_, i) => i); + bench( + "For", + () => + new Promise((resolve) => { + const ItemFor = (props) => { + onMount(() => { + renderedFor.add(props.number); + if (renderedFor.size === ITEMS) { + resolve(); + } + }); + return <span>{props.number}</span>; + }; + render(() => ( + <For each={listFor}>{(item) => <ItemFor number={item} />}</For> + )); + }) + ); + + const renderedList = new Set(); + const listList = Array.from({ length: ITEMS }, (_, i) => i); + bench( + "List", + () => + new Promise((resolve) => { + const ItemList = (props) => { + onMount(() => { + renderedList.add(props.number); + if (renderedList.size === ITEMS) { + resolve(); + } + }); + return <span>{props.number}</span>; + }; + render(() => ( + <List each={listList}>{(item) => <ItemList number={item} />}</List> + )); + }) + ); +}); ``` Running `[npm|pnpm|yarn] test bench` will then execute the benchmark function: @@ -513,7 +534,6 @@ Running `[npm|pnpm|yarn] test bench` will then execute the benchmark function: Please keep in mind that it is very difficult to create meaningful benchmarks. The numbers should always be taken with a grain of salt, but can still indicate performance degradations if compared between versions. - ### Test coverage While coverage numbers can be misleading, they are used by many projects as a rough measurement of code quality. @@ -525,7 +545,6 @@ Vitest supports coverage collection. To use it, it needs an extra package: Also, you need to [set up vitest's coverage feature](https://vitest.dev/guide/coverage.html). - ### Integration/E2E testing Some issues can only be found once the code is running in the environment it is supposed to run in. diff --git a/src/routes/index.mdx b/src/routes/index.mdx index bc137a50e..57da3f848 100644 --- a/src/routes/index.mdx +++ b/src/routes/index.mdx @@ -1,6 +1,21 @@ --- -title: Overview +title: Solid Docs +nav_title: Overview +titleTemplate: ":title" mainNavExclude: true +use_cases: >- + getting started, learning solid, understanding framework, first project, + introduction +tags: + - introduction + - overview + - getting-started + - basics + - framework +version: "1.0" +description: >- + Solid is a reactive JavaScript framework for building fast, efficient UIs. + Learn about fine-grained reactivity and modern web development. --- # Overview @@ -36,7 +51,7 @@ This combination of features makes it a great choice to build responsive and hig ## Quick links -<div class="flex flex-col md:grid md:grid-cols-2 md:grid-rows-2 gap-3"> +<div class="flex flex-col gap-3 md:grid md:grid-cols-2 md:grid-rows-2"> <QuickLinks title="Tutorial" href="https://www.solidjs.com/tutorial/introduction_basics" diff --git a/src/routes/pt-br/index.mdx b/src/routes/pt-br/index.mdx deleted file mode 100644 index 04694517e..000000000 --- a/src/routes/pt-br/index.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: SumΓ‘rio -mainNavExclude: true ---- - -# SumΓ‘rio - -Solid is a modern JavaScript framework designed to build responsive and high-performing user interfaces (UI). -It prioritizes a simple and predictable development experience, making it a great choice for developers of all skill levels. - -## What is Solid? - -As a JavaScript framework, Solid embraces reactivity and fine-grained updates. - -Reactivity, in programming, refers to an applications' ability to respond to changes in data or user interactions. - -Traditionally, when a change occurs, the entire web page would need to reload to display the updated information. -In contrast, when using a fine-grained reactive system, updates are only applied to the parts of the page that need to be updated. - -Solid adopts the concept of fine-grained reactivity, updating only when the data the application depends on changes. -This decreases work and can result in faster load times and a smoother user experience overall. - -## Advantages of using Solid - -- **Performant**: Fine-grained reactivity allows Solid to update only what has changed, resulting in faster load times and smoother performance overall. - -- **Powerful**: Using less memory and processing power, Solid is capable of creating complex applications without compromising on functionality. - This also gives developers the flexibility over how and when updates happen. - -- **Pragmatic**: Rather than sticking to rigid structures or methods, Solid provides the freedom to choose the strategies and practices that work best for you. - -- **Productive**: Regardless of experience level, Solid's clear and predictable API makes developers' work simpler and more efficient. - -Solid aims to strike a balance between speed, efficiency, power, and flexibility, all while providing a developer-friendly environment. -This combination of features makes it a great choice to build responsive and high-performing UIs. - -## Quick links - -<div class="flex flex-col md:grid md:grid-cols-2 md:grid-rows-2 gap-3"> - <QuickLinks - title="Tutorial" - href="https://www.solidjs.com/tutorial/introduction_basics" - icon="learn" - > - Learn the basics of Solid through this interactive tutorial. - </QuickLinks> - <QuickLinks - title="Templates" - href="https://github.com/solidjs/templates" - icon="template" - > - Start your first project with a template that fits your needs. - </QuickLinks> - <QuickLinks - title="Ecosystem" - href="https://www.solidjs.com/ecosystem" - icon="community" - > - Explore the Solid ecosystem and find useful tools and libraries. - </QuickLinks> - <QuickLinks - title="Contribute" - href="https://github.com/solidjs/solid-docs-next" - icon="learn" - > - Help improve Solid by contributing to the documentation. - </QuickLinks> -</div> - -_Find our API documentation under the **Reference** tab_ - -Join the [Solid community on Discord](https://discord.com/invite/solidjs) to share your projects or get help from our community! - -<EditPageLink /> -<PageIssueLink /> diff --git a/src/routes/pt-br/quick-start.mdx b/src/routes/pt-br/quick-start.mdx deleted file mode 100644 index 17eaf23fe..000000000 --- a/src/routes/pt-br/quick-start.mdx +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: ComeΓ§o rΓ‘pido ---- - -## Solid playgrounds - -Experimente Solid in your browser by visiting our [interactive playground](https://playground.solidjs.com/). - -Additionally, we offer a [JavaScript](https://stackblitz.com/github/solidjs/templates/tree/master/js) and [TypeScript](https://stackblitz.com/github/solidjs/templates/tree/master/ts) Stackblitz starters, which provide a web-based development environment to get you started. - -## Creating a Solid application - -:::note[Prerequisites] - - - Familiarity with the command line - - Install [Node.js](https://nodejs.org/en) - -::: - -Solid offers convenient project templates that can help kickstart your development. -To get an application running, follow the steps below based on the language you prefer to use. - -### For JavaScript projects - -1. Run the following command in your terminal to get the JavaScript starter template: - -```bash frame="none" -npx degit solidjs/templates/js my-app -``` - -2. Navigate to your application's directory: - -```bash frame="none" -cd my-app -``` - -3. Install the necessary dependencies: - -```package-install-local -``` - -4. Run the application: - -```bash frame="none" -npm run dev -``` - -This will start the development server. -Now, you can open your browser and navigate to `localhost:3000` to see your application running. - -### For TypeScript projects - -1. To use a TypeScript template, run the following command in your terminal: - -```bash frame="none" -npx degit solidjs/templates/ts my-app -``` - -2. Navigate to your application's directory: - -```bash frame="none" -cd my-app -``` - -3. Install the necessary dependencies: - -```package-install-local -``` - -4. Run the application: - -```bash frame="none" -npm run dev -``` - -This will start the development server. -Now, you can open your browser and navigate to `localhost:3000` to see your application running. - -### Explore more templates - -Solid offers a variety of Vite templates to streamline your development process. -These resources are available on [GitHub](https://github.com/solidjs/templates). diff --git a/src/routes/pt-br/solid-router/index.mdx b/src/routes/pt-br/solid-router/index.mdx deleted file mode 100644 index 52656a5ab..000000000 --- a/src/routes/pt-br/solid-router/index.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: SumΓ‘rio -mainNavExclude: true ---- - -# Roteador - -Solid is a modern JavaScript framework designed to build responsive and high-performing user interfaces (UI). -It prioritizes a simple and predictable development experience, making it a great choice for developers of all skill levels. - -## What is Solid? - -As a JavaScript framework, Solid embraces reactivity and fine-grained updates. - -Reactivity, in programming, refers to an applications' ability to respond to changes in data or user interactions. - -Traditionally, when a change occurs, the entire web page would need to reload to display the updated information. -In contrast, when using a fine-grained reactive system, updates are only applied to the parts of the page that need to be updated. - -Solid adopts the concept of fine-grained reactivity, updating only when the data the application depends on changes. -This decreases work and can result in faster load times and a smoother user experience overall. - -## Advantages of using Solid - -- **Performant**: Fine-grained reactivity allows Solid to update only what has changed, resulting in faster load times and smoother performance overall. - -- **Powerful**: Using less memory and processing power, Solid is capable of creating complex applications without compromising on functionality. - This also gives developers the flexibility over how and when updates happen. - -- **Pragmatic**: Rather than sticking to rigid structures or methods, Solid provides the freedom to choose the strategies and practices that work best for you. - -- **Productive**: Regardless of experience level, Solid's clear and predictable API makes developers' work simpler and more efficient. - -Solid aims to strike a balance between speed, efficiency, power, and flexibility, all while providing a developer-friendly environment. -This combination of features makes it a great choice to build responsive and high-performing UIs. - -## Quick links - -<div class="flex flex-col md:grid md:grid-cols-2 md:grid-rows-2 gap-3"> - <QuickLinks - title="Tutorial" - href="https://www.solidjs.com/tutorial/introduction_basics" - icon="learn" - > - Learn the basics of Solid through this interactive tutorial. - </QuickLinks> - <QuickLinks - title="Templates" - href="https://github.com/solidjs/templates" - icon="template" - > - Start your first project with a template that fits your needs. - </QuickLinks> - <QuickLinks - title="Ecosystem" - href="https://www.solidjs.com/ecosystem" - icon="community" - > - Explore the Solid ecosystem and find useful tools and libraries. - </QuickLinks> - <QuickLinks - title="Contribute" - href="https://github.com/solidjs/solid-docs-next" - icon="learn" - > - Help improve Solid by contributing to the documentation. - </QuickLinks> -</div> - -_Find our API documentation under the **Reference** tab_ - -Join the [Solid community on Discord](https://discord.com/invite/solidjs) to share your projects or get help from our community! - -<EditPageLink /> -<PageIssueLink /> diff --git a/src/routes/pt-br/solid-router/quick-start.mdx b/src/routes/pt-br/solid-router/quick-start.mdx deleted file mode 100644 index 17eaf23fe..000000000 --- a/src/routes/pt-br/solid-router/quick-start.mdx +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: ComeΓ§o rΓ‘pido ---- - -## Solid playgrounds - -Experimente Solid in your browser by visiting our [interactive playground](https://playground.solidjs.com/). - -Additionally, we offer a [JavaScript](https://stackblitz.com/github/solidjs/templates/tree/master/js) and [TypeScript](https://stackblitz.com/github/solidjs/templates/tree/master/ts) Stackblitz starters, which provide a web-based development environment to get you started. - -## Creating a Solid application - -:::note[Prerequisites] - - - Familiarity with the command line - - Install [Node.js](https://nodejs.org/en) - -::: - -Solid offers convenient project templates that can help kickstart your development. -To get an application running, follow the steps below based on the language you prefer to use. - -### For JavaScript projects - -1. Run the following command in your terminal to get the JavaScript starter template: - -```bash frame="none" -npx degit solidjs/templates/js my-app -``` - -2. Navigate to your application's directory: - -```bash frame="none" -cd my-app -``` - -3. Install the necessary dependencies: - -```package-install-local -``` - -4. Run the application: - -```bash frame="none" -npm run dev -``` - -This will start the development server. -Now, you can open your browser and navigate to `localhost:3000` to see your application running. - -### For TypeScript projects - -1. To use a TypeScript template, run the following command in your terminal: - -```bash frame="none" -npx degit solidjs/templates/ts my-app -``` - -2. Navigate to your application's directory: - -```bash frame="none" -cd my-app -``` - -3. Install the necessary dependencies: - -```package-install-local -``` - -4. Run the application: - -```bash frame="none" -npm run dev -``` - -This will start the development server. -Now, you can open your browser and navigate to `localhost:3000` to see your application running. - -### Explore more templates - -Solid offers a variety of Vite templates to streamline your development process. -These resources are available on [GitHub](https://github.com/solidjs/templates). diff --git a/src/routes/quick-start.mdx b/src/routes/quick-start.mdx index c04a9c7b5..33df4c74d 100644 --- a/src/routes/quick-start.mdx +++ b/src/routes/quick-start.mdx @@ -1,5 +1,18 @@ --- title: Quick start +use_cases: >- + starting new project, project setup, first app, development environment, + templates +tags: + - quickstart + - setup + - templates + - getting-started + - playground +version: "1.0" +description: >- + Start building with Solid quickly. Try the playground, create projects with + templates, and get your first Solid app running in minutes. --- ## Try Solid online diff --git a/src/routes/reference/basic-reactivity/create-effect.mdx b/src/routes/reference/basic-reactivity/create-effect.mdx index d93501967..84ee13f12 100644 --- a/src/routes/reference/basic-reactivity/create-effect.mdx +++ b/src/routes/reference/basic-reactivity/create-effect.mdx @@ -1,104 +1,174 @@ --- title: createEffect +use_cases: >- + dom manipulation, side effects, manual dom updates, vanilla js integration, + cleanup operations, logging changes +tags: + - effects + - dom + - side-effects + - reactivity + - lifecycle + - cleanup +version: "1.0" +description: >- + Learn how to use createEffect to run side effects when reactive dependencies + change. Perfect for DOM manipulation and external library integration. --- -```tsx -import { createEffect } from "solid-js" +The `createEffect` primitive creates a reactive computation. +It automatically tracks reactive values, such as [signals](/concepts/signals), accessed within the provided function. +This function will re-run whenever any of its dependencies change. -function createEffect<T>(fn: (v: T) => T, value?: T): void +## Execution Timing -``` +### Initial Run -Effects are a general way to make arbitrary code ("side effects") run whenever dependencies change, e.g., to modify the DOM manually. -`createEffect` creates a new computation that runs the given function in a tracking scope, thus automatically tracking its dependencies, and automatically reruns the function whenever the dependencies update. +- The initial run of effects is **scheduled to occur after the current rendering phase completes**. +- It runs after all synchronous code in a component has finished and DOM elements have been created, but **before the browser paints them on the screen**. +- **[Refs](/concepts/refs) are set** before the first run, even though DOM nodes may not yet be attached to the main document tree. + This is relevant when using the [`children`](/reference/component-apis/children) helper. -For example: +### Subsequent Runs -```tsx -const [a, setA] = createSignal(initialValue) +- After the initial run, the effect **re-runs whenever any tracked dependency changes**. +- When multiple dependencies change within the same batch, the effect **runs once per batch**. +- The **order of runs** among multiple effects is **not guaranteed**. +- Effects always run **after** all pure computations (such as [memos](/concepts/derived-values/memos)) within the same update cycle. -// effect that depends on signal `a` -createEffect(() => doSideEffect(a())) -``` +### Server-Side Rendering -The effect will run whenever `a` changes value. +- Effects **never run during SSR**. +- Effects also **do not run during the initial client hydration**. -The effect will also run once, immediately after it is created, to initialize the DOM to the correct state. This is called the "mounting" phase. -However, we recommend using `onMount` instead, which is a more explicit way to express this. +## Import -The effect callback can return a value, which will be passed as the `prev` argument to the next invocation of the effect. -This is useful for memoizing values that are expensive to compute. For example: +```ts +import { createEffect } from "solid-js"; +``` -```tsx -const [a, setA] = createSignal(initialValue) - -// effect that depends on signal `a` -createEffect((prevSum) => { - // do something with `a` and `prevSum` - const sum = a() + b() - if (sum !== prevSum) console.log("sum changed to", sum) - return sum -}, 0) -// ^ the initial value of the effect is 0 +## Type + +```ts +function createEffect<Next>( + fn: EffectFunction<undefined | NoInfer<Next>, Next> +): void; +function createEffect<Next, Init = Next>( + fn: EffectFunction<Init | Next, Next>, + value: Init, + options?: { name?: string } +): void; +function createEffect<Next, Init>( + fn: EffectFunction<Init | Next, Next>, + value?: Init, + options?: { name?: string } +): void; ``` -Effects are meant primarily for side effects that read but don't write to the reactive system: it's best to avoid setting signals in effects, which without care can cause additional rendering or even infinite effect loops. Instead, prefer using [createMemo](/reference/basic-reactivity/create-memo) to compute new values that depend on other reactive values, so the reactive system knows what depends on what, and can optimize accordingly. -If you do end up setting a signal within an effect, computations subscribed to that signal will be executed only once the effect completes; see [`batch`](/reference/reactive-utilities/batch) for more detail. +## Parameters -The first execution of the effect function is not immediate; it's scheduled to run after the current rendering phase (e.g., after calling the function passed to [render](/reference/rendering/render), [createRoot](/reference/reactive-utilities/create-root), or [runWithOwner](/reference/reactive-utilities/run-with-owner)). -If you want to wait for the first execution to occur, use [queueMicrotask](https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask) (which runs before the browser renders the DOM) or `await Promise.resolve()` or `setTimeout(..., 0)` (which runs after browser rendering). +### `fn` -```tsx -// assume this code is in a component function, so is part of a rendering phase -const [count, setCount] = createSignal(0) - -// this effect prints count at the beginning and when it changes -createEffect(() => console.log("count =", count())) -// effect won't run yet -console.log("hello") -setCount(1) // effect still won't run yet -setCount(2) // effect still won't run yet - -queueMicrotask(() => { - // now `count = 2` will print - console.log("microtask") - setCount(3) // immediately prints `count = 3` - console.log("goodbye") -}) - -// --- overall output: --- -// hello -// count = 2 -// microtask -// count = 3 -// goodbye -``` +- **Type:** `EffectFunction<undefined | NoInfer<Next> | EffectFunction<Init | Next, Next>` +- **Required:** Yes + +A function to be executed as the effect. + +It receives the value returned from the previous run, or the initial `value` during the first run. +The value returned by `fn` is passed to the next run. + +### `value` + +- **Type:** `Init` +- **Required:** No -This delay in first execution is useful because it means an effect defined in a component scope runs after the JSX returned by the component gets added to the DOM. -In particular, [refs](/reference/jsx-attributes/ref) will already be set. -Thus you can use an effect to manipulate the DOM manually, call vanilla JS libraries, or other side effects. +The initial value passed to `fn` during its first run. -Note that the first run of the effect still runs before the browser renders the DOM to the screen (similar to React's `useLayoutEffect`). -If you need to wait until after rendering (e.g., to measure the rendering), you can use `await Promise.resolve()` (or `Promise.resolve().then(...)`), but note that subsequent use of reactive state (such as signals) will not trigger the effect to rerun, as tracking is not possible after an async function uses `await`. -Thus you should use all dependencies before the promise. +### `options` -If you'd rather an effect run immediately even for its first run, use [createRenderEffect](/reference/secondary-primitives/create-render-effect) or [createComputed](/reference/secondary-primitives/create-computed). +- **Type:** `{ name?: string }` +- **Required:** No + +An optional configuration object with the following properties: + +#### `name` + +- **Type:** `string` +- **Required:** No + +A name for the effect, which can be useful for identification in debugging tools like the [Solid Debugger](https://github.com/thetarnav/solid-devtools). + +## Return value + +`createEffect` does not return a value. + +## Examples + +### Basic Usage + +```tsx +import { createSignal, createEffect } from "solid-js"; + +function Counter() { + const [count, setCount] = createSignal(0); + + // Every time count changes, this effect re-runs. + createEffect(() => { + console.log("Count incremented! New value: ", count()); + }); + + return ( + <div> + <p>Count: {count()}</p> + <button onClick={() => setCount((prev) => prev + 1)}>Increment</button> + </div> + ); +} +``` -You can clean up your side effects in between executions of the effect function by calling [onCleanup](/reference/lifecycle/on-cleanup) inside the effect function. -Such a cleanup function gets called both in between effect executions and when the effect gets disposed (e.g., the containing component unmounts). -For example: +### Execution Timing ```tsx -// listen to event dynamically given by eventName signal -createEffect(() => { - const event = eventName() - const callback = (e) => console.log(e) - ref.addEventListener(event, callback) - onCleanup(() => ref.removeEventListener(event, callback)) -}) +import { createSignal, createEffect, createRenderEffect } from "solid-js"; + +function Counter() { + const [count, setCount] = createSignal(0); + + // This is part of the component's synchronous execution. + console.log("Hello from counter"); + + // This effect is scheduled to run after the initial render is complete. + createEffect(() => { + console.log("Effect:", count()); + }); + + // By contrast, a render effect runs synchronously during the render phase. + createRenderEffect(() => { + console.log("Render effect:", count()); + }); + + // Setting a signal during the render phase re-runs render effects, but not effects, which are + // still scheduled. + setCount(1); + + // A microtask is scheduled to run after the current synchronous code (the render phase) finishes. + queueMicrotask(() => { + // Now that rendering is complete, signal updates will trigger effects immediately. + setCount(2); + }); +} + +// Output: +// Hello from counter +// Render effect: 0 +// Render effect: 1 +// Effect: 1 +// Render effect: 2 +// Effect: 2 ``` -## Arguments +## Related -- `fn` - The function to run in a tracking scope. It can return a value, which will be passed as the `prev` argument to the next invocation of the effect. -- `value` - The initial value of the effect. This is useful for memoizing values that are expensive to compute. +- [`createRenderEffect`](/reference/secondary-primitives/create-render-effect) +- [`onCleanup`](/reference/lifecycle/on-cleanup) +- [`onMount`](/reference/lifecycle/on-mount) diff --git a/src/routes/reference/basic-reactivity/create-memo.mdx b/src/routes/reference/basic-reactivity/create-memo.mdx index 58f21b140..5a6836155 100644 --- a/src/routes/reference/basic-reactivity/create-memo.mdx +++ b/src/routes/reference/basic-reactivity/create-memo.mdx @@ -1,72 +1,217 @@ --- title: createMemo +use_cases: >- + expensive computations, derived values, performance optimization, caching + calculations, preventing duplicate work +tags: + - memoization + - performance + - optimization + - derived-state + - caching + - reactivity +version: "1.0" +description: >- + Use createMemo to efficiently compute and cache derived values. Prevent + expensive recalculations and optimize your Solid.js application's performance. --- -Memos let you efficiently use a derived value in many reactive computations. -`createMemo` creates a readonly reactive value equal to the return value of the given function and makes sure that function only gets executed when its dependencies change. +The `createMemo` function creates a read-only signal that derives its value from other reactive values. +The calculated value is memoized: the calculation runs only when dependencies change, and is reused when the value is read. +When a dependency changes, the calculation re-executes. +If the new result is equal to the previous result (according to the [`equals`](#equals) option), the memo suppresses downstream updates. -```tsx -import { createMemo } from "solid-js" +## Import + +```ts +import { createMemo } from "solid-js"; +``` + +## Type +```ts function createMemo<T>( fn: (v: T) => T, value?: T, - options?: { equals?: false | ((prev: T, next: T) => boolean) } -): () => T - + options?: { equals?: false | ((prev: T, next: T) => boolean); name?: string } +): () => T; ``` -Here's an example of how createMemo can be used: +## Parameters -```ts -const value = createMemo(() => computeExpensiveValue(a(), b())) +### `fn` -//read the value -value() -``` +- **Type:** `(v: T) => T` +- **Required:** Yes -In Solid, you often don't need to wrap functions in memos; you can alternatively just define and call a regular function to get similar reactive behavior. -The main difference is when you call the function in multiple reactive settings. -In this case, when the function's dependencies update, the function will get called multiple times unless it is wrapped in createMemo. -For example: +The function that calculates the memo's value. -```tsx -const user = createMemo(() => searchForUser(username())) -// compare with: const user = () => searchForUser(username()); -return ( - <ul> - <li>Your name is {user()?.name}</li> - <li> - Your email is <code>{user()?.email}</code> - </li> - </ul> -) -``` +It receives the value returned from the previous execution as its argument. +On the first execution, it receives the `value` parameter (if provided) or `undefined`. + +This function should be pure (it should not modify other reactive values). + +### `value` + +- **Type:** `T` +- **Required:** No + +The initial value passed to `fn` on its first execution. + +### `options` + +- **Type:** `{ equals?: false | ((prev: T, next: T) => boolean); name?: string }` +- **Required:** No -When the username signal updates, searchForUser will get called just once. -If the returned user actually changed, the user memo updates, and then both list items will update automatically. +An optional configuration object with the following properties: -If we had instead defined user as a plain function `() => searchForUser(username())`, then `searchForUser` would have been called twice, once when updating each list item. +#### `equals` -Another key difference is that a memo can shield dependents from updating when the memo's dependencies change but the resulting memo value doesn't. -Like [createSignal](/reference/basic-reactivity/create-signal), the derived signal made by `createMemo` updates (and triggers dependents to rerun) only when the value returned by the memo function actually changes from the previous value, according to JavaScript's `===` operator. -Alternatively, you can pass an options object with `equals` set to false to always update the memo when its dependencies change, or you can pass your own `equals` function for testing equality. +- **Type:** `false | ((prev: T, next: T) => boolean)` +- **Required:** No -The memo function is called with an argument equal to the value returned from the previous execution of the memo function, or, on the first call, equal to the optional second argument to `createMemo`. -This is useful for reducing computations, such as: +A function that runs after each execution of `fn` to determine if the memo value has changed. +It receives the previous and the new value. +If it returns `true`, the values are considered equal and the memo does not trigger downstream updates. + +If set to `false` (instead of a function), the memo triggers updates whenever it re-executes, even if the value is unchanged. + +Defaults to a function that compares values using strict equality (`===`). + +#### `name` + +- **Type:** `string` +- **Required:** No + +A debug name for the memo. +It is used for identification in debugging tools like the [Solid Debugger](https://github.com/thetarnav/solid-devtools). + +## Return value + +- **Type:** `() => T` + +`createMemo` returns a read-only accessor function. +Calling this function returns the current memoized value. + +## Examples + +### Basic usage + +```tsx +import { createSignal, createMemo, For } from "solid-js"; + +const NAMES = ["Alice Smith", "Bob Jones", "Charlie Day", "David Lee"]; + +function FilterList() { + const [query, setQuery] = createSignal(""); + + // The function executes immediately to calculate the initial value. + // It re-executes only when the `query` signal changes. + const filteredNames = createMemo(() => { + console.log("Calculating list..."); + return NAMES.filter((name) => { + return name.toLowerCase().includes(query().toLowerCase()); + }); + }); + + return ( + <div> + <input + value={query()} + onInput={(e) => setQuery(e.currentTarget.value)} + placeholder="Search..." + /> + + {/* Accessing the memo. If dependencies haven't changed, returns cached value. */} + <div>Count: {filteredNames().length}</div> + + <ul> + {/* Accessing the memo again does not trigger re-execution. */} + <For each={filteredNames()}>{(name) => <li>{name}</li>}</For> + </ul> + </div> + ); +} +``` + +### Custom equality check ```tsx -// track the sum of all values taken on by input() as it updates -const sum = createMemo((prev) => input() + prev, 0) +import { createSignal, createMemo, createEffect } from "solid-js"; + +function DateNormalizer() { + const [dateString, setDateString] = createSignal("2024-05-10"); + + const dateObject = createMemo( + () => { + return new Date(dateString()); + }, + undefined, + { + // Overrides the default strict equality check (===). + // If this returns true, observers (like the Effect below) are NOT notified. + equals: (prev, next) => { + return prev.getTime() === next.getTime(); + }, + } + ); + + createEffect(() => { + // This effect runs only when the numeric time value changes, + // ignoring new Date object references. + console.log("Date changed to:", dateObject().toISOString()); + }); + + return ( + <div> + <input + value={dateString()} + onInput={(e) => setDateString(e.currentTarget.value)} + /> + {/* Setting the same date string creates a new Date object, + but `equals` prevents the update propagation. */} + <button onClick={() => setDateString("2024-05-10")}> + Reset to the same date + </button> + </div> + ); +} ``` -The memo function should not change other signals by calling setters (it should be "pure"). -This enables Solid to optimize the execution order of memo updates according to their dependency graph, so that all memos can update at most once in response to a dependency change. +### Accessing previous value + +```tsx +import { createSignal, createMemo } from "solid-js"; + +function TrendTracker() { + const [count, setCount] = createSignal(0); + + const trend = createMemo( + // The first argument `prev` is the return value of the previous execution. + (prev) => { + const current = count(); + if (current === prev.value) return { value: current, label: "Same" }; + return { + value: current, + label: current > prev.value ? "Up" : "Down", + }; + }, + // The second argument provides the initial value for `prev`. + { value: 0, label: "Same" } + ); + + return ( + <div> + <div>Current: {trend().value}</div> + <div>Direction: {trend().label}</div> + + <button onClick={() => setCount((c) => c + 1)}>Increment</button> + <button onClick={() => setCount((c) => c - 1)}>Decrement</button> + </div> + ); +} +``` -## Options and arguments +## Related -| Name | Type | Description | -| :------ | :------------------------------------------------------ | :------------------------------------------------------------- | -| fn | `(v: T) => T` | The function to memoize. | -| value | `T` | The initial value of the memo. | -| options | `{ equals?: false \| ((prev: T, next: T) => boolean) }` | An optional object with an `equals` function to test equality. | +- [`createComputed`](/reference/secondary-primitives/create-computed) diff --git a/src/routes/reference/basic-reactivity/create-resource.mdx b/src/routes/reference/basic-reactivity/create-resource.mdx index c53db92e3..1b293cf4e 100644 --- a/src/routes/reference/basic-reactivity/create-resource.mdx +++ b/src/routes/reference/basic-reactivity/create-resource.mdx @@ -1,207 +1,271 @@ --- title: createResource +use_cases: >- + data fetching, api calls, async operations, loading states, error handling, + server data, suspense boundaries +tags: + - async + - fetching + - api + - suspense + - loading + - error-handling + - ssr +version: "1.0" +description: >- + Fetch async data with createResource. Handles loading states, errors, and + integrates with Suspense for seamless data fetching in Solid.js applications. --- -`createResource` takes an asynchronous fetcher function and returns a signal that is updated with the resulting data when the fetcher completes. +Creates a reactive resource that manages asynchronous data fetching and loading states, automatically tracking dependencies and providing a simple interface for reading, refreshing, and error handling. +It integrates with Solid's reactivity system and Suspense boundaries. -There are two ways to use `createResource`: you can pass the fetcher function as the sole argument, or you can additionally pass a source signal as the first argument. -The source signal will retrigger the fetcher whenever it changes, and its value will be passed to the fetcher. +## Import -```tsx -const [data, { mutate, refetch }] = createResource(fetchData) +```typescript +import { createResource } from "solid-js"; ``` -```tsx -const [data, { mutate, refetch }] = createResource(source, fetchData) +## Type + +```typescript +// Without source +function createResource<T, R = unknown>( + fetcher: ResourceFetcher<true, T, R>, + options?: ResourceOptions<T> +): ResourceReturn<T, R>; + +// With source +function createResource<T, S, R = unknown>( + source: ResourceSource<S>, + fetcher: ResourceFetcher<S, T, R>, + options?: ResourceOptions<T, S> +): ResourceReturn<T, R>; ``` -In these snippets, the fetcher is the function `fetchData`, and `data()` is undefined until `fetchData` finishes resolving. -In the first case, `fetchData` will be called immediately. -In the second, `fetchData` will be called as soon as `source` has any value other than false, null, or undefined. -It will be called again whenever the value of `source` changes, and that value will always be passed to `fetchData` as its first argument. - -You can call `mutate` to directly update the `data` signal (it works like any other signal setter). -You can also call refetch to rerun the fetcher directly, and pass an optional argument to provide additional info to the fetcher e.g `refetch(info)`. - -`data` works like a normal signal getter: use `data()` to read the last returned value of `fetchData`. -But it also has extra reactive properties: - -- `data.loading`: whether the fetcher has been called but not returned. -- `data.error`: if the request has errored out. - `createResource`: provides an `Error` object for `data.error`. It will show even if the fetcher throws something else. - - - Fetcher throws an `Error` instance, `data.error` will be that instance. - - If the fetcher throws a string, `data.error.message` will contain that string. - - When the fetcher throws a value that is neither an `Error` nor a string, that value will be available as `data.error.cause`. - -- As of **v1.4.0**, `data.latest` returns the last value received and will not trigger [Suspense](/reference/components/suspense) or [transitions](#TODO); if no value has been returned yet, `data.latest` will act the same as `data()`. - This can be useful if you want to show the out-of-date data while the new data is loading. - -`loading`, `error`, and `latest` are reactive getters and can be tracked. - -## The fetcher - -The `fetcher` is the async function that you provide to `createResource` to actually fetch the data. -It is passed two arguments: the value of the source signal (if provided), and an info object with two properties: `value` and `refetching`. -The `value` property tells you the previously fetched value. -The `refetching` property is true if the `fetcher` was triggered using the refetch function and false otherwise. -If the `refetch` function was called with an argument (`refetch(info)`), refetching is set to that argument. - -```tsx -async function fetchData(source, { value, refetching }) { - // Fetch the data and return a value. - //`source` tells you the current value of the source signal; - //`value` tells you the last returned value of the fetcher; - //`refetching` is true when the fetcher is triggered by calling `refetch()`, - // or equal to the optional data passed: `refetch(info)` +### Related types + +```typescript +type ResourceReturn<T, R = unknown> = [Resource<T>, ResourceActions<T, R>]; + +type Resource<T> = { + (): T | undefined; + state: "unresolved" | "pending" | "ready" | "refreshing" | "errored"; + loading: boolean; + error: any; + latest: T | undefined; +}; + +type ResourceActions<T, R = unknown> = { + mutate: (value: T | undefined) => T | undefined; + refetch: (info?: R) => Promise<T> | T | undefined; +}; + +type ResourceSource<S> = + | S + | false + | null + | undefined + | (() => S | false | null | undefined); + +type ResourceFetcher<S, T, R = unknown> = ( + source: S, + info: { value: T | undefined; refetching: R | boolean } +) => T | Promise<T>; + +interface ResourceOptions<T, S = unknown> { + initialValue?: T; + name?: string; + deferStream?: boolean; + ssrLoadFrom?: "initial" | "server"; + storage?: ( + init: T | undefined + ) => [Accessor<T | undefined>, Setter<T | undefined>]; + onHydrated?: (k: S | undefined, info: { value: T | undefined }) => void; } +``` + +## Parameters + +### `source` + +- **Type:** `ResourceSource<S>` +- **Default:** `undefined` + +Reactive data source evaluated before the fetcher runs. +When the value is `undefined`, `null`, or `false`, the fetcher is not called. +Otherwise the current value is passed as the first fetcher argument. +Each change triggers the fetcher again. + +### `fetcher` + +- **Type:** `ResourceFetcher<S, T, R>` + +Function that receives the source value (or `true` if no source), the current resource info, and returns a value or Promise. + +### `options` + +- **Type:** `ResourceOptions<T, S>` +- **Default:** `{}` + +Configuration options for the resource. + +#### `initialValue` + +- **Type:** `T` +- **Default:** `undefined` + +Initial value for the resource. +When provided, the resource starts in "ready" state and the type excludes `undefined`. + +#### `name` + +- **Type:** `string` +- **Default:** `undefined` + +A name for debugging purposes in development mode. + +#### `deferStream` + +- **Type:** `boolean` +- **Default:** `false` -const [data, { mutate, refetch }] = createResource(getQuery, fetchData) +Controls streaming behavior during server-side rendering. -// read value -data() +#### `ssrLoadFrom` -// check if loading -data.loading +- **Type:** `"initial" | "server"` +- **Default:** `"server"` -// check if errored -data.error +Determines how the resource loads during SSR hydration. -// directly set value without creating promise -mutate(optimisticValue) +- "server": Uses the server-fetched value during hydration. +- "initial": Re-fetches on the client after hydration. -// refetch the last request explicitly -refetch() +#### `storage` +- **Type:** `(init: T | undefined) => [Accessor<T | undefined>, Setter<T | undefined>]` +- **Default:** `createSignal` + +Custom storage function for the resource value, useful for persistence or custom state management. + +#### `onHydrated` + +- **Type:** `(k: S | undefined, info: { value: T | undefined }) => void` +- **Default:** `undefined` + +Callback fired when the resource hydrates on the client side. + +## Return value + +- **Type:** `[Resource<T>, ResourceActions<T, R>]` + +Returns a tuple containing the resource accessor and resource actions. + +### `Resource` + +```typescript +type Resource<T> = { + (): T | undefined; + state: "unresolved" | "pending" | "ready" | "refreshing" | "errored"; + loading: boolean; + error: any; + latest: T | undefined; +}; +``` + +- `state`: Current state of the resource. + See the table below for state descriptions. +- `loading`: Indicates if the resource is currently loading. +- `error`: Error information if the resource failed to load. +- `latest`: The latest value of the resource. + +| State | Description | Loading | Error | Latest | +| ------------ | --------------------------------------- | ------- | ----------- | ----------- | +| `unresolved` | Initial state, not yet fetched | `false` | `undefined` | `undefined` | +| `pending` | Fetching in progress | `true` | `undefined` | `undefined` | +| `ready` | Successfully fetched | `false` | `undefined` | `T` | +| `refreshing` | Refetching while keeping previous value | `true` | `undefined` | `T` | +| `errored` | Fetching failed | `false` | `any` | `undefined` | + +### `ResourceActions` + +```typescript +type ResourceActions<T, R = unknown> = { + mutate: (value: T | undefined) => T | undefined; + refetch: (info?: R) => Promise<T> | T | undefined; +}; ``` -## Version 1.4.0 and Later +- `mutate`: Function to manually overwrite the resource value without calling the fetcher. + Allows you to optimistically update the resource value locally, without making a network request. +- `refetch`: Function to re-run the fetcher without changing the source. + If a parameter is provided to `refetch`, it will be passed to the fetcher's `refetching` property. -#### v1.4.0 +## Examples -If you're using `renderToStream`, you can tell Solid to wait for a resource before flushing the stream using the `deferStream` option: +### Basic usage -```tsx -// fetches a user and streams content as soon as possible -const [user] = createResource(() => params.id, fetchUser) +```typescript +const [data] = createResource(async () => { + const response = await fetch("/api/data"); + return response.json(); +}); -// fetches a user but only streams content after this resource has loaded -const [user] = createResource(() => params.id, fetchUser, { - deferStream: true, -}) +// Access data +console.log(data()); // undefined initially, then fetched data +console.log(data.loading); // true during fetch +console.log(data.state); // "pending" β†’ "ready" ``` -#### v1.5.0 +### With source + +```typescript +const [userId, setUserId] = createSignal(1); + +const [user] = createResource(userId, async (id) => { + const response = await fetch(`/api/users/${id}`); + return response.json(); +}); + +// Automatically refetches when userId changes +setUserId(2); +``` -1. We've added a new state field which covers a more detailed view of the Resource state beyond `loading` and `error`. -You can now check whether a Resource is `unresolved`, `pending`, `ready`, `refreshing`, or `errored`. +### With actions -| State | Value resolved | Loading | Has error | -| ------------ | -------------- | ------- | --------- | -| `unresolved` | No | No | No | -| `pending` | No | Yes | No | -| `ready` | Yes | No | No | -| `refreshing` | Yes | Yes | No | -| `errored` | No | No | Yes | +```typescript +const [posts, { refetch, mutate }] = createResource(fetchPosts); -2. When server-rendering resources, especially when embedding Solid in other systems that fetch data before rendering, you might want to initialize the resource with this prefetched value instead of fetching again and having the resource serialize it in its own state. -You can use the new `ssrLoadFrom` option for this. -Instead of using the default `server` value, you can pass `initial` and the resource will use `initialValue` as if it were the result of the first fetch for both SSR and hydration. +// Manual refetch +await refetch(); -```tsx -const [data, { mutate, refetch }] = createResource(() => params.id, fetchUser, { - initialValue: preloadedData, - ssrLoadFrom: "initial", -}) +// Optimistic update +mutate((posts) => [...posts, newPost]); ``` -3. Resources can be set with custom defined storage with the same signature as a Signal by using the storage option. -For example using a custom reconciling store could be done this way: - -```tsx -function createDeepSignal<T>(value: T): Signal<T> { - const [store, setStore] = createStore({ - value, - }) - return [ - () => store.value, - (v: T) => { - const unwrapped = unwrap(store.value) - typeof v === "function" && (v = v(unwrapped)) - setStore("value", reconcile(v)) - return store.value - }, - ] as Signal<T> -} +### Error handling + +```typescript +const [data] = createResource(async () => { + const response = await fetch('/api/data'); + if (!response.ok) throw new Error('Failed to fetch'); + return response.json(); +}); -const [resource] = createResource(fetcher, { - storage: createDeepSignal, -}) +// In JSX +<ErrorBoundary fallback={<div>Error loading data</div>}> + <div>{data()?.title}</div> +</ErrorBoundary> ``` -This option is still experimental and may change in the future. - -## Options - -The `createResource` function takes an optional third argument, an options object. The options are: - -| Name | Type | Default | Description | -| ------------ | ----------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| name | `string` | `undefined` | A name for the resource. This is used for debugging purposes. | -| deferStream | `boolean` | `false` | If true, Solid will wait for the resource to resolve before flushing the stream. | -| initialValue | `any` | `undefined` | The initial value of the resource. | -| onHydrated | `function` | `undefined` | A callback that is called when the resource is hydrated. | -| ssrLoadFrom | `"server" \| "initial"` | `"server"` | The source of the initial value for SSR. If set to `"initial"`, the resource will use the `initialValue` option instead of the value returned by the fetcher. | -| storage | `function` | `createSignal` | A function that returns a signal. This can be used to create a custom storage for the resource. This is still experimental | - -## Note for TypeScript users - -The function and type definitions for `createResource` are as follows: - -```tsx -import { createResource } from "solid-js" -import type { ResourceReturn, ResourceOptions } from "solid-js" - -type ResourceReturn<T> = [ - { - (): T | undefined - state: "unresolved" | "pending" | "ready" | "refreshing" | "errored" - loading: boolean - error: any - latest: T | undefined - }, - { - mutate: (v: T | undefined) => T | undefined - refetch: (info: unknown) => Promise<T> | T - } -] - -type ResourceOptions<T, S = unknown> = { - initialValue?: T - name?: string - deferStream?: boolean - ssrLoadFrom?: "initial" | "server" - storage?: ( - init: T | undefined - ) => [Accessor<T | undefined>, Setter<T | undefined>] - onHydrated?: (k: S | undefined, info: { value: T | undefined }) => void -} +### With initial value -function createResource<T, U = true>( - fetcher: ( - k: U, - info: { value: T | undefined; refetching: boolean | unknown } - ) => T | Promise<T>, - options?: ResourceOptions<T, U> -): ResourceReturn<T> - -function createResource<T, U>( - source: U | false | null | (() => U | false | null), - fetcher: ( - k: U, - info: { value: T | undefined; refetching: boolean | unknown } - ) => T | Promise<T>, - options?: ResourceOptions<T, U> -): ResourceReturn<T> +```typescript +const [user] = createResource(() => fetchUser(), { + initialValue: { name: "Loading...", id: 0 }, +}); +// user() is never undefined +console.log(user().name); // "Loading..." initially ``` diff --git a/src/routes/reference/basic-reactivity/create-signal.mdx b/src/routes/reference/basic-reactivity/create-signal.mdx index 6a56a40ef..79abb1f99 100644 --- a/src/routes/reference/basic-reactivity/create-signal.mdx +++ b/src/routes/reference/basic-reactivity/create-signal.mdx @@ -1,148 +1,122 @@ --- title: createSignal +use_cases: >- + state management, reactive values, component state, form inputs, counters, + toggles, any reactive data +tags: + - signals + - state + - reactivity + - core + - primitives +version: "1.0" +description: >- + Create reactive state with createSignal, Solid's fundamental primitive. Track + values that change over time and automatically update your UI when they do. --- -Signals are the most basic reactive primitive. -They track a single value (which can be a value of any type) that changes over time. +Creates a reactive state primitive consisting of a getter (accessor) and a setter function that forms the foundation of Solid's reactivity system. +Signals use a pull-based reactivity model where tracking subscriptions (reads) is lightweight, while updates (writes) trigger dependency tracking and effect re-execution, making them optimized for frequent reads and infrequent writes. -```tsx -import { createSignal } from "solid-js" - -function createSignal<T>( - initialValue: T, - options?: { - equals?: false | ((prev: T, next: T) => boolean) - name?: string - internal?: boolean - } -): [get: () => T, set: (v: T) => T] - -// available types for return value of createSignal: -import type { Signal, Accessor, Setter } from "solid-js" -type Signal<T> = [get: Accessor<T>, set: Setter<T>] -type Accessor<T> = () => T -type Setter<T> = (v: T | ((prev?: T) => T)) => T +## Import +```typescript +import { createSignal } from "solid-js"; ``` -The Signal's value starts out equal to the passed first argument `initialValue` (or undefined if there are no arguments). -The `createSignal` function returns a pair of functions as a two-element array: a getter (or accessor) and a setter. -In typical use, you would destructure this array into a named Signal like so: +## Type signature -```tsx -const [count, setCount] = createSignal(0) -const [ready, setReady] = createSignal(false) -``` +```typescript +function createSignal<T>(): Signal<T | undefined>; +function createSignal<T>(value: T, options?: SignalOptions<T>): Signal<T>; -Calling the getter (e.g., `count()` or `ready()`) returns the current value of the Signal. +type Signal<T> = [get: Accessor<T>, set: Setter<T>]; -Crucial to automatic dependency tracking, calling the getter within a tracking scope causes the calling function to depend on this Signal, so that function will rerun if the Signal gets updated. +type Accessor<T> = () => T; -Calling the setter (e.g., `setCount(nextCount)` or `setReady(nextReady)`) sets the Signal's value and updates the Signal (triggering dependents to rerun) if the value actually changed (see details below). -The setter takes either the new value for the signal or a function that maps the previous value of the signal to a new value as its only argument. -The updated value is also returned by the setter. As an example: +type Setter<T> = { + <U extends T>(value: Exclude<U, Function> | ((prev: T) => U)): U; + <U extends T>(value: (prev: T) => U): U; + <U extends T>(value: Exclude<U, Function>): U; + <U extends T>(value: Exclude<U, Function> | ((prev: T) => U)): U; +}; -```tsx -// read signal's current value, and -// depend on signal if in a tracking scope -// (but nonreactive outside of a tracking scope): -const currentCount = count() +interface SignalOptions<T> { + name?: string; + equals?: false | ((prev: T, next: T) => boolean); + internal?: boolean; +} +``` -// or wrap any computation with a function, -// and this function can be used in a tracking scope: -const doubledCount = () => 2 * count() +## Parameters -// or build a tracking scope and depend on signal: -const countDisplay = <div>{count()}</div> +### `value` -// write signal by providing a value: -setReady(true) +- **Type:** `T` +- **Default:** `undefined` -// write signal by providing a function setter: -const newCount = setCount((prev) => prev + 1) +The initial value for the signal. +If no initial value is provided, the signal's type is automatically extended with `undefined`. -``` +### `options` -:::note - If you want to store a function in a Signal you must use the function form: +- **Type:** `SignalOptions<T>` +- **Default:** `undefined` - ```tsx - setValue(() => myFunction); - ``` +Configuration object for the signal. - However, functions are not treated specially as the `initialValue` argument to `createSignal`, so you can pass a - function initial value as is: +#### `name` - ```tsx - const [func, setFunc] = createSignal(myFunction); - ``` +- **Type:** `string` +- **Default:** `undefined` -::: +A name for the signal used by debugging tools like [Solid devtools](https://github.com/thetarnav/solid-devtools). +It works only in development mode and is removed from the production bundle. -## Options +#### `equals` -| Name | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `equals` | `false \| ((prev: T, next: T) => boolean)` | `===` | A function that determines whether the Signal's value has changed. If the function returns true, the Signal's value will not be updated and dependents will not rerun. If the function returns false, the Signal's value will be updated and dependents will rerun. | -| `name` | `string` | | A name for the Signal. This is useful for debugging. | -| `internal` | `boolean` | `false` | If true, the Signal will not be accessible in the devtools. | +- **Type:** `false | ((prev: T, next: T) => boolean)` +- **Default:** `false` -### `equals` +A custom comparison function to determine when the signal should update. +By default, signals use reference equality (`===`) to compare previous and next values. +When set to `false`, the signal will always update regardless of value equality, which is useful for creating signals that trigger manual updates in the reactive system. -The `equals` option can be used to customize the equality check used to determine whether the Signal's value has changed. -By default, the equality check is a strict equality check (`===`). -If you want to use a different equality check, you can pass a custom function as the `equals` option. -The custom function will be called with the previous and next values of the Signal as arguments. -If the function returns true, the Signal's value will not be updated and dependents will not rerun. -If the function returns false, the Signal's value will be updated and dependents will rerun. +When providing a custom function, it should be pure and return `true` if the values are equal (no update needed) or `false` if they differ (trigger update). +Impure functions can create unexpected side effects and performance issues. -```tsx -const [count, setCount] = createSignal(0, { - equals: (prev, next) => prev === next, -}) -``` +#### `internal` -Here are some examples of this option in use: +- **Type:** `boolean` +- **Default:** `false` -```tsx -// use { equals: false } to allow modifying object in-place; -// normally this wouldn't be seen as an update because the -// object has the same identity before and after change -const [object, setObject] = createSignal({ count: 0 }, { equals: false }) -setObject((current) => { - current.count += 1 - current.updated = new Date() - return current -}) - -// use { equals: false } to create a signal that acts as a trigger without storing a value: -const [depend, rerun] = createSignal(undefined, { equals: false }) -// now calling depend() in a tracking scope -// makes that scope rerun whenever rerun() gets called - -// define equality based on string length: -const [myString, setMyString] = createSignal("string", { - equals: (newVal, oldVal) => newVal.length === oldVal.length, -}) - -setMyString("string") // considered equal to the last value and won't cause updates -setMyString("stranger") // considered different and will cause updates -``` +Marks the signal as internal, preventing it from appearing in development tools. +This is primarily used by Solid's internal systems. -### `name` +## Return value -The `name` option can be used to give the Signal a name. -This is useful for debugging. The name will be displayed in the devtools. +- **Type:** `Signal<T>` -```tsx -const [count, setCount] = createSignal(0, { name: "count" }) -``` +Returns a tuple `[getter, setter]` where: + +- **getter**: An accessor function that returns the current value and tracks dependencies when called within a reactive context +- **setter**: A function that updates the signal's value and notifies all dependent computations -### `internal` +## Examples -The `internal` option can be used to hide the Signal from the devtools. -This is useful for Signals that are used internally by a component and should not be exposed to the user. +### Basic usage ```tsx -const [count, setCount] = createSignal(0, { internal: true }) +import { createSignal } from "solid-js"; + +function Counter() { + const [count, setCount] = createSignal(0); + + return ( + <div> + <button onClick={() => setCount(count() + 1)}>+</button> + <span>{count()}</span> + </div> + ); +} ``` diff --git a/src/routes/reference/component-apis/children.mdx b/src/routes/reference/component-apis/children.mdx index 2d001fb0c..c0a081ccb 100644 --- a/src/routes/reference/component-apis/children.mdx +++ b/src/routes/reference/component-apis/children.mdx @@ -1,65 +1,105 @@ --- title: children +use_cases: >- + resolving component children, normalizing JSX children, slot-like helpers, + interacting with child content in library components +tags: + - components + - children + - jsx + - utilities +version: "1.0" +description: >- + Resolve a component's `children` prop into a stable accessor. --- -```tsx -import { children } from "solid-js"; -import type { JSX, ResolvedChildren } from "solid-js"; +`children` resolves a component's `children` prop and returns a stable accessor for the resolved result. -function children(fn: () => JSX.Element): () => ResolvedChildren +## Import +```ts +import { children } from "solid-js"; ``` -The `children` helper is used for more complex interactions with props. -When you're not just passing children to another component using `props.children` once in JSX, you should use `children`. -Props are normally passed in via a getter for `props.children` in this manner: +## Type -```tsx -const resolved = children(() => props.children) +```ts +type ResolvedJSXElement = Exclude<JSX.Element, JSX.ArrayElement>; +type ResolvedChildren = ResolvedJSXElement | ResolvedJSXElement[]; + +function children(fn: Accessor<JSX.Element>): Accessor<ResolvedChildren> & { + toArray: () => ResolvedJSXElement[]; +}; ``` -The return value is a [memo](/reference/basic-reactivity/create-memo) evaluating to the resolved children, which updates whenever the children change. -Using this memo instead of accessing `props.children` directly has some important advantages in some scenarios. -The underlying issue is that, when you specify component children via JSX, Solid automatically defines `props.children` as a property getter, so that the children are created (in particular, DOM is created) whenever `props.children` gets accessed. +## Parameters + +### `fn` + +- **Type:** `() => JSX.Element` +- **Required:** Yes + +Accessor that returns the component's `children` value. -Two particular consequences: +## Return value -1. If you access `props.children` multiple times, the children (and associated DOM) get created multiple times. -This is useful if you want the DOM to be duplicated (as DOM nodes can appear in only one parent element), but in many cases it creates redundant DOM nodes. -If you instead call `resolved()` multiple times, you re-use the same children. +- **Type:** `Accessor<ResolvedChildren> & { toArray: () => ResolvedJSXElement[] }` -2. If you access `props.children` outside of a tracking scope (e.g., in an event handler), then you create children that will never be cleaned up. -If you instead call `resolved()`, you re-use the already resolved children. -You also guarantee that the children are tracked in the current component, as opposed to another tracking scope such as another component. +Returns an accessor for the resolved children. +The accessor also exposes `toArray()`. -In addition, the `children` helper "resolves" children by calling argumentless functions and flattening arrays of arrays into an array. -For example, a child specified with JSX like `{signal() * 2}` gets wrapped into a getter function `() => count() * 2` in `props.children`, but gets evaluated to an actual number in resolved, properly depending on a count signal. +## Behavior -If the given `props.children` is not an array (which occurs when the JSX tag has a single child), then the `children` helper will not normalize it into an array. -This is useful behavior e.g. when the intention is to pass a single function as a child, which can be detected via `typeof resolved() === 'function'`. -If you want to normalize to an array, the returned memo has a `toArray` method _(new in 1.5)_. +- The returned accessor memoizes the resolved children, so repeated reads use the resolved result instead of recreating the child structure. +- `children` resolves nested arrays, fragments, and zero-argument child accessors from `props.children`. +- `toArray()` returns the resolved children as an array. It returns `[]` when the resolved value is `null` or `undefined`. -In most cases, you don't need (and in some cases, don't want) to use the `children` helper if you're just passing `props.children` on to another component or element via JSX: +## Examples + +### Basic usage ```tsx -const Wrapper = (props) => { - return <div>{props.children}</div> +function Wrapper(props) { + const resolved = children(() => props.children); + + return <div>{resolved()}</div>; +} + +function Example() { + return ( + <Wrapper> + <span>First</span> + <span>Second</span> + </Wrapper> + ); } ``` -An important aspect of the `children` helper is that it forces the children to be created and resolved, as it accesses `props.children` immediately. -This can be undesirable for conditional rendering, e.g., when using the children within a [`<Show>`](/reference/components/show) component. -For example, the following code always evaluates the children: +### Flatten children into an array ```tsx -const resolved = children(() => props.children) +function List(props) { + const resolved = children(() => props.children); + + return ( + <ul> + {resolved.toArray().map((child) => ( + <li>{child}</li> + ))} + </ul> + ); +} -return <Show when={visible()}>{resolved()}</Show> +function Example() { + return ( + <List> + <span>Alpha</span> + <span>Beta</span> + </List> + ); +} ``` -To evaluate the children only when `<Show>` would render them, you can push the call to children inside a component or a function within `<Show>`, which only evaluates its children when `when` condition is true. -Another nice workaround is to pass `props.children` to the children helper only when you actually want to evaluate the children: +## Related -```tsx -const resolved = children(() => visible() && props.children) -``` +- [Props](/concepts/components/props) diff --git a/src/routes/reference/component-apis/create-context.mdx b/src/routes/reference/component-apis/create-context.mdx index fb1634575..c6fa4e8be 100644 --- a/src/routes/reference/component-apis/create-context.mdx +++ b/src/routes/reference/component-apis/create-context.mdx @@ -1,103 +1,112 @@ --- title: createContext order: 5 +use_cases: >- + prop drilling, global state, theme providers, user authentication, app-wide + settings, dependency injection +tags: + - context + - providers + - global-state + - props + - dependency-injection +version: "1.0" +description: >- + Create a context object with a `Provider` component and a default value. --- +`createContext` creates a context object. +The returned object contains a `Provider` component and an optional `defaultValue`; [`useContext`](/reference/component-apis/use-context) reads the nearest matching provider value. -Context provides a form of dependency injection in Solid. -It is used to save from needing to pass data as props through intermediate components (aka **prop drilling**). -This function creates a new context object that can be used with [useContext](/reference/component-apis/use-context) and offers the Provider control flow. -The default value is used when no Provider is found above in the hierarchy. +## Import -## Usage +```ts +import { createContext } from "solid-js"; +``` + +## Type + +```ts +interface Context<T> { + id: symbol; + Provider: (props: { value: T; children: any }) => any; + defaultValue: T; +} -To avoid reinstatiating a new context when Hot-Module Replacement (HMR) occurs, it is recommended to use `createContext` in its own module (file). +function createContext<T>( + defaultValue?: undefined, + options?: { name?: string } +): Context<T | undefined>; -:::danger[Hot-Module Replacement] -When using HMR, the context is lost when the module is reloaded. -Which will cause an error to be thrown as `useContext` will try to access it while it is still reloading. -::: +function createContext<T>( + defaultValue: T, + options?: { name?: string } +): Context<T>; +``` +## Parameters -For example: +### `defaultValue` -```ts title="/context/counter.ts" -import { createContext } from "solid-js"; +- **Type:** `T` -export const INITIAL_COUNT = 0; +Default value returned by [`useContext`](/reference/component-apis/use-context) when no matching provider is found. -const INITIAL_STORE_SETTER = { - increment: () => {}, - decrement: () => {} -}; +### `options` -export const CounterContext = createContext([ - { count: INITIAL_COUNT }, - INITIAL_STORE_SETTER -]); -``` +#### `name` -With the context created in its own module, you can use to instantiate the context provider. - -```ts title="/context/counter-component.tsx" -import { createStore } from 'solid-js/store'; -import { CounterContext, INITIAL_COUNT } from "./counter.ts"; - -export function CounterProvider(props) { - const [value, setValue] = createStore({ count: props.initialCount || INITIAL_COUNT }) - - const counter = [ - value, - { - increment() { - setValue("count", currentCount => currentCount + 1) - }, - decrement() { - setValue("count", currentCount => currentCount - 1) - }, - }, - ] - - return ( - <CounterContext.Provider value={counter}> - {props.children} - </CounterContext.Provider> - ) -} -``` +- **Type:** `string` + +Debug name used by development tooling. -A few imporant notes on how to pass data through the context API: +## Return value -- The value passed to provider is passed to `useContext` as is. -- Wrapping as a reactive expression will not work. -- You should pass in Signals and Stores directly instead of accessing them in the JSX. +- **Type:** `Context<T>` or `Context<T | undefined>` -To learn how to consume the context, see the [useContext](/reference/component-apis/use-context) documentation and the [Context concepts entry](/concepts/context). +Returns a context object containing `id`, `Provider`, and `defaultValue`. -## Default Values +## Behavior -`createContext()` takes an optional "default value" as an argument. -If `useContext` is called and there is no corresponding context provider above it in the component hierarchy, then the value passed as `defaultValue` is returned. +- `Context.Provider` passes its `value` prop to descendant calls to [`useContext`](/reference/component-apis/use-context). +- `useContext` reads the nearest matching provider in the current owner tree. +- If no matching provider is found, `useContext` returns `defaultValue` when one was supplied, or `undefined` otherwise. -However, if no `defaultValue` was passed, then `undefined` is returned in this case. -Also, `defaultValue` (or `undefined`) is returned if `useContext` is called inside an event callback, as it is then outside of the component hierarchy. +## Notes -This has implications for TS. -If no `defaultValue` is passed, then it is possible that `useContext()` will return `undefined`, and the types reflect this. +- During Hot Module Replacement (HMR), recreating a context in a reloaded module creates a new context object. +- If provider and consumer modules are temporarily out of sync during reload, `useContext` can read a different context object and return the default value or `undefined`. +- Defining the context in its own module keeps the exported context object stable across imports. -Another (used in the example in the previous section) is provide a default value to `createContext()`. -In that case, `useContext()` will always return a value, and therefore TS will not complain either. -The pitfall with this approach is that if you _unintentionally_ use `useContext` outside of a provider, it may not be immediately apparent, because the context is still providing a valid value. -Therefore, if you expect to always use `useContext` within a provider, it is best to use the error based approach described above. +## Examples -## Type signature +### Create a context with a default value ```ts -interface Context<T> { - id: symbol - Provider: (props: { value: T; children: any }) => any - defaultValue: T -} +import { createContext } from "solid-js"; + +type Theme = "light" | "dark"; -function createContext<T>(defaultValue?: T): Context<T | undefined> +const ThemeContext = createContext<Theme>("light"); ``` + +### Create a provider + +```tsx +import { createContext } from "solid-js"; + +const CounterContext = createContext<{ count: number }>(); + +function CounterProvider(props) { + return ( + <CounterContext.Provider value={{ count: 1 }}> + {props.children} + </CounterContext.Provider> + ); +} +``` + +## Related + +- [`useContext`](/reference/component-apis/use-context) +- [Context](/concepts/context) diff --git a/src/routes/reference/component-apis/create-unique-id.mdx b/src/routes/reference/component-apis/create-unique-id.mdx index 65088f374..a2de7d756 100644 --- a/src/routes/reference/component-apis/create-unique-id.mdx +++ b/src/routes/reference/component-apis/create-unique-id.mdx @@ -1,18 +1,77 @@ --- title: createUniqueId +use_cases: >- + form elements, accessibility, aria labels, ssr compatibility, html id + generation, unique identifiers +tags: + - ids + - accessibility + - ssr + - forms + - utilities +version: "1.0" +description: >- + Generate a unique string for the current render or hydration context. --- -```ts -import { createUniqueId } from "solid-js" +`createUniqueId` generates a unique string for the current render or hydration context. +During hydration, matching server and client call order produces matching IDs. + +`createUniqueId` does _not_ generate a cryptographically secure ID and is not suitable for security-sensitive data. +Additionally, it should not be used in scenarios that require uniqueness across a distributed system. + +:::note +`createUniqueId` relies on a counter-based mechanism to generate IDs. +It must be called the same number of times on both the server and client. -function createUniqueId(): string +Calling `createUniqueId` only on the server or only on the client, such as when using [`isServer`](/reference/rendering/is-server) or [`<NoHydration>`](/reference/components/no-hydration), may lead to hydration errors. +::: +## Import + +```ts +import { createUniqueId } from "solid-js"; ``` -A universal id generator that is stable across server/browser. +## Type ```ts -const id = createUniqueId() +function createUniqueId(): string; ``` -**Note:** on the server this only works under hydratable components. +## Parameters + +This function does not take any parameters. + +## Returns + +`createUniqueId` returns a unique `string` that is stable across server and client renders. + +## Behavior + +- During hydration, IDs come from the current hydration context, so matching call order produces matching server and client IDs. +- Outside hydration context, client-side IDs use a local counter and are unique only within the current Solid runtime instance. + +## Examples + +### Basic Usage + +```tsx +import { createUniqueId } from "solid-js"; + +type InputProps = { + id?: string; + label: string; +}; + +function Input(props: InputProps) { + const inputId = props.id ?? createUniqueId(); + + return ( + <> + <label for={inputId}>{props.label}</label> + <input id={inputId} /> + </> + ); +} +``` diff --git a/src/routes/reference/component-apis/lazy.mdx b/src/routes/reference/component-apis/lazy.mdx index d6b714433..970d510fd 100644 --- a/src/routes/reference/component-apis/lazy.mdx +++ b/src/routes/reference/component-apis/lazy.mdx @@ -1,25 +1,109 @@ --- title: lazy +use_cases: >- + code splitting, performance optimization, reducing bundle size, dynamic + imports, route-based splitting, lazy loading +tags: + - lazy-loading + - code-splitting + - performance + - suspense + - optimization + - imports +version: "1.0" +description: >- + Create a component that loads its module lazily from a dynamic import. --- -```ts -import { lazy } from "solid-js" -import type { Component } from "solid-js" +`lazy` wraps a dynamic import and returns a component that loads its module on demand. +The returned component accepts the same props as the loaded component and exposes `preload()`. + +## Import +```tsx +import { lazy } from "solid-js"; +``` + +## Type + +```ts function lazy<T extends Component<any>>( fn: () => Promise<{ default: T }> -): T & { preload: () => Promise<T> } +): T & { preload: () => Promise<{ default: T }> }; ``` -Used to lazy load components to allow for code splitting. -Components are not loaded until rendered. -Lazy loaded components can be used the same as its statically imported counterpart, receiving props etc. -Lazy components trigger `<Suspense>` +## Parameters + +### `fn` + +- **Type:** `() => Promise<{ default: T }>` +- **Required:** Yes + +Dynamic import that resolves to the component module, exposing the component as the `default` export. + +## Return value + +- **Type:** `T & { preload: () => Promise<{ default: T }> }` + +Returns a renderable component compatible with `T`. +The returned component also exposes `preload()`. + +`preload()` starts loading the module without rendering the component and returns the resolved module. + +## Behavior + +- Rendering a lazy component starts loading its module if it has not already been loaded. +- Inside a [`<Suspense>`](/reference/components/suspense) boundary, the boundary shows its fallback while the module is loading. +- Without a suspense boundary, the lazy component renders an empty string until the module resolves. +- `preload()` starts the same module request without rendering the component. + +## Examples + +### Basic usage ```tsx -// wrap import +import { lazy, Suspense } from "solid-js"; + const ComponentA = lazy(() => import("./ComponentA")); -// use in JSX -<ComponentA title={props.title} /> +function App(props: { title: string }) { + return ( + <Suspense fallback={<p>Loading...</p>}> + <ComponentA title={props.title} /> + </Suspense> + ); +} +``` + +### Preloading nested lazy components + +```tsx +import { createSignal, lazy, Show, Suspense } from "solid-js"; + +const Nested = lazy(() => import("./Nested")); + +const ComponentWithPreload = () => { + const [showNested, setShowNested] = createSignal(false); + + return ( + <div> + <button + onMouseEnter={() => Nested.preload()} + onClick={() => setShowNested(true)} + > + Preload Nested Component + </button> + <Show when={showNested()}> + <Suspense fallback={<p>Loading nested component...</p>}> + <Nested /> + </Suspense> + </Show> + </div> + ); +}; ``` + +## Related + +- [`Suspense`](/reference/components/suspense) +- [Router preloading guide](/solid-router/advanced-concepts/preloading) diff --git a/src/routes/reference/component-apis/use-context.mdx b/src/routes/reference/component-apis/use-context.mdx index e4eb55068..0f9be9aeb 100644 --- a/src/routes/reference/component-apis/use-context.mdx +++ b/src/routes/reference/component-apis/use-context.mdx @@ -1,38 +1,99 @@ --- title: useContext +use_cases: >- + consuming context, accessing global state, avoiding prop drilling, theme + access, auth state, shared data +tags: + - context + - providers + - global-state + - hooks + - consumption +version: "1.0" +description: >- + Read the current value of a context object created by `createContext`. --- -Used to grab context within a context provider scope to allow for deep passing of props without having to pass them through each Component function. -It's therefore used in conjunction with [`createContext`](/reference/component-apis/create-context) to consume the data from a Provider scope and thus avoid passing data through intermediate components (prop drilling). +`useContext` reads the nearest provider value for a context object in the current owner tree. + +## Import ```ts -const [state, { increment, decrement }] = useContext(CounterContext) +import { useContext } from "solid-js"; ``` -## Recommended usage +## Type -It is often a good idea to wrap `useContext` in a function like so: +```ts +interface Context<T> { + id: symbol; + Provider: (props: { value: T; children: any }) => any; + defaultValue: T; +} -```ts title="/context/counter-component.tsx" -function useCounterContext() { - const context = useContext(CounterContext) +function useContext<T>(context: Context<T>): T; +``` - if (!context) { - throw new Error("useCounterContext: cannot find a CounterContext") - } +## Parameters + +### `context` + +- **Type:** `Context<T>` +- **Required:** Yes + +Context object created by [`createContext`](/reference/component-apis/create-context). + +## Return value + +- **Type:** `T` + +Returns the value provided by the nearest matching `Context.Provider`. +If the context was created without a default value, `T` can include `undefined`. +If no provider is found, it returns the context's default value or `undefined`. + +## Behavior + +- `useContext` reads the nearest matching provider in the current owner tree. +- If no matching provider is found, it returns the default value from [`createContext`](/reference/component-apis/create-context), or `undefined` when no default value was supplied. +- A provider value of `undefined` is treated the same as a missing provider and returns the default value or `undefined`. - return context +## Examples + +### Read a context value + +```tsx +import { createContext, useContext } from "solid-js"; + +const CounterContext = createContext<number>(0); + +function CounterValue() { + const value = useContext(CounterContext); + + return <span>{value}</span>; } ``` -See the API reference of [createContext](/reference/component-apis/create-context) the API on how to generate a Provider scope. -And check the [Context concepts](/concepts/context) for more information on how to architecture your contexts. +### Throw when a provider is missing -## Type signature +This example checks for `undefined` when the context was created without a default value. ```ts -import { type Context } from "solid-js" +import { createContext, useContext } from "solid-js"; + +const CounterContext = createContext<number>(); + +function useCounterContext() { + const context = useContext(CounterContext); + + if (context === undefined) { + throw new Error("CounterContext is missing"); + } + + return context; +} +``` -function useContext<T>(context: Context<T>): T +## Related -``` \ No newline at end of file +- [`createContext`](/reference/component-apis/create-context) +- [Context](/concepts/context) diff --git a/src/routes/reference/components/create-dynamic.mdx b/src/routes/reference/components/create-dynamic.mdx new file mode 100644 index 000000000..9f6c63749 --- /dev/null +++ b/src/routes/reference/components/create-dynamic.mdx @@ -0,0 +1,92 @@ +--- +title: createDynamic +use_cases: >- + dynamic components, runtime component selection, polymorphic components, + lower-level rendering helpers, library components +tags: + - dynamic + - components + - jsx + - polymorphic + - rendering +version: "1.0" +description: >- + Render a component or intrinsic element selected at runtime from an accessor. +--- + +`createDynamic` renders the value returned by its `component` accessor as either a custom component or an intrinsic element. + +## Import + +```ts +import { createDynamic } from "solid-js/web"; +``` + +## Type + +```ts +type ValidComponent = + | keyof JSX.IntrinsicElements + | ((props: any) => JSX.Element); + +function createDynamic<T extends ValidComponent>( + component: () => T | undefined, + props: ComponentProps<T> +): JSX.Element; +``` + +## Parameters + +### `component` + +- **Type:** `() => T | undefined` + +Accessor that returns the component or intrinsic element to render. + +### `props` + +- **Type:** props accepted by the rendered component or element + +Props passed to the rendered component or element. + +## Return value + +- **Type:** `JSX.Element` + +Returns the rendered component or element. + +## Behavior + +- If `component()` is `undefined`, nothing is rendered. + +## Example + +```tsx +import { createSignal } from "solid-js"; + +const views = { + red: (props: { label: string }) => ( + <p style={{ color: "red" }}>{props.label}</p> + ), + blue: (props: { label: string }) => ( + <p style={{ color: "blue" }}>{props.label}</p> + ), +}; + +function App() { + const [selected, setSelected] = createSignal<keyof typeof views>("red"); + + return ( + <> + <button onClick={() => setSelected("red")}>Red</button> + <button onClick={() => setSelected("blue")}>Blue</button> + + {createDynamic(() => views[selected()], { label: "Selected view" })} + </> + ); +} +``` + +## Related + +- [`<Dynamic>`](/reference/components/dynamic) diff --git a/src/routes/reference/components/data.json b/src/routes/reference/components/data.json index 716b071e6..18de882d2 100644 --- a/src/routes/reference/components/data.json +++ b/src/routes/reference/components/data.json @@ -1,6 +1,7 @@ { "title": "Components", "pages": [ + "create-dynamic.mdx", "dynamic.mdx", "error-boundary.mdx", "for.mdx", diff --git a/src/routes/reference/components/dynamic.mdx b/src/routes/reference/components/dynamic.mdx index d21959508..0b56f0d51 100644 --- a/src/routes/reference/components/dynamic.mdx +++ b/src/routes/reference/components/dynamic.mdx @@ -1,32 +1,96 @@ --- title: <Dynamic> order: 5 +use_cases: >- + dynamic components, runtime component selection, polymorphic components, + rendering custom components or intrinsic elements +tags: + - dynamic + - components + - jsx + - polymorphic + - rendering +version: "1.0" +description: >- + Render a component or intrinsic element selected at runtime. --- -This component lets you insert an arbitrary Component or tag and passes the props through to it. +`<Dynamic>` renders the value of its `component` prop as either a custom component or an intrinsic element. -```tsx -import { Dynamic } from "solid-js/web" -import type { JSX } from "solid-js" - -function Dynamic<T>( - props: T & { - children?: any - component?: Component<T> | string | keyof JSX.IntrinsicElements - } -): () => JSX.Element +## Import + +```ts +import { Dynamic } from "solid-js/web"; ``` -Here's an example of how you can use it: +## Type -```tsx -<Dynamic component={MyComponent} someProp={state.something} /> +```ts +type ValidComponent = + | keyof JSX.IntrinsicElements + | ((props: any) => JSX.Element); + +type DynamicProps<T extends ValidComponent, P = ComponentProps<T>> = { + [K in keyof P]: P[K]; +} & { + component: T | undefined; +}; + +function Dynamic<T extends ValidComponent>(props: DynamicProps<T>): JSX.Element; ``` ## Props -| Name | Type | Description | -| :---------- | :---------------------------------------------------------- | :---------------------------------------- | -| `component` | `Component<T>` \| `string` \| `keyof JSX.IntrinsicElements` | The component to render. | -| `children` | `any` | The children to pass to the component. | -| `...` | `T` | Any other props to pass to the component. | +### `component` + +- **Type:** `T | undefined` + +Component or intrinsic element to render. + +### remaining props + +- **Type:** props accepted by the rendered component or element + +Props forwarded to the rendered value of `component`. + +## Return value + +- **Type:** `JSX.Element` + +Returns the rendered component or element. + +## Behavior + +- When `component` is `undefined`, nothing is rendered. + +## Example + +```tsx +import { createSignal } from "solid-js"; + +const views = { + red: (props: { label: string }) => ( + <p style={{ color: "red" }}>{props.label}</p> + ), + blue: (props: { label: string }) => ( + <p style={{ color: "blue" }}>{props.label}</p> + ), +}; + +function App() { + const [selected, setSelected] = createSignal<keyof typeof views>("red"); + + return ( + <> + <button onClick={() => setSelected("red")}>Red</button> + <button onClick={() => setSelected("blue")}>Blue</button> + + <Dynamic component={views[selected()]} label="Selected view" /> + </> + ); +} +``` + +## Related + +- [`createDynamic`](/reference/components/create-dynamic) diff --git a/src/routes/reference/components/error-boundary.mdx b/src/routes/reference/components/error-boundary.mdx index bcdae26a3..d91e14120 100644 --- a/src/routes/reference/components/error-boundary.mdx +++ b/src/routes/reference/components/error-boundary.mdx @@ -1,54 +1,85 @@ --- title: <ErrorBoundary> order: 5 +use_cases: >- + error handling, rendering fallbacks, preventing subtree crashes, recovering + from render errors +tags: + - error-handling + - components + - fallback + - stability +version: "1.0" +description: >- + Catch errors thrown while rendering or updating a subtree and render fallback + content. --- -The `<ErrorBoundary>` component catches errors that occur during the rendering or updating of its children and shows a fallback UI instead. -This includes: +`<ErrorBoundary>` catches errors thrown while rendering or updating its children. -- Errors that occur while rendering JSX. -- Errors that occur within `createEffect`, `createMemo`, and other state management primitives. -- Errors that occur within `createResource` and other asynchronous state management or data-fetching primitives. +## Import -However, errors occurring outside the rendering process are **not** captured by error boundaries. -For instance: +```ts +import { ErrorBoundary } from "solid-js"; +``` -- Errors that occur inside event handlers. -- Errors that occur after a `setTimeout`. +## Type + +```ts +function ErrorBoundary(props: { + fallback: JSX.Element | ((err: any, reset: () => void) => JSX.Element); + children: JSX.Element; +}): JSX.Element; +``` ## Props ### `fallback` -**Type**: `JSX.Element | ((err: any, reset: () => void) => JSX.Element)` +- **Type:** `JSX.Element | ((err: any, reset: () => void) => JSX.Element)` + +Fallback content. Function fallbacks receive the caught error and a reset function. + +### `children` + +- **Type:** `JSX.Element` + +Subtree wrapped by the boundary. -`fallback` provides content to display when an error occurs. -If a function is passed, it receives two parameters: +## Return value -- `err`: The caught error object. -- `reset`: A function that forces the `<ErrorBoundary>` to re-render its children and clear the error state. +- **Type:** `JSX.Element` -If there's an error within the `fallback` itself, however, it is not caught by the same `<ErrorBoundary>`. -Instead, it will bubble up to any parent error boundaries. +Returns the rendered children or fallback content. -## Example +## Behavior + +- `<ErrorBoundary>` catches errors thrown while rendering JSX and while updating reactive computations in its subtree, including reactive async primitives when they surface through the same rendering or update flow. +- Errors thrown from event handlers or from callbacks scheduled outside Solid's rendering and update flow are not caught by the boundary. +- Function fallbacks receive `reset`, which clears the current error state and re-renders the children. +- Errors thrown by the fallback itself can be caught by a parent error boundary. + +## Examples + +### Basic usage ```tsx -import { ErrorBoundary } from "solid-js"; -import { ErrorProne } from "./components"; - -function Example() { - return ( - <ErrorBoundary - fallback={(error, reset) => ( - <div> - <p>{error.message}</p> - <button onClick={reset}>Try Again</button> - </div> - )} - > - <ErrorProne /> - </ErrorBoundary> - ); +function ErrorProne() { + throw new Error("Broken"); } + +<ErrorBoundary + fallback={(error, reset) => ( + <div> + <p>{String(error)}</p> + <button onClick={reset}>Try Again</button> + </div> + )} +> + <ErrorProne /> +</ErrorBoundary>; ``` + +## Related + +- [`catchError`](/reference/reactive-utilities/catch-error) diff --git a/src/routes/reference/components/for.mdx b/src/routes/reference/components/for.mdx index a02434702..75ec4f86a 100644 --- a/src/routes/reference/components/for.mdx +++ b/src/routes/reference/components/for.mdx @@ -1,51 +1,100 @@ --- title: <For> order: 5 +use_cases: >- + rendering lists, dynamic arrays, data iteration, collections, tables, + repeating elements +tags: + - lists + - iteration + - components + - arrays + - rendering + - performance +version: "1.0" +description: >- + Render a list by item identity with a child function that receives the item + and an index accessor. --- -The `<For>` component is used to render a list of items. It is similar to the `.map()` function in JavaScript. +`<For>` renders a list by item identity. + +## Import ```ts -import { For } from "solid-js" -import type { JSX } from "solid-js" - -function For<T, U extends JSX.Element>(props: { - each: readonly T[] - fallback?: JSX.Element - children: (item: T, index: () => number) => U -}): () => U[] +import { For } from "solid-js"; ``` -A referentially keyed loop with efficient updating of only changed items. The callback takes the current item as the first argument: +## Type -```jsx -<For each={state.list} fallback={<div>Loading...</div>}> - {(item) => <div>{item}</div>} -</For> +```ts +type Accessor<T> = () => T; + +function For<T extends readonly any[], U extends JSX.Element>(props: { + each: T | undefined | null | false; + fallback?: JSX.Element; + children: (item: T[number], index: Accessor<number>) => U; +}): JSX.Element; ``` -The `each` prop can also be a function that returns a list. This is useful for creating a loop that depends on a state value: +## Props + +### `each` + +- **Type:** `T | undefined | null | false` + +Source list. + +### `fallback` + +- **Type:** `JSX.Element` + +Content rendered when `each` is an empty array, `undefined`, `null`, or `false`. + +### `children` -```jsx -<For each={stateSignal()}>{(item) => <div>{item}</div>}</For> +- **Type:** `(item: T[number], index: Accessor<number>) => U` + +Child function. It receives the current item and an index accessor. + +## Return value + +- **Type:** `JSX.Element` + +## Behavior + +- `<For>` maps items by value identity. +- If the same item value appears at a new position, its rendered node can be moved instead of recreated. +- The `index` argument is an accessor. +- `<For>` uses [`mapArray`](/reference/reactive-utilities/map-array) internally. + +## Examples + +### Basic usage + +```tsx +const items = ["A", "B", "C"]; + +<For each={items} fallback={<div>No items</div>}> + {(item) => <div>{item}</div>} +</For>; ``` -The optional second argument is an index signal: +### Access the index + +```tsx +const items = ["A", "B", "C"]; -```jsx -<For each={state.list} fallback={<div>Loading...</div>}> +<For each={items}> {(item, index) => ( <div> #{index()} {item} </div> )} -</For> +</For>; ``` -## Props +## Related -| Name | Type | Description | -| :--------- | :------------------------------------ | :--------------------------------------------------------------- | -| `each` | `readonly T[]` | The list of items to render. | -| `fallback` | `JSX.Element` | A fallback element to render while the list is loading. | -| `children` | `(item: T, index: () => number) => U` | A callback that returns a JSX element for each item in the list. | +- [`<Index>`](/reference/components/index-component) +- [`mapArray`](/reference/reactive-utilities/map-array) diff --git a/src/routes/reference/components/index-component.mdx b/src/routes/reference/components/index-component.mdx index f3f6b6427..3a1fb7030 100644 --- a/src/routes/reference/components/index-component.mdx +++ b/src/routes/reference/components/index-component.mdx @@ -1,61 +1,100 @@ --- title: <Index> +use_cases: >- + non-keyed lists, index-based rendering, fixed positions, changing values, + simple lists +tags: + - lists + - iteration + - components + - arrays + - index +version: "1.0" +description: >- + Render a list by index with a child function that receives an item accessor + and a numeric index. --- -Non-keyed list iteration (rendered nodes are keyed to an array index). This is useful when there is no conceptual key, like if the data consists of primitives and it is the index that is fixed rather than the value. +`<Index>` renders a list by index. + +## Import ```ts -import { Index } from "solid-js" -import type { JSX } from "solid-js" - -function Index<T, U extends JSX.Element>(props: { - each: readonly T[]; - fallback?: JSX.Element; - children: (item: () => T, index: number) => U; -}): () => U[]; +import { Index } from "solid-js"; ``` -A super simple implementation of this component might look like this: +## Type -```tsx -function Index<T, U extends JSX.Element>(props: { - each: readonly T[]; - fallback?: JSX.Element; - children: (item: () => T, index: number) => U; -}) { - return () => { - const [items, setItems] = createSignal(props.each); - return props.each.map((_, i) => props.children(() => items()[i], i)); - }; -} +```ts +type Accessor<T> = () => T; + +function Index<T extends readonly any[], U extends JSX.Element>(props: { + each: T | undefined | null | false; + fallback?: JSX.Element; + children: (item: Accessor<T[number]>, index: number) => U; +}): JSX.Element; ``` -Here's a look at the implementation of the `Index` component in Solid: +## Props + +### `each` + +- **Type:** `T | undefined | null | false` + +Source list. + +### `fallback` + +- **Type:** `JSX.Element` + +Content rendered when `each` is an empty array, `undefined`, `null`, or `false`. + +### `children` + +- **Type:** `(item: Accessor<T[number]>, index: number) => U` + +Child function. It receives an accessor for the item at that index and the index number. + +## Return value + +- **Type:** `JSX.Element` + +## Behavior + +- `<Index>` maps items by index rather than by value identity. +- The `item` argument is an accessor. +- The `index` argument is a number. +- Updating a value at the same index updates the corresponding rendered item. +- When the array is reordered, rendered positions stay tied to indexes, and `item()` updates to the current value at that index. +- `<Index>` uses [`indexArray`](/reference/reactive-utilities/index-array) internally. + +## Examples + +### Basic usage ```tsx -<Index each={state.list} fallback={<div>Loading...</div>}> - {(item) => <div>{item()}</div>} -</Index> -``` +const items = ["A", "B", "C"]; -Notice that the item is a signal unlike the `For` component. This is because the `Index` component is not keyed to the item itself but rather the index. +<Index each={items} fallback={<div>No items</div>}> + {(item) => <div>{item()}</div>} +</Index>; +``` -Optional second argument is an index number: +### Access the index ```tsx -<Index each={state.list} fallback={<div>Loading...</div>}> - {(item, index) => ( - <div> - #{index} {item()} - </div> - )} -</Index> +const items = ["A", "B", "C"]; + +<Index each={items}> + {(item, index) => ( + <div> + #{index} {item()} + </div> + )} +</Index>; ``` -## Props +## Related -| Name | Type | Description | -| :------- | :------------------------------------ | :-------------------------------------------------------------- | -| each | `readonly T[]` | The array to iterate over. | -| fallback | `JSX.Element` | Optional fallback element to render while the array is loading. | -| children | `(item: () => T, index: number) => U` | The function that renders the children. | \ No newline at end of file +- [`<For>`](/reference/components/for) +- [`indexArray`](/reference/reactive-utilities/index-array) diff --git a/src/routes/reference/components/no-hydration.mdx b/src/routes/reference/components/no-hydration.mdx index 347380d39..94104e743 100644 --- a/src/routes/reference/components/no-hydration.mdx +++ b/src/routes/reference/components/no-hydration.mdx @@ -1,28 +1,66 @@ --- title: <NoHydration> +use_cases: >- + static content, server-rendered content, skipping hydration for a subtree +tags: + - ssr + - hydration + - server-rendering + - components +version: "1.0" +description: >- + Render children during server rendering and skip hydration for that subtree + on the client. --- -The `<NoHydration>` component prevents the client-side hydration process from being applied to its children. -During server-side rendering, components and elements wrapped within `<NoHydration>` will render normally on the server, contributing to the initial HTML output. -However, during client-side hydration, Solid bypasses the hydration process for the content within `<NoHydration>`. -This means that elements within `<NoHydration>` will not have event listeners attached by Solid, and their state will not be managed reactively on the client-side after the initial render. +`<NoHydration>` skips hydration for its subtree on the client. -:::note -Placing a `<Hydration>` component inside `<NoHydration>` has no effect and will not override the `<NoHydration>` behavior. -::: +## Import -## Example - -```tsx +```ts import { NoHydration } from "solid-js/web"; -import { InteractiveComponent, StaticContent } from "./components"; +``` + +## Type + +```ts +function NoHydration(props: { children?: JSX.Element }): JSX.Element; +``` + +## Props + +### `children` + +- **Type:** `JSX.Element` +Content inside the boundary. + +## Return value + +- **Type:** `JSX.Element` + +Returns the children during server and client-only rendering. + +## Behavior + +- During server rendering, children inside `<NoHydration>` render normally. +- During client hydration, Solid leaves the existing server-rendered DOM in place and does not hydrate that subtree. +- In client-only rendering, `<NoHydration>` renders its children normally. +- Interactive behavior inside the boundary does not hydrate on the client. + +## Examples + +### Basic usage + +```tsx function Example() { return ( <div> - <InteractiveComponent /> + <button onClick={() => console.log("hydrated")}>Hydrated button</button> <NoHydration> - <StaticContent /> + <div> + <strong>Rendered on the server without hydration</strong> + </div> </NoHydration> </div> ); diff --git a/src/routes/reference/components/portal.mdx b/src/routes/reference/components/portal.mdx index 1e4984430..432ae43a7 100644 --- a/src/routes/reference/components/portal.mdx +++ b/src/routes/reference/components/portal.mdx @@ -1,40 +1,120 @@ --- title: <Portal> +use_cases: >- + modals, tooltips, overlays, popups, dropdowns, rendering outside parent DOM + hierarchy +tags: + - portal + - dom + - overlays + - tooltips + - components +version: "1.0" +description: >- + Render children into a DOM node outside the parent DOM hierarchy. --- -`<Portal>` is a component that allows you to render children into a DOM node that exists outside the DOM hierarchy of the parent component. +`<Portal>` renders its children into a different DOM node while preserving the Solid component hierarchy. -This is useful when your UI has some elements that need to appear on top of everything else, such as modals and tooltips. +## Import -```tsx -import { Portal } from "solid-js/web" -import type { JSX } from "solid-js" +```ts +import { Portal } from "solid-js/web"; +``` +## Type + +```ts function Portal(props: { - mount?: Node - useShadow?: boolean - isSVG?: boolean - children: JSX.Element -}): Text + mount?: Node; + useShadow?: boolean; + isSVG?: boolean; + ref?: + | HTMLDivElement + | SVGGElement + | ((el: HTMLDivElement | SVGGElement) => void); + children: JSX.Element; +}): Text; ``` -This inserts the element in the mount node. -Useful for inserting Modals outside of the page layout. -Events still propagate through the component hierarchy, however `<Portal>` will only run on the client and has hydration _disabled_. +## Props + +### `mount` + +- **Type:** `Node` + +Mount point for the portal. When omitted, the portal mounts to `document.body`. + +### `useShadow` + +- **Type:** `boolean` + +Creates a shadow root on the portal container when supported. + +### `isSVG` + +- **Type:** `boolean` + +Creates an SVG `<g>` container instead of an HTML `<div>`. + +### `ref` + +- **Type:** `HTMLDivElement | SVGGElement | ((el: HTMLDivElement | SVGGElement) => void)` -The portal is mounted in a `<div>` unless the target is the document head. -`useShadow` places the element in a Shadow Root for style isolation, and `isSVG` is required if inserting into an SVG element so that the `<div>` is not inserted. +Receives the created portal container element. This is a `<div>` by default or a `<g>` when `isSVG` is `true`. + +### `children` + +- **Type:** `JSX.Element` + +Content rendered into the portal container. + +## Return value + +- **Type:** `Text` + +Returns a marker node used to preserve the portal position in the component tree. + +## Behavior + +- `<Portal>` renders its children outside the parent DOM hierarchy, but events still propagate through the Solid component hierarchy. +- When the mount target is not `document.head`, the portal creates a container element and appends it to the mount target. +- When the mount target is `document.head`, the portal inserts its children without creating that container element. +- During server rendering, `<Portal>` returns no output. +- Portals render only on the client and are skipped during hydration. + +## Examples + +### Basic usage ```tsx -<Portal mount={document.getElementById("modal")}> - <div>My Content</div> -</Portal> -``` +import { createSignal, Show } from "solid-js"; -## Props +function App() { + const [open, setOpen] = createSignal(false); + + return ( + <> + <button onClick={() => setOpen(true)}>Open</button> -| Name | Type | Default | Description | -| :---------- | :-------- | :------------ | :------------------------------------------------ | -| `mount` | `Node` | document.body | The DOM node to mount the portal in. | -| `useShadow` | `boolean` | false | Whether to use a Shadow Root for style isolation. | -| `isSVG` | `boolean` | false | Whether the mount node is an SVG element. | + <Show when={open()}> + <Portal> + <div + style={{ + position: "fixed", + top: "2rem", + left: "2rem", + padding: "1rem", + background: "white", + border: "1px solid #ccc", + }} + > + <div>Popup</div> + <button onClick={() => setOpen(false)}>Close</button> + </div> + </Portal> + </Show> + </> + ); +} +``` diff --git a/src/routes/reference/components/show.mdx b/src/routes/reference/components/show.mdx index 1a9788ab0..dd0cf37da 100644 --- a/src/routes/reference/components/show.mdx +++ b/src/routes/reference/components/show.mdx @@ -1,90 +1,119 @@ --- title: <Show> order: 5 +use_cases: >- + conditional rendering, toggling ui, feature flags, loading states, user + permissions, responsive design +tags: + - conditional + - rendering + - components + - control-flow + - ui + - toggle +version: "1.0" +description: >- + Render children when a condition is truthy, with optional fallback content + and keyed behavior. --- -The `<Show>` component is used for conditionally rendering UI elements. -It takes a `when` prop that defines the condition for rendering. -When the `when` prop is truthy, the children of the `<Show>` component are displayed. -Additionally, an optional `fallback` prop can be provided to specify an element that is shown when the condition is falsy. +`<Show>` renders its children when `when` is truthy and renders `fallback` otherwise. -```tsx -import { createSignal, Show } from "solid-js"; - -function Example() { - const [value, setValue] = createSignal(true); - return ( - <div> - <button onClick={() => setValue((prev) => !prev)}>Toggle Show</button> - <Show when={value()} fallback={<div>Fallback Element</div>}> - <div>Child Element</div> - </Show> - </div> - ); -} +## Import + +```ts +import { Show } from "solid-js"; +``` + +## Type + +```ts +type Accessor<T> = () => T; + +function Show<T>(props: { + when: T | undefined | null | false; + keyed?: false; + fallback?: JSX.Element; + children: JSX.Element | ((item: Accessor<NonNullable<T>>) => JSX.Element); +}): JSX.Element; + +function Show<T>(props: { + when: T | undefined | null | false; + keyed: true; + fallback?: JSX.Element; + children: JSX.Element | ((item: NonNullable<T>) => JSX.Element); +}): JSX.Element; ``` -## Keyed rendering +## Props + +### `when` + +- **Type:** `T | undefined | null | false` + +Condition value that determines whether the children are rendered. + +### `keyed` + +- **Type:** `boolean` + +Controls whether function children receive the current value directly instead of an accessor. + +### `fallback` + +- **Type:** `JSX.Element` -When the `keyed` is set to `true`, any change to the `when` prop β€” including changes in its reference β€” will cause the `<Show>` component to re-render its children. +Content rendered when `when` is falsy. + +### `children` + +- **Type:** `JSX.Element | ((item: Accessor<NonNullable<T>>) => JSX.Element) | ((item: NonNullable<T>) => JSX.Element)` + +Content rendered when `when` is truthy. + +## Return value + +- **Type:** `JSX.Element` + +Returns the rendered children or `fallback` content. + +## Behavior + +- With `keyed` omitted or `false`, `<Show>` updates only when the truthiness of `when` changes. Replacing one truthy value with another truthy value does not recreate the child block, and function children receive an accessor that can only be read while the condition remains truthy. +- With `keyed={true}`, changes to the `when` value trigger a new render even when the value remains truthy, and function children receive the value directly. +- Function children are wrapped in [`untrack`](/reference/reactive-utilities/untrack). + +## Examples + +### Basic usage ```tsx -import { createSignal, Show } from "solid-js"; - -function KeyedExample() { - const [user, setUser] = createSignal({ name: "John Wick" }); - - function update() { - // This operation changes the reference of the user object. - setUser({ ...user() }); - } - - return ( - <div> - <button onClick={update}>Update</button> - <Show when={user()} keyed> - <p>Name: {user().name}</p> - {/* Updates shown with each click */} - <p>Last updated: {Date.now()}</p> - </Show> - </div> - ); -} +const loading = () => false; + +<Show when={!loading()} fallback={<div>Loading...</div>}> + <div>Loaded</div> +</Show>; ``` -## Render function +### Function child -The `<Show>` component can also accept a render function as its child. -In this case, the first argument of the render function is an _accessor_ to the `when` prop. -However, when the `keyed` prop is set to `true`, the argument is the `when` prop itself instead of an accessor. +```tsx +const user = () => ({ name: "Ada" }); -When a render function is used, it is internally wrapped with [`untrack`](/reference/reactive-utilities/untrack). -As a result, signals accessed directly within the render function's scope will not react to updates. +<Show when={user()}>{(user) => <div>{user().name}</div>}</Show>; +``` -For example, in the following code, the count displayed in the first `<Show>` component does not update when the `count` signal changes. -However, the second `<Show>` component does update since the `count` signal is accessed within a JSX element, which creates a tracking scope. +### Keyed function child ```tsx -import { createSignal, Show } from "solid-js"; - -function RenderFunctionExample() { - const [count, setCount] = createSignal(0); - return ( - <div> - <button onClick={() => setCount((c) => c + 1)}>Increment</button> - {/* This does not update. */} - <Show when={count()}>{(c) => count()}</Show> - {/* This will update. */} - <Show when={count()}>{(c) => <>{count()}</>}</Show> - </div> - ); -} +const user = () => ({ name: "Ada" }); + +<Show when={user()} keyed> + {(user) => <div>{user.name}</div>} +</Show>; ``` -## Props +## Related -| Name | Type | Description | -| :--------- | :-------------------------------- | :---------------------------------------------------- | -| `when` | `T \| undefined \| null \| false` | The condition value. | -| `keyed` | `boolean` | Whether to key the block to the value of when. | -| `fallback` | `JSX.Element` | The fallback to render when the `when` prop is falsy. | +- [`untrack`](/reference/reactive-utilities/untrack) +- [`<Switch> / <Match>`](/reference/components/switch-and-match) diff --git a/src/routes/reference/components/suspense-list.mdx b/src/routes/reference/components/suspense-list.mdx index 38bc42b37..68604cca2 100644 --- a/src/routes/reference/components/suspense-list.mdx +++ b/src/routes/reference/components/suspense-list.mdx @@ -1,52 +1,116 @@ --- title: <SuspenseList> order: 5 +use_cases: >- + coordinating suspense boundaries, controlling reveal order, coordinating + fallback display +tags: + - suspense + - async + - loading + - coordination + - experimental + - components +version: "1.0" +description: >- + Coordinate how multiple suspense boundaries reveal their content. --- -SuspenseList allows for coordinating multiple parallel Suspense and SuspenseList components. It controls the order in which content is revealed to reduce layout thrashing and has an option to collapse or hide fallback states. +:::[warning] +This is an experimental component +::: -```ts -import { SuspenseList } from "solid-js" -import type { JSX } from "solid-js" +`<SuspenseList>` coordinates how multiple child suspense boundaries reveal their content. -function SuspenseList(props: { - children: JSX.Element - revealOrder: "forwards" | "backwards" | "together" - tail?: "collapsed" | "hidden" -}): JSX.Element -``` +## Import -**Note**: SuspenseList is still in the experimental stage and does not have full `SSR` support. +```ts +import { SuspenseList } from "solid-js"; +``` -Here's an example of how to use SuspenseList: +## Type -```tsx -<SuspenseList revealOrder="forwards" tail="collapsed"> - <ProfileDetails user={resource.user} /> - <Suspense fallback={<h2>Loading posts...</h2>}> - <ProfileTimeline posts={resource.posts} /> - </Suspense> - <Suspense fallback={<h2>Loading fun facts...</h2>}> - <ProfileTrivia trivia={resource.trivia} /> - </Suspense> -</SuspenseList> +```ts +function SuspenseList(props: { + children: JSX.Element; + revealOrder: "forwards" | "backwards" | "together"; + tail?: "collapsed" | "hidden"; +}): JSX.Element; ``` ## Props -| Name | Type | Default | Description | -| ------------- | ----------------------------------------- | ------------ | --------------------------------------------------------------------------- | -| `revealOrder` | `"forwards" \| "backwards" \| "together"` | `"forwards"` | Determines the order in which the SuspenseList children should be revealed. | -| `tail` | `"collapsed" \| "hidden"` | `undefined` | TODO | +### `children` + +- **Type:** `JSX.Element` + +Suspense and suspense-list children inside the list. ### `revealOrder` -`"forwards" | "backwards" | "together"` +- **Type:** `"forwards" | "backwards" | "together"` -- `"forwards"`: Reveals each item in the list once the previous item has finished rendering. This is the default. -- `"backwards"`: Reveals each item in the list once the next item has finished rendering. -- `"together"`: Reveals all items in the list at the same time. +Order used to reveal child boundaries. ### `tail` -`"collapsed" | "hidden"` +- **Type:** `"collapsed" | "hidden"` + +Controls fallback visibility for later items after the first still-pending item in ordered reveal modes. + +## Return value + +- **Type:** `JSX.Element` + +Returns the coordinated suspense boundaries. + +## Behavior + +- `revealOrder="forwards"` reveals items from first to last. +- `revealOrder="backwards"` reveals items from last to first. +- `revealOrder="together"` reveals all items only after all coordinated boundaries are ready. +- With `tail="collapsed"`, the first still-pending item can keep its fallback visible, while later pending items hide theirs. +- With `tail="hidden"`, pending items after the first still-pending item hide their fallbacks. +- `<SuspenseList>` coordinates child suspense boundaries. It does not suspend by itself. + +## Examples + +### Basic usage + +```tsx +import { createResource, Suspense } from "solid-js"; + +const delayed = async <T,>(value: T, ms: number) => { + await new Promise((resolve) => setTimeout(resolve, ms)); + return value; +}; + +function ProfileDetails() { + const [user] = createResource(() => delayed({ name: "Ada" }, 500)); + return <h2>{user()?.name}</h2>; +} + +function ProfileTimeline() { + const [posts] = createResource(() => delayed(["First post"], 1000)); + return ( + <ul> + {posts()?.map((post) => ( + <li>{post}</li> + ))} + </ul> + ); +} + +<SuspenseList revealOrder="forwards" tail="collapsed"> + <Suspense fallback={<h2>Loading profile...</h2>}> + <ProfileDetails /> + </Suspense> + <Suspense fallback={<h2>Loading posts...</h2>}> + <ProfileTimeline /> + </Suspense> +</SuspenseList>; +``` + +## Related + +- [`<Suspense>`](/reference/components/suspense) diff --git a/src/routes/reference/components/suspense.mdx b/src/routes/reference/components/suspense.mdx index dd433d1dc..a192b2cc8 100644 --- a/src/routes/reference/components/suspense.mdx +++ b/src/routes/reference/components/suspense.mdx @@ -1,148 +1,120 @@ --- title: <Suspense> order: 5 +use_cases: >- + async data, loading states, resources, lazy-loaded components, asynchronous + subtrees +tags: + - suspense + - async + - loading + - resources + - components +version: "1.0" +description: >- + Render fallback content while suspense-tracked async dependencies under the boundary are pending. --- -A component that tracks all resources read under it and shows a fallback placeholder state until they are resolved. What makes `Suspense` different than `Show` is that it is non-blocking in the sense that both branches exist at the same time even if not currently in the DOM. This means that the fallback can be rendered while the children are loading. This is useful for loading states and other asynchronous operations. +`<Suspense>` renders `fallback` while suspense-tracked async dependencies under its boundary are pending. -```tsx -import { Suspense } from "solid-js" -import type { JSX } from "solid-js" +## Import -function Suspense(props: { - fallback?: JSX.Element - children: JSX.Element -}): JSX.Element +```ts +import { Suspense } from "solid-js"; +``` + +## Type +```ts +function Suspense(props: { + fallback?: JSX.Element; + children: JSX.Element; +}): JSX.Element; ``` -Here's an example of a `Suspense` component that shows a loading spinner while the `User` component is loading. +## Props -```tsx -<Suspense fallback={<LoadingSpinner />}> - <AsyncComponent /> -</Suspense> +### `fallback` -``` +- **Type:** `JSX.Element` -## Nested Suspense - -`<Suspense>` is triggered whenever a resource is read under the suspense boundary, and waits until all resources read -under the suspense boundary have resolved. Often, however, you may not want this behavior. For example, if your entire page is -wrapped in suspense, you may not want a resource that only populates a certain part of the page to trigger suspense. -In that case, you can wrap that resource usage in its own suspense boundary, and the resource will only trigger the -closest suspense boundary. - -For example, in the code below, only the `title()` resource will trigger the top level suspense boundary, and only the `data()` -resource will trigger the nested suspense boundary: - -```jsx -const MyComponent = () => { - const [title] = createResource(async () => { /* fetcher code here */ }) - const [data] = createResource(async () => { /* fetcher code here */ }) - <Suspense> - <h1>{title()}</h1> - <Suspense> - <DataComponent>{data()}</DataComponent> - </Suspense> - </Suspense> -} +Content rendered while suspense-tracked async dependencies are pending. -``` +### `children` -## The purpose of {"<Suspense>"} +- **Type:** `JSX.Element` -To understand the purpose of suspense, let's consider the following code snippets. These snippets will have some drawbacks which we will solve by using suspense. We will also see how it is possible to use `Suspense` yet not reap its benefits. +Subtree inside the suspense boundary. -Our example use case is to display a user profile. A naive snippet would look like this: +## Return value -```jsx -const MyComponentWithOptionalChaining = () => { - const [profile] = createResource(async () => { - /* fetcher code here */ - }) - return ( - <> - <div>{profile()?.name}</div> - <div>{profile()?.email}</div> - </> - ) -} +- **Type:** `JSX.Element` -``` +Returns the rendered subtree or `fallback` content depending on pending suspense-tracked async dependencies. -In this code, `profile()` starts as `undefined`, and when the fetcher code finishes, resolves to an object with `name` and `email` properties. Although the resource has not resolved yet, the two `div`s are already created and attached to the document body, albeit with empty text nodes. Once the resource resolves, the `div`s are updated with the appropriate data. - -The downside of this approach is that the user is shown an empty component - let's see if we can do better than that in this next snippet: - -```jsx -const MyComponentWithShow = () => { - const [profile] = createResource(async () => { - /* fetcher code here */ - }) - return ( - <Show when={profile()} fallback={<div>fetching user data</div>}> - <div>{profile().name}</div> - <div>{profile().email}</div> - </Show> - ) -} +## Behavior -``` +- When a suspense-tracked async dependency is read inside the boundary, `<Suspense>` renders `fallback` until the pending work resolves. +- `<Suspense>` is non-blocking: the subtree can continue running and create reactive owners before the boundary reveals the resolved content in the DOM. +- Nested suspense boundaries handle suspense-tracked async dependencies under the nearest boundary. +- `onMount` and `createEffect` inside the suspended subtree run after the boundary resolves. + +## Examples -In this snippet, we first show a fallback when the resource hasn't resolved yet, and then switch to showing the profile data once it has. This results in a better user experience. +### Basic usage -On the other hand, there is a slight downside to this approach. In our first example (using optional chaining), the divs were created immediately, and once the resource resolves all that is needed to be done is to fill in the text of the `div`s. But in our second example (using `<Show>`), the `div`s are only created once the resource has resolved, which means there is more work that needs to be done after the resource has resolved before the data can be shown to the user (of course, in this toy example the amount of DOM work is relatively trivial). +```tsx +import { createResource } from "solid-js"; -We can have the best of both worlds by using {"<Suspense>"}: +const fetchMessage = async () => { + await new Promise((resolve) => setTimeout(resolve, 1000)); + return "Loaded"; +}; -```jsx -const MyComponentWithSuspense = () => { - const [profile] = createResource(async () => { - /* fetcher code here */ - }) - return ( - <Suspense fallback={<div>fetching user data</div>}> - <div>{profile()?.name}</div> - <div>{profile()?.email}</div> - </Suspense> - ) +function AsyncMessage() { + const [message] = createResource(fetchMessage); + return <p>{message()}</p>; } + +<Suspense fallback={<p>Loading...</p>}> + <AsyncMessage /> +</Suspense>; ``` -In this case, the `div`s are created immediately, but instead of being attached to the document body, the fallback is shown. Once the resource resolves, the text in the `div`s is updated, and then they are attached to the document (and the fallback removed). - -It is important to note that _the execution of the component does not pause_ when using suspense. Instead, when a resource is read under a suspense boundary, it ensures that the nodes are not attached to the document until after the resource has resolved. Suspense allows us to have the best of both worlds: do as much work as we can _before_ the resource resolves, and also show a fallback until then. - -With this in mind, we can understand that there isn't much gained from suspense in the following code: - -```jsx -const MyComponentWithSuspenseAndShow = () => { - const [profile] = createResource(async () => { - /* fetcher code here */ - }) - return ( - <Suspense fallback={<div>fetching user data</div>}> - <Show when={profile()}> - <div>{profile().name}</div> - <div>{profile().email}</div> - </Show> - </Suspense> - ) +### Nested suspense + +```tsx +import { createResource } from "solid-js"; + +const fetchTitle = async () => { + await new Promise((resolve) => setTimeout(resolve, 500)); + return "Profile"; +}; + +const fetchDetails = async () => { + await new Promise((resolve) => setTimeout(resolve, 1000)); + return "Details loaded"; +}; + +function Title() { + const [title] = createResource(fetchTitle); + return <h1>{title()}</h1>; } -``` -In this code, we don't create _any_ DOM nodes inside {"<Suspense>"} before the resource resolves, so it is pretty much the same as the second example where we only used `<Show>`. +function Details() { + const [details] = createResource(fetchDetails); + return <p>{details()}</p>; +} -:::note - Suspense is triggered by reading a resource inside the {"<Suspense>"}{" "} - boundary. Components wrapped with suspense still run fully, just as they would - without suspense. However, code wrapped in `onMount` and `createEffect` only - run after the resource resolves. -::: +<Suspense fallback={<div>Loading page...</div>}> + <Title /> + <Suspense fallback={<div>Loading details...</div>}> + <Details /> + </Suspense> +</Suspense>; +``` -## Props +## Related -| Name | Type | Description | -| :--------- | :------------ | :--------------------------------------------------------------- | -| `fallback` | `JSX.Element` | The fallback component to render while the children are loading. | +- [`<SuspenseList>`](/reference/components/suspense-list) +- [`createResource`](/reference/basic-reactivity/create-resource) diff --git a/src/routes/reference/components/switch-and-match.mdx b/src/routes/reference/components/switch-and-match.mdx index f733467b5..cbcb1384b 100644 --- a/src/routes/reference/components/switch-and-match.mdx +++ b/src/routes/reference/components/switch-and-match.mdx @@ -1,68 +1,131 @@ --- title: <Switch> / <Match> order: 5 +use_cases: >- + multiple conditions, routing, complex branching, state machines, multi-way + decisions, replacing if-else chains +tags: + - conditional + - routing + - control-flow + - components + - branching + - switch +version: "1.0" +description: >- + Render the first matching branch from a set of mutually exclusive conditions. --- -Useful for when there are more than 2 mutual exclusive conditions. It is a more flexible version of the if-else-if-else-if-else-... chain. +`<Switch>` renders the first child `<Match>` whose `when` prop is truthy. `<Match>` can render JSX directly or accept a function child. + +## Import ```ts -import { Switch, Match } from "solid-js" -import type { MatchProps, JSX } from "solid-js" +import { Match, Switch } from "solid-js"; +``` + +## Type + +```ts +type Accessor<T> = () => T; function Switch(props: { - fallback?: JSX.Element - children: JSX.Element -}): () => JSX.Element - -type MatchProps<T> = { - when: T | undefined | null | false - children: JSX.Element | ((item: T) => JSX.Element) -} -function Match<T>(props: MatchProps<T>) + fallback?: JSX.Element; + children: JSX.Element; +}): JSX.Element; + +function Match<T>(props: { + when: T | undefined | null | false; + keyed?: false; + children: JSX.Element | ((item: Accessor<NonNullable<T>>) => JSX.Element); +}): JSX.Element; + +function Match<T>(props: { + when: T | undefined | null | false; + keyed: true; + children: JSX.Element | ((item: NonNullable<T>) => JSX.Element); +}): JSX.Element; ``` -A super simple implementation of this component would be: +## `<Switch>` props -```tsx -function Switch(props) { - let children = props.children +### `fallback` - if (!Array.isArray(children)) children = [children] +- **Type:** `JSX.Element` - for (let i = 0; i < children.length; i++) { - const child = children[i] - if (child.props.when) return child - } +Content rendered when no child `<Match>` has a truthy `when` value. - return props.fallback -} -``` +### `children` -For example, it can be used to perform basic routing: +- **Type:** `JSX.Element` -```tsx -<Switch fallback={<div>Not Found</div>}> - <Match when={state.route === "home"}> - <Home /> - </Match> - <Match when={state.route === "settings"}> - <Settings /> - </Match> -</Switch> -``` +Child `<Match>` elements. + +## `<Match>` props + +### `when` + +- **Type:** `T | undefined | null | false` + +Condition value for the branch. -Match also supports function children to serve as keyed flow. +### `keyed` -## Props +- **Type:** `boolean` -### Switch +Controls whether function children receive the current value directly instead of an accessor. -| Name | Type | Default | Description | -| ---------- | ------------- | ----------- | -------------------------------------------------------------------------------- | -| `fallback` | `JSX.Element` | `undefined` | The fallback element to render if no `Match` component has a truthy `when` prop. | +### `children` + +- **Type:** `JSX.Element | ((item: Accessor<NonNullable<T>>) => JSX.Element) | ((item: NonNullable<T>) => JSX.Element)` + +Content rendered when the branch matches. + +## Return value + +- **Type:** `JSX.Element` + +Returns the selected branch or the `fallback` content. + +## Behavior + +- `<Switch>` evaluates its child `<Match>` elements in order and renders only the first truthy branch. +- If no branch matches, `<Switch>` renders `fallback`. +- Function children in `<Match>` are wrapped in [`untrack`](/reference/reactive-utilities/untrack). +- With `keyed={false}`, function children in `<Match>` receive an accessor that can only be read while that branch remains selected. Replacing one truthy value with another truthy value does not recreate the child block. +- With `keyed={true}`, function children receive the current value directly, and changing the `when` value recreates the child block even when it remains truthy. + +## Examples + +### Basic usage + +```tsx +import { createSignal } from "solid-js"; + +const [status, setStatus] = createSignal<"loading" | "success" | "error">( + "loading" +); + +<> + <button onClick={() => setStatus("loading")}>Loading</button> + <button onClick={() => setStatus("success")}>Success</button> + <button onClick={() => setStatus("error")}>Error</button> + + <Switch fallback={<p>Unknown status</p>}> + <Match when={status() === "loading"}> + <p>Loading...</p> + </Match> + <Match when={status() === "success"}> + <p>Saved</p> + </Match> + <Match when={status() === "error"}> + <p>Failed</p> + </Match> + </Switch> +</>; +``` -### Match +## Related -| Name | Type | Default | Description | -| ------ | --------------------------------- | ----------- | ------------------------------------------------------------------------- | -| `when` | `T \| undefined \| null \| false` | `undefined` | The condition to check. If it is truthy, the `children` will be rendered. | +- [`<Show>`](/reference/components/show) +- [`untrack`](/reference/reactive-utilities/untrack) diff --git a/src/routes/reference/jsx-attributes/attr.mdx b/src/routes/reference/jsx-attributes/attr.mdx index 934b911fe..5775c4801 100644 --- a/src/routes/reference/jsx-attributes/attr.mdx +++ b/src/routes/reference/jsx-attributes/attr.mdx @@ -1,15 +1,50 @@ --- -title: attr:* +title: "attr:*" +use_cases: >- + custom elements, forcing attribute assignment, writing HTML attributes +tags: + - attributes + - dom + - custom-elements +version: "1.0" +description: >- + Force a JSX key to be written as an attribute instead of a property. --- -Forces the prop to be treated as an attribute instead of a property. -Useful for Web Components where you want to set attributes. - -```tsx -<my-element attr:status={props.status} /> -``` +`attr:*` forces a JSX key to be written as an attribute instead of a property. :::note[Strong-Typing Custom Attributes] Type definitions are required when using TypeScript. See the[TypeScript](/configuration/typescript#forcing-properties-and-custom-attributes) page for examples. ::: + +## Syntax + +```tsx +<my-element attr:status={value} /> +``` + +## Value + +- **Type:** attribute value + +Value passed to normal attribute serialization after the `attr:` prefix is removed. + +## Behavior + +- `attr:name={value}` writes the value to the `name` attribute after the `attr:` prefix is removed. +- In the DOM runtime, `attr:name={undefined}` or `attr:name={null}` removes the attribute. +- In SSR output, the stripped attribute name and escaped value are written as HTML. + +## Examples + +### Basic usage + +```tsx +<my-element attr:status={props.status} /> +``` + +## Related + +- [`prop:*`](/reference/jsx-attributes/prop) +- [`bool:*`](/reference/jsx-attributes/bool) diff --git a/src/routes/reference/jsx-attributes/bool.mdx b/src/routes/reference/jsx-attributes/bool.mdx index 94a682099..6acd955b2 100644 --- a/src/routes/reference/jsx-attributes/bool.mdx +++ b/src/routes/reference/jsx-attributes/bool.mdx @@ -1,26 +1,59 @@ --- -title: bool:* +title: "bool:*" +use_cases: >- + boolean attributes, custom elements, controlling attribute presence +tags: + - attributes + - boolean + - custom-elements +version: "1.0" +description: >- + Control whether an attribute is present by writing through `bool:*`. --- -`bool:*` controls the presence of an attribute in an element. -When the value is `truthy` it adds the `attribute` to the element. -Alternatively, when the value is `falsy` it removes the `attribute` from the element. -This attribute is most useful for Web Components. +`bool:*` controls whether an attribute is present on an element. + +:::note[Strong-Typing Custom Boolean Attributes] +Type definitions are required when using TypeScript. +See the [TypeScript](/configuration/typescript#forcing-properties-and-custom-attributes) page for examples. +::: + +## Syntax ```tsx -<my-element bool:status={prop.value} /> +<my-element bool:status={value} /> ``` +## Value + +- **Type:** any truthy or falsy value + +Any JavaScript value is coerced by truthiness. + +## Behavior + +- `bool:name={value}` writes `name=""` when `value` is truthy. +- `bool:name={value}` removes `name` when `value` is falsy. +- SSR output follows the same presence-or-absence behavior. + +## Examples + +### Basic usage + +```tsx +<my-element bool:status={props.value} /> +``` + +### Resulting markup + ```tsx -// Assuming `prop.value` is `truthy`, then it becomes +// props.value is truthy <my-element status /> -// And when `falsy`, then it becomes +// props.value is falsy <my-element /> - ``` -:::note[Strong-Typing Custom Boolean Attributes] -Type definitions are required when using TypeScript. -See the [TypeScript](/configuration/typescript#forcing-properties-and-custom-attributes) page for examples. -::: +## Related + +- [`attr:*`](/reference/jsx-attributes/attr) diff --git a/src/routes/reference/jsx-attributes/classlist.mdx b/src/routes/reference/jsx-attributes/classlist.mdx index e98d52575..16515a269 100644 --- a/src/routes/reference/jsx-attributes/classlist.mdx +++ b/src/routes/reference/jsx-attributes/classlist.mdx @@ -1,29 +1,49 @@ --- title: classList order: 1 +use_cases: >- + toggling classes, conditional classes, reactive class updates +tags: + - styling + - css + - classes + - reactive +version: "1.0" +description: >- + Toggle element classes from an object of class names and boolean values. --- -Solid offers two attributes to set the class of an element: `class` and `classList`. +:::warning +`className` was deprecated in Solid 1.4 in favor of `class`. +::: + +`classList` toggles element classes from an object of class names and boolean values. -First, `class` can be set like other attributes. For example: +## Syntax ```tsx -// Two static classes -<div class="active editing" /> +<div classList={{ active: state.active }} /> +``` -// One dynamic class, deleting class attribute if it's not needed -<div class={state.active ? 'active' : undefined} /> +## Value -// Two dynamic classes -<div class={`${state.active ? 'active' : ''} ${state.currentId === row.id ? 'editing' : ''}`} /> -``` +- **Type:** `Record<string, boolean | undefined>` -:::note - Note that <code>className</code> was deprecated in Solid 1.4 in favor of {" "} - <code>class</code>. -::: +Object whose keys are class names and whose values control whether each class is present. -Alternatively, the `classList` pseudo-attribute lets you specify an object, where each key is a class and the value is treated as a boolean representing whether to include that class. For example (matching the last example): +## Behavior + +- Each key is treated as a class name. +- Keys can contain multiple space-separated class names, which are toggled individually. +- Truthy values add the class and falsy values remove it. +- Updates are applied per class rather than replacing the whole `class` attribute. +- `classList` works through normal DOM prop assignment, including prop spreads and `<Dynamic>` when it renders an intrinsic element. +- If both `class` and `classList` are reactive, updates to `class` can overwrite classes managed by `classList`. +- SSR output merges `class`, `className`, and `classList` into the emitted `class` attribute. + +## Examples + +### Basic usage ```tsx <div @@ -34,23 +54,12 @@ Alternatively, the `classList` pseudo-attribute lets you specify an object, wher /> ``` -This example compiles to a render effect that dynamically calls [element.classList.toggle](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/toggle) to turn each class on or off, only when the corresponding boolean changes. For example, when `state.active` becomes true [false], the element gains [loses] the `active` class. - -The value passed into `classList` can be any expression (including a signal getter) that evaluates to an appropriate object. Some examples: +### Dynamic class name ```tsx -// Dynamic class name and value <div classList={{ [className()]: classOn() }} /> - -// Signal class list -const [classes, setClasses] = createSignal({}) -setClasses((c) => ({ ...c, active: true })) -<div classList={classes()} /> ``` -While possible, mixing `class` and `classList` in Solid can lead to unexpected behavior. -The safest approach is to use a static string (or nothing) for `class` and keep `classList` reactive. -You can also use a static computed value for class, such as `class={baseClass()}`, however you must make sure it comes before any `classList` pseudo-attributes. -If both `class` and `classList` are reactive, changes to `class` will overwrite the entire `class` attribute, potentially undoing any updates made by `classList`. +## Related -Because classList is a compile-time pseudo-attribute, it does not work in a prop spread like `<div {...props} />` or in `<Dynamic>`. +- [`class`](/reference/jsx-attributes/class) diff --git a/src/routes/reference/jsx-attributes/innerhtml.mdx b/src/routes/reference/jsx-attributes/innerhtml.mdx index 9c8162a8c..313d60592 100644 --- a/src/routes/reference/jsx-attributes/innerhtml.mdx +++ b/src/routes/reference/jsx-attributes/innerhtml.mdx @@ -1,12 +1,50 @@ --- title: innerHTML +use_cases: >- + rendering HTML strings, replacing element children with parsed markup +tags: + - html + - dom + - security + - markup +version: "1.0" +description: >- + Set an element's `innerHTML` property from JSX. --- -The `innerHTML` attribute is equivalent to the [`innerHTML` DOM property](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML). -This attribute replaces all existing nodes of the element with new nodes generated by parsing the provided string as HTML. +`innerHTML` sets an element's `innerHTML` property. -:::caution +## Syntax -Using `innerHTML` with unsanitized user-supplied data can introduce security vulnerabilities. +```tsx +<div innerHTML={html} /> +``` + +## Value + +- **Type:** `string` + +HTML string inserted as raw markup into the element. + +## Behavior + +- Setting `innerHTML` replaces the element's existing children with nodes parsed from the string. +- The value is written through the DOM `innerHTML` property. +- In SSR output, the HTML string is emitted as child content without escaping. +- Unlike [`textContent`](/reference/jsx-attributes/textcontent), `innerHTML` parses markup instead of inserting plain text. +:::caution +Using `innerHTML` with unsanitized user-supplied data can introduce security vulnerabilities. ::: + +## Examples + +### Basic usage + +```tsx +<div innerHTML={"<strong>Hello</strong>"} /> +``` + +## Related + +- [`textContent`](/reference/jsx-attributes/textcontent) diff --git a/src/routes/reference/jsx-attributes/on.mdx b/src/routes/reference/jsx-attributes/on.mdx index c7e8ee4ec..23a55ab7d 100644 --- a/src/routes/reference/jsx-attributes/on.mdx +++ b/src/routes/reference/jsx-attributes/on.mdx @@ -1,37 +1,87 @@ --- -title: on:* +title: "on:*" order: 4 +use_cases: >- + direct event listeners, custom event names, event listener options +tags: + - events + - listeners + - dom + - capture + - passive +version: "1.0" +description: >- + Attach an event listener directly to an element with `addEventListener`. --- -For events with capital letters, listener options, or if you need to attach event handlers directly to a DOM element instead of optimized delegating via the document, use `on:*` in place of `on*`. +`on:*` attaches an event listener directly to an element with `addEventListener`. + +## Syntax ```tsx -<div on:DOMContentLoaded={(e) => console.log("Welcome!")} /> +<div on:wheel={handler} /> ``` -This directly attaches an event handler (via [`addEventListener`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)) to the `div`. +## Value -:::note -<span>New in v1.9.0</span> -::: +- **Type:** event handler function or object with `handleEvent` and optional `AddEventListenerOptions` + +Listener passed to `addEventListener`. + +## Behavior + +- `on:name={handler}` attaches a listener for the event named `name`. +- The listener is attached directly to the element instead of using Solid's delegated event system. +- Event names keep the text after `on:` exactly as written. +- Use `on:*` when you need exact event casing, such as case-sensitive custom events. +- When the value changes, Solid removes the previous direct listener and adds the new one. +- Listener options such as `once`, `passive`, `capture`, and `signal` can be provided by passing an object that implements `handleEvent`. +- `oncapture:*` remains available as a deprecated capture-specific form. + +## Examples + +### Basic usage + +```tsx +const [message, setMessage] = createSignal("Waiting"); +let el; + +<> + <button + onClick={() => + el.dispatchEvent(new CustomEvent("MyEvent", { detail: "Hello" })) + } + > + Dispatch event + </button> -An aditional special syntax that allows full control of [`capture`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#capture), [`passive`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#passive), [`once`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#once) and [`signal`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal) is an intersection or combination of `EventListenerObject` & `AddEventListenerOptions`, as follows: + <div on:MyEvent={(e) => setMessage(e.detail)} ref={el} /> + <p>{message()}</p> +</>; +``` + +### Listener options ```tsx +const [count, setCount] = createSignal(0); + const handler = { - handleEvent(e) { - console.log(e) + handleEvent() { + setCount((count) => count + 1); }, - once:true, - passive:false, - capture:true -} + once: true, +}; -<div on:wheel={handler} /> +<> + <button on:click={handler}>Click me</button> + <p>Clicked {count()} time(s)</p> +</>; +``` -// or inline +:::note +The object-listener form was added in Solid 1.9.0. It is useful when you need options such as `once`, `passive`, `capture`, or `signal`. +::: -<div on:click={{passive:true, handleEvent(e) { console.log("Weeeee!")}}} /> -``` +## Related -This new syntax replaces the now deprecated `oncapture:` and it's future proof for any posible new event listener options. +- [`on*`](/reference/jsx-attributes/on_) diff --git a/src/routes/reference/jsx-attributes/on_.mdx b/src/routes/reference/jsx-attributes/on_.mdx index c274af477..dccfa80ca 100644 --- a/src/routes/reference/jsx-attributes/on_.mdx +++ b/src/routes/reference/jsx-attributes/on_.mdx @@ -1,35 +1,60 @@ --- title: on* order: 3 +use_cases: >- + delegated UI events, click handlers, input handlers, keyboard handlers +tags: + - events + - handlers + - delegation + - dom +version: "1.0" +description: >- + Attach an event handler with Solid's delegated event system when the event is + supported. --- -Event handlers in Solid typically take the form of `onclick` or `onClick` depending on style. +`on*` attaches an event handler using Solid's delegated event system when the event is supported. + +## Syntax ```tsx -<div onClick={(e) => console.log(e.currentTarget)} /> +<div onClick={handler} /> ``` -Conceptually, this example attaches a `click` event listener (via [`addEventListener`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)) to the `div`. However, Solid actually handles common UI events that bubble and are composed (such as `click`) at the document level, and then synthetically implements delegation (capturing and bubbling). This improves performance for these common events by reducing the number of event handlers. +## Value -Note that `onClick` handles the event `click`; in general, event names get mapped to lower case. If you need to work with event names containing capital letters, or use listener options such once, passive, capture see [`on:`](/reference/jsx-attributes/on) which attaches event handlers directly (also avoiding fancy delegation via document). +- **Type:** event handler function or `[handler, data]` -Solid also supports passing a two-element array to the event handler to bind a value to the first argument of the event handler. This doesn't use `bind` or create an additional closure, so it is a highly optimized way of delegating events. +Event handler, or a handler/data pair for delegated binding. -```tsx -function handler(itemId, e) { - /*...*/ -} +## Behavior + +- Events in Solid's delegated event set use document-level delegation; other `on*` handlers attach directly to the element. +- Event names are mapped to lower case, so `onClick` listens to `click`. +- The two-element array form passes the first item as bound data to the handler. +- Delegated bindings are not reactive and are not rebound automatically when the handler reference changes. +- `onInput` uses the native input event, and `onChange` uses the native change event. +- For direct element listeners, custom event casing, or listener options, use [`on:*`](/reference/jsx-attributes/on). + +## Examples -<ul> - <For each={state.list}>{(item) => <li onClick={[handler, item.id]} />}</For> -</ul>; +### Basic usage + +```tsx +<div onClick={(e) => console.log(e.currentTarget)} /> ``` -Events are never rebound and the bindings are not reactive, as it is expensive to attach and detach listeners. Since event handlers are called like any other function each time an event fires, there is no need for reactivity; shortcut your handler if desired. +### Handler and bound data ```tsx -// if defined, call it; otherwise don't. -<div onClick={() => props.handleClick?.()} /> +function handler(itemId, e) { + console.log(itemId, e); +} + +<For each={state.list}>{(item) => <li onClick={[handler, item.id]} />}</For>; ``` -Note that `onChange` and `onInput` work according to their native behavior (unlike, say, React). [`onInput`](https://developer.mozilla.org/en-US/docs/Web/API/Element/input_event) will fire immediately after the value has changed; for most `<input>` fields, [`onChange`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event) will only fire after the field loses focus. The event's `currentTarget` refers to the element that the event was attached to, while `target` gives the element that actually triggered the event (e.g. the user clicked on). +## Related + +- [`on:*`](/reference/jsx-attributes/on) diff --git a/src/routes/reference/jsx-attributes/once.mdx b/src/routes/reference/jsx-attributes/once.mdx index bd8633755..2e110b5d6 100644 --- a/src/routes/reference/jsx-attributes/once.mdx +++ b/src/routes/reference/jsx-attributes/once.mdx @@ -1,17 +1,41 @@ --- title: "@once" order: 5 +use_cases: >- + non-reactive JSX expressions, compile-time opt-out from reactive wrapping +tags: + - compiler + - jsx + - optimization +version: "1.0" +description: >- + Mark a JSX expression as static at compile time. --- -Solid's compiler uses a heuristic for reactive wrapping and lazy evaluation of JSX expressions. Does it contain a function call, a property access, or JSX? If yes we wrap it in a getter when passed to components or in an effect if passed to native elements. +`/*@once*/` is a compiler marker comment that marks a JSX expression as static. -Knowing this heuristic and its limitations, we can reduce overhead of things we know will never change by accessing them outside of the JSX. A lone variable will never be wrapped. We can also tell the compiler not to wrap them by starting the expression with a comment decorator `/* @once */`. +## Syntax + +```tsx +<MyComponent value={/*@once*/ expr} /> +``` + +## Behavior + +- `/*@once*/` applies to the expression that follows it. +- Marked expressions are compiled as static and do not update when reactive dependencies change. +- It can be used in props and in children. +- Some compiler transforms, including parts of `classList` and `style` handling, do not fully respect `/*@once*/`. + +## Examples + +### Prop value ```tsx <MyComponent static={/*@once*/ state.wontUpdate} /> ``` -This also works on children. +### Child value ```tsx <MyComponent>{/*@once*/ state.wontUpdate}</MyComponent> diff --git a/src/routes/reference/jsx-attributes/prop.mdx b/src/routes/reference/jsx-attributes/prop.mdx index 3195a2275..f1265b830 100644 --- a/src/routes/reference/jsx-attributes/prop.mdx +++ b/src/routes/reference/jsx-attributes/prop.mdx @@ -1,15 +1,51 @@ --- -title: prop:* +title: "prop:*" order: 6 +use_cases: >- + forcing property assignment, writing DOM properties, custom element property + access +tags: + - properties + - dom + - attributes +version: "1.0" +description: >- + Force a JSX key to be written as a DOM property instead of an attribute. --- -Forces the prop to be treated as a property instead of an attribute. - -```tsx -<div prop:scrollTop={props.scrollPos + "px"} /> -``` +`prop:*` forces a JSX key to be written as a DOM property instead of an attribute. :::note[Strong-Typing Custom Properties] Type definitions are required when using TypeScript. See the [TypeScript](/configuration/typescript#forcing-properties-and-custom-attributes) page for examples. ::: + +## Syntax + +```tsx +<div prop:scrollTop={value} /> +``` + +## Value + +- **Type:** property value + +Value assigned directly to the property after the `prop:` prefix is removed. + +## Behavior + +- On the client, `prop:name={value}` strips the `prop:` prefix and assigns the value directly to the `name` property. +- `prop:*` does not produce SSR output. +- Use `prop:*` when a DOM property must receive the value directly. Solid can still assign some custom-element properties without `prop:*`. + +## Examples + +### Basic usage + +```tsx +<input type="checkbox" prop:indeterminate={true} /> +``` + +## Related + +- [`attr:*`](/reference/jsx-attributes/attr) diff --git a/src/routes/reference/jsx-attributes/ref.mdx b/src/routes/reference/jsx-attributes/ref.mdx index 630806570..7434dff3b 100644 --- a/src/routes/reference/jsx-attributes/ref.mdx +++ b/src/routes/reference/jsx-attributes/ref.mdx @@ -1,33 +1,70 @@ --- title: ref order: 7 +use_cases: >- + element references, imperative DOM access, component refs +tags: + - refs + - dom + - elements +version: "1.0" +description: >- + Capture a rendered element or forwarded component ref. --- -Refs are a way of getting access to underlying DOM elements in our JSX. While it is true one could just assign an element to a variable, it is more optimal to leave components in the flow of JSX. Refs are assigned at render time but before the elements are connected to the DOM. They come in 2 flavors. +`ref` captures a rendered element or forwarded component ref. + +## Syntax + +```tsx +<div ref={value} /> +``` + +## Value + +- **Type:** variable binding or callback function + +For DOM elements, variable refs are assigned during render and callback refs receive the element. + +## Behavior + +- Refs are assigned during rendering before the element is connected to the DOM. +- A variable ref assigns the rendered element to the referenced variable. +- A callback ref is called with the rendered element. When `ref` comes through a spread, functional refs are invoked from the spread handling path instead. +- Component refs work only when the component uses or forwards the `ref` prop to an underlying element or child component. + +## Examples + +### Variable ref ```tsx -// variable assigned directly by ref let myDiv; -// use onMount or createEffect to read after connected to the DOM onMount(() => console.log(myDiv)); -<div ref={myDiv} /> +<div ref={myDiv} />; +``` + +### Callback ref -// Or, callback function (called before connected to the DOM) -<div ref={el => console.log(el)} /> +```tsx +<div ref={(el) => console.log(el)} /> ``` -Refs can also be used on Components. They still need to be attached on the other side. +### Component ref ```tsx function MyComp(props) { - return <div ref={props.ref} /> + return <div ref={props.ref} />; } function App() { - let myDiv - onMount(() => console.log(myDiv.clientWidth)) - return <MyComp ref={myDiv} /> + let myDiv; + onMount(() => console.log(myDiv.clientWidth)); + return <MyComp ref={myDiv} />; } ``` + +## Related + +- [`onMount`](/reference/lifecycle/on-mount) diff --git a/src/routes/reference/jsx-attributes/style.mdx b/src/routes/reference/jsx-attributes/style.mdx index 4a65409b8..cc34fce61 100644 --- a/src/routes/reference/jsx-attributes/style.mdx +++ b/src/routes/reference/jsx-attributes/style.mdx @@ -1,38 +1,66 @@ --- title: style order: 7 +use_cases: >- + inline styles, dynamic style values, CSS variables +tags: + - styling + - css + - inline + - variables +version: "1.0" +description: >- + Set inline styles with a CSS string or an object of property names and values. --- -Solid's style attribute lets you provide either a CSS string or an object where keys are CSS property names: +`style` sets inline styles from either a CSS string or an object. + +## Syntax ```tsx -// string -<div style={`color: green; height: ${state.height}px`} /> +<div style="color: green" /> +<div style={{ color: "green" }} /> +``` -// object -<div style={{ - color: "green", - height: state.height + "px" }} -/> +## Value + +- **Type:** `string | CSSProperties` + +CSS string or style object. + +## Behavior + +- String values are written as inline CSS text. +- Object values are applied property by property with `element.style.setProperty`, so keys should use lower-case, dash-separated CSS property names instead of camelCase. CSS custom properties can use keys such as `--my-color`. +- Nullish values in a style object remove that property, and falsy overall `style` values remove the `style` attribute. +- In SSR output, object values are serialized into the emitted `style` attribute. + +## Examples + +### CSS string + +```tsx +<div style={`color: green; height: ${state.height}px`} /> ``` -Unlike [React's style attribute](https://reactjs.org/docs/dom-elements.html#style), Solid uses **element.style.setProperty** under the hood. This means you need to use the lower-case, dash-separated version of property names instead of the JavaScript camel-cased version, such as `background-color` rather than `backgroundColor`. This actually leads to better performance and consistency with SSR output. +### Style object ```tsx -// string -<div style={`color: green; background-color: ${state.color}; height: ${state.height}px`} /> - -// object -<div style={{ - color: "green", - "background-color": state.color, - height: state.height + "px" }} +<div + style={{ + color: "green", + "background-color": state.color, + height: `${state.height}px`, + }} /> ``` -This also means you can set CSS variables! For example: +### CSS variable ```tsx -// set css variable <div style={{ "--my-custom-color": state.themeColor }} /> ``` + +## Related + +- [`classList`](/reference/jsx-attributes/classlist) diff --git a/src/routes/reference/jsx-attributes/textcontent.mdx b/src/routes/reference/jsx-attributes/textcontent.mdx index bb80437b8..f90639b84 100644 --- a/src/routes/reference/jsx-attributes/textcontent.mdx +++ b/src/routes/reference/jsx-attributes/textcontent.mdx @@ -1,8 +1,43 @@ --- title: textContent +use_cases: >- + text-only content, replacing element children with text +tags: + - text + - content + - dom +version: "1.0" +description: >- + Set an element's `textContent` property from JSX with plain text content. --- -The `textContent` attribute is equivalent to the [`textContent` DOM property](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent). -This attribute replaces all existing child nodes of the element with a single text node containing the provided string. +`textContent` sets an element's `textContent` property with plain text content. -Using `textContent` can improve performance when the element's children are known to be exclusively text, as it bypasses the generic diffing process. +## Syntax + +```tsx +<div textContent={value} /> +``` + +## Value + +- **Type:** `string | number` + +Text written to the element without parsing markup. + +## Behavior + +- `textContent` replaces the element's existing child content instead of merging with JSX children. +- On the client, the value is written through the DOM `textContent` property. During SSR, it is emitted as escaped text instead of raw HTML. + +## Examples + +### Basic usage + +```tsx +<div textContent={"<strong>Hello</strong>"} /> +``` + +## Related + +- [`innerHTML`](/reference/jsx-attributes/innerhtml) diff --git a/src/routes/reference/jsx-attributes/use.mdx b/src/routes/reference/jsx-attributes/use.mdx index b622f82c2..4f7e80cc4 100644 --- a/src/routes/reference/jsx-attributes/use.mdx +++ b/src/routes/reference/jsx-attributes/use.mdx @@ -1,41 +1,76 @@ --- -title: use:* +title: "use:*" order: 5 +use_cases: >- + reusable DOM behavior, directives, element setup helpers +tags: + - directives + - dom + - jsx +version: "1.0" +description: >- + Attach a directive function to a native element with `use:*`. --- -These are custom directives. In a sense this is just syntax sugar over ref but allows us to easily attach multiple directives to a single element. A directive is a function with the following signature: +`use:*` attaches a directive function to a native element. + +## Syntax + +```tsx +<input use:model={[value, setValue]} /> +``` + +## Type ```ts -function directive(element: Element, accessor: () => any): void +type Accessor<T> = () => T; + +function directive(element: Element, accessor?: Accessor<any>): void; ``` -Directive functions are called at render time but before being added to the DOM. You can do whatever you'd like in them including create signals, effects, register clean-up etc. +## Value + +- **Type:** directive argument + +The directive reads the value through an accessor. Without an explicit value, the accessor returns `true`. + +## Behavior + +- `use:name={value}` passes the element and an accessor for `value` to the directive. +- Without an explicit value, the accessor returns `true`. +- The directive runs during rendering in the current owner, before the element is connected to the DOM, so it can create effects and register cleanup. +- `use:*` works only on native elements, including custom elements, and is not forwarded through user-defined components. + +## Examples + +### Basic usage ```tsx -const [name, setName] = createSignal("") +function model(element, value) { + const [field, setField] = value(); + const onInput = ({ currentTarget }) => setField(currentTarget.value); + + createRenderEffect(() => (element.value = field())); + element.addEventListener("input", onInput); + onCleanup(() => element.removeEventListener("input", onInput)); +} -function model(el, value) { - const [field, setField] = value() - createRenderEffect(() => (el.value = field())) - el.addEventListener("input", (e) => setField(e.target.value)) -}; +const [name, setName] = createSignal(""); -<input type="text" use:model={[name, setName]} /> +<input type="text" use:model={[name, setName]} />; ``` -To register with TypeScript extend the JSX namespace. +:::note +When using TypeScript, custom directives may require extending Solid's JSX directive typings: ```ts declare module "solid-js" { namespace JSX { interface Directives { - model: [() => any, (v: any) => any] + model: [Accessor<string>, Setter<string>]; } } } ``` -:::caution[Limitations] -Directives only work with native HTML elements (HTML/SVG/MathML/Custom Elements). -Directives are not forwarded and **won't work in user defined components**, such as `<MyComponent use:myinput={[..]}/>` [see also](https://github.com/solidjs/solid/discussions/722) ::: diff --git a/src/routes/reference/lifecycle/on-cleanup.mdx b/src/routes/reference/lifecycle/on-cleanup.mdx index 1472442f5..954a582d5 100644 --- a/src/routes/reference/lifecycle/on-cleanup.mdx +++ b/src/routes/reference/lifecycle/on-cleanup.mdx @@ -1,40 +1,103 @@ --- title: onCleanup order: 5 +use_cases: >- + component unmounting, memory leak prevention, event listener cleanup, side + effect cleanup, resource disposal +tags: + - lifecycle + - cleanup + - memory + - events + - disposal +version: "1.0" +description: >- + Register a cleanup function on the current reactive scope. The cleanup runs + when the scope is disposed or refreshed. --- -`onCleanup` registers a cleanup method that executes on disposal and recalculation of the current tracking scope. -Can be used anywhere to clean up any side effects left behind by initialization. +`onCleanup` registers a cleanup function on the current reactive scope. +The cleanup runs when that scope is disposed or refreshed. -When used in a Component, it runs when the component is unmounted. -When used in tracking scope, such [`createEffect`](/reference/basic-reactivity/create-effect), [`createMemo`](/reference/basic-reactivity/create-memo) or a [`createRoot`](/reference/reactive-utilities/create-root), it runs when the tracking scope is disposed or refreshed. +## Import ```ts -import { onCleanup } from "solid-js" +import { onCleanup } from "solid-js"; +``` + +## Type -function onCleanup(fn: () => void): void; +```ts +function onCleanup<T extends () => any>(fn: T): T; ``` -Without the `onCleanup` function, the event listener would remain attached to the `document` even after the component is removed from the page. -This can cause memory leaks and other issues. +## Parameters + +### `fn` + +- **Type:** `() => any` +- **Required:** Yes + +Cleanup function registered on the current reactive scope. + +## Return value + +- **Type:** `T` + +Returns `fn` unchanged. + +## Behavior + +- In a component, the cleanup runs when that component is unmounted. +- In a tracking scope such as [`createEffect`](/reference/basic-reactivity/create-effect), [`createMemo`](/reference/basic-reactivity/create-memo), or [`createRoot`](/reference/reactive-utilities/create-root), the cleanup runs when that scope is disposed or re-executes. +- Multiple cleanup functions run when the owning scope is cleaned up. +- Calling `onCleanup` outside a reactive owner does not register a cleanup. In development, Solid warns that the cleanup will never run. +- On the server, cleanup also runs when server-side owners or reactive branches are disposed. + +## Examples + +### Remove an event listener ```tsx -import { createSignal, onCleanup } from "solid-js" +import { onCleanup } from "solid-js"; const Component = () => { - const [count, setCount] = createSignal(0); - - const handleClick = () => setCount((value) => value + 1); + const handleClick = () => console.log("clicked"); document.addEventListener("click", handleClick); - /** - * Remove the event listener when the component is removed/unmounted from the page. - */ onCleanup(() => { document.removeEventListener("click", handleClick); }); - return <main>Document has been clicked {count()} times</main>; + return <main>Listening for document clicks</main>; }; ``` + +### Clean up before an effect re-runs + +```tsx +import { createEffect, createSignal, onCleanup } from "solid-js"; + +function Example() { + const [topic, setTopic] = createSignal("news"); + + createEffect(() => { + const currentTopic = topic(); + + console.log("subscribing to", currentTopic); + + onCleanup(() => { + console.log("cleaning up", currentTopic); + }); + }); + + return <button onClick={() => setTopic("sports")}>Change topic</button>; +} +``` + +## Related + +- [`onMount`](/reference/lifecycle/on-mount) +- [`createEffect`](/reference/basic-reactivity/create-effect) +- [`createRoot`](/reference/reactive-utilities/create-root) diff --git a/src/routes/reference/lifecycle/on-mount.mdx b/src/routes/reference/lifecycle/on-mount.mdx index 9d59843dd..2ead251c2 100644 --- a/src/routes/reference/lifecycle/on-mount.mdx +++ b/src/routes/reference/lifecycle/on-mount.mdx @@ -1,31 +1,91 @@ --- title: onMount order: 5 +use_cases: >- + initial setup, dom refs access, one-time initialization, component mounting, + element manipulation after render +tags: + - lifecycle + - mounting + - refs + - dom + - initialization +version: "1.0" +description: >- + Register a function that runs once after the initial render of the current + component or root. --- -Registers a method that runs after initial rendering is done and the elements are mounted to the page. -Ideal for using [refs](/reference/jsx-attributes/ref) and managing other one-time setup. +`onMount` registers a function that runs once after the initial render for the current component or root. -```tsx -import { onMount } from "solid-js" +## Import + +```ts +import { onMount } from "solid-js"; +``` -function onMount(fn: () => void): void +## Type +```ts +function onMount(fn: () => void): void; ``` -This is an alias for an effect that is non-tracking, meaning that it is equivalent to a [`createEffect`](/reference/basic-reactivity/create-effect) with no dependencies. +## Parameters + +### `fn` + +- **Type:** `() => void` +- **Required:** Yes + +Non-tracking function executed once on mount. + +## Return value + +`onMount` does not return a value. + +## Behavior + +- On the client, `onMount` runs once after the initial render. It does not run during server rendering. +- `fn` does not track reactive dependencies. +- Internally, `onMount(fn)` is equivalent to `createEffect(() => untrack(fn))`. +- By the time `onMount` runs, refs have already been assigned. +- Returning a function from `fn` does not register cleanup. Use [`onCleanup`](/reference/lifecycle/on-cleanup) inside `onMount` when cleanup is needed. + +## Examples + +### Access a ref after mount ```tsx -// example that shows how to use onMount to get a reference to an element -import { onMount } from "solid-js" +import { onMount } from "solid-js"; function MyComponent() { - let ref: HTMLButtonElement + let ref: HTMLButtonElement; - // when the component is mounted, the button will be disabled onMount(() => { - ref.disabled = true - }) - return <button ref={ref}>Focus me!</button> + ref.disabled = true; + }); + + return <button ref={ref}>Focus me!</button>; } ``` + +### Run one-time browser setup + +```tsx +import { onMount } from "solid-js"; + +function Example() { + onMount(() => { + // Browser-only code + console.log(window.location.pathname); + }); + + return <div>Mounted</div>; +} +``` + +## Related + +- [`onCleanup`](/reference/lifecycle/on-cleanup) +- [`createEffect`](/reference/basic-reactivity/create-effect) +- [`untrack`](/reference/reactive-utilities/untrack) diff --git a/src/routes/reference/reactive-utilities/batch.mdx b/src/routes/reference/reactive-utilities/batch.mdx index 1763c9819..ab04ae9bd 100644 --- a/src/routes/reference/reactive-utilities/batch.mdx +++ b/src/routes/reference/reactive-utilities/batch.mdx @@ -1,76 +1,104 @@ --- title: batch +use_cases: >- + performance optimization, multiple signal updates, reducing re-renders, bulk + state changes, avoiding unnecessary recalculations +tags: + - performance + - optimization + - signals + - batching + - updates +version: "1.0" +description: >- + Group reactive updates so downstream computations run after the batch + completes. --- +`batch` groups multiple reactive updates so downstream computations run once after the batch completes instead of after each individual update. + +## Import + ```ts -import { batch } from "solid-js" +import { batch } from "solid-js"; +``` -function batch<T>(fn: () => T): T +## Type + +```ts +function batch<T>(fn: () => T): T; ``` -`batch` is a low-level API that batches updates together. -More precisely, `batch(fn)` holds the execution of downstream computations during the `fn` block, executing them all together once the block `fn` returns. -Thus, instead of a downstream computation executing after every dependency update, it will update just once at the end of the batch. +## Parameters + +### `fn` + +- **Type:** `() => T` +- **Required:** Yes + +Function executed inside the batch. + +## Return value + +- **Type:** `T` + +Returns the value produced by `fn`. -Batching improves performance by avoiding unnecessary recalculation. -Suppose you have a downstream memo `down` that depends on multiple upstream signals `up1`, `up2`, and `up3`: +## Behavior + +- Downstream computations are deferred until the batch completes. +- Nested `batch` calls behave like a single larger batch. +- If you read a stale memo or signal inside the batch, Solid updates it on demand before returning the value. +- If `fn` is asynchronous, batching applies only to updates before the first `await` or other async suspension point. + +## Automatic batching + +Solid automatically batches updates in several cases, including: + +- inside [`createEffect`](/reference/basic-reactivity/create-effect) and [`onMount`](/reference/lifecycle/on-mount) +- inside the setter returned by [`createStore`](/reference/store-utilities/create-store) +- inside array mutation methods on [`createMutable`](/reference/store-utilities/create-mutable) + +## Examples + +### Basic usage ```ts -import { createSignal, createMemo, createEffect } from "solid-js" -const [up1, setUp1] = createSignal(1) -const [up2, setUp2] = createSignal(2) -const [up3, setUp3] = createSignal(3) -const down = createMemo(() => up1() + up2() + up3()) -// For illustration, monitor when `down` gets recomputed: -createEffect(() => console.log(down())) // outputs 6 +const [count, setCount] = createSignal(0); +const [total, setTotal] = createSignal(0); + +const summary = createMemo(() => `${count()} / ${total()}`); +createEffect(() => console.log(summary())); // logs "0 / 0" ``` -If you directly update all of the upstream signals outside of batch mode, then `down` will recompute every time. +Outside `batch`: ```ts -setUp1(4) // recomputes down, outputs 9 -setUp2(5) // recomputes down, outputs 12 -setUp3(6) // recomputes down, outputs 15 +setCount(1); // logs "1 / 0" +setTotal(5); // logs "1 / 5" ``` -If instead you update the upstream signals within a `batch`, then `down` will update only once at the end: +Inside `batch`: ```ts batch(() => { - setUp1(10) // doesn't update down yet - setUp2(10) // doesn't update down yet - setUp3(10) // doesn't update down yet -}) // recomputes down, outputs 30 + setCount(1); + setTotal(5); +}); // logs "1 / 5" ``` -The impact is even more dramatic if you have *m* downstream computations (memos, effects, etc.) that each depends on *n* upstream signals. -Without batching, modifying all *n* upstream signals would cause *m n* updates to the downstream computations. -With batching, modifying all *n* upstream signals would cause *m* updates to the downstream computations. -Given that each update takes at least *n* time (just to read the upstream signals), this cost savings can be significant. -Batching is also especially helpful when the downstream effects include DOM updates, which can be expensive. - -Solid uses `batch` internally to automatically batch updates for you in a few cases: - -* Within [`createEffect`](/reference/basic-reactivity/create-effect) and [`onMount`](/reference/lifecycle/on-mount) (unless they are outside a [root](/reference/reactive-utilities/create-root)) -* Within the [setter of a store](/reference/store-utilities/create-store#setter) (which can update several properties at once) -* Within array methods (e.g. `Array.prototype.splice`) of a [mutable store](/reference/store-utilities/create-mutable) (which can update several elements at once) - -These save you from having to use `batch` yourself in many cases. -For the most part, automatic batching should be transparent to you, because accessing a signal or memo will cause it to update if it is out of date (as of Solid 1.4). -For example: +### Read inside a batch ```ts batch(() => { - setUp1(11) // doesn't update down yet - setUp2(11) // doesn't update down yet - setUp3(11) // doesn't update down yet - console.log(down()) // recomputes down, outputs 33 - setUp1(12) // doesn't update down yet - setUp2(12) // doesn't update down yet - setUp3(12) // doesn't update down yet -}) // recomputes down, outputs 36 + setCount(2); + console.log(summary()); // logs "2 / 5" + setTotal(10); +}); // logs "2 / 10" ``` -You can think of `batch(fn)` as setting a global "batch mode" variable, calling the function `fn`, and then restoring the global variable to its previous value. -This means that you can nest `batch` calls, and they will form one big batch. -It also means that, if `fn` is asynchronous, only the updates before the first `await` will be batched. +## Related + +- [`createEffect`](/reference/basic-reactivity/create-effect) +- [`createStore`](/reference/store-utilities/create-store) +- [`createMutable`](/reference/store-utilities/create-mutable) diff --git a/src/routes/reference/reactive-utilities/catch-error.mdx b/src/routes/reference/reactive-utilities/catch-error.mdx index 49d1db388..b9b5b4c77 100644 --- a/src/routes/reference/reactive-utilities/catch-error.mdx +++ b/src/routes/reference/reactive-utilities/catch-error.mdx @@ -1,17 +1,89 @@ --- title: catchError +use_cases: >- + error handling, error boundaries, exception management, debugging, graceful + error recovery +tags: + - errors + - debugging + - exceptions + - handlers +version: "1.0" +description: >- + Establish an error boundary for work performed inside the provided function. --- -:::note -<span>New in v1.7.0</span> -::: +`catchError` establishes an error boundary for work performed inside the provided function. + +## Import + +```ts +import { catchError } from "solid-js"; +``` + +## Type + +```ts +function catchError<T>( + fn: () => T, + handler: (err: Error) => void +): T | undefined; +``` + +## Parameters + +### `fn` + +- **Type:** `() => T` +- **Required:** Yes + +Function executed inside the error boundary. + +### `handler` + +- **Type:** `(err: Error) => void` +- **Required:** Yes + +Error handler invoked when a thrown value reaches this boundary. + +## Return value + +- **Type:** `T | undefined` + +Returns the value produced by `fn`, or `undefined` when a thrown value is caught and handled. + +## Behavior + +- While `fn` runs, `catchError` establishes an error boundary for reactive scopes created inside it. +- Only the nearest matching error boundary handles a thrown error. +- If `handler` throws, the next parent error boundary handles that error. + +## Examples + +### Handle an error in a child scope ```tsx -import { catchError } from "solid-js" +import { catchError, createEffect, createSignal } from "solid-js"; + +function Example() { + const [count, setCount] = createSignal(0); -function catchError<T>(tryFn: () => T, onError: (err: any) => void): T + catchError( + () => { + createEffect(() => { + if (count() > 2) throw new Error("count too large"); + }); + }, + (err) => { + console.error(err.message); + } + ); + + return <button onClick={() => setCount((c) => c + 1)}>Increment</button>; +} ``` -Wraps a `tryFn` with an error handler that fires if an error occurs below that point. -Only the nearest scope error handlers execute. -Rethrow to trigger up the line. +## Related + +- [`ErrorBoundary`](/reference/components/error-boundary) +- [`createEffect`](/reference/basic-reactivity/create-effect) diff --git a/src/routes/reference/reactive-utilities/create-root.mdx b/src/routes/reference/reactive-utilities/create-root.mdx index 588664d27..cd633a8ab 100644 --- a/src/routes/reference/reactive-utilities/create-root.mdx +++ b/src/routes/reference/reactive-utilities/create-root.mdx @@ -1,16 +1,129 @@ --- title: createRoot +use_cases: >- + memory management, nested tracking scopes, non-auto-disposing scopes, manual + cleanup control, top-level code wrapping +tags: + - roots + - memory + - scopes + - disposal + - tracking +version: "1.0" +description: >- + Create non-tracked owner scopes in SolidJS for manual memory management. + Essential for nested tracking scopes and preventing auto-disposal. --- +The `createRoot` function creates a new owned context, which requires explicit disposal of computations it owns. + +## Import + +```ts +import { createRoot } from "solid-js"; +``` + +## Type + +```ts +function createRoot<T>( + fn: (dispose: () => void) => T, + detachedOwner?: Owner +): T; +``` + +## Parameters + +### `fn` + +- **Type:** `(dispose: () => void) => T` +- **Required:** Yes + +The function executes within a newly created owned context. +The computations created within this function are managed by the root and will only be disposed of when the provided `dispose` function is called. + +If a function is passed without a `dispose` parameter, an unowned root is created. +In this case, the computations are not managed for disposal, which may lead to memory leaks. + +This function itself does not track dependencies and only runs once. + +### `detachedOwner` + +- **Type:** `Owner` +- **Required:** No + +An optional owner that establishes the root's position in the ownership hierarchy. +When provided, the root becomes owned by this owner and inherits its contextual state (such as [contexts](/concepts/context)). + +## Return Value + +`createRoot` returns the value returned by the `fn` function. + +## Examples + +### Basic Usage + +```ts +import { createSignal, createEffect, createRoot } from "solid-js"; + +function createCounter(initial = 0) { + const [count, setCount] = createSignal(initial); + + createEffect(() => { + console.log(`Count changed, new value: ${count()}`); + }); + + function increment() { + setCount((c) => c + 1); + } + + function reset() { + setCount(initial); + } + + return { count, increment, reset }; +} + +test("createCounter works correctly", () => { + createRoot((dispose) => { + const { count, increment, reset } = createCounter(10); + + expect(count()).toBe(10); + increment(); + expect(count()).toBe(11); + reset(); + expect(count()).toBe(10); + + dispose(); + }); +}); +``` + +### Returning Values + ```ts -import { createRoot } from "solid-js" +import { createRoot, createSignal, onCleanup } from "solid-js"; + +const counter = createRoot((dispose) => { + const [count, setCount] = createSignal(0); + + onCleanup(() => { + console.log("Dispose was called!"); + }); -function createRoot<T>(fn: (dispose: () => void) => T): T + return { + value: count, + increment: () => setCount((c) => c + 1), + dispose, + }; +}); +console.log(counter.value()); // 0 +counter.increment(); +console.log(counter.value()); // 1 +counter.dispose(); // Logs "Dispose was called!" ``` -Creates a new non-tracked owner scope that doesn't auto-dispose. -This is useful for nested tracking scopes that you do not wish to release when the parent re-evaluates. +## Related -All Solid code should be wrapped in one of these top level as they ensure that all memory/computations are freed up. -Normally you do not need to worry about this as createRoot is embedded into all render entry functions. +- [`render`](/reference/rendering/render) diff --git a/src/routes/reference/reactive-utilities/from.mdx b/src/routes/reference/reactive-utilities/from.mdx index ad45aea13..07a28c0c6 100644 --- a/src/routes/reference/reactive-utilities/from.mdx +++ b/src/routes/reference/reactive-utilities/from.mdx @@ -1,43 +1,117 @@ --- title: from +use_cases: >- + rxjs interop, svelte stores integration, external observables, third-party + state management, converting subscriptions to signals +tags: + - interop + - rxjs + - observables + - signals + - integration +version: "1.0" +description: >- + Convert an external producer or subscribable into a Solid accessor. --- -```tsx -import { from } from "solid-js" - -function from<T>( - producer: - | ((setter: (v: T) => T) => () => void) - | { - subscribe: ( - fn: (v: T) => void - ) => (() => void) | { unsubscribe: () => void } - } -): () => T | undefined +`from` creates an accessor from an external producer or subscribable source. + +## Import + +```ts +import { from } from "solid-js"; +``` + +## Type + +```ts +function from<T>(producer: Producer<T>, initialValue: T): () => T; +function from<T>(producer: Producer<T | undefined>): () => T | undefined; +type Producer<T> = + | ((setter: Setter<T>) => () => void) + | { + subscribe: ( + fn: (value: T) => void + ) => (() => void) | { unsubscribe: () => void }; + }; ``` -A helper to make it easier to interop with external producers like RxJS observables or with Svelte Stores. -This basically turns any subscribable (object with a subscribe method) into a Signal and manages subscription and disposal. +## Parameters + +### `producer` + +- **Type:** `Producer<T>` or `Producer<T | undefined>` +- **Required:** Yes + +Producer function or subscribable object. + +### `initialValue` + +- **Type:** `T` +- **Required:** No + +Initial value for the accessor. + +## Return value + +- **Type:** `() => T` or `() => T | undefined` + +Returns an accessor backed by the external source. + +## Behavior + +- `from` subscribes to the producer immediately when it runs. +- A producer function receives a Solid setter and returns a cleanup function. +- A subscribable source must expose `subscribe()`, and that subscription may return either a cleanup function or an object with `unsubscribe()`. +- Emitted values are not deduplicated by equality. +- Cleanup is registered on the current Solid owner when one exists. +- When `from` runs without an owner, the subscription still starts but is not cleaned up automatically. +- When `initialValue` is omitted, the accessor can return `undefined`. + +## Examples + +### Create an accessor from a subscribable source ```tsx -const signal = from(obsv$) +import { from } from "solid-js"; + +function Clock() { + const time = from( + { + subscribe(next) { + const interval = setInterval( + () => next(new Date().toLocaleTimeString()), + 1000 + ); + return () => clearInterval(interval); + }, + }, + "" + ); + + return <div>{time()}</div>; +} ``` -It can also take a custom producer function where the function is passed a setter function that returns an unsubscribe function: +### Create an accessor from a producer function ```tsx -const clock = from((set) => { - const interval = setInterval(() => { - set((v) => v + 1) - }, 1000) +import { from } from "solid-js"; + +function Counter() { + const count = from((set) => { + const interval = setInterval(() => { + set((value = 0) => value + 1); + }, 1000); + + return () => clearInterval(interval); + }, 0); - return () => clearInterval(interval) -}) + return <div>{count()}</div>; +} ``` -## Arguments +## Related -| Name | Type | Description | -| :------- | :----------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------- | -| producer | `((setter: (v: T) => T) => () => void) \| { subscribe: (fn: (v: T) => void) => (() => void) \| { unsubscribe: () => void }; }` | The producer function or subscribable object | +- [`observable`](/reference/reactive-utilities/observable) diff --git a/src/routes/reference/reactive-utilities/get-owner.mdx b/src/routes/reference/reactive-utilities/get-owner.mdx index 7c1f59504..506b962d6 100644 --- a/src/routes/reference/reactive-utilities/get-owner.mdx +++ b/src/routes/reference/reactive-utilities/get-owner.mdx @@ -1,24 +1,80 @@ --- title: getOwner +use_cases: >- + advanced tracking control, custom cleanup logic, understanding component + hierarchy, debugging ownership chains, manual scope management +tags: + - ownership + - tracking + - scopes + - cleanup + - debugging +version: "1.0" +description: >- + Return the owner for the currently executing reactive scope. --- -```tsx -import { getOwner } from "solid-js" -import type { Owner } from "solid-js" +`getOwner` returns the owner for the currently executing reactive scope. + +## Import + +```ts +import { getOwner } from "solid-js"; +``` + +## Type -function getOwner(): Owner +```ts +type Owner = unknown; +function getOwner(): Owner | null; ``` -Gets the tracking scope that owns the currently running code, e.g., for passing into a later call to `runWithOwner` outside of the current scope. +The `Owner` interface is public, but its concrete shape is mostly useful for advanced interop such as [`runWithOwner`](/reference/reactive-utilities/run-with-owner). + +## Parameters + +`getOwner` does not take any parameters. + +## Return value + +- **Type:** `Owner | null` + +Returns the current owner or `null` when no owner is active. -Internally, computations (effects, memos, etc.) create owners which are children of their owner, all the way up to the root owner created by `createRoot` or `render`. -In particular, this ownership tree lets Solid automatically clean up a disposed computation by traversing its subtree and calling all `onCleanup` callbacks. -For example, when a createEffect's dependencies change, the effect calls all descendant `onCleanup` callbacks before running the effect function again. -Calling `getOwner` returns the current owner node that is responsible for disposal of the current execution block. +## Behavior + +- `getOwner` returns the current owner and does not create or modify ownership. +- Owners determine cleanup and context lookup for descendant computations. +- A computation created inside the current scope becomes part of the current owner tree unless ownership is overridden. +- Component functions run under an owner created for that subtree. +- Calling `getOwner` inside component code returns the owner responsible for rendering and disposing that component subtree. +- Turning off tracking with [`untrack`](/reference/reactive-utilities/untrack) does not create a new owner. + +## Examples + +### Capture an owner for later use + +```tsx +import { getOwner, runWithOwner } from "solid-js"; + +function Example() { + const owner = getOwner(); + + queueMicrotask(() => { + if (owner) { + runWithOwner(owner, () => { + console.log("owner restored"); + }); + } + }); + + return null; +} +``` -Components are not computations, so do not create an owner node, but they are typically rendered from a `createEffect` which does, so the result is similar: when a component gets unmounted, all descendant `onCleanup` callbacks get called. -Calling `getOwner` from a component scope returns the owner that is responsible for rendering and unmounting that component. +## Related -Note that the owning tracking scope isn't necessarily tracking. -For example, untrack turns off tracking for the duration of a function (without creating a new tracking scope), as do components created via JSX (`<Component ...>`). +- [`runWithOwner`](/reference/reactive-utilities/run-with-owner) +- [`onCleanup`](/reference/lifecycle/on-cleanup) +- [`untrack`](/reference/reactive-utilities/untrack) diff --git a/src/routes/reference/reactive-utilities/index-array.mdx b/src/routes/reference/reactive-utilities/index-array.mdx index a8b6036ee..43a0820f5 100644 --- a/src/routes/reference/reactive-utilities/index-array.mdx +++ b/src/routes/reference/reactive-utilities/index-array.mdx @@ -1,41 +1,94 @@ --- title: indexArray +use_cases: >- + rendering lists by index, stable item references, index-based list operations, + optimized list rendering +tags: + - arrays + - lists + - index + - rendering + - optimization +version: "1.0" +description: >- + Reactively map an array by index and return an accessor for the mapped + result. --- -```tsx -import { indexArray } from "solid-js" +`indexArray` reactively maps an array by index. -function indexArray<T, U>( - list: () => readonly T[], - mapFn: (v: () => T, i: number) => U -): () => U[] +## Import +```ts +import { indexArray } from "solid-js"; ``` -Similar to `mapArray` except it maps by index. -The item is a signal and the index is now the constant. - -Underlying helper for the `<Index>` control flow. - -```tsx -const mapped = indexArray(source, (model) => { - return { - get id() { - return model().id - } - get firstInitial() { - return model().firstName[0]; - }, - get fullName() { - return `${model().firstName} ${model().lastName}`; - }, - } -}); +## Type + +```ts +function indexArray<T, U>( + list: () => readonly T[] | undefined | null | false, + mapFn: (value: () => T, index: number) => U, + options?: { fallback?: () => any } +): () => U[]; +``` + +## Parameters + +### `list` + +- **Type:** `() => readonly T[] | undefined | null | false` +- **Required:** Yes + +Accessor that returns the source array. + +### `mapFn` + +- **Type:** `(value: () => T, index: number) => U` +- **Required:** Yes + +Mapping function for each index. + +### `options` + +#### `fallback` + +- **Type:** `() => any` + +Fallback accessor used when the source array is empty or falsy. +The mapped result becomes a single fallback entry. + +## Return value + +- **Type:** `() => U[]` + +Returns an accessor for the mapped array. + +## Behavior + +- Items are mapped by index rather than by value identity. +- The item argument is an accessor. +- The index argument is a number. +- Updating an item at the same index updates the corresponding mapped result. +- Reordering the source array changes which item each index points to instead of moving mapped entries by identity. +- This is the underlying helper for [`<Index>`](/reference/components/index-component). + +## Examples + +### Map an array by index + +```ts +import { createSignal, indexArray } from "solid-js"; + +const [source] = createSignal([{ status: "pending" }, { status: "done" }]); + +const mapped = indexArray(source, (item, index) => ({ + index, + status: () => item().status, +})); ``` -## Arguments +## Related -| Name | Type | Description | -| :---- | :----------------------------- | :-------------------- | -| list | `() => readonly T[]` | The list to map. | -| mapFn | `(v: () => T, i: number) => U` | The mapping function. | +- [`<Index>`](/reference/components/index-component) +- [`mapArray`](/reference/reactive-utilities/map-array) diff --git a/src/routes/reference/reactive-utilities/map-array.mdx b/src/routes/reference/reactive-utilities/map-array.mdx index 78e2dbfd4..71014379a 100644 --- a/src/routes/reference/reactive-utilities/map-array.mdx +++ b/src/routes/reference/reactive-utilities/map-array.mdx @@ -1,45 +1,96 @@ --- title: mapArray +use_cases: >- + efficient list rendering, dynamic arrays, cached list transformations, + optimized updates, for loop alternatives +tags: + - arrays + - lists + - rendering + - caching + - optimization +version: "1.0" +description: >- + Reactively map an array by item identity and return an accessor for the mapped + result. --- +`mapArray` reactively maps an array and caches mapped items by value identity. + +## Import + ```ts -import { mapArray } from "solid-js" +import { mapArray } from "solid-js"; +``` -function mapArray<T, U>( - list: () => readonly T[], - mapFn: (v: T, i: () => number) => U -): () => U[] +## Type +```ts +function mapArray<T, U>( + list: () => readonly T[] | undefined | null | false, + mapFn: (value: T, index: () => number) => U, + options?: { fallback?: () => any } +): () => U[]; ``` -Reactive map helper that caches each item by reference to reduce unnecessary mapping on updates. -It only runs the mapping function once per value and then moves or removes it as needed. -The index argument is a signal. The map function itself is not tracking. +## Parameters + +### `list` + +- **Type:** `() => readonly T[] | undefined | null | false` +- **Required:** Yes + +Accessor that returns the source array. + +### `mapFn` + +- **Type:** `(value: T, index: () => number) => U` +- **Required:** Yes + +Mapping function for each item. -Underlying helper for the `<For>` control flow. +### `options` + +#### `fallback` + +- **Type:** `() => any` + +Fallback accessor used when the source array is empty or falsy. The mapped result becomes a single fallback entry. + +## Return value + +- **Type:** `() => U[]` + +Returns an accessor for the mapped array. + +## Behavior + +- Items are cached by value identity. +- The index argument is an accessor. +- `mapFn` is not a tracking scope, so reads inside the callback do not track unless they happen inside nested JSX or another reactive scope. +- Reordering reuses existing mapped items for retained source values and updates their index accessors. +- This is the underlying helper for [`<For>`](/reference/components/for). + +## Examples + +### Map an array with cached items ```ts -const mapped = mapArray(source, (model) => { - const [name, setName] = createSignal(model.name) - const [description, setDescription] = createSignal(model.description) - - return { - id: model.id, - get name() { - return name() - }, - get description() { - return description() - }, - setName, - setDescription, - } -}) +import { createSignal, mapArray } from "solid-js"; + +const [source] = createSignal([ + { id: 1, status: "pending" }, + { id: 2, status: "done" }, +]); + +const mapped = mapArray(source, (item, index) => ({ + id: item.id, + status: item.status, + position: () => index(), +})); ``` -## Arguments +## Related -| Name | Type | Description | -| :---- | :----------------------------- | :----------------------- | -| list | `() => readonly T[]` | The source array to map. | -| mapFn | `(v: T, i: () => number) => U` | The mapping function. | +- [`<For>`](/reference/components/for) +- [`indexArray`](/reference/reactive-utilities/index-array) diff --git a/src/routes/reference/reactive-utilities/merge-props.mdx b/src/routes/reference/reactive-utilities/merge-props.mdx index 5027201f1..26099a905 100644 --- a/src/routes/reference/reactive-utilities/merge-props.mdx +++ b/src/routes/reference/reactive-utilities/merge-props.mdx @@ -1,28 +1,74 @@ --- title: mergeProps +use_cases: >- + component props, default values, prop cloning, combining multiple prop + sources +tags: + - props + - components + - reactivity + - defaults + - merging +version: "1.0" +description: >- + Merge multiple prop sources into a single object while preserving reactive + property access. --- +`mergeProps` merges prop sources from left to right and resolves reads from the last source that defines each property. + +## Import + ```ts -import { mergeProps } from "solid-js" +import { mergeProps } from "solid-js"; +``` -function mergeProps(...sources: any): any +## Type +```ts +function mergeProps<T extends unknown[]>(...sources: T): MergeProps<T>; ``` -A reactive object **merge** method. -Useful for setting default props for components in case caller doesn't provide them. -Or cloning the props object including reactive properties. +## Parameters -This method works by using a proxy and resolving properties in reverse order. -This allows for dynamic tracking of properties that aren't present when the prop object is first merged. +### `sources` -```ts -// default props -props = mergeProps({ name: "Smith" }, props) +- **Type:** `unknown[]` + +Prop sources to merge. + +## Return value + +- **Type:** `MergeProps<T>` -// clone props -newProps = mergeProps(props) +Returns a merged object with lazy reactive property resolution across the provided sources. -// merge props -props = mergeProps(props, otherProps) +## Behavior + +- `mergeProps` is shallow. +- The last source with a non-`undefined` value for a property wins. +- Function sources are wrapped so property reads stay reactive. +- When reactive proxies are involved, the merged result uses proxy-backed property resolution. +- Property lookups are resolved when read rather than copied eagerly from every source. + +## Examples + +### Basic usage + +```tsx +import { mergeProps } from "solid-js"; + +function Greeting(props) { + const merged = mergeProps({ greeting: "Hello", name: "Smith" }, props); + + return ( + <div> + {merged.greeting} {merged.name} + </div> + ); +} ``` + +## Related + +- [`splitProps`](/reference/reactive-utilities/split-props) diff --git a/src/routes/reference/reactive-utilities/observable.mdx b/src/routes/reference/reactive-utilities/observable.mdx index 4e1bf23df..e1203784d 100644 --- a/src/routes/reference/reactive-utilities/observable.mdx +++ b/src/routes/reference/reactive-utilities/observable.mdx @@ -1,27 +1,70 @@ --- title: observable +use_cases: >- + rxjs integration, observable patterns, signal interop, third-party libraries, + reactive streams +tags: + - observables + - rxjs + - signals + - integration + - reactive + - streams +version: "1.0" +description: >- + Convert a Solid accessor into an Observable-compatible object. --- +`observable` creates an Observable-compatible object from a Solid accessor. + +## Import + ```ts -import { observable } from "solid-js" +import { observable } from "solid-js"; +``` -function observable<T>(input: () => T): Observable<T> +## Type +```ts +function observable<T>(input: () => T): Observable<T>; ``` -This method takes a signal and produces an Observable. -You can consume it from another Observable library of your choice, typically with the `from` operator. +## Parameters + +### `input` + +- **Type:** `() => T` +- **Required:** Yes + +Accessor used as the observable source. + +## Return value + +- **Type:** `Observable<T>` + +Returns an object with `subscribe()` and `[Symbol.observable]()` that returns the same object. + +## Behavior + +- `subscribe()` accepts either a function observer or an object observer with `next`. +- Each subscription creates an effect over the accessor and returns an object with `unsubscribe()`. +- If subscription happens inside an owned Solid scope, cleanup is also registered on that owner. + +## Examples + +### Convert an accessor to an Observable-compatible source ```ts -// How to integrate rxjs with a Solid signal -import { observable } from "solid-js" -import { from } from "rxjs" +import { createSignal, observable } from "solid-js"; +import { from } from "rxjs"; -const [s, set] = createSignal(0) +const [value] = createSignal(0); -const obsv$ = from(observable(s)) +const value$ = from(observable(value)); -obsv$.subscribe((v) => console.log(v)) +value$.subscribe((next) => console.log(next)); ``` -You can also use `from` without rxjs; check out this [page](/reference/reactive-utilities/from). +## Related + +- [`from`](/reference/reactive-utilities/from) diff --git a/src/routes/reference/reactive-utilities/on-util.mdx b/src/routes/reference/reactive-utilities/on-util.mdx index 1a8c45a88..b3f22014e 100644 --- a/src/routes/reference/reactive-utilities/on-util.mdx +++ b/src/routes/reference/reactive-utilities/on-util.mdx @@ -1,15 +1,29 @@ --- -title: on +title: "on" +use_cases: >- + explicit dependencies, effect control, conditional tracking, deferred + execution, store tracking +tags: + - effects + - dependencies + - tracking + - stores + - reactive + - defer +version: "1.0" +description: >- + Control effect dependencies explicitly with SolidJS's on utility. Define when + effects run and manage tracking behavior for precise reactivity. --- ```ts -import { on } from "solid-js" +import { on } from "solid-js"; function on<T extends Array<() => any> | (() => any), U>( deps: T, fn: (input: T, prevInput: T, prevValue?: U) => U, options: { defer?: boolean } = {} -): (prevValue?: U) => U | undefined +): (prevValue?: U) => U | undefined; ``` `on` is designed to be passed into a computation to make its dependencies explicit. @@ -37,8 +51,8 @@ setA("new"); // now it runs ## Using `on` with stores :::note - Please note that on stores and mutable, adding or removing a property from the - parent object will trigger an effect. See [`createMutable`](/reference/store-utilities/create-mutable) +Please note that on stores and mutable, adding or removing a property from the +parent object will trigger an effect. See [`createMutable`](/reference/store-utilities/create-mutable) ::: diff --git a/src/routes/reference/reactive-utilities/run-with-owner.mdx b/src/routes/reference/reactive-utilities/run-with-owner.mdx index 10638849f..9d52709a3 100644 --- a/src/routes/reference/reactive-utilities/run-with-owner.mdx +++ b/src/routes/reference/reactive-utilities/run-with-owner.mdx @@ -1,43 +1,90 @@ --- title: runWithOwner order: 5 +use_cases: >- + async operations, manual cleanup, context access, ownership control, + setTimeout callbacks, lifecycle management +tags: + - async + - ownership + - context + - cleanup + - lifecycle + - effects +version: "1.0" +description: >- + Execute a function under the provided owner. --- +`runWithOwner` executes a function under the provided owner. + +## Import + +```ts +import { runWithOwner } from "solid-js"; +``` + +## Type + ```ts -import { runWithOwner } from "solid-js" -import type { Owner } from "solid-js" +type Owner = unknown; -function runWithOwner<T>(owner: Owner, fn: (() => void) => T): T +function runWithOwner<T>(owner: Owner | null, fn: () => T): T | undefined; ``` -Executes the given function under the provided owner, instead of (and without affecting) the owner of the outer scope. -By default, computations created by `createEffect`, `createMemo`, etc. are owned by the owner of the currently executing code (the return value of `getOwner`), so in particular these will get disposed when their owner does. -Calling `runWithOwner` provides a way to override this default to a manually specified owner (typically, the return value from a previous call to `getOwner`), enabling more precise control of when computations get disposed. +## Parameters -Having a (correct) owner is important for two reasons: +### `owner` -- Computations without an owner cannot be cleaned up. -For example, if you call `createEffect` without an owner (e.g., in the global scope), the effect will continue running forever, instead of being disposed when its owner gets disposed. +- **Type:** `Owner | null` +- **Required:** Yes -- `useContext` obtains context by walking up the owner tree to find the nearest ancestor providing the desired context. -So without an owner you cannot look up any provided context (and with the wrong owner, you might obtain the wrong context). +Owner used while executing `fn`. -Manually setting the owner is especially helpful when doing reactivity outside of any owner scope. -In particular, asynchronous computation (via either `async` functions or callbacks like `setTimeout`) lose their automatically set owner, so remembering the original owner via `getOwner` and restoring it via `runWithOwner` is necessary in these cases. -For example: +### `fn` -```ts -const owner = getOwner() -setTimeout(() => { - // This callback gets run without owner. - // Restore owner via runWithOwner: - runWithOwner(owner, () => { - const foo = useContext(FooContext) - createEffect(() => { - console.log(foo) - }) - }) -}, 1000) +- **Type:** `() => T` +- **Required:** Yes + +Function executed under `owner`. + +## Return value + +- **Type:** `T | undefined` + +Returns the value produced by `fn`, or `undefined` when an error is routed through Solid's error handling. + +## Behavior + +- During the synchronous execution of `fn`, `runWithOwner` restores the provided owner for cleanup, context lookup, and descendant computations created inside `fn`. +- `runWithOwner` does not restore dependency tracking because the current tracking listener is cleared while `fn` runs. +- Code after the first `await` in an `async` function runs without the restored owner or reactive dependency tracking. + +## Examples + +### Restore an owner in a callback + +```tsx +import { createEffect, getOwner, runWithOwner } from "solid-js"; + +function Example() { + const owner = getOwner(); + + queueMicrotask(() => { + if (owner) { + runWithOwner(owner, () => { + createEffect(() => { + console.log("effect created under the captured owner"); + }); + }); + } + }); + + return null; +} ``` -**Note:** that owners are not what determines dependency tracking, so `runWithOwner` does not help with tracking in asynchronous functions; use of reactive state in the asynchronous part (e.g. after the first `await`) will not be tracked as a dependency. +## Related + +- [`getOwner`](/reference/reactive-utilities/get-owner) +- [`onCleanup`](/reference/lifecycle/on-cleanup) diff --git a/src/routes/reference/reactive-utilities/split-props.mdx b/src/routes/reference/reactive-utilities/split-props.mdx index 3841792ce..a6b8d4496 100644 --- a/src/routes/reference/reactive-utilities/split-props.mdx +++ b/src/routes/reference/reactive-utilities/split-props.mdx @@ -1,54 +1,102 @@ --- title: splitProps +use_cases: >- + prop forwarding, component composition, prop separation, splitting props into + multiple groups +tags: + - props + - components + - composition + - destructuring + - reactive +version: "1.0" +description: >- + Split a reactive props object into multiple reactive subsets and a remainder + object. --- +`splitProps` partitions a props object by key groups and returns a reactive object for each group plus a final object containing the remaining keys. + +## Import + ```ts -import { splitProps } from "solid-js" +import { splitProps } from "solid-js"; +``` -function splitProps<T>( - props: T, - ...keys: Array<(keyof T)[]> -): [...parts: Partial<T>] +## Type +```ts +function splitProps< + T extends Record<any, any>, + K extends [readonly (keyof T)[], ...(readonly (keyof T)[])[]], +>(props: T, ...keys: K): SplitProps<T, K>; ``` -Splits a reactive object by keys. +## Parameters + +### `props` + +- **Type:** `T` + +Source props object. + +### `keys` + +- **Type:** `(readonly (keyof T)[])[]` + +Arrays of keys that determine each returned subset. + +## Return value -It takes a reactive object and any number of arrays of keys; for each array of keys, it will return a reactive object with just those properties of the original object. -The last reactive object in the returned array will have any leftover properties of the original object. +- **Type:** `SplitProps<T, typeof keys>` -This can be useful if you want to consume a subset of props and pass the rest to a child. +Returns a tuple of reactive subsets followed by a reactive remainder object. + +## Behavior + +- Each returned object preserves reactive property access. +- A key is assigned to the first matching group only. +- The last returned object contains keys not included in the provided key arrays. +- When the source props object is proxy-backed, the returned objects use proxy-backed property access. +- `splitProps` separates props into groups without destructuring them into non-reactive locals. + +## Examples + +### Basic usage ```tsx +import { splitProps } from "solid-js"; + function MyComponent(props) { - const [local, others] = splitProps(props, ["children"]) + const [local, others] = splitProps(props, ["children"]); return ( <> <div>{local.children}</div> <Child {...others} /> </> - ) + ); } ``` -Because `splitProps` takes any number of arrays, we can split a props object as much as we wish (if, for example, we had multiple child components that each required a subset of the props). - -Let's say a component was passed six props: +### Split multiple groups ```tsx -;<MyComponent a={1} b={2} c={3} d={4} e={5} foo="bar" /> -// ... +import { splitProps } from "solid-js"; function MyComponent(props) { - console.log(props) // {a: 1, b: 2, c: 3, d: 4, e: 5, foo: "bar"} const [vowels, consonants, leftovers] = splitProps( props, ["a", "e"], ["b", "c", "d"] - ) - console.log(vowels) // {a: 1, e: 5} - console.log(consonants) // {b: 2, c: 3, d: 4} - console.log(leftovers.foo) // bar + ); + + return ( + <Child vowels={vowels} consonants={consonants} leftovers={leftovers} /> + ); } ``` + +## Related + +- [`mergeProps`](/reference/reactive-utilities/merge-props) diff --git a/src/routes/reference/reactive-utilities/start-transition.mdx b/src/routes/reference/reactive-utilities/start-transition.mdx index 2abdf9dad..1aa7e1c1d 100644 --- a/src/routes/reference/reactive-utilities/start-transition.mdx +++ b/src/routes/reference/reactive-utilities/start-transition.mdx @@ -1,13 +1,93 @@ --- title: startTransition +use_cases: >- + async updates, performance optimization, non-blocking updates, transition + control +tags: + - transitions + - async + - performance + - updates + - batching +version: "1.0" +description: >- + Start a transition and return a promise that resolves when the transition + completes. --- +`startTransition` starts a transition without exposing a pending-state accessor. + +## Import + ```ts -import { startTransition } from "solid-js" +import { startTransition } from "solid-js"; +``` -function startTransition: (fn: () => void) => Promise<void> +## Type +```ts +function startTransition(fn: () => unknown): Promise<void>; ``` -Similar to `useTransition` except there is no associated pending state. -This one can just be used directly to start the Transition. +## Parameters + +### `fn` + +- **Type:** `() => unknown` +- **Required:** Yes + +Function executed inside the transition. + +## Return value + +- **Type:** `Promise<void>` + +Resolves when the transition completes. + +## Behavior + +- On the client, `fn` runs asynchronously in a microtask and its updates run as a transition. +- Nested calls inside an active transition reuse that transition and return its existing promise, which resolves after transition work completes. +- On the server, `startTransition(fn)` runs `fn()` synchronously. +- `startTransition` is the transition-starting function exposed by [`useTransition`](/reference/reactive-utilities/use-transition), without the `pending` accessor. + +## Examples + +### Basic usage + +```tsx +import { + Suspense, + createResource, + createSignal, + startTransition, +} from "solid-js"; + +function Example() { + const [userId, setUserId] = createSignal(1); + const [user] = createResource(userId, async (id) => { + const response = await fetch(`/api/users/${id}`); + return response.json(); + }); + + async function showNextUser() { + await startTransition(() => { + setUserId(2); + }); + } + + return ( + <> + <button onClick={showNextUser}>Load next user</button> + <Suspense fallback={<p>Loading user...</p>}> + <pre>{JSON.stringify(user(), null, 2)}</pre> + </Suspense> + </> + ); +} +``` + +## Related + +- [`useTransition`](/reference/reactive-utilities/use-transition) +- [`Suspense`](/reference/components/suspense) diff --git a/src/routes/reference/reactive-utilities/untrack.mdx b/src/routes/reference/reactive-utilities/untrack.mdx index 136ed1d83..4c9cfbbe0 100644 --- a/src/routes/reference/reactive-utilities/untrack.mdx +++ b/src/routes/reference/reactive-utilities/untrack.mdx @@ -1,45 +1,120 @@ --- title: untrack +use_cases: >- + static values, initial values, default props, performance optimization, + non-reactive access +tags: + - tracking + - performance + - props + - reactivity + - optimization + - defaults +version: "1.0" +description: >- + Execute a function without collecting dependencies from the current reactive + scope. --- -Ignores tracking any of the dependencies in the executing code block and returns the value. This helper is useful when a certain `prop` will never update and thus it is ok to use it outside of the tracking scope. +`untrack` executes a function without collecting dependencies from the current reactive scope. -```tsx title="component.tsx" -import { untrack } from "solid-js" +## Import + +```ts +import { untrack } from "solid-js"; +``` + +## Type + +```ts +function untrack<T>(fn: () => T): T; +``` + +## Parameters + +### `fn` + +- **Type:** `() => T` +- **Required:** Yes + +Function executed outside the current tracking context. + +## Return value + +- **Type:** `T` + +Returns the value produced by `fn` unchanged. + +## Behavior + +- `untrack` only affects reads inside the provided function. Signals read there do not become dependencies of the surrounding computation. +- `untrack` does not create or restore an owner. + +## Examples + +### Read part of an effect without tracking + +```tsx +import { createEffect, untrack } from "solid-js"; export function Component(props) { - const value = untrack(() => props.value) + createEffect(() => { + console.log( + props.id, + untrack(() => props.label) + ); + }); - return <div>{value}</div> - } + return <div>{props.id}</div>; } ``` -## Initial and Default Values +### Avoid tracking part of an effect + +```tsx +import { createEffect, createSignal, untrack } from "solid-js"; + +function Example() { + const [count, setCount] = createSignal(0); + const [label] = createSignal("count"); -It is not necessary to manually untrack values that are suppose to serve as a default or initial value to a signal. Even with the linter configured to enforce tracking, the linter will accept it when a `prop` is prefixed with `default` or `initial` as it is a common pattern to use them as such. + createEffect(() => { + console.log( + untrack(() => label()), + count() + ); + }); + return <button onClick={() => setCount((c) => c + 1)}>Increment</button>; +} +``` + +## Notes + +Default and initial prop values can be read directly when initializing a signal. This pattern commonly appears with names such as `initialName` and `defaultName`. ```tsx tab title="initialValue" {5} -// component.tsx -import { createSignal } from "solid-js" +import { createSignal } from "solid-js"; export function Component(props) { - const [name, setName] = createSignal(props.initialName) + const [name, setName] = createSignal(props.initialName); - return <div>{name()}</div> - } + return <div>{name()}</div>; } ``` ```tsx tab title="defaultValue" {5} -// component.tsx -import { createSignal } from "solid-js" +import { createSignal } from "solid-js"; export function Component(props) { - const [name, setName] = createSignal(props.defaultName) + const [name, setName] = createSignal(props.defaultName); - return <div>{name()}</div> - } + return <div>{name()}</div>; } ``` + +## Related + +- [`onMount`](/reference/lifecycle/on-mount) +- [`createEffect`](/reference/basic-reactivity/create-effect) +- [`on`](/reference/reactive-utilities/on-util) diff --git a/src/routes/reference/reactive-utilities/use-transition.mdx b/src/routes/reference/reactive-utilities/use-transition.mdx index 97b085731..c43d10842 100644 --- a/src/routes/reference/reactive-utilities/use-transition.mdx +++ b/src/routes/reference/reactive-utilities/use-transition.mdx @@ -1,26 +1,97 @@ --- title: useTransition +use_cases: >- + async batching, loading states, suspense integration, concurrent updates, ui + transitions +tags: + - transitions + - async + - suspense + - loading + - batching + - concurrent +version: "1.0" +description: >- + Return a pending-state accessor and a function that starts a transition. --- +`useTransition` returns a pending-state accessor and a function that starts a transition. + +## Import + ```ts -import { useTransition } from "solid-js" +import { useTransition } from "solid-js"; +``` +## Type + +```ts function useTransition(): [ pending: () => boolean, - startTransition: (fn: () => void) => Promise<void> -] - + start: (fn: () => void) => Promise<void>, +]; ``` -Used to batch async updates in a transaction deferring commit until all async processes are complete. -This is tied into Suspense and only tracks resources read under Suspense boundaries. +## Parameters -```ts -const [isPending, start] = useTransition(); +`useTransition` does not take any parameters. + +## Return value + +- **Type:** `[() => boolean, (fn: () => void) => Promise<void>]` -// check if transitioning -isPending(); +Returns a tuple containing: -// wrap in transition -start(() => setSignal(newValue), () => /* transition is done */) +- `pending`: an accessor that reports whether the transition is pending +- `start`: a function that starts a transition + +## Behavior + +- `start` is the same transition-starting function exposed by [`startTransition`](/reference/reactive-utilities/start-transition). +- On the client, `start` schedules its callback asynchronously in a microtask. +- `pending()` reflects whether that transition is still pending. +- Transition state integrates with Suspense and resource reads under Suspense boundaries. +- On the server, `pending()` is `false` and transitions run synchronously. + +## Examples + +### Basic usage + +```tsx +import { + Suspense, + createResource, + createSignal, + useTransition, +} from "solid-js"; + +function Example() { + const [userId, setUserId] = createSignal(1); + const [user] = createResource(userId, async (id) => { + const response = await fetch(`/api/users/${id}`); + return response.json(); + }); + const [pending, start] = useTransition(); + + return ( + <> + <button + onClick={async () => { + await start(() => setUserId(2)); + }} + > + Load next user + </button> + <div>{pending() ? "Loading transition..." : "Ready"}</div> + <Suspense fallback={<p>Loading user...</p>}> + <pre>{JSON.stringify(user(), null, 2)}</pre> + </Suspense> + </> + ); +} ``` + +## Related + +- [`startTransition`](/reference/reactive-utilities/start-transition) +- [`Suspense`](/reference/components/suspense) diff --git a/src/routes/reference/rendering/data.json b/src/routes/reference/rendering/data.json index cd3ffdce0..3f811d6b3 100644 --- a/src/routes/reference/rendering/data.json +++ b/src/routes/reference/rendering/data.json @@ -4,6 +4,7 @@ "dev.mdx", "hydrate.mdx", "hydration-script.mdx", + "is-dev.mdx", "is-server.mdx", "render.mdx", "render-to-stream.mdx", diff --git a/src/routes/reference/rendering/dev.mdx b/src/routes/reference/rendering/dev.mdx index 39cf81e4f..f019ecf69 100644 --- a/src/routes/reference/rendering/dev.mdx +++ b/src/routes/reference/rendering/dev.mdx @@ -1,24 +1,66 @@ --- title: DEV +use_cases: >- + development builds, development-only checks, conditional dev-only code +tags: + - development + - debugging + - builds + - conditional +version: "1.0" +description: >- + Read the development-only `DEV` export from `solid-js`. --- +`DEV` is a development-only export from `solid-js`. +It exposes Solid's development hooks and internals for development tooling and diagnostics. + +## Import + ```ts -import { DEV } from "solid-js" +import { DEV } from "solid-js"; +``` -const DEV: object | undefined +## Type + +```ts +const DEV: + | { + readonly hooks: { + afterUpdate: (() => void) | null; + afterCreateOwner: ((owner: unknown) => void) | null; + afterCreateSignal: ((signal: unknown) => void) | null; + afterRegisterGraph: ((sourceMapValue: unknown) => void) | null; + }; + readonly writeSignal: (...args: unknown[]) => unknown; + readonly registerGraph: (...args: unknown[]) => unknown; + } + | undefined; ``` -On the client, Solid provides (via [conditional exports](https://nodejs.org/api/packages.html#conditional-exports)) different builds depending on whether the **development** condition is set. -Development mode provides some additional checking β€” e.g. detecting accidental use of multiple instances of Solid β€” which are removed in production builds. +## Value + +- **Type:** development-only object or `undefined` -If you want code to run only in development mode (most useful in libraries), you can check whether the **DEV** export is defined. -Note that it is always defined on the server, so you may want to combine with [isServer](/reference/rendering/is-server): +## Behavior + +- In the development browser bundle, `DEV` is defined and exposes development hooks and internals. +- In production and server bundles, `DEV` is `undefined`. +- `DEV` is intended for tooling, diagnostics, and library code that needs development-only behavior. + +## Examples + +### Basic usage ```ts -import { DEV } from "solid-js" -import { isServer } from "solid-js/web" +import { DEV } from "solid-js"; -if (DEV && !isServer) { - console.log(...); +if (DEV) { + console.warn("development-only check"); } ``` + +## Related + +- [`isDev`](/reference/rendering/is-dev) +- [`isServer`](/reference/rendering/is-server) diff --git a/src/routes/reference/rendering/hydrate.mdx b/src/routes/reference/rendering/hydrate.mdx index 31ce37db1..0a57d5858 100644 --- a/src/routes/reference/rendering/hydrate.mdx +++ b/src/routes/reference/rendering/hydrate.mdx @@ -1,32 +1,96 @@ --- title: hydrate +use_cases: >- + hydrating server-rendered HTML, attaching client behavior to an SSR subtree +tags: + - hydration + - ssr + - rendering + - dom +version: "1.0" +description: >- + Hydrate server-rendered HTML and attach Solid's client-side behavior to an + existing DOM subtree. --- -```ts -import { hydrate } from "solid-js/web" -import type { JSX } from "solid-js" -import type { MountableElement } from "solid-js/web" +`hydrate` attaches Solid's client-side behavior to DOM that was already rendered on the server. -function hydrate( - fn: () => JSX.Element, - node: MountableElement, - options?: { renderId?: string; owner?: unknown } -): () => void +## Import +```ts +import { hydrate } from "solid-js/web"; ``` -This method is similar to `render` except that it attempts to rehydrate what is already rendered to the DOM. -When initializing in the browser a page has already been server rendered. +## Type ```ts -const dispose = hydrate(App, document.getElementById("app")) +type MountableElement = + | Element + | Document + | ShadowRoot + | DocumentFragment + | Node; + +function hydrate( + fn: () => JSX.Element, + node: MountableElement, + options?: { renderId?: string; owner?: unknown } +): () => void; ``` ## Parameters -| Prop | type | description | -| -------------------- | ------------------ | ----------------------------------------------- | -| fn | `() => JSX.Element`| Function that returns the application code. | -| node | MountableElement | DOM Element to mount the application to | -| options.renderId | string | | -| options.owner | unknown | | \ No newline at end of file +### `fn` + +- **Type:** `() => JSX.Element` + +Function that returns the root JSX to hydrate. + +### `node` + +- **Type:** `MountableElement` + +DOM node that contains the server-rendered markup. + +### `options` + +#### `renderId` + +- **Type:** `string` + +Scopes hydration lookup to a specific rendered subtree. + +#### `owner` + +- **Type:** `unknown` + +Owner used for the created hydration root. + +## Return value + +- **Type:** `() => void` + +Dispose function for the hydrated root. + +## Behavior + +- `hydrate` is a client-only API. +- `hydrate` reuses DOM produced by Solid's server renderer instead of creating a new subtree, locating nodes through Solid's hydration markers and optionally scoping that lookup with `renderId`. +- The hydrated DOM and the JSX returned by `fn` must match the server output for hydration to succeed. +- The returned function disposes the hydrated root. + +## Examples + +### Basic usage + +```tsx +import { hydrate } from "solid-js/web"; + +// #app already contains server-rendered Solid markup +const dispose = hydrate(() => <App />, document.getElementById("app")!); +``` + +## Related + +- [`render`](/reference/rendering/render) +- [`HydrationScript`](/reference/rendering/hydration-script) diff --git a/src/routes/reference/rendering/hydration-script.mdx b/src/routes/reference/rendering/hydration-script.mdx index 3448d9041..33225c728 100644 --- a/src/routes/reference/rendering/hydration-script.mdx +++ b/src/routes/reference/rendering/hydration-script.mdx @@ -1,26 +1,109 @@ --- title: hydrationScript +use_cases: >- + server rendering, hydration bootstrap, capturing delegated events before + client hydration +tags: + - ssr + - hydration + - bootstrap + - events +version: "1.0" +description: >- + Generate the SSR hydration bootstrap script with `HydrationScript` or + `generateHydrationScript`. --- +`HydrationScript` and `generateHydrationScript` generate Solid's SSR hydration bootstrap script. + +## Import + ```ts -import { generateHydrationScript, HydrationScript } from "solid-js/web" -import type { JSX } from "solid-js" +import { HydrationScript, generateHydrationScript } from "solid-js/web"; +``` -function generateHydrationScript(options: { - nonce?: string - eventNames?: string[] -}): string +## Type +```ts function HydrationScript(props: { - nonce?: string - eventNames?: string[] -}): JSX.Element + nonce?: string; + eventNames?: string[]; +}): JSX.Element; + +function generateHydrationScript(options: { + nonce?: string; + eventNames?: string[]; +}): string; +``` + +## `HydrationScript` props + +### `nonce` + +- **Type:** `string` + +Nonce applied to the generated `<script>` tag. + +### `eventNames` + +- **Type:** `string[]` + +Delegated event names captured before client scripts load. + +## `generateHydrationScript` options + +### `nonce` + +- **Type:** `string` + +Nonce applied to the generated script tag. + +### `eventNames` + +- **Type:** `string[]` + +Delegated event names captured before client scripts load. + +## Return value + +- **Type:** `JSX.Element` for `HydrationScript`, `string` for `generateHydrationScript` + +## Behavior + +- The generated script initializes `window._$HY` and bootstraps delegated event replay before the runtime loads. +- The default captured delegated events are `"click"` and `"input"` unless `eventNames` is overridden. +- Place the generated script once in the server-rendered document when the page will hydrate on the client. +- `HydrationScript` returns JSX for server-rendered HTML output, and `generateHydrationScript` returns a string for manual HTML generation. +- In browser bundles, these exports are placeholders that return `undefined`. + +## Examples + +### `HydrationScript` + +```tsx +import { HydrationScript } from "solid-js/web"; +import type { JSX } from "solid-js"; + +function Html(props: { children: JSX.Element }) { + return ( + <html lang="en"> + <head> + <HydrationScript /> + </head> + <body>{props.children}</body> + </html> + ); +} +``` + +### `generateHydrationScript` + +```ts +import { generateHydrationScript } from "solid-js/web"; +const script = generateHydrationScript({ nonce: "nonce-value" }); ``` -Hydration Script is a special script that should be placed once on the page to bootstrap hydration before Solid's runtime has loaded. -It comes both as a function that can be called and inserted in an HTML string, or as a Component if you are rendering JSX from the `<html>` tag. +## Related -The options are for the **nonce** to be put on the script tag and any event names for that Solid should capture before scripts have loaded and replay during hydration. -These events are limited to those that Solid delegates which include most UI Events that are composed and bubble. -By default it is only click and input events. +- [`hydrate`](/reference/rendering/hydrate) diff --git a/src/routes/reference/rendering/is-dev.mdx b/src/routes/reference/rendering/is-dev.mdx new file mode 100644 index 000000000..7ab4a7c20 --- /dev/null +++ b/src/routes/reference/rendering/is-dev.mdx @@ -0,0 +1,50 @@ +--- +title: isDev +use_cases: >- + development-build checks, browser-side dev-only branches, bundle-level + development flags +tags: + - development + - debugging + - builds + - conditional +version: "1.0" +description: >- + Read the boolean that indicates whether the imported `solid-js/web` bundle is the development browser bundle. +--- + +`isDev` is a constant boolean exported by `solid-js/web`. + +## Import + +```ts +import { isDev } from "solid-js/web"; +``` + +## Type + +```ts +const isDev: boolean; +``` + +## Behavior + +- `isDev` is a bundle constant: it is `true` in the development browser bundle and `false` in production and server bundles. [`DEV`](/reference/rendering/dev) is a separate development-only export from `solid-js`. +- Because it is exported as a constant, bundlers can eliminate unreachable branches. + +## Examples + +### Basic usage + +```ts +import { isDev } from "solid-js/web"; + +if (isDev) { + debugPanel.mount(); +} +``` + +## Related + +- [`DEV`](/reference/rendering/dev) +- [`isServer`](/reference/rendering/is-server) diff --git a/src/routes/reference/rendering/is-server.mdx b/src/routes/reference/rendering/is-server.mdx index 4a8539ab2..331f40f54 100644 --- a/src/routes/reference/rendering/is-server.mdx +++ b/src/routes/reference/rendering/is-server.mdx @@ -1,23 +1,49 @@ --- title: isServer +use_cases: >- + server-only branches, client-only branches, bundle-level environment checks +tags: + - ssr + - environment + - bundling + - conditional +version: "1.0" +description: >- + Read whether the current `solid-js/web` bundle is the server bundle. --- +`isServer` is a constant boolean that indicates whether code is running in the server bundle. + +## Import + ```ts -import { isServer } from "solid-js/web" +import { isServer } from "solid-js/web"; +``` -const isServer: boolean +## Type +```ts +const isServer: boolean; ``` -This indicates that the code is being run as the server or browser bundle. -As the underlying runtimes export this as a constant boolean it allows bundlers to eliminate the code and their used imports from the respective bundles. +## Behavior + +- `isServer` is `true` in the server bundle and `false` in the browser bundle. +- Because it is exported as a constant, bundlers can eliminate unreachable branches. + +## Examples + +### Basic usage ```ts import { isServer } from "solid-js/web"; if (isServer) { - // I will never make it to the browser bundle -} else { - // won't be run on the server; + serverOnlyWork(); } ``` + +## Related + +- [`DEV`](/reference/rendering/dev) +- [`isDev`](/reference/rendering/is-dev) diff --git a/src/routes/reference/rendering/render-to-stream.mdx b/src/routes/reference/rendering/render-to-stream.mdx index d51076eb5..7ea469481 100644 --- a/src/routes/reference/rendering/render-to-stream.mdx +++ b/src/routes/reference/rendering/render-to-stream.mdx @@ -1,51 +1,112 @@ --- title: renderToStream +use_cases: >- + streaming server rendering, progressive HTML delivery, suspense-driven server + output +tags: + - ssr + - streaming + - async + - suspense +version: "1.0" +description: >- + Stream server-rendered HTML and continue writing async content as it + resolves. --- +`renderToStream` streams server-rendered HTML and continues writing async content as it resolves. + +## Import + ```ts -import { renderToStream } from "solid-js/web" +import { renderToStream } from "solid-js/web"; +``` + +## Type +```ts function renderToStream<T>( fn: () => T, options?: { - nonce?: string - renderId?: string - onCompleteShell?: () => void - onCompleteAll?: () => void + nonce?: string; + renderId?: string; + onCompleteShell?: (info: { write: (v: string) => void }) => void; + onCompleteAll?: (info: { write: (v: string) => void }) => void; } ): { - pipe: (writable: { write: (v: string) => void }) => void - pipeTo: (writable: WritableStream) => void -} - + pipe: (writable: { write: (v: string) => void }) => void; + pipeTo: (writable: WritableStream) => void; +}; ``` -This method renders to a stream. -It renders the content synchronously including any Suspense fallback placeholders, and then continues to stream the data and HTML from any async resource as it completes. +## Parameters -```ts -// node -renderToStream(App).pipe(res) +### `fn` + +- **Type:** `() => T` + +Function that returns the root output to render. + +### `options` + +#### `nonce` + +- **Type:** `string` + +Nonce applied to inline scripts emitted during rendering. + +#### `renderId` + +- **Type:** `string` + +Identifier used to namespace the render output. -// web stream -const { readable, writable } = new TransformStream() -renderToStream(App).pipeTo(writable) +#### `onCompleteShell` + +- **Type:** `(info: { write: (v: string) => void }) => void` + +Callback invoked when the shell is ready to flush. + +#### `onCompleteAll` + +- **Type:** `(info: { write: (v: string) => void }) => void` + +Callback invoked after all server suspense boundaries have settled. + +## Return value + +- **Type:** `{ pipe: ..., pipeTo: ... }` + +Streaming controller with `pipe` and `pipeTo` methods. + +## Behavior + +- `renderToStream` is a server rendering API and is unsupported in browser bundles. +- It renders the shell first, including suspense fallback content, and can flush that output before later async fragments and serialized data stream as resources resolve. +- `onCompleteShell` and `onCompleteAll` receive a `write()` helper for injecting additional output into the stream. +- `pipe` writes to Node-style writable targets. +- `pipeTo` writes to a `WritableStream`. + +## Examples + +### `pipe` + +```tsx +import { renderToStream } from "solid-js/web"; + +renderToStream(() => <App />).pipe(response); ``` -`onCompleteShell` fires when synchronous rendering is complete before writing the first flush to the stream out to the browser. -`onCompleteAll` is called when all server Suspense boundaries have settled. -`renderId` is used to namespace renders when having multiple top level roots. +### `pipeTo` -:::note - This API replaces the previous pipeToWritable and pipeToNodeWritable - APIs. -::: +```tsx +import { renderToStream } from "solid-js/web"; + +const { writable } = new TransformStream(); +renderToStream(() => <App />).pipeTo(writable); +``` -## Options +## Related -| Name | Type | Description | -| --------------- | ---------- | ---------------------------------------------------------------- | -| nonce | string | The nonce to use for inline scripts. | -| renderId | string | The id to use for this render. | -| onCompleteShell | () => void | A callback that fires when the shell is complete. | -| onCompleteAll | () => void | A callback that fires when all Suspense boundaries have settled. | +- [`renderToString`](/reference/rendering/render-to-string) +- [`renderToStringAsync`](/reference/rendering/render-to-string-async) diff --git a/src/routes/reference/rendering/render-to-string-async.mdx b/src/routes/reference/rendering/render-to-string-async.mdx index 16c2509eb..b6fcf3ad1 100644 --- a/src/routes/reference/rendering/render-to-string-async.mdx +++ b/src/routes/reference/rendering/render-to-string-async.mdx @@ -1,34 +1,92 @@ --- title: renderToStringAsync +use_cases: >- + async server rendering, waiting for suspense boundaries, HTML generation with + async data +tags: + - ssr + - async + - suspense + - rendering +version: "1.0" +description: >- + Render HTML to a string after async suspense boundaries settle. --- +`renderToStringAsync` renders HTML to a string after async suspense boundaries settle. + +## Import + ```ts -import { renderToStringAsync } from "solid-js/web" +import { renderToStringAsync } from "solid-js/web"; +``` + +## Type +```ts function renderToStringAsync<T>( fn: () => T, options?: { - timeoutMs?: number - renderId?: string - nonce?: string + timeoutMs?: number; + nonce?: string; + renderId?: string; } -): Promise<string> - +): Promise<string>; ``` -Same as `renderToString` except that it will wait for all `<Suspense>` boundaries to resolve before returning the results. -Resource data is automatically serialized into the script tag and will be hydrated on client load. +## Parameters -`renderId` is used to namespace renders when having multiple top level roots. +### `fn` -```ts -const html = await renderToStringAsync(App) +- **Type:** `() => T` + +Function that returns the root output to render. + +### `options` + +#### `timeoutMs` + +- **Type:** `number` + +Maximum wait time before the returned promise rejects. + +#### `nonce` + +- **Type:** `string` + +Nonce applied to inline scripts emitted during rendering. + +#### `renderId` + +- **Type:** `string` + +Identifier used to namespace the render output. + +## Return value + +- **Type:** `Promise<string>` + +Promise that resolves to the rendered HTML string. + +## Behavior + +- `renderToStringAsync` is a server rendering API and is unsupported in browser bundles. +- It waits for server suspense boundaries to settle before resolving the final HTML string. +- `timeoutMs` limits how long the render waits for async suspense work to finish. +- Resource data is serialized for client hydration. +- `renderId` namespaces the render output when multiple top-level roots are present. + +## Examples + +### Basic usage + +```tsx +import { renderToStringAsync } from "solid-js/web"; + +const html = await renderToStringAsync(() => <App />); ``` -## Options +## Related -| Name | Type | Description | -| ----------- | -------- | -------------------------------------------------------------------------------------------- | -| `timeoutMs` | `number` | The number of milliseconds to wait for a `<Suspense>` boundary to resolve before timing out. | -| `renderId` | `string` | The id to use for the render. | -| `nonce` | `string` | The nonce to use for the script tag. | +- [`renderToString`](/reference/rendering/render-to-string) +- [`renderToStream`](/reference/rendering/render-to-stream) diff --git a/src/routes/reference/rendering/render-to-string.mdx b/src/routes/reference/rendering/render-to-string.mdx index 454b0c971..3ce5667ca 100644 --- a/src/routes/reference/rendering/render-to-string.mdx +++ b/src/routes/reference/rendering/render-to-string.mdx @@ -1,33 +1,84 @@ --- title: renderToString +use_cases: >- + synchronous server rendering, HTML generation, progressive hydration output +tags: + - ssr + - rendering + - hydration + - synchronous +version: "1.0" +description: >- + Render HTML to a string synchronously on the server. --- +`renderToString` renders HTML to a string synchronously on the server. + +## Import + ```ts -import { renderToString } from "solid-js/web" +import { renderToString } from "solid-js/web"; +``` +## Type + +```ts function renderToString<T>( fn: () => T, options?: { - nonce?: string - renderId?: string + nonce?: string; + renderId?: string; } -): string - +): string; ``` -Renders to a string synchronously. -The function also generates a script tag for progressive hydration. -Options include eventNames to listen to before the page loads and play back on hydration, and nonce to put on the script tag. +## Parameters -`renderId` is used to namespace renders when having multiple top level roots. +### `fn` -```ts -const html = renderToString(App) +- **Type:** `() => T` + +Function that returns the root output to render. + +### `options` + +#### `nonce` + +- **Type:** `string` + +Nonce applied to inline scripts emitted during rendering. + +#### `renderId` + +- **Type:** `string` + +Identifier used to namespace the render output. + +## Return value + +- **Type:** `string` + +Rendered HTML string. + +## Behavior + +- `renderToString` is a server rendering API, is unsupported in browser bundles, and completes synchronously. +- It returns the current render output without waiting for async suspense boundaries to settle. +- The output includes hydration markup. Inline serialized scripts are emitted only when serializer data is produced. +- Registered assets are injected into the HTML output, typically before `</head>`. +- `renderId` namespaces the render output when multiple top-level roots are present. + +## Examples + +### Basic usage + +```tsx +import { renderToString } from "solid-js/web"; + +const html = renderToString(() => <App />); ``` -## Options +## Related -| Name | Type | Description | -| ---------- | -------- | ------------------------------------ | -| `nonce` | `string` | The nonce to use for the script tag. | -| `renderId` | `string` | The id to use for the script tag. | +- [`renderToStringAsync`](/reference/rendering/render-to-string-async) +- [`renderToStream`](/reference/rendering/render-to-stream) diff --git a/src/routes/reference/rendering/render.mdx b/src/routes/reference/rendering/render.mdx index f30f5b297..b78314e51 100644 --- a/src/routes/reference/rendering/render.mdx +++ b/src/routes/reference/rendering/render.mdx @@ -1,34 +1,74 @@ --- title: render +use_cases: >- + mounting a client app, browser entry points, attaching a root to the DOM +tags: + - mounting + - rendering + - client + - dom +version: "1.0" +description: >- + Mount a Solid root into a DOM node in the browser. --- -```ts -import { render } from "solid-js/web" -import type { JSX } from "solid-js" -import type { MountableElement } from "solid-js/web" +`render` mounts a Solid root into a DOM node in the browser. -function render( - code: () => JSX.Element, - element: MountableElement -): () => void +## Import +```ts +import { render } from "solid-js/web"; ``` -This is the browser app entry point. -Provide a top-level component function and an element to mount to. -It is recommended this element be empty: while `render` will just append children, the returned dispose function will remove all children. +## Type ```ts -const dispose = render(App, document.getElementById("app")) -// or -const dispose = render(() => <App />, document.getElementById("app")) -``` +type MountableElement = + | Element + | Document + | ShadowRoot + | DocumentFragment + | Node; -It's important that the first argument is a function: do not pass JSX directly (as in `render(<App/>, ...)`), because this will call App before render can set up a root to track signal dependencies within App. +function render(code: () => JSX.Element, element: MountableElement): () => void; +``` ## Parameters -| Argument | Type | Description | -| -------------------- | ------------------- | ----------------------------------------------- | -| code | `() => JSX.Element` | Function that returns the application code. | -| element | MountableElement | DOM Element to mount the application to | \ No newline at end of file +### `code` + +- **Type:** `() => JSX.Element` + +Function that returns the root JSX to mount. + +### `element` + +- **Type:** `MountableElement` + +DOM node that receives the rendered output. + +## Return value + +- **Type:** `() => void` + +Dispose function for the mounted root. + +## Behavior + +- `render` is a browser/client API and is unsupported in the server bundle. It creates a new root and appends its output to `element`. When `element` is `document`, it evaluates `code()` directly instead of using DOM insertion. +- The first argument must be a function so Solid can establish the root before evaluating JSX. +- The returned function disposes the root and clears the mount container's content, so mounting into an empty container is safest. + +## Examples + +### Basic usage + +```tsx +import { render } from "solid-js/web"; + +const dispose = render(() => <App />, document.getElementById("app")!); +``` + +## Related + +- [`hydrate`](/reference/rendering/hydrate) diff --git a/src/routes/reference/secondary-primitives/create-computed.mdx b/src/routes/reference/secondary-primitives/create-computed.mdx index bd565ff38..624067c1f 100644 --- a/src/routes/reference/secondary-primitives/create-computed.mdx +++ b/src/routes/reference/secondary-primitives/create-computed.mdx @@ -1,31 +1,126 @@ --- title: createComputed +use_cases: >- + immediate reactivity, building primitives, side effects with dependencies, + reactive updates, custom reactive patterns +tags: + - reactivity + - computation + - primitives + - effects + - tracking +version: "1.0" +description: >- + Create an immediate reactive computation that runs synchronously when created + and whenever its dependencies change. --- +`createComputed` creates an immediate reactive computation. +It runs synchronously in the current execution context when created, then re-runs whenever its tracked dependencies change. + +## Import + ```ts -import { createComputed } from "solid-js" +import { createComputed } from "solid-js"; +``` -function createComputed<T>(fn: (v: T) => T, value?: T): void +## Type +```ts +function createComputed<Next>( + fn: EffectFunction<undefined | NoInfer<Next>, Next> +): void; +function createComputed<Next, Init = Next>( + fn: EffectFunction<Init | Next, Next>, + value: Init, + options?: { name?: string } +): void; +function createComputed<Next, Init>( + fn: EffectFunction<Init | Next, Next>, + value?: Init, + options?: { name?: string } +): void; ``` -`createComputed` creates a new computation that immediately runs the given function in a tracking scope, thus automatically tracking its dependencies, and automatically reruns the function whenever the dependencies changes. -The function gets called with an argument equal to the value returned from the function's last execution, or on the first call, equal to the optional second argument to `createComputed`. -Note that the return value of the function is not otherwise exposed; in particular, createComputed has no return value. +## Parameters + +### `fn` + +- **Type:** `EffectFunction<undefined | NoInfer<Next>, Next> | EffectFunction<Init | Next, Next>` +- **Required:** Yes + +The function that performs the computation. +It executes immediately to track dependencies and re-runs whenever a dependency changes. + +It receives the value returned from the previous execution as its argument. +On the initial execution, it receives the [`value`](#value) parameter (if provided) or `undefined`. + +### `value` + +- **Type:** `Init` +- **Required:** No + +The initial value passed to `fn` on its first execution. + +### `options` + +- **Type:** `{ name?: string }` +- **Required:** No + +An optional configuration object with the following properties: + +#### `name` -`createComputed` is the most immediate form of reactivity in Solid, and is most useful for building other reactive primitives. -For example, some other Solid primitives are built from `createComputed`. -However, it should be used with care, as `createComputed` can easily cause more unnecessary updates than other reactive primitives. -Before using it, consider the closely related primitives [`createMemo`](/reference/basic-reactivity/create-memo) and [`createRenderEffect`](/reference/secondary-primitives/create-render-effect). +- **Type:** `string` +- **Required:** No -Like `createMemo`, `createComputed` calls its function immediately on updates (unless you're in a [batch](/reference/reactive-utilities/batch), [effect](/reference/basic-reactivity/create-effect), or [transition](/reference/reactive-utilities/use-transition)). -However, while `createMemo` functions should be pure (not set any signals), `createComputed` functions can set signals. -Related, `createMemo` offers a readonly signal for the return value of the function, whereas to do the same with `createComputed` you would need to set a signal within the function. -If it is possible to use pure functions and `createMemo`, this is likely more efficient, as Solid optimizes the execution order of memo updates, whereas updating a signal within `createComputed` will immediately trigger reactive updates some of which may turn out to be unnecessary. +A debug name for the computation. +It is used for identification in debugging tools like the [Solid Debugger](https://github.com/thetarnav/solid-devtools). + +## Return value + +- **Type:** `void` + +`createComputed` does not return a value. + +## Behavior + +- `createComputed` runs immediately when it is created. +- It tracks reactive reads inside `fn` and re-runs synchronously when those dependencies change. +- Unlike [`createMemo`](/reference/basic-reactivity/create-memo), it does not expose a derived accessor. +- `createComputed` is primarily used to build reactive primitives. Application code that derives state usually wants [`createMemo`](/reference/basic-reactivity/create-memo) instead. + +## Examples + +### Build a writable derived signal + +```tsx +import { createComputed, createSignal } from "solid-js"; + +function createWritableMemo<T>(fn: () => T) { + const [value, setValue] = createSignal(fn()); + + createComputed(() => { + setValue(fn()); + }); + + return value; +} + +function Counter() { + const [count, setCount] = createSignal(1); + const double = createWritableMemo(() => count() * 2); + + return ( + <> + <p>{double()}</p> + <button onClick={() => setCount((value) => value + 1)}>Increment</button> + </> + ); +} +``` -## Arguments +## Related -| Name | Type | Description | -| :------ | :------------ | :----------------------------------------- | -| `fn` | `(v: T) => T` | The function to run in a tracking scope. | -| `value` | `T` | The initial value to pass to the function. | +- [`createMemo`](/reference/basic-reactivity/create-memo) +- [`createRenderEffect`](/reference/secondary-primitives/create-render-effect) diff --git a/src/routes/reference/secondary-primitives/create-deferred.mdx b/src/routes/reference/secondary-primitives/create-deferred.mdx index d62f43b08..5dfb8bc09 100644 --- a/src/routes/reference/secondary-primitives/create-deferred.mdx +++ b/src/routes/reference/secondary-primitives/create-deferred.mdx @@ -1,29 +1,110 @@ --- title: createDeferred +use_cases: >- + performance optimization, idle updates, non-critical ui updates, debouncing + changes, reducing re-renders +tags: + - performance + - optimization + - deferred + - idle + - updates +version: "1.0" +description: >- + Create a deferred accessor whose updates are scheduled for later execution or + when the timeout is reached. --- +`createDeferred` returns a deferred accessor for a source accessor. + +## Import + +```ts +import { createDeferred } from "solid-js"; +``` + +## Type + ```ts -import { createDeferred } from "solid-js" +type Accessor<T> = () => T; function createDeferred<T>( - source: () => T, + source: Accessor<T>, options?: { - timeoutMs?: number - equals?: false | ((prev: T, next: T) => boolean) - name?: string + timeoutMs?: number; + equals?: false | ((prev: T, next: T) => boolean); + name?: string; } -): () => T - +): Accessor<T>; ``` -Creates a readonly that only notifies downstream changes when the browser is idle. -`timeoutMs` is the maximum time to wait before forcing the update. +## Parameters + +### `source` + +- **Type:** `Accessor<T>` +- **Required:** Yes + +Accessor used as the deferred source. + +### `options` + +#### `timeoutMs` + +- **Type:** `number` + +Maximum delay before the deferred value is updated. + +#### `equals` -## Options +- **Type:** `false | ((prev: T, next: T) => boolean)` + +Comparison function used to determine whether the deferred accessor should notify dependents. + +#### `name` + +- **Type:** `string` + +Debug name used by development tooling. + +## Return value + +- **Type:** `Accessor<T>` + +Returns an accessor that exposes the deferred value. + +## Behavior + +- The deferred accessor initially reflects the current source value. +- Later updates are deferred through Solid's scheduler until later execution or until `timeoutMs` is reached, so the returned accessor can lag behind the source accessor. +- `equals` controls whether downstream dependents are notified for a new value. +- `createDeferred` defers propagation of the accessor value. It does not debounce writes to the source accessor. +- On the server, `createDeferred` returns the source accessor unchanged. + +## Examples + +### Basic usage + +```tsx +import { createDeferred, createSignal } from "solid-js"; + +function Example() { + const [value, setValue] = createSignal(""); + const deferredValue = createDeferred(value); + + return ( + <> + <input + value={value()} + onInput={(event) => setValue(event.currentTarget.value)} + /> + <div>{deferredValue()}</div> + </> + ); +} +``` -| Name | Type | Description | -| --------- | ------------------------------------------ | ------------------------------------------------------ | -| timeoutMs | `number` | The maximum time to wait before forcing the update. | -| equals | `false or ((prev: T, next: T) => boolean)` | A function that returns true if the value has changed. | -| name | `string` | The name of the readonly. | +## Related +- [`createMemo`](/reference/basic-reactivity/create-memo) +- [`startTransition`](/reference/reactive-utilities/start-transition) diff --git a/src/routes/reference/secondary-primitives/create-reaction.mdx b/src/routes/reference/secondary-primitives/create-reaction.mdx index 9a49a35c1..7cfa6a092 100644 --- a/src/routes/reference/secondary-primitives/create-reaction.mdx +++ b/src/routes/reference/secondary-primitives/create-reaction.mdx @@ -1,26 +1,83 @@ --- title: createReaction +use_cases: >- + custom tracking logic, one-time reactions, separating tracking from execution, + advanced reactive patterns +tags: + - reactivity + - tracking + - custom + - effects + - advanced +version: "1.0" +description: >- + Create a reaction that runs once when the tracked expression is invalidated. --- +`createReaction` creates a reaction that invalidates once for each call to the returned tracking function. + +## Import + ```ts -import { createReaction } from "solid-js" +import { createReaction } from "solid-js"; +``` -function createReaction(onInvalidate: () => void): (fn: () => void) => void +## Type +```ts +function createReaction( + onInvalidate: () => void, + options?: { name?: string } +): (tracking: () => void) => void; ``` -Sometimes it is useful to separate tracking from re-execution. -This primitive registers a side effect that is run the first time the expression wrapped by the returned tracking function is notified of a change. +## Parameters + +### `onInvalidate` + +- **Type:** `() => void` +- **Required:** Yes + +Callback invoked when the tracked computation is invalidated. + +### `options` + +#### `name` + +- **Type:** `string` + +Debug name used by development tooling. + +## Return value + +- **Type:** `(tracking: () => void) => void` + +Returns a function that executes `tracking` and records its dependencies for a single invalidation. + +## Behavior + +- Each call to the returned function records dependencies read during `tracking`. +- `onInvalidate` runs untracked on the first change to any recorded dependency. +- On the server, the returned function just executes `tracking`. + +## Examples + +### Track a signal for one invalidation ```ts -const [s, set] = createSignal("start") +import { createReaction, createSignal } from "solid-js"; -const track = createReaction(() => console.log("something")) +const [value, setValue] = createSignal("start"); -// run the reaction next time `s` changes. -track(() => s()) +const track = createReaction(() => console.log("changed")); -set("end") // "something" +track(() => value()); -set("final") // no-op since the reaction only runs on the first update, need to call `track` again. +setValue("end"); // logs "changed" +setValue("final"); // no-op until track() runs again ``` + +## Related + +- [`createEffect`](/reference/basic-reactivity/create-effect) +- [`createComputed`](/reference/secondary-primitives/create-computed) diff --git a/src/routes/reference/secondary-primitives/create-render-effect.mdx b/src/routes/reference/secondary-primitives/create-render-effect.mdx index bf8a77852..aac6df1a1 100644 --- a/src/routes/reference/secondary-primitives/create-render-effect.mdx +++ b/src/routes/reference/secondary-primitives/create-render-effect.mdx @@ -1,57 +1,133 @@ --- title: createRenderEffect +use_cases: >- + dom manipulation during render, immediate effects, rendering phase logic, + ref-independent effects, custom rendering +tags: + - rendering + - effects + - dom + - immediate + - refs + - lifecycle +version: "1.0" +description: >- + Create a reactive computation that runs immediately during the render phase. --- -```ts -import { createRenderEffect } from "solid-js" +`createRenderEffect` creates a reactive computation that runs during the render phase as DOM is created and updated. +It tracks reactive reads inside the provided function and re-runs whenever those dependencies change. -function createRenderEffect<T>(fn: (v: T) => T, value?: T): void +## Execution Timing -``` +### Initial Run + +- A render effect runs **synchronously during the current rendering phase**, while DOM elements are being created or updated. +- It **runs before elements are mounted** to the DOM. +- **[Refs](/concepts/refs) are not set** during this initial run. + +### Subsequent Runs + +- After the initial render, the render effect **re-runs whenever any of its tracked dependencies change**. +- When multiple dependencies change within the same batch, the render effect **runs once per batch**. -A render effect is a computation similar to a regular effect (as created by [`createEffect`](/reference/basic-reactivity/create-effect)), but differs in when Solid schedules the first execution of the effect function. -While `createEffect` waits for the current rendering phase to be complete, `createRenderEffect` immediately calls the function. -Thus the effect runs as DOM elements are being created and updated, but possibly before specific elements of interest have been created, and probably before those elements have been connected to the document. -In particular, **refs** will not be set before the initial effect call. -Indeed, Solid uses `createRenderEffect` to implement the rendering phase itself, including setting of **refs**. +### Server-Side Rendering -Reactive updates to render effects are identical to effects: they queue up in response to a reactive change (e.g., a single signal update, or a batch of changes, or collective changes during an entire render phase) and run in a single [`batch`](/reference/reactive-utilities/batch) afterward (together with effects). -In particular, all signal updates within a render effect are batched. +- During SSR, render effects **run once on the server**, since they are part of the synchronous rendering phase. +- On the client, an initial run still occurs during the client rendering phase. +- After hydration, subsequent runs occur on the client when dependencies change. + +## Import + +```ts +import { createRenderEffect } from "solid-js"; +``` -Here is an example of the behavior. (Compare with the example in [`createEffect`](/reference/basic-reactivity/create-effect).) +## Type ```ts -// assume this code is in a component function, so is part of a rendering phase -const [count, setCount] = createSignal(0) - -// this effect prints count at the beginning and when it changes -createRenderEffect(() => console.log("count =", count())) -// render effect runs immediately, printing `count = 0` -console.log("hello") -setCount(1) // effect won't run yet -setCount(2) // effect won't run yet - -queueMicrotask(() => { - // now `count = 2` will print - console.log("microtask") - setCount(3) // immediately prints `count = 3` - console.log("goodbye") -}) - -// --- overall output: --- -// count = 0 [this is the only added line compared to createEffect] -// hello -// count = 2 -// microtask -// count = 3 -// goodbye +function createRenderEffect<Next>( + fn: EffectFunction<undefined | NoInfer<Next>, Next> +): void; +function createRenderEffect<Next, Init = Next>( + fn: EffectFunction<Init | Next, Next>, + value: Init, + options?: { name?: string } +): void; +function createRenderEffect<Next, Init>( + fn: EffectFunction<Init | Next, Next>, + value?: Init, + options?: { name?: string } +): void; ``` -Just like `createEffect`, the effect function gets called with an argument equal to the value returned from the effect function's last execution, or on the first call, equal to the optional second argument of `createRenderEffect`. +## Parameters + +### `fn` + +- **Type:** `EffectFunction<undefined | NoInfer<Next>, Next> | EffectFunction<Init | Next, Next>` +- **Required:** Yes + +A function to be executed as the render effect. + +It receives the value returned from the previous run, or the initial `value` during the first run. +The value returned by `fn` is passed to the next run. + +### `value` + +- **Type:** `Init` +- **Required:** No + +The initial value passed to `fn` during its first run. + +### `options` + +- **Type:** `{ name?: string }` +- **Required:** No + +An optional configuration object with the following properties: + +#### `name` + +- **Type:** `string` +- **Required:** No + +A name for the render effect, which can be useful for identification in debugging tools like the [Solid Debugger](https://github.com/thetarnav/solid-devtools). + +## Return value + +`createRenderEffect` does not return a value. + +## Behavior + +- `createRenderEffect` runs immediately when it is created. +- Its initial run happens during the render phase, before mounted DOM is connected and before refs are assigned. +- Later runs happen when tracked dependencies change. +- Most application code should use [`createEffect`](/reference/basic-reactivity/create-effect). `createRenderEffect` is mainly for render-phase work where that timing is required. + +## Examples + +### Ref timing + +```tsx +import { createRenderEffect, onMount } from "solid-js"; + +function Example() { + let element: HTMLDivElement | undefined; + + createRenderEffect(() => { + console.log("render effect", element); // undefined on the initial run + }); + + onMount(() => { + console.log("mounted", element); // <div> + }); + + return <div ref={element}>Hello</div>; +} +``` -## Arguments +## Related -| Name | Type | Description | -| :------ | :------------ | :----------------------------------------------------- | -| `fn` | `(v: T) => T` | The effect function to be called. | -| `value` | `T` | The initial value to be passed to the effect function. | +- [`createEffect`](/reference/basic-reactivity/create-effect) +- [`onCleanup`](/reference/lifecycle/on-cleanup) diff --git a/src/routes/reference/secondary-primitives/create-selector.mdx b/src/routes/reference/secondary-primitives/create-selector.mdx index 8b5c0ade0..3b43ec360 100644 --- a/src/routes/reference/secondary-primitives/create-selector.mdx +++ b/src/routes/reference/secondary-primitives/create-selector.mdx @@ -1,63 +1,104 @@ --- title: createSelector +use_cases: >- + selection states, active items, dropdown menus, tab navigation, list + highlighting, performance optimization +tags: + - reactivity + - performance + - selection + - ui-state + - optimization +version: "1.0" +description: >- + Create a keyed boolean accessor that reports whether a key matches the current + source value. --- -```ts -import { createSelector } from "solid-js" +`createSelector` returns a keyed boolean accessor derived from a source accessor. + +## Import -function createSelector<T, U>( - source: () => T, - fn?: (a: U, b: T) => boolean -): (key: U) => boolean +```ts +import { createSelector } from "solid-js"; ``` -Creates a parameterized derived boolean signal `selector(key)` that indicates -whether `key` is equal to the current value of the `source` signal. -These signals are optimized to notify each subscriber only when their `key` -starts or stops matching the reactive `source` value -(instead of every time `key` changes). -If you have *n* different subscribers with different keys, -and the `source` value changes from `a` to `b`, then -instead of all *n* subscribers updating, -at most two subscribers will update: -the signal with key `a` will change to `false`, -and the signal with key `b` will change to `true`. -Thus it reduces from *n* updates to 2 updates. - -Useful for defining the selection state of several selectable elements. -For example: +## Type -```tsx -const [selectedId, setSelectedId] = createSignal() -const isSelected = createSelector(selectedId) +```ts +type Accessor<T> = () => T; -<For each={list()}> - {(item) => <li classList={{ active: isSelected(item.id) }}>{item.name}</li>} -</For> +function createSelector<T, U = T>( + source: Accessor<T>, + fn?: (key: U, value: T) => boolean, + options?: { name?: string } +): (key: U) => boolean; ``` -In the code above, each `li` element receives an `active` class -exactly when the corresponding `item.id` is equal to `selectedId()`. -When the `selectedId` signal changes, the `li` element(s) that previously -had previously matching `id` get the `active` class removed, and the -`li` element(s) that now have a matching `id` get the `active` class added. -All other `li` elements get skipped, so if `id`s are distinct, -only 2 DOM operations get performed. +## Parameters + +### `source` + +- **Type:** `Accessor<T>` +- **Required:** Yes + +Accessor used as the selection source. + +### `fn` + +- **Type:** `(key: U, value: T) => boolean` + +Comparison function used to match a key against the current source value. + +### `options` -By contrast, the following code would perform `list().length` DOM operations -every time the `selectedId` signal changes: +#### `name` + +- **Type:** `string` + +Debug name used by development tooling. + +## Return value + +- **Type:** `(key: U) => boolean` + +Returns an accessor function that reports whether the provided key matches the current source value. Each subscriber tracks only its own key. + +## Behavior + +- The returned function compares each key against the current source value. With the default comparison, matching uses strict equality. +- Solid tracks subscribers by key, so only subscribers whose key starts or stops matching need to update. +- On the server, `createSelector` compares each key directly against `source()` without keyed subscriber bookkeeping. + +Compared with checking equality directly in every subscriber, `createSelector` keeps subscriptions keyed by the compared value. + +## Examples + +### Basic usage ```tsx -const [selectedId, setSelectedId] = createSignal() +import { createSelector, createSignal, For } from "solid-js"; + +function Example(props) { + const [selectedId, setSelectedId] = createSignal<number>(); + const isSelected = createSelector(selectedId); -<For each={list()}> - {(item) => <li classList={{ active: selectedId() === item.id }}>{item.name}</li>} -</For> + return ( + <For each={props.list}> + {(item) => ( + <li + classList={{ active: isSelected(item.id) }} + onClick={() => setSelectedId(item.id)} + > + {item.name} + </li> + )} + </For> + ); +} ``` -## Arguments +## Related -| Name | Type | Description | -| :------- | :------------------------ | :------------------------------------------- | -| `source` | `() => T` | The source signal to get the value from and compare with keys. | -| `fn` | `(a: U, b: T) => boolean` | A function to compare the key and the value, returning whether they should be treated as equal. Default: `===` | +- [`createMemo`](/reference/basic-reactivity/create-memo) +- [`<For>`](/reference/components/for) diff --git a/src/routes/reference/server-utilities/data.json b/src/routes/reference/server-utilities/data.json index 5f09a10a8..3d47aead9 100644 --- a/src/routes/reference/server-utilities/data.json +++ b/src/routes/reference/server-utilities/data.json @@ -1,6 +1,4 @@ { "title": "Server utilities", - "pages": [ - "get-request-event.mdx" - ] + "pages": ["get-request-event.mdx"] } diff --git a/src/routes/reference/server-utilities/get-request-event.mdx b/src/routes/reference/server-utilities/get-request-event.mdx index 1a409b888..37a00c6fb 100644 --- a/src/routes/reference/server-utilities/get-request-event.mdx +++ b/src/routes/reference/server-utilities/get-request-event.mdx @@ -1,68 +1,56 @@ --- title: getRequestEvent +use_cases: >- + reading the current request object, accessing request-scoped server context +tags: + - server + - ssr + - request + - context +version: "1.0" +description: >- + Read the current request event from `solid-js/web`. --- -Solid uses Async Local Storage as a way of injecting the request context anywhere on the server. -The server provides a utility function to access this context -(called a `RequestEvent`). +`getRequestEvent` returns the current request event when one is available. -```js -import { getRequestEvent } from "solid-js/web" -import type { RequestEvent } from "solid-js/web" +## Import -function getRequestEvent(): RequestEvent | undefined +```ts +import { getRequestEvent } from "solid-js/web"; ``` -You can retrieve the request event by calling `getRequestEvent`: +## Type -```js -import { getRequestEvent } from "solid-js/web" +```ts +import type { RequestEvent } from "solid-js/web"; -const event = getRequestEvent() +function getRequestEvent(): RequestEvent | undefined; ``` -## Request +## Return value -`.request` is the most important property of the `RequestEvent`. -This is a Web [Request object](https://developer.mozilla.org/en-US/docs/Web/API/Request) that represents the current request to the server. -You can access properties off of it such as `url` and `headers`. - `body`, however, does not typically need to be handled directly for things such as server functions or rendering, which already handle mapping. +- **Type:** `RequestEvent | undefined` -```js -import { getRequestEvent } from "solid-js/web" +## Behavior -const event = getRequestEvent(); -if (event) { - const auth = event.request.headers.get("Authorization"); -} -``` +- `getRequestEvent` is for managed server/request scope. +- When available, the returned event includes the current `Request` as `event.request`. +- Depending on the server integration, the event can also expose request-scoped fields such as `response`, `locals`, or router state. +- If no current request event is available, including outside managed async scope, `getRequestEvent` returns `undefined`. -## Response +## Examples -The `getRequestEvent` can also be used to stub out the Response - this extends the [options that can be passed to the `Response constructor`](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#options). -This is kept up to date so it can be used to read and write headers and status for the current response. +### Basic usage -```js -import { getRequestEvent } from "solid-js/web" +```ts +import { getRequestEvent } from "solid-js/web"; -const event = getRequestEvent(); -if (event) { - event.response.headers.append("Set-Cookie", "foo=hello"); - event.response.status = 201; +function readAuthorizationHeader() { + const event = getRequestEvent(); + + return event?.request.headers.get("Authorization") ?? null; } ``` -### Change event.response or create a new Response - -The `getRequestEvent` event is considered global and lasts the life of the request. -Therefore, if you are calling a server function on the server during SSR or an RPC call, setting values on `event.response` will reflect on that request. - -The returned response will only impact the response when it is an RPC call. -This is important because some headers previously set may not be needed to be set for the whole page, but only for a specific request. - -**Note:** This is important to keep in mind when choosing where to set headers and responses. - -:::note[Usage with SolidStart] - See this guide on [Request - Events](/solid-start/advanced/request-events). -::: +This example reads the event during request-scoped server execution. diff --git a/src/routes/reference/store-utilities/create-mutable.mdx b/src/routes/reference/store-utilities/create-mutable.mdx index 97b92394e..d04ae0900 100644 --- a/src/routes/reference/store-utilities/create-mutable.mdx +++ b/src/routes/reference/store-utilities/create-mutable.mdx @@ -1,53 +1,100 @@ --- title: createMutable +use_cases: >- + mutable proxy state, interop with mutable systems, object mutation through a + store proxy +tags: + - store + - mutable + - proxy + - state +version: "1.0" +description: >- + Create a mutable store proxy. --- -`createMutable` creates a new mutable Store proxy object that provides a way to selectively trigger updates only when values change. +`createMutable` creates a mutable store proxy. -By intercepting property access, it allows automatic tracking of deep nesting via proxy making it useful for integrating external systems or serving as a compatibility layer with frameworks like MobX or Vue. +## Import -```tsx -import { createMutable } from "solid-js/store" -import type { Store, StoreNode } from "solid-js/store" +```ts +import { createMutable } from "solid-js/store"; +``` + +## Type -function createMutable<T extends StoreNode>(state: T | Store<T>): Store<T>; +```ts +function createMutable<T extends StoreNode>( + state: T, + options?: { name?: string } +): T; ``` -:::note - It's important to recognize that a mutable state, which can be passed around and modified anywhere, may complicate the code structure and increase the risk of breaking unidirectional flow. +## Parameters + +### `state` + +- **Type:** `T` + +Initial mutable state. + +### `options` + +#### `name` + +- **Type:** `string` + +Debug name used by development tooling. + +## Return value - For a more robust alternative, it is generally recommended to use `createStore` instead. - Additionally, the [`produce`](/reference/store-utilities/produce) utility can provide many of these same benefits without the associated downsides. -::: +- **Type:** `T` + +Mutable store proxy. + +## Behavior + +- `createMutable` creates mutable shared state through a reactive proxy. Property reads and writes go through that proxy, and nested property access is reactive. +- Writes, deletes, and array mutator methods are batched through the proxy while updating the store in place. +- `createMutable` exposes reads and writes through the same proxy instead of separating them into a getter and setter. +- Getters and setters defined on the initial object remain available on the mutable store. + +## Examples + +### Basic usage ```tsx -import { createMutable } from "solid-js/store" +import { createMutable } from "solid-js/store"; const state = createMutable({ someValue: 0, list: [], }); -// read value -state.someValue; - -// set value state.someValue = 5; - -state.list.push(anotherValue); +state.list.push("item"); ``` -Mutables support setters along with getters. +### Getter and setter ```tsx +import { createMutable } from "solid-js/store"; + const user = createMutable({ firstName: "John", lastName: "Smith", get fullName() { return `${this.firstName} ${this.lastName}`; }, - set setFullName(value) { + set fullName(value) { [this.firstName, this.lastName] = value.split(" "); }, }); + +user.fullName = "Jane Doe"; ``` + +## Related + +- [`modifyMutable`](/reference/store-utilities/modify-mutable) +- [`createStore`](/reference/store-utilities/create-store) diff --git a/src/routes/reference/store-utilities/create-store.mdx b/src/routes/reference/store-utilities/create-store.mdx index c084231aa..180b7ddd0 100644 --- a/src/routes/reference/store-utilities/create-store.mdx +++ b/src/routes/reference/store-utilities/create-store.mdx @@ -1,88 +1,104 @@ --- title: createStore +use_cases: >- + object state, array state, nested state, structured application state +tags: + - store + - state + - objects + - arrays +version: "1.0" +description: >- + Create a reactive store and a setter function for structured state. --- -Stores were intentionally designed to manage data structures like objects and arrays but are capable of handling other data types, such as strings and numbers. +`createStore` creates a reactive store and setter function for structured state. -## Types Signature +## Import -```tsx -import { createStore } from "solid-js/store" -import type { StoreNode, Store, SetStoreFunction } from "solid-js/store" +```ts +import { createStore } from "solid-js/store"; +``` -function createStore<T extends StoreNode>( - state: T | Store<T> -): [get: Store<T>, set: SetStoreFunction<T>]; +## Type -type Store<T> = T; // conceptually readonly, but not typed as such +```ts +type Store<T> = T; + +interface SetStoreFunction<T> { + (setter: T | Partial<T> | ((prev: T) => T | Partial<T>)): void; + (...path: unknown[]): void; +} + +function createStore<T extends object = {}>( + store?: T | Store<T>, + options?: { name?: string } +): [Store<T>, SetStoreFunction<T>]; ``` -## Usage +## Parameters -```tsx -import { createStore } from "solid-js/store"; +### `store` -// Initialize store -const [store, setStore] = createStore({ - userCount: 3, - users: [ - { - id: 0, - username: "felix909", - location: "England", - loggedIn: false, - }, - { - id: 1, - username: "tracy634", - location: "Canada", - loggedIn: true, - }, - { - id: 1, - username: "johny123", - location: "India", - loggedIn: true, - }, - ], -}); -``` +- **Type:** `T | Store<T>` + +Initial store value. + +### `options` + +#### `name` + +- **Type:** `string` + +Debug name used by development tooling. + +## Return value + +- **Type:** `[Store<T>, SetStoreFunction<T>]` + +Tuple containing the store proxy and its setter. + +## Behavior -## Getter +- The returned store is read through a proxy, and property reads track at the property level. +- The setter supports both top-level updates and path syntax for nested updates. +- Object updates shallow-merge by default, while single-array updates replace array contents. Setting a property to `undefined` deletes it. +- Getters defined on the initial object remain available on the store. -Store objects support the use of getters to store derived values. +## Examples + +### Basic usage ```tsx +import { createStore } from "solid-js/store"; + const [state, setState] = createStore({ user: { firstName: "John", lastName: "Smith", - get fullName() { - return `${this.firstName} ${this.lastName}`; - }, }, }); -``` -## Setter +setState("user", "firstName", "Jane"); +``` -Changes can take the form of function that passes previous state and returns new state or a value. -Objects are always shallowly merged. Set values to undefined to delete them from the Store. -In TypeScript, you can delete a value by using a non-null assertion, like `undefined!`. +### Getter ```tsx -const [state, setState] = createStore({ - firstName: "John", - lastName: "Miller", -}); - -setState({ firstName: "Johnny", middleName: "Lee" }); -// ({ firstName: 'Johnny', middleName: 'Lee', lastName: 'Miller' }) +import { createStore } from "solid-js/store"; -setState((state) => ({ preferredName: state.firstName, lastName: "Milner" })); -// ({ firstName: 'Johnny', preferredName: 'Johnny', middleName: 'Lee', lastName: 'Milner' }) +const [state] = createStore({ + user: { + firstName: "John", + lastName: "Smith", + get fullName() { + return `${this.firstName} ${this.lastName}`; + }, + }, +}); ``` ---- +## Related -To learn more about using stores check the [Stores Guide](/concepts/stores), and the **Store utilities** section for more advanced APIs. +- [`createMutable`](/reference/store-utilities/create-mutable) +- [Stores](/concepts/stores) diff --git a/src/routes/reference/store-utilities/modify-mutable.mdx b/src/routes/reference/store-utilities/modify-mutable.mdx index ac5621304..7673917de 100644 --- a/src/routes/reference/store-utilities/modify-mutable.mdx +++ b/src/routes/reference/store-utilities/modify-mutable.mdx @@ -1,79 +1,68 @@ --- title: modifyMutable +use_cases: >- + batched mutable-store updates, applying store modifiers to mutable stores +tags: + - store + - mutable + - batch + - updates +version: "1.0" +description: >- + Apply a modifier to a mutable store inside a batch. --- -`modifyMutable` streamlines the process of making multiple changes to a mutable Store, as obtained through the use of [`createMutable`](/reference/store-utilities/create-mutable). +`modifyMutable` applies a modifier to a mutable store inside a batch. -It operates within a single [`batch`](/reference/reactive-utilities/batch), ensuring that dependent computations are updated just once, rather than triggering updates for each individual change. +## Import -```tsx -import { modifyMutable } from "solid-js/store" - -function modifyMutable<T>(mutable: T, modifier: (state: T) => T): void +```ts +import { modifyMutable } from "solid-js/store"; ``` -The function takes two arguments: +## Type -1. The first argument is the mutable Store that needs modification. -2. The second argument is a Store modifier, which could be one of those returned by [`reconcile`](/reference/store-utilities/reconcile). +```ts +function modifyMutable<T>(state: T, modifier: (state: T) => T): void; +``` -:::caution - When passing in your own modifier function, it's important to be aware that - its argument is an unwrapped version of the store. -::: +## Parameters -For example, if the UI depends on multiple fields of a mutable: +### `state` -```tsx -import { createMutable } from "solid-js/store" +- **Type:** `T` -const state = createMutable({ - user: { - firstName: "John", - lastName: "Smith", - }, -}); +Mutable store to modify. -<h1>Hello {state.user.firstName + " " + state.user.lastName}</h1>; -``` +### `modifier` -Modifying n fields in sequence will cause the UI to update n times: +- **Type:** `(state: T) => T` -```tsx -state.user.firstName = "Jane"; -state.user.lastName = "Doe"; -``` +Modifier applied to the mutable store. For direct mutation-style modifiers, the return value is ignored. -To trigger just a single update, the fields can be modified using a `batch`: +## Return value -```tsx -import { batch } from "solid-js" +- **Type:** `void` -batch(() => { - state.user.firstName = "Jane"; - state.user.lastName = "Doe"; -}); -``` +## Behavior -`modifyMutable` combined with [`reconcile`](/reference/store-utilities/reconcile) or [`produce`](/reference/store-utilities/produce) provides two alternate ways to do similar things: +- `modifyMutable` runs inside a [`batch`](/reference/reactive-utilities/batch), so multiple changes notify dependents after the modifier completes, and the modifier receives the unwrapped underlying state object instead of the proxy. +- The modifier can be a function returned by helpers such as [`reconcile`](/reference/store-utilities/reconcile) or [`produce`](/reference/store-utilities/produce). -```tsx -import { modifyMutable, reconcile } from "solid-js/store" +## Examples -// Replace state.user with the specified object (deleting any other fields) -modifyMutable( - state.user, - reconcile({ - firstName: "Jane", - lastName: "Doe", - }) -); -``` +### Basic usage ```tsx -import { modifyMutable, produce } from "solid-js/store" +import { createMutable, modifyMutable, produce } from "solid-js/store"; + +const state = createMutable({ + user: { + firstName: "John", + lastName: "Smith", + }, +}); -// Modify two fields in a batch, triggering just one update modifyMutable( state, produce((state) => { @@ -82,3 +71,9 @@ modifyMutable( }) ); ``` + +## Related + +- [`createMutable`](/reference/store-utilities/create-mutable) +- [`produce`](/reference/store-utilities/produce) +- [`reconcile`](/reference/store-utilities/reconcile) diff --git a/src/routes/reference/store-utilities/produce.mdx b/src/routes/reference/store-utilities/produce.mdx index 612769d9a..efd55d775 100644 --- a/src/routes/reference/store-utilities/produce.mdx +++ b/src/routes/reference/store-utilities/produce.mdx @@ -1,37 +1,73 @@ --- title: produce +use_cases: >- + store updates, nested store changes, draft-style mutations +tags: + - store + - updates + - mutations +version: "1.0" +description: >- + Create a store modifier that applies changes by mutating the current state through a helper proxy. --- -`produce` is an [Immer](https://immerjs.github.io/immer/) inspired API for Solid's Store objects that allows the store to be mutated inside the `produce` function. +`produce` creates a store modifier that applies changes by mutating the current state through a helper proxy. + +## Import + +```ts +import { produce } from "solid-js/store"; +``` + +## Type ```ts -import { produce } from "solid-js/store" -import type { NotWrappable, Store } from "solid-js/store" - -function produce<T>( - fn: (state: T) => void -): ( - state: T extends NotWrappable ? T : Store<T> -) => T extends NotWrappable ? T : Store<T>; +function produce<T>(fn: (state: T) => void): (state: T) => T; ``` -For use with `createStore`: +## Parameters + +### `fn` + +- **Type:** `(state: T) => void` + +Function that mutates the provided proxy state. + +## Return value + +- **Type:** `(state: T) => T` + +Store modifier function. + +## Behavior + +- `produce` returns a function that can be passed to store setters or [`modifyMutable`](/reference/store-utilities/modify-mutable). +- The returned modifier mutates the passed state and returns that same state. +- The helper is primarily for store objects and nested wrappable data. + +## Examples + +### Basic usage ```tsx -import { produce } from "solid-js/store"; +import { createStore, produce } from "solid-js/store"; const [state, setState] = createStore({ user: { name: "John", - age: 30, }, - list: ["book", "pen"], + list: ["book"], }); setState( produce((state) => { state.user.name = "Jane"; - state.list.push("pencil"); + state.list.push("pen"); }) ); ``` + +## Related + +- [`modifyMutable`](/reference/store-utilities/modify-mutable) +- [`reconcile`](/reference/store-utilities/reconcile) diff --git a/src/routes/reference/store-utilities/reconcile.mdx b/src/routes/reference/store-utilities/reconcile.mdx index cfd0e7d94..000e7ffc4 100644 --- a/src/routes/reference/store-utilities/reconcile.mdx +++ b/src/routes/reference/store-utilities/reconcile.mdx @@ -1,45 +1,83 @@ --- title: reconcile +use_cases: >- + syncing store state, applying immutable data updates, diffing incoming data +tags: + - store + - diffing + - synchronization +version: "1.0" +description: >- + Create a store modifier that reconciles existing state with a new value. --- -`reconcile` is designed for diffing data changes in situations where granular updates cannot be applied. -This is useful when dealing with immutable data from stores or handling large API responses. +`reconcile` creates a store modifier that reconciles existing state with a new value. -```tsx -import { reconcile } from "solid-js/store" -import type { NotWrappable, Store } from "solid-js/store" +## Import -function reconcile<T>( - value: T | Store<T>, +```ts +import { reconcile } from "solid-js/store"; +``` + +## Type + +```ts +function reconcile<T extends U, U>( + value: T, options?: { key?: string | null; merge?: boolean; - } = { key: "id" } -): ( - state: T extends NotWrappable ? T : Store<T> -) => T extends NotWrappable ? T : Store<T> + } +): (state: U) => T; ``` -`reconcile` has a `key` option that can be used when available to match items. -The `value` accepts either a value of type `T` or a Store containing values of type `T`. -This represents the data to be reconciled. +## Parameters + +### `value` + +- **Type:** `T` + +New value to reconcile against the current state. + +### `options` + +#### `key` + +- **Type:** `string | null` -The `reconcile` function helps manage data changes by performing a diffing process, making it particularly handy in scenarios where applying granular updates is challenging or inefficient. +Key used to match items during reconciliation. -The `key` and `merge` options provide flexibility to customize the reconciliation process based on specific needs. +#### `merge` + +- **Type:** `boolean` + +Controls whether reconciliation pushes updates to the leaves instead of replacing non-matching branches. + +## Return value + +- **Type:** `(state: U) => T` + +Store modifier function. + +## Behavior + +- `reconcile` is for reconciling an incoming snapshot against existing store state. +- With the default `key`, array items are matched by `"id"` where possible and otherwise fall back to positional or reference matching. +- Non-wrappable values are replaced directly. +- When `merge` is `false`, reconciliation prefers replacing non-matching branches. When `merge` is `true`, it pushes updates deeper into the structure. + +## Examples + +### Basic usage ```ts -// subscribing to an observable -const unsubscribe = store.subscribe(({ todos }) => ( - setState('todos', reconcile(todos)); -); -onCleanup(() => unsubscribe()); +import { createStore, reconcile } from "solid-js/store"; + +const [state, setState] = createStore({ todos: [] }); +setState("todos", reconcile([{ id: 1, title: "Write docs" }])); ``` -##### Options +## Related -| Option | Type | Default | Description | -| ------ | ------- | ------- | ---------------------------------- | -| key | string | "id" | Specifies the key to be used for matching items during reconciliation | -| merge | boolean | false | When merge is false, referential checks are performed where possible to determine equality, and items that are not referentially equal are replaced. When merge is true, all diffing is pushed to the leaves, effectively morphing the previous data to the new value. | +- [`produce`](/reference/store-utilities/produce) diff --git a/src/routes/reference/store-utilities/unwrap.mdx b/src/routes/reference/store-utilities/unwrap.mdx index 64742a17e..551e26acf 100644 --- a/src/routes/reference/store-utilities/unwrap.mdx +++ b/src/routes/reference/store-utilities/unwrap.mdx @@ -1,12 +1,66 @@ --- title: unwrap +use_cases: >- + reading store data without proxies, passing plain data to other APIs +tags: + - store + - proxy + - data +version: "1.0" +description: >- + Remove store proxy wrapping from a store or store subtree. --- -`unwrap` returns the underlying data in the store without a proxy. +`unwrap` removes store proxy wrapping from a store or store subtree. -```tsx -import { unwrap } from "solid-js/store" -import type { Store } from "solid-js/store" +## Import -function unwrap(store: Store<T>): T +```ts +import { unwrap } from "solid-js/store"; ``` + +## Type + +```ts +function unwrap<T>(item: T): T; +``` + +## Parameters + +### `item` + +- **Type:** `T` + +Store value or store subtree to unwrap. + +## Return value + +- **Type:** `T` + +Unwrapped value. + +## Behavior + +- `unwrap` removes store proxies recursively and returns underlying plain data, reusing existing objects or arrays instead of cloning them when possible. +- Frozen objects and arrays are shallow-copied before recursive unwrapping, while mutable ones are unwrapped in place. +- Non-proxy input values are returned unchanged. +- Mutating the returned value can mutate the underlying store data. + +Do not assume `unwrap` produces an isolated deep clone. + +## Examples + +### Basic usage + +```ts +import { createStore, unwrap } from "solid-js/store"; + +const [state] = createStore({ user: { name: "John" } }); +const user = unwrap(state.user); + +user.name = "Jane"; +``` + +## Related + +- [`createStore`](/reference/store-utilities/create-store) diff --git a/src/routes/solid-meta/getting-started/client-setup.mdx b/src/routes/solid-meta/getting-started/client-setup.mdx index 32bc50c83..79065614e 100644 --- a/src/routes/solid-meta/getting-started/client-setup.mdx +++ b/src/routes/solid-meta/getting-started/client-setup.mdx @@ -1,6 +1,19 @@ --- title: Client setup order: 2 +use_cases: >- + seo, meta tags, document head management, social media tags, page titles, + canonical urls +tags: + - meta + - seo + - head + - client + - tags +version: "1.0" +description: >- + Manage document head tags in Solid apps. Add titles, meta tags, and links + dynamically for better SEO and social media sharing. --- You can inject a tag into the `<head />` by rendering one of the head tag components when necessary. diff --git a/src/routes/solid-meta/getting-started/installation-and-setup.mdx b/src/routes/solid-meta/getting-started/installation-and-setup.mdx index 223501dc2..72ebe2a63 100644 --- a/src/routes/solid-meta/getting-started/installation-and-setup.mdx +++ b/src/routes/solid-meta/getting-started/installation-and-setup.mdx @@ -1,6 +1,19 @@ --- title: Install and configure order: 1 +use_cases: >- + initial setup, meta tags configuration, seo setup, head management setup, ssr + meta tags +tags: + - setup + - installation + - meta + - configuration + - seo +version: "1.0" +description: >- + Install and configure @solidjs/meta for head tag management. Set up dynamic + titles, meta tags, and SEO optimization in Solid apps. --- :::note[Prerequisites] @@ -20,15 +33,23 @@ To get started, install using your preferred package manager. 1. Wrap your application with [`<MetaProvider />`](/solid-meta/reference/meta/metaprovider) 2. To include head tags within your application, render any of the following: - 1. [`<Title />`](/solid-meta/reference/meta/title): Adds the `title` of the page. - 2. [`<Meta />`](/solid-meta/reference/meta/meta): Adds extra metadata to the page. - 3. [`<Style />`](/solid-meta/reference/meta/style): Adds a `style` element to the page. - 4. [`<Link />`](/solid-meta/reference/meta/link): Specifies a relationship between the page and an external resource. - 5. [`<Base />`](/solid-meta/reference/meta/base): Specifies the base URL for all relative URLs in the document. + 1. [`<Title />`](/solid-meta/reference/meta/title): Adds the `title` of the page. + 2. [`<Meta />`](/solid-meta/reference/meta/meta): Adds extra metadata to the page. + 3. [`<Style />`](/solid-meta/reference/meta/style): Adds a `style` element to the page. + 4. [`<Link />`](/solid-meta/reference/meta/link): Specifies a relationship between the page and an external resource. + 5. [`<Base />`](/solid-meta/reference/meta/base): Specifies the base URL for all relative URLs in the document. + 6. [`useHead`](/solid-meta/reference/meta/use-head): Inserts arbitrary head tags when a dedicated component does not exist. + - These components can be used multiple times within the application. + 3. If using Solid on the server with JSX, no additional configuration is required. +:::note[Overriding existing tags] +If your `index.html` includes a `<head>` tag, Solid-Meta will not overwrite its contents. You can mark individual tags as overwritable by adding an empty `data-sm` attribute to them. +::: + Here is an example of how your code might look after this setup. + ```js import { MetaProvider, Title, Link, Meta } from "@solidjs/meta"; @@ -42,6 +63,7 @@ const App = () => ( </MetaProvider> ); ``` + On the server, tags are collected, and then on the client, server-generated tags are replaced with those rendered on the client side. This process is important for maintaining the expected behavior, such as Single Page Applications (SPAs) when pages load that require changes to the head tags. diff --git a/src/routes/solid-meta/getting-started/server-setup.mdx b/src/routes/solid-meta/getting-started/server-setup.mdx index 19a0bc691..bd2dd7e09 100644 --- a/src/routes/solid-meta/getting-started/server-setup.mdx +++ b/src/routes/solid-meta/getting-started/server-setup.mdx @@ -1,6 +1,20 @@ --- title: Server setup order: 3 +use_cases: >- + ssr setup, server rendering, meta tags on server, seo optimization, initial + page load +tags: + - ssr + - server + - meta + - seo + - setup + - rendering +version: "1.0" +description: >- + Configure server-side rendering for Solid Meta tags with MetaProvider. Learn + to properly inject head tags in SSR for optimal SEO and performance. --- For server setup, wrap your application with [`MetaProvider`](/solid-meta/reference/meta/metaprovider) on the server. diff --git a/src/routes/solid-meta/index.mdx b/src/routes/solid-meta/index.mdx index 3cee39418..02077625c 100644 --- a/src/routes/solid-meta/index.mdx +++ b/src/routes/solid-meta/index.mdx @@ -1,6 +1,21 @@ --- -title: Overview +title: Solid Meta Docs +nav_title: Overview +titleTemplate: ":title" mainNavExclude: true +use_cases: >- + managing head tags, seo optimization, document metadata, dynamic meta tags, + ssr meta management +tags: + - meta + - head + - seo + - ssr + - overview +version: "1.0" +description: >- + Solid Meta provides asynchronous SSR-ready document head management. Define + meta tags at any component level for flexible SEO and metadata control. --- # Overview diff --git a/src/routes/solid-meta/reference/meta/base.mdx b/src/routes/solid-meta/reference/meta/base.mdx index f0be6b9f9..91a1607df 100644 --- a/src/routes/solid-meta/reference/meta/base.mdx +++ b/src/routes/solid-meta/reference/meta/base.mdx @@ -1,6 +1,19 @@ --- title: Base order: 5 +use_cases: >- + setting base url, relative urls, external resources, multi-page apps, cdn + assets +tags: + - base + - url + - meta + - head + - routing +version: "1.0" +description: >- + Set the base URL for all relative URLs in your Solid app with the Base + component. Essential for apps with complex routing or external resources. --- `Base` is a component that specifies the base URL for all relative URLs in the document. @@ -26,4 +39,4 @@ export default function Root() { </MetaProvider> ); } -``` \ No newline at end of file +``` diff --git a/src/routes/solid-meta/reference/meta/data.json b/src/routes/solid-meta/reference/meta/data.json index 640bff60c..56a76d69d 100644 --- a/src/routes/solid-meta/reference/meta/data.json +++ b/src/routes/solid-meta/reference/meta/data.json @@ -6,6 +6,7 @@ "meta.mdx", "style.mdx", "base.mdx", - "metaprovider.mdx" + "metaprovider.mdx", + "use-head.mdx" ] } diff --git a/src/routes/solid-meta/reference/meta/link.mdx b/src/routes/solid-meta/reference/meta/link.mdx index e925f1dc9..3220ebf12 100644 --- a/src/routes/solid-meta/reference/meta/link.mdx +++ b/src/routes/solid-meta/reference/meta/link.mdx @@ -1,6 +1,18 @@ --- title: Link order: 2 +use_cases: "adding favicon, stylesheets, external resources, preloading assets, web fonts" +tags: + - link + - favicon + - stylesheet + - assets + - head + - resources +version: "1.0" +description: >- + Add external resources like stylesheets and favicons to your Solid app. Learn + to use the Link component for optimal resource loading and icons. --- The Link component establishes a connection between the page and an external resource. diff --git a/src/routes/solid-meta/reference/meta/meta.mdx b/src/routes/solid-meta/reference/meta/meta.mdx index 13e077da5..27ed5cfc1 100644 --- a/src/routes/solid-meta/reference/meta/meta.mdx +++ b/src/routes/solid-meta/reference/meta/meta.mdx @@ -1,6 +1,20 @@ --- title: Meta order: 3 +use_cases: >- + seo optimization, social media tags, viewport settings, charset configuration, + open graph +tags: + - meta + - seo + - viewport + - metadata + - head + - tags +version: "1.0" +description: >- + Add SEO and viewport metadata to your Solid app with the Meta component. + Configure description, keywords, and social media tags for better reach. --- The `<Meta>` component represents metadata that cannot be represented by other HTML elements. @@ -12,9 +26,9 @@ import { Meta } from "@solidjs/meta"; <Meta name="description" content="My site description" />; ``` - `Meta` components can be placed in the [`MetaProvider`](/solid-meta/reference/meta/metaprovider) or added throughout the application for additional metadata or override parents. `Meta` tags are considered the same and will be overridden if `name` attributes match. + ## Usage ### Adding `meta` tag @@ -31,4 +45,4 @@ export default function Root() { </MetaProvider> ); } -``` \ No newline at end of file +``` diff --git a/src/routes/solid-meta/reference/meta/metaprovider.mdx b/src/routes/solid-meta/reference/meta/metaprovider.mdx index d9932fa27..e1debf701 100644 --- a/src/routes/solid-meta/reference/meta/metaprovider.mdx +++ b/src/routes/solid-meta/reference/meta/metaprovider.mdx @@ -1,6 +1,20 @@ --- title: MetaProvider order: 6 +use_cases: >- + initializing meta tags, wrapping app, head management setup, meta context, + always in meta apps +tags: + - provider + - meta + - setup + - context + - wrapper + - head +version: "1.0" +description: >- + MetaProvider wraps your Solid app to enable head tag management. Essential + parent component for all metadata components to function properly. --- `MetaProvider` is a parent component responsible for wrapping all the metadata components. @@ -10,4 +24,4 @@ All components that are contained within this will be added to the application ` import { MetaProvider } from "@solidjs/meta"; <MetaProvider>// add meta components</MetaProvider>; -``` \ No newline at end of file +``` diff --git a/src/routes/solid-meta/reference/meta/style.mdx b/src/routes/solid-meta/reference/meta/style.mdx index 4d049ab3e..eb66313a8 100644 --- a/src/routes/solid-meta/reference/meta/style.mdx +++ b/src/routes/solid-meta/reference/meta/style.mdx @@ -1,6 +1,17 @@ --- title: Style order: 4 +use_cases: "inline styles, critical css, theme styles, dynamic styling, css-in-js" +tags: + - style + - css + - inline + - styling + - head +version: "1.0" +description: >- + Add inline CSS styles to your Solid app's head with the Style component. + Useful for critical CSS and dynamic styling needs in your application. --- `Style` is a component that adds the [`style`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style) element to your document's `head`. @@ -25,7 +36,7 @@ The `Style` component can add CSS to style elements within your application. It is recommended to add styles in an external stylesheet and use a `Link` instead, rather than using this component, however. :::tip[Note] - Styles within the `Style` component are not scoped. +Styles within the `Style` component are not scoped. ::: ```tsx twoslash diff --git a/src/routes/solid-meta/reference/meta/title.mdx b/src/routes/solid-meta/reference/meta/title.mdx index 01df78926..a22ca6e55 100644 --- a/src/routes/solid-meta/reference/meta/title.mdx +++ b/src/routes/solid-meta/reference/meta/title.mdx @@ -1,6 +1,19 @@ --- title: Title order: 1 +use_cases: >- + page titles, seo optimization, browser tab text, dynamic titles, navigation + context +tags: + - title + - seo + - head + - meta + - browser +version: "1.0" +description: >- + Set dynamic page titles in your Solid app with the Title component. Essential + for SEO and providing context in browser tabs and bookmarks. --- `Title` is a component that renders the [`title`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title) element. @@ -24,4 +37,4 @@ export default function Root() { </MetaProvider> ); } -``` \ No newline at end of file +``` diff --git a/src/routes/solid-meta/reference/meta/use-head.mdx b/src/routes/solid-meta/reference/meta/use-head.mdx new file mode 100644 index 000000000..c297d9a7e --- /dev/null +++ b/src/routes/solid-meta/reference/meta/use-head.mdx @@ -0,0 +1,183 @@ +--- +title: useHead +order: 7 +use_cases: >- + custom head tags, scripts, json-ld, arbitrary head elements, dynamic metadata, + ssr head management +tags: + - usehead + - head + - meta + - script + - json-ld + - ssr +version: "1.0" +description: >- + useHead inserts custom elements into document head with fine-grained control, + including scripts and JSON-LD, while staying SSR-ready. +--- + +`useHead` is a low-level API for registering custom `<head>` tags with the nearest [`MetaProvider`](/solid-meta/reference/meta/metaprovider). + +## Import + +```ts +import { useHead } from "@solidjs/meta"; +``` + +## Type + +```ts +type TagDescription = { + tag: string; + props: Record<string, unknown>; + setting?: { + close?: boolean; + escape?: boolean; + }; + id: string; + name?: string; + ref?: Element; +}; + +function useHead(tag: TagDescription): void; +``` + +## Parameters + +### `tag` + +- **Type:** `string` +- **Required:** Yes + +The tag name to render in `<head>` (eg. `<script>`, `<meta>`, `<title>`). + +### `props` + +- **Type:** `Record<string, unknown>` +- **Required:** Yes + +Attributes and properties applied to the rendered element. + +If `props.children` is provided, is provided, it is used as the element’s content for tags such as `title`, `style`, and `script`. +During server-side rendering, arrays of strings are concatenated without commas. + +### `setting` + +- **Type:** `{ close?: boolean; escape?: boolean }` +- **Required:** No + +SSR-only rendering options for the tag contents. + +#### `close` + +- **Type:** `boolean` +- **Required:** No + +Required for elements that cannot be self-closing, such as `script`, `style`, and `title`. When `true`, the server renders a closing tag and includes `children`. If `false`, `children` is not rendered. + +#### `escape` + +- **Type:** `boolean` +- **Required:** No + +When `true`, HTML-escapes `children` during SSR. +If omitted or `false`, renders `children` as raw HTML. + +### `id` + +- **Type:** `string` +- **Required:** Yes + +A stable identifier used to match server-rendered tags during hydration. +Value should remain consistent for the lifetime of the component. + +### `name` + +- **Type:** `string` +- **Required:** No + +An optional label for the tag. +With `meta` tags, can mirror `props.name` or `props.property`. + +### `ref` + +- **Type:** `Element` +- **Required:** No + +An existing element to reuse instead of creating a new one, typically managed internally. + +## Return value + +`useHead` does not return a value. + +## Examples + +### Simple custom tag + +```tsx +import { useHead } from "@solidjs/meta"; + +useHead({ + tag: "link", + id: "rss-feed", + props: { + rel: "alternate", + type: "application/rss+xml", + title: "Solid RSS", + href: "/rss.xml", + }, +}); +``` + +### JSON-LD per page (script with `close` and `escape`) + +```tsx +import { useHead } from "@solidjs/meta"; + +const jsonLD = JSON.stringify({ + "@context": "https://schema.org", + "@type": "WebSite", + name: "Solid Docs", + url: "https://docs.solidjs.com/", +}); + +useHead({ + tag: "script", + setting: { close: true, escape: false }, + id: "schema-home", + props: { + type: "application/ld+json", + children: jsonLD, + }, +}); +``` + +### Reactive updates + +```tsx +import { createSignal } from "solid-js"; +import { useHead } from "@solidjs/meta"; + +const [pageTitle, setPageTitle] = createSignal("Getting started"); + +useHead({ + tag: "title", + setting: { close: true, escape: true }, + id: "page-title", + props: { + get children() { + return `${pageTitle()} | Solid`; + }, + }, +}); +``` + +## Related + +- [`<MetaProvider />`](/solid-meta/reference/meta/metaprovider) +- [`<Title />`](/solid-meta/reference/meta/title) +- [`<Meta />`](/solid-meta/reference/meta/meta) +- [`<Link />`](/solid-meta/reference/meta/link) +- [`<Style />`](/solid-meta/reference/meta/style) +- [`<Base />`](/solid-meta/reference/meta/base) diff --git a/src/routes/solid-router/advanced-concepts/data.json b/src/routes/solid-router/advanced-concepts/data.json index 0f6e6c5f8..a41c62b1a 100644 --- a/src/routes/solid-router/advanced-concepts/data.json +++ b/src/routes/solid-router/advanced-concepts/data.json @@ -1,4 +1,4 @@ -{ - "title": "Advanced concepts", - "pages": ["lazy-loading.mdx"] -} +{ + "title": "Advanced concepts", + "pages": ["preloading.mdx", "lazy-loading.mdx"] +} diff --git a/src/routes/solid-router/advanced-concepts/lazy-loading.mdx b/src/routes/solid-router/advanced-concepts/lazy-loading.mdx index 2ef9d89a4..bc2055bf2 100644 --- a/src/routes/solid-router/advanced-concepts/lazy-loading.mdx +++ b/src/routes/solid-router/advanced-concepts/lazy-loading.mdx @@ -1,28 +1,42 @@ ---- -title: Lazy loading ---- - -Lazy loading allows you to load only the necessary resources when they are needed. -This can be useful when you have a large application with a lot of routes and components, and you want to reduce the initial load time. - -In Solid Router, you can lazy load components using the `lazy` function from Solid: - -```jsx -import { lazy } from "solid-js"; -import { Router, Route } from "@solidjs/router"; - -const Home = lazy(() => import("./Home")); - -const Users = lazy(() => import("./Users")); - -const App = () => ( - <Router> - <Route path="/" component={Home} /> - <Route path="/users" component={Users} /> - </Router> -); -``` - -In the example above, the `Users` component is lazy loaded using the `lazy` function. -The `lazy` function takes a function that returns a promise, which resolves to the component you want to load. -When the route is matched, the component will be loaded and rendered. +--- +title: Lazy loading +use_cases: >- + optimizing bundle size, code splitting, reducing initial load, large apps, + performance optimization +tags: + - lazy + - performance + - routing + - optimization + - splitting + - loading +version: "1.0" +description: >- + Implement lazy loading in Solid Router to reduce initial bundle size. Load + components on-demand for better performance in large applications. +--- + +Lazy loading allows you to load only the necessary resources when they are needed. +This can be useful when you have a large application with a lot of routes and components, and you want to reduce the initial load time. + +In Solid Router, you can lazy load components using the `lazy` function from Solid: + +```jsx +import { lazy } from "solid-js"; +import { Router, Route } from "@solidjs/router"; + +const Home = lazy(() => import("./Home")); + +const Users = lazy(() => import("./Users")); + +const App = () => ( + <Router> + <Route path="/" component={Home} /> + <Route path="/users" component={Users} /> + </Router> +); +``` + +In the example above, the `Users` component is lazy loaded using the `lazy` function. +The `lazy` function takes a function that returns a promise, which resolves to the component you want to load. +When the route is matched, the component will be loaded and rendered. diff --git a/src/routes/solid-router/advanced-concepts/preloading.mdx b/src/routes/solid-router/advanced-concepts/preloading.mdx new file mode 100644 index 000000000..73b949287 --- /dev/null +++ b/src/routes/solid-router/advanced-concepts/preloading.mdx @@ -0,0 +1,44 @@ +--- +title: Preloading +--- + +Preloading smooths navigation by resolving route code and data before a user completes a transition. +Solid Router listens for intent signals, such as hover and focus, and primes the matching route after a short delay to balance responsiveness and network cost. +Understanding the timing and scope of this work lets you decide when to rely on the default behaviour and when to layer custom strategies. + +| user action | route behaviour | +| ----------- | ------------------------------------- | +| hover | waits roughly 20 ms before preloading | +| focus | preloads immediately | + +## How Solid Router Detects Intent + +Anchors registered with Solid Router emit hover and focus events that feed a small scheduler. +The router debounces the hover signal for 20ms to ignore incidental pointer passes while still reacting quickly to purposeful movement. +When the delay elapses, the router loads the route module and runs its preload routine so that navigation has the assets it needs when the user commits. + +Route modules can export a [`preload`](/solid-router/reference/preload-functions/preload) function that receives params, search values, and router context. +The function lets you seed caches, warm derived computations, or coordinate streaming behaviours without blocking the eventual render. + +> [!NOTE] +> SSR invokes route `preload` functions during the initial server render and resumes them on the client during hydration. +> Keep these functions pure so the hydrated client does not need to undo server work when it takes over. + +## Imperative Preloading Hooks + +Not every interaction funnels through an anchor element. +The [`usePreloadRoute`](/solid-router/reference/primitives/use-preload-route) primitive exposes the same scheduling behaviour for imperative flows like flyout previews, timers, or observer driven experiences. + +This helper mirrors the router behaviour by resolving the module, optionally running the loader, and caching the result for the eventual navigation. +Empirical tuning of delay values helps you avoid excessive prefetching in dense UIs while still keeping high intent interactions snappy. + +## Coordinating Nested Lazy Components + +Nested lazy components live outside the router hierarchy, so route preloading does not automatically warm them. +The component API [`lazy()`](/reference/component-apis/lazy) exposes a `preload()` method that resolves a component without rendering it. +Calling both the route preload and the nested component preload can keep large detail panels responsive when a user hovers or focuses on the entry point. + +Balancing manual preloading requires observing real user flows so you avoid prefetching large bundles that the user never requests. +Profiling tools help you spot whether preloading reduces long tasks or simply shifts work earlier without net gains. + +To learn more about lazy loading components, see the [lazy documentation](/reference/component-apis/lazy#preloading-data-in-nested-lazy-components). diff --git a/src/routes/solid-router/concepts/actions.mdx b/src/routes/solid-router/concepts/actions.mdx index 53a96da9c..d7801c50c 100644 --- a/src/routes/solid-router/concepts/actions.mdx +++ b/src/routes/solid-router/concepts/actions.mdx @@ -1,152 +1,461 @@ --- -title: "Actions" +title: Actions +use_cases: >- + form submissions, data mutations, server communication, user input handling, + api calls, crud operations +tags: + - actions + - forms + - data + - api + - server + - submission + - mutations +version: "1.0" +description: >- + Handle form submissions and server mutations with Solid Router actions. Build + isomorphic data flows with progressive enhancement support. --- -When developing applications, it is common to need to communicate new information to the server based on user interactions. -Actions are Solid Router’s solution to this problem. +Many user interactions in an application involve changing data on the server. +These **mutations** can be challenging to manage, as they require updates to the application's state and proper error handling. +Actions simplify managing data mutations. -## What are actions? +Actions provide several benefits: -Actions are asynchronous processing functions that allow you to submit data to your server and receive a response. -They are isomorphic, meaning they can run either on the server or the client, depending on what is needed. -This flexibility makes actions a powerful tool for managing and tracking data submissions. +- **Integrated state management:** + Solid Router automatically tracks the execution state of an action, simplifying reactive UI feedback. +- **Automatic data revalidation:** + After an action successfully completes, Solid Router revalidates relevant [`queries`](/solid-router/data-fetching/queries), ensuring the UI reflects the latest data. +- **Progressive enhancement:** + When used with HTML forms, actions enable functionality even if JavaScript is not yet loaded. -### How actions work +## Defining actions -Actions represent the server-side part of an [HTML form](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form). -They handle submissions through POST requests, allowing you to easily use HTML forms to send data. +Actions are defined by wrapping the data-mutation logic with the [`action` function](/solid-router/reference/data-apis/action). -When a user performs an action, such as submitting a form, the data is sent to the server for processing via an action. +```tsx +import { action } from "@solidjs/router"; + +const createTicketAction = action(async (subject: string) => { + const response = await fetch("https://my-api.com/support/tickets", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ subject }), + }); + + if (!response.ok) { + const errorData = await response.json(); + return { ok: false, message: errorData.message }; + } + + return { ok: true }; +}, "createTicket"); +``` + +In this example, an action is defined that creates a support ticket using a remote API. + +## Using actions + +Actions can be triggered in two ways: using a HTML [`<form>` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/form) or programmatically using the [`useAction` primitive](/solid-router/reference/data-apis/use-action). -### Benefits of using actions +The recommended approach is to use a `<form>` element. +This ensures a robust user experience with progressive enhancement, since the form works even without JavaScript. -1. **Isomorphic**: Since actions can run on both the server and client, you can optimize performance by choosing the best execution environment for your needs. -2. **Asynchronous processing**: Actions handle data submissions asynchronously, ensuring that your application remains responsive. -3. **Simplified data handling**: By using actions, the process of managing and tracking data submissions can be streamlined, reducing the complexity of your application. +For cases where a form is not suitable, the [`useAction` primitive](/solid-router/reference/data-apis/use-action) can be used to trigger the action programmatically. -## Creating actions +### With the `<form>` element -To create an action, use the `action` function from the `@solidjs/router` package. -This function takes an asynchronous function as an argument and returns a new function that can be used to submit data. +Solid Router extends the standard HTML `<form>` element to work with actions. +Form submissions can be handled using action by passing an action to the `action` prop. + +Consider these points when using actions with `<form>`: + +1. The `<form>` element **must** have `method="post"`. +2. The action function will automatically receive the form's data as a [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData) object as its first parameter. +3. For SSR environments, a unique name **must** be provided as the second parameter to the `action` function. + This name is used by Solid Router to identify and serialize the action across the client and server. ```tsx import { action } from "@solidjs/router"; -const echo = action(async (message: string) => { - // Simulates an asynchronous operation, such as an API call - await new Promise((resolve, reject) => setTimeout(resolve, 1000)); - console.log(message); -}); +const submitFeedbackAction = action(async (formData: FormData) => { + const message = formData.get("message")?.toString(); + // ... Sends the feedback to the server. +}, "submitFeedback"); + +function FeedbackForm() { + return ( + <form action={submitFeedbackAction} method="post"> + <textarea name="message" placeholder="Message" /> + <button type="submit">Send feedback</button> + </form> + ); +} ``` -In this example, the `echo` action simulates a fetch call with a 1 second delay before logging the message to the console. -The `echo` action will act as a backend, however, it can be substituted for any API provided it can be run on the client. -Typically, route actions are used with some sort of solution like fetch or GraphQL. +In this example, when the form is submitted, `submitFeedbackAction` will be triggered with the `FormData` containing the form values. + +:::tip[Uploading files] +If a form that includes file inputs, the `<form>` element must have `enctype="multipart/form-data"` to correctly send the file data. + +```tsx +<form action={uploadFileAction} method="post" enctype="multipart/form-data"> + <input type="file" name="myFile" /> + <button type="submit">Upload</button> +</form> +``` -:::tip -In [SolidStart](/solid-start) apps, it's recommended to use the [`"use server"`](/solid-start/reference/server/use-server) directive to leverage server-side functionality. ::: -### Using actions +#### Passing additional arguments -To use the action, you can call it from within a component using [`useAction`](/solid-router/reference/data-apis/use-action). -This returns a function that can be called with the necessary arguments to trigger the action. +Sometimes, an action needs data that isn't part of the form's inputs. +These additional arguments can be passed using the `with` method. -```tsx del={1} ins={2,9-13} +The `with` method creates a new action that wraps around the original action. +When this new action is triggered, it forwards the arguments specified in the `with` method to the original action, followed by the `FormData` object. + +```tsx import { action } from "@solidjs/router"; + +const updateProductAction = action( + async (productId: string, formData: FormData) => { + // ... Sends the updated fields to the server. + + return { ok: true }; + }, + "updateProduct" +); + +function EditProductForm(props: { productId: string }) { + return ( + <form action={updateProductAction.with(props.productId)} method="post"> + <input name="name" placeholder="Product name" /> + <button type="submit">Save</button> + </form> + ); +} +``` + +In this example, `updateProductAction` receives `productId` (passed via `with`), and then the `formData` from the form. + +### With the `useAction` primitive + +For scenarios where a `<form>` element is not suitable, the `useAction` primitive provides a way to trigger an action programmatically. +The `useAction` primitive takes an action as its parameter and returns a function that, when called, triggers the action with the provided arguments. + +This approach requires client-side JavaScript and is not progressively enhanceable. + +```tsx import { action, useAction } from "@solidjs/router"; -const echo = action(async (message: string) => { - await new Promise((resolve, reject) => setTimeout(resolve, 1000)); - console.log(message); +const markNotificationReadAction = action(async (notificationId: string) => { + // ... Marks a notification as read on the server. }); -export function MyComponent() { - const myEcho = useAction(echo); +function NotificationItem(props: { id: string }) { + const markRead = useAction(markNotificationReadAction); - myEcho("Hello from Solid!"); + return <button onClick={() => markRead(props.id)}>Mark as read</button>; } ``` -In this component, `useAction` is used to get a reference to the `echo` action. -The action is then called with the message `"Hello from Solid!"`, which will be logged to the console after a 1 second delay. +In this example, `markRead` is a function that can be called with arguments matching `markNotificationReadAction`. +When the button is clicked, the action is triggered with the provided arguments. -### Returning data from actions +## Tracking submission state -In many cases, after submitting data, the server sends some data back as well. -This may be in the form of an error message if something has failed or the results of a successful operation. -Anything returned from an action can be accessed using the reactive `action.result` property, where the value can change each time you submit your action. +When an action is triggered, it creates a **submission** object. +This object is a snapshot of the action's execution, containing its input, current status (pending or complete), and its final result or error. +To access this state, Solid Router provides the [`useSubmission`](/solid-router/reference/data-apis/use-submission) and [`useSubmissions`](/solid-router/reference/data-apis/use-submissions) primitives. -To access the action's result, you must pass the action to `useSubmission`: +The `useSubmission` primitive tracks the state of the _most recent_ submission for a specific action. +This is ideal for most use cases, such as disabling a form's submit button while the action is pending or displaying a confirmation message upon success. -```tsx del={1} ins={2,11,15-17} -import { action, useAction } from "@solidjs/router"; -import { action, useAction, useSubmission } from "@solidjs/router"; +```tsx +import { Show } from "solid-js"; +import { action, useSubmission } from "@solidjs/router"; -const echo = action(async (message: string) => { - await new Promise((resolve, reject) => setTimeout(resolve, 1000)); - return message; -}); +const updateSettingsAction = action(async (formData: FormData) => { + // ... Sends the settings data to the server. +}, "updateSettings"); -export function MyComponent() { - const myEcho = useAction(echo); - const echoing = useSubmission(echo); +function UserSettingsForm() { + const submission = useSubmission(updateSettingsAction); - myEcho("Hello from solid!"); + return ( + <form action={updateSettingsAction} method="post"> + <input name="email" type="email" placeholder="Enter your email" /> - setTimeout(() => myEcho("This is a second submission!"), 1500); + <button disabled={submission.pending}> + {submission.pending ? "Saving..." : "Save settings"} + </button> + </form> + ); +} +``` - return <p>{echoing.result}</p>; +In this example, the form's submit button is disabled while `submission.pending` is `true`. + +:::tip +To track multiple submissions for a single action, such as in a multi-file uploader interface, the [`useSubmissions` primitive](/solid-router/reference/data-apis/use-submissions) can be used. +::: + +## Handling errors + +An action can fail for various reasons. +A robust application must handle these failures gracefully. +Solid Router provides two mechanisms for an action to signal failure: throwing an `Error` or returning a value. + +Throwing an `Error` is a valid way to signal failure. +Solid Router will catch the thrown error and make it available in the `submission.error` property. +However, this approach has some drawbacks. +The `submission.error` property is typed as `any`, which undermines type safety in the consuming component. +It is also difficult to convey structured error information, such as validation messages for multiple form fields, using a simple `Error` instance. + +For these reasons, the recommended practice is to always `return` a descriptive object from an action to represent its outcome. +The returned object is available in the `submission.result` property, which will be fully typed. +This makes handling different outcomes in the UI simple and safe. + +```tsx +import { Show } from "solid-js"; +import { action, useSubmission } from "@solidjs/router"; + +const verifyTwoFactorAction = action(async (formData: FormData) => { + const code = formData.get("code")?.toString(); + + if (!code || code.length !== 6) { + return { + ok: false, + errors: { code: "Enter the 6-digit code from the authenticator app." }, + }; + } + + // ... Verifies the code with the server and handles potential errors. + + return { ok: true }; +}, "verifyTwoFactor"); + +function TwoFactorForm() { + const submission = useSubmission(verifyTwoFactorAction); + + const errors = () => { + const result = submission.result; + if (result && !result.ok) { + return result.errors; + } + }; + + return ( + <form action={verifyTwoFactorAction} method="post"> + <div> + <input name="code" placeholder="6-digit code" inputMode="numeric" /> + <Show when={errors()?.code}> + <p>{errors().code}</p> + </Show> + </div> + + <button type="submit" disabled={submission.pending}> + {submission.pending ? "Verifying..." : "Verify"} + </button> + </form> + ); +} +``` + +In this example, the `errors` derived signal inspects `submission.result` to check for failures. +If an `errors` object is found, its properties are used to conditionally render error messages next to the relevant form fields. + +:::caution[Always return a value] +It is important that an action consistently returns a value from all of its possible code paths. +Because, if an action returns `undefined` or `null`, Solid Router removes that submission from its internal list upon completion. +This can lead to unexpected behavior. + +For example, consider an action that returns an error object on failure but returns nothing on success. +If the action fails once, `useSubmission` will correctly report the error. +However, if a subsequent submission succeeds, it will be removed from the list, and `useSubmission` will continue to report the previous stale error state. +To prevent this, ensure every code path in an action returns a value, such as `{ ok: true }` to indicate a successful outcome. +::: + +## Automatic data revalidation + +After server data changes, the application's can become stale. +To solve this, Solid Router automatically revalidates all [queries](/solid-router/data-fetching/queries) used in the same page after a successful action. +This ensures any component using that data is automatically updated with the freshest information. + +For example, if a page displays a list of registered devices and includes a form to register a new one, the list will automatically update after the form is submitted. + +```tsx +import { For } from "solid-js"; +import { query, action, createAsync } from "@solidjs/router"; + +const getDevicesQuery = query(async () => { + // ... Fetches the list of registered devices. +}, "devices"); + +const registerDeviceAction = action(async (formData: FormData) => { + // ... Registers a new device on the server. +}, "registerDevice"); + +function DevicesPage() { + // This query will automatically revalidate after registerDeviceAction completes. + const devices = createAsync(() => getDevicesQuery()); + + return ( + <div> + <h2>Registered devices</h2> + <For each={devices()}>{(device) => <p>{device.name}</p>}</For> + + <h3>Register new device</h3> + <form action={registerDeviceAction} method="post"> + <input name="name" placeholder="Device name" /> + <button type="submit">Register device</button> + </form> + </div> + ); } ``` -Using `useSubmission` leaves the implementation details of how you trigger `echo` up to you. -When handling user inputs, for example, it is better to use a `form` for a multitude of reasons. +While this automatic behavior is convenient for most cases, more fine-grained control may be needed. +The next section explains how to customize or even disable this behavior for specific actions. -## Using forms to submit data +## Managing navigation and revalidation -When submitting data with actions, it is recommended to use HTML forms. -These forms can be used prior to JavaScript loading, which creates instantly interactive applications. -This also inherently provides accessibility benefits, saving the time of designing a custom UI library that may not have these benefits. +While automatic revalidation is powerful, more control is often needed. +It may be desirable to redirect the user to a different page, prevent revalidation entirely, or revalidate a specific set of queries. +This is where response helpers come in. -When using forms to submit actions, the first argument passed to your action function is an instance of [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData). -To use actions with forms, pass the action to the `action` property of your form. -This creates progressively enhanced forms that work even when JavaScript is disabled. +Response helpers are functions that create special [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) objects. +When an action returns or throws one of these responses, Solid Router intercepts it and performs a specific task. -If you do not return a `Response` from your action, the user will stay on the same page and responses will be re-triggered. -Using a `redirect` can tell the browser to navigate to a new page. +### Redirecting +To navigate the user to a new page after an action completes, the [`redirect` helper](/solid-router/reference/response-helpers/redirect) can be used. +It can also be used to revalidate specific queries upon redirection, which is useful for updating data that is displayed on the new page. ```tsx import { action, redirect } from "@solidjs/router"; +import { useSession } from "vinxi/http"; + +const logoutAction = action(async () => { + "use server"; + const session = await useSession({ + password: process.env.SESSION_SECRET as string, + name: "session", + }); + + if (session.data.sessionId) { + await session.clear(); + await db.session.delete({ id: sessionId }); + } + + throw redirect("/"); +}, "logout"); +``` + +In this example, after a successful login, the `redirect` helper is used to navigate to the dashboard. +It also revalidates the "session" query to ensure the UI reflects the user's authenticated state. + +### Customizing revalidation -const isAdmin = action(async (formData: FormData) => { - await new Promise((resolve, reject) => setTimeout(resolve, 1000)); +To override the default revalidation behavior, the [`reload`](/solid-router/reference/response-helpers/reload) and [`json`](/solid-router/reference/response-helpers/json) helpers can be used. - const username = formData.get("username"); +- `reload` is used when only revalidation needs to be customized. +- `json` is used when revalidation needs to be controlled _and_ data needs to be returned from the action. - if (username === "admin") throw redirect("/admin"); - return new Error("Invalid username"); +Both helpers accept a `revalidate` option, which takes an array of query keys to revalidate. +If an empty array (`[]`) is provided, revalidation is prevented altogether. + +```tsx +import { action, reload, json } from "@solidjs/router"; + +// Example 1: Revalidating a specific query +const savePreferencesAction = action(async () => { + // ... Saves the user preferences. + + // Only revalidate the 'userPreferences' query + throw reload({ revalidate: ["userPreferences"] }); }); -export function MyComponent() { +// Example 2: Disabling revalidation and returning data +const logActivityAction = action(async () => { + // ... Logs the activity to the server. - return ( - <form action={isAdmin} method="post"> - <label for="username">Username:</label> - <input type="text" name="username" /> - <input type="submit" value="submit" /> - </form> - ); -} + // Return without revalidating any queries + return json({ ok: true }, { revalidate: [] }); +}); ``` -**Note:** If you are uploading files make sure you include `enctype="multipart/form-data"` to your `<form>` element. +:::tip[Throwing vs. Returning] +A response helper can be either `return`ed or `throw`n. +In TypeScript, `throw` can be more convenient, as it avoids potential type conflicts with an action's expected return value. +::: + +## Optimistic UI + +Optimistic UI is a pattern where the user interface is updated immediately after a user performs an operation. +This is done without waiting for the server to confirm the operation's success. +This approach makes an application feel faster and more responsive. + +Actions can be combined with local state management to implement optimistic UI. +The `useSubmission` primitive can be used to access the input of an action as it's being submitted. +This input can be used to temporarily update the UI. -## Error handling +```tsx +import { For, Show } from "solid-js"; +import { query, action, createAsync, useSubmission } from "@solidjs/router"; + +const getCartQuery = query(async () => { + // ... Fetches the current shopping cart items. +}, "cart"); + +const addToCartAction = action(async (formData: FormData) => { + // ... Adds a product to the cart. +}, "addToCart"); + +function CartPage() { + const cart = createAsync(() => getCartQuery()); + const submission = useSubmission(addToCartAction); + + const optimisticCart = () => { + const originalItems = cart() ?? []; + if (submission.pending) { + const formData = submission.input[0] as FormData; + const productId = formData.get("productId")?.toString(); + const name = formData.get("name")?.toString(); + if (productId && name) { + // Add the optimistic line item with a temporary identifier. + return [...originalItems, { id: "temp", productId, name, quantity: 1 }]; + } + } + return originalItems; + }; + + return ( + <div> + <h2>Your cart</h2> + <For each={optimisticCart()}>{(item) => <p>{item.name}</p>}</For> + + <h3>Add item</h3> + <form action={addToCartAction} method="post"> + <input name="productId" placeholder="Product ID" /> + <input name="name" placeholder="Product name" /> + <button type="submit" disabled={submission.pending}> + {submission.pending ? "Adding..." : "Add to cart"} + </button> + </form> + </div> + ); +} +``` -Rather than throwing errors, it is recommended to return them from actions. -This helps with the typing of submissions that would be used with `useSubmission`. -This is important when handling progressive enhancement where no JavaScript is present in the client, so that errors can be used declaratively to render the updated page on the server. +In this example, a derived signal `optimisticCart` is created. +When an action is pending, it checks the `submission.input` and adds the new cart item to the list with a temporary ID. +If the action fails, `submission.pending` becomes false, and `optimisticCart` will revert to showing the original list from `cart`. +When the action succeeds, Solid Router automatically revalidates `getCartQuery` and updates the UI with the confirmed cart state. -Additionally, when using server actions, it is good practice to handle errors on the server to sanitize error messages. +:::note +For more advanced patterns, consider using [TanStack Query](https://tanstack.com/query/latest/docs/framework/solid/guides/optimistic-updates). +It provides robust tools for managing server state, including cache-based optimistic updates. +::: diff --git a/src/routes/solid-router/concepts/alternative-routers.mdx b/src/routes/solid-router/concepts/alternative-routers.mdx index 4f86f3751..53ded3fcb 100644 --- a/src/routes/solid-router/concepts/alternative-routers.mdx +++ b/src/routes/solid-router/concepts/alternative-routers.mdx @@ -1,9 +1,24 @@ --- title: Alternative routers +use_cases: >- + single-page apps without server routing, legacy hash-based urls, testing + router logic, client-only navigation +tags: + - hash-mode + - memory-mode + - client-side + - testing + - spa + - routing +version: "1.0" +description: >- + Learn to use hash-based and memory routers in SolidJS for client-side + navigation and testing without server interaction. --- While the default router uses the browser's `location.pathname` to determine the current route, you can use alternative routers to change this behavior. This includes: + - [**Hash mode**](#hash-mode): Uses the hash portion of the URL to determine the current route. - [**Memory mode**](#memory-mode): Keeps the history of the router in memory, useful for testing. @@ -15,10 +30,10 @@ To use hash mode, replace the `<Router />` component in the application with [`< ```jsx del={3, 16} ins={4,17} import { render } from "solid-js/web"; -import { +import { Router HashRouter, - Route + Route } from "@solidjs/router"; const App = (props) => ( @@ -46,10 +61,10 @@ To use memory mode, replace the `<Router />` component in the application with [ ```jsx del={3, 16} ins={4,17} import { render } from "solid-js/web"; -import { +import { Router MemoryRouter, - Route + Route } from "@solidjs/router"; const App = (props) => ( @@ -65,4 +80,4 @@ render( document.getElementById("app") ); -``` \ No newline at end of file +``` diff --git a/src/routes/solid-router/concepts/catch-all.mdx b/src/routes/solid-router/concepts/catch-all.mdx index a08de71c5..c2668856b 100644 --- a/src/routes/solid-router/concepts/catch-all.mdx +++ b/src/routes/solid-router/concepts/catch-all.mdx @@ -1,8 +1,21 @@ --- title: Catch-all routes +use_cases: >- + 404 pages, handling invalid urls, fallback routes, error boundaries, redirect + unknown paths +tags: + - "404" + - error-pages + - fallback + - routing + - wildcards +version: "1.0" +description: >- + Create catch-all routes in SolidJS to handle 404 errors and redirect users + from invalid URLs to proper fallback pages. --- -Catch-all routes are used to match any URL that does not match any other route in the application. +Catch-all routes are used to match any URL that does not match any other route in the application. This is useful for displaying a 404 page or redirecting to a specific route when a user enters an invalid URL. To create a catch-all route, place a route with an asterisk (`*`) as the path at the end of the route list. @@ -16,11 +29,11 @@ import About from "./About"; import NotFound from "./NotFound"; const App = () => ( - <Router> - <Route path="/home" component={Home} /> - <Route path="/about" component={About} /> - <Route path="*404" component={NotFound} /> - </Router> + <Router> + <Route path="/home" component={Home} /> + <Route path="/about" component={About} /> + <Route path="*404" component={NotFound} /> + </Router> ); ``` diff --git a/src/routes/solid-router/concepts/data.json b/src/routes/solid-router/concepts/data.json index 9d91d50dd..8cef16056 100644 --- a/src/routes/solid-router/concepts/data.json +++ b/src/routes/solid-router/concepts/data.json @@ -10,4 +10,4 @@ "alternative-routers.mdx", "actions.mdx" ] -} \ No newline at end of file +} diff --git a/src/routes/solid-router/concepts/dynamic-routes.mdx b/src/routes/solid-router/concepts/dynamic-routes.mdx index aba2b544e..9be0e08de 100644 --- a/src/routes/solid-router/concepts/dynamic-routes.mdx +++ b/src/routes/solid-router/concepts/dynamic-routes.mdx @@ -1,5 +1,18 @@ --- title: Dynamic routes +use_cases: >- + user profiles, product pages, blog posts, id-based content, variable urls, + data-driven pages +tags: + - dynamic + - parameters + - validation + - wildcards + - routing +version: "1.0" +description: >- + Build dynamic routes with parameters in SolidJS for user profiles, products, + and content that changes based on URL values. --- When a path is unknown ahead of time, it can be treated as a flexible parameter that is passed on to the component: diff --git a/src/routes/solid-router/concepts/layouts.mdx b/src/routes/solid-router/concepts/layouts.mdx index bf6dcf534..0ae860298 100644 --- a/src/routes/solid-router/concepts/layouts.mdx +++ b/src/routes/solid-router/concepts/layouts.mdx @@ -1,8 +1,21 @@ --- -title: "Layouts" +title: Layouts +use_cases: >- + consistent headers/footers, shared navigation, admin panels, dashboard + layouts, nested ui structure +tags: + - layouts + - nesting + - ui-structure + - components + - routing +version: "1.0" +description: >- + Create consistent page layouts in SolidJS with shared headers, footers, and + nested structures for better UI organization. --- -To maintain consistency across an application's page you can use layouts. +To maintain consistency across an application's page you can use layouts. Layouts are components that wrap the content of a route and can be used to define a common structure for all pages or specific sections of an application. ## Root-level layouts @@ -17,23 +30,23 @@ import { Router, Route } from "@solidjs/router"; import Home from "./pages/Home"; const Layout = (props) => { - return ( - <> - <header>Header</header> - {props.children} - <footer>Footer</footer> - </> - ); + return ( + <> + <header>Header</header> + {props.children} + <footer>Footer</footer> + </> + ); }; render( - () => ( - <Router root={Layout}> - <Route path="/" component={Home} /> - <Route path="/hello-world" component={() => <div>Hello world!</div>} /> - </Router> - ), - document.getElementById("app") + () => ( + <Router root={Layout}> + <Route path="/" component={Home} /> + <Route path="/hello-world" component={() => <div>Hello world!</div>} /> + </Router> + ), + document.getElementById("app") ); ``` @@ -63,10 +76,10 @@ For `PageWrapper` to be used as a layout, in this case, you can pass it as a com ```jsx <Router> - <Route path="/users" component={PageWrapper}> - <Route path="/" component={Users} /> - <Route path="/:id" component={User} /> - </Route> + <Route path="/users" component={PageWrapper}> + <Route path="/" component={Users} /> + <Route path="/:id" component={User} /> + </Route> </Router> ``` diff --git a/src/routes/solid-router/concepts/navigation.mdx b/src/routes/solid-router/concepts/navigation.mdx index 5f2e9b115..82a21ae3c 100644 --- a/src/routes/solid-router/concepts/navigation.mdx +++ b/src/routes/solid-router/concepts/navigation.mdx @@ -1,110 +1,123 @@ ---- -title: "Navigation" ---- - -When using Solid Router, you can use the standard standard HTML [`<a>` elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a), which triggers [soft navigation](/solid-router/reference/components/a#soft-navigation). -In addition to using this, Solid Router offers other options for navigating between routes: - -- The [`<A>` component](/solid-router/reference/components/a). -- The [`useNavigate` primitive](/solid-router/reference/primitives/use-navigate). -- The [`redirect` function](/solid-router/reference/response-helpers/redirect). - -## `<A>` component - -The `<A>` component extends the native `<a>` element by automatically applying the base URL path and, additionally, supports relative paths. - -```tsx -import { A } from "@solidjs/router"; - -function DashboardPage() { - return ( - <main> - <nav> - <A href="/">Home</A> - </nav> - {/* This is a relative path that, from /dashboard, links to /dashboard/users */} - <A href="users">Users</A> - </main> - ); -} -``` - -See the [`<A>` API reference](/solid-router/reference/components/a) for more information. - -### Styling - -The `<A>` component allows you to style links based on their active state using the `activeClass` and `inactiveClass` props. -When provided, these props apply the corresponding CSS classes to the link. -If omitted, the default classes `active` and `inactive` are used. - -By default, a link is considered active when the current route matches the link's `href` or any of its descendant routes. -For example, a link with `href="/dashboard"` is active when the current route is `/dashboard`, `/dashboard/users`, or `/dashboard/users/1/profile`. - -To match an exact route, the prop `end` can be used. -When `true`, it ensures that the link is only considered active if the `href` exactly matches the current route. -This is useful for root route links (href="/"), which might otherwise match all routes. - -```tsx -import { A } from "@solidjs/router"; - -function Navbar() { - return ( - <nav> - <A href="/" end={true}> - Home - </A> - <A - href="/login" - activeClass="text-blue-900" - inactiveClass="text-blue-500" - > - Login - </A> - </nav> - ); -} -``` - -## `useNavigate` primitive - -The `useNavigate` primitive allows for programmatically navigating to a specified route. - -```tsx -import { useNavigate } from "@solidjs/router"; - -function LoginPage() { - const navigate = useNavigate(); - - return ( - <button - onClick={() => { - // Login logic - navigate("/dashboard", { replace: true }); - }} - > - Login - </button> - ); -} -``` - -This example redirects the user to `/dashboard` after login. -By using `replace: true`, the login page is removed from the browser's history stack and replaced with the `/dashboard` route. -This prevents the user from navigating back to the login page using the back button. - -See the [`useNavigate` API reference](/solid-router/reference/primitives/use-navigate) for more information. - -## `redirect` function - -The `redirect` function returns a [`Response` object](https://developer.mozilla.org/en-US/docs/Web/API/Response), which enables navigation to a specified route within [query](/solid-router/reference/data-apis/query) or [action](/solid-router/reference/data-apis/action). - -```tsx -import { action, redirect } from "@solidjs/router"; - -const logout = action(async () => { - localStorage.remove("token"); - throw redirect("/"); -}); -``` - -See the [`redirect` API reference](/solid-router/reference/response-helpers/redirect) for more information. +--- +title: Navigation +use_cases: >- + page transitions, programmatic routing, user actions, form submissions, + authentication flows, redirects +tags: + - navigation + - links + - redirects + - routing + - programmatic +version: "1.0" +description: >- + Navigate between routes in SolidJS using links, programmatic navigation, and + redirects for seamless user experiences. +--- + +When using Solid Router, you can use the standard standard HTML [`<a>` elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a), which triggers [soft navigation](/solid-router/reference/components/a#soft-navigation). +In addition to using this, Solid Router offers other options for navigating between routes: + +- The [`<A>` component](/solid-router/reference/components/a). +- The [`useNavigate` primitive](/solid-router/reference/primitives/use-navigate). +- The [`redirect` function](/solid-router/reference/response-helpers/redirect). + +## `<A>` component + +The `<A>` component extends the native `<a>` element by automatically applying the base URL path and, additionally, supports relative paths. + +```tsx +import { A } from "@solidjs/router"; + +function DashboardPage() { + return ( + <main> + <nav> + <A href="/">Home</A> + </nav> + {/* This is a relative path that, from /dashboard, links to /dashboard/users */} + <A href="users">Users</A> + </main> + ); +} +``` + +See the [`<A>` API reference](/solid-router/reference/components/a) for more information. + +### Styling + +The `<A>` component allows you to style links based on their active state using the `activeClass` and `inactiveClass` props. +When provided, these props apply the corresponding CSS classes to the link. +If omitted, the default classes `active` and `inactive` are used. + +By default, a link is considered active when the current route matches the link's `href` or any of its descendant routes. +For example, a link with `href="/dashboard"` is active when the current route is `/dashboard`, `/dashboard/users`, or `/dashboard/users/1/profile`. + +To match an exact route, the prop `end` can be used. +When `true`, it ensures that the link is only considered active if the `href` exactly matches the current route. +This is useful for root route links (href="/"), which might otherwise match all routes. + +```tsx +import { A } from "@solidjs/router"; + +function Navbar() { + return ( + <nav> + <A href="/" end={true}> + Home + </A> + <A + href="/login" + activeClass="text-blue-900" + inactiveClass="text-blue-500" + > + Login + </A> + </nav> + ); +} +``` + +## `useNavigate` primitive + +The `useNavigate` primitive allows for programmatically navigating to a specified route. + +```tsx +import { useNavigate } from "@solidjs/router"; + +function LoginPage() { + const navigate = useNavigate(); + + return ( + <button + onClick={() => { + // Login logic + navigate("/dashboard", { replace: true }); + }} + > + Login + </button> + ); +} +``` + +This example redirects the user to `/dashboard` after login. +By using `replace: true`, the login page is removed from the browser's history stack and replaced with the `/dashboard` route. +This prevents the user from navigating back to the login page using the back button. + +See the [`useNavigate` API reference](/solid-router/reference/primitives/use-navigate) for more information. + +## `redirect` function + +The `redirect` function returns a [`Response` object](https://developer.mozilla.org/en-US/docs/Web/API/Response), which enables navigation to a specified route within [query](/solid-router/reference/data-apis/query) or [action](/solid-router/reference/data-apis/action). + +```tsx +import { action, redirect } from "@solidjs/router"; + +const logout = action(async () => { + localStorage.remove("token"); + throw redirect("/"); +}); +``` + +See the [`redirect` API reference](/solid-router/reference/response-helpers/redirect) for more information. diff --git a/src/routes/solid-router/concepts/nesting.mdx b/src/routes/solid-router/concepts/nesting.mdx index 0da70a850..44616c0e4 100644 --- a/src/routes/solid-router/concepts/nesting.mdx +++ b/src/routes/solid-router/concepts/nesting.mdx @@ -1,5 +1,18 @@ --- title: Nesting routes +use_cases: >- + hierarchical pages, parent-child relationships, shared layouts, complex + routing structures, admin sections +tags: + - nesting + - hierarchy + - routing + - layouts + - config +version: "1.0" +description: >- + Build nested route hierarchies in SolidJS for complex applications with + parent-child relationships and shared layouts. --- Nested routes are a way to create a hierarchy of routes in your application. @@ -44,8 +57,8 @@ Another way to achieve the same result is to nest the routes and explicitly defi ```jsx <Route path="/users"> - <Route path="/" component={Users} /> - <Route path="/:id" component={User} /> + <Route path="/" component={Users} /> + <Route path="/:id" component={User} /> </Route> ``` diff --git a/src/routes/solid-router/concepts/path-parameters.mdx b/src/routes/solid-router/concepts/path-parameters.mdx index 4d7ff707e..1b7ef9829 100644 --- a/src/routes/solid-router/concepts/path-parameters.mdx +++ b/src/routes/solid-router/concepts/path-parameters.mdx @@ -1,121 +1,132 @@ ---- -title: "Path parameters" ---- - -Parameters within a route are used to capture dynamic values from the URL. -This is useful for creating routes that are more flexible and can handle different values. - -```jsx -<Route path="/users/:id" component={User} /> - -``` - -In this example, the `:id` parameter will capture any value that comes after `/users/` in the URL. -The colon `:` is used to denote a parameter, and `id` is the name of the parameter. -When a URL matches this route, the `User` component will be rendered. - -:::note[Animations & Transitions] -Routes that share the same path match will be treated as the same route. -If a force re-render is needed, you can wrap your component in a keyed [`Show`](/reference/components/show) component: - -```jsx -<Show when={params.something} keyed> - <MyComponent /> -</Show> - -``` - -::: - -## Accessing parameters - -You can retrieve the values captured by parameters using [`useParams`](/solid-router/reference/primitives/use-params). - -```jsx frame="terminal" title="http://localhost:3000/users/123" -import { useParams } from "@solidjs/router"; - -function User() { - const params = useParams(); - return <div>User ID: {params.id}</div>; {/* Output: User ID: 123 */} -} - -``` - -## Validating parameters - -Each path parameter can be validated using the `MatchFilter` on the `Route` component. -Rather than checking for the presence of a parameter manually, you can use a `MatchFilter` to ensure that the parameter is in the correct format. - -```jsx -import { lazy } from "solid-js"; -import { render } from "solid-js/web"; -import { Router, Route } from "@solidjs/router"; - -const User = import("./pages/User"); - -const filters = { - parent: ["mom", "dad"], // allow enum values - id: /^\d+$/, // only allow numbers - withHtmlExtension: (v: string) => v.length > 5 && v.endsWith(".html"), // we want an `*.html` extension -}; - -render(() => ( - <Router> - <Route - path="/users/:parent/:id/:withHtmlExtension" - component={User} - matchFilters={filters} - /> - </Router> -), document.getElementById("app")); - -``` - -Here, the `matchFilter` prop validates the `parent`, `id`, and `withHtmlExtension` parameters against the specified filters defined in the `filters` object. -If the validation fails, the route will not match and the component will not be rendered. - -In this example, that means: -- `/users/mom/123/contact.html` would match, -- `/users/dad/456/about.html` would match, -- `/users/aunt/123/contact.html` would not match as `:parent` is not 'mom' or 'dad', -- `/users/mom/me/contact.html` would not match as `:id` is not a number, -- `/users/dad/123/contact` would not match as `:withHtmlExtension` is missing .html. - -## Optional parameters - -Parameters can be made optional by adding a `?` after the parameter name. - -```jsx -<Route path="/users/:id?" component={User} /> - -``` - -With this setup, the route would match both `/users` and `/users/123`. -However, it is important to note that the `?` only makes the parameter optional for the last segment of the path. -As a result, paths beyond the optional parameter will _not_ be matched. -For instance, `/users/123/contact` would not match. - -## Wildcard routes - -Wildcard routes can be used to match any number of segments in a path. -To create a wildcard route, use `*` followed by the parameter name. - -```jsx -<Route path="/users/*" component={User} /> - -``` - -Using an asterisk `*` as a parameter will match any number of segments after `/users`. -This includes `/users`, `/users/123`, `/users/123/contact`, and so on. - -If you need to expose the wildcard segments of the path, you can name them: - -```jsx -<Route path="/users/*rest" component={User} /> - -``` - -In this case, `rest` will contain the rest of the path after `/users/`. - -It is important to note that wildcard routes must be located at the **end of the path**. -If you place a wildcard route before the end, such as `/users/*rest/:id`, no routes will be matched. +--- +title: Path parameters +use_cases: >- + dynamic content, user profiles, resource ids, filtering data, validation, + flexible routing +tags: + - parameters + - validation + - dynamic + - wildcards + - routing +version: "1.0" +description: >- + Capture and validate dynamic URL parameters in SolidJS routes for flexible + content display and data-driven pages. +--- + +Parameters within a route are used to capture dynamic values from the URL. +This is useful for creating routes that are more flexible and can handle different values. + +```jsx +<Route path="/users/:id" component={User} /> +``` + +In this example, the `:id` parameter will capture any value that comes after `/users/` in the URL. +The colon `:` is used to denote a parameter, and `id` is the name of the parameter. +When a URL matches this route, the `User` component will be rendered. + +:::note[Animations & Transitions] +Routes that share the same path match will be treated as the same route. +If a force re-render is needed, you can wrap your component in a keyed [`Show`](/reference/components/show) component: + +```jsx +<Show when={params.something} keyed> + <MyComponent /> +</Show> +``` + +::: + +## Accessing parameters + +You can retrieve the values captured by parameters using [`useParams`](/solid-router/reference/primitives/use-params). + +```jsx frame="terminal" title="http://localhost:3000/users/123" +import { useParams } from "@solidjs/router"; + +function User() { + const params = useParams(); + return <div>User ID: {params.id}</div>; + { + /* Output: User ID: 123 */ + } +} +``` + +## Validating parameters + +Each path parameter can be validated using the `MatchFilter` on the `Route` component. +Rather than checking for the presence of a parameter manually, you can use a `MatchFilter` to ensure that the parameter is in the correct format. + +```jsx +import { lazy } from "solid-js"; +import { render } from "solid-js/web"; +import { Router, Route } from "@solidjs/router"; + +const User = import("./pages/User"); + +const filters = { + parent: ["mom", "dad"], // allow enum values + id: /^\d+$/, // only allow numbers + withHtmlExtension: (v: string) => v.length > 5 && v.endsWith(".html"), // we want an `*.html` extension +}; + +render(() => ( + <Router> + <Route + path="/users/:parent/:id/:withHtmlExtension" + component={User} + matchFilters={filters} + /> + </Router> +), document.getElementById("app")); + +``` + +Here, the `matchFilter` prop validates the `parent`, `id`, and `withHtmlExtension` parameters against the specified filters defined in the `filters` object. +If the validation fails, the route will not match and the component will not be rendered. + +In this example, that means: + +- `/users/mom/123/contact.html` would match, +- `/users/dad/456/about.html` would match, +- `/users/aunt/123/contact.html` would not match as `:parent` is not 'mom' or 'dad', +- `/users/mom/me/contact.html` would not match as `:id` is not a number, +- `/users/dad/123/contact` would not match as `:withHtmlExtension` is missing .html. + +## Optional parameters + +Parameters can be made optional by adding a `?` after the parameter name. + +```jsx +<Route path="/users/:id?" component={User} /> +``` + +With this setup, the route would match both `/users` and `/users/123`. +However, it is important to note that the `?` only makes the parameter optional for the last segment of the path. +As a result, paths beyond the optional parameter will _not_ be matched. +For instance, `/users/123/contact` would not match. + +## Wildcard routes + +Wildcard routes can be used to match any number of segments in a path. +To create a wildcard route, use `*` followed by the parameter name. + +```jsx +<Route path="/users/*" component={User} /> +``` + +Using an asterisk `*` as a parameter will match any number of segments after `/users`. +This includes `/users`, `/users/123`, `/users/123/contact`, and so on. + +If you need to expose the wildcard segments of the path, you can name them: + +```jsx +<Route path="/users/*rest" component={User} /> +``` + +In this case, `rest` will contain the rest of the path after `/users/`. + +It is important to note that wildcard routes must be located at the **end of the path**. +If you place a wildcard route before the end, such as `/users/*rest/:id`, no routes will be matched. diff --git a/src/routes/solid-router/concepts/search-parameters.mdx b/src/routes/solid-router/concepts/search-parameters.mdx index 8df4ddd72..98cd76e7d 100644 --- a/src/routes/solid-router/concepts/search-parameters.mdx +++ b/src/routes/solid-router/concepts/search-parameters.mdx @@ -1,69 +1,82 @@ ---- -title: "Search parameters" ---- - -Search parameters are used to pass data to a route using the query string. -The query string is the part of the URL that comes after the `?` character and is used to pass key-value pairs to the route. - -In Solid Router, these query parameters can be accessed using [`useSearchParams`](/solid-router/reference/primitives/use-search-params). -This primitive retrieves a tuple that contains a reactive object that reads the current search parameters and a function to update them. - -```jsx {4} -import { useSearchParams } from "@solidjs/router"; - -export const App = () => { - const [searchParams, setSearchParams] = useSearchParams(); - - return ( - <div> - <span>Username: {searchParams.username}</span> - <input - type="text" - onChange={(e) => { - e.preventDefault(); - setSearchParams({ username: e.target.value }); - }} - /> - </div> - ); -}; -``` - -The getter, in this case `searchParams`, is used to read the current search parameters. -`setSearchParams` works as the setter which accepts an _object_ whose entries will be merged into the current query. - -## Multiple queries - -Since `setSearchParams` accepts an object, you can pass multiple key-value pairs to update multiple search parameters at once. - -```jsx -setSearchParams({ - username: "john", - page: 1, -}); -``` - -:::note[Empty or null values] - If the value of a search parameter's key is `undefined`, `null`, or an empty - string (`""`), it will be removed from the query string. -::: - -## Accessing query strings - -If you require accessing the query string directly, you can use the [`useLocation`](/solid-router/reference/primitives/use-location) primitive: - -```jsx -import { useLocation } from "@solidjs/router"; - -export const App = () => { - const location = useLocation(); - - return ( - <div> - <span>Query String: {location.search}</span> - </div> - ); -}; -``` - -If the URL was `http://localhost:3000/users?username=john&page=1`, the output would be `Query String: ?username=john&page=1`. +--- +title: Search parameters +use_cases: >- + filtering, pagination, search queries, form state in url, shareable urls, + stateful navigation +tags: + - query-params + - search + - state + - url + - routing +version: "1.0" +description: >- + Manage query strings and search parameters in SolidJS for filtering, + pagination, and maintaining state in the URL. +--- + +Search parameters are used to pass data to a route using the query string. +The query string is the part of the URL that comes after the `?` character and is used to pass key-value pairs to the route. + +In Solid Router, these query parameters can be accessed using [`useSearchParams`](/solid-router/reference/primitives/use-search-params). +This primitive retrieves a tuple that contains a reactive object that reads the current search parameters and a function to update them. + +```jsx {4} +import { useSearchParams } from "@solidjs/router"; + +export const App = () => { + const [searchParams, setSearchParams] = useSearchParams(); + + return ( + <div> + <span>Username: {searchParams.username}</span> + <input + type="text" + onChange={(e) => { + e.preventDefault(); + setSearchParams({ username: e.target.value }); + }} + /> + </div> + ); +}; +``` + +The getter, in this case `searchParams`, is used to read the current search parameters. +`setSearchParams` works as the setter which accepts an _object_ whose entries will be merged into the current query. + +## Multiple queries + +Since `setSearchParams` accepts an object, you can pass multiple key-value pairs to update multiple search parameters at once. + +```jsx +setSearchParams({ + username: "john", + page: 1, +}); +``` + +:::note[Empty or null values] +If the value of a search parameter's key is `undefined`, `null`, or an empty +string (`""`), it will be removed from the query string. +::: + +## Accessing query strings + +If you require accessing the query string directly, you can use the [`useLocation`](/solid-router/reference/primitives/use-location) primitive: + +```jsx +import { useLocation } from "@solidjs/router"; + +export const App = () => { + const location = useLocation(); + + return ( + <div> + <span>Query String: {location.search}</span> + </div> + ); +}; +``` + +If the URL was `http://localhost:3000/users?username=john&page=1`, the output would be `Query String: ?username=john&page=1`. diff --git a/src/routes/solid-router/data-fetching/data.json b/src/routes/solid-router/data-fetching/data.json new file mode 100644 index 000000000..e67f9ab6e --- /dev/null +++ b/src/routes/solid-router/data-fetching/data.json @@ -0,0 +1,4 @@ +{ + "title": "Data fetching", + "pages": ["queries.mdx", "streaming.mdx", "revalidation.mdx", "how-to"] +} diff --git a/src/routes/solid-router/data-fetching/how-to/data.json b/src/routes/solid-router/data-fetching/how-to/data.json new file mode 100644 index 000000000..d96966227 --- /dev/null +++ b/src/routes/solid-router/data-fetching/how-to/data.json @@ -0,0 +1,4 @@ +{ + "title": "How to", + "pages": ["preload-data.mdx", "handle-error-and-loading-states.mdx"] +} diff --git a/src/routes/solid-router/data-fetching/how-to/handle-error-and-loading-states.mdx b/src/routes/solid-router/data-fetching/how-to/handle-error-and-loading-states.mdx new file mode 100644 index 000000000..2f559a617 --- /dev/null +++ b/src/routes/solid-router/data-fetching/how-to/handle-error-and-loading-states.mdx @@ -0,0 +1,29 @@ +--- +title: "Handle pending and error states" +--- + +The `createAsync` primitive is designed to work with Solid's native components for managing asynchronous states. +It reports its pending state to the nearest [`<Suspense>` boundary](/reference/components/suspense) to display loading fallbacks, and propagate errors to an [`<ErrorBoundary>`](/reference/components/error-boundary) for handling and displaying error messages. + +```tsx +import { Suspense, ErrorBoundary, For } from "solid-js"; +import { query, createAsync } from "@solidjs/router"; + +const getNewsQuery = query(async () => { + // ... Fetches the latest news from an API. +}, "news"); + +function NewsFeed() { + const news = createAsync(() => getNewsQuery()); + + return ( + <ErrorBoundary fallback={<p>Could not fetch news.</p>}> + <Suspense fallback={<p>Loading news...</p>}> + <ul> + <For each={news()}>{(item) => <li>{item.headline}</li>}</For> + </ul> + </Suspense> + </ErrorBoundary> + ); +} +``` diff --git a/src/routes/solid-router/data-fetching/how-to/preload-data.mdx b/src/routes/solid-router/data-fetching/how-to/preload-data.mdx new file mode 100644 index 000000000..39215abe6 --- /dev/null +++ b/src/routes/solid-router/data-fetching/how-to/preload-data.mdx @@ -0,0 +1,54 @@ +--- +title: "Preload data" +--- + +Preloading data improves perceived performance by fetching the data for an upcoming page before the user navigates to it. + +Solid Router initiates preloading in two scenarios: + +- When a user indicates intent to navigate to the page (e.g., by hovering over a link). +- When the route's component is rendering. + +This ensures data fetching starts as early as possible, often making data ready once the component renders. + +Preloading is configured using the [`preload`](/solid-router/reference/preload-functions/preload) prop on a [`Route`](/solid-router/reference/components/route). +This prop accepts a function that calls one or more queries. +When triggered, the queries execute and their results are stored in a short-lived internal cache. +Once the user navigates and the destination route’s component renders, any `createAsync` calls within the page will consume the preloaded data. +Thanks to the [deduplication mechanism](#deduplication), no redundant network requests are made. + +```tsx {18-20,27} +import { Show } from "solid-js"; +import { Route, query, createAsync } from "@solidjs/router"; + +const getProductQuery = query(async (id: string) => { + // ... Fetches product details for the given ID. +}, "product"); + +function ProductDetails(props) { + const product = createAsync(() => getProductQuery(props.params.id)); + + return ( + <Show when={product()}> + <h1>{product().name}</h1> + </Show> + ); +} + +function preloadProduct({ params }: { params: { id: string } }) { + getProductQuery(params.id); +} + +function Routes() { + return ( + <Route + path="/products/:id" + component={ProductDetails} + preload={preloadProduct} + /> + ); +} +``` + +In this example, hovering a link to `/products/:id` triggers `preloadProduct`. +When the `ProductDetails` component renders, its `createAsync` call will instantly resolve with the preloaded data. diff --git a/src/routes/solid-router/data-fetching/queries.mdx b/src/routes/solid-router/data-fetching/queries.mdx new file mode 100644 index 000000000..0f43335a6 --- /dev/null +++ b/src/routes/solid-router/data-fetching/queries.mdx @@ -0,0 +1,81 @@ +--- +title: "Queries" +--- + +Queries are the core building blocks for data fetching in Solid Router. +They provide an elegant solution for managing data fetching. + +## Defining queries + +They are defined using the [`query` function](/solid-router/reference/data-apis/query). +It wraps the data-fetching logic and extends it with powerful capabilities like [request deduplication](#deduplication) and [automatic revalidation](#revalidation). + +The `query` function takes two parameters: a **fetcher** and a **name**. + +- The **fetcher** is an asynchronous function that fetches data from any source, such as a remote API. +- The **name** is a unique string used to identify the query. + When a query is called, Solid Router uses this name and the arguments passed to the query to create a unique key, which is used for the internal deduplication mechanism. + +```tsx +import { query } from "@solidjs/router"; + +const getUserProfileQuery = query(async (userId: string) => { + const response = await fetch( + `https://api.example.com/users/${encodeURIComponent(userId)}` + ); + const json = await response.json(); + + if (!response.ok) { + throw new Error(json?.message ?? "Failed to load user profile."); + } + + return json; +}, "userProfile"); +``` + +In this example, the defined query fetches a user's profile from an API. +If the request fails, the fetcher will throw an error that will be caught by the nearest [`<ErrorBoundary>`](/reference/components/error-boundary) in the component tree. + +## Using queries in components + +Defining a query does not by itself fetch any data. +To access its data, the query can be used with the [`createAsync` primitive](/solid-router/reference/data-apis/create-async). +`createAsync` takes an asynchronous function, such as a query, and returns a signal that tracks its result. + +```tsx +import { For, Show } from "solid-js"; +import { query, createAsync } from "@solidjs/router"; + +const getArticlesQuery = query(async () => { + // ... Fetches a list of articles from an API. +}, "articles"); + +function Articles() { + const articles = createAsync(() => getArticlesQuery()); + + return ( + <Show when={articles()}> + <For each={articles()}>{(article) => <p>{article.title}</p>}</For> + </Show> + ); +} +``` + +In this example, `createAsync` is used to call the query. +Once the query completes, `articles` holds the result, which is then rendered. + +:::tip +When working with complex data types, such as arrays or deeply nested objects, the [`createAsyncStore` primitive](/solid-router/reference/data-apis/create-async-store) offers a more ergonomic and performant solution. +It works like `createAsync`, but returns a [store](/concepts/stores) for easier state management.. +::: + +## Deduplication + +A key feature of queries is their ability to deduplicate requests, preventing redundant data fetching in quick succession. + +One common use case is preloading: when a user hovers over a link, the application can begin preloading the data for the destination page. +If the user then clicks the link, the query has already been completed, and the data is available instantly without triggering another network request. +This mechanism is fundamental to the performance of Solid Router applications. + +Deduplication also applies when multiple components on the same page use the same query. +As long as at least one component is actively using the query, Solid Router will reuse the cached result instead of refetching the data. diff --git a/src/routes/solid-router/data-fetching/revalidation.mdx b/src/routes/solid-router/data-fetching/revalidation.mdx new file mode 100644 index 000000000..3ee773fdf --- /dev/null +++ b/src/routes/solid-router/data-fetching/revalidation.mdx @@ -0,0 +1,60 @@ +--- +title: "Revalidation" +--- + +Since server data can change, Solid Router provides mechanisms to revalidate queries and keep the UI up to date. + +The most common case is **automatic revalidation**. +After an [action](/solid-router/concepts/actions) completes successfully, Solid Router automatically revalidates all active queries on the page. +For more details, see the [actions documentation](/solid-router/concepts/actions#automatic-data-revalidation). + +For more fine-grained control, you can trigger revalidation manually with the [`revalidate` function](/solid-router/reference/data-apis/revalidate). +It accepts a query key (or an array of keys) to target specific queries. +Each query exposes two properties for this: `key` and `keyFor`. + +- `query.key` is the base key for a query and targets all of its instances. + Using this key will revalidate all data fetched by that query, regardless of the arguments provided. +- `query.keyFor(arguments)` generates a key for a specific set of arguments, allowing you to target and revalidate only that particular query. + +```tsx +import { For } from "solid-js"; +import { query, createAsync, revalidate } from "@solidjs/router"; + +const getProjectsQuery = query(async () => { + // ... Fetches a list of projects. +}, "projects"); + +const getProjectTasksQuery = query(async (projectId: string) => { + // ... Fetches a list of tasks for a project. +}, "projectTasks"); + +function Projects() { + const projects = createAsync(() => getProjectsQuery()); + + function refetchAllTasks() { + revalidate(getProjectTasksQuery.key); + } + + return ( + <div> + <button onClick={refetchAllTasks}>Refetch all tasks</button> + <For each={projects()}>{(project) => <Project id={project.id} />}</For> + </div> + ); +} + +function Project(props: { id: string }) { + const tasks = createAsync(() => getProjectTasksQuery(props.id)); + + function refetchTasks() { + revalidate(getProjectTasksQuery.keyFor(props.id)); + } + + return ( + <div> + <button onClick={refetchTasks}>Refetch tasks for this project</button> + <For each={project.tasks}>{(task) => <div>{task.title}</div>}</For> + </div> + ); +} +``` diff --git a/src/routes/solid-router/data-fetching/streaming.mdx b/src/routes/solid-router/data-fetching/streaming.mdx new file mode 100644 index 000000000..42fa45f41 --- /dev/null +++ b/src/routes/solid-router/data-fetching/streaming.mdx @@ -0,0 +1,90 @@ +--- +title: "Streaming" +--- + +In traditional server-rendered applications, the server must fetch all data before rendering and sending the page to the browser. +If some queries are slow, this delays the initial load. +**Streaming** solves this by sending the page’s HTML shell immediately and progressively streaming data-dependent sections as they become ready. + +When a query is accessed during a server-side render, Solid suspends the UI until the data resolves. +By default, this suspension affects the entire page. + +To control this behavior, you can use suspense boundaries - regions of the component tree defined by a [`<Suspense>` component](/reference/components/suspense). +It isolates asynchronous behavior to a specific section of the page. + +Content inside the boundary is managed by Solid’s concurrency system: if it isn’t ready, the boundary’s fallback UI is shown while the rest of the page renders and streams immediately. +Once the data resolves, the server streams the final HTML for that section, replacing the fallback and letting users see and interact with most of the page much sooner. + +```tsx +import { Suspense, For } from "solid-js"; +import { query, createAsync } from "@solidjs/router"; + +const getAccountStatsQuery = query(async () => { + // ... Fetches account statistics. +}, "accountStats"); + +const getRecentTransactionsQuery = query(async () => { + // ... Fetches a list of recent transactions. +}, "recentTransactions"); + +function Dashboard() { + const stats = createAsync(() => getAccountStatsQuery()); + const transactions = createAsync(() => getRecentTransactionsQuery()); + + return ( + <div> + <h1>Dashboard</h1> + <Suspense fallback={<p>Loading account stats...</p>}> + <For each={stats()}> + {(stat) => ( + <p> + {stat.label}: {stat.value} + </p> + )} + </For> + </Suspense> + + <Suspense fallback={<p>Loading recent transactions...</p>}> + <For each={transactions()}> + {(transaction) => ( + <h2> + {transaction.description} - {transaction.amount} + </h2> + )} + </For> + </Suspense> + </div> + ); +} +``` + +For example, each `<Suspense>` component creates its own independent boundary. +The server can stream the heading `<h1>Dashboard</h1>` immediately, while the `stats` and `transactions` are handled separately. +If the `transactions` query is slow, only its boundary will display a fallback, while `stats` will render as soon as its data is ready. + +## When to disable streaming + +While streaming is powerful, there are cases where it is better to wait for the data to load on the server. +In these situations, you can use the `deferStream` option in `createAsync`. + +When `deferStream` is set to `true`, the server waits for the query to resolve before sending the initial HTML. + +A common reason to disable streaming is for Search Engine Optimization (SEO). +Some search engine crawlers may not wait for streamed content to load. +If critical data, such as a page title or meta description, affects SEO, it should be included in the initial server response. + +```tsx +import { query, createAsync } from "@solidjs/router"; + +const getArticleQuery = query(async () => { + // ... Fetches an article. +}, "article"); + +function ArticleHeader() { + const article = createAsync(() => getArticleQuery(), { + deferStream: true, + }); + + return <h1>{article()?.title}</h1>; +} +``` diff --git a/src/routes/solid-router/data.json b/src/routes/solid-router/data.json index a141ae4d4..e60a784f2 100644 --- a/src/routes/solid-router/data.json +++ b/src/routes/solid-router/data.json @@ -5,6 +5,7 @@ "getting-started", "concepts", "rendering-modes", + "data-fetching", "advanced-concepts", "guides" ] diff --git a/src/routes/solid-router/getting-started/component.mdx b/src/routes/solid-router/getting-started/component.mdx index dd214874c..d26965595 100644 --- a/src/routes/solid-router/getting-started/component.mdx +++ b/src/routes/solid-router/getting-started/component.mdx @@ -1,5 +1,18 @@ --- -title: "Component routing" +title: Component routing +use_cases: >- + defining routes, jsx routing, template-based routing, initial setup, basic + navigation +tags: + - jsx + - components + - routing + - setup + - templates +version: "1.0" +description: >- + Define routes using JSX components in SolidJS Router for intuitive, + template-based routing in your applications. --- In Solid Router, routes can be defined directly in an application's template using JSX. @@ -14,12 +27,12 @@ import { Router, Route } from "@solidjs/router"; import Home from "./routes/Home"; render( - () => ( - <Router> - <Route path="/" component={Home} /> - </Router> - ), - document.getElementById("app") + () => ( + <Router> + <Route path="/" component={Home} /> + </Router> + ), + document.getElementById("app") ); ``` @@ -36,15 +49,15 @@ import Home from "./routes/index.jsx"; import About from "./routes/about.jsx"; render( - () => ( - <Router> - <Route path="/" component={Home} /> - <Route path="/hello-world" component={() => <h1>Hello World!</h1>} /> - <Route path="/about" component={About} /> - </Router> - ), - document.getElementById("app") + () => ( + <Router> + <Route path="/" component={Home} /> + <Route path="/hello-world" component={() => <h1>Hello World!</h1>} /> + <Route path="/about" component={About} /> + </Router> + ), + document.getElementById("app") ); ``` -This example defines three routes: the root path (`/`) which renders the `Home` page, the path `/hello-world` which renders an `h1` element, and the path `/about` which renders the `About` component. \ No newline at end of file +This example defines three routes: the root path (`/`) which renders the `Home` page, the path `/hello-world` which renders an `h1` element, and the path `/about` which renders the `About` component. diff --git a/src/routes/solid-router/getting-started/config.mdx b/src/routes/solid-router/getting-started/config.mdx index f1b00bd85..8b3c66eb0 100644 --- a/src/routes/solid-router/getting-started/config.mdx +++ b/src/routes/solid-router/getting-started/config.mdx @@ -1,5 +1,18 @@ --- -title: "Config-based routing" +title: Config-based routing +use_cases: >- + centralized routing, lazy loading, config-based setup, dynamic imports, + performance optimization +tags: + - config + - lazy-loading + - routing + - performance + - setup +version: "1.0" +description: >- + Configure SolidJS routes with config objects for centralized routing, lazy + loading, and optimized performance. --- Solid Router supports config-based routing, which offers the same capabilities as [component routing](/solid-router/getting-started/component). @@ -13,10 +26,9 @@ import { render } from "solid-js/web"; import { Router } from "@solidjs/router"; const routes = { - path: "/", - component: lazy(() => import("/routes/index.js")), -} - + path: "/", + component: lazy(() => import("/routes/index.js")), +}; render(() => <Router>{routes}</Router>, document.getElementById("app")); ``` @@ -31,20 +43,19 @@ import { render } from "solid-js/web"; import { Router } from "@solidjs/router"; const routes = [ - { - path: "/", - component: lazy(() => import("/routes/index.js")), - }, - { - path: "/hello-world", - component: () => <h1>Hello, World!</h1> - }, - { - path: "/about", - component: lazy(() => import("/routes/about.js")), - } -] - + { + path: "/", + component: lazy(() => import("/routes/index.js")), + }, + { + path: "/hello-world", + component: () => <h1>Hello, World!</h1>, + }, + { + path: "/about", + component: lazy(() => import("/routes/about.js")), + }, +]; render(() => <Router>{routes}</Router>, document.getElementById("app")); ``` @@ -62,20 +73,19 @@ import { render } from "solid-js/web"; import { Router } from "@solidjs/router"; const routes = [ - { - path: "/", - component: lazy(() => import("/routes/index.js")), - }, - { - path: "/hello-world", - component: () => <h1>Hello, World!</h1> - }, - { - path: "/about", - component: lazy(() => import("/routes/about.js")), - } -] - + { + path: "/", + component: lazy(() => import("/routes/index.js")), + }, + { + path: "/hello-world", + component: () => <h1>Hello, World!</h1>, + }, + { + path: "/about", + component: lazy(() => import("/routes/about.js")), + }, +]; render(() => <Router>{routes}</Router>, document.getElementById("app")); ``` diff --git a/src/routes/solid-router/getting-started/installation-and-setup.mdx b/src/routes/solid-router/getting-started/installation-and-setup.mdx index 15ec2e8e9..782cf3dbc 100644 --- a/src/routes/solid-router/getting-started/installation-and-setup.mdx +++ b/src/routes/solid-router/getting-started/installation-and-setup.mdx @@ -1,5 +1,19 @@ --- title: Installation and setup +use_cases: >- + starting new project, initial setup, configuring routing, spa applications, + client-side routing +tags: + - setup + - installation + - configuration + - spa + - routing + - getting-started +version: "1.0" +description: >- + Learn how to install and configure Solid Router for client and server-side + routing in your single-page applications with step-by-step setup guide. --- Solid Router is the universal router for Solid which works for rendering on the client or the server. @@ -31,10 +45,10 @@ import { Router } from "@solidjs/router"; const wrapper = document.getElementById("app"); if (!wrapper) { - throw new Error("Wrapper div not found"); + throw new Error("Wrapper div not found"); } -render(() => <Router />, wrapper) +render(() => <Router />, wrapper); ``` This sets up the router that will match on the url and render the appropriate route. diff --git a/src/routes/solid-router/getting-started/linking-routes.mdx b/src/routes/solid-router/getting-started/linking-routes.mdx index d24c5deba..52ea8428d 100644 --- a/src/routes/solid-router/getting-started/linking-routes.mdx +++ b/src/routes/solid-router/getting-started/linking-routes.mdx @@ -1,5 +1,19 @@ --- title: Linking routes +use_cases: >- + navigation between pages, creating menu bars, active link styling, internal + linking, user navigation +tags: + - navigation + - links + - anchors + - active-states + - menu + - ui +version: "1.0" +description: >- + Create navigation links between routes using anchor tags and the A component + with active state styling and automatic base path handling. --- Once routes have been created within an application, using anchor tags will help users navigate between different views or pages. diff --git a/src/routes/solid-router/guides/migration.mdx b/src/routes/solid-router/guides/migration.mdx index 6ddf20e18..b7d4bec00 100644 --- a/src/routes/solid-router/guides/migration.mdx +++ b/src/routes/solid-router/guides/migration.mdx @@ -1,5 +1,19 @@ --- title: Migration from v0.9.x +use_cases: >- + upgrading from v0.9, breaking changes, api migration, updating legacy code, + version upgrade +tags: + - migration + - upgrade + - breaking-changes + - v0.10 + - api-changes + - legacy +version: "1.0" +description: >- + Migrate your Solid Router application to v0.10 with this comprehensive guide + covering removed APIs, new patterns, and Islands support changes. --- v0.10.0 brings some big changes to support the future of routing including Islands/Partial Hydration hybrid solutions. diff --git a/src/routes/solid-router/index.mdx b/src/routes/solid-router/index.mdx index d75f93c71..17eb790e0 100644 --- a/src/routes/solid-router/index.mdx +++ b/src/routes/solid-router/index.mdx @@ -1,12 +1,28 @@ --- -title: Overview +title: Solid Router Docs +nav_title: Overview +titleTemplate: ":title" +use_cases: >- + understanding routing, learning basics, overview needed, getting started, spa + routing concepts +tags: + - overview + - introduction + - basics + - spa + - routing + - concepts +version: "1.0" +description: >- + Solid Router is the universal routing solution for Solid applications, + enabling client and server-side navigation in single-page applications. --- # Overview :::note[Prerequisites] - The docs are based on latest Solid Router. - To use this version, you need to have Solid v1.8.4 or later installed. +The docs are based on latest Solid Router. +To use this version, you need to have Solid v1.8.4 or later installed. ::: Solid Router is the universal router for Solid which works for rendering on the client or the server. diff --git a/src/routes/solid-router/reference/components/a.mdx b/src/routes/solid-router/reference/components/a.mdx index e09be7df1..8f828b489 100644 --- a/src/routes/solid-router/reference/components/a.mdx +++ b/src/routes/solid-router/reference/components/a.mdx @@ -1,5 +1,19 @@ --- title: A +use_cases: >- + creating navigation links, active link styling, soft navigation, relative + paths, menu items +tags: + - component + - navigation + - links + - active-states + - anchors + - soft-navigation +version: "1.0" +description: >- + The A component provides enhanced anchor tags with automatic base path + support, active states, and soft navigation for better user experience. --- Solid Router exposes the `<A />` component as a wrapper around the [native anchor tag ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a). @@ -16,8 +30,8 @@ The `<A>` tag has an `active` class if its href matches the current location, an By default matching includes locations that are descendants (e.g.: href `/users` matches locations `/users` and `/users/123`). :::tip - Use the boolean `end` prop to prevent matching these. This is particularly - useful for links to the root route `/` which would match everything. +Use the boolean `end` prop to prevent matching these. This is particularly +useful for links to the root route `/` which would match everything. ::: ## Soft Navigation diff --git a/src/routes/solid-router/reference/components/hash-router.mdx b/src/routes/solid-router/reference/components/hash-router.mdx index 168edac88..f7aaf9b5d 100644 --- a/src/routes/solid-router/reference/components/hash-router.mdx +++ b/src/routes/solid-router/reference/components/hash-router.mdx @@ -1,5 +1,19 @@ --- title: HashRouter +use_cases: >- + static file hosting, single html file apps, no server routing, github pages, + static deployment +tags: + - hash-routing + - static-hosting + - client-side + - spa + - deployment + - component +version: "1.0" +description: >- + HashRouter enables client-side routing using URL hash values, perfect for + static file hosting where server-side routing isn't available. --- The `HashRouter` is a top level component that manages the routing of your application. @@ -29,11 +43,11 @@ render( ); ``` -| prop | type | description | -| ------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------- | -| children | `JSX.Element`, `RouteDefinition`, or `RouteDefinition[]` | The route definitions | -| root | Component | Top level layout component | -| base | string | Base url to use for matching routes | -| actionBase | string | Root url for server actions, default: `/_server` | -| preload | boolean | Enables/disables preloads globally, default: `true` | +| prop | type | description | +| ------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| children | `JSX.Element`, `RouteDefinition`, or `RouteDefinition[]` | The route definitions | +| root | Component | Top level layout component | +| base | string | Base url to use for matching routes | +| actionBase | string | Root url for server actions, default: `/_server` | +| preload | boolean | Enables/disables preloads globally, default: `true` | | explicitLinks | boolean | Disables all anchors being intercepted and instead requires [`<A>`](/solid-router/reference/components/a). default: `false` | diff --git a/src/routes/solid-router/reference/components/memory-router.mdx b/src/routes/solid-router/reference/components/memory-router.mdx index f58b84d79..701833a05 100644 --- a/src/routes/solid-router/reference/components/memory-router.mdx +++ b/src/routes/solid-router/reference/components/memory-router.mdx @@ -1,5 +1,19 @@ --- title: MemoryRouter +use_cases: >- + testing routing, controlled navigation, internal history, unit tests, + programmatic routing +tags: + - testing + - memory + - history + - component + - navigation + - programmatic +version: "1.0" +description: >- + MemoryRouter keeps routing history in memory for complete control, ideal for + testing scenarios and programmatic navigation management. --- The `MemoryRouter` can be used to route while keeping the entire routing history within internal memory. @@ -48,8 +62,6 @@ The `MemoryHistory` object contains the following methods, which you can use to - The `back` and `forward` methods mimic the browser's back and forward buttons, respectively, and the `go` method navigates a specific number of steps in the history, either backward or forward. - The `listen` method registers a callback to be called on navigation change. - - ## Properties ### `MemoryHistory` diff --git a/src/routes/solid-router/reference/components/navigate.mdx b/src/routes/solid-router/reference/components/navigate.mdx index 7edd009ea..75151e43c 100644 --- a/src/routes/solid-router/reference/components/navigate.mdx +++ b/src/routes/solid-router/reference/components/navigate.mdx @@ -1,5 +1,18 @@ --- title: Navigate +use_cases: >- + automatic redirects, programmatic navigation, conditional routing, auth + redirects, dynamic routing +tags: + - component + - redirects + - navigation + - programmatic + - dynamic +version: "1.0" +description: >- + Navigate component provides immediate programmatic navigation and redirects, + perfect for authentication flows and conditional routing logic. --- Solid Router provides a `Navigate` component that works similarly to [`<A>`](/solid-router/reference/components/a), but it will _immediately_ navigate to the provided path as soon as the component is rendered. diff --git a/src/routes/solid-router/reference/components/route.mdx b/src/routes/solid-router/reference/components/route.mdx index e1848905f..917056870 100644 --- a/src/routes/solid-router/reference/components/route.mdx +++ b/src/routes/solid-router/reference/components/route.mdx @@ -1,5 +1,19 @@ --- title: Route +use_cases: >- + defining routes, app structure, url mapping, component rendering, nested + routing +tags: + - component + - routes + - structure + - paths + - nested + - configuration +version: "1.0" +description: >- + Route component defines your application's URL structure and maps paths to + components with support for multiple paths and nested routing. --- `Route` is the component used when defining the routes of an application. diff --git a/src/routes/solid-router/reference/components/router.mdx b/src/routes/solid-router/reference/components/router.mdx index 4a85425bf..7400ea5a6 100644 --- a/src/routes/solid-router/reference/components/router.mdx +++ b/src/routes/solid-router/reference/components/router.mdx @@ -1,5 +1,19 @@ --- title: Router +use_cases: >- + app initialization, root setup, layout wrapper, routing context, main + configuration +tags: + - component + - root + - initialization + - layout + - configuration + - context +version: "1.0" +description: >- + Router is the top-level component that manages your app's routing, providing + context and configuration for all child routes and navigation. --- The `Router` component is a top level component that manages the routing of your application. @@ -18,7 +32,7 @@ const App = (props) => ( render( () => <Router root={App}>{/*... routes */}</Router>, - document.getElementById("app") + document.getElementById("root") ); ``` diff --git a/src/routes/solid-router/reference/data-apis/action.mdx b/src/routes/solid-router/reference/data-apis/action.mdx index 8f3a5e666..3c58bebf8 100644 --- a/src/routes/solid-router/reference/data-apis/action.mdx +++ b/src/routes/solid-router/reference/data-apis/action.mdx @@ -1,197 +1,155 @@ --- title: action +use_cases: >- + forms, user input, data mutations, optimistic updates, form submissions, + server actions, post requests +tags: + - actions + - forms + - mutations + - post + - validation + - optimistic-updates + - server +version: "1.0" +description: >- + Learn how to handle form submissions and data mutations in SolidJS with + actions, including optimistic updates and server-side processing. --- -Actions are data mutations that can trigger invalidations and further routing. -A list of prebuilt response helpers can be found below. +The `action` function wraps an asynchronous function and returns an [action](/solid-router/concepts/actions). -```jsx -import { action, revalidate, redirect } from "@solidjs/router" +When an action is triggered, it creates a submission object that tracks its execution status. +This state can be accessed with the [`useSubmission`](/solid-router/reference/data-apis/use-submission) and [`useSubmissions`](/solid-router/reference/data-apis/use-submissions) primitives. -// anywhere -const myAction = action(async (data) => { - await doMutation(data); - throw redirect("/", { revalidate: getUser.keyFor(data.id) }); // throw a response to do a redirect -}); - -// in component -<form action={myAction} method="post" /> +After an action completed successfully, all queries active in the same page are revalidated, unless revalidation is configured using [response helpers](/solid-router/concepts/actions#managing-navigation-and-revalidation). -//or -<button type="submit" formaction={myAction}></button> +## Import +```tsx +import { action } from "@solidjs/router"; ``` -Actions only work with **post** requests. -This means forms require `method="post"`. - -A `with` method can be used when typed data is required. -This removes the need to use `FormData` or other additional hidden fields. -The `with` method works similar to [`bind`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind), which applies the arguments in order. - -Without `with`: - -```jsx -const deleteTodo = action(async (formData: FormData) => { - const id = Number(formData.get("id")) - await api.deleteTodo(id) -}) - -<form action={deleteTodo} method="post"> - <input type="hidden" name="id" value={todo.id} /> - <button type="submit">Delete</button> -</form> - +## Type + +```tsx +function action<T extends Array<any>, U = void>( + fn: (...args: T) => Promise<U>, + name?: string +): Action<T, U>; + +function action<T extends Array<any>, U = void>( + fn: (...args: T) => Promise<U>, + options?: { name?: string; onComplete?: (s: Submission<T, U>) => void } +): Action<T, U>; + +function action<T extends Array<any>, U = void>( + fn: (...args: T) => Promise<U>, + options: + | string + | { name?: string; onComplete?: (s: Submission<T, U>) => void } = {} +): Action<T, U>; ``` -Using `with`: +## Parameters -```jsx del={5,6} ins={7} -const deleteTodo = action(async (id: number) => { - await api.deleteTodo(id) -}) +### `handler` -<form action={deleteTodo} method="post"> - <input type="hidden" name="id" value={todo.id} /> -<form action={deleteTodo.with(todo.id)} method="post"> - <button type="submit">Delete</button> -</form> +- **Type:** `(...args: T) => Promise<U>` +- **Required:** Yes -``` +An asynchronous function that performs the action's logic. +When the action is used with a [`<form>` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/form), the function receives a [`FormData` object](https://developer.mozilla.org/en-US/docs/Web/API/FormData) as its first parameter. -:::tip -In [SolidStart](/solid-start) apps, it's recommended to use the [`"use server"`](/solid-start/reference/server/use-server) directive to leverage server-side caching. -::: +### `options` -## Notes of `<form>` implementation and SSR +- **Type:** `string | { name?: string; onComplete?: (s: Submission<T, U>) => void }` +- **Required**: No -This requires stable references because a string can only be serialized as an attribute, and it is crucial for consistency across SSR. where these references must align. -The solution is to provide a unique name. +A unique string used to identify the action in Server-Side Rendering (SSR) environments. +This is required when using the action with a `<form>` element. -```jsx -const myAction = action(async (args) => {}, "my-action"); -``` +Alternatively, a configuration object can be passed with the following properties. -## `useAction` +#### `name` -Instead of forms, actions can directly be wrapped in a `useAction` primitive. -This is how router context is created. +- **Type:** `string` +- **Required:** No -```jsx -// in component -const submit = useAction(myAction); -submit(...args); +The unique string to identify the action in SSR environments. +Required for `<form>` usage. -``` +#### `onComplete` (optional): -The outside of a form context can use custom data instead of `formData`. -These helpers preserve types. +- **Type:** `(s: Submission<T, U>) => void` +- **Required:** No -However, even when used with server functions, such as with [SolidStart](https://start.solidjs.com/getting-started/what-is-solidstart), this requires client-side JavaScript and is not progressively enhanceable like forms are. +A function that runs after the action completes. +It receives a submission object as its parameter. -## `useSubmission`/`useSubmissions` +## Return value -These functions are used when incorporating optimistic updates during ongoing actions. -They provide either a singular Submission (the latest one), or a collection of Submissions that match, with an optional filtering function. +`action` returns an action with the following properties. -```jsx -type Submission<T, U> = { - input: T; - result: U; - error: any; - pending: boolean - clear: () => {} - retry: () => {} -} +### `with` -const submissions = useSubmissions(action, (input) => filter(input)); -const submission = useSubmission(action, (input) => filter(input)); +A method that wraps the original action and returns a new one. +When this new action is triggered, the arguments passed to `with` are forwarded to the original action. +If this new action is used with a `<form>`, the `FormData` object is passed as the last parameter, after any other forwarded parameters. -``` - -## Revalidate cached functions +## Examples -### Revalidate all (default) -By default all cached functions will be revalidated wether the action does not return or return a "normal" response. +### Form submission -```jsx +```tsx +import { action } from "@solidjs/router"; -const deleteTodo = action(async (formData: FormData) => { - const id = Number(formData.get("id")) - await api.deleteTodo(id) - // ... - return new Response("success", { status: 200 }); -}) -``` - -### Revalidate specific cached keys - -By returning a response with solid-router's `json`, `reload` or `redirect` helpers you can pass a key / keys to the revalidate prop as the second argument of the json response helper. -You can either pass as `string` directly or use the cached functions `key` or `keyFor` props. - -```jsx -import { action, json, reload, redirect } from "@solidjs/router" - -const deleteTodo = action(async (formData: FormData) => { - const id = Number(formData.get("id")) - await api.deleteTodo(id) - return json( - { deleted: id }, - { revalidate: ["getAllTodos", getTodos.key, getTodoByID.keyFor(id)]} - ) - - //or - return reload({ revalidate: ["getAllTodos", getTodos.key, getTodoByID.keyFor(id)]}) - - //or - return redirect("/", { revalidate: ["getAllTodos", getTodos.key, getTodoByID.keyFor(id)]}) - -}) +const addTodoAction = action(async (formData: FormData) => { + // Adds a new todo to the server. +}, "addTodo"); +function TodoForm() { + return ( + <form action={addTodoAction} method="post"> + <input name="name" /> + <button>Add todo</button> + </form> + ); +} ``` -## Prevent revalidation -To opt out of any revalidation you can pass any `string` to revalidate which is not a key of any cached function. - -```jsx -const deleteTodo = action(async (formData: FormData) => { - const id = Number(formData.get("id")) - await api.deleteTodo(id) - // returns a `json` without revalidating the action. - return json(`deleted ${id}`,{ revalidate: "nothing" }) +### Passing additional arguments - // or reload the route without revalidating the request. - return reload({ revalidate: "nothing" }) +```tsx +import { action } from "@solidjs/router"; - // or redirect without revalidating - return redirect("/", { revalidate: "nothing" }) -}) +const addTodoAction = action(async (userId: number, formData: FormData) => { + // ... Adds a new todo for a specific user. +}, "addTodo"); +function TodoForm() { + const userId = 1; + return ( + <form action={addTodoAction.with(userId)} method="post"> + <input name="name" /> + <button>Add todo</button> + </form> + ); +} ``` -### Revalidate without action +### Triggering actions programmatically -Cached functions can also be revalidated by the `revalidate` helper. +```tsx +import { action, useAction } from "@solidjs/router"; -```jsx -revalidate([getTodos.key, getTodoByID.keyFor(id)]) +const markDoneAction = action(async (id: string) => { + // ... Marks a todo as done on the server. +}); -``` +function NotificationItem(props: { id: string }) { + const markDone = useAction(markDoneAction); -This is also great if you want to set your own "refresh" interval e.g. poll data every 30 seconds. - -```jsx -export default function TodoLayout(){ - - const todos = createAsync(() => getTodos()) - - onMount(() => { - //30 second polling - const interval = setInterval(() => revalidate(getTodos.key),1000 * 30) - onCleanup(() => clearInterval(interval)) - }) - - // ... + return <button onClick={() => markDone(props.id)}>Mark as done</button>; } - ``` diff --git a/src/routes/solid-router/reference/data-apis/cache.mdx b/src/routes/solid-router/reference/data-apis/cache.mdx index 6c43c2626..22f98a72a 100644 --- a/src/routes/solid-router/reference/data-apis/cache.mdx +++ b/src/routes/solid-router/reference/data-apis/cache.mdx @@ -1,6 +1,19 @@ --- title: cache isDeprecated: true +use_cases: >- + api calls, data fetching, deduplication, preloading routes, caching responses, + preventing waterfalls +tags: + - cache + - deprecated + - data-fetching + - deduplication + - preload +version: "1.0" +description: >- + Deprecated caching API for deduplicating requests and preloading data. Use + query instead for better performance and invalidation. --- :::caution[Deprecation Warning] diff --git a/src/routes/solid-router/reference/data-apis/create-async-store.mdx b/src/routes/solid-router/reference/data-apis/create-async-store.mdx index a1659422c..0fea473bc 100644 --- a/src/routes/solid-router/reference/data-apis/create-async-store.mdx +++ b/src/routes/solid-router/reference/data-apis/create-async-store.mdx @@ -1,9 +1,142 @@ --- title: createAsyncStore +use_cases: >- + large datasets, reactive stores, model data, fine-grained updates, complex + state +tags: + - async + - stores + - reactive + - data-fetching + - state +version: "1.0" +description: >- + Create deeply reactive stores from async data sources for fine-grained updates + on large datasets and complex model structures. --- -Similar to [createAsync](/solid-router/reference/data-apis/create-async) except it uses a deeply reactive store. Perfect for applying fine-grained changes to large model data that updates. +The `createAsyncStore` primitive manages asynchronous data fetching by tracking the result of a promise-returning function in a [store](/concepts/stores). -```jsx -const todos = createAsyncStore(() => getTodos()); +The main difference from [createAsync](/solid-router/reference/data-apis/create-async) is its use of reconciliation: when new data arrives, it intelligently merges with the existing store, updating only changed fields while preserving unchanged state. + +## Import + +```tsx +import { createAsyncStore } from "@solidjs/router"; +``` + +## Type + +```tsx +function createAsyncStore<T>( + fn: (prev: T) => Promise<T>, + options: { + name?: string; + initialValue: T; + deferStream?: boolean; + reconcile?: ReconcileOptions; + } +): AccessorWithLatest<T>; + +function createAsyncStore<T>( + fn: (prev: T | undefined) => Promise<T>, + options?: { + name?: string; + initialValue?: T; + deferStream?: boolean; + reconcile?: ReconcileOptions; + } +): AccessorWithLatest<T | undefined>; +``` + +## Parameters + +### `fetcher` + +- **Type:** `(prev: T | undefined) => Promise<T>` +- **Required:** Yes + +An asynchronous function or a function that returns a `Promise`. +The resolved value of this `Promise` is what `createAsyncStore` tracks. +This function is reactive and will automatically re-execute if any of its dependencies change. + +### `options` + +- **Type:** `{ name?: string; initialValue?: T; deferStream?: boolean; reconcile?: ReconcileOptions; }` +- **Required:** No + +An object for configuring the primitive. +It has the following properties. + +#### `name` + +- **Type:** `string` +- **Required:** No + +A name for the resource, used for identification in debugging tools like [Solid Debugger](https://github.com/thetarnav/solid-devtools). + +#### `initialValue` + +- **Type:** `T` +- **Required:** No + +The initial value of the returned store before the fetcher resolves. + +#### `deferStream` + +- **Type:** `boolean` +- **Required:** No + +If `true`, [streaming](/solid-router/data-fetching/streaming) will be deferred until the resource has resolved. + +#### `reconcile` + +- **Type:** `ReconcileOptions` +- **Required:** No + +[Options](/reference/store-utilities/reconcile#options) passed directly to the `reconcile` function. +It controls how new data is merged with the existing store. + +## Return value + +`createAsyncStore` returns a derived signal that contains the resolved value of the fetcher as a store. + +While the fetcher is executing for the first time, unless an `initialValue` is specified, the store's value is `undefined`. + +## Examples + +### Basic usage + +```tsx +import { For, createSignal } from "solid-js"; +import { createAsyncStore, query } from "@solidjs/router"; + +const getNotificationsQuery = query(async (unreadOnly: boolean) => { + // ... Fetches the list of notifications from the server. +}, "notifications"); + +function Notifications() { + const [unreadOnly, setUnreadOnly] = createSignal(false); + const notifications = createAsyncStore(() => + getNotificationsQuery(unreadOnly()) + ); + + return ( + <div> + <button onClick={() => setUnreadOnly(!unreadOnly())}> + Toggle unread + </button> + <ul> + <For each={notifications()}> + {(notification) => ( + <li> + <div>{notification.message}</div> + <div>{notification.user.name}</div> + </li> + )} + </For> + </ul> + </div> + ); +} ``` diff --git a/src/routes/solid-router/reference/data-apis/create-async.mdx b/src/routes/solid-router/reference/data-apis/create-async.mdx index c8b7b833d..11d1f6b80 100644 --- a/src/routes/solid-router/reference/data-apis/create-async.mdx +++ b/src/routes/solid-router/reference/data-apis/create-async.mdx @@ -1,43 +1,174 @@ --- title: createAsync +use_cases: >- + data fetching, async operations, suspense boundaries, loading states, api + calls, ssr data +tags: + - async + - suspense + - data-fetching + - loading + - promises + - ssr +version: "1.0" +description: >- + Transform promises into reactive signals with createAsync. Handle async data + with Suspense and automatic loading states. --- -An asynchronous primitive with a function that tracks similar to `createMemo`. -`createAsync` expects a promise back that is then turned into a Signal. -Reading it before it is ready causes Suspense/Transitions to trigger. +The `createAsync` primitive manages asynchronous data fetching by tracking the result of a promise-returning function. -:::caution - Using `query` in `createResource` directly will not work since the fetcher is - not reactive. This means that it will not invalidate properly. +:::note +`createAsync` is currently a thin wrapper over `createResource`. +While `createResource` offers similar functionality, **`createAsync` is the recommended primitive for most asynchronous data fetching**. +It is intended to be the standard async primitive in a future Solid 2.0 release. ::: -This is light wrapper over [`createResource`](/reference/basic-reactivity/create-resource) which serves as a stand-in for a future primitive being brought to Solid core in 2.0. -It is recommended that `createAsync` be used in favor of `createResource` specially when in a **SolidStart** app because `createAsync` works better in conjunction with the [cache](/solid-router/reference/data-apis/cache) helper. +## Import +```tsx +import { createAsync } from "@solidjs/router"; +``` +## Type -```tsx title="component.tsx" {6,10} -import { createAsync } from "@solidjs/router"; -import { Suspense } from "solid-js"; -import { getUser } from "./api"; +```tsx +function createAsync<T>( + fn: (prev: T) => Promise<T>, + options: { + name?: string; + initialValue: T; + deferStream?: boolean; + } +): AccessorWithLatest<T>; + +function createAsync<T>( + fn: (prev: T | undefined) => Promise<T>, + options?: { + name?: string; + initialValue?: T; + deferStream?: boolean; + } +): AccessorWithLatest<T | undefined>; +``` + +## Parameters + +### `fetcher` + +- **Type:** `(prev: T | undefined) => Promise<T>` +- **Required:** Yes + +An asynchronous function or a function that returns a `Promise`. +The resolved value of this `Promise` is what `createAsync` tracks. +This function is reactive and will automatically re-execute if any of its dependencies change. + +### `options` + +- **Type:** `{ name?: string; initialValue?: T; deferStream?: boolean; }` +- **Required:** No + +An object for configuring the primitive. +It has the following properties: + +#### `name` + +- **Type:** `string` +- **Required:** No + +A name for the resource, used for identification in debugging tools like [Solid Debugger](https://github.com/thetarnav/solid-devtools). + +#### `initialValue` + +- **Type:** `T` +- **Required:** No + +The initial value of the returned signal before the fetcher finishes executing. + +#### `deferStream` + +- **Type:** `boolean` +- **Required:** No + +If `true`, [streaming](/solid-router/data-fetching/streaming) will be deferred until the fetcher finishes executing. + +## Return value + +`createAsync` returns a derived signal that contains the resolved value of the fetcher. + +While the fetcher is executing for the first time, unless an `initialValue` is specified, the signal's value is `undefined`. + +## Examples + +### Basic usage + +```tsx +import { createAsync, query } from "@solidjs/router"; + +const getCurrentUser = query(async () => { + // ... Fetches the current authenticated user from the server. +}, "currentUser"); + +function UserProfile() { + const user = createAsync(() => getCurrentUser()); + + return <div>{user()?.name}</div>; +} +``` + +### With parameter + +```tsx +import { createAsync, query } from "@solidjs/router"; + +const getInvoiceQuery = query(async (invoiceId: string) => { + // ... Fetches the invoice details from the server. +}, "invoice"); + +function InvoiceDetails(props: { invoiceId: string }) { + const invoice = createAsync(() => getInvoiceQuery(props.invoiceId)); + + return ( + <div> + <h2>Invoice #{invoice()?.number}</h2> + <p>Total: ${invoice()?.total}</p> + </div> + ); +} +``` + +### With error handling and pending state + +```tsx +import { createAsync, query } from "@solidjs/router"; +import { Suspense, ErrorBoundary, For } from "solid-js"; + +const getAllRecipesQuery = query(async () => { + // ... Fetches the recipes from the server and throws an error if an issue occurred. +}, "recipes"); -export function Component () => { - const user = createAsync(() => getUser(params.id)); +function Recipes() { + const recipes = createAsync(() => getAllRecipesQuery()); return ( - <Suspense fallback="loading user..."> - <p>{user()}</p> - </Suspense> + <ErrorBoundary fallback={<p>Couldn't fetch any recipes!</p>}> + <Suspense fallback={<p>Fetching recipes...</p>}> + <For each={recipes()}> + {(recipe) => ( + <div> + <h3>{recipe.name}</h3> + <p>Cook time: {recipe.time}</p> + </div> + )} + </For> + </Suspense> + </ErrorBoundary> ); +} ``` -## Options +## Related -| Name | Type | Default | Description | -| ------------ | ----------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| name | `string` | `undefined` | A name for the resource. This is used for debugging purposes. | -| deferStream | `boolean` | `false` | If true, Solid will wait for the resource to resolve before flushing the stream. | -| initialValue | `any` | `undefined` | The initial value of the resource. | -| onHydrated | `function` | `undefined` | A callback that is called when the resource is hydrated. | -| ssrLoadFrom | `"server" \| "initial"` | `"server"` | The source of the initial value for SSR. If set to `"initial"`, the resource will use the `initialValue` option instead of the value returned by the fetcher. | -| storage | `function` | `createSignal` | A function that returns a signal. This can be used to create a custom storage for the resource. This is still experimental +- [`query`](/solid-router/reference/data-apis/query) +- [`<Suspense>`](/reference/components/suspense) +- [`<ErrorBoundary>`](/reference/components/error-boundary) diff --git a/src/routes/solid-router/reference/data-apis/query.mdx b/src/routes/solid-router/reference/data-apis/query.mdx index eab7749ba..f4854f7f1 100644 --- a/src/routes/solid-router/reference/data-apis/query.mdx +++ b/src/routes/solid-router/reference/data-apis/query.mdx @@ -1,119 +1,103 @@ --- title: query +use_cases: >- + api calls, data fetching, caching, deduplication, preloading routes, + preventing waterfalls, ssr +tags: + - query + - cache + - data-fetching + - deduplication + - preload + - ssr + - api +version: "1.0" +description: >- + Cache and deduplicate API calls with query. Prevent waterfalls, enable + preloading, and manage server-side rendering efficiently. --- -`query` is a [higher-order function](https://en.wikipedia.org/wiki/Higher-order_function) designed to create a new function with the same signature as the function passed to it. -When this newly created function is called for the first time with a specific set of arguments, the original function is run, and its return value is stored in a cache and returned to the caller of the created function. -The next time the created function is called with the same arguments (as long as the cache is still valid), it will return the cached value instead of re-executing the original function. +The `query` function wraps an asynchronous function (the fetcher) and returns a query. -:::note -`query` can be defined anywhere and then used inside your components with [`createAsync`](/solid-router/reference/data-apis/create-async). +The primary purpose of a query is to prevent redundant data fetching. +When a query is called, a key is generated from its name and arguments. +This key is used to internally cache the result of the fetcher. +If a query with the same key is called, the cached result is used in these scenarios: -However, using `query` directly in [`createResource`](/reference/basic-reactivity/create-resource) will not work since the fetcher is not reactive and will not invalidate properly. +- **For preloading:** + After a route's data is preloaded, a subsequent call to the same query within a 5-second window uses the preloaded data. +- **For active subscriptions:** + When a query is actively being used by a component (e.g., via [`createAsync`](/solid-router/reference/data-apis/create-async)), its data is reused without expiration. +- **On native history navigation:** + When navigating with the browser's back or forward buttons, the data is reused instead of being re-fetched. +- **For server-side deduplication:** + Within a single server-side rendering (SSR) request, repeated calls to the same query reuse the same value. +- **During client hydration:** + If SSR has provided data for a key, that data is used immediately on the client without a new network request. -::: +## Import -## Usage - -```js -const getUser = query( - (id, options = {}) => - fetch(`/api/users/${id}?summary=${options.summary || false}`).then((r) => - r.json() - ), - "usersById" -); - -getUser(123); // Causes a GET request to /api/users/123?summary=false -getUser(123); // Does not cause a GET request -getUser(123, { summary: true }); // Causes a GET request to /api/users/123?summary=true -setTimeout(() => getUser(123, { summary: true }), 999000); // Eventually causes another GET request to /api/users/123?summary=true +```tsx +import { query } from "@solidjs/router"; ``` -### With preload functions - -Using it with a [preload function](/solid-router/reference/preload-functions/preload): - -```js -import { lazy } from "solid-js"; -import { Route } from "@solidjs/router"; -import { getUser } from ... // the cache function - -const User = lazy(() => import("./pages/users/[id].js")); - -// preload function -function preloadUser({params, location}) { - void getUser(params.id) -} +## Type -// Pass it in the route definition -<Route path="/users/:id" component={User} preload={preloadUser} />; +```tsx +function query<T extends (...args: any) => any>( + fn: T, + name: string +): CachedFunction<T>; ``` -### Inside a route's component +## Parameters -Using it inside a route's component: +### `fetcher` -```jsx -// pages/users/[id].js -import { getUser } from ... // the cache function +- **Type:** `T extends (...args: any) => any` +- **Required:** Yes -export default function User(props) { - const user = createAsync(() => getUser(props.params.id)); - return <h1>{user().name}</h1>; -} -``` - -## Query Function Capabilities - -`query` accomplishes the following: +An asynchronous function that handles the logic for fetching data. +All arguments passed to this function must be JSON-serializable. -1. Deduping on the server for the lifetime of the request. -2. It fills a preload cache in the browser - this lasts 5 seconds. - When a route is preloaded on hover or when preload is called when entering a route it will make sure to dedupe calls. -3. A reactive refetch mechanism based on key. - This prevents routes that are not new from retriggering on action revalidation. -4. Serve as a back/forward cache for browser navigation for up to 5 minutes. - Any user based navigation or link click bypasses this cache. - Revalidation or new fetch updates the cache. +### `name` -## Query Keys +- **Type:** `string` +- **Required:** Yes -To ensure that the query keys are consistent and unique, arguments are deterministically serialized using `JSON.stringify`. -Before serialization, key/value pairs in objects are sorted so that the order of properties does not affect the serialization. -For instance, both `{ name: 'Ryan', awesome: true }` and `{ awesome: true, name: 'Ryan' }` will serialize to the same string so that they produce the same query key. +A string used as a namespace for the query. +Solid Router combines this with the query's arguments to generate a unique key for deduplication. ## Return value -The return value is a `CachedFunction`, a function that has the same signature as the function you passed to `query`. -This cached function stores the return value using the query key. -Under most circumstances, this temporarily prevents the passed function from running with the same arguments, even if the created function is called repeatedly. +`query` returns a new function with the same call signature as the fetcher. +This returned function has the following properties attached to it: -## Arguments +### `key` -| argument | type | description | -| -------- | ----------------------- | ------------------------------------------------------------------------- | -| `fn` | `(...args: any) => any` | A function whose return value you'd like to be cached. | -| `name`\* | string | Any arbitrary string that you'd like to use as the rest of the query key. | +The base key for the query, derived from its name. -\*Since the internal cache is shared by all the functions using `query`, the string should be unique for each function passed to `query`. -If the same key is used with multiple functions, one function might return the cached result of the other. +### `keyFor` -## Methods +A function that takes the same arguments as the fetcher and returns a string representing a specific key for that set of arguments. -### `.key` and `.keyFor` +## Example -Query functions provide `.key` and `.keyFor`, are useful when retrieving the keys used in cases involving invalidation: +### Basic usage -```ts -let id = 5; -getUser.key; // returns "users" -getUser.keyFor(id); // returns "users[5]" -``` +```tsx +import { query } from "@solidjs/router"; + +const getUserProfileQuery = query(async (userId: string) => { + const response = await fetch( + `https://api.example.com/users/${encodeURIComponent(userId)}` + ); + const json = await response.json(); -### `revalidate` + if (!response.ok) { + throw new Error(json?.message ?? "Failed to load user profile."); + } -The `query` can be revalidated using the `revalidate` method or the `revalidate` keys that are set on the response from the actions. -If the entire key is passed, it will invalidate all entries for the cache (ie. `users` in the example above). -If only a single entry needs to be invalidated, `keyFor` is provided. -To revalidate everything in the cache, pass `undefined` as the key. + return json; +}, "userProfile"); +``` diff --git a/src/routes/solid-router/reference/data-apis/revalidate.mdx b/src/routes/solid-router/reference/data-apis/revalidate.mdx index 0319ba41d..e455657e7 100644 --- a/src/routes/solid-router/reference/data-apis/revalidate.mdx +++ b/src/routes/solid-router/reference/data-apis/revalidate.mdx @@ -1,43 +1,109 @@ --- title: revalidate +use_cases: >- + refresh data, invalidate cache, polling, real-time updates, manual refetch, + stale data +tags: + - revalidate + - cache + - refresh + - invalidation + - polling + - refetch +version: "1.0" +description: >- + Manually revalidate cached queries to refresh stale data, implement polling, + or trigger updates after mutations in SolidJS. --- -The `revalidate` function is used to revalidate queries associated with specified [query keys](/solid-router/reference/data-apis/query#query-keys). -When a [query](/solid-router/reference/data-apis/query) is revalidated, it is executed again, and any references to the associated query data are updated accordingly. +The `revalidate` function triggers revalidation of [queries](/solid-router/data-fetching/queries) by their keys. +Each query with active subscribers re-executes and updates its dependents; queries without subscribers are marked stale but don't execute until subscribed. + +## Import + +```tsx +import { revalidate } from "@solidjs/router"; +``` + +## Type + +```tsx +function revalidate( + key?: string | string[] | void, + force?: boolean +): Promise<void>; +``` + +## Parameters + +### `key` + +- **Type:** `string | string[] | void` +- **Required:** No + +The query key or array of query keys to revalidate. +If not provided, all queries on the current page are revalidated. + +### `force` + +- **Type:** `boolean` +- **Required:** No +- **Default:** `true` + +When `true`, clears the internal cache used for deduplication. +When `false`, allows cached data to be reused if available. + +## Return value + +`revalidate` returns a `Promise` that resolves when the revalidation transition completes. + +## Examples + +### Basic usage ```tsx -import { For } from "solid-js"; import { query, createAsync, revalidate } from "@solidjs/router"; -const getPosts = query(async () => { - return await fetch("https://api.com/posts").then((response) => - response.json() - ); -}, "posts"); +const getUserQuery = query(async () => { + // ... Fetches user data. + return { name: "John" }; +}, "user"); -function Posts() { - const posts = createAsync(() => getPosts()); +function UserProfile() { + const user = createAsync(() => getUserQuery()); - function refetchPosts() { - revalidate(getPosts.key); + function refreshUser() { + revalidate(getUserQuery.key); } return ( <div> - <button onClick={refetchPosts}>Refetch posts</button> - <ul> - <For each={posts()}>{(post) => <li>{post.title}</li>}</For> - </ul> + <button onClick={refreshUser}>Refresh</button> + <p>{user()?.name}</p> </div> ); } ``` -## Parameters +### Revalidating multiple queries + +```tsx +import { query, revalidate } from "@solidjs/router"; + +const getUsersQuery = query(async () => { + // ... Fetches users. +}, "users"); + +const getPostsQuery = query(async () => { + // ... Fetches posts. +}, "posts"); + +function refreshAll() { + revalidate([getUsersQuery.key, getPostsQuery.key]); +} +``` + +## Related -- `key`: The query key or an array of query keys to be revalidated. -- `force` (optional): A boolean that indicates whether to delete the existing cached value of the queries. - Note that this cache is solely for de-duplication purposes. - Therefore, deleting the cache only affects de-duplication. - For more information on how `query` works, refer to [the `query` documentation](/solid-router/reference/data-apis/query). - The default value is `true`. +- [`query`](/solid-router/reference/data-apis/query) +- [`createAsync`](/solid-router/reference/data-apis/create-async) diff --git a/src/routes/solid-router/reference/data-apis/use-action.mdx b/src/routes/solid-router/reference/data-apis/use-action.mdx index 91d8a5e80..68cd27232 100644 --- a/src/routes/solid-router/reference/data-apis/use-action.mdx +++ b/src/routes/solid-router/reference/data-apis/use-action.mdx @@ -1,27 +1,64 @@ --- title: useAction +use_cases: >- + programmatic forms, client-side mutations, imperative actions, non-form + submissions +tags: + - actions + - mutations + - client + - imperative + - programmatic +version: "1.0" +description: >- + Invoke actions programmatically without forms using useAction. Perfect for + client-side mutations and imperative updates. --- -`useAction` allows an [`action`](/solid-router/reference/data-apis/action) to be invoked programmatically. +The `useAction` primitive returns a function that triggers an [action](/solid-router/concepts/actions) when called. + +`useAction` requires client-side JavaScript and is not progressively enhanceable. + +## Import ```tsx import { useAction } from "@solidjs/router"; -import { updateNameAction } from "./actions"; +``` -const updateName = useAction(updateNameAction); +## Type -const result = updateName("John Wick"); +```tsx +function useAction<T extends Array<any>, U, V>( + action: Action<T, U, V> +): (...args: Parameters<Action<T, U, V>>) => Promise<NarrowResponse<U>>; ``` -:::note -`useAction` requires client-side JavaScript and is not progressively enhanceable. -::: - ## Parameters -- `action`: The action to be invoked. +### `action` + +- **Type:** `Action<T, U, V>` +- **Required:** Yes -## Returns +The action to be triggered. -`useAction` returns a function that invokes the action. -It shares the same signature as the action itself. +## Return value + +`useAction` returns a function that triggers the action. +It takes the same parameters as the action handler and returns a [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) that resolves with the action's result. + +## Example + +```tsx +import { action, useAction } from "@solidjs/router"; + +const likePostAction = action(async (id: string) => { + // ... Likes a post on the server. +}); + +function LikeButton(props: { postId: string }) { + const likePost = useAction(likePostAction); + + return <button onClick={() => likePost(props.postId)}>Like</button>; +} +``` diff --git a/src/routes/solid-router/reference/data-apis/use-submission.mdx b/src/routes/solid-router/reference/data-apis/use-submission.mdx index 7153e664c..ff9bfec65 100644 --- a/src/routes/solid-router/reference/data-apis/use-submission.mdx +++ b/src/routes/solid-router/reference/data-apis/use-submission.mdx @@ -1,161 +1,142 @@ --- title: useSubmission +use_cases: >- + form feedback, pending states, optimistic updates, error handling, single + submission tracking +tags: + - forms + - submissions + - pending + - optimistic + - errors + - feedback +version: "1.0" +description: >- + Track form submission states with useSubmission. Handle pending feedback, + optimistic updates, and errors for single forms. --- -This helper is used to handle form submissions and can provide optimistic updates while actions are in flight as well as pending state feedback. -This method will return a single (latest) value while its sibling, [`useSubmissions`](/solid-router/reference/data-apis/use-submissions), will return all values submitted while the component is active. With an optional second parameter for a filter function. +The `useSubmission` primitive returns the state of the _most recent_ submission for a given [action](/solid-router/concepts/actions). -It's important to note that `useSubmission` requires the form method to be **post** otherwise it will trigger a browser navigation and will not work. +## Import -```tsx title="component.tsx" {4,8} +```tsx import { useSubmission } from "@solidjs/router"; +``` -function Component() { - const submission = useSubmission(postNameAction); - - return ( - <form action={postNameAction} method="post"> - <input type="text" name="name" /> - <button type="submit"> - {submission.pending ? "Adding..." : "Add"} - </button> - </form> - ) -} +## Type + +```tsx +function useSubmission<T extends Array<any>, U, V>( + fn: Action<T, U, V>, + filter?: (input: V) => boolean +): Submission<T, NarrowResponse<U>> | SubmissionStub; ``` -:::note -Learn more about actions in the [`action`](/solid-router/reference/data-apis/action) docs. -::: +## Parameters -## Filtering Submissions +### `action` -As an optional second parameter, the `useSubmission` helper can receive a filter function to only return the submission that matches the condition. -The filter receives the submitted dated as a parameter and should return a boolean value. -E.g.: action below will only submit if the name is "solid". +- **Type:** `Action<T, U, V>` +- **Required:** Yes -```tsx title="component.tsx" {4-8} -import { useSubmission } from "@solidjs/router"; +The action to track. -function Component() { - const submission = useSubmission(postNameAction, ([formData]) => { - const name = formData.get("name") ?? ""; - - return name === "solid"; - }); - - return ( - <form action={postNameAction} method="post"> - <input type="text" name="name" /> - <button type="submit"> - {submission.pending ? "Adding..." : "Add"} - </button> - </form> - ) -} -``` +### `filter` -## Optimistic Updates +- **Type:** `(input: V) => boolean` +- **Required:** No -When the form is submitted, the `submission` object will be updated with the new value and the `pending` property will be set to `true`. -This allows you to provide feedback to the user that the action is in progress. -Once the action is complete, the `pending` property will be set to `false` and the `result` property will be updated with final value. +A function that filters submissions. +It is executed for each submission in the order of creation. +It receives an array of the action's inputs as a parameter and must return `true` to select the submission or `false` otherwise. +The first submission that passes the filter is returned by `useSubmission`. -```tsx tab title="TypeScript" {6,10-12} -// component.tsx -import { Show } from "solid-js"; -import { useSubmission } from "@solidjs/router"; +## Return value -function Component() { - const submission = useSubmission(postNameAction); - - return ( - <> - <Show when={submission.input?.[0].get("name")}> - {(name) => <div>Optimistic: {name() as string}</div>} - </Show> - - <Show when={submission.result?.name}> - {(name) => <div>Result: {name()}</div>} - </Show> - - <form method="post" action={sendData}> - <input type="text" name="name" required /> - <button type="submit" disabled={submission.pending}> - {submission.pending ? "Submitting" : "Submit"} - </button> - </form> - </> - ) -} -``` +`useSubmission` returns a reactive object with the following properties: -```tsx tab title="JavaScript" {6,10-12} -// component.jsx -import { Show } from "solid-js"; -import { useSubmission } from "@solidjs/router"; +### `input` -function Component() { - const submission = useSubmission(postNameAction); - - return ( - <> - <Show when={submission.input?.[0].get("name")}> - {(name) => <div>Optimistic: {name()}</div>} - </Show> - - <Show when={submission.result?.name}> - {(name) => <div>Result: {name()}</div>} - </Show> - - <form method="post" action={sendData}> - <input type="text" name="name" required /> - <button type="submit" disabled={submission.pending}> - {submission.pending ? "Submitting" : "Submit"} - </button> - </form> - </> - ) -} -``` +A reactive value representing the input data of the action. + +### `result` -## Error Handling +A reactive value representing the successful return value of the action. -If the action fails, the `submission` object will be updated with the error and the `pending` property will be set to `false`. -This allows you to provide feedback to the user that the action has failed. Additionally, the return type of `useSubmission` will have a new key `error` that will contain the error object thrown by the submission handler. +### `error` -At this stage, you can also use the `retry()` method to attempt the action again or the `clear()` to wipe the filled data in the platform. +A reactive value representing any error thrown by the action. -```tsx title="component.tsx" {12-18} +### `pending` + +A reactive boolean indicating if the action is currently running. + +### `clear` + +A function to clear the submission's state. + +### `retry` + +A function to re-execute the submission with the same input. + +## Examples + +### Basic usage + +```tsx import { Show } from "solid-js"; +import { action, useSubmission } from "@solidjs/router"; + +const addTodoAction = action(async (formData: FormData) => { + const name = formData.get("name")?.toString(); + + if (!name || name.length <= 2) { + return { ok: false, message: "Name must be larger than 2 characters." }; + } + + // ... Sends the todo data to the server. + + return { ok: true }; +}, "addTodo"); + +function AddTodoForm() { + const submission = useSubmission(addTodoAction); + + return ( + <form action={addTodoAction} method="post"> + <input name="name" /> + <button type="submit">{submission.pending ? "Adding..." : "Add"}</button> + <Show when={!submission.result?.ok}> + <div> + <p>{submission.result.message}</p> + <button onClick={() => submission.clear()}>Clear</button> + <button onClick={() => submission.retry()}>Retry</button> + </div> + </Show> + </form> + ); +} +``` + +### Filtering submissions + +```tsx import { useSubmission } from "@solidjs/router"; -function Component() { - const submission = useSubmission(postNameAction); - - return ( - <> - <Show when={submission.error}> - {(error) => ( - <div> - <p>Error: {error.message}</p> - <button onClick={() => submission.clear()}> - Clear - </button> - <button onClick={async () => submission.retry()}> - Retry - </button> - </div> - )} - </Show> - - <form method="post" action={sendData}> - <input type="text" name="name" required /> - <button type="submit" disabled={submission.pending}> - {submission.pending ? "Submitting" : "Submit"} - </button> - </form> - </> - ) +const addTodoAction = action(async (formData: FormData) => { + // ... Sends the todo data to the server. +}, "addTodo"); + +function LatestTodo() { + const latestValidSubmission = useSubmission( + addTodoAction, + ([formData]: [FormData]) => { + const name = formData.get("name")?.toString(); + return name && name.length > 2; + } + ); + + return <p>Latest valid submission: {latestValidSubmission.result}</p>; } ``` diff --git a/src/routes/solid-router/reference/data-apis/use-submissions.mdx b/src/routes/solid-router/reference/data-apis/use-submissions.mdx index c03ac618c..96cf940ed 100644 --- a/src/routes/solid-router/reference/data-apis/use-submissions.mdx +++ b/src/routes/solid-router/reference/data-apis/use-submissions.mdx @@ -1,190 +1,161 @@ --- title: useSubmissions +use_cases: >- + multiple forms, submission history, batch operations, optimistic lists, error + recovery +tags: + - forms + - submissions + - multiple + - history + - optimistic + - batch +version: "1.0" +description: >- + Manage multiple form submissions simultaneously with useSubmissions. Track + history, handle errors, and show optimistic updates. --- -This helper is used to handle form submissions and can provide optimistic updates while actions are in flight as well as pending state feedback. -This method will return an iterable of all submitted actions while its component is mounted. With an optional second parameter for a filter function. +The `useSubmissions` primitive returns the state of all submissions for a given [action](/solid-router/concepts/actions). -:::tip -If you only care for the latest submission, you can use the [`useSubmission`](/solid-router/reference/data-apis/use-submission) helper. -::: +## Import -It's important to note that it requires the form method to be **post** otherwise it will trigger a browser navigation and will not work. - -In the example below, the `useSubmissions` helper is used to retain a list of all submission results to that action while also giving feedback on the pending state of the current in-flight submission. - -```tsx title="component.tsx" {4,9-20, 23} +```tsx import { useSubmissions } from "@solidjs/router"; +``` -function Component() { - const submissions = useSubmissions(postNameAction); - - return ( - <form method="post" action={postNameAction}> - <ul> - <For each={Array.from(submissions.entries())}> - {([attemptIndex, data]) => ( - <Show when={data.result}> - { result => ( - <li> - Backend {attemptIndex}: {result.name} - </li> - )} - </Show> - </> - )} - </For> - </ul> - <input name="name" type="text" /> - <button type="submit">{submissions.pending ? "sending" : "send"}</button> - </form> - ) -} +## Type + +```tsx +function useSubmissions<T extends Array<any>, U, V>( + fn: Action<T, U, V>, + filter?: (input: V) => boolean +): Submission<T, NarrowResponse<U>>[] & { + pending: boolean; +}; ``` -:::note -To trigger a submission, [actions](https://docs.solidjs.com/) can be used. -::: +## Parameters -## Filtering Submissions +### `action` -As an optional second parameter, the `useSubmissions` helper can receive a filter function to only return the submission that matches the condition. -The filter receives the submitted dated as a parameter and should return a boolean value. -E.g.: action below will only submit if the name is "solid". +- **Type:** `Action<T, U, V>` +- **Required:** Yes -```tsx title="component.tsx" {4-8} -import { useSubmissions } from "@solidjs/router"; +The action to track. -function Component() { - const submissions = useSubmissions(postNameAction, ([formData]) => { - const name = formData.get("name") ?? ""; - - return name === "solid"; - }); - - return ( - <form method="post" action={postNameAction}> - <ul> - <For each={Array.from(submissions.entries())}> - {([attemptIndex, data]) => ( - <Show when={data.result}> - { result => ( - <li> - Backend {attemptIndex}: {result.name} - </li> - )} - </Show> - </> - )} - </For> - </ul> - <input name="name" type="text" /> - <button type="submit">{submissions.pending ? "sending" : "send"}</button> - </form> - ) -} -``` +### `filter` -## Optimistic Updates +- **Type:** `(input: V) => boolean` +- **Required:** No -When the form is submitted, the `submission` object will be updated with the new value and the `pending` property will be set to `true`. -This allows you to provide feedback to the user that the action is in progress. -Once the action is complete, the `pending` property will be set to `false` and the `result` property will be updated with final value. +A function that filters submissions. +It is executed for each submission in the order of creation. +It receives an array of the action's inputs as a parameter and must return `true` to select the submission or `false` otherwise. -```tsx tab title="TypeScript" {6,13-20} -// component.tsx -import { Show } from "solid-js"; -import { useSubmissions } from "@solidjs/router"; +## Return value -function Component() { - const submissions = useSubmissions(postNameAction); - - return ( - <form method="post" action={postNameAction}> - <ul> - <For each={Array.from(submissions.entries())}> - {([attemptIndex, data]) => ( - <Show when={data.input[0].entries().next()}> - {(input) => { - const name = (input().value as [string, string])[1] - - return ( - <li>Optimistic: {name}</li> - )}} - </Show> - )} - </For> - </ul> - <input name="name" type="text" /> - <button type="submit">{submissions.pending ? "sending" : "send"}</button> - </form> - ) -} -``` +`useSubmissions` returns a reactive array of submission objects. +Each submission object has the following properties: -```tsx tab title="JavaScript" {6,13-20} -// component.jsx -import { Show } from "solid-js"; -import { useSubmissions } from "@solidjs/router"; +### `input` -function Component() { - const submissions = useSubmissions(postNameAction); - - return ( - <form method="post" action={postNameAction}> - <ul> - <For each={Array.from(submissions.entries())}> - {([attemptIndex, data]) => ( - <Show when={data.input[0].entries().next()}> - {(input) => { - const name = input().value[1] - - return ( - <li>Optimistic: {name}</li> - )}} - </Show> - )} - </For> - </ul> - <input name="name" type="text" /> - <button type="submit">{submissions.pending ? "sending" : "send"}</button> - </form> - ) -} -``` +The reactive input data of the action. + +### `result` -## Error Handling +A reactive value representing the successful return value of the action. -If the action fails, the `submission` object will be updated with the error and the `pending` property will be set to `false`. -This allows you to provide feedback to the user that the action has failed. Additionally, the return type of `useSubmission` will have a new key `error` that will contain the error object thrown by the submission handler. +### `error` + +A reactive value for any error thrown by the action. + +### `pending` + +A reactive boolean indicating if the action is currently running. + +### `clear` + +A function to clear the submission's state. + +### `retry` + +A function to re-execute the submission with the same input. + +## Examples + +### Basic usage + +```tsx +import { For, Show } from "solid-js"; +import { action, useSubmissions } from "@solidjs/router"; + +const addTodoAction = action(async (formData: FormData) => { + // ... Sends the todo data to the server. +}, "addTodo"); + +function AddTodoForm() { + const submissions = useSubmissions(addTodoAction); + + return ( + <div> + <form action={addTodoAction} method="post"> + <input name="name" /> + <button type="submit">Add</button> + </form> + <For each={submissions}> + {(submission) => ( + <div> + <span>Adding "{submission.input[0].get("name")?.toString()}"</span> + <Show when={submission.pending}> + <span> (pending...)</span> + </Show> + <Show when={submission.result?.ok}> + <span> (completed)</span> + </Show> + <Show when={!submission.result?.ok}> + <span>{` (Error: ${submission.result?.message})`}</span> + <button onClick={() => submission.retry()}>Retry</button> + </Show> + </div> + )} + </For> + </div> + ); +} +``` -At this stage, you can also use the `retry()` method to attempt the action again or the `clear()` to wipe the filled data in the platform. +### Filtering submissions -```tsx title="component.tsx" {12-18} -import { Show } from "solid-js"; +```tsx import { useSubmissions } from "@solidjs/router"; -function Component() { - const submissions = useSubmissions(postNameAction); - - return ( - <form method="post" action={postNameAction}> - <ul> - <For each={Array.from(submissions.entries())}> - {([attempt, data]) => ( - <Show when={data.error}> - <li> - <p>Backend {attempt}: {data.error.message}</p> - <button onClick={() => data.retry()}>retry</button> - <button onClick={() => data.clear()}>clear</button> - </li> - </Show> - )} - </For> - </ul> - <input name="name" type="text" required autocomplete="off" /> - <button type="submit">{submissions.pending ? "sending" : "send"}</button> - </form> - ) +const addTodoAction = action(async (formData: FormData) => { + // ... Sends the todo data to the server. +}, "addTodo"); + +function FailedTodos() { + const failedSubmissions = useSubmissions( + addTodoAction, + ([formData]: [FormData]) => { + // Filters for submissions that failed a client-side validation + const name = formData.get("name")?.toString() ?? ""; + return name.length <= 2; + } + ); + + return ( + <div> + <p>Failed submissions:</p> + <For each={failedSubmissions}> + {(submission) => ( + <div> + <span>{submission.input[0].get("name")?.toString()}</span> + <button onClick={() => submission.retry()}>Retry</button> + </div> + )} + </For> + </div> + ); } ``` diff --git a/src/routes/solid-router/reference/preload-functions/preload.mdx b/src/routes/solid-router/reference/preload-functions/preload.mdx index 71f27bc60..aea659caa 100644 --- a/src/routes/solid-router/reference/preload-functions/preload.mdx +++ b/src/routes/solid-router/reference/preload-functions/preload.mdx @@ -1,46 +1,106 @@ --- -title: Preload +title: preload +use_cases: >- + route preloading, hover prefetch, parallel loading, performance optimization, + lazy routes, code splitting +tags: + - preload + - performance + - routing + - prefetch + - lazy + - optimization +version: "1.0" +description: >- + Preload route data and code in parallel to eliminate waterfalls. Enable hover + prefetching for instant page transitions. --- -With smart caches waterfalls are still possible with view logic and with lazy loaded code. -With preload functions, fetching the data parallel to loading the route is possible to allow use of the data as soon as possible. -The preload function can be called when the Route is loaded or eagerly when links are hovered. +The `preload` function is a property on a route definition that initiates data fetching before a user navigates to the route. -As its only argument, the preload function is passed an object that can be used to access route information: +`preload` runs in two separate phases: -```js -import { lazy } from "solid-js"; +- **Preload phase:** + Triggered by user intent (e.g., hovering over a link), the function is called to initiate data fetching. +- **Rendering phase:** + Triggered by actual navigation, the function is called a second time to provide the fetched data to the component. + +## Import + +```tsx import { Route } from "@solidjs/router"; +``` -const User = lazy(() => import("./pages/users/[id].js")); +## Type -// preload function -function preloadUser({ params, location }) { - // do preloading -} +```tsx +type RoutePreloadFunc<T = unknown> = (args: RoutePreloadFuncArgs) => T; -// Pass it in the route definition -<Route path="/users/:id" component={User} preload={preloadUser} />; +interface RoutePreloadFuncArgs { + params: Params; + location: Location; + intent: "initial" | "native" | "navigate" | "preload"; +} ``` -| key | type | description | -| -------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| params | object | The route parameters (same value as calling [`useParams()`](/solid-router/reference/primitives/use-params) inside the route component) | -| location | `{ pathname, search, hash, query, state, key}` | An object that used to get more information about the path (corresponds to [`useLocation()`](/solid-router/reference/primitives/use-location)) | -| intent | `"initial", "navigate", "native", "preload"` | Indicates why this function is being called. <ul><li>"initial" - the route is being initially shown (ie page load)</li><li>"native" - navigate originated from the browser (eg back/forward)</li><li>"navigate" - navigate originated from the router (eg call to navigate or anchor clicked)</li><li>"preload" - not navigating, just preloading (eg link hover)</li></ul> | +## Parameters -A common pattern is to export the preload function and data wrappers that correspond to a route in a dedicated `route.data.js` file. -This imports the data functions without loading anything else. +### `params` -```js -import { lazy } from "solid-js"; -import { Route } from "@solidjs/router"; -import preloadUser from "./pages/users/[id].data.js"; -const User = lazy(() => import("/pages/users/[id].js")); +- **Type:** `Params` -// In the Route definition -<Route path="/users/:id" component={User} preload={preloadUser} />; -``` +An object containing the parameters for the matched route. +It corresponds to the value returned by the [`useParams` primitive](/solid-router/reference/primitives/use-params). + +### `location` + +- **Type:** `Location` + +The router's location object for the destination URL. +It corresponds to the value returned by the [`useLocation` primitive](/solid-router/reference/primitives/use-location). + +### `intent` + +- **Type:** `"initial" | "native" | "navigate" | "preload"` + +A string indicating the context in which the function is called. + +- `"preload"`: + The function is running to initiate data fetching. +- `"navigate"`: + The function is running during navigation to the route. +- `"initial"`: + The function is running for the first route on page load. -The return value of the `preload` function is passed to the page component when called at anytime other than `preload`. -This initializes things in there, or alternatively the following new `Data APIs` can be used. +## Return value + +The value returned by `preload` is passed to the route's component as the `data` prop. + +- In the **preload phase** (`intent: "preload"`), the return value is **ignored**. +- In the **rendering phase** (`intent: "navigate"` or `"initial"`), the return value is **captured** and provided to the component. + +## Examples + +```tsx +import { Route, query, createAsync } from "@solidjs/router"; + +const getProductQuery = query(async (id: string) => { + // ... Fetches a product from the server. +}, "product"); + +function ProductPage(props) { + const product = createAsync(() => getProductQuery(props.params.id)); + + return <div>{product()?.title}</div>; +} + +function preloadData({ params }) { + getProductQuery(params.id); +} + +function ProductRoutes() { + return ( + <Route path="/products/:id" component={ProductPage} preload={preloadData} /> + ); +} +``` diff --git a/src/routes/solid-router/reference/primitives/use-before-leave.mdx b/src/routes/solid-router/reference/primitives/use-before-leave.mdx index 784ea506d..3d0bf20ab 100644 --- a/src/routes/solid-router/reference/primitives/use-before-leave.mdx +++ b/src/routes/solid-router/reference/primitives/use-before-leave.mdx @@ -1,5 +1,19 @@ --- title: useBeforeLeave +use_cases: >- + unsaved forms, exit confirmations, data loss prevention, user prompts before + navigation, dirty state handling +tags: + - navigation + - forms + - confirmation + - prevent + - prompt + - leave +version: "1.0" +description: >- + Prevent route navigation with useBeforeLeave - prompt users before leaving + with unsaved changes, handle exit confirmations in SolidJS. --- `useBeforeLeave` takes a function that will be called prior to leaving a route. diff --git a/src/routes/solid-router/reference/primitives/use-current-matches.mdx b/src/routes/solid-router/reference/primitives/use-current-matches.mdx index b0674c361..4ccd4b2e1 100644 --- a/src/routes/solid-router/reference/primitives/use-current-matches.mdx +++ b/src/routes/solid-router/reference/primitives/use-current-matches.mdx @@ -1,5 +1,18 @@ --- title: useCurrentMatches +use_cases: >- + breadcrumbs, route metadata, nested routes, navigation menus, route info + extraction +tags: + - routes + - breadcrumbs + - matches + - navigation + - metadata +version: "1.0" +description: >- + Access all matched route information with useCurrentMatches - build + breadcrumbs, extract route metadata, and navigate nested routes. --- `useCurrentMatches` returns all the matches for the current matched route. Useful for getting all the route information. diff --git a/src/routes/solid-router/reference/primitives/use-is-routing.mdx b/src/routes/solid-router/reference/primitives/use-is-routing.mdx index 2913b8bc2..37c4e08c6 100644 --- a/src/routes/solid-router/reference/primitives/use-is-routing.mdx +++ b/src/routes/solid-router/reference/primitives/use-is-routing.mdx @@ -1,16 +1,64 @@ --- title: useIsRouting +use_cases: >- + loading states, transition indicators, pending ui, stale content, concurrent + rendering feedback +tags: + - loading + - transition + - pending + - state + - ui +version: "1.0" +description: >- + Track route transitions with useIsRouting - display loading states, pending + UI, and transition feedback during navigation in SolidJS. --- -Retrieves a signal that indicates whether the route is currently in a transition. -This is useful for showing a stale or pending state when the route resolution is suspended state during concurrent rendering. +The `useIsRouting` function is a utility for detecting when the router is processing a route transition. -```js -const isRouting = useIsRouting(); +## Import -return ( - <div classList={{ "grey-out": isRouting() }}> - <MyAwesomeContent /> - </div> -); +```ts +import { useIsRouting } from "@solidjs/router"; ``` + +## Type + +```ts +const useIsRouting: () => () => boolean; +``` + +## Parameters + +None. + +## Return value + +**Type:** `() => boolean` + +An accessor function that returns `true` during route transitions and `false` otherwise. + +## Examples + +### Route transition indicator + +```tsx +import { useIsRouting } from "@solidjs/router"; + +function App() { + const isRouting = useIsRouting(); + + return ( + <> + {isRouting() && <div class="loading-bar" />} + <MyContent /> + </> + ); +} +``` + +## Related + +- [`<Router>`](/solid-router/reference/components/router) +- [`useNavigate`](/solid-router/reference/primitives/use-navigate) diff --git a/src/routes/solid-router/reference/primitives/use-location.mdx b/src/routes/solid-router/reference/primitives/use-location.mdx index 8da0c0ecf..6ce9b86df 100644 --- a/src/routes/solid-router/reference/primitives/use-location.mdx +++ b/src/routes/solid-router/reference/primitives/use-location.mdx @@ -1,19 +1,111 @@ --- title: useLocation +use_cases: >- + current url tracking, query parameters, pathname parsing, hash navigation, + location state access +tags: + - location + - url + - pathname + - query + - hash + - state +version: "1.0" +description: >- + Access reactive URL information with useLocation - track pathname, query + strings, hash, and navigation state in your SolidJS app. --- -Retrieves reactive `location` object useful for getting things like `pathname` +The `useLocation` function provides information about the current URL, including pathname, query strings, hash, and navigation state. -```js -const location = useLocation(); +## Import -const pathname = createMemo(() => parsePath(location.pathname)); +```ts +import { useLocation } from "@solidjs/router"; ``` -| attribute | type | description | -| ---------- | ------ | ----------------------------------------------------------------------------------------- | -| `pathname` | string | The pathname part of the URL, without the query string. | -| `search` | string | The query string part of the URL. | -| `hash` | string | The hash part of the URL, including the `#`. | -| `state` | any | Custom state passed from [`useNavigate`](/solid-router/reference/primitives/use-navigate) | -| `query` | object | Returns a store-like object containing all the query parameters of the URL. | +## Type + +```ts +const useLocation: <S = unknown>() => Location<S>; + +interface Location<S = unknown> extends Path { + query: SearchParams; + state: Readonly<Partial<S>> | null; +} + +interface Path { + pathname: string; + search: string; + hash: string; +} +``` + +## Parameters + +None. + +## Return value + +`useLocation` returns a reactive `Location` object containing the current URL information. + +The `Location` object contains: + +### `pathname` + +**Type:** `string` + +The path portion of the URL, beginning with a `/` and excluding the query string and hash. + +### `search` + +**Type:** `string` + +The query string portion of the URL, including the leading `?` character if a parameter exists. + +### `hash` + +**Type:** `string` + +The hash fragment of the URL, including the leading `#` character if a hash exists. + +### `state` + +**Type:** `Readonly<Partial<S>> | null` + +Custom state passed from [`useNavigate`](/solid-router/reference/primitives/use-navigate). + +### `query` + +**Type:** `SearchParams` + +A reactive object containing the parsed query parameters from the URL. + +## Examples + +### Basic usage + +```tsx +import { useLocation } from "@solidjs/router"; + +function ProductFilter() { + const location = useLocation(); + + const category = () => location.query.category || "all"; + const page = () => location.query.page || "1"; + + return ( + <div> + <p> + Filtering by: {category()}, Page {page()} + </p> + </div> + ); +} +``` + +## Related + +- [`useNavigate`](/solid-router/reference/primitives/use-navigate) +- [`useParams`](/solid-router/reference/primitives/use-params) +- [`useSearchParams`](/solid-router/reference/primitives/use-search-params) diff --git a/src/routes/solid-router/reference/primitives/use-match.mdx b/src/routes/solid-router/reference/primitives/use-match.mdx index c0391d906..3b0446131 100644 --- a/src/routes/solid-router/reference/primitives/use-match.mdx +++ b/src/routes/solid-router/reference/primitives/use-match.mdx @@ -1,47 +1,152 @@ --- title: useMatch +use_cases: >- + active links, navigation highlighting, conditional rendering, path matching, + menu items +tags: + - match + - active + - navigation + - path + - conditional + - links +version: "1.0" +description: >- + Check if paths match current route with useMatch - create active navigation + links, conditional rendering based on route matching. --- -`useMatch` takes an accessor that returns the path and creates a Memo that returns match information if the current path matches the provided path. -Useful for determining if a given path matches the current route. +The `useMatch` function checks whether the current path matches a provided path pattern. -```js -const match = useMatch(() => props.href); +## Import -return <div classList={{ active: Boolean(match()) }} />; +```ts +import { useMatch } from "@solidjs/router"; ``` -As a second parameter, `useMatch` also accepts a group of `MatchFilters`. -These filteres allow for a more granular check. +## Type -The filters are the same used by the `<Router>` itself and they accept either a an array of strings, or a regular expression. Additionally, there's a `boolean` option to match a route only if it has, or doesn't have, the HTML extension. +```ts +const useMatch: <S extends string>( + path: () => S, + matchFilters?: MatchFilters<S> +): Accessor<PathMatch | undefined>; -```js -const filters: MatchFilters = { - parent: ["mom", "dad"] - id: /^\d+$/, - withHtmlExtension: (v: string) => v.length > 5 && v.endsWith(".html") +type MatchFilters<P extends string | readonly string[] = any> = P extends string + ? { [K in PathParams<P>[number]]?: MatchFilter } + : Record<string, MatchFilter>; + +interface PathMatch { + params: Params; + path: string; +} +``` + +## Parameters + +### `path` + +- **Type:** `() => S` +- **Required:** Yes + +An accessor function that returns the path pattern to match against the current route. +Uses the same syntax as the `path` prop in the [`<Route>`](/solid-router/reference/components/route) component. +Supports [path parameters](/solid-router/concepts/path-parameters), [optional parameters](/solid-router/concepts/path-parameters#optional-parameters), and [wildcard parameters](/solid-router/concepts/path-parameters#wildcard-routes). + +### `filters` + +- **Type:** `MatchFilters<S>` +- **Required:** No + +An object where keys correspond to route parameter names and values define match filters. +Each filter can be: + +- An array of allowed strings +- A regular expression pattern +- A function that receives the parameter value as a string and returns true if the parameter should match + +## Return value + +`useMatch` returns a memo containing a `PathMatch` object when the path matches, or `undefined` when there's no match. + +The `PathMatch` object contains: + +### `params` + +- **Type:** `Record<string, string>` + +An object containing the matched path parameters as key-value pairs. + +### `path` + +- **Type:** `string` + +The matched path. + +## Examples + +### Basic usage + +```tsx +import { useMatch } from "@solidjs/router"; +import { type JSXElement } from "solid-js"; + +type NavLinkProps = { + href: string; + children: JSXElement; }; + +function NavLink(props: NavLinkProps) { + const match = useMatch(() => props.href); + + return ( + <a href={props.href} classList={{ active: Boolean(match()) }}> + {props.children} + </a> + ); +} ``` -Finally, any parameter can be determined optional by adding a `?` at the end of the parameter name. +### With filters -```js - const isReference = useMatch(() => "/:project?/reference/*?", { - project: ["solid-router", "solid-meta", "solid-start"], +```tsx +import { useMatch } from "@solidjs/router"; +import { Show } from "solid-js"; + +function BlogPost() { + const match = useMatch(() => "/:lang?/blog/:slug", { + lang: ["en", "es", "fr"], + slug: /^[a-z0-9-]+$/, // Only allow lowercase letters, numbers, and hyphens }); + + const lang = () => match()?.params.lang || "en"; + + return ( + <Show when={match()}> + <article lang={lang()}> + <p>Blog slug: {match()?.params.slug}</p> + </article> + </Show> + ); +} ``` -The check above will match: +### With custom filter functions + +```tsx +import { useMatch } from "@solidjs/router"; + +function FileInfo() { + const match = useMatch(() => "/files/:type/:name", { + type: ["images", "documents", "videos"], + name: (name) => name.length > 5 && name.endsWith(".html"), + }); + + return <div>File: {match()?.params.name}</div>; +} +``` -```text -/reference -/solid-router/reference -/solid-meta/reference -/solid-start/reference +## Related -/reference/... -/solid-router/reference/... -/solid-meta/reference/... -/solid-start/reference/... -``` \ No newline at end of file +- [`useParams`](/solid-router/reference/primitives/use-params) +- [`useLocation`](/solid-router/reference/primitives/use-location) diff --git a/src/routes/solid-router/reference/primitives/use-navigate.mdx b/src/routes/solid-router/reference/primitives/use-navigate.mdx index 82988990a..4cf41a210 100644 --- a/src/routes/solid-router/reference/primitives/use-navigate.mdx +++ b/src/routes/solid-router/reference/primitives/use-navigate.mdx @@ -1,26 +1,167 @@ --- title: useNavigate +use_cases: >- + programmatic navigation, redirects, auth flows, form submissions, history + manipulation +tags: + - navigate + - redirect + - programmatic + - history + - state +version: "1.0" +description: >- + Navigate programmatically with useNavigate - redirect users, handle auth + flows, and control navigation with replace and scroll options. --- -Retrieves the method which accepts a path to navigate to and an optional object with the following options: +The `useNavigate` function provides a function for programmatically navigating to a new route. -- resolve (_boolean_, default `true`): resolve the path against the current route -- replace (_boolean_, default `false`): replace the history entry -- scroll (_boolean_, default `true`): scroll to top after navigation -- state (_any_, default `undefined`): pass custom state to `location.state` +## Import + +```ts +import { useNavigate } from "@solidjs/router"; +``` + +## Type + +```ts +interface NavigateOptions<S = unknown> { + resolve: boolean; + replace: boolean; + scroll: boolean; + state: S; +} + +function useNavigate(): ( + to: string, + options?: Partial<NavigateOptions> +) => void; +function useNavigate(delta: number): void; +``` + +## Parameters + +`useNavigate` takes no arguments. + +## Return value + +- **Type:** `(to: string | number, options?: NavigateOptions) => void | (delta: number) => void` + +Returns a function that accepts two arguments: + +### `to` + +- **Type:** `string | number` +- **Required:** Yes + +The target destination. + +- `string`: + A path to navigate to. +- `number`: + A history delta (e.g., `-1` for back, `1` for forward). + If provided, the `options` argument is ignored. + +### `options` + +- **Type:** `NavigateOptions` +- **Required:** No + +Configuration object for the navigation. + +#### `resolve` + +- **Type:** `boolean` +- **Default:** `true` + +Resolves the path relative to the current route. +If `false`, the path is resolved against the root (`/`). + +If `to` is a query-only string (e.g., `?sort=asc`), this defaults to `false` to preserve the current pathname. + +#### `replace` + +- **Type**: `boolean` +- **Default**: `false` + +Replaces the current history entry instead of adding a new one. +Used for redirects or state updates to prevent the user from navigating back to the previous state. + +#### `scroll` + +- **Type**: `boolean` +- **Default**: `true` + +Scrolls the window to the top after navigation. + +- `true`: + Scrolls to the top or to the element matching the hash. +- `false`: + Maintains the current scroll position (unless a hash matches). + +#### `state` + +- **Type**: `any` +- **Default**: `undefined` + +Arbitrary state stored in `history.state`. +This value is accessible via `useLocation().state`. + +State is serialized using the [structured clone algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm), which supports most built-in types but not functions or DOM nodes. + +## Examples + +### Basic usage + +```tsx +import { useNavigate } from "@solidjs/router"; + +const navigate = useNavigate(); + +navigate("/users/123"); +``` + +### With `replace` + +```tsx +import { useNavigate } from "@solidjs/router"; + +const navigate = useNavigate(); + +// Redirect (replace history) +function login() { + navigate("/dashboard", { replace: true }); +} +``` + +### With `delta` + +```tsx +import { useNavigate } from "@solidjs/router"; -```js const navigate = useNavigate(); -if (unauthorized) { - navigate("/login", { replace: true }); +// Go back one page +function goBack() { + navigate(-1); } ``` -If you are inside of a query, action or cache (deprecated) function you will instead want to use [redirect](/solid-router/reference/response-helpers/redirect) or [reload](/solid-router/reference/response-helpers/reload). +### With `state` + +```tsx +import { useNavigate } from "@solidjs/router"; + +const navigate = useNavigate(); + +// Pass custom state +navigate("/checkout", { + state: { from: "cart", total: 100 }, +}); +``` + +## Related -:::note - The state is serialized using the [structured clone - algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm) - which does not support all object types. -::: +- [useLocation](/solid-router/reference/primitives/use-location) +- [redirect](/solid-router/reference/response-helpers/redirect) diff --git a/src/routes/solid-router/reference/primitives/use-params.mdx b/src/routes/solid-router/reference/primitives/use-params.mdx index c7291ae74..46c0bad05 100644 --- a/src/routes/solid-router/reference/primitives/use-params.mdx +++ b/src/routes/solid-router/reference/primitives/use-params.mdx @@ -1,13 +1,63 @@ --- title: useParams +use_cases: "dynamic routes, user profiles, product pages, id-based content, url parameters" +tags: + - params + - dynamic + - routes + - parameters + - reactive +version: "1.0" +description: >- + Access route parameters reactively with useParams - extract dynamic segments + from URLs for user profiles, products, and ID-based pages. --- -`useParams` retrieves a reactive object similar to a store. -It contains the current route's path parameters as defined in the Route. +The `useParams` function reads the path parameters of the current route. -```js -const params = useParams(); +## Import -// Route path: /user/:id => /user/123 -console.log(params.id); // 123 +```ts +import { useParams } from "@solidjs/router"; ``` + +## Type + +```ts +function useParams<T extends Record<string, string>>(): T; +``` + +## Parameters + +`useParams` takes no arguments. + +## Return value + +- **Type**: `T` + +`useParams` returns a reactive object where keys match the dynamic segments defined in the route path. +Accessing a property within a tracking scope registers a dependency, causing the computation to re-run when the parameter changes. + +## Examples + +### Basic usage + +```ts +import { createMemo } from "solid-js"; +import { useParams } from "@solidjs/router"; + +// Rendered via <Route path="/users/:id" component={UserPage} /> +function UserPage() { + const params = useParams(); + + // Derived value updates when the route parameter changes. + const title = createMemo(() => `Profile for ${params.id}`); + + return <h1>{title()}</h1>; +} +``` + +## Related + +- [useLocation](/solid-router/reference/primitives/use-location) +- [useSearchParams](/solid-router/reference/primitives/use-search-params) diff --git a/src/routes/solid-router/reference/primitives/use-preload-route.mdx b/src/routes/solid-router/reference/primitives/use-preload-route.mdx index 8534db781..30192ede2 100644 --- a/src/routes/solid-router/reference/primitives/use-preload-route.mdx +++ b/src/routes/solid-router/reference/primitives/use-preload-route.mdx @@ -1,11 +1,84 @@ --- title: usePreloadRoute +use_cases: >- + performance optimization, manual preloading, predictive navigation, + prefetching routes +tags: + - preload + - performance + - optimization + - prefetch + - manual +version: "1.0" +description: >- + Manually preload routes with usePreloadRoute - optimize performance by + prefetching route data before navigation in your SolidJS app. --- -`usePreloadRoute` returns a function that can be used to preload a route manually. This is what happens automatically with link hovering and similar focus based behavior, but it is available here as an API. +The `usePreloadRoute` function is a utility for manually preloading a route. -```js -const preload = usePreloadRoute(); +## Import -preload(`/users/settings`, { preloadData: true }); +```ts +import { usePreloadRoute } from "@solidjs/router"; ``` + +## Type + +```ts +const usePreloadRoute: () => ( + url: string | URL, + options?: { preloadData?: boolean } +) => void; +``` + +## Parameters + +### `url` + +**Type:** `string | URL` +**Required:** Yes + +The route path to preload. +Accepts either a `string` path or a [URL](https://developer.mozilla.org/en-US/docs/Web/API/URL) object. + +### `options` + +- **Type:** `{ preloadData?: boolean }` +- **Required:** No + +A configuration object with the following properties: + +#### `preloadData` + +- **Type:** `boolean` +- **Default:** `false` + +When `true`, triggers the route's data loading in addition to preloading the route itself. + +## Return value + +None. + +## Examples + +### Basic usage + +```tsx +import { usePreloadRoute } from "@solidjs/router"; + +function SettingsButton() { + const preload = usePreloadRoute(); + + return ( + <button onClick={() => preload("/users/settings", { preloadData: true })}> + Load settings + </button> + ); +} +``` + +## Related + +- [`<A>`](/solid-router/reference/components/a) +- [`preload`](/solid-router/reference/preload-functions/preload) diff --git a/src/routes/solid-router/reference/primitives/use-resolved-path.mdx b/src/routes/solid-router/reference/primitives/use-resolved-path.mdx index edf2d2aeb..6c9d5cbcb 100644 --- a/src/routes/solid-router/reference/primitives/use-resolved-path.mdx +++ b/src/routes/solid-router/reference/primitives/use-resolved-path.mdx @@ -1,37 +1,55 @@ --- title: useResolvedPath +use_cases: >- + modular routing, nested routers, relative paths, dynamic base paths, component + isolation +tags: + - path + - modular + - nested + - routing + - base + - resolved +version: "1.0" +description: >- + Resolve relative paths with useResolvedPath - build modular routers, handle + nested routes, and create isolated routing components. --- `useResolvedPath` retrieves a signal\<string\>. It contains the current resolved path as defined in the Route. ```js -const path = useResolvedPath(() => ''); +const path = useResolvedPath(() => ""); -// Parent Route path: /user/* +// Parent Route path: /user/* console.log(path()); // /user -const path = useResolvedPath(() => 'a/b/c'); +const path = useResolvedPath(() => "a/b/c"); -// Parent Route path: /user/* +// Parent Route path: /user/* console.log(path()); // /user/a/b/c -const path = useResolvedPath(() => '/a/b/c'); // Note: / +const path = useResolvedPath(() => "/a/b/c"); // Note: / -// Parent Route path: /user/* +// Parent Route path: /user/* console.log(path()); // a/b/c ``` Useful for making modular routers ```js -const parentRoutePath = useResolvedPath(() => ''); - -return <> - <h1>Module component layer</h1> - <Router base={parentRoutePath()}> // Modular magic - <Route path="/" component={() => <div>Index</div>}/> - <Route path="/a" component={() => <div>AComponent</div>}/> - </Router> -</> +const parentRoutePath = useResolvedPath(() => ""); + +return ( + <> + <h1>Module component layer</h1> + <Router base={parentRoutePath()}> + {" "} + // Modular magic + <Route path="/" component={() => <div>Index</div>} /> + <Route path="/a" component={() => <div>AComponent</div>} /> + </Router> + </> +); ``` diff --git a/src/routes/solid-router/reference/primitives/use-search-params.mdx b/src/routes/solid-router/reference/primitives/use-search-params.mdx index 7b26ed638..224a6f49b 100644 --- a/src/routes/solid-router/reference/primitives/use-search-params.mdx +++ b/src/routes/solid-router/reference/primitives/use-search-params.mdx @@ -1,29 +1,79 @@ --- title: useSearchParams +use_cases: "pagination, filters, search forms, url state management, query string updates" +tags: + - search + - query + - params + - pagination + - filters + - url +version: "1.0" +description: >- + Manage URL query parameters with useSearchParams - handle pagination, filters, + and search state directly in the URL query string. --- -Retrieves a tuple containing a reactive object to read the current location's query parameters and a method to update them. -The object is a proxy so you must access properties to subscribe to reactive updates. -Note values will be strings and property names will retain their casing. - -The setter method accepts an object as an input, and its key-value pairs will be merged into the existing query string. -If a value is `''`, `undefined` or `null`, the corresponding key will be omitted from the resulting query string. -The updates behave like navigation and will not scroll the page to the top. -Additionally, the setter can take an optional second parameter, the same as `navigate`, to control the navigation behavior and auto-scrolling, which are disabled by default. - -```js -const [searchParams, setSearchParams] = useSearchParams(); - -return ( - <div> - <span>Page: {searchParams.page}</span> - <button - onClick={() => - setSearchParams({ page: (parseInt(searchParams.page) || 0) + 1 }) - } - > - Next Page - </button> - </div> -); +The `useSearchParams` function reads the URL query parameters for the current route and provides a function to update them. + +## Import + +```ts +import { useSearchParams } from "@solidjs/router"; +``` + +## Type + +```ts +function useSearchParams<T extends Record<string, string | string[]>>(): [ + Partial<T>, + (params: SetSearchParams, options?: Partial<NavigateOptions>) => void, +]; ``` + +## Parameters + +`useSearchParams` takes no arguments. + +## Return value + +- **Type:** `[ Partial<T>, (params: SetSearchParams, options?: Partial<NavigateOptions>) => void ]` + +`useSearchParams` returns an array with two items. + +The first item is a reactive object containing the current query parameters. +Accessing a property within a tracking scope registers a dependency, causing the computation to re-run when the parameter changes. +Values are always strings. + +The second item is a function that updates the query string. +It merges the object provided as its first argument with the current query parameters. +Passing an empty string (`""`), an empty array (`[]`), `undefined`, or `null` as a value removes the key. +It accepts the same options as [`useNavigate`](/solid-router/reference/primitives/use-navigate) as the second parameter. +By default, the `resolve` and `scroll` options are set to `false`. + +## Examples + +### Basic usage + +```tsx +import { useSearchParams } from "@solidjs/router"; + +function Paginator() { + const [params, setParams] = useSearchParams(); + + const page = () => Number(params.page || "1"); + + return ( + <div> + <span>Current Page: {page()}</span> + <button onClick={() => setParams({ page: page() + 1 })}>Next</button> + </div> + ); +} +``` + +## Related + +- [`useParams`](/solid-router/reference/primitives/use-params) +- [`useLocation`](/solid-router/reference/primitives/use-location) +- [`useNavigate`](/solid-router/reference/primitives/use-navigate) diff --git a/src/routes/solid-router/reference/response-helpers/json.mdx b/src/routes/solid-router/reference/response-helpers/json.mdx index c5643d4d2..a6bf91a8c 100644 --- a/src/routes/solid-router/reference/response-helpers/json.mdx +++ b/src/routes/solid-router/reference/response-helpers/json.mdx @@ -1,30 +1,140 @@ --- title: json +use_cases: >- + returning api data, action responses, cache control, revalidation strategies, + server actions +tags: + - json + - api + - actions + - queries + - revalidation + - response +version: "1.0" +description: >- + Return JSON data from actions with query revalidation control. Configure how + route data updates after mutations for optimal performance. --- -Returns JSON data from an action while also providing options for controlling revalidation of cache data on the route. +The `json` function returns a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) object that contains the provided data. +It is intended for sending JSON data from a [query](/solid-router/reference/data-apis/query) or [action](/solid-router/concepts/actions) while also allowing configuration of query revalidation. -```ts title="/actions/get-completed-todos.ts" {7} -import { action, json } from "@solidjs/router"; -import { fetchTodo } from "../fetchers"; +This works both in client and server (e.g., using a server function) environments. -const getCompletedTodos = action(async () => { - const completedTodos = await fetchTodo({ status: 'complete' }); +## Import - return json(completedTodos, { revalidate: getTodo.keyFor(id) }); -}); +```ts +import { json } from "@solidjs/router"; ``` -Also read [action](/solid-router/reference/data-apis/action) and [revalidate](/solid-router/reference/response-helpers/revalidate). +## Type -## Type Signature +```ts +function json<T>( + data: T, + init: { + revalidate?: string | string[]; + headers?: HeadersInit; + status?: number; + statusText?: string; + } = {} +): CustomResponse<T>; +``` + +## Parameters + +### `data` + +- **Type:** `T` +- **Required:** Yes + +The data to be serialized as JSON in the response body. +It must be a value that can be serialized with [`JSON.stringify`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). + +### `init` + +- **Type:** `{ revalidate?: string | string[]; headers?: HeadersInit; status?: number; statusText?: string; }` +- **Required:** No + +An optional configuration object with the following properties: + +#### `revalidate` + +- **Type:** `string | string[]` +- **Required:** No + +A query key or an array of query keys to revalidate. +Passing an empty array (`[]`) disables query revalidation entirely. + +#### `headers` + +- **Type:** `HeadersInit` +- **Required:** No + +An object containing any headers to be sent with the response. + +#### `status` -```typescript -interface ResponseOptions & Omit<ResponseInit, "body"> { - revalidate?: string | string[]; +- **Type:** `number` +- **Required:** No + +The HTTP status code of the response. +Defaults to [`200 OK`](http://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200). + +#### `statusText` + +- **Type:** `string` +- **Required:** No + +The status text associated with the status code. + +## Examples + +### Invalidating Data After a Mutation + +```tsx +import { For } from "solid-js"; +import { query, action, json, createAsync } from "@solidjs/router"; + +const getCurrentUserQuery = query(async () => { + return await fetch("/api/me").then((response) => response.json()); +}, "currentUser"); + +const getPostsQuery = query(async () => { + return await fetch("/api/posts").then((response) => response.json()); +}, "posts"); + +const createPostAction = action(async (formData: FormData) => { + const title = formData.get("title")?.toString(); + const newPost = await fetch("/api/posts", { + method: "POST", + body: JSON.stringify({ title }), + }).then((response) => response.json()); + + // Only revalidate the "posts" query. + return json(newPost, { revalidate: "posts" }); +}, "createPost"); + +function Posts() { + const currentUser = createAsync(() => getCurrentUserQuery()); + const posts = createAsync(() => getPostsQuery()); + + return ( + <div> + <p>Welcome back {currentUser()?.name}</p> + <ul> + <For each={posts()}>{(post) => <li>{post.title}</li>}</For> + </ul> + <form action={createPostAction} method="post"> + <input name="title" /> + <button>Create Post</button> + </form> + </div> + ); } +``` -json<T>(data: T, opt?: ResponseOptions): CustomResponse<T>; -``` +## Related -The `ResponseOptions` extens the types from the native [`ResponseInit`](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#options) interface. \ No newline at end of file +- [`query`](/solid-router/reference/data-apis/query) +- [`action`](/solid-router/reference/data-apis/action) diff --git a/src/routes/solid-router/reference/response-helpers/redirect.mdx b/src/routes/solid-router/reference/response-helpers/redirect.mdx index 9d49940e0..57535bcb9 100644 --- a/src/routes/solid-router/reference/response-helpers/redirect.mdx +++ b/src/routes/solid-router/reference/response-helpers/redirect.mdx @@ -1,74 +1,115 @@ --- title: redirect +use_cases: >- + authentication flows, login redirects, form submissions, route guards, user + authorization, navigation control +tags: + - redirect + - authentication + - navigation + - routing + - authorization + - forms +version: "1.0" +description: >- + Redirect users between routes with proper status codes. Handle authentication + flows, form submissions, and protected route access. --- -Redirects to the next route. -When done over a server RPC (Remote Procedure Call), the redirect will be done through the server. -By default the status code of a `redirect()` is `302 - FOUND`, also known as a temporary redirect. +The `redirect` function returns a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) object that instructs the router to navigate to a different route when returned or thrown from a [query](/solid-router/reference/data-apis/query) or [action](/solid-router/concepts/actions). -Other useful redirect codes: +This works both in client and server (e.g., using a server function) environments. -| Code | Description | -| ---- | ----------- | -| `301` | Moved Permanently | -| `307` | Temporary Redirect | -| `308` | Permanent redirect | +## Import -:::tip[Redirect Methods] -307 and 308 won't allow the browser to change the method of the request. -If you want to change the method, you should use 301 or 302. -::: - -A common use-case for throwing a redirect is when a user is not authenticated and needs to be sent to the login page or another public route. +```ts +import { redirect } from "@solidjs/router"; +``` -```js title="/queries/get-user.ts" {7} -import { query, redirect } from "@solidjs/router"; -import { getCurrentUser } from "../auth"; - -const getUser = query(() => { - const user = await getCurrentUser(); - - if (!user) throw redirect("/login"); - - return user; -}, "get-user") +## Type + +```ts +function redirect( + url: string, + init?: + | number + | { + revalidate?: string | string[]; + headers?: HeadersInit; + status?: number; + statusText?: string; + } +): CustomResponse<never>; ``` -## Single-Flight Mutations +## Parameters -When using `redirect` during a Server Action, the redirect will be done through the server. -The response value will automatically send data for the destination route, avoiding a subsequent roundtrip to load the data from the target route. +### `url` -This is useful when redirecting the user to a different route once a mutation is done. +- **Type:** `string` +- **Required:** Yes -```ts title="/actions/add-user.ts" {3,6} -import { action, redirect } from "@solidjs/router"; +The absolute or relative URL to which the redirect should occur. -const addUser = action(async (user: User) => { - await postUser(user); - - return redirect("/users"); -}); -``` +### `init` + +- **Type:** `number | { revalidate?: string | string[]; headers?: HeadersInit; status?: number; statusText?: string; }` +- **Required:** No + +Either a number representing the status code or a configuration object with the following properties: + +#### `revalidate` + +- **Type:** `string | string[]` +- **Required:** No + +A query key or an array of query keys to revalidate on the destination route. + +#### `status` -The `addUser` action will redirect the user to the `/users` route once the user has been added to the database. -The response from the form action will send the updated data for the `/users` route without the developer needing to revalidate or reload. +- **Type:** `number` +- **Required:** No -## Throw vs Return +The HTTP status code for the redirect. +Defaults to [`302 Found`)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/302). -Both `throw` and `return` can be used to redirect the user to a different route. -For general usage `throw` is recommended as it immediately stops the execution of the current action and redirects the user. +## Examples -When returning from a nested method, the parent method will continue to execute, which can lead to unexpected behavior. +### Basic Usage -### TypeScript Signature +```ts +import { query, redirect } from "@solidjs/router"; + +const getCurrentUserQuery = query(async () => { + const response = await fetch("/api/me"); + + if (response.status === 401) { + return redirect("/login"); + } + + return await response.json(); +}, "currentUser"); +``` + +### Configuring Query Revalidation -```typescript -type RouterResponseInit = Omit<ResponseInit, "body"> & { - revalidate?: string | string[]; -}; +```ts +import { action, redirect } from "@solidjs/router"; + +const loginAction = action(async (formData: FormData) => { + const username = formData.get("username")?.toString(); + const password = formData.get("password")?.toString(); + + await fetch("/api/login", { + method: "POST", + body: JSON.stringify({ username, password }), + }).then((response) => response.json()); + + return redirect("/users", { revalidate: ["currentUser"] }); +}, "login"); +``` -function redirect(url: string, init?: number | RouterResponseInit): CustomResponse<never>; -``` +## Related -The `RouterResponseInit` type extends the native [`ResponseInit`](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#options) interface. +- [`query`](/solid-router/reference/data-apis/query) +- [`action`](/solid-router/reference/data-apis/action) diff --git a/src/routes/solid-router/reference/response-helpers/reload.mdx b/src/routes/solid-router/reference/response-helpers/reload.mdx index fed946069..94c390963 100644 --- a/src/routes/solid-router/reference/response-helpers/reload.mdx +++ b/src/routes/solid-router/reference/response-helpers/reload.mdx @@ -1,32 +1,89 @@ --- title: reload +use_cases: >- + data refresh, cache invalidation, after mutations, updating queries, form + submissions, data synchronization +tags: + - reload + - cache + - revalidation + - mutations + - queries + - refresh +version: "1.0" +description: >- + Reload and revalidate specific queries after mutations. Efficiently update + cached data without full page refreshes for better UX. --- -Reload is a response helper built on top of [revalidate](/solid-router/reference/response-helpers/revalidate). -It will receive a query key, or an array of query keys, to invalidate those queries, and cause them to fire again. +The `reload` function returns a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) object that instructs the router to revalidate specific queries when returned or thrown from a [query](/solid-router/reference/data-apis/query) or [action](/solid-router/concepts/actions). -```ts title="/actions/update-todo.ts" {7} -import { action, reload } from "@solidjs/router"; -import { putTodo, getTodo } from "../db"; +## Import -const updateTodo = action(async (todo: Todo) => { - await putTodo(todo.id, todo); - - return reload({ revalidate: getTodo.keyFor(id) }); -}); +```ts +import { reload } from "@solidjs/router"; ``` -The code snippet above uses the query key from a user-defined query (`getTodo`). -To better understand how queries work, check the [query](/solid-router/reference/data-apis/query) documentation. +## Type + +```ts +function reload(init?: { + revalidate?: string | string[]; + headers?: HeadersInit; + status?: number; + statusText?: string; +}): CustomResponse<never>; +``` + +## Parameters + +### `init` + +- **Type:** `{ revalidate?: string | string[]; headers?: HeadersInit; status?: number; statusText?: string; }` +- **Required:** No + +An optional configuration object with the following properties: + +#### `revalidate` + +- **Type:** `string | string[]` +- **Required:** No + +A query key or an array of query keys to revalidate. + +#### `headers` -## TypeScript Signature +- **Type:** `HeadersInit` +- **Required:** No + +An object containing any headers to be sent with the response. + +#### `status` + +- **Type:** `number` +- **Required:** No + +The HTTP status code of the response. +Defaults to [`200 OK`](http://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200). + +#### `statusText` + +- **Type:** `string` +- **Required:** No + +The status text associated with the status code. + +## Examples + +### Basic Usage ```ts -interface ResponseOptions & Omit<ResponseInit, "body"> { - revalidate?: string | string[]; -} +import { action, reload } from "@solidjs/router"; -reload(opt?: ResponseOptions): CustomResponse<never>; -``` +const savePreferencesAction = action(async () => { + // ... Saves the user preferences. -The `ResponseOptions` extends the types from the native [`ResponseInit`](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#options) interface. + // Only revalidate the "userPreferences" query. + return reload({ revalidate: ["userPreferences"] }); +}, "savePreferences"); +``` diff --git a/src/routes/solid-router/rendering-modes/spa.mdx b/src/routes/solid-router/rendering-modes/spa.mdx index 6bdcc8263..9629b8928 100644 --- a/src/routes/solid-router/rendering-modes/spa.mdx +++ b/src/routes/solid-router/rendering-modes/spa.mdx @@ -1,8 +1,22 @@ --- title: Single page applications +use_cases: >- + client-side routing, cdn deployment, static hosting, spa configuration, + deployment setup +tags: + - spa + - deployment + - cdn + - hosting + - client-side + - routing +version: "1.0" +description: >- + Configure single-page applications for proper CDN and hosting deployment. + Handle client-side routing without server-side rendering. --- -When deploying applications that use a client-side router without relying on Server-Side Rendering, it is important that redirects to the index page are handled properly. +When deploying applications that use a client-side router without relying on Server-Side Rendering, it is important that redirects to the index page are handled properly. This prevents the CDN or hosting service from returning a "not found" error when accessing URLs that do not correspond to files. Each provider has a different way of doing this. diff --git a/src/routes/solid-router/rendering-modes/ssr.mdx b/src/routes/solid-router/rendering-modes/ssr.mdx index fdced89d3..ba9a73d88 100644 --- a/src/routes/solid-router/rendering-modes/ssr.mdx +++ b/src/routes/solid-router/rendering-modes/ssr.mdx @@ -1,5 +1,19 @@ --- title: Server side rendering +use_cases: >- + server rendering, seo optimization, initial page load, performance + optimization, data preloading +tags: + - ssr + - server + - rendering + - seo + - performance + - preload +version: "1.0" +description: >- + Enable server-side rendering with Solid Router for SEO and performance. + Support suspense, resources, and render-as-you-fetch patterns. --- Solid Router supports all of Solid's SSR capabilities. diff --git a/src/routes/solid-start/advanced/auth.mdx b/src/routes/solid-start/advanced/auth.mdx index 96c7814e6..7fa21c2fa 100644 --- a/src/routes/solid-start/advanced/auth.mdx +++ b/src/routes/solid-start/advanced/auth.mdx @@ -1,19 +1,33 @@ --- -title: "Auth" +title: Auth +use_cases: >- + user authentication, protected routes, authorization checks, secure data + access, login systems +tags: + - authentication + - authorization + - security + - protected + - login + - users +version: "1.0" +description: >- + Implement authentication and protected routes in SolidStart. Secure sensitive + resources and handle user authorization properly. --- Server functions can be used to protect sensitive resources like user data. ```tsx -"use server" +"use server"; async function getPrivatePosts() { - const user = await getUser() - if(!user) { - return null // or throw an error + const user = await getUser(); + if (!user) { + return null; // or throw an error } - return db.getPosts({ userId: user.id, private: true }) + return db.getPosts({ userId: user.id, private: true }); } ``` @@ -25,20 +39,23 @@ Routes can be protected by checking the user or session object during data fetch This example uses [Solid Router](/solid-router). ```tsx -const getPrivatePosts = query(async function() { - "use server" - const user = await getUser() - if(!user) { +const getPrivatePosts = query(async function () { + "use server"; + const user = await getUser(); + if (!user) { throw redirect("/login"); } - return db.getPosts({ userId: user.id, private: true }) -}) + return db.getPosts({ userId: user.id, private: true }); +}); export default function Page() { - const posts = createAsync(() => getPrivatePosts()); + const posts = createAsync(() => getPrivatePosts(), { deferStream: true }); } ``` Once the user hits this route, the router will attempt to fetch `getPrivatePosts` data. If the user is not signed in, `getPrivatePosts` will throw and the router will redirect to the login page. + +To prevent errors when opening the page directly, set `deferStream: true`. +This would ensure `getPrivatePosts` resolves before the page loads since server-side redirects cannot occur after streaming has started. diff --git a/src/routes/solid-start/advanced/data.json b/src/routes/solid-start/advanced/data.json index e0f08e8ba..b9f0ac6d3 100644 --- a/src/routes/solid-start/advanced/data.json +++ b/src/routes/solid-start/advanced/data.json @@ -5,6 +5,7 @@ "session.mdx", "request-events.mdx", "return-responses.mdx", + "serialization.mdx", "auth.mdx", "websocket.mdx" ] diff --git a/src/routes/solid-start/advanced/middleware.mdx b/src/routes/solid-start/advanced/middleware.mdx index 871f9b236..cca076be1 100644 --- a/src/routes/solid-start/advanced/middleware.mdx +++ b/src/routes/solid-start/advanced/middleware.mdx @@ -1,5 +1,19 @@ --- -title: "Middleware" +title: Middleware +use_cases: >- + request interception, header management, global data sharing, request + preprocessing, logging, redirects +tags: + - middleware + - headers + - interceptors + - logging + - preprocessing + - locals +version: "1.0" +description: >- + Intercept HTTP requests with middleware for authentication, logging, and + header management. Share request-scoped data across your app. --- Middleware intercepts HTTP requests and responses to perform tasks like authentication, redirection, logging, and more. diff --git a/src/routes/solid-start/advanced/request-events.mdx b/src/routes/solid-start/advanced/request-events.mdx index c69550043..3f6954467 100644 --- a/src/routes/solid-start/advanced/request-events.mdx +++ b/src/routes/solid-start/advanced/request-events.mdx @@ -1,5 +1,19 @@ --- title: Request events +use_cases: >- + server context access, local data storage, request handling, server functions, + event access +tags: + - events + - server + - context + - locals + - requests + - functions +version: "1.0" +description: >- + Access request events and local context in SolidStart server functions. + Type-safe locals and native event handling for server code. --- Request events in SolidStart are retrieved using the [`getRequestEvent`](/reference/server-utilities/get-request-event) from `@solidjs/web`. @@ -14,18 +28,18 @@ When adding fields to `event.locals`, the fields can be typed: ```tsx title="global.d.ts" /// <reference types="@solidjs/start/env" /> declare module App { - interface RequestEventLocals { - /** - * Declare your getRequestEvent().locals here - */ - } + interface RequestEventLocals { + /** + * Declare your getRequestEvent().locals here + */ + } } ``` ## nativeEvent -Sometimes access is still needed to the underlying event from [Vinxi](https://vinxi.vercel.app/). -This can be accessed that using the `.nativeEvent` property, which is the underlying H3Event used, and can be passed to the helpers available in the ecosystem. +Sometimes access is still needed to the underlying event from [Vinxi](https://vinxi.vercel.app/). +This can be accessed that using the `.nativeEvent` property, which is the underlying H3Event used, and can be passed to the helpers available in the ecosystem. Note that Vinxi HTTP helpers _do not_ treeshake so you can only import them in files that do not contain client or isomorphic code. Many of these events support Async Local Storage so this may not be needed. diff --git a/src/routes/solid-start/advanced/return-responses.mdx b/src/routes/solid-start/advanced/return-responses.mdx index 9a100790b..4be635103 100644 --- a/src/routes/solid-start/advanced/return-responses.mdx +++ b/src/routes/solid-start/advanced/return-responses.mdx @@ -1,9 +1,23 @@ --- title: Returning responses +use_cases: >- + server function responses, error handling, response types, api responses, + typescript typing +tags: + - responses + - server + - functions + - typescript + - errors + - api +version: "1.0" +description: >- + Return typed Response objects from server functions. Handle redirects, + reloads, and JSON responses with proper TypeScript support. --- -In SolidStart, it is possible to return a Response object from a server function. -[`solid-router`](/solid-router) knows how to handle certain responses with its [`query`](/solid-router/reference/data-apis/query) and [`action`](/solid-router/reference/data-apis/action) APIs. +In SolidStart, it is possible to return a Response object from a server function. +[`solid-router`](/solid-router) knows how to handle certain responses with its [`query`](/solid-router/reference/data-apis/query) and [`action`](/solid-router/reference/data-apis/action) APIs. For TypeScript, when returning a response using `solid-router`'s `redirect`, `reload`, or `json` helpers, they will not impact the return value of the server function. While we suggest depending on the type of the function to handle errors differently, you can always return or throw a response. diff --git a/src/routes/solid-start/advanced/serialization.mdx b/src/routes/solid-start/advanced/serialization.mdx new file mode 100644 index 000000000..f896c92cc --- /dev/null +++ b/src/routes/solid-start/advanced/serialization.mdx @@ -0,0 +1,78 @@ +--- +title: Serialization +use_cases: >- + server function payloads, data transfer, csp, security, performance +tags: + - serialization + - server-functions + - csp + - security + - performance +version: "1.0" +description: >- + Understand how SolidStart serializes server function payloads, supported + types, and CSP tradeoffs. +--- + +SolidStart serializes server function arguments and return values so they can travel between server and client. It uses Seroval under the hood and streams payloads to keep responses responsive. + +## Configuration + +Configure serialization in your `app.config.ts` with `defineConfig`: + +```tsx tab title="v1" +import { defineConfig } from "@solidjs/start/config"; + +export default defineConfig({ + serialization: { + mode: "js", + }, +}); +``` + +```tsx tab title="v2" +import { defineConfig } from "vite"; +import { solidStart } from "@solidjs/start"; + +export default defineConfig({ + plugins: [ + solidStart({ + serialization: { + mode: "json", + }, + }), + ], +}); +``` + +See the full config reference in [`defineConfig`](/solid-start/reference/config/define-config#serialization). + +## Modes + +- `json`: Uses `JSON.parse` on the client. Best for strict CSP because it avoids `eval`. Payloads can be slightly larger. +- `js`: Uses Seroval's JS serializer for smaller payloads and better performance, but it requires `unsafe-eval` in CSP. + +:::caution[v2 Breaking Change: Defaults] +SolidStart v1 defaults to `js` for backwards compatibility. SolidStart v2 defaults to `json` for CSP compatibility. +::: + +## Supported types (default) + +SolidStart enables Seroval plus a default set of web platform plugins. These plugins add support for: + +- `AbortSignal`, `CustomEvent`, `DOMException`, `Event` +- `FormData`, `Headers`, `ReadableStream` +- `Request`, `Response` +- `URL`, `URLSearchParams` + +Seroval supports additional value types. The compatibility list is broader than what SolidStart enables by default, so treat it as a superset. See the [Seroval compatibility docs](https://github.com/lxsmnsyc/seroval/blob/main/docs/COMPATIBILITY.md). + +## Limits and exclusions + +- `RegExp` is disabled by default. +- JSON mode enforces a maximum serialization depth of 64. If you exceed this, flatten the structure or return a simpler payload. + +## Related guidance + +- Configure modes and defaults in [`defineConfig`](/solid-start/reference/config/define-config#serialization). +- CSP implications and nonce examples live in the [Security guide](/solid-start/guides/security#content-security-policy-csp). diff --git a/src/routes/solid-start/advanced/session.mdx b/src/routes/solid-start/advanced/session.mdx index ff7da4df6..3cf6c64ef 100644 --- a/src/routes/solid-start/advanced/session.mdx +++ b/src/routes/solid-start/advanced/session.mdx @@ -1,5 +1,19 @@ --- -title: "Sessions" +title: Sessions +use_cases: >- + user sessions, authentication state, preferences storage, stateful + interactions, login persistence +tags: + - sessions + - cookies + - authentication + - state + - storage + - persistence +version: "1.0" +description: >- + Manage user sessions with encrypted cookies in SolidStart. Maintain + authentication state and user preferences between requests. --- Sessions allow web applications to maintain state between user requests. diff --git a/src/routes/solid-start/advanced/websocket.mdx b/src/routes/solid-start/advanced/websocket.mdx index 63762cd9a..11ca0a5dc 100644 --- a/src/routes/solid-start/advanced/websocket.mdx +++ b/src/routes/solid-start/advanced/websocket.mdx @@ -1,5 +1,19 @@ --- title: WebSocket endpoint +use_cases: >- + real-time updates, chat applications, live notifications, multiplayer games, + collaborative editing, streaming data +tags: + - websocket + - real-time + - streaming + - experimental + - server + - events +version: "1.0" +description: >- + Set up WebSocket endpoints in SolidStart for real-time bidirectional + communication. Handle connections, messages, and events. --- WebSocket endpoint may be included by passing the ws handler file you specify in your start config. @@ -29,21 +43,21 @@ Inside the ws file, you can export an eventHandler function to manage WebSocket import { eventHandler } from "vinxi/http"; export default eventHandler({ - handler() {}, - websocket: { - async open(peer) { - console.log("open", peer.id, peer.url); - }, - async message(peer, msg) { - const message = msg.text(); - console.log("msg", peer.id, peer.url, message); - }, - async close(peer, details) { - console.log("close", peer.id, peer.url); - }, - async error(peer, error) { - console.log("error", peer.id, peer.url, error); - }, - }, + handler() {}, + websocket: { + async open(peer) { + console.log("open", peer.id, peer.url); + }, + async message(peer, msg) { + const message = msg.text(); + console.log("msg", peer.id, peer.url, message); + }, + async close(peer, details) { + console.log("close", peer.id, peer.url); + }, + async error(peer, error) { + console.log("error", peer.id, peer.url, error); + }, + }, }); ``` diff --git a/src/routes/solid-start/building-your-application/api-routes.mdx b/src/routes/solid-start/building-your-application/api-routes.mdx index 11aee0548..3ee6d1489 100644 --- a/src/routes/solid-start/building-your-application/api-routes.mdx +++ b/src/routes/solid-start/building-your-application/api-routes.mdx @@ -1,9 +1,25 @@ --- -title: "API routes" +title: API routes +use_cases: >- + rest api, graphql endpoints, trpc setup, webhooks, oauth callbacks, pdf + generation, third-party integrations +tags: + - api + - rest + - graphql + - trpc + - endpoints + - server + - http +version: "1.0" +description: >- + Create API routes in SolidStart for REST, GraphQL, or tRPC endpoints. Handle + HTTP methods, sessions, and external integrations. --- While Server Functions can be a good way to write server-side code for data needed by your UI, sometimes you need to expose API routes. Some reasons for wanting API Routes include: + - There are additional clients that want to share this logic. - Exposing a GraphQL or tRPC endpoint. - Exposing a public-facing REST API. @@ -30,24 +46,25 @@ While you can name this directory anything, it is common to name it `api` to ind ```tsx title="routes/api/test.ts" export function GET() { - // ... + // ... } export function POST() { - // ... + // ... } export function PATCH() { - // ... + // ... } export function DELETE() { - // ... + // ... } ``` API routes get passed an `APIEvent` object as their first argument. This object contains: + - `request`: [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object representing the request sent by the client. - `params`: Object that contains the dynamic route parameters. For example, if the route is `/api/users/:id`, and the request is made to `/api/users/123`, then `params` will be `{ id: 123 }`. - `fetch`: An internal `fetch` function that can be used to make requests to other API routes without worrying about the `origin` of the URL. @@ -57,7 +74,7 @@ In order to handle all methods, you can define a handler function that binds mul ```tsx title="routes/api/all.ts" async function handler() { - // ... + // ... } export const GET = handler; @@ -72,9 +89,9 @@ import type { APIEvent } from "@solidjs/start/server"; import store from "./store"; export async function GET({ params }: APIEvent) { - console.log(`Category: ${params.category}, Brand: ${params.brand}`); - const products = await store.getProducts(params.category, params.brand); - return products; + console.log(`Category: ${params.category}, Brand: ${params.brand}`); + const products = await store.getProducts(params.category, params.brand); + return products; } ``` @@ -93,15 +110,15 @@ import { getCookie } from "vinxi/http"; import store from "./store"; export async function GET(event: APIEvent) { - const userId = getCookie("userId"); - if (!userId) { - return new Response("Not logged in", { status: 401 }); - } - const user = await store.getUser(event.params.userId); - if (user.id !== userId) { - return new Response("Not authorized", { status: 403 }); - } - return user; + const userId = getCookie("userId"); + if (!userId) { + return new Response("Not logged in", { status: 401 }); + } + const user = await store.getUser(event.params.userId); + if (user.id !== userId) { + return new Response("Not authorized", { status: 403 }); + } + return user; } ``` @@ -137,26 +154,26 @@ const schema = buildSchema(` // Define GraphQL Resolvers const rootValue = { - hello: () => { - return { - message: "Hello World" - }; - }, - goodbye: () => { - return "Goodbye"; - } + hello: () => { + return { + message: "Hello World", + }; + }, + goodbye: () => { + return "Goodbye"; + }, }; // request handler const handler = async (event: APIEvent) => { - // get request body - const body = await new Response(event.request.body).json(); + // get request body + const body = await new Response(event.request.body).json(); - // pass query and save results - const result = await graphql({ rootValue, schema, source: body.query }); + // pass query and save results + const result = await graphql({ rootValue, schema, source: body.query }); - // send query result - return result; + // send query result + return result; }; export const GET = handler; @@ -179,9 +196,9 @@ import { string } from "valibot"; const t = initTRPC.create(); export const appRouter = t.router({ - hello: t.procedure.input(wrap(string())).query(({ input }) => { - return `hello ${input ?? "world"}`; - }) + hello: t.procedure.input(wrap(string())).query(({ input }) => { + return `hello ${input ?? "world"}`; + }), }); export type AppRouter = typeof appRouter; @@ -194,7 +211,10 @@ import { createTRPCProxyClient, httpBatchLink, loggerLink } from "@trpc/client"; import type { AppRouter } from "./router"; export const client = createTRPCProxyClient<AppRouter>({ - links: [loggerLink(), httpBatchLink({ url: "http://localhost:3000/api/trpc" })] + links: [ + loggerLink(), + httpBatchLink({ url: "http://localhost:3000/api/trpc" }), + ], }); ``` @@ -206,12 +226,12 @@ import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; import { appRouter } from "~/lib/router"; const handler = (event: APIEvent) => - fetchRequestHandler({ - endpoint: "/api/trpc", - req: event.request, - router: appRouter, - createContext: () => ({}) - }); + fetchRequestHandler({ + endpoint: "/api/trpc", + req: event.request, + router: appRouter, + createContext: () => ({}), + }); export const GET = handler; diff --git a/src/routes/solid-start/building-your-application/css-and-styling.mdx b/src/routes/solid-start/building-your-application/css-and-styling.mdx index 8fb11d3a0..aa2d79460 100644 --- a/src/routes/solid-start/building-your-application/css-and-styling.mdx +++ b/src/routes/solid-start/building-your-application/css-and-styling.mdx @@ -1,8 +1,22 @@ --- -title: "CSS and styling" +title: CSS and styling +use_cases: >- + styling components, css modules, scoped styles, component styling, design + system setup, visual customization +tags: + - css + - styling + - modules + - components + - design + - vite +version: "1.0" +description: >- + Style your SolidStart components with CSS, CSS modules, and other styling + solutions. Implement scoped styles and design systems. --- -SolidStart is a standards-based framework that, instead of modifying the behavior of the [`<style>` tags](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style), strives to build on top of it. +SolidStart is a standards-based framework that, instead of modifying the behavior of the [`<style>` tags](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style), strives to build on top of it. ## Styling components @@ -21,37 +35,36 @@ To use the CSS in the component, you can define the CSS in the `Card.css` file a ```css title="Card.css" .card { - background-color: #446b9e; + background-color: #446b9e; } h1 { - font-size: 1.5em; - font-weight: bold; + font-size: 1.5em; + font-weight: bold; } p { - font-size: 1em; - font-weight: normal; + font-size: 1em; + font-weight: normal; } ``` - ```tsx title="Card.tsx" import "./Card.css"; const Card = (props) => { - return ( - <div class="card"> - <h1>{props.title}</h1> - <p>{props.text}</p> - </div> - ); + return ( + <div class="card"> + <h1>{props.title}</h1> + <p>{props.text}</p> + </div> + ); }; ``` ### CSS modules for scoped styles -SolidStart also supports [vite's CSS modules](https://vitejs.dev/guide/features.html#css-modules). +SolidStart also supports [vite's CSS modules](https://vitejs.dev/guide/features.html#css-modules). Through [CSS modules](https://github.com/css-modules/css-modules), you can scope certain CSS to a component and use the CSS class in multiple components to style them differently. For this feature to work, the `.css` file must be named with the `.module.css` extension. @@ -59,17 +72,17 @@ This convention also works for `.scss` and `.sass` files, which can be named wit ```css title="Card.module.css" .card { - background-color: #446b9e; + background-color: #446b9e; } div.card > h1 { - font-size: 1.5em; - font-weight: bold; + font-size: 1.5em; + font-weight: bold; } div.card > p { - font-size: 1em; - font-weight: normal; + font-size: 1em; + font-weight: normal; } ``` @@ -84,16 +97,16 @@ The import object can be thought of as `humanClass: generatedClass` and within t import styles from "./Card.module.css"; const Card = (props) => { - return ( - <div class={styles.card}> - <h1>{props.title}</h1> - <p>{props.text}</p> - </div> - ); + return ( + <div class={styles.card}> + <h1>{props.title}</h1> + <p>{props.text}</p> + </div> + ); }; ``` ## Other ways to style components -SolidStart is built on top of Solid, meaning styling is not limited to CSS. +SolidStart is built on top of Solid, meaning styling is not limited to CSS. To see other ways to style components, see the [styling section in the Solid documentation](/guides/styling-your-components). diff --git a/src/routes/solid-start/building-your-application/data-fetching.mdx b/src/routes/solid-start/building-your-application/data-fetching.mdx new file mode 100644 index 000000000..74c1104aa --- /dev/null +++ b/src/routes/solid-start/building-your-application/data-fetching.mdx @@ -0,0 +1,57 @@ +--- +title: "Data fetching" +--- + +Fetching data from a remote API or database is a core task for most applications. +[Solid](/) and [Solid Router](/solid-router) provide foundational tools like the [`createResource` primitive](/guides/fetching-data) and [queries](/solid-router/data-fetching/queries) to manage asynchronous data. + +SolidStart builds on these capabilities, extending them to provide a comprehensive solution for data fetching in a full-stack environment. + +This page assumes you are familiar with the fundamental concepts of Solid and Solid Router. +If you are a beginner, we highly recommend starting with the [queries documentation](/solid-router/data-fetching/queries). +You can also find many practical examples in the [data fetching how-to guide](/solid-start/guides/data-fetching). + +## Server functions and queries + +Server functions provide a way to write functions that run exclusively on the server. +This makes it safe to fetch data directly from a database without relying on a separate API endpoint. + +Server functions integrate seamlessly with queries, as they can be used as the fetcher for a query. + +```tsx +import { query, redirect } from "@solidjs/router"; +import { useSession } from "vinxi/http"; +import { db } from "./db"; + +const getCurrentUserQuery = query(async (id: string) => { + "use server"; + const session = await useSession({ + password: process.env.SESSION_SECRET as string, + name: "session", + }); + + if (session.data.userId) { + return await db.users.get({ id: session.data.userId }); + } else { + throw redirect("/login"); + } +}, "currentUser"); +``` + +In this example, the `getCurrentUserQuery` retrieves the session data, and if an authenticated user exists, it gets their information from the database and returns it. +Otherwise, it redirects the user to the login page. +All of these operations are performed completely on the server regardless of how the query is called. + +:::caution[Modifying headers after streaming] +Once streaming begins, response headers (including status and cookies) are sent and cannot be changed. +Any header-modifying logic within a server function, such as redirects or APIs like `useSession` that set cookies, must run before streaming starts; +otherwise, this error will occur: +`Cannot set headers after they are sent to the client.` + +To avoid this, disable streaming for queries that may modify headers by enabling the [`deferStream`](/solid-router/reference/data-apis/create-async#deferstream) option. + +```tsx +const user = createAsync(() => getCurrentUserQuery(), { deferStream: true }); +``` + +::: diff --git a/src/routes/solid-start/building-your-application/data-loading.mdx b/src/routes/solid-start/building-your-application/data-loading.mdx deleted file mode 100644 index 32445361e..000000000 --- a/src/routes/solid-start/building-your-application/data-loading.mdx +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: "Data loading" ---- - -SolidStart aims to make it easy to load data from your data sources to keep your UI updated with your data. -For most of your data requirements, routes will likely be used to decide what data to load. -SolidStart includes nested routing to help structure your application's UI in a hierarchical way, so that you can share layouts. - -## Data loading on the client - -Solid provides a way to load data from your data sources using the [`createResource` primitive](/reference/basic-reactivity/create-resource). -It takes an async function and returns a [signal](/reference/basic-reactivity/create-signal) from it. -`createResource` integrates with [`Suspense`](/reference/components/suspense) and [`ErrorBoundary`](/reference/components/error-boundary) to help manage lifecycle and error states. - -```tsx tab title="TypeScript" {7-10} -// src/routes/users.tsx -import { For, createResource } from "solid-js"; - -type User = { name: string; house: string }; - -export default function Page() { - const [users] = createResource(async () => { - const response = await fetch("https://example.com/users"); - return (await response.json()) as User[]; - }); - - return <For each={users()}>{(user) => <li>{user.name}</li>}</For>; -} -``` - -```tsx tab title="JavaScript" {5-8} -// src/routes/users.jsx -import { For, createResource } from "solid-js"; - -export default function Page() { - const [users] = createResource(async () => { - const response = await fetch("https://example.com/users"); - return (await response.json()); - }); - - return <For each={users()}>{(user) => <li>{user.name}</li>}</For>; -} -``` - -When fetching inside components, you can encounter unnecessary waterfalls, especially when nested under lazy loaded sections. -To solve this, it is recommended to hoist the data fetching to the top of the component tree or, when in [SolidStart](/solid-start), use the server to fetch data in a non-blocking way. -For the example below we will be using the data in APIs in [`solid-router`](/solid-router) - -Using some of the features of `solid-router`, we can create a cache for our data: - -```tsx tab title="TypeScript" {7, 10, 13} -// /routes/users.tsx -import { For } from "solid-js"; -import { createAsync, query } from "@solidjs/router"; - -type User = { name: string; email: string }; - -const getUsers = query(async () => { - const response = await fetch("https://example.com/users"); - return (await response.json()) as User[]; -}, "users"); - -export const route = { - preload: () => getUsers(), -}; - -export default function Page() { - const users = createAsync(() => getUsers()); - - return <For each={users()}>{(user) => <li>{user.name}</li>}</For>; -} -``` - -```tsx tab title="JavaScript" {5, 8, 11} -// /routes/users.jsx -import { For } from "solid-js"; -import { createAsync, query } from "@solidjs/router"; - -const getUsers = query(async () => { - const response = await fetch("https://example.com/users"); - return (await response.json()); -}, "users"); - -export const route = { - preload: () => getUsers(), -}; - -export default function Page() { - const users = createAsync(() => getUsers()); - - return <For each={users()}>{(user) => <li>{user.name}</li>}</For>; -} -``` - -With this method, however, there are some caveats to be aware of: - -1. The [`preload`](/solid-router/reference/preload-functions/preload) function is called **once** per route, which is the first time the user comes to that route. - Following that, the fine-grained resources that remain alive synchronize with state/url changes to refetch data when needed. - If the data needs a refresh, the [`refetch`](/guides/fetching-data#refetch) function returned in the `createResource` can be used. -2. Before the route is rendered, the `preload` function is called. - It does not share the same `context` as the route. - The context tree that is exposed to the `preload` function is anything above the `Page` component. -3. On both the server and the client, the `preload` function is called. - The resources can avoid refetching if they serialized their data in the server render. - The server-side render will only wait for the resources to fetch and serialize if the resource signals are accessed under a `Suspense` boundary. - -### Data loading always on the server - -An advantage of being a full-stack JavaScript framework is that it is easy to write data loading code that can run both on the server and client. -SolidStart offers a way to do that and more. -Through the `"use server"` comment you can tell the bundler to create an RPC and not include the code in the clients bundle. -This lets you write code that only runs on the server without needing to create an API route for it. -For example, it could be database access or internal APIs, or when you sit within your function and need to use your server. - -```tsx tab title="TypeScript" {8} -// /routes/users.tsx -import { For } from "solid-js"; -import { createAsync, query } from "@solidjs/router"; - -type User = { name: string; email: string }; - -const getUsers = query(async () => { - "use server"; - return store.users.list(); -}, "users"); - -export const route = { - preload: () => getUsers(), -}; - -export default function Page() { - const users = createAsync(() => getUsers()); - - return <For each={users()}>{(user) => <li>{user.name}</li>}</For>; -} -``` - -```tsx tab title="JavaScript" {6} -// /routes/users.jsx -import { For } from "solid-js"; -import { createAsync, query } from "@solidjs/router"; - -const getUsers = query(async () => { - "use server"; - return store.users.list(); -}, "users"); - -export const route = { - preload: () => getUsers(), -}; - -export default function Page() { - const users = createAsync(() => getUsers()); - - return <For each={users()}>{(user) => <li>{user.name}</li>}</For>; -} -``` diff --git a/src/routes/solid-start/building-your-application/data-mutation.mdx b/src/routes/solid-start/building-your-application/data-mutation.mdx new file mode 100644 index 000000000..2692c4dfc --- /dev/null +++ b/src/routes/solid-start/building-your-application/data-mutation.mdx @@ -0,0 +1,104 @@ +--- +title: "Data mutation" +--- + +Mutating data on a server is a common task in most applications. +[Solid Router](/solid-router) provides [actions](/solid-router/concepts/actions) to manage data mutations effectively. + +SolidStart builds upon the capabilities of actions, extending their scope to provide a comprehensive, full-stack solution for data mutations. + +This page does not cover the foundational concepts from Solid Router. +If you are a beginner, we highly recommend starting with the [actions documentation](/solid-router/concepts/actions). +You can also find many practical examples in the [data mutation how-to guide](/solid-start/guides/data-mutation). + +## Server functions and actions + +Server functions allow an action to run exclusively on the server. +This enables performing sensitive operationsβ€”such as writing to a database or working with sessionsβ€”directly within the action. + +```tsx +import { action, redirect } from "@solidjs/router"; +import { useSession } from "vinxi/http"; +import { db } from "./db"; + +const logoutAction = action(async () => { + "use server"; + const session = await useSession({ + password: process.env.SESSION_SECRET as string, + name: "session", + }); + + if (session.data.sessionId) { + await session.clear(); + await db.session.delete({ id: sessionId }); + } + + throw redirect("/"); +}, "logout"); +``` + +In this example, the entire `logoutAction` runs on the server. +It safely accesses the session to retrieve the `sessionId` and performs a database deletion without exposing this logic to the client. +The `redirect` then navigates the user back to the home page. + +## Single-flight mutations + +When a piece of data changes on the server, the new data needs to be fetched so the UI doesn't fall out of sync. +Traditionally, this is done in two separate HTTP requests: one to update the data, and a second to fetch the new data. + +Single-flight mutations are a unique feature of SolidStart that handles this pattern in a single request. +This is enabled when two requirements are met: + +1. The action that updates the data must execute on the server using server functions. +2. The data that the action updated must be preloaded. + If the action performs a redirect, preloading needs to happen on the destination page. + +```tsx title="src/routes/products/[id].tsx" +import { + action, + query, + createAsync, + type RouteDefinition, + type RouteSectionProps, +} from "@solidjs/router"; +import { db } from "./db"; + +const updateProductAction = action(async (id: string, formData: FormData) => { + "use server"; + const name = formData.get("name")?.toString(); + await db.products.update(id, { name }); +}, "updateProduct"); + +const getProductQuery = query(async (id: string) => { + "use server"; + return await db.products.get(id); +}, "product"); + +export const route = { + preload: ({ params }) => getProductQuery(params.id as string), +} satisfies RouteDefinition; + +export default function ProductDetail(props: RouteSectionProps) { + const product = createAsync(() => getProductQuery(props.params.id as string)); + + return ( + <div> + <p>Current name: {props.data.product?.name}</p> + <form + action={updateProductAction.with(props.params.id as string)} + method="post" + > + <input name="name" placeholder="New name" /> + <button>Save</button> + </form> + </div> + ); +} +``` + +In this example, `updateProductAction` updates the product within a server function, and `getProductQuery` is responsible for fetching the product data. +Note that `getProductQuery` is preloaded on the route. + +When a user submits the form, a single POST request is sent to the server. +After the action completes, `getProductQuery` is automatically revalidated. +Because it's preloaded, SolidStart can trigger the revalidation on the server and stream the result back to the client in the same response. diff --git a/src/routes/solid-start/building-your-application/data.json b/src/routes/solid-start/building-your-application/data.json index 2da1baa8d..7d5641d01 100644 --- a/src/routes/solid-start/building-your-application/data.json +++ b/src/routes/solid-start/building-your-application/data.json @@ -4,7 +4,8 @@ "routing.mdx", "api-routes.mdx", "css-and-styling.mdx", - "data-loading.mdx", + "data-fetching.mdx", + "data-mutation.mdx", "head-and-metadata.mdx", "route-prerendering.mdx", "static-assets.mdx" diff --git a/src/routes/solid-start/building-your-application/head-and-metadata.mdx b/src/routes/solid-start/building-your-application/head-and-metadata.mdx index e7c8c3627..24fdb5734 100644 --- a/src/routes/solid-start/building-your-application/head-and-metadata.mdx +++ b/src/routes/solid-start/building-your-application/head-and-metadata.mdx @@ -1,15 +1,25 @@ --- -title: "Head and metadata" +title: Head and metadata +use_cases: >- + seo optimization, page titles, meta tags, og tags, social sharing, search + engine visibility, dynamic metadata +tags: + - seo + - metadata + - head + - title + - meta + - og-tags +version: "1.0" +description: >- + Manage SEO and metadata in SolidStart with dynamic titles, meta tags, and Open + Graph tags for better search visibility. --- SolidStart does not come with a metadata library. In cases where you want to customize the content in the `head` of your `document`, you can use the `@solidjs/meta` library. -<div id="npm"> -```bash frame="none" -npm i @solidjs/meta -``` -</div> +<div id="npm">```bash frame="none" npm i @solidjs/meta ```</div> The common elements used in the [`head`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head) are: @@ -26,16 +36,16 @@ When applying metadata to a specific route, you can use the `Title`: import { Title } from "@solidjs/meta"; export default function About() { - return ( - <> - <Title>About -

    About

    - - ); + return ( + <> + About +

    About

    + + ); } ``` -These tags will be applied for that specific route only and will be removed from `document.head` once a user navigates away from the page. +These tags will be applied for that specific route only and will be removed from `document.head` once a user navigates away from the page. `routeData` can also be used here to create titles and SEO metadata that is specific to the dynamic parts of the route. ## Adding a site suffix in Title @@ -44,7 +54,7 @@ Custom components can be created to wrap the `Title` component to add a site-spe ```tsx {2} export default function MySiteTitle(props) { - return {props.children} | My Site; + return {props.children} | My Site; } ``` @@ -52,12 +62,12 @@ export default function MySiteTitle(props) { import MySiteTitle from "~/components/MySiteTitle"; export default function About() { - return ( - <> - About -

    About

    - - ); + return ( + <> + About +

    About

    + + ); } ``` @@ -71,14 +81,14 @@ import { RouteSectionProps } from "@solidjs/router"; import { createResource, Show } from "solid-js"; export default function User(props: RouteSectionProps) { - const [user] = createResource(() => fetchUser(props.params.id)); - - return ( - - {user()?.name} -

    {user()?.name}

    -
    - ); + const [user] = createResource(() => fetchUser(props.params.id)); + + return ( + + {user()?.name} +

    {user()?.name}

    +
    + ); } ``` @@ -92,23 +102,17 @@ Since these tags may want to be used across multiple routes, they can be added i ```tsx { 5-15 } export default function Root() { - return ( - - - - - - - - - - ); + return ( + + + + + + + + + + ); } ``` @@ -119,20 +123,14 @@ This overrides the `Meta` tags used within the `Head` component. import MySiteTitle from "~/components/MySiteTitle"; export default function About() { - return ( - <> - About - - - -

    About

    - - ); + return ( + <> + About + + + +

    About

    + + ); } ``` diff --git a/src/routes/solid-start/building-your-application/route-prerendering.mdx b/src/routes/solid-start/building-your-application/route-prerendering.mdx index 34461ea25..e4290c360 100644 --- a/src/routes/solid-start/building-your-application/route-prerendering.mdx +++ b/src/routes/solid-start/building-your-application/route-prerendering.mdx @@ -1,34 +1,53 @@ --- -title: "Route pre-rendering" +title: Route Pre-rendering +use_cases: >- + static site generation, ssg, blog sites, documentation, marketing pages, + performance optimization, seo improvement +tags: + - prerender + - ssg + - static + - performance + - build + - seo +version: "1.0" +description: >- + Pre-render SolidStart routes to static HTML for faster loads and better SEO. + Perfect for blogs, docs, and marketing sites. --- -SolidStart offers a way to pre-render pages at build time. -The easiest way to accomplish this is by passing a list of routes to be pre-rendered to the `routes` option. +Route pre-rendering powers Static Site Generation (SSG) by producing static HTML pages during the build process. +This results in faster load times and better SEO, making it especially useful for content-rich sites such as documentation, blogs, and marketing pages. +Static files are served without server-side processing at runtime. + +Configure prerendering for specific routes using the `routes` option ```js { 6 } import { defineConfig } from "@solidjs/start/config"; export default defineConfig({ - server: { - prerender: { - routes: ["/", "/about"] - } - } + server: { + prerender: { + routes: ["/", "/about"], + }, + }, }); ``` -When you wish for all your routes to be pre-rendered, you can pass `true` to the `crawlLinks` option: +Or to pre-render all routes, you can pass `true` to the `crawlLinks` option ```js { 6 } import { defineConfig } from "@solidjs/start/config"; export default defineConfig({ - server: { - prerender: { - crawlLinks: true - } - } + server: { + prerender: { + crawlLinks: true, + }, + }, }); ``` -For more information on prerender options, check out [Nitro's documentation](https://nitro.build/config#prerender) +For advanced pre-rendering options, refer to [Nitro's documentation](https://nitro.build/config#prerender). + +[SolidBase](https://solidbase.dev) simplifies SSG development with built-in support for fast, pre-rendered Markdown and MDX pages. diff --git a/src/routes/solid-start/building-your-application/routing.mdx b/src/routes/solid-start/building-your-application/routing.mdx index b7ac8acf9..0bf55774c 100644 --- a/src/routes/solid-start/building-your-application/routing.mdx +++ b/src/routes/solid-start/building-your-application/routing.mdx @@ -1,5 +1,19 @@ --- -title: "Routing" +title: Routing +use_cases: >- + page navigation, url structure, nested layouts, dynamic paths, route + organization, site architecture +tags: + - routing + - navigation + - pages + - layouts + - dynamic + - filesystem +version: "1.0" +description: >- + Build your SolidStart app with file-based routing. Create pages, nested + layouts, and dynamic routes with simple file structure. --- Routing serves as a key component of web applications. @@ -268,21 +282,20 @@ export default function UsersLayout(props: RouteSectionProps) { ```jsx tab title="JavaScript" {3-7} export const route = { - preload() { - // define preload function - } + preload() { + // define preload function + }, }; export default function UsersLayout(props) { - return ( -
    -

    Users

    - {props.children} -
    - ); + return ( +
    +

    Users

    + {props.children} +
    + ); } ``` - [api-routes]: /core-concepts/api-routes [fileroutes]: /api/FileRoutes diff --git a/src/routes/solid-start/building-your-application/static-assets.mdx b/src/routes/solid-start/building-your-application/static-assets.mdx index 655978293..06e9b2117 100644 --- a/src/routes/solid-start/building-your-application/static-assets.mdx +++ b/src/routes/solid-start/building-your-application/static-assets.mdx @@ -1,12 +1,26 @@ --- -title: "Static assets" +title: Static assets +use_cases: >- + images, fonts, documents, favicon, robots.txt, service workers, media files, + public resources +tags: + - assets + - images + - public + - static + - media + - files +version: "1.0" +description: >- + Manage static assets in SolidStart using the public directory or imports. + Serve images, fonts, documents, and media files. --- Within SolidStart there are two ways to import static assets into your project: using the public directory and using imports. ## Public directory -Rich web applications use assets to create visuals. +Rich web applications use assets to create visuals. In SolidStart, the `/public` directory can be used to store static assets. These assets are served at the exact path they are in, relative to the public directory: @@ -26,17 +40,18 @@ If you would like to reference an asset in the public directory, you can use the ```tsx { 5 } export default function About() { - return ( - <> -

    About

    - Solid logo - - ); + return ( + <> +

    About

    + Solid logo + + ); } ``` This is ideal when you want to have human-readable, stable references to static assets. This can be useful for assets such as: + - documents - service workers - images, audio, and video @@ -52,18 +67,18 @@ Vite provides a way to import assets directly into your Solid components: import logo from "./solid.png"; export default function About() { - return ( - <> -

    About

    - Solid logo - // Renders - Solid logo - - ); + return ( + <> +

    About

    + Solid logo + // Renders + Solid logo + + ); } ``` -When you use imports, Vite will create a hashed filename. +When you use imports, Vite will create a hashed filename. For example, `solid.png` will become `solid.2d8efhg.png`. ## Public directory versus imports @@ -71,8 +86,8 @@ For example, `solid.png` will become `solid.2d8efhg.png`. The public directory and imports are both valid ways to include static assets in your project. The driver to use one over the other is based on your use case. -For dynamic updates to your assets, using the public directory is the best choice. +For dynamic updates to your assets, using the public directory is the best choice. It allows you to maintain full control over the asset URL paths, ensuring that the links remain consistent even when the assets are updated. -When using imports, the filename is hashed and therefore will not be predictable over time. +When using imports, the filename is hashed and therefore will not be predictable over time. This can be beneficial for cache busting but detrimental if you want to send someone a link to the asset. diff --git a/src/routes/solid-start/data.json b/src/routes/solid-start/data.json index aac47ac2c..7457ff697 100644 --- a/src/routes/solid-start/data.json +++ b/src/routes/solid-start/data.json @@ -3,6 +3,7 @@ "pages": [ "index.mdx", "getting-started.mdx", + "migrating-from-v1.mdx", "building-your-application", "advanced", "guides" diff --git a/src/routes/solid-start/getting-started.mdx b/src/routes/solid-start/getting-started.mdx index 3cd0f1761..760e8209e 100644 --- a/src/routes/solid-start/getting-started.mdx +++ b/src/routes/solid-start/getting-started.mdx @@ -1,5 +1,19 @@ --- -title: "Getting started" +title: Getting started +use_cases: >- + new project, initial setup, project creation, starter template, first app, + quick start, bootstrapping +tags: + - setup + - installation + - starter + - template + - quickstart + - init +version: "1.0" +description: >- + Start your first SolidStart project with templates and step-by-step setup. + Create, configure, and run your Solid application. --- The easiest way to get started with Solid is to use the SolidStart starter. @@ -7,25 +21,33 @@ This starter contains a collection of templates that can be used to quickly boot **1. Install SolidStart** -Once you have created a directory for your new application, you can initialize SolidStart with the following command: +To start a new project you can initialize SolidStart with the following command: ```package-create solid@latest ``` +This will create a new directory for your project based on the name you enter. + **2. Choose a template** When you run the command above, SolidStart will prompt you to choose a template for your new application. -You can see a [list of these options in the SolidStart repository](https://github.com/solidjs/solid-start/tree/main/examples). +You can see a [list of these options in the templates repository](https://github.com/solidjs/templates/tree/main/solid-start-v1). ```bash frame="terminal" -? Which template do you want to use? β€Ί - Use arrow-keys. Return to submit. -❯ bare - hackernews - with-auth - with-mdx - with-tailwindcss - with-vitest +β—† Which template would you like to use? +β”‚ ● basic +β”‚ β—‹ bare +β”‚ β—‹ with-solidbase +β”‚ β—‹ with-auth +β”‚ β—‹ with-authjs +β”‚ β—‹ with-drizzle +β”‚ β—‹ with-mdx +β”‚ β—‹ with-prisma +β”‚ β—‹ with-solid-styled +β”‚ β—‹ with-tailwindcss +β”‚ ... +β”” ``` Following the prompts, you might be asked questions like whether you want to use Server Side Rendering or TypeScript. @@ -36,6 +58,7 @@ Choose your desired options to continue. Once you have chosen your template and configuration options, you can navigate to the directory you created and run the following command to install dependencies: ```package-install-local + ``` After this command has finished, your new SolidStart application is ready to go! @@ -52,11 +75,12 @@ Your application should now be running locally on port 3000. You can view it by navigating to [http://localhost:3000](http://localhost:3000). :::note - SolidStart uses [Vinxi](https://vinxi.vercel.app/) both for starting a development server with [Vite](https://vitejs.dev/) and for building and starting a production server with [Nitro](https://nitro.build/). +SolidStart uses [Vinxi](https://vinxi.vercel.app/) both for starting a development server with [Vite](https://vitejs.dev/) and for building and starting a production server with [Nitro](https://nitro.build/). When you run your application, you are actually running `vinxi dev` under the hood. You can read more about the [Vinxi CLI and how it is configured in the Vinxi documentation](https://vinxi.vercel.app/api/cli.html). + ::: ## Project files @@ -79,14 +103,15 @@ src/ For example, if you chose to use JavaScript rather than TypeScript, your file extensions will be `.jsx` instead of `.tsx`. Each directory and file in this structure serves a specific purpose in your SolidStart application: + - `public/` - contains the publicly-accessible assets for your application. -This is where images, fonts, and other files that you want to be accessible to the public should be placed. + This is where images, fonts, and other files that you want to be accessible to the public should be placed. - `src/` - where your Start application code will live. -It is aliased to `~/` for importing in your code. + It is aliased to `~/` for importing in your code. - `src/routes/` - any files or pages will be located in this directory. -You can learn more about the [`routes` folder in the routing section](/solid-start/building-your-application/routing). + You can learn more about the [`routes` folder in the routing section](/solid-start/building-your-application/routing). - [`src/entry-client.tsx`](/solid-start/reference/entrypoints/entry-client) - this file is what loads and _hydrates_ the JavaScript for our application on the client side (in browser). -In most cases, you will **not** need to modify this file. + In most cases, you will **not** need to modify this file. - [`src/entry-server.tsx`](/solid-start/reference/entrypoints/entry-server) - this file will handle requests on the server. -Like `entry-client.tsx`, in most cases you will **not** need to modify this file. + Like `entry-client.tsx`, in most cases you will **not** need to modify this file. - [`app.tsx`](/solid-start/reference/entrypoints/app) - this is the HTML root of your application both for client and server rendering. You can think of this as the shell inside which your application will be rendered. diff --git a/src/routes/solid-start/guides/data-fetching.mdx b/src/routes/solid-start/guides/data-fetching.mdx index 5a1a4c38a..859a1f6bb 100644 --- a/src/routes/solid-start/guides/data-fetching.mdx +++ b/src/routes/solid-start/guides/data-fetching.mdx @@ -1,18 +1,25 @@ --- -title: "Data fetching" +title: Data fetching +use_cases: >- + api calls, database queries, loading states, error handling, preloading data, + client fetching, orm integration +tags: + - fetch + - data + - api + - async + - loading + - query + - database +version: "1.0" +description: >- + Master data fetching in SolidStart with practical examples. Handle loading + states, errors, preloading, and database queries. --- -SolidStart is built on top of [Solid](/) and uses [Solid Router](/solid-router) by default. -This means you can leverage their respective data-fetching primitives within SolidStart. -Since SolidStart itself provides minimal data-fetching APIs, most functionality comes from Solid and Solid Router. +This guide provides practical examples of common data-fetching tasks in SolidStart. -This guide provides practical examples of common data-fetching tasks using these primitives. - -:::note -For detailed API information, refer to the [Solid](/) and [Solid Router](/solid-router) documentation. -::: - -Here's a simple example: +Here's an example showing how to create a [`query`](/solid-router/reference/data-apis/query) and access its data with the [`createAsync` primitive](/solid-router/reference/data-apis/create-async): ```tsx tab title="TypeScript" // src/routes/index.tsx @@ -54,12 +61,9 @@ export default function Page() { } ``` -In this example, a [`query`](/solid-router/reference/data-apis/query) is created. -In order to access it's data within the component, the [`createAsync`](/solid-router/reference/data-apis/create-async) primitive was used. - ## Showing loading UI -To show a loading UI during data-fetching: +To show a loading UI during data fetching: 1. Import [`Suspense`](/reference/components/suspense) from `solid-js`. 2. Wrap your data rendering in ``, and use the `fallback` prop to show a component during data fetching. @@ -110,7 +114,7 @@ export default function Page() { ## Handling errors -To show a fallback UI if the data-fetching fails: +To show a fallback UI if the data fetching fails: 1. Import [`ErrorBoundary`](/reference/components/error-boundary) from `solid-js`. 2. Wrap the data rendering in ``, and use the `fallback` prop to show a component if an error occurs. @@ -165,7 +169,7 @@ export default function Page() { ## Preloading data -Data fetching can be optimized during user navigation by preloading the data: +To preload data before a route renders: 1. Export a `route` object with a [`preload`](/solid-router/reference/preload-functions/preload) function. 2. Run your query inside the `preload` function. @@ -225,7 +229,7 @@ export default function Page() { ## Passing parameters to queries -When creating a query that accepts parameters, define your query function to take any number of arguments: +When creating a query that accepts parameters, define your query function to take any number of parameters: ```tsx tab title="TypeScript" {5} {11} {16} // src/routes/posts/[id]/index.tsx @@ -283,7 +287,7 @@ export default function Page() { ## Using a database or an ORM -To safely interact with your database or ORM in a query, ensure it's server-only by adding [`"use server"`](/solid-start/reference/server/use-server) as the first line of your query: +To safely interact with your database or ORM in a query, use a [server function](/solid-start/reference/server/use-server): ```tsx tab title="TypeScript" {7-8} // src/routes/index.tsx @@ -388,5 +392,5 @@ export default function Page() { See the [`createResource`](/reference/basic-reactivity/create-resource) API reference for more information. :::note[Advanced Data Handling] -For advanced features like automatic background re-fetching or infinite queries, you can use [Tanstack Query](https://tanstack.com/query/latest/docs/framework/solid/overview). +For advanced features like automatic background re-fetching or infinite queries, you can use [TanStack Query](https://tanstack.com/query/latest/docs/framework/solid/overview). ::: diff --git a/src/routes/solid-start/guides/data-mutation.mdx b/src/routes/solid-start/guides/data-mutation.mdx index abcc75f27..6d0d21eff 100644 --- a/src/routes/solid-start/guides/data-mutation.mdx +++ b/src/routes/solid-start/guides/data-mutation.mdx @@ -1,5 +1,20 @@ --- -title: "Data mutation" +title: Data mutation +use_cases: >- + form submission, data updates, crud operations, user input handling, database + writes, api posts, validation, optimistic ui +tags: + - forms + - actions + - mutations + - validation + - database + - api + - crud +version: "1.0" +description: >- + Learn how to handle form submissions, validate data, and perform mutations + with SolidStart actions. Complete guide with examples. --- This guide provides practical examples of using actions to mutate data in SolidStart. @@ -12,7 +27,7 @@ To handle [`
    `](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/f See the [Action API reference](/solid-router/reference/data-apis/action#notes-of-form-implementation-and-ssr) for more information. 2. Pass the action to the `` element using the `action` prop. 3. Ensure the `` element uses the `post` method for submission. -4. Use the [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData) object in the action to extract field data using the navite `FormData` methods. +4. Use the [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData) object in the action to extract field data using the native `FormData` methods. ```tsx tab title="TypeScript" {4-10} {14} // src/routes/index.tsx @@ -486,12 +501,12 @@ export default function Page() { } ``` -## Invoking an action programmatically +## Triggering an action programmatically -To programmatically invoke an action: +To programmatically trigger an action: 1. Import [`useAction`](/solid-router/reference/data-apis/use-action) from `@solidjs/router`. -2. Call `useAction` with your action, and use the returned function to invoke the action. +2. Call `useAction` with your action, and use the returned function to trigger the action. ```tsx tab title="TypeScript" {14} {18} // src/routes/index.tsx diff --git a/src/routes/solid-start/guides/security.mdx b/src/routes/solid-start/guides/security.mdx index 7f0593955..8d663ff89 100644 --- a/src/routes/solid-start/guides/security.mdx +++ b/src/routes/solid-start/guides/security.mdx @@ -1,5 +1,20 @@ --- title: Security +use_cases: >- + production apps, user input handling, authentication, public apis, preventing + attacks, secure deployments, compliance +tags: + - security + - xss + - csrf + - cors + - csp + - middleware + - protection +version: "1.0" +description: >- + Secure your SolidStart apps against XSS, CSRF attacks. Configure CSP headers, + CORS policies, and implement security best practices. --- ## XSS (Cross Site Scripting) @@ -9,12 +24,13 @@ However, this protection does not apply when using [`innerHTML`](/reference/jsx- To protect your application from XSS attacks: +- Set a [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP). +- Validate and sanitize user inputs, especially form inputs on the server and client. - Avoid using `innerHTML` when possible. If necessary, make sure to sanitize user-supplied data with libraries such as [DOMPurify](https://github.com/cure53/DOMPurify). -- Validate and sanitize user inputs, especially form inputs on the server and client. -- Set a [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP). - Sanitize attributes containing user-supplied data within `
    } /> + ``` + +## Disabling SSR for Entire Pages + +To disable SSR for an entire page, apply `clientOnly` at the page level. This ensures the page renders only on the client. + +```tsx title="routes/page.tsx" import { clientOnly } from "@solidjs/start"; -const ClientOnlyComp = clientOnly(() => import("../ClientOnlyComp")); +export default clientOnly(async () => ({ default: Page }), { lazy: true }); -function IsomorphicComp() { - return ; +function Page() { + // This code runs only on the client + return
    Client-only page content
    ; } ``` -**Note:** The `` can take a fallback prop for when it is loading. - ## Parameters -| Argument | Type | Description | -| -------- | --------------- | ------------------------------------ | -| fn | `() => Promise` | Function to be run client-side only. | +| Argument | Type | Description | +| --------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | +| `fn` | `() => Promise<{ default: () => JSX.Element }>` | A function that dynamically imports a component to be rendered only on the client side. | +| `options` | `{ lazy?: boolean }` | An optional object to configure loading behavior. Set `lazy: false` for eager loading | +| `props` | `Record & { fallback?: JSX.Element }` | Props passed to the component, including an optional `fallback` for rendering while the component loads. | diff --git a/src/routes/solid-start/reference/client/data.json b/src/routes/solid-start/reference/client/data.json index f27722264..e44a88a71 100644 --- a/src/routes/solid-start/reference/client/data.json +++ b/src/routes/solid-start/reference/client/data.json @@ -1,8 +1,4 @@ { "title": "Client", - "pages": [ - "client-only.mdx", - "mount.mdx", - "start-client.mdx" - ] -} \ No newline at end of file + "pages": ["client-only.mdx", "mount.mdx", "start-client.mdx"] +} diff --git a/src/routes/solid-start/reference/client/mount.mdx b/src/routes/solid-start/reference/client/mount.mdx index 33c7dd77b..3180530de 100644 --- a/src/routes/solid-start/reference/client/mount.mdx +++ b/src/routes/solid-start/reference/client/mount.mdx @@ -1,8 +1,21 @@ --- title: mount +use_cases: >- + app initialization, entry point setup, bootstrapping, client rendering, + hydration control +tags: + - mount + - hydration + - rendering + - initialization + - entry-client +version: "1.0" +description: >- + Bootstrap your SolidStart application with mount. Automatically handles + hydration for SSR or client-only rendering modes. --- -`mount` is a method that calls either [`hydrate`](/reference/rendering/hydrate) (server rendering) or [`render`](/reference/rendering/render) (client rendering) depending on the configuration. +`mount` is a method that calls either [`hydrate`](/reference/rendering/hydrate) (server rendering) or [`render`](/reference/rendering/render) (client rendering) depending on the configuration. It is used in [`entry-client.tsx`](/solid-start/reference/entrypoints/entry-client) to bootstrap an application. ```tsx diff --git a/src/routes/solid-start/reference/client/start-client.mdx b/src/routes/solid-start/reference/client/start-client.mdx index 88eeecb89..277b51ce5 100644 --- a/src/routes/solid-start/reference/client/start-client.mdx +++ b/src/routes/solid-start/reference/client/start-client.mdx @@ -1,8 +1,18 @@ --- -title: "StartClient" +title: StartClient +use_cases: "client entry setup, app wrapper configuration, root component setup" +tags: + - client + - entry + - components + - configuration +version: "1.0" +description: >- + StartClient component wraps your SolidStart application root. Essential for + proper client-side initialization and mounting. --- -`StartClient` is a component that wraps the application root. +`StartClient` is a component that wraps the application root. It can be passed to [`mount`](/solid-start/reference/client/start-client) in the [`entry-client.tsx`](/solid-start/reference/entrypoints/entry-client). ```tsx diff --git a/src/routes/solid-start/reference/config/data.json b/src/routes/solid-start/reference/config/data.json index 95790d793..90d3e8706 100644 --- a/src/routes/solid-start/reference/config/data.json +++ b/src/routes/solid-start/reference/config/data.json @@ -1,6 +1,4 @@ { "title": "Config", - "pages": [ - "define-config.mdx" - ] -} \ No newline at end of file + "pages": ["define-config.mdx"] +} diff --git a/src/routes/solid-start/reference/config/define-config.mdx b/src/routes/solid-start/reference/config/define-config.mdx index 5ba824c13..d8c7d637f 100644 --- a/src/routes/solid-start/reference/config/define-config.mdx +++ b/src/routes/solid-start/reference/config/define-config.mdx @@ -1,5 +1,19 @@ --- title: defineConfig +use_cases: >- + app configuration, deployment setup, build optimization, platform targeting, + vite plugins, nitro presets +tags: + - configuration + - vite + - nitro + - deployment + - build + - plugins +version: "1.0" +description: >- + Configure SolidStart apps with defineConfig. Set up Vite plugins, Nitro + presets, and deployment targets for any platform. --- The `defineConfig` helper is from `@solidjs/start/config` and is used within [`app.config.ts`](/solid-start/reference/entrypoints/app-config). @@ -21,11 +35,12 @@ export default defineConfig({ }); ``` -The `vite` option can also be a function that can be customized for each Vinxi router. +The `vite` option can also be a function that can be customized for each Vinxi router. In SolidStart, 3 routers are used: + - `server` - server-side routing -- `client` - for the client-side routing +- `client` - for the client-side routing - `server-function` - server functions. ```tsx @@ -42,13 +57,48 @@ export default defineConfig({ }); ``` +## Serialization + +SolidStart serializes server function payloads so they can move between server and client. You can configure the serializer mode to balance performance, payload size, and Content Security Policy (CSP) constraints. + +```tsx +import { defineConfig } from "@solidjs/start/config"; + +export default defineConfig({ + serialization: { + mode: "json", + }, +}); +``` + +### Modes + +- `json`: Uses `JSON.parse` on the client. This is the safest option for strict CSP because it avoids `eval`. Payloads can be slightly larger. +- `js`: Uses Seroval's JS serializer for smaller payloads and better performance, but it relies on `eval` during client-side deserialization and requires `unsafe-eval` in CSP. + +### Defaults + +- SolidStart v1 defaults to `js` for backwards compatibility. +- SolidStart v2 defaults to `json` for CSP compatibility. + +### Supported types (default) + +SolidStart enables Seroval plus a default set of web platform plugins. These plugins add support for: + +- `AbortSignal`, `CustomEvent`, `DOMException`, `Event` +- `FormData`, `Headers`, `ReadableStream` +- `Request`, `Response` +- `URL`, `URLSearchParams` + +Seroval supports additional value types. The compatibility list is broader than what SolidStart enables by default, so treat it as a superset. See the full list in the [Seroval compatibility docs](https://github.com/lxsmnsyc/seroval/blob/main/docs/COMPATIBILITY.md). + ## Configuring Nitro -SolidStart uses [Nitro](https://nitro.build/) to run on a number of platforms. -The `server` option exposes some Nitro options including the build and deployment presets. +SolidStart uses [Nitro](https://nitro.build/) to run on a number of platforms. +The `server` option exposes some Nitro options including the build and deployment presets. An overview of all available presets is available in the [Deploy section of the Nitro documentation](https://nitro.build/deploy). - Some common ones include: +Some common ones include: **Servers** @@ -85,7 +135,7 @@ export default defineConfig({ #### Special note -SolidStart uses async local storage. +SolidStart uses async local storage. Netlify, Vercel, and Deno support this out of the box but if you're using Cloudflare you will need to specify the following: ```js @@ -103,7 +153,6 @@ export default defineConfig({ Within `wrangler.toml` you will need to enable node compatibility: - ``` compatibility_flags = [ "nodejs_compat" ] ``` @@ -116,6 +165,7 @@ compatibility_flags = [ "nodejs_compat" ] | solid | object | | Configuration object for [vite-plugin-solid](https://github.com/solidjs/vite-plugin-solid) | | extensions | string[] | ["js", "jsx", "ts", "tsx"] | Array of file extensions to be treated as routes. | | server | object | | Nitro server config options | +| serialization | object | | Serialization settings for server function payloads. | | appRoot | string | "./src" | The path to the root of the application. | | routeDir | string | "./routes" | The path to where the routes are located. | | middleware | string | | The path to an optional [middleware](/solid-start/advanced/middleware) file. | diff --git a/src/routes/solid-start/reference/data.json b/src/routes/solid-start/reference/data.json index 06ea1be4f..46e12d0dc 100644 --- a/src/routes/solid-start/reference/data.json +++ b/src/routes/solid-start/reference/data.json @@ -1,10 +1,4 @@ { "title": "Reference", - "pages": [ - "entrypoints", - "config", - "routing", - "client", - "server" - ] -} \ No newline at end of file + "pages": ["entrypoints", "config", "routing", "client", "server"] +} diff --git a/src/routes/solid-start/reference/entrypoints/app-config.mdx b/src/routes/solid-start/reference/entrypoints/app-config.mdx index cb6b4ece4..837a7f5f0 100644 --- a/src/routes/solid-start/reference/entrypoints/app-config.mdx +++ b/src/routes/solid-start/reference/entrypoints/app-config.mdx @@ -1,5 +1,15 @@ --- title: app.config.ts +use_cases: "initial setup, project configuration, build settings, deployment configuration" +tags: + - configuration + - setup + - app-config + - defineconfig +version: "1.0" +description: >- + Configure your SolidStart app with app.config.ts. Central configuration file + for Vite, Vinxi, and Nitro build settings. --- The `app.config.ts` is the root of every SolidStart app and the main point of configuration. diff --git a/src/routes/solid-start/reference/entrypoints/app.mdx b/src/routes/solid-start/reference/entrypoints/app.mdx index 88932bfe3..c94a47b92 100644 --- a/src/routes/solid-start/reference/entrypoints/app.mdx +++ b/src/routes/solid-start/reference/entrypoints/app.mdx @@ -1,5 +1,19 @@ --- title: app.tsx +use_cases: >- + routing setup, app structure, layout definition, navigation setup, entry point + configuration +tags: + - routing + - app + - entry + - layout + - navigation + - components +version: "1.0" +description: >- + Define your SolidStart app's entry point and routing structure. Set up + navigation, layouts, and isomorphic application logic. --- The `App` component is the isomorphic (shared on server and browser) entry point into your application. diff --git a/src/routes/solid-start/reference/entrypoints/data.json b/src/routes/solid-start/reference/entrypoints/data.json index 9f9e25082..bfc52c7bb 100644 --- a/src/routes/solid-start/reference/entrypoints/data.json +++ b/src/routes/solid-start/reference/entrypoints/data.json @@ -1,9 +1,4 @@ { "title": "Entrypoints", - "pages": [ - "app-config.mdx", - "app.mdx", - "entry-client.mdx", - "entry-server.mdx" - ] -} \ No newline at end of file + "pages": ["app-config.mdx", "app.mdx", "entry-client.mdx", "entry-server.mdx"] +} diff --git a/src/routes/solid-start/reference/entrypoints/entry-client.mdx b/src/routes/solid-start/reference/entrypoints/entry-client.mdx index 42130e6ed..be69033c2 100644 --- a/src/routes/solid-start/reference/entrypoints/entry-client.mdx +++ b/src/routes/solid-start/reference/entrypoints/entry-client.mdx @@ -1,8 +1,22 @@ --- title: entry-client.tsx +use_cases: >- + browser initialization, client-only code, service workers, mounting app, spa + setup +tags: + - entry + - client + - browser + - initialization + - mount + - startup +version: "1.0" +description: >- + Configure browser entry point for SolidStart apps. Set up client-side + initialization, mount components, and register service workers. --- -`entry-client.tsx` is where an application starts in the browser. +`entry-client.tsx` is where an application starts in the browser. It does this by passing [``](/solid-start/reference/client/start-client) and a DOM Element (the mounting point), to the [`mount`](/solid-start/reference/client/mount) function. ```tsx @@ -11,5 +25,5 @@ import { mount, StartClient } from "@solidjs/start/client"; mount(() => , document.getElementById("app")!); ``` -This file is an ideal place to run any client specific code that is needed on startup, such as registering service workers. +This file is an ideal place to run any client specific code that is needed on startup, such as registering service workers. This is important if you are performing client-only rendering or using other modes of server-side rendering. diff --git a/src/routes/solid-start/reference/entrypoints/entry-server.mdx b/src/routes/solid-start/reference/entrypoints/entry-server.mdx index ba9e09adf..69d881844 100644 --- a/src/routes/solid-start/reference/entrypoints/entry-server.mdx +++ b/src/routes/solid-start/reference/entrypoints/entry-server.mdx @@ -1,10 +1,24 @@ --- title: entry-server.tsx +use_cases: >- + server initialization, ssr setup, html document structure, meta tags, server + bootstrap +tags: + - entry + - server + - ssr + - initialization + - document + - html +version: "1.0" +description: >- + Define server entry point and HTML document structure for SolidStart. + Configure SSR modes and set up server-side rendering bootstrap. --- `entry-server.tsx` is where an application starts on the server. This happens by `entry-server.tsx` providing a document component to [``](/solid-start/reference/server/start-server) and passing it into [`createHandler`](/solid-start/reference/server/create-handler) for server side rendering. - A typical `entry-server.tsx` for a new project looks like this: +A typical `entry-server.tsx` for a new project looks like this: ```tsx import { createHandler, StartServer } from "@solidjs/start/server"; diff --git a/src/routes/solid-start/reference/routing/data.json b/src/routes/solid-start/reference/routing/data.json index 78da7ad05..2fbd5efaa 100644 --- a/src/routes/solid-start/reference/routing/data.json +++ b/src/routes/solid-start/reference/routing/data.json @@ -1,6 +1,4 @@ { "title": "Routing", - "pages": [ - "file-routes.mdx" - ] -} \ No newline at end of file + "pages": ["file-routes.mdx"] +} diff --git a/src/routes/solid-start/reference/routing/file-routes.mdx b/src/routes/solid-start/reference/routing/file-routes.mdx index 929ece30a..acbe98fc0 100644 --- a/src/routes/solid-start/reference/routing/file-routes.mdx +++ b/src/routes/solid-start/reference/routing/file-routes.mdx @@ -1,5 +1,19 @@ --- title: FileRoutes +use_cases: >- + file-based routing, automatic route generation, spa routing, route + configuration +tags: + - routing + - files + - routes + - navigation + - filesystem + - spa +version: "1.0" +description: >- + Automatically generate routes from file structure in SolidStart. Create route + configurations from files in the /src/routes directory. --- `FileRoutes` is a component that creates a [`Route`](/solid-router/reference/components/route) for each file in the `/src/routes` directory. diff --git a/src/routes/solid-start/reference/server/create-handler.mdx b/src/routes/solid-start/reference/server/create-handler.mdx index 1bf21a54d..03400e270 100644 --- a/src/routes/solid-start/reference/server/create-handler.mdx +++ b/src/routes/solid-start/reference/server/create-handler.mdx @@ -1,5 +1,19 @@ --- title: createHandler +use_cases: >- + ssr mode configuration, server startup, streaming setup, async rendering, + performance tuning +tags: + - handler + - ssr + - server + - streaming + - async + - rendering +version: "1.0" +description: >- + Configure server-side rendering modes in SolidStart. Choose between sync, + async, or streaming SSR for optimal performance and UX. --- The `createHandler` is used to start the server in [`entry-server.tsx`](/solid-start/reference/entrypoints/entry-server). diff --git a/src/routes/solid-start/reference/server/create-middleware.mdx b/src/routes/solid-start/reference/server/create-middleware.mdx index 5d2b3204f..edc17f9b6 100644 --- a/src/routes/solid-start/reference/server/create-middleware.mdx +++ b/src/routes/solid-start/reference/server/create-middleware.mdx @@ -1,5 +1,19 @@ --- title: createMiddleware +use_cases: >- + request interception, logging, authentication checks, cors setup, response + modification, api middleware +tags: + - middleware + - request + - response + - lifecycle + - interceptor + - hooks +version: "1.0" +description: >- + Add middleware to SolidStart request lifecycle. Intercept requests and + responses for logging, auth, CORS, and custom processing. --- `createMiddleware` creates a configuration object for SolidStart that specifies when middleware functions are executed during the request lifecycle. diff --git a/src/routes/solid-start/reference/server/get-server-function-meta.mdx b/src/routes/solid-start/reference/server/get-server-function-meta.mdx index 9ce998d4b..a4b4f7df6 100644 --- a/src/routes/solid-start/reference/server/get-server-function-meta.mdx +++ b/src/routes/solid-start/reference/server/get-server-function-meta.mdx @@ -1,5 +1,19 @@ --- title: getServerFunctionMeta +use_cases: >- + server function identification, parallel processing, worker management, + caching, multi-core apps +tags: + - server + - functions + - metadata + - parallel + - workers + - cache +version: "1.0" +description: >- + Get stable IDs for server functions across parallel instances. Enable caching + and state management in multi-core SolidStart apps. --- `getServerFunctionMeta` returns a function-specific id string, that is stable across all instances when server functions are run in parallel on multiple CPU cores or workers. diff --git a/src/routes/solid-start/reference/server/get.mdx b/src/routes/solid-start/reference/server/get.mdx index 9a011bdef..67b468e9f 100644 --- a/src/routes/solid-start/reference/server/get.mdx +++ b/src/routes/solid-start/reference/server/get.mdx @@ -1,8 +1,22 @@ --- title: GET +use_cases: >- + http caching, rest api, data fetching, cache headers, seo optimization, cdn + caching +tags: + - http + - get + - cache + - api + - rest + - fetch +version: "1.0" +description: >- + Create cacheable GET server functions in SolidStart. Leverage HTTP cache + headers for improved performance and SEO optimization. --- -`GET` helps to create a server function which is accessed via an [HTTP GET request](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET). +`GET` helps to create a server function which is accessed via an [HTTP GET request](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET). When this function is called, arguments are serialized into the URL, thus allowing the use of [HTTP cache-control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) headers. For example, `GET` can be used to make a streaming promise with a 60 second cache life: diff --git a/src/routes/solid-start/reference/server/http-header.mdx b/src/routes/solid-start/reference/server/http-header.mdx index 2a0dd7ad3..bec110da1 100644 --- a/src/routes/solid-start/reference/server/http-header.mdx +++ b/src/routes/solid-start/reference/server/http-header.mdx @@ -1,5 +1,19 @@ --- title: HttpHeader +use_cases: >- + security headers, cors configuration, cache control, seo headers, custom + headers, api responses +tags: + - headers + - http + - response + - security + - cors + - meta +version: "1.0" +description: >- + Set custom HTTP headers in SolidStart responses. Configure security, caching, + CORS, and SEO headers for server-rendered pages. --- `HttpHeader` provides a way to set headers on HTTPs response sent by the server. @@ -25,7 +39,7 @@ export default function NotFound() { } ``` -As a page is rendered, you may want to add additional HTTP headers to the response and the `HttpHeader` component will do that for you. +As a page is rendered, you may want to add additional HTTP headers to the response and the `HttpHeader` component will do that for you. By passing it a `name` and `value`, they will get added to the `Response` headers sent back to the browser. When streaming responses with [`renderToStream`](/reference/rendering/render-to-stream), HTTP headers can only be added before the stream is first flushed. diff --git a/src/routes/solid-start/reference/server/http-status-code.mdx b/src/routes/solid-start/reference/server/http-status-code.mdx index 71b9d9b3a..cc22c8ce6 100644 --- a/src/routes/solid-start/reference/server/http-status-code.mdx +++ b/src/routes/solid-start/reference/server/http-status-code.mdx @@ -1,5 +1,19 @@ --- title: HttpStatusCode +use_cases: >- + error pages, 404 handling, seo optimization, api responses, error boundaries, + status codes +tags: + - status + - http + - errors + - "404" + - seo + - response +version: "1.0" +description: >- + Set HTTP status codes for SolidStart pages. Handle 404s, errors, and optimize + SEO with proper status codes in server responses. --- `HttpStatusCode` sets the HTTP status code for the page response while server-side rendering. @@ -13,13 +27,13 @@ import { HttpStatusCode } from "@solidjs/start"; ## Setting a 404 status code for the unmatched routes As a page is rendered, you may want to set the status code to the `Response` depending on what happens. -The `HttpStatusCode` component does this for you by taking the `code` passed in and setting it to the `Response` status in the browser. +The `HttpStatusCode` component does this for you by taking the `code` passed in and setting it to the `Response` status in the browser. -Since `HttpStatusCode` is just a component, it can be used with [`ErrorBoundary`](/reference/components/error-boundary), [`Show`](/reference/components/show), [`Switch`](/reference/components/switch-and-match) or any of the other JSX control-flow components. +Since `HttpStatusCode` is just a component, it can be used with [`ErrorBoundary`](/reference/components/error-boundary), [`Show`](/reference/components/show), [`Switch`](/reference/components/switch-and-match) or any of the other JSX control-flow components. This means the same logic used when deciding what to render can inform what status code you are setting, allowing that logic to sit together. Status codes are important tools for things like caching and SEO, so it is a good practice to send meaningful status codes. - For example, for a `NotFound` page, you should send a `404` status code. +For example, for a `NotFound` page, you should send a `404` status code. ```tsx {6} title="routes/*404.tsx" import { HttpStatusCode } from "@solidjs/start"; @@ -36,11 +50,11 @@ export default function NotFound() { ## Setting a 404 status code for missing pages for dynamic routes -When using dynamic params in routes, setting a 404 status code if the given parameter for a segment points to a missing resource is important. -Usually, the param is discovered to be missing when doing an async request with that parameter. +When using dynamic params in routes, setting a 404 status code if the given parameter for a segment points to a missing resource is important. +Usually, the param is discovered to be missing when doing an async request with that parameter. Errors can be thrown from inside these fetchers and caught by the nearest [``](/reference/components/error-boundary) component from where the data is accessed. -`` pairs very well with error boundaries because you can inspect the error in the ErrorBoundary's fallback. +`` pairs very well with error boundaries because you can inspect the error in the ErrorBoundary's fallback. If the fetcher throws an error indicating the data was not found, you can render ``. Note that when streaming responses [`renderStream`](/reference/rendering/render-to-stream), the HTTP Status can only be included if added _before_ the stream first flushed. diff --git a/src/routes/solid-start/reference/server/start-server.mdx b/src/routes/solid-start/reference/server/start-server.mdx index 4d0fd3965..285ad8b08 100644 --- a/src/routes/solid-start/reference/server/start-server.mdx +++ b/src/routes/solid-start/reference/server/start-server.mdx @@ -1,5 +1,19 @@ --- -title: "StartServer" +title: StartServer +use_cases: >- + server bootstrap, document setup, html structure, ssr configuration, server + initialization +tags: + - server + - bootstrap + - document + - ssr + - initialization + - html +version: "1.0" +description: >- + Bootstrap SolidStart server with document components. Convert document + functions to static HTML for server-side rendering setup. --- `StartServer` takes a function returning a document component and converts it to a static document which can be used in [`createHandler`](/solid-start/reference/server/create-handler) to bootstrap the server. diff --git a/src/routes/solid-start/reference/server/use-server.mdx b/src/routes/solid-start/reference/server/use-server.mdx index 87dbad035..e228d2373 100644 --- a/src/routes/solid-start/reference/server/use-server.mdx +++ b/src/routes/solid-start/reference/server/use-server.mdx @@ -1,16 +1,43 @@ --- title: '"use server"' +use_cases: >- + server-only logic, api endpoints, database operations, secure operations, data + fetching, server actions, rpc calls, authentication logic +tags: + - server + - rpc + - api + - data-fetching + - actions + - security + - database +version: "1.0" +description: >- + Create server-only functions in SolidStart using 'use server' directive. + Handle database operations, API calls, and secure logic on the server. --- -`"use server"` will enable functions that only run on the server. +`"use server"` enables functions or files to be executed only on the server. Server functions allow client components to call code that is executed in the server context. ```tsx +// Function-level const logHello = async (message: string) => { "use server"; console.log(message); }; ``` +Or when using at the top of a file. + +```tsx +// File-level +"use server"; + +const logHello = async (message: string) => { + console.log(message); +}; +``` + **Note:** `"use server"` functions must be marked async or return a promise. ## Basic usage @@ -44,35 +71,35 @@ In both examples, the `logHello` function will only show in the server console, ## Usage with Data APIs -Server functions can be used for fetching data and performing actions on the server. +Server functions can be used for fetching data and performing actions on the server. The following examples show how to use server functions alongside solid-router's data APIs. ```tsx {3} const getUser = query((id) => { - "use server"; - return db.getUser(id); + "use server"; + return db.getUser(id); }, "users"); const updateUser = action(async (id, data) => { - "use server" - await db.setUser(id, data); - throw redirect("/", { revalidate: getUser.keyFor(id) }); + "use server"; + await db.setUser(id, data); + throw redirect("/", { revalidate: getUser.keyFor(id) }); }); - ``` -When `getUser` or `updateUser` are invoked on the client, an http request will be made to the server, which calls the corresponding server function. +When `getUser` or `updateUser` are triggered on the client, an http request will be made to the server, which calls the corresponding server function. ## Single-flight mutations -In the above example, when the `updateUser` action is called, a redirect is thrown on the server. -Solid Start can handle this redirect on the server instead of propagating it to the client. +In the above example, when the `updateUser` action is called, a redirect is thrown on the server. +Solid Start can handle this redirect on the server instead of propagating it to the client. The data for the redirected page is fetched and streamed to the client in the same http request as the `updateUser` action, rather than the client requiring a separate http request for the redirected page. ## Serialization Server functions allow the serialization of many different data types in the response, using the Seroval serializer. -The full list is available [in Seroval's source code](https://github.com/lxsmnsyc/seroval/blob/main/docs/compatibility.md#supported-types). +For supported types, defaults, and CSP tradeoffs, see the [Serialization guide](/solid-start/advanced/serialization). +Configure serialization mode and CSP behavior in [`defineConfig`](/solid-start/reference/config/define-config#serialization). ## Meta information diff --git a/src/solidbase-theme/Layout.tsx b/src/solidbase-theme/Layout.tsx index ba9b62e1e..8c88005ff 100644 --- a/src/solidbase-theme/Layout.tsx +++ b/src/solidbase-theme/Layout.tsx @@ -6,17 +6,13 @@ import { NotFound } from "~/ui/not-found"; import { I18nProvider } from "~/i18n/i18n-context"; import { useThemeListener } from "@kobalte/solidbase/client"; import { usePace } from "@kobalte/solidbase/default-theme/pace.js"; -import { Title } from "@solidjs/meta"; -import { useProjectTitle } from "~/ui/use-project"; export default function (props: RouteSectionProps) { useThemeListener(); usePace(); - const projectTitle = useProjectTitle(); return ( - {projectTitle()} }> {props.children} diff --git a/src/solidbase-theme/mdx-components.tsx b/src/solidbase-theme/mdx-components.tsx index 28a3a1107..b00b7f05b 100644 --- a/src/solidbase-theme/mdx-components.tsx +++ b/src/solidbase-theme/mdx-components.tsx @@ -234,7 +234,7 @@ export const pre = (props: ParentProps) => { export const code = (props: ParentProps) => { return ( {props.children} diff --git a/src/ui/button-link.tsx b/src/ui/button-link.tsx index e9058e12d..5bfe0d0b5 100644 --- a/src/ui/button-link.tsx +++ b/src/ui/button-link.tsx @@ -1,3 +1,4 @@ +import { splitProps } from "solid-js"; import { A, type RouterLinkProps } from "./i18n-anchor"; type ButtonLinkProps = RouterLinkProps & { @@ -5,16 +6,18 @@ type ButtonLinkProps = RouterLinkProps & { }; export const ButtonLink = (props: ButtonLinkProps) => { + const [localProps, otherProps] = splitProps(props, ["variant"]); + return ( ); }; diff --git a/src/ui/callout.tsx b/src/ui/callout.tsx index 9878c4266..4f9fd060d 100644 --- a/src/ui/callout.tsx +++ b/src/ui/callout.tsx @@ -1,4 +1,3 @@ -import { Alert } from "@kobalte/core"; import { Icon } from "solid-heroicons"; import { mergeProps, type JSX, Show, untrack } from "solid-js"; import { @@ -91,7 +90,7 @@ export function Callout(props: CalloutProps) { const IconComponent = icons[iconType]; return ( -
    - +
    ); } diff --git a/src/ui/docs-layout.tsx b/src/ui/docs-layout.tsx index fda9b86a0..efe630de8 100644 --- a/src/ui/docs-layout.tsx +++ b/src/ui/docs-layout.tsx @@ -1,11 +1,9 @@ import { Show, onMount, JSX } from "solid-js"; import { useLocation } from "@solidjs/router"; -import { Title } from "@solidjs/meta"; import { coreEntries } from "solid:collection"; import { Pagination } from "~/ui/pagination"; import { EditPageLink } from "./edit-page-link"; import { PageIssueLink } from "./page-issue-link"; -import { useProjectTitle } from "./use-project"; interface DocsLayoutProps { entries: typeof coreEntries; @@ -14,7 +12,6 @@ interface DocsLayoutProps { export const DocsLayout = (props: DocsLayoutProps) => { const location = useLocation(); - const projectTitle = useProjectTitle(); const collection = () => location.pathname.includes("/reference/") @@ -41,9 +38,6 @@ export const DocsLayout = (props: DocsLayoutProps) => { return ( <> - SolidDocs}> - {(title) => {`${title()} - ${projectTitle()}`}} -
    {(t) => ( @@ -62,7 +56,7 @@ export const DocsLayout = (props: DocsLayoutProps) => { -
    {props.children}
    +
    {props.children}
    diff --git a/src/ui/eraser-link/index.tsx b/src/ui/eraser-link/index.tsx index 76bdd6f46..f0e3bfcc0 100644 --- a/src/ui/eraser-link/index.tsx +++ b/src/ui/eraser-link/index.tsx @@ -67,6 +67,7 @@ const EraserLink = ( class="relative inline-block" target="_blank" rel="noopener noreferrer" + aria-label="View diagram on Eraser.io" > {""} setIsLoaded(true)} /> {isLoaded() ? ( diff --git a/src/ui/layout.tsx b/src/ui/layout.tsx index 74d52a96e..7d18820c5 100644 --- a/src/ui/layout.tsx +++ b/src/ui/layout.tsx @@ -157,7 +157,10 @@ export const Layout: ParentComponent<{ isError?: boolean }> = (props) => {
    -
    +
    { return ( - + diff --git a/src/ui/logo.tsx b/src/ui/logo.tsx index 3de2faba9..97a1fd58a 100644 --- a/src/ui/logo.tsx +++ b/src/ui/logo.tsx @@ -4,7 +4,6 @@ import { Match, Switch } from "solid-js"; const SolidLogo = (props: { class?: string }) => ( <"endpoint" | "api_key", string | null>) { - return endpoint && api_key - ? new OramaClient({ - endpoint, - api_key, + projectId, + apiKey, +}: Record<"projectId" | "apiKey", string | null>) { + return projectId && apiKey + ? new OramaCloud({ + projectId, + apiKey, }) : null; } -type OramaResult = { - hits: { - document: OramaDocument; - }[]; -}; - type OramaDocument = { content: string; path: string; @@ -41,8 +35,8 @@ type OramaDocument = { }; const client = getOramaClient({ - endpoint: import.meta.env.VITE_ORAMA_ENDPOINT ?? null, - api_key: import.meta.env.VITE_ORAMA_API_KEY ?? null, + projectId: import.meta.env.VITE_ORAMA_PROJECT_ID ?? null, + apiKey: import.meta.env.VITE_ORAMA_PUBLIC_API_KEY ?? null, }); export function Search() { @@ -58,11 +52,22 @@ export function Search() { async () => { const _searchTerm = searchTerm(); if (!_searchTerm) return {}; - const result: OramaResult | null = await client.search({ + const result = (await client.search({ term: _searchTerm, mode: "fulltext", - }); + datasources: [], + })) as SearchResult; if (!result) return {}; + + const seen: Record = {}; + result.hits = result.hits.filter((hit) => { + hit.document.path = hit.document.path.replace("/index#", "#"); + if (!seen[hit.document.path]) { + seen[hit.document.path] = true; + return hit; + } + }); + const groupedHits = result.hits.reduce( (groupedHits, hit) => { const section = hit.document.section.replace( @@ -75,7 +80,7 @@ export function Search() { groupedHits[section].push(hit); return groupedHits; }, - {} as Record + {} as Record["hits"]> ); setActive(0); setResultRefs([]); @@ -237,8 +242,10 @@ export function Search() { {([section, hits]) => (
    -

    - {section} +

    + {section + .replace(/^Enum\('(.+)'\)$/, "$1") + .replace(/-/g, " ")}

      @@ -823,8 +830,7 @@ function KeyboardShortcut(props: { key: string; class?: string }) { return ( diff --git a/src/ui/use-project.ts b/src/ui/use-project.ts index 089391389..e104929e7 100644 --- a/src/ui/use-project.ts +++ b/src/ui/use-project.ts @@ -1,4 +1,4 @@ -import { createEffect, createSignal, type Accessor } from "solid-js"; +import { createRenderEffect, createSignal, type Accessor } from "solid-js"; import { useMatch } from "@solidjs/router"; import { SUPPORTED_LOCALES } from "~/i18n/config"; import { useI18n } from "~/i18n/i18n-context"; @@ -19,7 +19,7 @@ export function useProjectTitle(): Accessor { const project = useProject(); const i18n = useI18n(); - createEffect(() => { + createRenderEffect(() => { switch (project()) { case "solid-start": setTitle(i18n.t("meta.title.solid_start"));