From 30b5602d06391111b86cc2d0b9f1842bf9d57ac9 Mon Sep 17 00:00:00 2001 From: Jiwon Kwon Date: Sat, 10 Oct 2026 15:28:51 +0900 Subject: [PATCH 1/6] Add VitePress documentation site Add documentation pages, a theme based on DrFed's existing visual style, and mise tasks for development, builds, and previews. Include the VitePress dependency, lockfile update, project logo, and generated-output ignore rules. AI provenance: I asked Codex to create a VitePress docs directory and apply DrFed's visual style after reading CONTRIBUTING.md. Codex generated the configuration, theme, initial documentation, and workflow integration. I revised the home page and replaced the getting-started guide with a manual-installation page. Codex updated navigation to match and corrected a typo. Codex verified the documentation and application builds and repository checks. Assisted-by: Codex:gpt-6-sol --- .gitignore | 5 + README.md | 12 + docs/.vitepress/config.mts | 51 + docs/.vitepress/theme/custom.css | 165 +++ docs/.vitepress/theme/index.ts | 21 + docs/index.md | 22 + docs/installation/manual-installation.md | 4 + docs/public/icon.svg | 395 ++++++++ docs/tsconfig.json | 10 + mise.toml | 13 + package.json | 6 +- pnpm-lock.yaml | 1175 ++++++++++++++++++++-- 12 files changed, 1812 insertions(+), 67 deletions(-) create mode 100644 docs/.vitepress/config.mts create mode 100644 docs/.vitepress/theme/custom.css create mode 100644 docs/.vitepress/theme/index.ts create mode 100644 docs/index.md create mode 100644 docs/installation/manual-installation.md create mode 100644 docs/public/icon.svg create mode 100644 docs/tsconfig.json diff --git a/.gitignore b/.gitignore index 82a8184..a18724b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,12 @@ __generated__/ mise.local.toml node_modules/ packages/*/dist/ +<<<<<<< HEAD packages/drfed/completions/ +======= +docs/.vitepress/cache/ +docs/.vitepress/dist/ +>>>>>>> ef78c39 (Add VitePress documentation site) index.db diff --git a/README.md b/README.md index 90dbf8b..b95a85b 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ credential files and shutdown behavior. All four commands accept the same explicit configuration file and the relevant `DRFED_*` variables. +<<<<<<< HEAD Development builds ------------------ @@ -116,3 +117,14 @@ Install the latest successful development build with stable `latest` channel. Tagged prereleases use `next`. See [the contributor release guide](./CONTRIBUTING.md#automated-npm-and-github-releases) for verification, setup, and recovery procedures. +======= +Documentation +------------- + +The documentation site lives in *docs/* and uses [VitePress]. After +`mise install`, run `mise run dev:docs` to start it locally. Run +`mise run build:docs` to build the static site and `mise run preview:docs` to +preview the result. + +[VitePress]: https://vitepress.dev/ +>>>>>>> ef78c39 (Add VitePress documentation site) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..f99fd58 --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,51 @@ +// DrFed: A web-based platform for developing and debugging ActivityPub apps +// Copyright (C) 2026 DrFed team +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { defineConfig } from "vitepress"; + +export default defineConfig({ + lang: "en-US", + title: "DrFed", + description: + "Documentation for DrFed, a web-based platform for developing and debugging ActivityPub apps.", + head: [["link", { rel: "icon", type: "image/svg+xml", href: "/icon.svg" }]], + themeConfig: { + logo: { src: "/icon.svg", alt: "" }, + nav: [{ text: "Installation", link: "/installation/manual-installation" }], + sidebar: [ + { + text: "Installation", + items: [ + { + text: "Manual installation", + link: "/installation/manual-installation", + }, + ], + }, + ], + search: { provider: "local" }, + socialLinks: [ + { icon: "github", link: "https://github.com/fedify-dev/drfed" }, + ], + editLink: { + pattern: "https://github.com/fedify-dev/drfed/edit/main/docs/:path", + }, + footer: { + message: "Licensed under the GNU AGPL v3 or later.", + copyright: "Copyright © 2026 DrFed team", + }, + }, +}); diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css new file mode 100644 index 0000000..2d6daab --- /dev/null +++ b/docs/.vitepress/theme/custom.css @@ -0,0 +1,165 @@ +/* +DrFed: A web-based platform for developing and debugging ActivityPub apps +Copyright (C) 2026 DrFed team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +:root { + --vp-font-family-base: system-ui, -apple-system, "Segoe UI", sans-serif; + --vp-font-family-mono: + ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; + --drfed-font-serif: Georgia, "Times New Roman", serif; + + --vp-c-bg: #fdfcfb; + --vp-c-bg-alt: #f4f2f0; + --vp-c-bg-elv: #ffffff; + --vp-c-bg-soft: #f5f3f1; + --vp-c-text-1: #26211f; + --vp-c-text-2: #6a615c; + --vp-c-text-3: #756b65; + --vp-c-divider: #e9e5e1; + --vp-c-border: #dad4cf; + --vp-c-gutter: #e9e5e1; + --vp-c-brand-1: #b83254; + --vp-c-brand-2: #c23a5c; + --vp-c-brand-3: #b83254; + --vp-c-brand-soft: #f7e3e7; + --vp-c-default-1: #dad4cf; + --vp-c-default-2: #e9e5e1; + --vp-c-default-3: #f4f2f0; + --vp-c-default-soft: #f4f2f0; + + --vp-home-hero-name-color: var(--vp-c-brand-1); + --vp-button-alt-border: var(--vp-c-border); + --vp-button-alt-hover-border: var(--vp-c-brand-1); + --vp-nav-height: 68px; +} + +.dark { + --vp-c-bg: #181613; + --vp-c-bg-alt: #1e1b17; + --vp-c-bg-elv: #201d19; + --vp-c-bg-soft: #272420; + --vp-c-text-1: #f0ece8; + --vp-c-text-2: #bab1aa; + --vp-c-text-3: #a39990; + --vp-c-divider: #332f2a; + --vp-c-border: #453f39; + --vp-c-gutter: #332f2a; + --vp-c-brand-1: #f78da4; + --vp-c-brand-2: #ef6a88; + --vp-c-brand-3: #f78da4; + --vp-c-brand-soft: #322a27; + --vp-c-default-1: #453f39; + --vp-c-default-2: #332f2a; + --vp-c-default-3: #272420; + --vp-c-default-soft: #272420; + --vp-button-brand-text: #26211f; + --vp-button-brand-hover-text: #26211f; + --vp-button-brand-active-text: #26211f; +} + +.VPNavBarTitle .title { + font-family: var(--drfed-font-serif); + font-size: 24px; + letter-spacing: -0.03em; +} + +.VPNavBarTitle .logo { + height: 32px; + border-radius: 50%; +} + +.VPHero .name { + font-family: var(--vp-font-family-mono); + font-size: 14px; + font-weight: 500; + letter-spacing: 0.14em; + line-height: 1.6; + text-transform: uppercase; +} + +.VPHero .text { + margin-top: 20px; + max-width: 760px; + font-family: var(--drfed-font-serif); + font-size: clamp(40px, 5.5vw, 72px); + font-weight: 400; + letter-spacing: -0.045em; + line-height: 1.08; +} + +.VPHero .tagline { + max-width: 540px; + padding-top: 24px; + font-size: 18px; + line-height: 1.65; +} + +.VPButton { + border-radius: 999px; +} + +.VPFeature { + border-color: var(--vp-c-divider); + border-radius: 14px; + background: var(--vp-c-bg-elv); +} + +.VPFeature .title { + font-family: var(--drfed-font-serif); + font-size: 22px; + font-weight: 400; + letter-spacing: -0.02em; +} + +.VPFeature .details { + margin-top: 8px; + line-height: 1.7; +} + +.vp-doc h1, +.vp-doc h2 { + font-family: var(--drfed-font-serif); + font-weight: 400; + letter-spacing: -0.025em; +} + +.vp-doc h1 { + font-size: clamp(34px, 4vw, 44px); + line-height: 1.15; +} + +.vp-doc h2 { + font-size: 28px; +} + +.vp-doc p, +.vp-doc li { + line-height: 1.75; +} + +.vp-doc div[class*="language-"] { + border: 1px solid var(--vp-c-divider); + border-radius: 12px; +} + +.VPSidebarItem.is-active > .item .link > .text { + font-weight: 700; +} + +.VPFooter { + background: var(--vp-c-bg-alt); +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..a7e1a93 --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,21 @@ +// DrFed: A web-based platform for developing and debugging ActivityPub apps +// Copyright (C) 2026 DrFed team +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import DefaultTheme from "vitepress/theme-without-fonts"; + +import "./custom.css"; + +export default DefaultTheme; diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..ee065ae --- /dev/null +++ b/docs/index.md @@ -0,0 +1,22 @@ +--- +layout: home + +hero: + name: ActivityPub Debugging Platform + text: Debugging tools for the fediverse. + tagline: DrFed is a web-based platform for developing and debugging ActivityPub implementations—inspecting objects and activities, and tracing where federation fails. It is built by the team behind Fedify. + actions: + - theme: brand + text: Install + link: /installation/manual-installation + - theme: alt + text: View on GitHub + link: https://github.com/fedify-dev/drfed + +features: + - title: Contribute to DrFed + details: Find package boundaries, coding conventions, and required checks. + link: https://github.com/fedify-dev/drfed/blob/main/CONTRIBUTING.md + linkText: Contributor guide +--- + diff --git a/docs/installation/manual-installation.md b/docs/installation/manual-installation.md new file mode 100644 index 0000000..e3b413a --- /dev/null +++ b/docs/installation/manual-installation.md @@ -0,0 +1,4 @@ +Manual installation +=================== + +Run DrFed on your own server to develop and debug ActivityPub apps. diff --git a/docs/public/icon.svg b/docs/public/icon.svg new file mode 100644 index 0000000..683340e --- /dev/null +++ b/docs/public/icon.svg @@ -0,0 +1,395 @@ + +DrFedDrFed2026-06-17Hong Minhee diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 0000000..1db18a6 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "Bundler", + "target": "ES2022", + "types": ["vitepress/client"] + }, + "include": [".vitepress/**/*.ts", ".vitepress/**/*.mts"] +} diff --git a/mise.toml b/mise.toml index 239e3e6..0d33b3a 100644 --- a/mise.toml +++ b/mise.toml @@ -40,6 +40,19 @@ depends = ["build:backend", "build:web"] run = "pnpm -F @drfed/drfed build" silent = "stdout" +[tasks."build:docs"] +description = "Build the VitePress documentation site" +run = "pnpm exec vitepress build docs" + +[tasks."dev:docs"] +description = "Run the VitePress documentation development server" +raw_args = true +run = "pnpm exec vitepress dev docs" + +[tasks."preview:docs"] +description = "Preview the built VitePress documentation site" +run = "pnpm exec vitepress preview docs" + [tasks."build:web"] description = "Build SolidStart frontend server" depends = [ diff --git a/package.json b/package.json index acc5004..f84a32f 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,18 @@ { "private": true, "devDependencies": { - "skills-npm": "catalog:", "@drfed/models": "workspace:*", "@electric-sql/pglite": "catalog:", "@logtape/logtape": "catalog:", "drizzle-orm": "catalog:", "@drfed/graphql": "workspace:*", "graphql": "catalog:", +<<<<<<< HEAD "@sacho/sacho": "0.3.2" +======= + "skills-npm": "catalog:", + "vitepress": "^1.6.4" +>>>>>>> ef78c39 (Add VitePress documentation site) }, "scripts": { "prepare": "skills-npm --recursive --yes --force && skills-npm --yes --force --no-cleanup" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fdf345..f7c2bf5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -155,6 +155,9 @@ importers: skills-npm: specifier: 'catalog:' version: 1.2.0 + vitepress: + specifier: ^1.6.4 + version: 1.6.4(@algolia/client-search@5.59.0)(@types/node@26.0.0)(lightningcss@1.33.0)(postcss@8.5.29)(search-insights@2.17.3)(terser@5.48.0)(typescript@7.0.2) packages/drfed: dependencies: @@ -461,13 +464,13 @@ importers: version: 1.0.0(solid-js@1.9.14) '@solidjs/start': specifier: ^2.0.0 - version: 2.0.0(@solidjs/router@1.0.0(solid-js@1.9.14))(crossws@0.4.10(srvx@0.11.16))(supports-color@7.2.0)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 2.0.0(@solidjs/router@1.0.0(solid-js@1.9.14))(crossws@0.4.10(srvx@0.11.16))(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) '@types/relay-runtime': specifier: ^20.1.1 version: 20.1.1 nitro: specifier: 3.0.260610-beta - version: 3.0.260610-beta(@electric-sql/pglite@0.5.3)(chokidar@5.0.0)(dotenv@17.4.2)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2)))(giget@3.3.0)(ioredis@5.11.1(supports-color@7.2.0))(jiti@2.7.0)(lru-cache@11.5.1)(rollup@4.62.2)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 3.0.260610-beta(@electric-sql/pglite@0.5.3)(chokidar@5.0.0)(dotenv@17.4.2)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2)))(giget@3.3.0)(ioredis@5.11.1)(jiti@2.7.0)(lru-cache@11.5.1)(rollup@4.62.2)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) relay-runtime: specifier: ^21.0.1 version: 21.0.1 @@ -495,7 +498,7 @@ importers: version: 26.0.0 eslint-plugin-solid: specifier: ^0.14.5 - version: 0.14.5(eslint@9.39.4(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@7.0.2) + version: 0.14.5(eslint@9.39.4(jiti@2.7.0))(typescript@7.0.2) relay-compiler: specifier: ^21.0.1 version: 21.0.1 @@ -514,6 +517,82 @@ importers: packages: + '@algolia/abtesting@1.25.0': + resolution: {integrity: sha512-rSTin9Uta23uaewYVQEp8XI9T3iA/zrg0/1G2vhf8oFFDxFL5vybnZ5IQwsVAg4JpKxPX4/WYNKdcfWrZymk7w==} + engines: {node: '>= 14.0.0'} + + '@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.59.0': + resolution: {integrity: sha512-bm2XN0hCSMYwStSsCBT0/PUB2BDxoyR1Lnub3c392HMEy9bi8PUSW8vR6zltVEKWG2t4PQFWMD5C07bmJxGgPg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.59.0': + resolution: {integrity: sha512-XOFPOTa69WuqHR6c5tMgnUUwwqQgNSzMpxmhrgA9KmxRf8WIqEa0cokHJvohk5CYb7CZx0xeSL6Bk2IUJ7Lv7Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.59.0': + resolution: {integrity: sha512-PC8ipLOYFKRTfIUY1J3FJxS6ryzWziaXmIX9/sNMoUR8L+XhF7hX2QAeUI87YVl5zujvlYTSOb+HAIqKXDjyHQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.59.0': + resolution: {integrity: sha512-yFNcCMM5fHiyoR0HuxMrzy+VjDcmhFUZTm2IJ2DHwGsVH3B5SEob4zTmeEZ3j/AZqNnmrJOCKl/tJnBg7+84bA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.59.0': + resolution: {integrity: sha512-GYja6HkDt2VrQhWmB2cLx3Z5fDwI9no7q+xwCWcFrTPm5CLH9QZvK0XLO9co1FcNIDxxkMaP3AXM39/XcecEOg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.59.0': + resolution: {integrity: sha512-Wofg7bMpWh8N5qDDZs0wy6whc+KMmdNsxgrIGp9Ug2s1Bka0uq7AjyckdxReKPHLA0Q1qH8X/SNh0wn2t2X2Lw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.59.0': + resolution: {integrity: sha512-fHnALZfbEnODczGk14Y/1YBRApp6UEpZUTexGcMUPzY7RDc7q4HN2Y6jh0KUG8Jo9B+q+wOoQEc3ziR0ErbuFg==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.59.0': + resolution: {integrity: sha512-Fa38s1mHgoaLCT117sfJ6P78rtxUt93CYxBYpq1VOIcslaF+cH+1h5uikAPsKfxLnsuEDZHiBiaI6eNPTsQMRA==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.59.0': + resolution: {integrity: sha512-NyNsRSqM2tF1MX7ZGw/j4rduoEJiQ5wfvbSo/CFVdEzYCjyxbGFRPOZyS/GETJG9rk1TdHOq8NZqKqk/u1fm4g==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.59.0': + resolution: {integrity: sha512-nXBK2uygWtvbCOffMWqqfjjcEtp9enDKY5/2Pw/Hhw8VVaOyK2ThbGK04bNX/Le+qoK1VHYkodWGVTKfw0Otkw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.59.0': + resolution: {integrity: sha512-yb+4afX/zja8QwX0KmV4/ae2kyYkRknsE79CRusYS2U5D8qwn2wq0cn1x12f3tm3F3+5FgmDdbuGdQTuCLSKMQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.59.0': + resolution: {integrity: sha512-Lp52TmpA1QtNmdHzs505Xwf4tgII7RAapkDSF9AAtWIBETcGaTIaXci4Rd9nS6SdaWK1BWTSqAPp5wzh6UN3Ag==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.59.0': + resolution: {integrity: sha512-YYHLEs5rC6oRTFwT7bJaKBR9NSFzikeVHGAT1ffATmUQzR8XqyhHXjoieAUoR7fBU6I5cfy1FVeh5GoRgriuzA==} + engines: {node: '>= 14.0.0'} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -619,6 +698,29 @@ packages: resolution: {integrity: sha512-ODhCGmElUPmR3IR+KZmBNkRAFyjJ01rxvk2E+/qQ2h2EGPJH5k6bz3N24ympGc5+i4YCGk/ipIpmkwc0+iSmRg==} engines: {node: '>=18.0'} + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + 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 + '@drizzle-team/brocli@0.11.0': resolution: {integrity: sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg==} @@ -655,6 +757,12 @@ packages: resolution: {integrity: sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==} engines: {node: '>=18.0.0'} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -667,6 +775,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -679,6 +793,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} @@ -691,6 +811,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -703,6 +829,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -715,6 +847,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -727,6 +865,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -739,6 +883,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -751,6 +901,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -763,6 +919,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -775,6 +937,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -787,6 +955,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} @@ -799,6 +973,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -811,6 +991,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -823,6 +1009,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -835,6 +1027,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -847,6 +1045,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -871,6 +1075,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -895,6 +1105,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -919,6 +1135,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -931,6 +1153,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -943,6 +1171,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -955,6 +1189,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -1138,6 +1378,12 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@iconify-json/simple-icons@1.2.99': + resolution: {integrity: sha512-kouZhqvUoNdxEe+lZksbJJZMCZv4b4Ob62O1GW3fcpz/I0mVPzM+9/Qf/DUuv5ns8l6c46D8M/ubhJjjbLp9HQ==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@internationalized/number@3.6.7': resolution: {integrity: sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==} @@ -1852,6 +2098,7 @@ packages: cpu: [x64] os: [win32] +<<<<<<< HEAD '@sacho/sacho-aarch64-apple-darwin@0.3.2': resolution: {integrity: sha512-uMYGjFwggsjDWst8VQ1Z853vmg7/FGMf2uU8gDMhpE5dWc95czOyySKqsWjVks9mA7UtdX/QFx4J6k/I5dBwcw==} cpu: [arm64] @@ -1886,19 +2133,32 @@ packages: resolution: {integrity: sha512-vHra5oIbq+IKK8ZzhqcprwWFnAJPDxkzj3AG/45//dp0sTE1PI0Qf3jYqkwRgC1nSDoG4Po38gj9HGJutIAkgQ==} engines: {node: '>=18'} hasBin: true +======= + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} +>>>>>>> ef78c39 (Add VitePress documentation site) '@shikijs/core@4.4.1': resolution: {integrity: sha512-VeR2CY6Nn9/WbisoYLOQZ7HZOnwTrpBuOw4wExjqLnBCi62BNWynBUO6K2uPIASPFJwAv7cX1fUu+LrPlSstcw==} engines: {node: '>=20'} + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + '@shikijs/engine-javascript@4.4.1': resolution: {integrity: sha512-6U4lJBh8LTvIkEVqRHv/rr3ruwtO6IweFQt1ME1ntHJMGHS+6N86vfYGO1o8c/DtOCTia2lfhdQBtBrps1sDfQ==} engines: {node: '>=20'} + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + '@shikijs/engine-oniguruma@4.4.1': resolution: {integrity: sha512-p23RugMKss0r5DAtRJW1yAXUDl60JvhQYV20yuxei//26JyDSJefV3umyWzzwep2weblMnJGDYahuti6XkcMgA==} engines: {node: '>=20'} + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + '@shikijs/langs@4.4.1': resolution: {integrity: sha512-xb2kCMloBCIraIy2fS5MW0t/BxVY3q2nDyQKBoeSeq6KNrQbShHetCFlw2n35fGIJ6t3+hXDLQogP5ir9O9bvA==} engines: {node: '>=20'} @@ -1907,10 +2167,19 @@ packages: resolution: {integrity: sha512-ko2OfDoG89YuQ7xL5LtcQiWKb7NIv1Ephb7g48TVU198OzAMLC8lXVEwaJGHK4sUMYrfAGJDqYmNLOLiW/Kz8w==} engines: {node: '>=20'} + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + '@shikijs/themes@4.4.1': resolution: {integrity: sha512-wudOaoFro+/Zl9gQv2W1Ur5XlVduqvTuYLI483Xi0wgc1A+cy1hfB2r6ac6ufBgF+ID7KJEW7L41MHrzQ4wH+w==} engines: {node: '>=20'} + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + '@shikijs/types@4.4.1': resolution: {integrity: sha512-GOwCLQDHM5EjGUWNPrhzJbr6JP8V/Dx/CDVkWvbZ1Avw5JFnNUckrgbLmE07qtg4WlW7Q7QFndhjIkeU9XMPvw==} engines: {node: '>=20'} @@ -2029,9 +2298,18 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.2.0': + resolution: {integrity: sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/micromatch@4.0.10': resolution: {integrity: sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==} @@ -2047,6 +2325,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@typescript-eslint/project-service@8.62.1': resolution: {integrity: sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2296,6 +2577,99 @@ packages: peerDependencies: '@upyo/core': 0.6.0 + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.43': + resolution: {integrity: sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==} + + '@vue/compiler-dom@3.5.43': + resolution: {integrity: sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==} + + '@vue/compiler-sfc@3.5.43': + resolution: {integrity: sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==} + + '@vue/compiler-ssr@3.5.43': + resolution: {integrity: sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==} + + '@vue/devtools-api@7.7.10': + resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==} + + '@vue/devtools-kit@7.7.10': + resolution: {integrity: sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==} + + '@vue/devtools-shared@7.7.10': + resolution: {integrity: sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==} + + '@vue/reactivity@3.5.43': + resolution: {integrity: sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==} + + '@vue/runtime-core@3.5.43': + resolution: {integrity: sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==} + + '@vue/runtime-dom@3.5.43': + resolution: {integrity: sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==} + + '@vue/server-renderer@3.5.43': + resolution: {integrity: sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==} + + '@vue/shared@3.5.43': + resolution: {integrity: sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==} + + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + '@whatwg-node/disposablestack@0.0.6': resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} engines: {node: '>=18.0.0'} @@ -2480,6 +2854,10 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + algoliasearch@5.59.0: + resolution: {integrity: sha512-wUXzaeI7B526W4y1gFg3lcxgDZ67XSgRJIiellYWOas/pLpO7rOtxm9Gr2E/C8aiSDXIgx1q5TdSsvK67Uakqw==} + engines: {node: '>= 14.0.0'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -2546,6 +2924,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + brace-expansion@1.1.15: resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} @@ -2634,6 +3015,10 @@ packages: cookie-es@3.1.1: resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + copy-anything@4.1.5: + resolution: {integrity: sha512-vePst2VLTSqPglW7Q98VwFpGiGpOHTyXIo81MO5VyLecA5zMbZw/P/V1vmwD1jksa2iJpn/YkDrJ3XhTfzUyhQ==} + engines: {node: '>=18'} + cosmiconfig@9.0.2: resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} engines: {node: '>=14'} @@ -2862,6 +3247,9 @@ packages: electron-to-chromium@1.5.399: resolution: {integrity: sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} @@ -2870,6 +3258,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -2901,6 +3293,11 @@ packages: es-toolkit@1.46.1: resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -2974,6 +3371,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -3047,6 +3447,9 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + fs-native-extensions@1.5.1: resolution: {integrity: sha512-abjiHKkYdcH5M9ikBEJb0MKb/fEpPtZx/yfLHzTptvUAoiFayX0tIe0BTLBU4SAoRyjZLzA0dP1Rn2p0+QRyVg==} @@ -3132,6 +3535,9 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} @@ -3384,6 +3790,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + mdast-util-to-hast@13.2.1: resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} @@ -3421,6 +3830,12 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3499,6 +3914,9 @@ packages: oniguruma-parser@0.12.2: resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} @@ -3547,6 +3965,9 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + pg-cloudflare@1.4.0: resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} @@ -3600,6 +4021,10 @@ packages: resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.29: + resolution: {integrity: sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -3620,6 +4045,14 @@ packages: resolution: {integrity: sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw==} engines: {node: '>=12'} + preact@10.29.8: + resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==} + peerDependencies: + preact-render-to-string: '>=5' + peerDependenciesMeta: + preact-render-to-string: + optional: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3697,6 +4130,9 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rolldown-plugin-dts@0.27.14: resolution: {integrity: sha512-ZvuDDwoIpRK9RPxDXratCpklFO9QZZWndf/sd0VBFb4LEj0jj07UcHK9OCh7V4XiFz2Z89ziyBC2K6tJiDjrbw==} engines: {node: ^22.18.0 || >=24.11.0} @@ -3735,6 +4171,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -3783,6 +4222,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + shiki@4.4.1: resolution: {integrity: sha512-rFP+iYKzjLEIqiMiKANhARqiAbk4deDhWnBtnUO/K0D0dPxMGDH4N0FVfBY/VeI+lPrV4wNGCHQZp7EOr7NNBw==} engines: {node: '>=20'} @@ -3843,6 +4285,10 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -3888,10 +4334,17 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + temporal-polyfill@1.0.4: resolution: {integrity: sha512-MLEU0qOD2uXlz24oINNtdLZQl8RgmMxSnRtKEGZGGetTJjlRwQJjk+VsJ4EREaUoiaTb8NJOcUiKtoAiWn9EBg==} @@ -4155,6 +4608,37 @@ packages: '@testing-library/jest-dom': optional: true + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@8.2.0: resolution: {integrity: sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4206,6 +4690,26 @@ packages: vite: optional: true + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + vue@3.5.43: + resolution: {integrity: sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -4261,6 +4765,118 @@ packages: snapshots: + '@algolia/abtesting@1.25.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0) + '@algolia/client-search': 5.59.0 + algoliasearch: 5.59.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)': + dependencies: + '@algolia/client-search': 5.59.0 + algoliasearch: 5.59.0 + + '@algolia/client-abtesting@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-analytics@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-common@5.59.0': {} + + '@algolia/client-insights@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-personalization@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-query-suggestions@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-search@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/ingestion@1.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/monitoring@1.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/recommend@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/requester-browser-xhr@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + + '@algolia/requester-fetch@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + + '@algolia/requester-node-http@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -4269,20 +4885,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7(supports-color@7.2.0)': + '@babel/core@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@7.2.0) + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4311,19 +4927,19 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) - '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -4344,9 +4960,9 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/runtime@7.29.7': {} @@ -4357,7 +4973,7 @@ snapshots: '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - '@babel/traverse@7.29.8(supports-color@7.2.0)': + '@babel/traverse@7.29.8': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 @@ -4365,7 +4981,7 @@ snapshots: '@babel/parser': 7.29.8 '@babel/template': 7.29.7 '@babel/types': 7.29.8 - debug: 4.4.3(supports-color@7.2.0) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -4398,6 +5014,31 @@ snapshots: ky: 1.14.3 undici: 6.29.0 + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.59.0)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.59.0)(search-insights@2.17.3) + preact: 10.29.8 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - preact-render-to-string + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.59.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0) + '@docsearch/css': 3.8.2 + algoliasearch: 5.59.0 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + '@drizzle-team/brocli@0.11.0': {} '@electric-sql/pglite@0.5.3': {} @@ -4451,102 +5092,153 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.25.12': optional: true '@esbuild/aix-ppc64@0.28.1': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true '@esbuild/android-arm64@0.28.1': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.25.12': optional: true '@esbuild/android-arm@0.28.1': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.25.12': optional: true '@esbuild/android-x64@0.28.1': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true '@esbuild/darwin-arm64@0.28.1': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true '@esbuild/darwin-x64@0.28.1': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true '@esbuild/freebsd-arm64@0.28.1': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true '@esbuild/freebsd-x64@0.28.1': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true '@esbuild/linux-arm64@0.28.1': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true '@esbuild/linux-arm@0.28.1': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true '@esbuild/linux-ia32@0.28.1': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true '@esbuild/linux-loong64@0.28.1': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-mips64el@0.28.1': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true '@esbuild/linux-ppc64@0.28.1': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true '@esbuild/linux-riscv64@0.28.1': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true '@esbuild/linux-s390x@0.28.1': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true @@ -4559,6 +5251,9 @@ snapshots: '@esbuild/netbsd-arm64@0.28.1': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true @@ -4571,6 +5266,9 @@ snapshots: '@esbuild/openbsd-arm64@0.28.1': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true @@ -4583,41 +5281,53 @@ snapshots: '@esbuild/openharmony-arm64@0.28.1': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true '@esbuild/sunos-x64@0.28.1': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true '@esbuild/win32-arm64@0.28.1': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true '@esbuild/win32-ia32@0.28.1': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0)(supports-color@7.2.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': dependencies: - eslint: 9.39.4(jiti@2.7.0)(supports-color@7.2.0) + eslint: 9.39.4(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.2(supports-color@7.2.0)': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 - debug: 4.4.3(supports-color@7.2.0) + debug: 4.4.3 minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -4630,10 +5340,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5(supports-color@7.2.0)': + '@eslint/eslintrc@3.3.5': dependencies: ajv: 6.15.0 - debug: 4.4.3(supports-color@7.2.0) + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -4830,6 +5540,12 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@iconify-json/simple-icons@1.2.99': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + '@internationalized/number@3.6.7': dependencies: '@swc/helpers': 0.5.23 @@ -5307,6 +6023,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true +<<<<<<< HEAD '@sacho/sacho-aarch64-apple-darwin@0.3.2': optional: true @@ -5333,6 +6050,16 @@ snapshots: '@sacho/sacho-x86_64-apple-darwin': 0.3.2 '@sacho/sacho-x86_64-pc-windows-msvc': 0.3.2 '@sacho/sacho-x86_64-unknown-linux-musl': 0.3.2 +======= + '@shikijs/core@2.5.0': + dependencies: + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 +>>>>>>> ef78c39 (Add VitePress documentation site) '@shikijs/core@4.4.1': dependencies: @@ -5342,17 +6069,32 @@ snapshots: '@types/hast': 3.0.5 hast-util-to-html: 9.0.5 + '@shikijs/engine-javascript@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 + '@shikijs/engine-javascript@4.4.1': dependencies: '@shikijs/types': 4.4.1 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.6 + '@shikijs/engine-oniguruma@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/engine-oniguruma@4.4.1': dependencies: '@shikijs/types': 4.4.1 '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/langs@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/langs@4.4.1': dependencies: '@shikijs/types': 4.4.1 @@ -5363,10 +6105,24 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.5 + '@shikijs/themes@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/themes@4.4.1': dependencies: '@shikijs/types': 4.4.1 + '@shikijs/transformers@2.5.0': + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 + + '@shikijs/types@2.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + '@shikijs/types@4.4.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -5441,10 +6197,10 @@ snapshots: dependencies: solid-js: 1.9.14 - '@solidjs/start@2.0.0(@solidjs/router@1.0.0(solid-js@1.9.14))(crossws@0.4.10(srvx@0.11.16))(supports-color@7.2.0)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + '@solidjs/start@2.0.0(@solidjs/router@1.0.0(solid-js@1.9.14))(crossws@0.4.10(srvx@0.11.16))(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) - '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/core': 7.29.7 + '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 '@solidjs/meta': 0.29.4(solid-js@1.9.14) '@types/babel__traverse': 7.28.0 @@ -5468,7 +6224,7 @@ snapshots: srvx: 0.12.5 terracotta: 1.1.1(solid-js@1.9.14) vite: 8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-plugin-solid: 2.11.14(solid-js@1.9.14)(supports-color@7.2.0)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vite-plugin-solid: 2.11.14(solid-js@1.9.14)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) optionalDependencies: '@solidjs/router': 1.0.0(solid-js@1.9.14) transitivePeerDependencies: @@ -5520,10 +6276,19 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.2.0': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/micromatch@4.0.10': dependencies: '@types/braces': 3.0.5 @@ -5542,11 +6307,13 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/project-service@8.62.1(supports-color@7.2.0)(typescript@7.0.2)': + '@types/web-bluetooth@0.0.21': {} + + '@typescript-eslint/project-service@8.62.1(typescript@7.0.2)': dependencies: '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@7.0.2) '@typescript-eslint/types': 8.62.1 - debug: 4.4.3(supports-color@7.2.0) + debug: 4.4.3 typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -5562,13 +6329,13 @@ snapshots: '@typescript-eslint/types@8.62.1': {} - '@typescript-eslint/typescript-estree@8.62.1(supports-color@7.2.0)(typescript@7.0.2)': + '@typescript-eslint/typescript-estree@8.62.1(typescript@7.0.2)': dependencies: - '@typescript-eslint/project-service': 8.62.1(supports-color@7.2.0)(typescript@7.0.2) + '@typescript-eslint/project-service': 8.62.1(typescript@7.0.2) '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@7.0.2) '@typescript-eslint/types': 8.62.1 '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3(supports-color@7.2.0) + debug: 4.4.3 minimatch: 10.2.5 semver: 7.8.4 tinyglobby: 0.2.17 @@ -5577,13 +6344,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.62.1(eslint@9.39.4(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@7.0.2)': + '@typescript-eslint/utils@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@7.0.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.62.1 '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(supports-color@7.2.0)(typescript@7.0.2) - eslint: 9.39.4(jiti@2.7.0)(supports-color@7.2.0) + '@typescript-eslint/typescript-estree': 8.62.1(typescript@7.0.2) + eslint: 9.39.4(jiti@2.7.0) typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -5716,6 +6483,110 @@ snapshots: '@upyo/core': 0.6.0 '@upyo/mime': 0.6.0(@upyo/core@0.6.0) + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@26.0.0)(lightningcss@1.33.0)(terser@5.48.0))(vue@3.5.43(typescript@7.0.2))': + dependencies: + vite: 5.4.21(@types/node@26.0.0)(lightningcss@1.33.0)(terser@5.48.0) + vue: 3.5.43(typescript@7.0.2) + + '@vue/compiler-core@3.5.43': + dependencies: + '@babel/parser': 7.29.8 + '@vue/shared': 3.5.43 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.2 + + '@vue/compiler-dom@3.5.43': + dependencies: + '@vue/compiler-core': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/compiler-sfc@3.5.43': + dependencies: + '@babel/parser': 7.29.8 + '@vue/compiler-core': 3.5.43 + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-ssr': 3.5.43 + '@vue/shared': 3.5.43 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.29 + source-map-js: 1.2.2 + + '@vue/compiler-ssr@3.5.43': + dependencies: + '@vue/compiler-dom': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/devtools-api@7.7.10': + dependencies: + '@vue/devtools-kit': 7.7.10 + + '@vue/devtools-kit@7.7.10': + dependencies: + '@vue/devtools-shared': 7.7.10 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.10': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.43': + dependencies: + '@vue/shared': 3.5.43 + + '@vue/runtime-core@3.5.43': + dependencies: + '@vue/reactivity': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/runtime-dom@3.5.43': + dependencies: + '@vue/reactivity': 3.5.43 + '@vue/runtime-core': 3.5.43 + '@vue/shared': 3.5.43 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.43': + dependencies: + '@vue/compiler-ssr': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/shared@3.5.43': {} + + '@vueuse/core@12.8.2(typescript@7.0.2)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2(typescript@7.0.2) + vue: 3.5.43(typescript@7.0.2) + transitivePeerDependencies: + - typescript + + '@vueuse/integrations@12.8.2(focus-trap@7.8.0)(typescript@7.0.2)': + dependencies: + '@vueuse/core': 12.8.2(typescript@7.0.2) + '@vueuse/shared': 12.8.2(typescript@7.0.2) + vue: 3.5.43(typescript@7.0.2) + optionalDependencies: + focus-trap: 7.8.0 + transitivePeerDependencies: + - typescript + + '@vueuse/metadata@12.8.2': {} + + '@vueuse/shared@12.8.2(typescript@7.0.2)': + dependencies: + vue: 3.5.43(typescript@7.0.2) + transitivePeerDependencies: + - typescript + '@whatwg-node/disposablestack@0.0.6': dependencies: '@whatwg-node/promise-helpers': 1.3.2 @@ -5830,6 +6701,23 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + algoliasearch@5.59.0: + dependencies: + '@algolia/abtesting': 1.25.0 + '@algolia/client-abtesting': 5.59.0 + '@algolia/client-analytics': 5.59.0 + '@algolia/client-common': 5.59.0 + '@algolia/client-insights': 5.59.0 + '@algolia/client-personalization': 5.59.0 + '@algolia/client-query-suggestions': 5.59.0 + '@algolia/client-search': 5.59.0 + '@algolia/ingestion': 1.59.0 + '@algolia/monitoring': 1.59.0 + '@algolia/recommend': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -5850,19 +6738,19 @@ snapshots: pvutils: 1.2.0 tslib: 2.8.1 - babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.29.7(supports-color@7.2.0)): + babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) '@babel/types': 7.29.8 html-entities: 2.3.3 parse5: 7.3.0 - babel-preset-solid@1.9.12(@babel/core@7.29.7(supports-color@7.2.0))(solid-js@1.9.14): + babel-preset-solid@1.9.12(@babel/core@7.29.7)(solid-js@1.9.14): dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) - babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/core': 7.29.7 + babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.29.7) optionalDependencies: solid-js: 1.9.14 @@ -5883,6 +6771,8 @@ snapshots: baseline-browser-mapping@2.11.11: {} + birpc@2.9.0: {} + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 @@ -5957,6 +6847,8 @@ snapshots: cookie-es@3.1.1: {} + copy-anything@4.1.5: {} + cosmiconfig@9.0.2(typescript@7.0.2): dependencies: env-paths: 2.2.1 @@ -5997,11 +6889,9 @@ snapshots: '@electric-sql/pglite': 0.5.3 drizzle-orm: 1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2)) - debug@4.4.3(supports-color@7.2.0): + debug@4.4.3: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 7.2.0 deep-is@0.1.4: {} @@ -6044,10 +6934,14 @@ snapshots: electron-to-chromium@1.5.399: {} + emoji-regex-xs@1.0.0: {} + empathic@2.0.1: {} entities@6.0.1: {} + entities@7.0.1: {} + env-paths@2.2.1: {} env-runner@0.1.16: @@ -6067,6 +6961,32 @@ snapshots: es-toolkit@1.46.1: {} + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -6130,10 +7050,10 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-solid@0.14.5(eslint@9.39.4(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@7.0.2): + eslint-plugin-solid@0.14.5(eslint@9.39.4(jiti@2.7.0))(typescript@7.0.2): dependencies: - '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@7.0.2) - eslint: 9.39.4(jiti@2.7.0)(supports-color@7.2.0) + '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@7.0.2) + eslint: 9.39.4(jiti@2.7.0) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 @@ -6154,14 +7074,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@2.7.0)(supports-color@7.2.0): + eslint@9.39.4(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2(supports-color@7.2.0) + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5(supports-color@7.2.0) + '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 @@ -6171,7 +7091,7 @@ snapshots: ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@7.2.0) + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -6213,6 +7133,8 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -6291,6 +7213,10 @@ snapshots: flatted@3.4.2: {} + focus-trap@7.8.0: + dependencies: + tabbable: 6.5.0 + fs-native-extensions@1.5.1: dependencies: require-addon: 1.3.0 @@ -6388,6 +7314,8 @@ snapshots: dependencies: '@types/hast': 3.0.5 + hookable@5.5.3: {} + hookable@6.1.1: {} html-entities@2.3.3: {} @@ -6417,11 +7345,11 @@ snapshots: dependencies: loose-envify: 1.4.0 - ioredis@5.11.1(supports-color@7.2.0): + ioredis@5.11.1: dependencies: '@ioredis/commands': 1.10.0 cluster-key-slot: 1.1.1 - debug: 4.4.3(supports-color@7.2.0) + debug: 4.4.3 denque: 2.1.0 redis-errors: 1.2.0 redis-parser: 3.0.0 @@ -6583,6 +7511,8 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + mark.js@8.11.1: {} + mdast-util-to-hast@13.2.1: dependencies: '@types/hast': 3.0.5 @@ -6631,6 +7561,10 @@ snapshots: dependencies: brace-expansion: 1.1.15 + minisearch@7.2.0: {} + + mitt@3.0.1: {} + ms@2.1.3: {} nanoid@3.3.19: {} @@ -6639,7 +7573,7 @@ snapshots: nf3@0.3.23: {} - nitro@3.0.260610-beta(@electric-sql/pglite@0.5.3)(chokidar@5.0.0)(dotenv@17.4.2)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2)))(giget@3.3.0)(ioredis@5.11.1(supports-color@7.2.0))(jiti@2.7.0)(lru-cache@11.5.1)(rollup@4.62.2)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + nitro@3.0.260610-beta(@electric-sql/pglite@0.5.3)(chokidar@5.0.0)(dotenv@17.4.2)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2)))(giget@3.3.0)(ioredis@5.11.1)(jiti@2.7.0)(lru-cache@11.5.1)(rollup@4.62.2)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: consola: 3.4.2 crossws: 0.4.10(srvx@0.11.16) @@ -6654,7 +7588,7 @@ snapshots: rolldown: 1.2.0 srvx: 0.11.16 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.3)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2))))(ioredis@5.11.1(supports-color@7.2.0))(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3) + unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.3)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2))))(ioredis@5.11.1)(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3) optionalDependencies: dotenv: 17.4.2 giget: 3.3.0 @@ -6713,6 +7647,12 @@ snapshots: oniguruma-parser@0.12.2: {} + oniguruma-to-es@3.1.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 6.1.0 + regex-recursion: 6.0.2 + oniguruma-to-es@4.3.6: dependencies: oniguruma-parser: 0.12.2 @@ -6809,6 +7749,8 @@ snapshots: pathe@2.0.3: {} + perfect-debounce@1.0.0: {} + pg-cloudflare@1.4.0: optional: true @@ -6865,6 +7807,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.2 + postcss@8.5.29: + dependencies: + nanoid: 3.3.19 + picocolors: 1.1.1 + source-map-js: 1.2.2 + postgres-array@2.0.0: {} postgres-bytea@1.0.1: {} @@ -6877,6 +7825,8 @@ snapshots: postgres@3.4.9: {} + preact@10.29.8: {} + prelude-ls@1.2.1: {} promise@7.3.1: @@ -6946,6 +7896,8 @@ snapshots: reusify@1.1.0: {} + rfdc@1.4.1: {} + rolldown-plugin-dts@0.27.14(rolldown@1.2.0)(typescript@7.0.2): dependencies: dts-resolver: 3.0.0 @@ -7011,7 +7963,6 @@ snapshots: '@rollup/rollup-win32-x64-gnu': 4.62.2 '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 - optional: true rou3@0.8.1: {} @@ -7021,6 +7972,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + search-insights@2.17.3: {} + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 @@ -7052,6 +8005,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@2.5.0: + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + shiki@4.4.1: dependencies: '@shikijs/core': 4.4.1 @@ -7094,10 +8058,10 @@ snapshots: '@corvu/utils': 0.4.2(solid-js@1.9.14) solid-js: 1.9.14 - solid-refresh@0.6.3(solid-js@1.9.14)(supports-color@7.2.0): + solid-refresh@0.6.3(solid-js@1.9.14): dependencies: '@babel/generator': 7.29.8 - '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7 '@babel/types': 7.29.8 solid-js: 1.9.14 transitivePeerDependencies: @@ -7128,6 +8092,8 @@ snapshots: space-separated-tokens@2.0.2: {} + speakingurl@14.0.1: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -7158,10 +8124,16 @@ snapshots: dependencies: inline-style-parser: 0.2.7 + superjson@2.2.6: + dependencies: + copy-anything: 4.1.5 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 + tabbable@6.5.0: {} + temporal-polyfill@1.0.4: dependencies: temporal-spec: 1.0.1 @@ -7307,11 +8279,11 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - unstorage@2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.3)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2))))(ioredis@5.11.1(supports-color@7.2.0))(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3): + unstorage@2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.3)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2))))(ioredis@5.11.1)(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3): optionalDependencies: chokidar: 5.0.0 db0: 0.3.4(@electric-sql/pglite@0.5.3)(drizzle-orm@1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(pg@8.21.0)(postgres@3.4.9)(valibot@1.4.2(typescript@7.0.2))) - ioredis: 5.11.1(supports-color@7.2.0) + ioredis: 5.11.1 lru-cache: 11.5.1 ofetch: 2.0.0-alpha.3 @@ -7363,19 +8335,30 @@ snapshots: transitivePeerDependencies: - typescript - vite-plugin-solid@2.11.14(solid-js@1.9.14)(supports-color@7.2.0)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-solid@2.11.14(solid-js@1.9.14)(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: - '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/core': 7.29.7 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.12(@babel/core@7.29.7(supports-color@7.2.0))(solid-js@1.9.14) + babel-preset-solid: 1.9.12(@babel/core@7.29.7)(solid-js@1.9.14) merge-anything: 5.1.7 solid-js: 1.9.14 - solid-refresh: 0.6.3(solid-js@1.9.14)(supports-color@7.2.0) + solid-refresh: 0.6.3(solid-js@1.9.14) vite: 8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) vitefu: 1.1.3(vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color + vite@5.4.21(@types/node@26.0.0)(lightningcss@1.33.0)(terser@5.48.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.25 + rollup: 4.62.2 + optionalDependencies: + '@types/node': 26.0.0 + fsevents: 2.3.3 + lightningcss: 1.33.0 + terser: 5.48.0 + vite@8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 @@ -7395,6 +8378,66 @@ snapshots: optionalDependencies: vite: 8.2.0(@types/node@26.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vitepress@1.6.4(@algolia/client-search@5.59.0)(@types/node@26.0.0)(lightningcss@1.33.0)(postcss@8.5.29)(search-insights@2.17.3)(terser@5.48.0)(typescript@7.0.2): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.59.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.99 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 + '@types/markdown-it': 14.2.0 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@26.0.0)(lightningcss@1.33.0)(terser@5.48.0))(vue@3.5.43(typescript@7.0.2)) + '@vue/devtools-api': 7.7.10 + '@vue/shared': 3.5.43 + '@vueuse/core': 12.8.2(typescript@7.0.2) + '@vueuse/integrations': 12.8.2(focus-trap@7.8.0)(typescript@7.0.2) + focus-trap: 7.8.0 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 2.5.0 + vite: 5.4.21(@types/node@26.0.0)(lightningcss@1.33.0)(terser@5.48.0) + vue: 3.5.43(typescript@7.0.2) + optionalDependencies: + postcss: 8.5.29 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - preact-render-to-string + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + + vue@3.5.43(typescript@7.0.2): + dependencies: + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-sfc': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/server-renderer': 3.5.43 + '@vue/shared': 3.5.43 + optionalDependencies: + typescript: 7.0.2 + webidl-conversions@3.0.1: {} whatwg-url@5.0.0: From 1ec048deb015d960ad364fed8306fcab818cdbf5 Mon Sep 17 00:00:00 2001 From: Jiwon Kwon Date: Sat, 10 Oct 2026 19:31:20 +0900 Subject: [PATCH 2/6] Add introduction, CLI reference, and self-hosting documentation Document DrFed's purpose, backend CLI options, and account creation for repository deployments using the default PGlite database. Add manual and reference navigation links. AI provenance: I provided the project introduction and asked Codex to draft an overview, document the CLI, and put account creation in a self-hosting manual. Codex wrote the Markdown pages and navigation changes, checked CLI options against source and help output, and documented the account task's default PGlite limitation. I selected the page structure and requested this commit. Assisted-by: Codex:gpt-6.1-sol --- docs/.vitepress/config.mts | 14 ++++- docs/manual/self-hosting.md | 32 +++++++++++ docs/reference/cli.md | 110 ++++++++++++++++++++++++++++++++++++ docs/what-is-drfed.md | 40 +++++++++++++ 4 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 docs/manual/self-hosting.md create mode 100644 docs/reference/cli.md create mode 100644 docs/what-is-drfed.md diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index f99fd58..9cb9875 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -24,7 +24,11 @@ export default defineConfig({ head: [["link", { rel: "icon", type: "image/svg+xml", href: "/icon.svg" }]], themeConfig: { logo: { src: "/icon.svg", alt: "" }, - nav: [{ text: "Installation", link: "/installation/manual-installation" }], + nav: [ + { text: "Installation", link: "/installation/manual-installation" }, + { text: "Manual", link: "/manual/self-hosting" }, + { text: "CLI reference", link: "/reference/cli" }, + ], sidebar: [ { text: "Installation", @@ -35,6 +39,14 @@ export default defineConfig({ }, ], }, + { + text: "Manual", + items: [{ text: "Self-hosting", link: "/manual/self-hosting" }], + }, + { + text: "Reference", + items: [{ text: "CLI", link: "/reference/cli" }], + }, ], search: { provider: "local" }, socialLinks: [ diff --git a/docs/manual/self-hosting.md b/docs/manual/self-hosting.md new file mode 100644 index 0000000..217d67b --- /dev/null +++ b/docs/manual/self-hosting.md @@ -0,0 +1,32 @@ +Self-hosting +============ + +Run DrFed on your own server to keep your debugging workspace on your own +infrastructure. See the [CLI reference] for backend configuration options. + +[CLI reference]: /reference/cli + + +Create an account +----------------- + +For a deployment running from the repository with the default PGlite database, +create an account before signing in. Start the backend at least once to +initialize *.pgdata/* and run its migrations. + +Stop the backend, then run this command from the repository root: + +~~~~ sh +mise run generate:account alice@example.com "Alice" +~~~~ + +Replace the email address and display name with your own. The task creates an +account in *.pgdata/*. If the email address already exists, it leaves the +account unchanged. + +Restart the backend, open the frontend, and sign in with that email address. +Follow the login link sent by email, or printed in the backend log when SMTP +is not configured. + +The account creation task currently supports only *.pgdata/* in the repository +root. It does not accept a custom PGlite path or a PostgreSQL connection URL. diff --git a/docs/reference/cli.md b/docs/reference/cli.md new file mode 100644 index 0000000..b95cc0e --- /dev/null +++ b/docs/reference/cli.md @@ -0,0 +1,110 @@ +CLI reference +============= + +`drfed-server` runs the DrFed backend. Self-hosters use it to configure the +database, instance origins, login email, and logging. The web frontend runs +separately. + +When running from the repository, invoke it with `mise run drfed-server`. +The examples below use this task while package installation is being prepared. + + +Start the server +---------------- + +Use PGlite to store data in a local directory: + +~~~~ sh +mise run drfed-server \ + --root-origin http://drfed.localhost:8888 \ + --login-origin http://localhost:3000 \ + --data-path .pgdata +~~~~ + +Or connect to PostgreSQL: + +~~~~ sh +mise run drfed-server \ + --root-origin https://drfed.example.com \ + --login-origin https://drfed.example.com \ + --database-url postgres://localhost/drfed +~~~~ + +Supply `--root-origin`, at least one `--login-origin`, and exactly one database +option. The backend listens on `localhost:8888` by default and runs database +migrations on startup. + + +Server options +-------------- + +| Option | Aliases | Description | +| ------------------------- | ---------------------- | ---------------------------------------------------------------- | +| `--root-origin ORIGIN` | `-r` | Required origin whose subdomains serve instances. | +| `--login-origin ORIGIN` | | Required frontend origin allowed in login links. Repeatable. | +| `--listen HOST:PORT` | `-l` | Listening address. Default: `localhost:8888`. | +| `--pglite-data-path PATH` | `--data-path`, `-d` | Local PGlite storage directory. | +| `--postgres-url URL` | `--database-url`, `-D` | PostgreSQL connection URL. | +| `--no-migrate` | `-M` | Disable automatic database migrations. | +| `--email-from ADDRESS` | `-f` | Sender address. Default: `noreply@` the root origin's host name. | +| `--smtp-url URL` | `-s` | SMTP server URL. Without it, login email is written to the log. | +| `--help` | | Show usage and available options. | +| `--version` | | Show the version. | + +For `--root-origin https://drfed.example.com`, an instance named `example` +lives at `https://example.drfed.example.com`. Remote federation requires DNS +and HTTPS configuration for these subdomains. The root origin must use a host +name rather than an IP address. + +`--login-origin` accepts HTTP or HTTPS origins. Repeat it when more than one +frontend origin should be allowed. The backend CLI does not read +`DRFED_LOGIN_ORIGINS`; that variable is used by the repository development +server. + + +Logging +------- + +| Option | Alias | Description | +| ------------------- | ----- | -------------------------------------------------------------------------- | +| `--log-level LEVEL` | `-L` | `trace`, `debug`, `info`, `warning`, `error`, or `fatal`. Default: `info`. | +| `--log-output FILE` | | Output destination. Use `-` for the console. | +| `--log-format TYPE` | | `jsonl`, `logfmt`, `color`, or `plain`. | + +For example, add `--log-level debug` to a server command to see more detail. + + +Export the GraphQL schema +------------------------- + +Export the schema without starting the server: + +~~~~ sh +mise run generate:graphql-schema --output-file schema.graphql +~~~~ + +The underlying CLI options are `--generate-graphql-schema` and +`--output-file PATH` (or `-o`). The output defaults to standard output (`-`). +Server origins and database options are not required for schema export. + + +Create a local account +---------------------- + +The repository provides an account creation task: + +~~~~ sh +mise run generate:account alice@example.com "Alice" +~~~~ + +Run it from the repository root after initializing the development database. +Stop the backend before running the task so both processes do not open the +same PGlite directory. + +This task writes to *.pgdata/* in the repository root. It does not accept a +custom data path or PostgreSQL connection URL, and is not a `drfed-server` +subcommand. An existing email address is left unchanged. General account +provisioning for self-hosted deployments is not yet exposed through the CLI. + +See [Self-hosting](/manual/self-hosting#create-an-account) for the account +creation walkthrough. diff --git a/docs/what-is-drfed.md b/docs/what-is-drfed.md new file mode 100644 index 0000000..9bf8f15 --- /dev/null +++ b/docs/what-is-drfed.md @@ -0,0 +1,40 @@ +What is DrFed? +============== + +DrFed is a web-based platform for debugging ActivityPub interoperability +failures. It helps you understand why federation breaks between implementations +and reproduce the problem in a controlled environment. + + +Who is it for? +-------------- + +Developers building ActivityPub applications or investigating federation +problems between servers. + + +How does it help? +----------------- + +DrFed gives you workspace instances that run as real ActivityPub servers. You +can create actors, receive activities, send test activities to remote servers, +and inspect what happened. + + +What does it support? +--------------------- + + - Object inspection and WebFinger lookup. + - Signature debugging for four signing schemes used in the Fediverse. + - Content-type validation. + - JSON-LD tools for comparing how implementations process a document. + - Hosted use and self-hosting. + + +License +------- + +DrFed is free software licensed under the +[GNU Affero General Public License v3 or later]. + +[GNU Affero General Public License v3 or later]: https://www.gnu.org/licenses/agpl-3.0.html From 3c92c485bf7f43ca37cbd11ef89f5fb1ecedbb46 Mon Sep 17 00:00:00 2001 From: Jiwon Kwon Date: Mon, 12 Oct 2026 13:12:24 +0900 Subject: [PATCH 3/6] Link documentation introduction and ignore temporary builds Add What is DrFed? to the documentation navbar and sidebar, and ignore the temporary VitePress output retained by debug builds. AI provenance: I asked Codex to assess PR #122 review comments and address the navigation and temporary-output findings. Codex added the introduction links and ignore rule. I deferred the unfinished documentation to a follow-up PR and chose to handle PR disclosure myself. Codex verified formatting, the documentation build, diff whitespace, and the ignore rule Assisted-by: Codex:gpt-6.1-sol --- .gitignore | 4 ++++ docs/.vitepress/config.mts | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index a18724b..df87be0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,11 @@ packages/drfed/completions/ ======= docs/.vitepress/cache/ docs/.vitepress/dist/ +<<<<<<< HEAD >>>>>>> ef78c39 (Add VitePress documentation site) +======= +docs/.vitepress/.temp/ +>>>>>>> 0356a2e (Link documentation introduction and ignore temporary builds) index.db diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 9cb9875..cbd7556 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -25,11 +25,16 @@ export default defineConfig({ themeConfig: { logo: { src: "/icon.svg", alt: "" }, nav: [ + { text: "What is DrFed?", link: "/what-is-drfed" }, { text: "Installation", link: "/installation/manual-installation" }, { text: "Manual", link: "/manual/self-hosting" }, { text: "CLI reference", link: "/reference/cli" }, ], sidebar: [ + { + text: "Introduction", + items: [{ text: "What is DrFed?", link: "/what-is-drfed" }], + }, { text: "Installation", items: [ From 021e029a8e23d98ea40e16abf4f140da537079c5 Mon Sep 17 00:00:00 2001 From: Jiwon Kwon Date: Mon, 12 Oct 2026 19:38:23 +0900 Subject: [PATCH 4/6] Draft run-from-source installation guide Document prerequisites, building, backend and frontend startup, account creation, and domain configuration. Add the guide to the installation sidebar. AI provenance: I asked Codex (model: gpt-6.1-sol) to draft a run-from-source installation guide and add it to the documentation sidebar. Codex wrote the guide after checking the current mise tasks, backend options, frontend startup configuration, and account creation workflow. I chose to keep it as a draft. Codex checked Markdown and configuration formatting, built the documentation successfully, and checked diff whitespace. The startup instructions were checked against the source but were not run end to end. Assisted-by: Codex:gpt-6.1-sol --- docs/.vitepress/config.mts | 4 ++ docs/installation/run-from-source.md | 91 ++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 docs/installation/run-from-source.md diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index cbd7556..3177537 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -38,6 +38,10 @@ export default defineConfig({ { text: "Installation", items: [ + { + text: "Run from source", + link: "/installation/run-from-source", + }, { text: "Manual installation", link: "/installation/manual-installation", diff --git a/docs/installation/run-from-source.md b/docs/installation/run-from-source.md new file mode 100644 index 0000000..0a442eb --- /dev/null +++ b/docs/installation/run-from-source.md @@ -0,0 +1,91 @@ +Run from source +=============== + +Build and run DrFed from its repository. This guide starts the backend and web +frontend on your own machine, using PGlite for database storage. + + +Prerequisites +------------- + +Install Git and [mise] 2026.6.10 or newer. Mise manages Node.js 26, pnpm 11, +and the other tools required by the project. + +[mise]: https://mise.jdx.dev/ + + +Get the source and build +------------------------ + +Clone the repository and run these commands from its root: + +~~~~ sh +git clone https://github.com/fedify-dev/drfed.git +cd drfed +mise trust +mise install +mise run build +~~~~ + +The build compiles the backend packages, generates the GraphQL schema and +Relay artifacts, and builds the web frontend. + + +Start the backend +----------------- + +~~~~ sh +mise run drfed-server \ + --root-origin http://drfed.localhost:8888 \ + --login-origin http://localhost:3000 \ + --pglite-data-path .pgdata +~~~~ + +The backend listens on `localhost:8888`, stores data in *.pgdata/*, and runs +database migrations automatically. Keep this terminal open while using DrFed. + +The root origin gives each instance its own subdomain, such as +`http://example.drfed.localhost:8888`. The login origin must match the origin +you use to open the frontend. + + +Create an account +----------------- + +After the backend has started and completed its migrations, stop it with +`Ctrl+C`. Follow [Create an account] to add your email address and display name, +then restart the backend with the same command. + +[Create an account]: /manual/self-hosting#create-an-account + + +Start the frontend +------------------ + +In another terminal, run this command from the repository root: + +~~~~ sh +PORT=3000 mise exec -- pnpm --filter @drfed/web start \ + --backend-url http://127.0.0.1:8888 +~~~~ + +Open `http://localhost:3000` and sign in with the account you created. Without +an SMTP server configured, login email is printed in the backend log. Follow +the link in that log to finish signing in. + +To stop DrFed, press `Ctrl+C` in both terminals. Your database remains in +*.pgdata/* and is reused when you restart the backend. + + +Use your own domain +------------------- + +For access from other machines or federation with remote servers, configure +publicly reachable origins, wildcard DNS for instance subdomains, and HTTPS. +Set `--login-origin` to the frontend's public origin, and point the frontend's +`--backend-url` at an address it can reach. A reverse proxy must preserve the +`Host` header and pass `X-Forwarded-Proto: https` when terminating TLS. + +See the [CLI reference] for database, origin, email, and logging options. + +[CLI reference]: /reference/cli From 5095e0f7b4f7308ad508b6c08b5acb80c3beecd0 Mon Sep 17 00:00:00 2001 From: Jiwon Kwon Date: Mon, 12 Oct 2026 21:39:51 +0900 Subject: [PATCH 5/6] Update self-hosting documentation and resolve rebase conflicts Add shared configuration guidance and refresh source installation, account creation, migrations, and CLI completion instructions. Preserve the changelog and documentation dependencies while resolving remaining merge markers. I used Codex with gpt-6.1-sol to update these drafts against the current implementation and resolve the rebase conflicts. I requested shell completion coverage and excluded my Tailscale settings from the commit. Codex corrected the login-origin example and verified frozen-lockfile installation, the application build, Markdown formatting, the documentation build, and diff whitespace. Assisted-by: Codex:gpt-6.1-sol --- .gitignore | 6 - README.md | 5 +- docs/.vitepress/config.mts | 5 +- docs/installation/run-from-source.md | 81 +++++++------ docs/manual/configuration.md | 132 +++++++++++++++++++++ docs/manual/self-hosting.md | 67 ++++++++--- docs/reference/cli.md | 167 ++++++++++++++++++++------- package.json | 5 +- pnpm-lock.yaml | 6 - 9 files changed, 369 insertions(+), 105 deletions(-) create mode 100644 docs/manual/configuration.md diff --git a/.gitignore b/.gitignore index df87be0..4a76c22 100644 --- a/.gitignore +++ b/.gitignore @@ -9,16 +9,10 @@ __generated__/ mise.local.toml node_modules/ packages/*/dist/ -<<<<<<< HEAD packages/drfed/completions/ -======= docs/.vitepress/cache/ docs/.vitepress/dist/ -<<<<<<< HEAD ->>>>>>> ef78c39 (Add VitePress documentation site) -======= docs/.vitepress/.temp/ ->>>>>>> 0356a2e (Link documentation introduction and ignore temporary builds) index.db diff --git a/README.md b/README.md index b95a85b..a363671 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,6 @@ credential files and shutdown behavior. All four commands accept the same explicit configuration file and the relevant `DRFED_*` variables. -<<<<<<< HEAD Development builds ------------------ @@ -117,7 +116,8 @@ Install the latest successful development build with stable `latest` channel. Tagged prereleases use `next`. See [the contributor release guide](./CONTRIBUTING.md#automated-npm-and-github-releases) for verification, setup, and recovery procedures. -======= + + Documentation ------------- @@ -127,4 +127,3 @@ The documentation site lives in *docs/* and uses [VitePress]. After preview the result. [VitePress]: https://vitepress.dev/ ->>>>>>> ef78c39 (Add VitePress documentation site) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 3177537..eed02d6 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -50,7 +50,10 @@ export default defineConfig({ }, { text: "Manual", - items: [{ text: "Self-hosting", link: "/manual/self-hosting" }], + items: [ + { text: "Self-hosting", link: "/manual/self-hosting" }, + { text: "Configuration", link: "/manual/configuration" }, + ], }, { text: "Reference", diff --git a/docs/installation/run-from-source.md b/docs/installation/run-from-source.md index 0a442eb..3b148a9 100644 --- a/docs/installation/run-from-source.md +++ b/docs/installation/run-from-source.md @@ -1,8 +1,8 @@ Run from source =============== -Build and run DrFed from its repository. This guide starts the backend and web -frontend on your own machine, using PGlite for database storage. +Build and run DrFed from its repository. This guide runs the backend and web +frontend together on your own machine, using PGlite for database storage. Prerequisites @@ -31,50 +31,56 @@ The build compiles the backend packages, generates the GraphQL schema and Relay artifacts, and builds the web frontend. -Start the backend +Create an account ----------------- +Create your account before starting the server: + ~~~~ sh -mise run drfed-server \ - --root-origin http://drfed.localhost:8888 \ - --login-origin http://localhost:3000 \ - --pglite-data-path .pgdata +mise exec -- node packages/drfed/bin/drfed-account.mjs create \ + --data-path .pgdata --email alice@example.com --name "Alice" ~~~~ -The backend listens on `localhost:8888`, stores data in *.pgdata/*, and runs -database migrations automatically. Keep this terminal open while using DrFed. +Replace the email address and display name with your own. The command prepares +the database and stores the account in *.pgdata/*. See [Create an account] for +other database options. -The root origin gives each instance its own subdomain, such as -`http://example.drfed.localhost:8888`. The login origin must match the origin -you use to open the frontend. +[Create an account]: /manual/self-hosting#create-an-account -Create an account ------------------ +Start DrFed +----------- -After the backend has started and completed its migrations, stop it with -`Ctrl+C`. Follow [Create an account] to add your email address and display name, -then restart the backend with the same command. +~~~~ sh +mise run drfed-server \ + --root-origin http://drfed.localhost:8888 \ + --data-path .pgdata \ + --mail-log-content +~~~~ -[Create an account]: /manual/self-hosting#create-an-account +The server listens on `localhost:8888`, serves both the frontend and GraphQL, +and runs database migrations automatically. Keep this terminal open while +using DrFed. +The root origin gives each instance its own subdomain, such as +`http://example.drfed.localhost:8888`. Login links default to the same origin +as the frontend. -Start the frontend ------------------- -In another terminal, run this command from the repository root: +Sign in +------- -~~~~ sh -PORT=3000 mise exec -- pnpm --filter @drfed/web start \ - --backend-url http://127.0.0.1:8888 -~~~~ +Open `http://drfed.localhost:8888` and sign in with the account you created. +Use this hostname rather than `localhost:8888`, because the frontend is served +only on its configured authority. -Open `http://localhost:3000` and sign in with the account you created. Without -an SMTP server configured, login email is printed in the backend log. Follow -the link in that log to finish signing in. +The example uses the log-only mail transport with `--mail-log-content`, which +prints login links in the server log. Follow the link to finish signing in. +Message contents are excluded from logs by default; configure mail delivery +for a service deployment. -To stop DrFed, press `Ctrl+C` in both terminals. Your database remains in -*.pgdata/* and is reused when you restart the backend. +To stop DrFed, press `Ctrl+C`. Your database remains in *.pgdata/* and is +reused when you restart the server. Use your own domain @@ -82,10 +88,19 @@ Use your own domain For access from other machines or federation with remote servers, configure publicly reachable origins, wildcard DNS for instance subdomains, and HTTPS. -Set `--login-origin` to the frontend's public origin, and point the frontend's -`--backend-url` at an address it can reach. A reverse proxy must preserve the -`Host` header and pass `X-Forwarded-Proto: https` when terminating TLS. +Set `--root-origin` to your external HTTPS origin. A reverse proxy must +preserve the original `Host` header. DrFed restores the request scheme from +its configured origin and ignores forwarded headers. See the [CLI reference] for database, origin, email, and logging options. [CLI reference]: /reference/cli + + +Work on the code +---------------- + +For development with automatic rebuilds, run `mise run dev` after building. +It starts the backend and a separate Vite frontend, and seeds development +accounts by default. Use `mise run dev --no-seed` to skip that seed. The +frontend defaults to `http://localhost:3000`; follow the URL printed by Vite. diff --git a/docs/manual/configuration.md b/docs/manual/configuration.md new file mode 100644 index 0000000..087ef27 --- /dev/null +++ b/docs/manual/configuration.md @@ -0,0 +1,132 @@ +Configuration +============= + +DrFed accepts command-line options, `DRFED_*` environment variables, and an +explicit TOML configuration file. `drfed-server`, `drfed-account`, +`drfed-migrate`, and `drfed-web` share these settings, using the sections +relevant to each command. + + +Select a configuration file +--------------------------- + +Create *drfed.toml*: + +~~~~ toml +[server] +root_origin = "http://drfed.localhost:8888" +listen = "localhost:8888" + +[database] +data_path = ".pgdata" +migrate = true + +[mail] +transport = "logtape" + +[telemetry] +log_level = "info" +~~~~ + +Select it explicitly when starting the server: + +~~~~ sh +drfed-server --config drfed.toml +~~~~ + +From a built repository, use `mise run drfed-server --config drfed.toml`. +You can also select the file with `DRFED_CONFIG`. DrFed does not search for +configuration files or load *.env* files automatically. The repository's +development task has its own environment-file loading. + + +Override a setting +------------------ + +Settings use this precedence, from highest to lowest: + +1. Command-line options. +2. `DRFED_*` environment variables. +3. The selected TOML file. +4. Defaults. + +For example, `--listen localhost:9000` overrides `server.listen` in the file. +Login origins in the environment must be a JSON array: + +~~~~ sh +DRFED_LOGIN_ORIGINS='["http://drfed.localhost:8888", "https://drfed.example.com"]' \ + drfed-server --config drfed.toml +~~~~ + +The list includes the embedded frontend's public origin from the example +configuration, which is required when the frontend is enabled. + +Relative paths in TOML resolve against the configuration file's directory. +Paths supplied through CLI options or environment variables resolve against +the command's working directory. Unknown TOML fields are rejected. + + +Server and database settings +---------------------------- + +| TOML setting | Environment variable | Purpose | +| ---------------------- | --------------------- | ------------------------------------------- | +| `server.root_origin` | `DRFED_ROOT_ORIGIN` | Origin whose subdomains serve instances. | +| `server.listen` | `DRFED_LISTEN` | Backend listening address. | +| `server.login_origins` | `DRFED_LOGIN_ORIGINS` | Allowed frontend origins for login links. | +| `server.web` | `DRFED_WEB` | Enable the embedded frontend. | +| `database.data_path` | `DRFED_DATA_PATH` | PGlite storage directory. | +| `database.url` | `DRFED_POSTGRES_URL` | PostgreSQL connection URL. | +| `database.migrate` | `DRFED_MIGRATE` | Apply pending migrations on server startup. | + +The embedded frontend is enabled by default, and login origins default to its +public origin. A backend started with `--no-web` requires explicit login +origins. Use `web.public_origin` or `--public-origin` to choose a frontend +origin different from the root origin. + +Choose either `database.data_path` or `database.url` at the same input source. +A higher-priority database selector replaces a lower-priority selector. With +neither set, DrFed uses PGlite in its default persistent OS data directory. + + +Deliver login email +------------------- + +The default `logtape` transport records mail events without delivering mail. +It excludes message contents. For local testing, use `--mail-log-content` to +include login links in the log. + +For SMTP delivery, add settings such as: + +~~~~ toml +[mail] +transport = "smtp" +from = "noreply@drfed.example.com" + +[mail.smtp] +host = "smtp.example.com" +port = 587 +tls = "starttls-required" +user = "operator" +password_file = "secrets/smtp-password" +~~~~ + +The password file path is relative to the TOML file. Configure your mail +provider to accept the sender address. SMTP also supports direct TLS and +OAuth credentials. Other transports include JMAP, Lettermint, Maileroo, +Mailtrap, Mailgun, Plunk, Resend, SendGrid, and Amazon SES. See the +[server package README] for their settings and credential-file rules. + +[server package README]: https://github.com/fedify-dev/drfed/blob/main/packages/drfed/README.md + + +Inspect the effective configuration +----------------------------------- + +~~~~ sh +drfed-server --config drfed.toml --print-config +~~~~ + +This prints JSON with the selected settings and their sources, with secrets +redacted. It exits without opening the database, mail transport, or log file. +Use it to check which source supplied a setting before starting the server. diff --git a/docs/manual/self-hosting.md b/docs/manual/self-hosting.md index 217d67b..e741853 100644 --- a/docs/manual/self-hosting.md +++ b/docs/manual/self-hosting.md @@ -10,23 +10,64 @@ infrastructure. See the [CLI reference] for backend configuration options. Create an account ----------------- -For a deployment running from the repository with the default PGlite database, -create an account before signing in. Start the backend at least once to -initialize *.pgdata/* and run its migrations. +Use `drfed-account create` with the same database settings as your server. +Stop a running PGlite server first: only one process can own its data +directory at a time. -Stop the backend, then run this command from the repository root: +~~~~ sh +drfed-account create --data-path .pgdata \ + --email alice@example.com --name "Alice" +~~~~ + +Replace the email address and display name with your own. The command prepares +a fresh database automatically. An existing account with the same normalized +email is returned without changing its name or privileges. Newly created +accounts are not administrators. + +For a configured deployment, use the same TOML file: + +~~~~ sh +drfed-account create --config drfed.toml \ + --email alice@example.com --name "Alice" +~~~~ + +PostgreSQL deployments can instead pass +`--database-url postgres://drfed@localhost/drfed`. The command prints JSON with +a `created` or `exists` status; both outcomes exit successfully. + +When running from the repository, build first and invoke the same command +through its binary: ~~~~ sh -mise run generate:account alice@example.com "Alice" +mise exec -- node packages/drfed/bin/drfed-account.mjs create \ + --data-path .pgdata --email alice@example.com --name "Alice" ~~~~ -Replace the email address and display name with your own. The task creates an -account in *.pgdata/*. If the email address already exists, it leaves the -account unchanged. +Start the server, open its configured public origin, and sign in with that +email address. Follow the login link delivered by your mail transport. +For local testing with log-only mail, explicitly enable `--mail-log-content` +to print login links; their contents are excluded by default. + +See [Configuration] for shared settings and mail setup. + +[Configuration]: /manual/configuration + + +Prepare and check the database +------------------------------ + +`drfed-migrate` prepares the database without starting the server. Stop a +PGlite server before either of these commands: + +~~~~ sh +drfed-migrate --config drfed.toml +drfed-migrate --config drfed.toml --check +~~~~ -Restart the backend, open the frontend, and sign in with that email address. -Follow the login link sent by email, or printed in the backend log when SMTP -is not configured. +`--check` inspects migration history without applying DrFed migrations. It +exits successfully only when the database matches the installed migrations +with no pending changes. Back up your database before upgrading, apply the +new migrations, check them, then restart the server. -The account creation task currently supports only *.pgdata/* in the repository -root. It does not accept a custom PGlite path or a PostgreSQL connection URL. +From the repository, invoke *packages/drfed/bin/drfed-migrate.mjs* through +`mise exec -- node` after building. diff --git a/docs/reference/cli.md b/docs/reference/cli.md index b95cc0e..ad887b6 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -1,12 +1,19 @@ CLI reference ============= -`drfed-server` runs the DrFed backend. Self-hosters use it to configure the -database, instance origins, login email, and logging. The web frontend runs -separately. +DrFed provides four commands for running and maintaining a deployment: + +| Command | Purpose | +| --------------- | ------------------------------------------ | +| `drfed-server` | Run the backend and embedded web frontend. | +| `drfed-account` | Create local accounts. | +| `drfed-migrate` | Prepare or inspect the database. | +| `drfed-web` | Run a separate frontend against a backend. | When running from the repository, invoke it with `mise run drfed-server`. -The examples below use this task while package installation is being prepared. +For the other commands, build first and run the matching binary in +*packages/drfed/bin/* through `mise exec -- node`, such as +`mise exec -- node packages/drfed/bin/drfed-account.mjs --help`. Start the server @@ -17,8 +24,7 @@ Use PGlite to store data in a local directory: ~~~~ sh mise run drfed-server \ --root-origin http://drfed.localhost:8888 \ - --login-origin http://localhost:3000 \ - --data-path .pgdata + --data-path .pgdata --mail-log-content ~~~~ Or connect to PostgreSQL: @@ -26,30 +32,40 @@ Or connect to PostgreSQL: ~~~~ sh mise run drfed-server \ --root-origin https://drfed.example.com \ - --login-origin https://drfed.example.com \ - --database-url postgres://localhost/drfed + --database-url postgres://drfed@localhost/drfed ~~~~ -Supply `--root-origin`, at least one `--login-origin`, and exactly one database -option. The backend listens on `localhost:8888` by default and runs database -migrations on startup. +Supply a root origin through CLI options, the environment, or TOML. The server +listens on `localhost:8888` by default and runs database migrations on startup. +Open the configured public origin for the frontend. If no database is selected, +DrFed uses PGlite in its default persistent OS data directory. Server options -------------- -| Option | Aliases | Description | -| ------------------------- | ---------------------- | ---------------------------------------------------------------- | -| `--root-origin ORIGIN` | `-r` | Required origin whose subdomains serve instances. | -| `--login-origin ORIGIN` | | Required frontend origin allowed in login links. Repeatable. | -| `--listen HOST:PORT` | `-l` | Listening address. Default: `localhost:8888`. | -| `--pglite-data-path PATH` | `--data-path`, `-d` | Local PGlite storage directory. | -| `--postgres-url URL` | `--database-url`, `-D` | PostgreSQL connection URL. | -| `--no-migrate` | `-M` | Disable automatic database migrations. | -| `--email-from ADDRESS` | `-f` | Sender address. Default: `noreply@` the root origin's host name. | -| `--smtp-url URL` | `-s` | SMTP server URL. Without it, login email is written to the log. | -| `--help` | | Show usage and available options. | -| `--version` | | Show the version. | +| Option | Aliases | Description | +| ----------------------------- | ---------------------- | ------------------------------------------------------------------------------------------ | +| `--root-origin ORIGIN` | `-r` | Required origin whose subdomains serve instances. | +| `--login-origin ORIGIN` | | Allowed login origin. Defaults to the public origin; required with `--no-web`. Repeatable. | +| `--listen HOST:PORT` | `-l` | Listening address. Default: `localhost:8888`. | +| `--pglite-data-path PATH` | `--data-path`, `-d` | Local PGlite storage directory. | +| `--postgres-url URL` | `--database-url`, `-D` | PostgreSQL connection URL. | +| `--no-migrate` | `-M` | Disable automatic database migrations. | +| `--email-from ADDRESS` | `-f` | Sender address. Default: `noreply@` the root origin's host name. | +| `--smtp-url URL` | `-s` | SMTP server URL; supports SMTP and SMTPS. | +| `--config FILE` | | Select an explicit TOML configuration file. | +| `--print-config` | | Print effective settings and sources with secrets redacted; exit. | +| `--public-origin ORIGIN` | | Frontend origin. Defaults to the root origin. | +| `--no-web` | | Run only the backend; require explicit login origins. | +| `--web` | | Enable the embedded frontend (default). | +| `--migrate` | | Enable automatic database migrations (default). | +| `--migration-lock-timeout MS` | | Connection and migration lock wait. Default: `30000` milliseconds. | +| `--mail-transport KIND` | | Select log-only mail, SMTP, JMAP, or a supported API transport. | +| `--mail-log-content` | | Include login links and message contents in log-only mail. | +| `--no-mail-log-content` | | Exclude message contents from log-only mail (default). | +| `--help` | | Show usage and available options. | +| `--version` | | Show the version. | For `--root-origin https://drfed.example.com`, an instance named `example` lives at `https://example.drfed.example.com`. Remote federation requires DNS @@ -57,9 +73,14 @@ and HTTPS configuration for these subdomains. The root origin must use a host name rather than an IP address. `--login-origin` accepts HTTP or HTTPS origins. Repeat it when more than one -frontend origin should be allowed. The backend CLI does not read -`DRFED_LOGIN_ORIGINS`; that variable is used by the repository development -server. +frontend origin should be allowed. `DRFED_LOGIN_ORIGINS` accepts a JSON array +of origins. An explicit allowlist replaces the default and must include the +embedded frontend's public origin when the frontend is enabled. + +All four commands accept `--config`, relevant `DRFED_*` variables, and +`--print-config`. See [Configuration] for precedence, paths, and mail settings. + +[Configuration]: /manual/configuration Logging @@ -74,6 +95,46 @@ Logging For example, add `--log-level debug` to a server command to see more detail. +Shell completions +----------------- + +All four commands can generate completion scripts for Bash (`bash`), zsh +(`zsh`), fish (`fish`), PowerShell (`pwsh`), and Nushell (`nu`): + +~~~~ sh +drfed-server completion bash +~~~~ + +Replace `drfed-server` with `drfed-account`, `drfed-migrate`, or `drfed-web` +to generate that command's script. Installing the npm package does not +activate completions automatically. + +For Bash, generate and load scripts for all four installed commands: + +~~~~ bash +for command in drfed-server drfed-web drfed-migrate drfed-account; do + "$command" completion bash > "$command-completion.bash" + source "./$command-completion.bash" +done +~~~~ + +Run this in a directory where these filenames are available. Keep the command +binaries on `PATH` so completion callbacks can find them. For persistent +loading, move the scripts to a stable directory and source their absolute +paths from your interactive Bash startup file. + +From the repository, build first and use +`mise exec -- node packages/drfed/bin/drfed-server.mjs completion bash`. +`mise run build` also generates scripts for all four commands and all five +shells; use `mise run generate:completion` to regenerate them explicitly. +The published package bundles them in its *completions/* directory. + +See [Completion installation] for loading instructions for each shell and +local npm installations. + +[Completion installation]: https://github.com/fedify-dev/drfed/blob/main/packages/drfed/README.md#completion-installation + + Export the GraphQL schema ------------------------- @@ -88,23 +149,51 @@ The underlying CLI options are `--generate-graphql-schema` and Server origins and database options are not required for schema export. -Create a local account ----------------------- - -The repository provides an account creation task: +Create an account +----------------- ~~~~ sh -mise run generate:account alice@example.com "Alice" +drfed-account create --data-path .pgdata \ + --email alice@example.com --name "Alice" ~~~~ -Run it from the repository root after initializing the development database. -Stop the backend before running the task so both processes do not open the -same PGlite directory. - -This task writes to *.pgdata/* in the repository root. It does not accept a -custom data path or PostgreSQL connection URL, and is not a `drfed-server` -subcommand. An existing email address is left unchanged. General account -provisioning for self-hosted deployments is not yet exposed through the CLI. +The command accepts `--config`, `--data-path`, or `--database-url`, and prepares +the database by default. Use `--no-migrate` to require an already prepared +database. Stop a PGlite server before creating accounts in its directory. See [Self-hosting](/manual/self-hosting#create-an-account) for the account creation walkthrough. + + +Prepare the database +-------------------- + +~~~~ sh +drfed-migrate --data-path .pgdata +drfed-migrate --data-path .pgdata --check +~~~~ + +The first command applies migrations. `--check` inspects history without +applying DrFed SQL and exits successfully only when the database is ready. +Both accept the same configuration file and database selectors as the server. +Stop a PGlite server before running them. + + +Run a separate frontend +----------------------- + +Run the backend with `--no-web` and an explicit login origin, then start +`drfed-web` against it: + +~~~~ sh +drfed-server --no-web --root-origin http://drfed.localhost:8888 \ + --login-origin http://localhost:3000 --data-path .pgdata --mail-log-content +drfed-web --backend-url http://localhost:8888 \ + --public-origin http://localhost:3000 --listen localhost:3000 +~~~~ + +Run the commands in separate terminals. `drfed-web` uses the backend's +`/graphql` endpoint. It defaults to listening on `localhost:3000` and reads +the TOML `web` settings, independently of the backend's listen setting. +Use HTTPS for a remote backend; remote HTTP requires explicit opt-in through +`--allow-insecure-backend`. diff --git a/package.json b/package.json index f84a32f..3604cb5 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,9 @@ "drizzle-orm": "catalog:", "@drfed/graphql": "workspace:*", "graphql": "catalog:", -<<<<<<< HEAD - "@sacho/sacho": "0.3.2" -======= + "@sacho/sacho": "0.3.2", "skills-npm": "catalog:", "vitepress": "^1.6.4" ->>>>>>> ef78c39 (Add VitePress documentation site) }, "scripts": { "prepare": "skills-npm --recursive --yes --force && skills-npm --yes --force --no-cleanup" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7c2bf5..b559333 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2098,7 +2098,6 @@ packages: cpu: [x64] os: [win32] -<<<<<<< HEAD '@sacho/sacho-aarch64-apple-darwin@0.3.2': resolution: {integrity: sha512-uMYGjFwggsjDWst8VQ1Z853vmg7/FGMf2uU8gDMhpE5dWc95czOyySKqsWjVks9mA7UtdX/QFx4J6k/I5dBwcw==} cpu: [arm64] @@ -2133,10 +2132,8 @@ packages: resolution: {integrity: sha512-vHra5oIbq+IKK8ZzhqcprwWFnAJPDxkzj3AG/45//dp0sTE1PI0Qf3jYqkwRgC1nSDoG4Po38gj9HGJutIAkgQ==} engines: {node: '>=18'} hasBin: true -======= '@shikijs/core@2.5.0': resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} ->>>>>>> ef78c39 (Add VitePress documentation site) '@shikijs/core@4.4.1': resolution: {integrity: sha512-VeR2CY6Nn9/WbisoYLOQZ7HZOnwTrpBuOw4wExjqLnBCi62BNWynBUO6K2uPIASPFJwAv7cX1fUu+LrPlSstcw==} @@ -6023,7 +6020,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true -<<<<<<< HEAD '@sacho/sacho-aarch64-apple-darwin@0.3.2': optional: true @@ -6050,7 +6046,6 @@ snapshots: '@sacho/sacho-x86_64-apple-darwin': 0.3.2 '@sacho/sacho-x86_64-pc-windows-msvc': 0.3.2 '@sacho/sacho-x86_64-unknown-linux-musl': 0.3.2 -======= '@shikijs/core@2.5.0': dependencies: '@shikijs/engine-javascript': 2.5.0 @@ -6059,7 +6054,6 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.5 hast-util-to-html: 9.0.5 ->>>>>>> ef78c39 (Add VitePress documentation site) '@shikijs/core@4.4.1': dependencies: From ec00b9eb141921c141612f8f5515958d806252ad Mon Sep 17 00:00:00 2001 From: Jiwon Kwon Date: Mon, 12 Oct 2026 21:49:14 +0900 Subject: [PATCH 6/6] Document npm installation and first startup Add Node.js requirements, local and global npm installation, account creation, and startup instructions, with links to the npm package and deployment guides. I used Codex with gpt-6.1-sol to draft the npm installation walkthrough I requested. Codex checked the published npm metadata and documented local commands through npx. Codex verified Markdown formatting, the documentation build, diff whitespace, and that the updated page was served successfully. Assisted-by: Codex:gpt-6.1-sol --- docs/installation/manual-installation.md | 62 ++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/docs/installation/manual-installation.md b/docs/installation/manual-installation.md index e3b413a..8acce9b 100644 --- a/docs/installation/manual-installation.md +++ b/docs/installation/manual-installation.md @@ -2,3 +2,65 @@ Manual installation =================== Run DrFed on your own server to develop and debug ActivityPub apps. + + +Install from npm +---------------- + +Install Node.js 26 or newer, then install [DrFed from npm] in a directory +where you want to run it: + +~~~~ sh +npm install @drfed/drfed +~~~~ + +The package provides `drfed-server`, `drfed-account`, `drfed-migrate`, and +`drfed-web`. Use `npx` to run these commands from the installation directory. + +[DrFed from npm]: https://www.npmjs.com/package/@drfed/drfed + + +Create an account and start DrFed +--------------------------------- + +Create your account before starting the server: + +~~~~ sh +npx drfed-account create --data-path .pgdata \ + --email alice@example.com --name "Alice" +~~~~ + +Replace the email address and display name with your own. The command prepares +the database in *.pgdata/*. Start DrFed with the same data directory: + +~~~~ sh +npx drfed-server --root-origin http://drfed.localhost:8888 \ + --data-path .pgdata --mail-log-content +~~~~ + +Open `http://drfed.localhost:8888` and sign in with your email address. This +local example prints the login link in the server log. Follow it to finish +signing in. The server includes the web frontend and stores your data in +*.pgdata/*. Press `Ctrl+C` to stop it. + +For a public deployment, configure your domain, wildcard DNS for instance +subdomains, HTTPS, and a mail delivery transport. See [Configuration] and +[Self-hosting] for settings, account creation, and database maintenance. + +[Configuration]: /manual/configuration +[Self-hosting]: /manual/self-hosting + + +Other installation options +-------------------------- + +To make the commands available directly on your `PATH`, install globally: + +~~~~ sh +npm install --global @drfed/drfed +~~~~ + +Then run `drfed-server` and the other commands without `npx`. +To build DrFed yourself, see [Run from source]. + +[Run from source]: /installation/run-from-source