From e28eba2702a5a9838c1dee71015e7202487d3126 Mon Sep 17 00:00:00 2001 From: Jake Jarvis Date: Mon, 25 May 2026 13:35:27 -0400 Subject: [PATCH] feat: add Handlebars template engine with peer-aware render context and consolidate eslint-prettier into a single adaptive template - Replace per-framework template files (`eslint.config.next.mjs`, `eslint.config.tanstack.mjs`) with a single `eslint.config.mjs` that branches via Handlebars `{{#if peers.framework}}` conditionals; add `handlebars` as a direct dependency to `@stanza/registry`, `apps/cli`, and `apps/web` - Extend the template render context with a `peers: Partial>` map so any template can inspect the active framework, auth provider, etc.; thread it through `buildRenderContext`, `synthesizeTemplates`, the CLI `codemod-runner`, and the web `getBuilderState` server function - Extract and export `activePeerIds(manifest, appId?)` from `@stanza/registry` to derive the peer map from a manifest (app-scoped for `home: app` categories); add `selectedPeerIds(selections)` in `apps/web/src/lib/selection.ts` as the URL-params-derived equivalent - Add integration tests verifying framework-conditional eslint-prettier output for `default`, `next`, and `tanstack-start` adapters; expand resolver tests for `activePeerIds` app-scoping and for modules that declare both a `default` adapter and a framework-specific override --- apps/cli/package.json | 1 + apps/cli/src/commands/commands.test.ts | 88 ++ apps/cli/src/lib/codemod-runner.ts | 5 + apps/web/package.json | 9 +- apps/web/src/lib/selection.ts | 15 + .../web/src/server/builder-state.functions.ts | 9 +- package.json | 1 + packages/registry/package.json | 1 + packages/registry/src/index.ts | 2 +- packages/registry/src/resolver.test.ts | 68 +- packages/registry/src/resolver.ts | 39 +- packages/registry/src/synthesize.ts | 3 +- packages/registry/src/template.test.ts | 69 +- packages/registry/src/template.ts | 54 +- pnpm-lock.yaml | 1049 +++++++---------- .../modules/tooling-eslint-prettier/module.ts | 42 +- .../templates/eslint.config.mjs | 55 + .../templates/eslint.config.next.mjs | 24 - .../templates/eslint.config.tanstack.mjs | 21 - 19 files changed, 858 insertions(+), 697 deletions(-) create mode 100644 registry/modules/tooling-eslint-prettier/templates/eslint.config.mjs delete mode 100644 registry/modules/tooling-eslint-prettier/templates/eslint.config.next.mjs delete mode 100644 registry/modules/tooling-eslint-prettier/templates/eslint.config.tanstack.mjs diff --git a/apps/cli/package.json b/apps/cli/package.json index 7c9ff6b..accf652 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -48,6 +48,7 @@ "dependencies": { "@clack/prompts": "^1.4.0", "citty": "^0.2.2", + "handlebars": "^4.7.9", "picocolors": "^1.1.1", "semver": "^7.8.1", "ts-morph": "^28.0.0", diff --git a/apps/cli/src/commands/commands.test.ts b/apps/cli/src/commands/commands.test.ts index a040ab1..9597065 100644 --- a/apps/cli/src/commands/commands.test.ts +++ b/apps/cli/src/commands/commands.test.ts @@ -330,3 +330,91 @@ describe("tooling slot (single-choice, repo-scoped)", () => { expect(manifest.modules.tooling[0].id).toBe("biome"); }); }); + +describe("tooling-eslint-prettier — framework-conditional rendering", () => { + it("installs without a framework via the default adapter (pure-TS config)", async () => { + await cmdInit(args({ name: "app", yes: true, tooling: "eslint-prettier" })); + expect(process.exitCode).toBeFalsy(); + + const projectRoot = path.join(tmp, "app"); + const manifest = JSON.parse(fs.readFileSync(path.join(projectRoot, "stanza.json"), "utf8")); + expect(manifest.modules.tooling?.[0]).toMatchObject({ + id: "eslint-prettier", + adapter: "default", + }); + + const config = fs.readFileSync(path.join(projectRoot, "eslint.config.mjs"), "utf8"); + // Framework-specific blocks must be absent. + expect(config).not.toContain("@next/eslint-plugin-next"); + expect(config).not.toContain("eslint-plugin-react"); + expect(config).not.toContain("core-web-vitals"); + expect(config).not.toContain(".next"); + expect(config).not.toContain("routeTree.gen.ts"); + // Pure-TS base is still present. + expect(config).toContain('import tseslint from "typescript-eslint";'); + expect(config).toContain('import prettier from "eslint-config-prettier";'); + + const rootPkg = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8")); + expect(rootPkg.devDependencies.eslint).toBeTruthy(); + expect(rootPkg.devDependencies["@next/eslint-plugin-next"]).toBeUndefined(); + expect(rootPkg.devDependencies["eslint-plugin-react"]).toBeUndefined(); + expect(rootPkg.devDependencies["eslint-plugin-react-hooks"]).toBeUndefined(); + }); + + it("layers Next-specific plugins when framework=next", async () => { + await cmdInit(args({ name: "app", yes: true, framework: "next", tooling: "eslint-prettier" })); + expect(process.exitCode).toBeFalsy(); + + const projectRoot = path.join(tmp, "app"); + const manifest = JSON.parse(fs.readFileSync(path.join(projectRoot, "stanza.json"), "utf8")); + expect(manifest.modules.tooling?.[0]).toMatchObject({ + id: "eslint-prettier", + adapter: "next", + }); + + const config = fs.readFileSync(path.join(projectRoot, "eslint.config.mjs"), "utf8"); + expect(config).toContain('import next from "@next/eslint-plugin-next";'); + expect(config).toContain("core-web-vitals"); + expect(config).toContain("**/.next/**"); + // TanStack-specific bits must not leak in. + expect(config).not.toContain('import react from "eslint-plugin-react";'); + expect(config).not.toContain("routeTree.gen.ts"); + + const rootPkg = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8")); + expect(rootPkg.devDependencies["@next/eslint-plugin-next"]).toBeTruthy(); + expect(rootPkg.devDependencies["eslint-plugin-react-hooks"]).toBeTruthy(); + expect(rootPkg.devDependencies["eslint-plugin-react"]).toBeUndefined(); + }); + + it("layers TanStack-specific plugins when framework=tanstack-start", async () => { + await cmdInit( + args({ + name: "app", + yes: true, + framework: "tanstack-start", + tooling: "eslint-prettier", + }), + ); + expect(process.exitCode).toBeFalsy(); + + const projectRoot = path.join(tmp, "app"); + const manifest = JSON.parse(fs.readFileSync(path.join(projectRoot, "stanza.json"), "utf8")); + expect(manifest.modules.tooling?.[0]).toMatchObject({ + id: "eslint-prettier", + adapter: "tanstack-start", + }); + + const config = fs.readFileSync(path.join(projectRoot, "eslint.config.mjs"), "utf8"); + expect(config).toContain('import react from "eslint-plugin-react";'); + expect(config).toContain("routeTree.gen.ts"); + expect(config).toContain("react/react-in-jsx-scope"); + // Next-specific bits must not leak in. + expect(config).not.toContain("@next/eslint-plugin-next"); + expect(config).not.toContain("core-web-vitals"); + + const rootPkg = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8")); + expect(rootPkg.devDependencies["eslint-plugin-react"]).toBeTruthy(); + expect(rootPkg.devDependencies["eslint-plugin-react-hooks"]).toBeTruthy(); + expect(rootPkg.devDependencies["@next/eslint-plugin-next"]).toBeUndefined(); + }); +}); diff --git a/apps/cli/src/lib/codemod-runner.ts b/apps/cli/src/lib/codemod-runner.ts index 2582dc1..0946c8d 100644 --- a/apps/cli/src/lib/codemod-runner.ts +++ b/apps/cli/src/lib/codemod-runner.ts @@ -15,6 +15,7 @@ import type { TemplateRef, } from "@stanza/registry"; import { + activePeerIds, buildRenderContext, categoryHome, installPackageJsonTargets, @@ -122,11 +123,14 @@ export async function applyModule(args: { // the active target so a module shipped into multiple apps renders correctly // per app. `seedApp` covers repo/package-scoped templates — they don't // reference `app.*` but `buildRenderContext` still needs a valid `AppSpec`. + // Peers are resolved per-app so app-scoped templates see the right framework + // (e.g. web's framework vs native's) when conditionally branching. const renderContextFor = (app: AppSpec): TemplateContext => buildRenderContext({ projectName: manifest.name, app, packageName, + peers: activePeerIds(manifest, app.id), }); const seedApp = targetApps[0]!; @@ -593,6 +597,7 @@ export async function revertCodemods(args: { projectName: manifest.name, app, packageName, + peers: activePeerIds(manifest, app.id), }); const project = lazyProject(appRoot); const ctx = buildContext({ diff --git a/apps/web/package.json b/apps/web/package.json index ac7528a..11a2d2e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -20,20 +20,21 @@ "@stanza/registry": "workspace:*", "@tabler/icons-react": "^3.44.0", "@tailwindcss/vite": "^4.3.0", - "@takumi-rs/image-response": "^1.4.1", + "@takumi-rs/image-response": "^1.5.1", "@tanstack/react-devtools": "^0.10.5", "@tanstack/react-hotkeys": "^0.10.0", - "@tanstack/react-router": "^1.170.7", + "@tanstack/react-router": "^1.170.8", "@tanstack/react-router-devtools": "^1.167.0", "@tanstack/react-router-ssr-query": "^1.167.0", - "@tanstack/react-start": "^1.168.10", - "@tanstack/router-plugin": "^1.168.10", + "@tanstack/react-start": "^1.168.13", + "@tanstack/router-plugin": "^1.168.11", "@vercel/functions": "^3.6.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "fumadocs-core": "^16.9.1", "fumadocs-mdx": "^15.0.8", "fumadocs-ui": "npm:@fumadocs/base-ui@^16.9.1", + "handlebars": "^4.7.9", "lru-cache": "^11.5.0", "nitro": "^3.0.260522-beta", "posthog-js": "^1.376.0", diff --git a/apps/web/src/lib/selection.ts b/apps/web/src/lib/selection.ts index 52d79f8..095e1f2 100644 --- a/apps/web/src/lib/selection.ts +++ b/apps/web/src/lib/selection.ts @@ -93,6 +93,21 @@ function pendingPeers( return pending; } +/** + * Active peer ids — the URL-derived equivalent of the CLI runner's + * `activePeerIds(manifest, app.id)`. Single source of truth for what + * `synthesizeTemplates` should expose under `{{peers.}}` in the + * Handlebars render context. + */ +export function selectedPeerIds(selections: Selections): Partial> { + const out: Partial> = {}; + for (const category of PEER_CATEGORIES) { + const id = selections[category]?.[0]; + if (id) out[category] = id; + } + return out; +} + /** * Resolve each selected module's adapter against the chosen one-cardinality * peers — the same logic the CLI uses. Modules whose peers aren't satisfied are diff --git a/apps/web/src/server/builder-state.functions.ts b/apps/web/src/server/builder-state.functions.ts index f00f342..ad471b7 100644 --- a/apps/web/src/server/builder-state.functions.ts +++ b/apps/web/src/server/builder-state.functions.ts @@ -7,7 +7,12 @@ import { } from "@stanza/registry"; import { createServerFn } from "@tanstack/react-start"; -import { DEFAULT_BUILDER_APPS, parseSelections, resolveSelected } from "@/lib/selection"; +import { + DEFAULT_BUILDER_APPS, + parseSelections, + resolveSelected, + selectedPeerIds, +} from "@/lib/selection"; import type { BuilderSearch } from "@/lib/selection"; import type { Preview } from "@/server/highlighter"; import { getHighlighter, renderPreview } from "@/server/highlighter.server"; @@ -47,6 +52,7 @@ export const getBuilderState = createServerFn({ method: "GET" }) const { name, pm, selections } = parseSelections(data); const resolved = resolveSelected(modules, selections); + const peers = selectedPeerIds(selections); // Templates carry their own content; package.json, stanza.json, and // .env.example are synthesized — the CLI never ships them as templates, it @@ -61,6 +67,7 @@ export const getBuilderState = createServerFn({ method: "GET" }) const previewFiles: { path: string; content: string }[] = synthesizeTemplates(resolved, { name, apps, + peers, }).map((tpl) => ({ path: tpl.path, content: tpl.content })); if (hasSelection) { const pkgJsons = synthesizePackageJsons(resolved, { name, apps, packageManager: pm }); diff --git a/package.json b/package.json index 02aca75..935022d 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@changesets/cli": "^2.31.0", "@stanza/registry": "workspace:*", "@types/node": "^25.9.1", + "jiti": "^2.7.0", "typescript": "^6.0.3", "vite-plus": "catalog:" }, diff --git a/packages/registry/package.json b/packages/registry/package.json index 9870549..039a3ab 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -13,6 +13,7 @@ "./resolver": "./src/resolver.ts" }, "dependencies": { + "handlebars": "^4.7.9", "validate-npm-package-name": "^8.0.0", "zod": "^4.4.3" }, diff --git a/packages/registry/src/index.ts b/packages/registry/src/index.ts index 32cf398..43d7586 100644 --- a/packages/registry/src/index.ts +++ b/packages/registry/src/index.ts @@ -54,7 +54,7 @@ export { } from "./manifest"; export type { ResolveContext, ResolveResult, ResolveError } from "./resolver"; -export { resolveAdapter, isCompatible, categoryOrder } from "./resolver"; +export { resolveAdapter, isCompatible, categoryOrder, activePeerIds } from "./resolver"; export type { PackageManager, diff --git a/packages/registry/src/resolver.test.ts b/packages/registry/src/resolver.test.ts index 6b040ac..0924117 100644 --- a/packages/registry/src/resolver.test.ts +++ b/packages/registry/src/resolver.test.ts @@ -2,7 +2,7 @@ import { assert, describe, expect, it } from "vite-plus/test"; import { emptyManifest } from "./manifest"; import { defineModule, type Module } from "./module"; -import { resolveAdapter } from "./resolver"; +import { activePeerIds, resolveAdapter } from "./resolver"; const drizzle: Module = defineModule({ id: "drizzle", @@ -156,3 +156,69 @@ describe("resolveAdapter — add-ons", () => { expect(result.error.kind).toBe("missing-peer"); }); }); + +// Module with both a generic default and a framework-specific override — +// mirrors the tooling-eslint-prettier shape after its standalone refactor. +const eslintLike: Module = defineModule({ + id: "eslint-like", + category: "tooling", + label: "ESLint-like", + description: "", + version: "0.1.0", + adapters: [ + { key: "next", match: { framework: "next" } }, + { key: "default", match: {} }, + ], +}); + +describe("resolveAdapter — default + framework-specific adapters coexist", () => { + it("picks the framework-specific adapter when its peer is active", () => { + const result = resolveAdapter(eslintLike, { + manifest: emptyManifest({ name: "t" }), + pending: { framework: next }, + }); + expect(result.ok).toBe(true); + assert(result.ok); + expect(result.adapter.key).toBe("next"); + }); + + it("falls back to the empty-match default when no framework is selected", () => { + const result = resolveAdapter(eslintLike, { + manifest: emptyManifest({ name: "t" }), + pending: {}, + }); + expect(result.ok).toBe(true); + assert(result.ok); + expect(result.adapter.key).toBe("default"); + }); +}); + +describe("activePeerIds", () => { + it("returns an empty record for a manifest with no selections", () => { + expect(activePeerIds(emptyManifest({ name: "t" }))).toEqual({}); + }); + + it("reads the installed framework id from the manifest", () => { + const manifest = { + ...emptyManifest({ name: "t" }), + modules: { + framework: [{ id: "next", version: "0.1.0", adapter: "default", apps: ["web"] }], + }, + }; + expect(activePeerIds(manifest, "web")).toEqual({ framework: "next" }); + }); + + it("scopes app-home peer lookups to the targetAppId", () => { + const manifest = { + ...emptyManifest({ name: "t" }), + modules: { + framework: [ + { id: "next", version: "0.1.0", adapter: "default", apps: ["web"] }, + { id: "expo", version: "0.1.0", adapter: "default", apps: ["native"] }, + ], + }, + }; + expect(activePeerIds(manifest, "web").framework).toBe("next"); + expect(activePeerIds(manifest, "native").framework).toBe("expo"); + }); +}); diff --git a/packages/registry/src/resolver.ts b/packages/registry/src/resolver.ts index c5fe481..f0d5167 100644 --- a/packages/registry/src/resolver.ts +++ b/packages/registry/src/resolver.ts @@ -45,7 +45,7 @@ export type ResolveResult = * always wins on tiebreak when no peers are required. */ export function resolveAdapter(module: Module, context: ResolveContext): ResolveResult { - const activePeers = activePeerIds(context); + const activePeers = activePeerIdsForContext(context); // Check declared peers are satisfied (id present + on allow-list if specified). for (const category of PEER_CATEGORIES) { @@ -87,20 +87,39 @@ export function isCompatible(module: Module, context: ResolveContext): boolean { } /** - * Active peer ids — only `cardinality: "one"` categories can be peers, so we - * iterate `PEER_CATEGORIES` and read the single installed/pending pick. When - * `targetAppId` is set, the installed lookup is scoped to that app so e.g. - * web's styling adapter peer-matches against web's framework, not native's. + * Active peer ids from the manifest alone — only `cardinality: "one"` + * categories can be peers, so we iterate `PEER_CATEGORIES` and read the + * single installed pick. When `targetAppId` is set, the lookup is scoped to + * that app so e.g. web's styling adapter peer-matches against web's + * framework, not native's. + * + * Exported so callers outside the resolver (the CLI runner and web + * synthesize, which both feed peers into the template render context) share + * exactly one implementation. + */ +export function activePeerIds( + manifest: StanzaManifest, + targetAppId?: string, +): Partial> { + const out: Partial> = {}; + for (const category of PEER_CATEGORIES) { + const installed = selectedOne(manifest, category, targetAppId)?.id; + if (installed) out[category] = installed; + } + return out; +} + +/** + * Layer in-flight `pending` picks over the manifest's installed peers. * Pending picks aren't yet app-scoped — they belong to the same in-flight * resolution and only one app is being processed at a time. */ -function activePeerIds(context: ResolveContext): Partial> { - const out: Partial> = {}; +function activePeerIdsForContext(context: ResolveContext): Partial> { + const installed = activePeerIds(context.manifest, context.targetAppId); + const out: Partial> = { ...installed }; for (const category of PEER_CATEGORIES) { const pending = context.pending[category]?.id; - const installed = selectedOne(context.manifest, category, context.targetAppId)?.id; - const chosen = pending ?? installed; - if (chosen) out[category] = chosen; + if (pending) out[category] = pending; } return out; } diff --git a/packages/registry/src/synthesize.ts b/packages/registry/src/synthesize.ts index 39f918a..c5dd3b0 100644 --- a/packages/registry/src/synthesize.ts +++ b/packages/registry/src/synthesize.ts @@ -146,7 +146,7 @@ export type SynthesizedTemplate = { */ export function synthesizeTemplates( resolved: Partial>, - opts: { name: string; apps?: AppSpec[] }, + opts: { name: string; apps?: AppSpec[]; peers?: Partial> }, ): SynthesizedTemplate[] { const apps = opts.apps && opts.apps.length > 0 ? opts.apps : [defaultWebApp()]; const out: SynthesizedTemplate[] = []; @@ -170,6 +170,7 @@ export function synthesizeTemplates( projectName: opts.name, app, packageName, + peers: opts.peers, }); for (const tpl of entry.adapter.templates ?? []) { diff --git a/packages/registry/src/template.test.ts b/packages/registry/src/template.test.ts index 430126f..fba699e 100644 --- a/packages/registry/src/template.test.ts +++ b/packages/registry/src/template.test.ts @@ -40,18 +40,58 @@ describe("renderTemplate", () => { expect(renderTemplate("{{ project.name }}", ctx)).toBe("acme"); }); - it("throws on a missing top-level key", () => { - expect(() => renderTemplate("{{missing}}", ctx)).toThrow(/missing or non-string key "missing"/); + it("renders missing keys as empty strings (non-strict Handlebars)", () => { + expect(renderTemplate("[{{missing}}]", ctx)).toBe("[]"); + expect(renderTemplate("[{{packages.nope.name}}]", ctx)).toBe("[]"); }); - it("throws on a missing nested key", () => { - expect(() => renderTemplate("{{packages.nope.name}}", ctx)).toThrow( - /missing or non-string key "packages.nope.name"/, - ); + it("does not HTML-escape values (noEscape=true)", () => { + // Without noEscape, the "/" in package names would become "/". + expect(renderTemplate("{{package.name}}", ctx)).toBe("@acme/auth"); }); - it("throws when a path resolves to an object instead of a string", () => { - expect(() => renderTemplate("{{project}}", ctx)).toThrow(/missing or non-string key "project"/); + describe("peers + conditionals", () => { + const withNext = buildRenderContext({ + projectName: "acme", + app: webApp, + packageName: "", + peers: { framework: "next" }, + }); + const withTanstack = buildRenderContext({ + projectName: "acme", + app: webApp, + packageName: "", + peers: { framework: "tanstack-start" }, + }); + const noFramework = buildRenderContext({ + projectName: "acme", + app: webApp, + packageName: "", + }); + + it("renders an `if (eq)` block when the active peer matches", () => { + const tpl = '{{#if (eq peers.framework "next")}}NEXT{{/if}}'; + expect(renderTemplate(tpl, withNext)).toBe("NEXT"); + expect(renderTemplate(tpl, withTanstack)).toBe(""); + expect(renderTemplate(tpl, noFramework)).toBe(""); + }); + + it("matches hyphenated peer ids", () => { + const tpl = '{{#if (eq peers.framework "tanstack-start")}}TS{{/if}}'; + expect(renderTemplate(tpl, withTanstack)).toBe("TS"); + expect(renderTemplate(tpl, withNext)).toBe(""); + }); + + it("renders an `unless` block when the active peer is absent", () => { + const tpl = "{{#unless peers.framework}}NONE{{/unless}}"; + expect(renderTemplate(tpl, noFramework)).toBe("NONE"); + expect(renderTemplate(tpl, withNext)).toBe(""); + }); + + it("exposes the raw peer id under {{peers.}}", () => { + expect(renderTemplate("[{{peers.framework}}]", withNext)).toBe("[next]"); + expect(renderTemplate("[{{peers.framework}}]", noFramework)).toBe("[]"); + }); }); }); @@ -66,6 +106,19 @@ describe("buildRenderContext", () => { expect(ctx.packages.auth?.name).toBe("@acme/auth"); expect(ctx.packages.db?.name).toBe("@acme/db"); }); + + it("materializes every PEER_CATEGORIES key under `peers` (undefined when unset)", () => { + const ctx = buildRenderContext({ + projectName: "acme", + app: webApp, + packageName: "", + peers: { framework: "next" }, + }); + expect(ctx.peers.framework).toBe("next"); + // styling is a PEER_CATEGORY but not set — the key exists, value is undefined. + expect("styling" in ctx.peers).toBe(true); + expect(ctx.peers.styling).toBeUndefined(); + }); }); const drizzle: Module = defineModule({ diff --git a/packages/registry/src/template.ts b/packages/registry/src/template.ts index df2cedd..721927e 100644 --- a/packages/registry/src/template.ts +++ b/packages/registry/src/template.ts @@ -1,8 +1,10 @@ +import Handlebars from "handlebars"; + import type { AppSpec } from "./manifest"; -import { PACKAGE_DIRS } from "./module"; +import { type CategoryId, PACKAGE_DIRS, PEER_CATEGORIES } from "./module"; /** - * Mustache-style context consumed by {@link renderTemplate}. The shape is the + * Handlebars context consumed by {@link renderTemplate}. The shape is the * public contract template authors write against: * * {{ project.name }} — the manifest's `name` (a.k.a. the npm scope) @@ -13,6 +15,10 @@ import { PACKAGE_DIRS } from "./module"; * Empty string for categories whose `home.kind` isn't "package". * {{ packages..name }} — any other package by its dir, e.g. {{ packages.db.name }} * → "@my-app/db". One entry per `PACKAGE_DIRS` member. + * {{ peers. }} — id of the active one-cardinality module in that + * category, or undefined. Useful with the `eq` + * helper for conditional blocks: + * {{#if (eq peers.framework "next")}}…{{/if}} * * `app.*` is rebound per target app on every render pass, so a module installed * into two apps renders correctly in each. @@ -22,30 +28,29 @@ export type TemplateContext = { app: { id: string; dir: string; kind: string }; package: { name: string }; packages: Record; + peers: Partial>; }; +// Module-singleton instance so registered helpers don't leak into other +// Handlebars consumers (the global is shared otherwise). +const hb = Handlebars.create(); + +// String-equality helper for matching against a peer id, e.g. +// {{#if (eq peers.framework "next")}}…{{/if}} +hb.registerHelper("eq", (a: unknown, b: unknown) => a === b); + /** - * Resolve `{{ a.b.c }}` references against a {@link TemplateContext}. Pure - * regex + path walk — no helpers, no logic. Templates that need branching - * should live as separate files and the codemod picks which one to render. + * Render a Handlebars template against a {@link TemplateContext}. Output is + * never HTML-escaped (`noEscape: true`) because templates emit code (JS/TS/ + * JSON), not markup. * - * Throws on missing keys so silent stub-outs can't ship to users. The CLI's - * apply path and the web preview share this primitive, so a fresh `{{ ... }}` - * with a typo fails the same way in both. + * Missing keys render as empty strings (Handlebars' default non-strict + * behavior). The CLI's apply path and the web preview share this primitive, + * so substitutions resolve identically in both. */ export function renderTemplate(source: string, context: TemplateContext): string { - return source.replace(/\{\{\s*([\w.-]+)\s*\}\}/g, (_, key: string) => { - const value = key.split(".").reduce((acc, part) => { - if (acc !== null && typeof acc === "object" && part in acc) { - return Reflect.get(acc, part); - } - return undefined; - }, context); - if (typeof value !== "string") { - throw new Error(`renderTemplate: missing or non-string key "${key}"`); - } - return value; - }); + const template = hb.compile(source, { noEscape: true }); + return template(context); } /** @@ -57,20 +62,29 @@ export function renderTemplate(source: string, context: TemplateContext): string * Each (module, target-app) iteration in the runner builds a fresh context so * `app.*` points at the currently-applying app — that's how the same module's * templates land correctly when shipped into multiple apps. + * + * Every `PEER_CATEGORIES` key is materialized under `peers` (with `undefined` + * when no module is selected) so templates can safely reference any peer slot + * — that lets `{{peers.framework}}` resolve to `undefined` rather than walk + * off the end of a missing path. */ export function buildRenderContext(opts: { projectName: string; app: AppSpec; packageName: string; + peers?: Partial>; }): TemplateContext { const packages: Record = {}; for (const dir of PACKAGE_DIRS) { packages[dir] = { name: `@${opts.projectName}/${dir}` }; } + const peers: Partial> = {}; + for (const cat of PEER_CATEGORIES) peers[cat] = opts.peers?.[cat]; return { project: { name: opts.projectName }, app: { id: opts.app.id, dir: opts.app.dir, kind: opts.app.kind }, package: { name: opts.packageName }, packages, + peers, }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a618c65..c7cb168 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,12 +30,15 @@ importers: '@types/node': specifier: ^25.9.1 version: 25.9.1 + jiti: + specifier: ^2.7.0 + version: 2.7.0 typescript: specifier: ^6.0.3 version: 6.0.3 vite-plus: specifier: 'catalog:' - version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)) + version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)) apps/cli: dependencies: @@ -45,6 +48,9 @@ importers: citty: specifier: ^0.2.2 version: 0.2.2 + handlebars: + specifier: ^4.7.9 + version: 4.7.9 picocolors: specifier: ^1.1.1 version: 1.1.1 @@ -75,10 +81,10 @@ importers: version: 6.0.3 vite-plus: specifier: 'catalog:' - version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)) + version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)) vitest: specifier: npm:@voidzero-dev/vite-plus-test@^0.1.22 - version: '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3))' + version: '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0))' apps/web: dependencies: @@ -105,10 +111,10 @@ importers: version: 3.44.0(react@19.2.6) '@tailwindcss/vite': specifier: ^4.3.0 - version: 4.3.0(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)) + version: 4.3.0(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) '@takumi-rs/image-response': - specifier: ^1.4.1 - version: 1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^1.5.1 + version: 1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-devtools': specifier: ^0.10.5 version: 0.10.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(solid-js@1.9.13) @@ -116,20 +122,20 @@ importers: specifier: ^0.10.0 version: 0.10.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router': - specifier: ^1.170.7 - version: 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^1.170.8 + version: 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router-devtools': specifier: ^1.167.0 - version: 1.167.0(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.5)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 1.167.0(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.6)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router-ssr-query': specifier: ^1.167.0 - version: 1.167.0(@tanstack/query-core@5.100.14)(@tanstack/react-query@5.100.14(react@19.2.6))(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 1.167.0(@tanstack/query-core@5.100.14)(@tanstack/react-query@5.100.14(react@19.2.6))(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.6)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-start': - specifier: ^1.168.10 - version: 1.168.10(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^1.168.13 + version: 1.168.13(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/router-plugin': - specifier: ^1.168.10 - version: 1.168.10(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)) + specifier: ^1.168.11 + version: 1.168.11(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) '@vercel/functions': specifier: ^3.6.0 version: 3.6.0 @@ -141,19 +147,22 @@ importers: version: 2.1.1 fumadocs-core: specifier: ^16.9.1 - version: 16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + version: 16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) fumadocs-mdx: specifier: ^15.0.8 - version: 15.0.8(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react@19.2.6)(rolldown@1.0.2) + version: 15.0.8(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react@19.2.6)(rolldown@1.0.2) fumadocs-ui: specifier: npm:@fumadocs/base-ui@^16.9.1 - version: '@fumadocs/base-ui@16.9.1(@tailwindcss/oxide@4.3.0)(@takumi-rs/image-response@1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0)' + version: '@fumadocs/base-ui@16.9.1(@tailwindcss/oxide@4.3.0)(@takumi-rs/image-response@1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0)' + handlebars: + specifier: ^4.7.9 + version: 4.7.9 lru-cache: specifier: ^11.5.0 version: 11.5.0 nitro: specifier: ^3.0.260522-beta - version: 3.0.260522-beta(@vercel/functions@3.6.0)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(chokidar@5.0.0)(dotenv@17.4.2)(jiti@2.7.0)(lru-cache@11.5.0) + version: 3.0.260522-beta(@vercel/functions@3.6.0)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(chokidar@5.0.0)(dotenv@17.4.2)(jiti@2.7.0)(lru-cache@11.5.0) posthog-js: specifier: ^1.376.0 version: 1.376.0 @@ -196,7 +205,7 @@ importers: version: 0.5.19(tailwindcss@4.3.0) '@tanstack/devtools-vite': specifier: ^0.7.0 - version: 0.7.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)) + version: 0.7.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -217,10 +226,10 @@ importers: version: 19.2.3(@types/react@19.2.15) '@vitejs/plugin-react': specifier: ^6.0.2 - version: 6.0.2(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)) + version: 6.0.2(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) '@vitejs/plugin-rsc': specifier: ^0.5.26 - version: 0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) jsdom: specifier: ^29.1.1 version: 29.1.1(@noble/hashes@1.8.0) @@ -229,13 +238,13 @@ importers: version: 6.0.3 vite: specifier: npm:@voidzero-dev/vite-plus-core@^0.1.22 - version: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + version: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' vite-plus: specifier: 'catalog:' - version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3) + version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3) vitest: specifier: npm:@voidzero-dev/vite-plus-test@^0.1.22 - version: '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)' + version: '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)' web-vitals: specifier: ^5.2.0 version: 5.2.0 @@ -257,10 +266,10 @@ importers: version: 6.0.3 vite-plus: specifier: 'catalog:' - version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)) + version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)) vitest: specifier: npm:@voidzero-dev/vite-plus-test@^0.1.22 - version: '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3))' + version: '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0))' packages/create-stanza: dependencies: @@ -276,10 +285,13 @@ importers: version: 6.0.3 vite-plus: specifier: 'catalog:' - version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)) + version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)) packages/registry: dependencies: + handlebars: + specifier: ^4.7.9 + version: 4.7.9 validate-npm-package-name: specifier: ^8.0.0 version: 8.0.0 @@ -295,10 +307,10 @@ importers: version: 6.0.3 vite-plus: specifier: 'catalog:' - version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)) + version: 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)) vitest: specifier: npm:@voidzero-dev/vite-plus-test@^0.1.22 - version: '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3))' + version: '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0))' registry/modules/auth-better-auth: dependencies: @@ -412,141 +424,137 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.3': - resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.29.3': - resolution: {integrity: sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==} + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.3': - resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.6': - resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.28.5': - resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@base-ui/react@1.5.0': @@ -685,8 +693,8 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@dotenvx/dotenvx@1.67.0': - resolution: {integrity: sha512-KBfIx5OrAG6giqSkHCkQWynZmT47XkSTuuYIcvjHxlKoVRlYbxNrJmyIPaefnszU8MCvMwrrB+viJQzPqzgpcg==} + '@dotenvx/dotenvx@1.68.1': + resolution: {integrity: sha512-UQgds8NIGJEi/goJtAdPseaVhwz6xWVDik7P0Y1M35KKjTcjWZdsWWaswvDse6cxiBQel9Q7MQFMRxdMAQ2tqA==} hasBin: true '@ecies/ciphers@0.2.6': @@ -1886,64 +1894,64 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 - '@takumi-rs/core-darwin-arm64@1.4.1': - resolution: {integrity: sha512-Jg2isNfC13nfckkWxV+FXjzMNpN5BoMFrxA9VCzDviDkQaickJRllTERXjVWn2r2tTpVOZUfBSfR+eSCGpM7bA==} + '@takumi-rs/core-darwin-arm64@1.5.1': + resolution: {integrity: sha512-b7gZxZFX+64Gip6ypY/9oLf9qhw0+s1MZavnt+mggXjzSAJiBmIqVmlpuB8HolYyYwuR3+bclG0/Ma1W63qdRA==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [arm64] os: [darwin] - '@takumi-rs/core-darwin-x64@1.4.1': - resolution: {integrity: sha512-+ugkY19hspZtMW7apz+qfJkjAJdvtHAxc+ifdLslKoJkVnz38w73zfRDyTTnseQMFFoQngcI4pLT/VJhhz2V9A==} + '@takumi-rs/core-darwin-x64@1.5.1': + resolution: {integrity: sha512-r65+N+Ttkf5xvKRzPnXXPZ4opDK6HnM/pHs/PZaEIE7HqKxscYeiUpwIwXaIwLsXT7OPSlTrBeQjkExfnlmj4Q==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [x64] os: [darwin] - '@takumi-rs/core-linux-arm64-gnu@1.4.1': - resolution: {integrity: sha512-ySgprHgFe6Azoss51bkJhW6AQ4tuQiaelsRLevPE/z3w6+mDhKfpCMl8TnhbQ8NnmJm2F0WjEyUIvXAYkWzGQQ==} + '@takumi-rs/core-linux-arm64-gnu@1.5.1': + resolution: {integrity: sha512-UyNajYHAEcMFA/DtAeX1zrWzajwUwFXo+hHuTUAjgbBCIFUAXNHkh92L0XMelyr7Yaj0uogdscvKWA/wGlKliw==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@takumi-rs/core-linux-arm64-musl@1.4.1': - resolution: {integrity: sha512-hzmIEA9AUD3VwkiiIvNIpCuR/THXy/8NYe2YsWk7Kz0xEqyFwGafB6IqodNCfVMiu7rbpXDUX0F18HgDi8ORLw==} + '@takumi-rs/core-linux-arm64-musl@1.5.1': + resolution: {integrity: sha512-+G7Qin3Wu1sDycdOYHA4hJiZeCTUSW6+gx9ZZnkFY3wYCFAteJacKoJq5f4OfxcNrnaXIsTOHdObEQwiid7raw==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [arm64] os: [linux] libc: [musl] - '@takumi-rs/core-linux-x64-gnu@1.4.1': - resolution: {integrity: sha512-3CHeiCm9Ar5ZBurY79Zem3BurEXpdTbY4g3NeVYPIqTRIvMog6Z9BZyDvqfxSIfjGUCR85fYdtve8046jSbDgw==} + '@takumi-rs/core-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-KqcKcOpxN4dm8kusKQmZ1lHrYExYchorjZ8911DWOFv4MCdv/LB3A5bM5othPeFeWo8EaSiWprIhQeTLUc2iZQ==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [x64] os: [linux] libc: [glibc] - '@takumi-rs/core-linux-x64-musl@1.4.1': - resolution: {integrity: sha512-46hhHo2Yvc+xBZf/0pjd0pGFy+o5DdNc1G8Xj0FXGszBqKy8pJJozvWJF/HQISZIkCBKstaYrtEkAKvXydEs3w==} + '@takumi-rs/core-linux-x64-musl@1.5.1': + resolution: {integrity: sha512-WvxQcHXzHEsraDKtxn7K8LPBQlVrKPOn5IA7R7fKR4pT1jO3v5HKttFaH+Prt4HhGKKq63eggOh1lbFAQqj84w==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [x64] os: [linux] libc: [musl] - '@takumi-rs/core-win32-arm64-msvc@1.4.1': - resolution: {integrity: sha512-gnNMmGnRFjAUGUu4MgSoIp7x+XfuK8I7y/uEHqhINCAfvO6gXH+Gidztk3ZAVDOcBm3ztuzt0Vrv/k8qmUX0BQ==} + '@takumi-rs/core-win32-arm64-msvc@1.5.1': + resolution: {integrity: sha512-MXB0xRg3gmSdVzoMVzDLg+RpFe+aaNRq3GadNvlxuPbG/f5LVCu5J5PQK6vEFLvQqGOKntX+9NvUvg1/dVMHhg==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [arm64] os: [win32] - '@takumi-rs/core-win32-x64-msvc@1.4.1': - resolution: {integrity: sha512-FngAinthAeQgCCaXGO9ZTCh0I4/EwlNfCBKyBNKsTOc6VR/Umrm7yytkuCeGuYtKsgdWghd0t5gH1593hu7Ltw==} + '@takumi-rs/core-win32-x64-msvc@1.5.1': + resolution: {integrity: sha512-b0qb1+z4l98DxufvvETCV177BRfoPGwuoVtFuCaKCgvQgg5xzCTMWlMLNUZwSOEG/qqUR9yWJbngupBD+djJGA==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} cpu: [x64] os: [win32] - '@takumi-rs/core@1.4.1': - resolution: {integrity: sha512-C86tsAoM/kf75S0oZiPM9crV7UxRxKLlfH8qWy4cJwYD4hFIv0dtJJ8Xz0dFbs2g3Qn8Sru4n5iDsyXccaIk+w==} + '@takumi-rs/core@1.5.1': + resolution: {integrity: sha512-h3qKkTz+c7938kZIv/Vpt8dWDaZtMvNYFMSMU0miQpgXFYWQalRfqW+fzUb0SxAm33N4t+Mh3H3p+Bpvmpz/JQ==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} - '@takumi-rs/helpers@1.4.1': - resolution: {integrity: sha512-05TF79CJcJK1pFafdiq0SF63fuXEtNv6+sDz6d3RGxdyyo/FyMxUIXCN4ibCeoS9GVwiGmpt/dugKxTUVm6a9A==} + '@takumi-rs/helpers@1.5.1': + resolution: {integrity: sha512-t0UcUoqwJciEFVEgVh0eSp8KQog/fzviFcGFp2Yy91oUCDcs8hFGzH/lw7oGpt6Ipsdp0XyOUtmyP+M/JSLAUw==} peerDependencies: react: ^19.2.5 react-dom: ^18.0.0 || ^19.0.0 @@ -1953,11 +1961,11 @@ packages: react-dom: optional: true - '@takumi-rs/image-response@1.4.1': - resolution: {integrity: sha512-5sLL09CKd90hvta64KojcY4O4PiR5nWQPyYTWWccG57DPutnHj9FEtZX6+3DgEvGIN1CYXFGbeJJlnFRQKUBcQ==} + '@takumi-rs/image-response@1.5.1': + resolution: {integrity: sha512-K5dQc5cIm6+A1HJQdMYJLQHMxHHQlwv66nrgcyaQ3FDwhnkX/LLeKjgnr+S28qjXnrDncmKdHr3CXd19ZC1fxA==} - '@takumi-rs/wasm@1.4.1': - resolution: {integrity: sha512-wOaG6bgd5GSPCEk1NrNimphJs1Z11bCFbOzpUAtPQAgc9EdScFd/26rEEb9NKGRuE2H12zj/qaHWuLRuyCXrBw==} + '@takumi-rs/wasm@1.5.1': + resolution: {integrity: sha512-uOWjizXOYsM8n6cRngyw7oqvYBrkCvB1CHKEKC6069OSi/D/iCoo8gf23S7QnDN6A8H9QSbrS4RlnVVflZgCfA==} '@tanstack/devtools-client@0.0.6': resolution: {integrity: sha512-f85ZJXJnDIFOoykG/BFIixuAevJovCvJF391LPs6YjBAPhGYC50NWlx1y4iF/UmK5/cCMx+/JqI5SBOz7FanQQ==} @@ -2046,22 +2054,22 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.170.7': - resolution: {integrity: sha512-4Q8M8Q9sGobhyt72yW+vxzUOSPfrCAHwjPOCb7+ocReQnFQ37t9Qh4RNG4+7zsFQ4tW9C8LpllRe49aK2RYy2Q==} + '@tanstack/react-router@1.170.8': + resolution: {integrity: sha512-Qw2ju6jjnIsMpuW+VrnHZWHuugqs592PWsnI56sG28qNhg14CgRLahOcNajfuJR9P4MxKGP94WVzmFKSYUz/ig==} engines: {node: '>=20.19'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.168.2': - resolution: {integrity: sha512-1vnTk3qTh6pJjFaYQvBpTJsmGOb6vE3qY/747uU3ys6kS3NSElmc5YLHk4hlk3S52EVQq/ntuZuJtkS96rQULA==} + '@tanstack/react-start-client@1.168.4': + resolution: {integrity: sha512-PDJ7xEuUKrlBiQz2PrVN9pD2ErmWeFpckYW1WUE8JCAeVi8U7C6rQNTQe4hQxBhycRfRdD53M6UfdWdQODIxyg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-rsc@0.1.10': - resolution: {integrity: sha512-NU4J+8Sm1i5N9skk1X4nTG4sTelCjyc+ny5n56KtTLnPkEm3chvYqjT4CxcoPoHYzE2vE0oAA28YahSQwUkMbQ==} + '@tanstack/react-start-rsc@0.1.13': + resolution: {integrity: sha512-nl5pKkxy1RnRxOLjy/c3g/RKdQSQYWzK5iuLlsRaO9TbLuMhQlNAn255xQgVXG56G9xCtDg8/nD0ZycxSlSkWA==} engines: {node: '>=22.12.0'} peerDependencies: '@rspack/core': '>=2.0.0-0' @@ -2077,15 +2085,15 @@ packages: react-server-dom-rspack: optional: true - '@tanstack/react-start-server@1.167.7': - resolution: {integrity: sha512-/Tq3tH7XiCT9K5cYD753/Le6IRjRNHjbN/Jk/Wkpa4pJ3exta5QM7ccCRwVWEd9oIzUvrIfYKWs2JiK7K/R13g==} + '@tanstack/react-start-server@1.167.9': + resolution: {integrity: sha512-a1SGeeoIEg411vEN6DThB2Bm5tiYBb0tCC/RaG8BSjRVtsY6kxD9cP1+LOpZwjRSgfdyqtSbe1v78ZDB9z0/uw==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.168.10': - resolution: {integrity: sha512-wISys9u9HDAA7pi298SITc+DzERreR8vmSNGkfxlK0L3n1RlalCdfTKO67JoAdqVNz9FSP9PktgciMhfuHdvaQ==} + '@tanstack/react-start@1.168.13': + resolution: {integrity: sha512-E2pHQ92NiND1/HiD5Ax71xFXxiRZ2reOfU5W4BqxUL5plap3p8xSw1c6L8Np1E60vsxknuPCYRZESKkRy/LkOA==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -2113,8 +2121,8 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.171.5': - resolution: {integrity: sha512-BfilbQqqWiQwJn68cD8wmk1ajEWIO3IlEA1zVuWslWbiVc23CDn+6ACO5tfPAcc96ED37hxela5ij3VBvAtusw==} + '@tanstack/router-core@1.171.6': + resolution: {integrity: sha512-Ol6DQ+j6rf/rPVELIzo8LHwOQV2KL+zry3b+39kL/GKrt7YId52WJRAFMzuseY4XceSW+PU7sG/Cc1QkwJr0hg==} engines: {node: '>=20.19'} '@tanstack/router-devtools-core@1.168.0': @@ -2127,16 +2135,16 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.167.9': - resolution: {integrity: sha512-B2MiJVYyI/C+5O7Hzu9owZPHuXCxKKFweUdMLToAZLg2H7iYoXYzgqAFISUBBlL8jKWugEVwNMUE3ajBGZep4w==} + '@tanstack/router-generator@1.167.10': + resolution: {integrity: sha512-CjbjWRSo6djLU/C7ncb9IbKUcf4IwpdqhLGngkwKkXaVFXGxEAafA/uhvOCv/UEUVR7NI3tJqqQmxYXGcJPbjw==} engines: {node: '>=20.19'} - '@tanstack/router-plugin@1.168.10': - resolution: {integrity: sha512-s3bWi8pT+p8D70aev6CBwCQp/2SlkO16wxXDtK6a9JAQYK7ARemp3qdzX5EDnVmB9Mc6ex5f9eyrN6eL/V+tLg==} + '@tanstack/router-plugin@1.168.11': + resolution: {integrity: sha512-b2eom/8xCWL/OiWxKub8kYsr8p+kvmB/eXwYGqCWG8vilcJo+eQCSyp54nKt0AZ5k/ET1+eINc+4mwL3bVeAgg==} engines: {node: '>=20.19'} peerDependencies: '@rsbuild/core': '>=1.0.2 || ^2.0.0' - '@tanstack/react-router': ^1.170.7 + '@tanstack/react-router': ^1.170.8 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' vite-plugin-solid: ^2.11.10 || ^3.0.0-0 webpack: '>=5.92.0' @@ -2163,16 +2171,16 @@ packages: resolution: {integrity: sha512-62layyTGmclHDQS/eidwKRfN1hhCKwViG7iEBcVmL0MXgcAB3OOucWCEcDDGd9Cu11H6b4QQ5oOo47MWIqwz0A==} engines: {node: '>=20.19'} - '@tanstack/start-client-core@1.170.2': - resolution: {integrity: sha512-ZYYwAvdhPHSxjuA5ERP0YTHLomOo3XD3eL/PqlzL3qQhuxE4l3xjKzeBOWsYBo86cejmTsXmfoCHBgqVodPr4w==} + '@tanstack/start-client-core@1.170.4': + resolution: {integrity: sha512-j/Deupf0zR7P5QObN38xTHufCRZkWTb6a/7aauu8eBmzOzDVggvuEdYHRZWiwJ9HRKbR2/SIJASVKeTtj1OcWw==} engines: {node: '>=22.12.0'} '@tanstack/start-fn-stubs@1.162.0': resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.171.3': - resolution: {integrity: sha512-7RE1CByxF6fB6S4WwPK1FE/7T+hhZhqOWc83coQwuPCu1SlW2n+skZNWxJ85KVJgMoDX1G4vW3fvY3GRST4T3w==} + '@tanstack/start-plugin-core@1.171.6': + resolution: {integrity: sha512-e0AUN+omib0qLgs0r3zoKRSeHEkwL8qs8skvbl8zgDQXw9zF73K7ZXE7QarSzbqfLAiehVqlv0iPETp8ogUftQ==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -2183,12 +2191,12 @@ packages: vite: optional: true - '@tanstack/start-server-core@1.169.2': - resolution: {integrity: sha512-MAAONdJfamDNFETs1E1ocNU73qVkcLBIeZHNnraZmVSYFxCXJ2eXkUZxCcc99dbHEnKZaxKMk3t2NXpiZ23lqg==} + '@tanstack/start-server-core@1.169.4': + resolution: {integrity: sha512-iM3HamWRQPROuAb+22frV/+GkqG2a3rL0X14N+Y0Dt5OajrIumPuprOn9ldUXsbdg89RTBf1KoJNDPeYGOqH4g==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.167.7': - resolution: {integrity: sha512-jmTe7mvU4by/nA1IAciJ6iqCh2s0rOIj7vNZ7db48aG9T99GiOkMmkmEquYzxecav/YMBifx6N0vmdNAkcKolg==} + '@tanstack/start-storage-context@1.167.8': + resolution: {integrity: sha512-y9T+bIIp1ihLAXyS2+r+UovSupfu4KydSXpnoeRsw/14/E0huJsX7xB/n6XXOdmDYAaJ2WGOrG9wYjzeIDuBAw==} engines: {node: '>=22.12.0'} '@tanstack/store@0.11.0': @@ -2584,9 +2592,6 @@ packages: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@5.0.6: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} @@ -2645,13 +2650,6 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - - cheerio@1.2.0: - resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} - engines: {node: '>=20.18.1'} - chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} @@ -2771,17 +2769,10 @@ packages: srvx: optional: true - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2899,22 +2890,9 @@ packages: dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dompurify@3.4.5: resolution: {integrity: sha512-OrwIBKsdNSVEeubdJ1HBv/wNENRM9ytAVCv7YXt//A3vPdVMNuACRqK9mXCGCBW2ln7BT/A4X0jXHo2Gu89miA==} - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} @@ -2947,9 +2925,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - encoding-sniffer@0.2.1: - resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} - enhanced-resolve@5.22.0: resolution: {integrity: sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==} engines: {node: '>=10.13.0'} @@ -2958,18 +2933,10 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - entities@8.0.0: resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} engines: {node: '>=20.19.0'} @@ -3383,6 +3350,11 @@ packages: crossws: optional: true + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -3421,8 +3393,8 @@ packages: headers-polyfill@5.0.1: resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} - hono@4.12.22: - resolution: {integrity: sha512-7fvVPbB92zNRsQke+uiRGwtTuef0tB2Dg4hWxYfFNvkQhIltWoyi0ONReM5LWA+jJWS3nfT5lTq+qbsIpX0IQw==} + hono@4.12.23: + resolution: {integrity: sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==} engines: {node: '>=16.9.0'} hookable@6.1.1: @@ -3435,9 +3407,6 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - htmlparser2@10.1.0: - resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -3461,10 +3430,6 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -4042,6 +4007,9 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: @@ -4112,9 +4080,6 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4235,12 +4200,6 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} - parse5-htmlparser2-tree-adapter@7.1.0: - resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} - - parse5-parser-stream@7.1.2: - resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -4765,8 +4724,8 @@ packages: tailwindcss@4.3.0: resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - takumi-js@1.4.1: - resolution: {integrity: sha512-pYR2t5G2+8TKrFi03gNx6tKdyrg5qb41PW8BIHsCLzTTE0F5hrsmKAyzobfPyRmtVrN++RtD+9PuLaJ5YvzTzg==} + takumi-js@1.5.1: + resolution: {integrity: sha512-t/AcU5AjMgigfmSn3BvkZrLGnLPn7/2AkhnUrhqSlQntUfrSYOBks1EqpSGgEPUAKHjQxNH+lptiZAHnUVu/5Q==} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} @@ -4794,11 +4753,11 @@ packages: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - tldts-core@7.1.0: - resolution: {integrity: sha512-Ou+YJ467tR700sk2mZBB1/uFah6LDeH/VKO0N4xfjFOXE0hJkZgiOgXj16gEi1wQ4L6334UTKjxF6gum8ftZzQ==} + tldts-core@7.4.0: + resolution: {integrity: sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ==} - tldts@7.1.0: - resolution: {integrity: sha512-Y+iRHtDrPOlNH9ZZpqpIogonv7jwSPHIt3Gpe+kRvYJlBaK+QGNXu+xooJY0QEmb62/ERo3GF3zCxRMbMtKEEA==} + tldts@7.4.0: + resolution: {integrity: sha512-yHBe+zVfzNZ3QfTPW/Z6KK1G2t340gFjMHqI/4KKSt/abzYydzuCnpqdaF5gCCABby+9Yfbj59oR5F2Fd5CBzg==} hasBin: true to-regex-range@5.0.1: @@ -4843,11 +4802,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.22.3: - resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==} - engines: {node: '>=18.0.0'} - hasBin: true - turbo-stream@3.2.0: resolution: {integrity: sha512-EK+bZ9UVrVh7JLslVFOV0GEMsociOqVOvEMTAd4ixMyffN5YNIEdLZWXUx5PJqDbTxSIBWw04HS9gCY4frYQDQ==} @@ -4870,11 +4824,16 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - undici@7.25.0: - resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + undici@7.26.0: + resolution: {integrity: sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==} engines: {node: '>=20.18.1'} unenv@2.0.0-rc.24: @@ -5136,15 +5095,6 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} @@ -5166,6 +5116,9 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -5261,29 +5214,29 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.3': {} + '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.0': + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -5293,171 +5246,169 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': + '@babel/generator@7.29.7': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + '@babel/helper-annotate-as-pure@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.29.3 - '@babel/helper-validator-option': 7.27.1 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.29.0)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.28.5': + '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-optimise-call-expression@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helpers@7.29.2': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 - '@babel/parser@7.29.3': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)': + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/runtime@7.29.2': {} - '@babel/runtime@7.29.7': {} - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@base-ui/react@1.5.0(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@base-ui/utils': 0.2.9(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@floating-ui/utils': 0.2.11 @@ -5469,7 +5420,7 @@ snapshots: '@base-ui/utils@0.2.9(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@floating-ui/utils': 0.2.11 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) @@ -5676,7 +5627,7 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} - '@dotenvx/dotenvx@1.67.0': + '@dotenvx/dotenvx@1.68.1': dependencies: commander: 11.1.0 dotenv: 17.4.2 @@ -5813,12 +5764,12 @@ snapshots: '@fontsource-variable/geist@5.2.9': {} - '@fumadocs/base-ui@16.9.1(@tailwindcss/oxide@4.3.0)(@takumi-rs/image-response@1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0)': + '@fumadocs/base-ui@16.9.1(@tailwindcss/oxide@4.3.0)(@takumi-rs/image-response@1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0)': dependencies: '@base-ui/react': 1.5.0(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@fumadocs/tailwind': 0.0.5(@tailwindcss/oxide@4.3.0)(tailwindcss@4.3.0) class-variance-authority: 0.7.1 - fumadocs-core: 16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + fumadocs-core: 16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) lucide-react: 1.16.0(react@19.2.6) motion: 12.40.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next-themes: 0.4.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -5831,7 +5782,7 @@ snapshots: tailwind-merge: 3.6.0 unist-util-visit: 5.1.0 optionalDependencies: - '@takumi-rs/image-response': 1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@takumi-rs/image-response': 1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@types/mdx': 2.0.13 '@types/react': 19.2.15 transitivePeerDependencies: @@ -5846,9 +5797,9 @@ snapshots: '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - '@hono/node-server@1.19.14(hono@4.12.22)': + '@hono/node-server@1.19.14(hono@4.12.23)': dependencies: - hono: 4.12.22 + hono: 4.12.23 '@inquirer/ansi@2.0.5': {} @@ -5951,7 +5902,7 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.22) + '@hono/node-server': 1.19.14(hono@4.12.23) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -5961,7 +5912,7 @@ snapshots: eventsource-parser: 3.0.8 express: 5.2.1 express-rate-limit: 8.5.2(express@5.2.1) - hono: 4.12.22 + hono: 4.12.23 jose: 6.2.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -6563,68 +6514,68 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.3.0 - '@tailwindcss/vite@4.3.0(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))': + '@tailwindcss/vite@4.3.0(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))': dependencies: '@tailwindcss/node': 4.3.0 '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' - '@takumi-rs/core-darwin-arm64@1.4.1': + '@takumi-rs/core-darwin-arm64@1.5.1': optional: true - '@takumi-rs/core-darwin-x64@1.4.1': + '@takumi-rs/core-darwin-x64@1.5.1': optional: true - '@takumi-rs/core-linux-arm64-gnu@1.4.1': + '@takumi-rs/core-linux-arm64-gnu@1.5.1': optional: true - '@takumi-rs/core-linux-arm64-musl@1.4.1': + '@takumi-rs/core-linux-arm64-musl@1.5.1': optional: true - '@takumi-rs/core-linux-x64-gnu@1.4.1': + '@takumi-rs/core-linux-x64-gnu@1.5.1': optional: true - '@takumi-rs/core-linux-x64-musl@1.4.1': + '@takumi-rs/core-linux-x64-musl@1.5.1': optional: true - '@takumi-rs/core-win32-arm64-msvc@1.4.1': + '@takumi-rs/core-win32-arm64-msvc@1.5.1': optional: true - '@takumi-rs/core-win32-x64-msvc@1.4.1': + '@takumi-rs/core-win32-x64-msvc@1.5.1': optional: true - '@takumi-rs/core@1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@takumi-rs/core@1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@takumi-rs/helpers': 1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@takumi-rs/helpers': 1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) optionalDependencies: - '@takumi-rs/core-darwin-arm64': 1.4.1 - '@takumi-rs/core-darwin-x64': 1.4.1 - '@takumi-rs/core-linux-arm64-gnu': 1.4.1 - '@takumi-rs/core-linux-arm64-musl': 1.4.1 - '@takumi-rs/core-linux-x64-gnu': 1.4.1 - '@takumi-rs/core-linux-x64-musl': 1.4.1 - '@takumi-rs/core-win32-arm64-msvc': 1.4.1 - '@takumi-rs/core-win32-x64-msvc': 1.4.1 + '@takumi-rs/core-darwin-arm64': 1.5.1 + '@takumi-rs/core-darwin-x64': 1.5.1 + '@takumi-rs/core-linux-arm64-gnu': 1.5.1 + '@takumi-rs/core-linux-arm64-musl': 1.5.1 + '@takumi-rs/core-linux-x64-gnu': 1.5.1 + '@takumi-rs/core-linux-x64-musl': 1.5.1 + '@takumi-rs/core-win32-arm64-msvc': 1.5.1 + '@takumi-rs/core-win32-x64-msvc': 1.5.1 transitivePeerDependencies: - react - react-dom - '@takumi-rs/helpers@1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@takumi-rs/helpers@1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': optionalDependencies: react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@takumi-rs/image-response@1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@takumi-rs/image-response@1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - takumi-js: 1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + takumi-js: 1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) transitivePeerDependencies: - react - react-dom - '@takumi-rs/wasm@1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@takumi-rs/wasm@1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@takumi-rs/helpers': 1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@takumi-rs/helpers': 1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) transitivePeerDependencies: - react - react-dom @@ -6651,7 +6602,7 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.7.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))': + '@tanstack/devtools-vite@0.7.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))': dependencies: '@tanstack/devtools-client': 0.0.6 '@tanstack/devtools-event-bus': 0.4.1 @@ -6660,7 +6611,7 @@ snapshots: magic-string: 0.30.21 oxc-parser: 0.120.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) picomatch: 4.0.4 - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -6716,61 +6667,61 @@ snapshots: '@tanstack/query-core': 5.100.14 react: 19.2.6 - '@tanstack/react-router-devtools@1.167.0(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.5)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-router-devtools@1.167.0(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.6)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-devtools-core': 1.168.0(@tanstack/router-core@1.171.5)(csstype@3.2.3) + '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-devtools-core': 1.168.0(@tanstack/router-core@1.171.6)(csstype@3.2.3) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@tanstack/router-core': 1.171.5 + '@tanstack/router-core': 1.171.6 transitivePeerDependencies: - csstype - '@tanstack/react-router-ssr-query@1.167.0(@tanstack/query-core@5.100.14)(@tanstack/react-query@5.100.14(react@19.2.6))(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-router-ssr-query@1.167.0(@tanstack/query-core@5.100.14)(@tanstack/react-query@5.100.14(react@19.2.6))(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.6)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/query-core': 5.100.14 '@tanstack/react-query': 5.100.14(react@19.2.6) - '@tanstack/react-router': 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-ssr-query-core': 1.169.0(@tanstack/query-core@5.100.14)(@tanstack/router-core@1.171.5) + '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-ssr-query-core': 1.169.0(@tanstack/query-core@5.100.14)(@tanstack/router-core@1.171.6) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) transitivePeerDependencies: - '@tanstack/router-core' - '@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/history': 1.162.0 '@tanstack/react-store': 0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-core': 1.171.5 + '@tanstack/router-core': 1.171.6 isbot: 5.1.40 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@tanstack/react-start-client@1.168.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-start-client@1.168.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-core': 1.171.5 - '@tanstack/start-client-core': 1.170.2 + '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.6 + '@tanstack/start-client-core': 1.170.4 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@tanstack/react-start-rsc@0.1.10(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-start-rsc@0.1.13(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/react-start-server': 1.167.7(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-core': 1.171.5 + '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-server': 1.167.9(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.6 '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.2 + '@tanstack/start-client-core': 1.170.4 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.3(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16)) - '@tanstack/start-server-core': 1.169.2(crossws@0.4.5(srvx@0.11.16)) - '@tanstack/start-storage-context': 1.167.7 + '@tanstack/start-plugin-core': 1.171.6(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-server-core': 1.169.4(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-storage-context': 1.167.8 pathe: 2.0.3 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@vitejs/plugin-rsc': 0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@vitejs/plugin-rsc': 0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -6779,34 +6730,34 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start-server@1.167.7(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-start-server@1.167.9(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/history': 1.162.0 - '@tanstack/react-router': 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-core': 1.171.5 - '@tanstack/start-client-core': 1.170.2 - '@tanstack/start-server-core': 1.169.2(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.6 + '@tanstack/start-client-core': 1.170.4 + '@tanstack/start-server-core': 1.169.4(crossws@0.4.5(srvx@0.11.16)) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.10(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-start@1.168.13(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/react-start-client': 1.168.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/react-start-rsc': 0.1.10(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/react-start-server': 1.167.7(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-client': 1.168.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-rsc': 0.1.13(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-server': 1.167.9(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.2 - '@tanstack/start-plugin-core': 1.171.3(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16)) - '@tanstack/start-server-core': 1.169.2(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-client-core': 1.170.4 + '@tanstack/start-plugin-core': 1.171.6(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-server-core': 1.169.4(crossws@0.4.5(srvx@0.11.16)) pathe: 2.0.3 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@vitejs/plugin-rsc': 0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + '@vitejs/plugin-rsc': 0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' transitivePeerDependencies: - '@rspack/core' - crossws @@ -6829,25 +6780,25 @@ snapshots: react-dom: 19.2.6(react@19.2.6) use-sync-external-store: 1.6.0(react@19.2.6) - '@tanstack/router-core@1.171.5': + '@tanstack/router-core@1.171.6': dependencies: '@tanstack/history': 1.162.0 cookie-es: 3.1.1 seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - '@tanstack/router-devtools-core@1.168.0(@tanstack/router-core@1.171.5)(csstype@3.2.3)': + '@tanstack/router-devtools-core@1.168.0(@tanstack/router-core@1.171.6)(csstype@3.2.3)': dependencies: - '@tanstack/router-core': 1.171.5 + '@tanstack/router-core': 1.171.6 clsx: 2.1.1 goober: 2.1.19(csstype@3.2.3) optionalDependencies: csstype: 3.2.3 - '@tanstack/router-generator@1.167.9': + '@tanstack/router-generator@1.167.10': dependencies: - '@babel/types': 7.29.0 - '@tanstack/router-core': 1.171.5 + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.6 '@tanstack/router-utils': 1.162.1 '@tanstack/virtual-file-routes': 1.162.0 jiti: 2.7.0 @@ -6857,38 +6808,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.10(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))': + '@tanstack/router-plugin@1.168.11(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))': dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@tanstack/router-core': 1.171.5 - '@tanstack/router-generator': 1.167.9 + '@babel/core': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.6 + '@tanstack/router-generator': 1.167.10 '@tanstack/router-utils': 1.162.1 '@tanstack/virtual-file-routes': 1.162.0 chokidar: 5.0.0 unplugin: 3.0.0 zod: 4.4.3 optionalDependencies: - '@tanstack/react-router': 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' transitivePeerDependencies: - supports-color - '@tanstack/router-ssr-query-core@1.169.0(@tanstack/query-core@5.100.14)(@tanstack/router-core@1.171.5)': + '@tanstack/router-ssr-query-core@1.169.0(@tanstack/query-core@5.100.14)(@tanstack/router-core@1.171.6)': dependencies: '@tanstack/query-core': 5.100.14 - '@tanstack/router-core': 1.171.5 + '@tanstack/router-core': 1.171.6 '@tanstack/router-utils@1.162.1': dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 ansis: 4.3.0 babel-dead-code-elimination: 1.0.12 diff: 8.0.4 @@ -6897,28 +6848,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/start-client-core@1.170.2': + '@tanstack/start-client-core@1.170.4': dependencies: - '@tanstack/router-core': 1.171.5 + '@tanstack/router-core': 1.171.6 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-storage-context': 1.167.7 + '@tanstack/start-storage-context': 1.167.8 seroval: 1.5.4 '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.3(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))': + '@tanstack/start-plugin-core@1.171.6(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))': dependencies: '@babel/code-frame': 7.27.1 - '@babel/core': 7.29.0 - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/types': 7.29.7 '@rolldown/pluginutils': 1.0.1 - '@tanstack/router-core': 1.171.5 - '@tanstack/router-generator': 1.167.9 - '@tanstack/router-plugin': 1.168.10(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)) + '@tanstack/router-core': 1.171.6 + '@tanstack/router-generator': 1.167.10 + '@tanstack/router-plugin': 1.168.11(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.2 - '@tanstack/start-server-core': 1.169.2(crossws@0.4.5(srvx@0.11.16)) - cheerio: 1.2.0 + '@tanstack/start-client-core': 1.170.4 + '@tanstack/start-server-core': 1.169.4(crossws@0.4.5(srvx@0.11.16)) exsolve: 1.0.8 lightningcss: 1.32.0 pathe: 2.0.3 @@ -6928,11 +6878,11 @@ snapshots: srvx: 0.11.16 tinyglobby: 0.2.16 ufo: 1.6.4 - vitefu: 1.1.3(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)) + vitefu: 1.1.3(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) xmlbuilder2: 4.0.3 zod: 4.4.3 optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' transitivePeerDependencies: - '@tanstack/react-router' - crossws @@ -6940,21 +6890,21 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.169.2(crossws@0.4.5(srvx@0.11.16))': + '@tanstack/start-server-core@1.169.4(crossws@0.4.5(srvx@0.11.16))': dependencies: '@tanstack/history': 1.162.0 - '@tanstack/router-core': 1.171.5 - '@tanstack/start-client-core': 1.170.2 - '@tanstack/start-storage-context': 1.167.7 + '@tanstack/router-core': 1.171.6 + '@tanstack/start-client-core': 1.170.4 + '@tanstack/start-storage-context': 1.167.8 fetchdts: 0.1.7 h3-v2: h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.16)) seroval: 1.5.4 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.167.7': + '@tanstack/start-storage-context@1.167.8': dependencies: - '@tanstack/router-core': 1.171.5 + '@tanstack/router-core': 1.171.6 '@tanstack/store@0.11.0': {} @@ -6964,8 +6914,8 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -6975,7 +6925,7 @@ snapshots: '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) @@ -7070,12 +7020,12 @@ snapshots: '@vercel/oidc@3.4.1': {} - '@vitejs/plugin-react@6.0.2(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))': + '@vitejs/plugin-react@6.0.2(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' - '@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@rolldown/pluginutils': 1.0.0-rc.18 es-module-lexer: 2.1.0 @@ -7086,10 +7036,10 @@ snapshots: srvx: 0.11.16 strip-literal: 3.1.0 turbo-stream: 3.2.0 - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' - vitefu: 1.1.3(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)) + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' + vitefu: 1.1.3(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) - '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)': + '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)': dependencies: '@oxc-project/runtime': 0.129.0 '@oxc-project/types': 0.129.0 @@ -7100,7 +7050,6 @@ snapshots: esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.7.0 - tsx: 4.22.3 typescript: 6.0.3 '@voidzero-dev/vite-plus-darwin-arm64@0.1.22': @@ -7121,11 +7070,11 @@ snapshots: '@voidzero-dev/vite-plus-linux-x64-musl@0.1.22': optional: true - '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)': + '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3) + '@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3) es-module-lexer: 1.7.0 obug: 2.1.1 pixelmatch: 7.2.0 @@ -7135,7 +7084,7 @@ snapshots: tinybench: 2.9.0 tinyexec: 1.2.2 tinyglobby: 0.2.16 - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' ws: 8.21.0 optionalDependencies: '@opentelemetry/api': 1.9.1 @@ -7163,11 +7112,11 @@ snapshots: - utf-8-validate - yaml - '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3))': + '@voidzero-dev/vite-plus-test@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0))': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3) + '@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3) es-module-lexer: 1.7.0 obug: 2.1.1 pixelmatch: 7.2.0 @@ -7177,7 +7126,7 @@ snapshots: tinybench: 2.9.0 tinyexec: 1.2.2 tinyglobby: 0.2.16 - vite: 8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3) + vite: 8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0) ws: 8.21.0 optionalDependencies: '@opentelemetry/api': 1.9.1 @@ -7271,10 +7220,10 @@ snapshots: babel-dead-code-elimination@1.0.12: dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -7306,8 +7255,6 @@ snapshots: transitivePeerDependencies: - supports-color - boolbase@1.0.0: {} - brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -7358,29 +7305,6 @@ snapshots: chardet@2.1.1: {} - cheerio-select@2.1.0: - dependencies: - boolbase: 1.0.0 - css-select: 5.2.2 - css-what: 6.2.2 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - - cheerio@1.2.0: - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.2.2 - encoding-sniffer: 0.2.1 - htmlparser2: 10.1.0 - parse5: 7.3.0 - parse5-htmlparser2-tree-adapter: 7.1.0 - parse5-parser-stream: 7.1.2 - undici: 7.25.0 - whatwg-mimetype: 4.0.0 - chokidar@5.0.0: dependencies: readdirp: 5.0.0 @@ -7469,21 +7393,11 @@ snapshots: optionalDependencies: srvx: 0.11.16 - css-select@5.2.2: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - css-tree@3.2.1: dependencies: mdn-data: 2.27.1 source-map-js: 1.2.1 - css-what@6.2.2: {} - cssesc@3.0.0: {} csstype@3.2.3: {} @@ -7548,28 +7462,10 @@ snapshots: dom-accessibility-api@0.5.16: {} - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - dompurify@3.4.5: optionalDependencies: '@types/trusted-types': 2.0.7 - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dotenv@17.4.2: {} dotenv@8.6.0: {} @@ -7597,11 +7493,6 @@ snapshots: encodeurl@2.0.0: {} - encoding-sniffer@0.2.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-encoding: 3.1.1 - enhanced-resolve@5.22.0: dependencies: graceful-fs: 4.2.11 @@ -7612,12 +7503,8 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - entities@4.5.0: {} - entities@6.0.1: {} - entities@7.0.1: {} - entities@8.0.0: {} env-paths@2.2.1: {} @@ -7913,7 +7800,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3): + fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3): dependencies: '@orama/orama': 3.1.18 estree-util-value-to-estree: 3.5.0 @@ -7934,7 +7821,7 @@ snapshots: vfile: 6.0.3 optionalDependencies: '@mdx-js/mdx': 3.1.1 - '@tanstack/react-router': 1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -7946,14 +7833,14 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@15.0.8(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react@19.2.6)(rolldown@1.0.2): + fumadocs-mdx@15.0.8(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(fumadocs-core@16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react@19.2.6)(rolldown@1.0.2): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.28.0 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + fumadocs-core: 16.9.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.16.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) js-yaml: 4.1.1 mdast-util-mdx: 3.0.0 picocolors: 1.1.1 @@ -7971,7 +7858,7 @@ snapshots: '@types/react': 19.2.15 react: 19.2.6 rolldown: 1.0.2 - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' transitivePeerDependencies: - supports-color @@ -8053,6 +7940,15 @@ snapshots: optionalDependencies: crossws: 0.4.5(srvx@0.11.16) + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-symbols@1.1.0: {} hasown@2.0.3: @@ -8172,7 +8068,7 @@ snapshots: '@types/set-cookie-parser': 2.4.10 set-cookie-parser: 3.1.0 - hono@4.12.22: {} + hono@4.12.23: {} hookable@6.1.1: {} @@ -8184,13 +8080,6 @@ snapshots: html-void-elements@3.0.0: {} - htmlparser2@10.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 7.0.1 - http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -8214,10 +8103,6 @@ snapshots: human-signals@8.0.1: {} - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -8340,7 +8225,7 @@ snapshots: saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.25.0 + undici: 7.26.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -8975,6 +8860,8 @@ snapshots: negotiator@1.0.0: {} + neo-async@2.6.2: {} + next-themes@0.4.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: react: 19.2.6 @@ -8982,7 +8869,7 @@ snapshots: nf3@0.3.17: {} - nitro@3.0.260522-beta(@vercel/functions@3.6.0)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(chokidar@5.0.0)(dotenv@17.4.2)(jiti@2.7.0)(lru-cache@11.5.0): + nitro@3.0.260522-beta(@vercel/functions@3.6.0)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(chokidar@5.0.0)(dotenv@17.4.2)(jiti@2.7.0)(lru-cache@11.5.0): dependencies: consola: 3.4.2 crossws: 0.4.5(srvx@0.11.16) @@ -9001,7 +8888,7 @@ snapshots: optionalDependencies: dotenv: 17.4.2 jiti: 2.7.0 - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9056,10 +8943,6 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -9245,22 +9128,13 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-ms@4.0.0: {} - parse5-htmlparser2-tree-adapter@7.1.0: - dependencies: - domhandler: 5.0.3 - parse5: 7.3.0 - - parse5-parser-stream@7.1.2: - dependencies: - parse5: 7.3.0 - parse5@7.3.0: dependencies: entities: 6.0.1 @@ -9683,11 +9557,11 @@ snapshots: shadcn@4.8.0(@types/node@25.9.1)(typescript@6.0.3): dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@dotenvx/dotenvx': 1.67.0 + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@dotenvx/dotenvx': 1.68.1 '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) '@types/validate-npm-package-name': 4.0.2 browserslist: 4.28.2 @@ -9878,11 +9752,11 @@ snapshots: tailwindcss@4.3.0: {} - takumi-js@1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + takumi-js@1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - '@takumi-rs/core': 1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@takumi-rs/helpers': 1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@takumi-rs/wasm': 1.4.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@takumi-rs/core': 1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@takumi-rs/helpers': 1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@takumi-rs/wasm': 1.5.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) transitivePeerDependencies: - react - react-dom @@ -9904,11 +9778,11 @@ snapshots: tinypool@2.1.0: {} - tldts-core@7.1.0: {} + tldts-core@7.4.0: {} - tldts@7.1.0: + tldts@7.4.0: dependencies: - tldts-core: 7.1.0 + tldts-core: 7.4.0 to-regex-range@5.0.1: dependencies: @@ -9920,7 +9794,7 @@ snapshots: tough-cookie@6.0.1: dependencies: - tldts: 7.1.0 + tldts: 7.4.0 tr46@0.0.3: {} @@ -9950,13 +9824,6 @@ snapshots: tslib@2.8.1: {} - tsx@4.22.3: - dependencies: - esbuild: 0.28.0 - optionalDependencies: - fsevents: 2.3.3 - optional: true - turbo-stream@3.2.0: {} tw-animate-css@1.4.0: {} @@ -9975,9 +9842,12 @@ snapshots: ufo@1.6.4: {} + uglify-js@3.19.3: + optional: true + undici-types@7.24.6: {} - undici@7.25.0: {} + undici@7.26.0: {} unenv@2.0.0-rc.24: dependencies: @@ -10097,12 +9967,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plus@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3): + vite-plus@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3): dependencies: '@oxc-project/types': 0.129.0 '@oxlint/plugins': 1.61.0 - '@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3) - '@voidzero-dev/vite-plus-test': 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3) + '@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3) + '@voidzero-dev/vite-plus-test': 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3) oxfmt: 0.48.0 oxlint: 1.63.0(oxlint-tsgolint@0.22.1) oxlint-tsgolint: 0.22.1 @@ -10146,12 +10016,12 @@ snapshots: - vite - yaml - vite-plus@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)): + vite-plus@0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)): dependencies: '@oxc-project/types': 0.129.0 '@oxlint/plugins': 1.61.0 - '@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3) - '@voidzero-dev/vite-plus-test': 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(tsx@4.22.3)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)) + '@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3) + '@voidzero-dev/vite-plus-test': 0.1.22(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)) oxfmt: 0.48.0 oxlint: 1.63.0(oxlint-tsgolint@0.22.1) oxlint-tsgolint: 0.22.1 @@ -10195,7 +10065,7 @@ snapshots: - vite - yaml - vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3): + vite@8.0.14(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -10207,11 +10077,10 @@ snapshots: esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.7.0 - tsx: 4.22.3 - vitefu@1.1.3(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)): + vitefu@1.1.3(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)): optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.3)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' w3c-xmlserializer@5.0.0: dependencies: @@ -10229,12 +10098,6 @@ snapshots: webpack-virtual-modules@0.6.2: {} - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@4.0.0: {} - whatwg-mimetype@5.0.0: {} whatwg-url@16.0.1(@noble/hashes@1.8.0): @@ -10258,6 +10121,8 @@ snapshots: dependencies: isexe: 3.1.5 + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 diff --git a/registry/modules/tooling-eslint-prettier/module.ts b/registry/modules/tooling-eslint-prettier/module.ts index 0a3c69d..8f28b91 100644 --- a/registry/modules/tooling-eslint-prettier/module.ts +++ b/registry/modules/tooling-eslint-prettier/module.ts @@ -1,4 +1,12 @@ -import { defineModule } from "@stanza/registry"; +import { defineModule, type TemplateRef } from "@stanza/registry"; + +// Same templates regardless of which framework adapter wins. The eslint config +// is a single Handlebars template that branches on `{{peers.framework}}`, so +// pure-TS, Next, and TanStack Start all render from the same source file. +const templates: TemplateRef[] = [ + { src: "eslint.config.mjs", dest: "eslint.config.mjs", scope: "repo", template: true }, + { src: "prettier.config.mjs", dest: "prettier.config.mjs", scope: "repo" }, +]; export default defineModule({ id: "eslint-prettier", @@ -7,13 +15,14 @@ export default defineModule({ description: "ESLint (flat config) for linting and Prettier for formatting.", version: "0.1.0", homepage: "https://eslint.org", - // ESLint config differs per framework, so dispatch on the framework pick. - peers: { framework: ["next", "tanstack-start"] }, + // Framework-agnostic base; adapters layer on framework-specific plugins via + // Handlebars conditionals in the shared template — same shape as the + // tooling-biome / tooling-oxlint-oxfmt siblings, which also install without + // a framework peer. devDependencies: { eslint: "^9.39.0", "@eslint/js": "^9.39.0", "typescript-eslint": "^8.46.0", - "eslint-plugin-react-hooks": "^7.0.0", prettier: "^3.6.2", "eslint-config-prettier": "^10.1.8", }, @@ -25,20 +34,25 @@ export default defineModule({ { key: "next", match: { framework: "next" }, - devDependencies: { "@next/eslint-plugin-next": "^16.2.6" }, - templates: [ - { src: "eslint.config.next.mjs", dest: "eslint.config.mjs", scope: "repo" }, - { src: "prettier.config.mjs", dest: "prettier.config.mjs", scope: "repo" }, - ], + devDependencies: { + "@next/eslint-plugin-next": "^16.2.6", + "eslint-plugin-react-hooks": "^7.0.0", + }, + templates, }, { key: "tanstack-start", match: { framework: "tanstack-start" }, - devDependencies: { "eslint-plugin-react": "^7.37.5" }, - templates: [ - { src: "eslint.config.tanstack.mjs", dest: "eslint.config.mjs", scope: "repo" }, - { src: "prettier.config.mjs", dest: "prettier.config.mjs", scope: "repo" }, - ], + devDependencies: { + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.0", + }, + templates, + }, + { + key: "default", + match: {}, + templates, }, ], }); diff --git a/registry/modules/tooling-eslint-prettier/templates/eslint.config.mjs b/registry/modules/tooling-eslint-prettier/templates/eslint.config.mjs new file mode 100644 index 0000000..4799e7d --- /dev/null +++ b/registry/modules/tooling-eslint-prettier/templates/eslint.config.mjs @@ -0,0 +1,55 @@ +import js from "@eslint/js"; +import tseslint from "typescript-eslint"; +{{#if (eq peers.framework "next")}} +import next from "@next/eslint-plugin-next"; +import reactHooks from "eslint-plugin-react-hooks"; +{{/if}} +{{#if (eq peers.framework "tanstack-start")}} +import react from "eslint-plugin-react"; +import reactHooks from "eslint-plugin-react-hooks"; +{{/if}} +import prettier from "eslint-config-prettier"; + +export default tseslint.config( + { + ignores: [ + "**/node_modules/**", + "**/dist/**", +{{#if (eq peers.framework "next")}} + "**/.next/**", + "**/next-env.d.ts", +{{/if}} +{{#if (eq peers.framework "tanstack-start")}} + "**/.output/**", + "**/.nitro/**", + "**/routeTree.gen.ts", +{{/if}} + ], + }, + js.configs.recommended, + ...tseslint.configs.recommended, +{{#if (eq peers.framework "next")}} + { + plugins: { + "@next/next": next, + "react-hooks": reactHooks, + }, + rules: { + ...next.configs.recommended.rules, + ...next.configs["core-web-vitals"].rules, + ...reactHooks.configs.recommended.rules, + }, + }, +{{/if}} +{{#if (eq peers.framework "tanstack-start")}} + { + plugins: { react, "react-hooks": reactHooks }, + settings: { react: { version: "detect" } }, + rules: { + ...reactHooks.configs.recommended.rules, + "react/react-in-jsx-scope": "off", + }, + }, +{{/if}} + prettier, +); diff --git a/registry/modules/tooling-eslint-prettier/templates/eslint.config.next.mjs b/registry/modules/tooling-eslint-prettier/templates/eslint.config.next.mjs deleted file mode 100644 index 91f8a20..0000000 --- a/registry/modules/tooling-eslint-prettier/templates/eslint.config.next.mjs +++ /dev/null @@ -1,24 +0,0 @@ -import js from "@eslint/js"; -import next from "@next/eslint-plugin-next"; -import reactHooks from "eslint-plugin-react-hooks"; -import tseslint from "typescript-eslint"; -import prettier from "eslint-config-prettier"; - -export default tseslint.config( - { ignores: ["**/.next/**", "**/node_modules/**", "**/next-env.d.ts", "**/dist/**"] }, - js.configs.recommended, - ...tseslint.configs.recommended, - { - plugins: { - "@next/next": next, - "react-hooks": reactHooks, - }, - rules: { - ...next.configs.recommended.rules, - ...next.configs["core-web-vitals"].rules, - ...reactHooks.configs.recommended.rules, - }, - }, - // Disables stylistic rules that conflict with Prettier — keep last. - prettier, -); diff --git a/registry/modules/tooling-eslint-prettier/templates/eslint.config.tanstack.mjs b/registry/modules/tooling-eslint-prettier/templates/eslint.config.tanstack.mjs deleted file mode 100644 index f8d7910..0000000 --- a/registry/modules/tooling-eslint-prettier/templates/eslint.config.tanstack.mjs +++ /dev/null @@ -1,21 +0,0 @@ -import js from "@eslint/js"; -import react from "eslint-plugin-react"; -import reactHooks from "eslint-plugin-react-hooks"; -import tseslint from "typescript-eslint"; -import prettier from "eslint-config-prettier"; - -export default tseslint.config( - { ignores: ["**/dist/**", "**/.output/**", "**/.nitro/**", "**/node_modules/**", "**/routeTree.gen.ts"] }, - js.configs.recommended, - ...tseslint.configs.recommended, - { - plugins: { react, "react-hooks": reactHooks }, - settings: { react: { version: "detect" } }, - rules: { - ...reactHooks.configs.recommended.rules, - "react/react-in-jsx-scope": "off", - }, - }, - // Disables stylistic rules that conflict with Prettier — keep last. - prettier, -);