diff --git a/.gitignore b/.gitignore index afc222e7..315461c7 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ package-lock.json yarn.lock # TESTING -/coverage +coverage/ *.lcov .nyc_output diff --git a/apps/docs/next.config.ts b/apps/docs/next.config.ts index 86859d98..5649c293 100644 --- a/apps/docs/next.config.ts +++ b/apps/docs/next.config.ts @@ -1,14 +1,14 @@ import { createMDX } from "fumadocs-mdx/next"; import { type NextConfig } from "next"; -import { validateRegistry } from "@/registry/lib/validator"; +import { validateRegistry } from "@proofkit/registry"; const withMDX = createMDX(); -validateRegistry(); +// validateRegistry(); const config: NextConfig = { reactStrictMode: true, serverExternalPackages: ["typescript", "twoslash", "shiki"], - transpilePackages: ["@proofkit/fmdapi"], + transpilePackages: ["@proofkit/fmdapi", "@proofkit/registry"], async redirects() { return [ { diff --git a/apps/docs/package.json b/apps/docs/package.json index 9247aaf6..d811c32a 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -10,6 +10,7 @@ "test": "vitest run" }, "dependencies": { + "@proofkit/registry": "workspace:*", "@proofkit/typegen": "workspace:*", "@proofkit/webviewer": "workspace:*", "@radix-ui/react-separator": "^1.1.7", diff --git a/apps/docs/src/app/r/[[...name]]/registry.ts b/apps/docs/src/app/r/[[...name]]/registry.ts index 26c20f9a..6d9c4555 100644 --- a/apps/docs/src/app/r/[[...name]]/registry.ts +++ b/apps/docs/src/app/r/[[...name]]/registry.ts @@ -1,6 +1,12 @@ import { Hono } from "hono"; -import { getRegistryIndex, getStaticComponent } from "@/registry/lib/utils"; +import { + getComponentMeta, + getRegistryIndex, + getStaticComponent, +} from "@proofkit/registry"; +import { createMiddleware } from "hono/factory"; +import type { TemplateMetadata } from "@proofkit/registry"; const app = new Hono().basePath("/r"); @@ -16,18 +22,57 @@ app.get("/", async (c) => { } }); -// Handle registry requests at base path "/r" -app.get("/:path", async (c) => { - const path = c.req.param("path"); +const componentMeta = (basePath: string) => + createMiddleware<{ + Variables: { meta: TemplateMetadata; path: string }; + }>(async (c, next) => { + console.log("c.req.path", c.req.path); + console.log("basePath", basePath); + const path = c.req.path.replace(basePath, "").replace(/\.json$/, ""); + console.log("path", path); + c.set("path", path); - // Support both with and without .json suffix; path may contain slashes - const pathWithoutJson = path.replace(/\.json$/, ""); - try { - const data = await getStaticComponent(pathWithoutJson); - return c.json(data); - } catch (error) { - console.error(error); - return c.json({ error: "Component not found." }, { status: 404 }); + try { + const meta = await getComponentMeta(path); + c.set("meta", meta); + await next(); + } catch (error) { + console.error(error); + return c.json({ error: "Component not found." }, { status: 404 }); + } + }); + +// Handle meta requests first (more specific route) +app.get("/meta/*", componentMeta("/r/meta"), async (c) => { + const meta = c.get("meta"); + return c.json(meta, 200); +}); + +// Handle registry requests at base path "/r" (less specific route) +app.get("/*", componentMeta("/r"), async (c) => { + const path = c.get("path"); + const requestUrl = new URL(c.req.url); + + const meta = c.get("meta"); + if (meta.type === "static") { + try { + const data = await getStaticComponent(path); + + return c.json({ + ...data, + registryDependencies: data.registryDependencies?.map((x) => + x.replace("{proofkit}", requestUrl.origin), + ), + }); + } catch (error) { + console.error(error); + return c.json({ error: "Component not found." }, { status: 404 }); + } + } else { + return c.json( + { error: "Dynamic components are not supported yet." }, + { status: 501 }, + ); } }); diff --git a/apps/docs/src/registry/lib/types.ts b/apps/docs/src/registry/lib/types.ts deleted file mode 100644 index d0d8260c..00000000 --- a/apps/docs/src/registry/lib/types.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { z } from "zod/v4"; -import { - type RegistryItem as ShadcnRegistryItem, - registryItemTypeSchema, -} from "shadcn/registry"; - -const registryTypeSchema = z - .enum([ - "registry:lib", - "registry:block", - "registry:component", - "registry:ui", - "registry:hook", - "registry:page", - "registry:file", - "registry:theme", - "registry:style", - "registry:item", - "registry:example", - "registry:internal", - ]) - .describe( - "The type property is used to specify the type of your registry item. This is used to determine the type and target path of the item when resolved for a project.", - ); - -// Defines a single file within a template -export const templateFileSchema = z.discriminatedUnion("type", [ - z.object({ - // The name of the file within this template directory - sourceFileName: z.string(), - // The destination path in a consumer project, relative to project root - destinationPath: z.string(), - type: registryTypeSchema.extract(["registry:file", "registry:page"]), - }), - z.object({ - sourceFileName: z.string(), - destinationPath: z.string().optional(), - type: registryTypeSchema.exclude(["registry:file", "registry:page"]), - }), -]); - -// Defines the metadata for a single template (_meta.ts) -export const templateMetadataSchema = z.object({ - title: z.string(), - registryType: registryTypeSchema, - type: z.literal("static"), - description: z.string().optional(), - categories: z.array(z.enum(["component", "page", "utility", "hook"])), - files: z.array(templateFileSchema), - dependencies: z - .array(z.string()) - .describe("NPM package dependencies") - .optional(), - registryDependencies: z - .array(z.string()) - .describe("Other components") - .optional(), -}); - -export type TemplateFile = z.infer; -export type TemplateMetadata = z.infer; - -// Adapt shadcn RegistryItem: require `content` in files and allow both single and array forms - -export type ShadcnFilesUnion = Required< - Exclude[number] ->[]; - -export type RegistryItem = Omit & { - files: ShadcnFilesUnion; -}; diff --git a/apps/docs/src/registry/lib/utils.ts b/apps/docs/src/registry/lib/utils.ts deleted file mode 100644 index f78410c2..00000000 --- a/apps/docs/src/registry/lib/utils.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { promises as fs } from "fs"; -import fsSync from "fs"; -import path from "path"; -import createJiti from "jiti"; -import type { RegistryItem, ShadcnFilesUnion, TemplateMetadata } from "./types"; - -const templatesPath = path.join(process.cwd(), "src/registry/templates"); - -export type RegistryIndexItem = { - name: string; - type: "static"; - categories: TemplateMetadata["categories"]; - // files: string[]; // destination paths -}; - -/** - * Scans the templates directory and returns all template directories with _meta.ts files - */ -function getTemplateDirs(root: string, prefix = ""): string[] { - const entries = fsSync.readdirSync(root, { withFileTypes: true }); - const result: string[] = []; - for (const entry of entries) { - if (!entry.isDirectory()) continue; - const dirPath = path.join(root, entry.name); - const rel = prefix ? `${prefix}/${entry.name}` : entry.name; - const files = fsSync.readdirSync(dirPath); - if (files.includes("_meta.ts")) { - result.push(rel); - } - // Recurse for nested templates - const nested = getTemplateDirs(dirPath, rel); - result.push(...nested); - } - return result; -} - -/** - * Loads template metadata using jiti - */ -function loadTemplateMeta(templatePath: string): TemplateMetadata { - const jiti = createJiti(__filename, { - interopDefault: true, - requireCache: false, - }); - - const metaPath = path.join(templatesPath, templatePath, "_meta.ts"); - const metaModule = jiti(metaPath); - const meta = - metaModule.meta || metaModule.default?.meta || metaModule.default; - - if (!meta) { - throw new Error( - `Template ${templatePath}: _meta.ts must export a 'meta' object`, - ); - } - - return meta; -} - -export async function getRegistryIndex(): Promise { - const templateDirs = getTemplateDirs(templatesPath); - - const index = templateDirs.map((templatePath) => { - const meta = loadTemplateMeta(templatePath); - return { - ...meta, - name: templatePath, // Use the path as the name - }; - }); - - return index; -} - -export async function getStaticComponent( - namePath: string, -): Promise { - const normalized = namePath.replace(/^\/+|\/+$/g, ""); - - // Check if template exists - const templateDirs = getTemplateDirs(templatesPath); - if (!templateDirs.includes(normalized)) { - throw new Error(`Template "${normalized}" not found`); - } - - const meta = loadTemplateMeta(normalized); - - const files: ShadcnFilesUnion = await Promise.all( - meta.files.map(async (file) => { - const contentPath = path.join( - templatesPath, - normalized, - file.sourceFileName, - ); - const content = await fs.readFile(contentPath, "utf-8"); - - const shadcnFile: ShadcnFilesUnion[number] = - file.type === "registry:file" || file.type === "registry:page" - ? { - path: file.sourceFileName, - type: file.type, - content, - target: file.destinationPath, - } - : { - path: file.sourceFileName, - type: file.type, - content, - target: file.destinationPath ?? "", - }; - - return shadcnFile; - }), - ); - - return { - ...meta, - name: normalized, - type: meta.registryType, - files, - }; -} diff --git a/apps/docs/src/registry/lib/validator.ts b/apps/docs/src/registry/lib/validator.ts deleted file mode 100644 index f332101e..00000000 --- a/apps/docs/src/registry/lib/validator.ts +++ /dev/null @@ -1,105 +0,0 @@ -import fs from "fs"; -import path from "path"; -import createJiti from "jiti"; -import { templateMetadataSchema, type TemplateMetadata } from "./types"; - -function getTemplateDirs(root: string, prefix = ""): string[] { - const entries = fs.readdirSync(root, { withFileTypes: true }); - const result: string[] = []; - for (const entry of entries) { - if (!entry.isDirectory()) continue; - const dirPath = path.join(root, entry.name); - const rel = prefix ? `${prefix}/${entry.name}` : entry.name; - const files = fs.readdirSync(dirPath); - if (files.includes("_meta.ts")) { - result.push(rel); - } - // Recurse for nested templates - const nested = getTemplateDirs(dirPath, rel); - result.push(...nested); - } - return result; -} - -export function validateRegistry() { - const templatesPath = path.join(process.cwd(), "src/registry/templates"); - const jiti = createJiti(__filename, { - interopDefault: true, - requireCache: false, - }); - - try { - const templateDirs = getTemplateDirs(templatesPath); - - for (const rel of templateDirs) { - const metaPath = path.join(templatesPath, rel, "_meta.ts"); - - // Check if meta file exists - if (!fs.existsSync(metaPath)) { - throw new Error(`Template ${rel} is missing _meta.ts file`); - } - - // Load and validate the meta file using jiti - try { - const metaModule = jiti(metaPath); - const meta = - metaModule.meta || metaModule.default?.meta || metaModule.default; - - if (!meta) { - throw new Error( - `Template ${rel}: _meta.ts must export a 'meta' object`, - ); - } - - // Validate the metadata structure using zod schema - const validationResult = templateMetadataSchema.safeParse(meta); - if (!validationResult.success) { - throw new Error( - `Template ${rel}: Invalid metadata structure:\n${validationResult.error.issues - .map((issue) => ` - ${issue.path.join(".")}: ${issue.message}`) - .join("\n")}`, - ); - } - - // Validate that declared files actually exist - const templateDir = path.join(templatesPath, rel); - const actualFiles = fs - .readdirSync(templateDir) - .filter((f) => f !== "_meta.ts"); - const declaredFiles = validationResult.data.files.map( - (f) => f.sourceFileName, - ); - - for (const declaredFile of declaredFiles) { - if (!actualFiles.includes(declaredFile)) { - throw new Error( - `Template ${rel}: Declared file '${declaredFile}' does not exist`, - ); - } - } - - // Check if template has content files - if (actualFiles.length === 0) { - throw new Error(`Template ${rel} has no content files`); - } - } catch (loadError) { - if ( - loadError instanceof Error && - loadError.message.includes("Template") - ) { - throw loadError; // Re-throw our custom errors - } - throw new Error( - `Template ${rel}: Failed to load _meta.ts - ${loadError}`, - ); - } - } - - console.log( - `✅ Registry validation passed for ${templateDirs.length} templates`, - ); - } catch (err) { - console.error("Registry validation failed:", err); - throw err; // stop the build - } -} diff --git a/apps/docs/tests/registry-api.test.ts b/apps/docs/tests/registry-api.test.ts index 1670773b..7577590b 100644 --- a/apps/docs/tests/registry-api.test.ts +++ b/apps/docs/tests/registry-api.test.ts @@ -1,9 +1,9 @@ import { describe, it, expect, vi, beforeEach } from "vitest"; -import * as utils from "@/registry/lib/utils"; -import { GET as registryRoute } from "@/app/registry/[[...name]]/route"; +import * as utils from "@proofkit/registry"; +import { GET as registryRoute } from "@/app/r/[[...name]]/route"; -vi.mock("@/registry/lib/utils", async () => { - const actual = await vi.importActual("@/registry/lib/utils"); +vi.mock("@proofkit/registry", async () => { + const actual = await vi.importActual("@proofkit/registry"); return { ...actual, getRegistryIndex: vi.fn(), @@ -26,9 +26,9 @@ describe("Registry API", () => { }, ]); - const res = await registryRoute(new Request("http://localhost"), { - params: { name: ["index.json"] }, - } as any); + const res = await registryRoute( + new Request("http://localhost/r/index.json"), + ); const json = await (res as Response).json(); expect(Array.isArray(json)).toBe(true); @@ -40,9 +40,7 @@ describe("Registry API", () => { { name: "button", type: "static", categories: ["component"], files: [] }, ]); - const res = await registryRoute(new Request("http://localhost"), { - params: { name: undefined }, - } as any); + const res = await registryRoute(new Request("http://localhost/r")); const json = await (res as Response).json(); expect(Array.isArray(json)).toBe(true); @@ -61,9 +59,9 @@ describe("Registry API", () => { ], }); - const res = await registryRoute(new Request("http://localhost"), { - params: { name: ["button.json"] }, - } as any); + const res = await registryRoute( + new Request("http://localhost/r/button.json"), + ); const json = await (res as Response).json(); expect(json).toMatchObject({ name: "button", type: "static" }); expect(Array.isArray(json.files)).toBe(true); @@ -83,9 +81,7 @@ describe("Registry API", () => { ], }); - const res = await registryRoute(new Request("http://localhost"), { - params: { name: ["button"] }, - } as any); + const res = await registryRoute(new Request("http://localhost/r/button")); const json = await (res as Response).json(); expect(json).toMatchObject({ name: "button", type: "static" }); }); diff --git a/apps/docs/tests/utils.manifest.test.ts b/apps/docs/tests/utils.manifest.test.ts index bac18b1c..604f90b6 100644 --- a/apps/docs/tests/utils.manifest.test.ts +++ b/apps/docs/tests/utils.manifest.test.ts @@ -1,6 +1,9 @@ import { describe, it, expect } from "vitest"; -import { getRegistryIndex, getStaticComponent } from "@/registry/lib/utils"; -import { RegistryItem } from "@/registry/lib/types"; +import { + getRegistryIndex, + getStaticComponent, + RegistryItem, +} from "@proofkit/registry"; describe("Registry utils (dynamic scanning)", () => { it("reads index dynamically", async () => { @@ -10,12 +13,12 @@ describe("Registry utils (dynamic scanning)", () => { expect(index.length).toBeGreaterThan(0); expect(index[0]).toHaveProperty("name"); expect(index[0]).toHaveProperty("type"); - expect(index[0]).toHaveProperty("categories"); - expect(index[0]).toHaveProperty("files"); + expect(index[0]).toHaveProperty("category"); + // RegistryIndexItem only has name, type, and category - not files }); it("reads a known template (mode-toggle)", async () => { - const comp = await getStaticComponent("mode-toggle"); + const comp = await getStaticComponent("components/mode-toggle"); expect(comp).toHaveProperty("files"); expect(comp.files).toBeInstanceOf(Array); expect(comp.files.length).toBeGreaterThan(0); diff --git a/packages/cli/package.json b/packages/cli/package.json index fbe9f03e..d2cc3def 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -40,9 +40,9 @@ }, "scripts": { "typecheck": "tsc", - "build": "tsup && publint --strict", + "build": "NODE_ENV=production tsdown && publint --strict", "prepublishOnly": "pnpm build", - "dev": "tsup --watch", + "dev": "tsdown --watch", "clean": "rm -rf dist .turbo node_modules", "start": "node dist/index.js", "lint": "eslint . --ext .ts,.tsx", @@ -50,12 +50,13 @@ "format": "prettier '**/*.{cjs,mjs,ts,tsx,md,json}' --ignore-path ../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --write", "format:check": "prettier '**/*.{cjs,mjs,ts,tsx,md,json}' --ignore-path ../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --check", "release": "changeset version", - "pub:beta": "pnpm build && npm publish --tag beta --access public", - "pub:next": "pnpm build && npm publish --tag next --access public", - "pub:release": "pnpm build && npm publish --access public", + "pub:beta": "NODE_ENV=production pnpm build && npm publish --tag beta --access public", + "pub:next": "NODE_ENV=production pnpm build && npm publish --tag next --access public", + "pub:release": "NODE_ENV=production pnpm build && npm publish --access public", "test": "vitest run" }, "dependencies": { + "@better-fetch/fetch": "1.1.17", "@clack/core": "^0.3.4", "@clack/prompts": "^0.11.0", "@ianvs/prettier-plugin-sort-imports": "^4.4.1", @@ -68,6 +69,7 @@ "dotenv": "^16.5.0", "es-toolkit": "^1.15.1", "execa": "^9.5.1", + "fast-glob": "^3.3.3", "fs-extra": "^11.3.0", "glob": "^11.0.1", "gradient-string": "^2.0.2", @@ -79,6 +81,7 @@ "prettier-plugin-tailwindcss": "^0.6.5", "randomstring": "^1.3.0", "semver": "^7.7.2", + "shadcn": "^2.10.0", "sort-package-json": "^2.10.0", "ts-morph": "^26.0.0" }, @@ -89,6 +92,7 @@ "@planetscale/database": "^1.18.0", "@prisma/adapter-planetscale": "^5.14.0", "@prisma/client": "^5.14.0", + "@proofkit/registry": "workspace:*", "@t3-oss/env-nextjs": "^0.10.1", "@tanstack/react-query": "^5.49.2", "@trpc/client": "11.0.0-rc.441", @@ -115,7 +119,7 @@ "react-dom": "^19.1.1", "superjson": "^2.2.1", "tailwindcss": "^4.1.11", - "tsup": "^6.7.0", + "tsdown": "^0.14.1", "type-fest": "^3.13.1", "typescript": "^5.9.2", "vitest": "^3.2.4", diff --git a/packages/cli/proofkit-cli-1.1.8.tgz b/packages/cli/proofkit-cli-1.1.8.tgz new file mode 100644 index 00000000..45e19d04 Binary files /dev/null and b/packages/cli/proofkit-cli-1.1.8.tgz differ diff --git a/packages/cli/src/cli/add/fmschema.ts b/packages/cli/src/cli/add/fmschema.ts index 5415aaaf..51f71a72 100644 --- a/packages/cli/src/cli/add/fmschema.ts +++ b/packages/cli/src/cli/add/fmschema.ts @@ -1,7 +1,7 @@ import path from "path"; import * as p from "@clack/prompts"; import type { OttoAPIKey } from "@proofkit/fmdapi"; - +import { type ValueListsOptions } from "@proofkit/typegen/config"; import chalk from "chalk"; import { Command } from "commander"; import dotenv from "dotenv"; @@ -12,7 +12,6 @@ import { state } from "~/state.js"; import { getSettings, type Settings } from "~/utils/parseSettings.js"; import { commonFileMakerLayoutPrefixes, getLayouts } from "../fmdapi.js"; import { abortIfCancel } from "../utils.js"; -import { type ValueListsOptions } from "@proofkit/typegen/config"; export const runAddSchemaAction = async (opts?: { projectDir?: string; diff --git a/packages/cli/src/cli/add/index.ts b/packages/cli/src/cli/add/index.ts index 2d1301de..1c68a961 100644 --- a/packages/cli/src/cli/add/index.ts +++ b/packages/cli/src/cli/add/index.ts @@ -4,6 +4,10 @@ import { Command } from "commander"; import { ciOption, debugOption } from "~/globalOptions.js"; import { initProgramState, state } from "~/state.js"; import { getSettings } from "~/utils/parseSettings.js"; +import { + makeAddReactEmailCommand, + runAddReactEmailCommand, +} from "../react-email.js"; import { runAddTanstackQueryCommand } from "../tanstack-query.js"; import { abortIfCancel, ensureProofKitProject } from "../utils.js"; import { makeAddAuthCommand, runAddAuthAction } from "./auth.js"; @@ -13,13 +17,22 @@ import { } from "./data-source/index.js"; import { makeAddSchemaCommand, runAddSchemaAction } from "./fmschema.js"; import { makeAddPageCommand, runAddPageAction } from "./page/index.js"; +import { installFromRegistry } from "./registry/install.js"; -export const runAdd = async (name: string | undefined) => { - const settings = getSettings(); - +export const runAdd = async ( + name: string | undefined, + options?: { noInstall?: boolean } +) => { + if (name === "tanstack-query") { return await runAddTanstackQueryCommand(); + } else if (name !== undefined) { + // an arbitrary name was provided, so we'll try to install from the registry + return await installFromRegistry(name); } + + ensureProofKitProject({ commandName: "add" }); + const settings = getSettings(); const addType = abortIfCancel( await p.select({ @@ -31,6 +44,7 @@ export const runAdd = async (name: string | undefined) => { value: "schema", hint: "load data from a new table or layout from an existing data source", }, + { label: "React Email", value: "react-email" }, ...(settings.appType === "browser" ? [ { @@ -64,6 +78,8 @@ export const runAdd = async (name: string | undefined) => { await runAddPageAction(); } else if (addType === "schema") { await runAddSchemaAction(); + } else if (addType === "react-email") { + await runAddReactEmailCommand({ noInstall: options?.noInstall }); } }; @@ -73,19 +89,22 @@ export const makeAddCommand = () => { .argument("[name]", "Type of component to add") .addOption(ciOption) .addOption(debugOption) - .action(runAdd); + .option( + "--noInstall", + "Do not run your package manager install command", + false + ) + .action(runAdd as any); addCommand.hook("preAction", (_thisCommand, _actionCommand) => { // console.log("preAction", _actionCommand.opts()); initProgramState(_actionCommand.opts()); state.baseCommand = "add"; - ensureProofKitProject({ commandName: "add" }); }); addCommand.hook("preSubcommand", (_thisCommand, _subCommand) => { // console.log("preSubcommand", _subCommand.opts()); initProgramState(_subCommand.opts()); state.baseCommand = "add"; - ensureProofKitProject({ commandName: "add" }); }); addCommand.addCommand(makeAddAuthCommand()); diff --git a/packages/cli/src/cli/add/registry/getOptions.ts b/packages/cli/src/cli/add/registry/getOptions.ts new file mode 100644 index 00000000..66c13e14 --- /dev/null +++ b/packages/cli/src/cli/add/registry/getOptions.ts @@ -0,0 +1,53 @@ + +import { registryFetch } from "./http.js"; +import fs from "fs-extra"; +import fg from "fast-glob" +import path from "path"; +import { state } from "~/state.js"; + +export async function getMetaFromRegistry(name: string) { + const result = await registryFetch("@get/meta/:name", { + params: { name }, + }); + if (result.error) { + if (result.error.status === 404) return null; + throw new Error(result.error.message); + } + return result.data; +} + +const PROJECT_SHARED_IGNORE = [ + "**/node_modules/**", + ".next", + "public", + "dist", + "build", +] + +export async function getProjectInfo() { + const cwd = state.projectDir || process.cwd(); + const [configFiles, isSrcDir] = await Promise.all([ + fg.glob( + "**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*", + { + cwd, + deep: 3, + ignore: PROJECT_SHARED_IGNORE, + } + ), + fs.pathExists(path.resolve(cwd, "src")) + ]) + + +const isUsingAppDir = await fs.pathExists( + path.resolve(cwd, `${isSrcDir ? "src/" : ""}app`) +) + + +// Next.js. +if (configFiles.find((file) => file.startsWith("next.config."))?.length) { + return isUsingAppDir ? "next-app" : "next-pages" +} + +return "manual" +} \ No newline at end of file diff --git a/packages/cli/src/cli/add/registry/http.ts b/packages/cli/src/cli/add/registry/http.ts new file mode 100644 index 00000000..99d5e60c --- /dev/null +++ b/packages/cli/src/cli/add/registry/http.ts @@ -0,0 +1,22 @@ +import { createFetch, createSchema } from "@better-fetch/fetch"; +import { + registryIndexSchema, + templateMetadataSchema, +} from "@proofkit/registry"; +import { z } from "zod/v4"; + +import { getRegistryUrl } from "~/helpers/shadcn-cli.js"; + +const schema = createSchema({ + "@get/meta/:name": { + output: templateMetadataSchema, + }, + "@get/": { + output: registryIndexSchema, + }, +}); + +export const registryFetch = createFetch({ + baseURL: `${getRegistryUrl()}/r`, + schema, +}); diff --git a/packages/cli/src/cli/add/registry/install.ts b/packages/cli/src/cli/add/registry/install.ts new file mode 100644 index 00000000..ae7e7989 --- /dev/null +++ b/packages/cli/src/cli/add/registry/install.ts @@ -0,0 +1,79 @@ +import { getOtherProofKitDependencies } from "@proofkit/registry"; +import semver from "semver"; +import ora from "ora"; + +import { getRegistryUrl, shadcnInstall } from "~/helpers/shadcn-cli.js"; +import { getVersion } from "~/utils/getProofKitVersion.js"; +import { logger } from "~/utils/logger.js"; +import { getSettings, mergeSettings } from "~/utils/parseSettings.js"; +import { getMetaFromRegistry } from "./getOptions.js"; +import { processPostInstallStep } from "./postInstall/index.js"; +import { preflightAddCommand } from "./preflight.js"; +import { uniq } from "es-toolkit"; + +export async function installFromRegistry(name: string) { + + const spinner = ora("Validating template").start(); + await preflightAddCommand(); + + try { + const meta = await getMetaFromRegistry(name); + if (!meta) { + spinner.fail(`Template ${name} not found in the ProofKit registry`); + return; + } + + + if ( + meta.minimumProofKitVersion && + semver.gt(meta.minimumProofKitVersion, getVersion()) + ) { + logger.error( + `Template ${name} requires ProofKit version ${meta.minimumProofKitVersion}, but you are using version ${getVersion()}` + ); + spinner.fail("Template is not compatible with your ProofKit version"); + return; + } + spinner.succeed(); + + const otherProofKitDependencies = getOtherProofKitDependencies(meta); + + const previouslyInstalledTemplates = getSettings().registryTemplates; + + // if dynamic, figure out what fields to pass, then construct the URL to send to shadcn. Otherwise, just send the URL to shadcn + let url = `${getRegistryUrl()}/r/${name}`; + if (meta.type === "dynamic") { + throw new Error("Dynamic templates are not yet supported"); + } else if (meta.type === "static") { + // just send the URL to shadcn + } else { + throw new Error("Unknown template type"); + } + + // run shadcn command + await shadcnInstall([url], meta.title); + + // if post-install steps, process those + if (meta.postInstall) { + for (const step of meta.postInstall) { + if (step._from && previouslyInstalledTemplates.includes(step._from)) { + // don't re-run post-install steps for templates that have already been installed + continue; + } + await processPostInstallStep(step); + } + } + + // update the settings + mergeSettings({ + registryTemplates: uniq([ + ...previouslyInstalledTemplates, + name, + ...otherProofKitDependencies, + ]), + }); + } catch (error) { + spinner.fail("Failed to fetch template metadata."); + logger.error(error); + } +} diff --git a/packages/cli/src/cli/add/registry/postInstall/index.ts b/packages/cli/src/cli/add/registry/postInstall/index.ts new file mode 100644 index 00000000..99e4bfdc --- /dev/null +++ b/packages/cli/src/cli/add/registry/postInstall/index.ts @@ -0,0 +1,15 @@ +import type { PostInstallStep } from "@proofkit/registry"; + +import { logger } from "~/utils/logger.js"; +import { addScriptToPackageJson } from "./package-script.js"; +import { wrapProvider } from "./wrap-provider.js"; + +export async function processPostInstallStep(step: PostInstallStep) { + if (step.action === "package.json script") { + addScriptToPackageJson(step); + } else if (step.action === "wrap provider") { + await wrapProvider(step); + } else { + logger.error(`Unknown post-install step: ${step}`); + } +} diff --git a/packages/cli/src/cli/add/registry/postInstall/package-script.ts b/packages/cli/src/cli/add/registry/postInstall/package-script.ts new file mode 100644 index 00000000..ed0c1109 --- /dev/null +++ b/packages/cli/src/cli/add/registry/postInstall/package-script.ts @@ -0,0 +1,14 @@ +import fs from "fs"; +import path from "path"; +import { PostInstallStep } from "@proofkit/registry"; + +import { state } from "~/state.js"; + +export function addScriptToPackageJson( + step: Extract +) { + const packageJsonPath = path.join(state.projectDir, "package.json"); + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")); + packageJson.scripts[step.data.scriptName] = step.data.scriptCommand; + fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); +} diff --git a/packages/cli/src/cli/add/registry/postInstall/wrap-provider.ts b/packages/cli/src/cli/add/registry/postInstall/wrap-provider.ts new file mode 100644 index 00000000..82f09b92 --- /dev/null +++ b/packages/cli/src/cli/add/registry/postInstall/wrap-provider.ts @@ -0,0 +1,136 @@ +import path from "path"; +import { PostInstallStep } from "@proofkit/registry"; +import { + ImportDeclarationStructure, + StructureKind, + SyntaxKind, +} from "ts-morph"; + +import { getShadcnConfig } from "~/helpers/shadcn-cli.js"; +import { state } from "~/state.js"; +import { logger } from "~/utils/logger.js"; +import { formatAndSaveSourceFiles, getNewProject } from "~/utils/ts-morph.js"; + +export async function wrapProvider( + step: Extract +) { + const { + parentTag, + imports: importConfigs, + providerCloseTag, + providerOpenTag, + } = step.data; + + try { + const projectDir = state.projectDir; + const project = getNewProject(projectDir); + const shadcnConfig = getShadcnConfig(); + + // Resolve the components alias to a filesystem path + // @/components -> src/components, ./components -> components, etc. + const resolveAlias = (alias: string): string => { + if (alias.startsWith("@/")) { + return alias.replace("@/", "src/"); + } + if (alias.startsWith("./")) { + return alias.substring(2); + } + return alias; + }; + + // Look for providers.tsx in the components directory + const componentsDir = resolveAlias(shadcnConfig.aliases.components); + const providersPath = path.join(projectDir, componentsDir, "providers.tsx"); + + const providersFile = project.addSourceFileAtPath(providersPath); + + // Add all import statements + for (const importConfig of importConfigs) { + const importDeclaration: ImportDeclarationStructure = { + moduleSpecifier: importConfig.moduleSpecifier, + kind: StructureKind.ImportDeclaration, + }; + + if (importConfig.defaultImport) { + importDeclaration.defaultImport = importConfig.defaultImport; + } + + if (importConfig.namedImports && importConfig.namedImports.length > 0) { + importDeclaration.namedImports = importConfig.namedImports; + } + + providersFile.addImportDeclaration(importDeclaration); + } + + // Handle providers.tsx file - look for the default export function + const exportDefault = providersFile.getFunction((dec) => + dec.isDefaultExport() + ); + + if (!exportDefault) { + logger.warn(`No default export function found in ${providersPath}`); + return; + } + + const returnStatement = exportDefault + ?.getBody() + ?.getFirstDescendantByKind(SyntaxKind.ReturnStatement); + + if (!returnStatement) { + logger.warn(`No return statement found in default export function`); + return; + } + + let targetElement; + + // Try to find the parent tag if specified + if (parentTag && parentTag.length > 0) { + for (const tag of parentTag) { + targetElement = returnStatement + ?.getDescendantsOfKind(SyntaxKind.JsxOpeningElement) + .find( + (openingElement) => + openingElement.getTagNameNode().getText() === tag + ) + ?.getParentIfKind(SyntaxKind.JsxElement); + + if (targetElement) break; + } + } + + if (targetElement) { + // If we found a parent tag, wrap its children + const childrenText = targetElement + ?.getJsxChildren() + .map((child) => child.getText()) + .filter(Boolean) + .join("\n"); + + const newContent = `${providerOpenTag} + ${childrenText} + ${providerCloseTag}`; + + targetElement.getChildSyntaxList()?.replaceWithText(newContent); + } else { + // If no parent tag found or specified, wrap the entire return statement + const returnExpression = returnStatement?.getExpression(); + if (returnExpression) { + const newReturnContent = `return ( + ${providerOpenTag} + ${returnExpression.getText()} + ${providerCloseTag} + );`; + + returnStatement?.replaceWithText(newReturnContent); + } else { + logger.warn(`No return expression found to wrap`); + } + } + + await formatAndSaveSourceFiles(project); + logger.success(`Successfully wrapped provider in ${providersPath}`); + } catch (error) { + logger.error(`Failed to wrap provider: ${error}`); + throw error; + } +} diff --git a/packages/cli/src/cli/add/registry/preflight.ts b/packages/cli/src/cli/add/registry/preflight.ts new file mode 100644 index 00000000..a06f87ec --- /dev/null +++ b/packages/cli/src/cli/add/registry/preflight.ts @@ -0,0 +1,16 @@ +import fs from "fs-extra"; +import path from "path"; +import { stealthInit } from "~/helpers/stealth-init.js"; +import { state } from "~/state.js"; + +export async function preflightAddCommand() { + const cwd = state.projectDir ?? process.cwd(); + // make sure shadcn is installed, throw if not + const shadcnInstalled = await fs.pathExists(path.join(cwd, "components.json")); + if (!shadcnInstalled) { + throw new Error("Shadcn is not installed. Please run `pnpm dlx shadcn@latest init` to install it."); + } + + // if proofkit is not inited, try to stealth init + await stealthInit(); +} \ No newline at end of file diff --git a/packages/cli/src/cli/fmdapi.ts b/packages/cli/src/cli/fmdapi.ts index dc970b2e..c00fa1f1 100644 --- a/packages/cli/src/cli/fmdapi.ts +++ b/packages/cli/src/cli/fmdapi.ts @@ -1,6 +1,8 @@ -import DataApi, { OttoAdapter, type OttoAPIKey } from "@proofkit/fmdapi"; -import { type clientTypes } from "@proofkit/fmdapi"; - +import DataApi, { + OttoAdapter, + type clientTypes, + type OttoAPIKey, +} from "@proofkit/fmdapi"; export async function getLayouts({ dataApiKey, @@ -17,7 +19,7 @@ export async function getLayouts({ db: fmFile, server, }), - layout: "" + layout: "", }); const layoutsResp = await DapiClient.layouts(); @@ -36,7 +38,9 @@ function getAllLayoutNames(layout: clientTypes.LayoutOrFolder): string[] { export const commonFileMakerLayoutPrefixes = ["API_", "API ", "dapi_", "dapi"]; -export function transformLayoutList(layouts: clientTypes.LayoutOrFolder[]): string[] { +export function transformLayoutList( + layouts: clientTypes.LayoutOrFolder[] +): string[] { const flatList = layouts.flatMap(getAllLayoutNames); // sort the list so that any values that begin with one of the prefixes are at the top diff --git a/packages/cli/src/cli/init.ts b/packages/cli/src/cli/init.ts index 073e28e4..6893484b 100644 --- a/packages/cli/src/cli/init.ts +++ b/packages/cli/src/cli/init.ts @@ -309,7 +309,7 @@ export const runInit = async (name?: string, opts?: CliFlags) => { if (state.ui === "shadcn") { await shadcnInstall([ - `${getRegistryUrl()}/r/mode-toggle`, + `${getRegistryUrl()}/r/components/mode-toggle`, "sonner", "button", ]); diff --git a/packages/cli/src/cli/react-email.ts b/packages/cli/src/cli/react-email.ts new file mode 100644 index 00000000..691ed17a --- /dev/null +++ b/packages/cli/src/cli/react-email.ts @@ -0,0 +1,35 @@ +import * as p from "@clack/prompts"; +import { Command, Option } from "commander"; + +import { installReactEmail } from "~/installers/react-email.js"; + +export const runAddReactEmailCommand = async ({ + noInstall, + installServerFiles, +}: { noInstall?: boolean; installServerFiles?: boolean } = {}) => { + const spinner = p.spinner(); + spinner.start("Adding React Email"); + await installReactEmail({ noInstall, installServerFiles }); + spinner.stop("React Email added"); +}; + +export const makeAddReactEmailCommand = () => { + const addReactEmailCommand = new Command("react-email") + .description("Add React Email scaffolding to your project") + .addOption( + new Option( + "--noInstall", + "Do not run your package manager install command" + ).default(false) + ) + .option( + "--installServerFiles", + "Also scaffold provider-specific server email files", + false + ) + .action((args: { noInstall?: boolean; installServerFiles?: boolean }) => + runAddReactEmailCommand(args) + ); + + return addReactEmailCommand; +}; diff --git a/packages/cli/src/consts.ts b/packages/cli/src/consts.ts index dfacca41..6c3bf932 100644 --- a/packages/cli/src/consts.ts +++ b/packages/cli/src/consts.ts @@ -3,7 +3,6 @@ import { fileURLToPath } from "url"; import { getVersion } from "./utils/getProofKitVersion.js"; -// With the move to TSUP as a build tool, this keeps path routes in other files (installers, loaders, etc) in check more easily. // Path is in relation to a single index.js file inside ./dist const __filename = fileURLToPath(import.meta.url); const distPath = path.dirname(__filename); @@ -28,7 +27,6 @@ ${" ".repeat(61 - versionCharLength)}v${version} export const DEFAULT_APP_NAME = "my-proofkit-app"; export const CREATE_FM_APP = cliName; -export const DEFAULT_REGISTRY_URL = - process.env.NODE_ENV === "development" - ? "http://localhost:3005" - : "https://proofkit.dev"; +// Registry URL is injected at build time via tsdown define +declare const __REGISTRY_URL__: string; +export const DEFAULT_REGISTRY_URL = __REGISTRY_URL__; diff --git a/packages/cli/src/generators/auth.ts b/packages/cli/src/generators/auth.ts index 59a7a081..f00e28c1 100644 --- a/packages/cli/src/generators/auth.ts +++ b/packages/cli/src/generators/auth.ts @@ -3,6 +3,7 @@ import path from "path"; import { glob } from "glob"; import { installDependencies } from "~/helpers/installDependencies.js"; +import { betterAuthInstaller } from "~/installers/better-auth.js"; import { clerkInstaller } from "~/installers/clerk.js"; import { proofkitAuthInstaller } from "~/installers/proofkit-auth.js"; import { state } from "~/state.js"; @@ -19,7 +20,8 @@ export async function addAuth({ type: "fmaddon"; emailProvider?: "plunk" | "resend"; apiKey?: string; - }; + } + | { type: "better-auth" }; projectDir?: string; noInstall?: boolean; }) { @@ -33,6 +35,13 @@ export async function addAuth({ throw new Error( "A FileMaker data source is required to use the FM Add-on Auth" ); + } else if ( + !settings.dataSources.some((o) => o.type === "fm") && + options.type === "better-auth" + ) { + throw new Error( + "A FileMaker data source is required to use the Better-Auth" + ); } if (options.type === "clerk") { @@ -79,3 +88,8 @@ async function replaceActionClientWithAuthed() { writeFileSync(fullPath, updatedContent); } } + +async function addBetterAuth() { + await betterAuthInstaller(); + mergeSettings({ auth: { type: "better-auth" } }); +} diff --git a/packages/cli/src/generators/fmdapi.ts b/packages/cli/src/generators/fmdapi.ts index bf4420e1..a7e304c5 100644 --- a/packages/cli/src/generators/fmdapi.ts +++ b/packages/cli/src/generators/fmdapi.ts @@ -4,7 +4,7 @@ import { type typegenConfigSingle } from "@proofkit/typegen/config"; import { config as dotenvConfig } from "dotenv"; import fs from "fs-extra"; import { applyEdits, modify, parse as parseJsonc } from "jsonc-parser"; -import { SyntaxKind } from "ts-morph"; +import { Project, SyntaxKind } from "ts-morph"; import { type z } from "zod/v4"; import { state } from "~/state.js"; diff --git a/packages/cli/src/generators/route.ts b/packages/cli/src/generators/route.ts index 39876d4b..0d5fc7e9 100644 --- a/packages/cli/src/generators/route.ts +++ b/packages/cli/src/generators/route.ts @@ -1,7 +1,7 @@ import path from "path"; +import fs from "fs-extra"; import { type RouteLink } from "index.js"; import { SyntaxKind } from "ts-morph"; -import fs from "fs-extra"; import { formatAndSaveSourceFiles, getNewProject } from "~/utils/ts-morph.js"; diff --git a/packages/cli/src/globals.d.ts b/packages/cli/src/globals.d.ts new file mode 100644 index 00000000..07842412 --- /dev/null +++ b/packages/cli/src/globals.d.ts @@ -0,0 +1,2 @@ +declare const __FMDAPI_VERSION__: string; +declare const __BETTER_AUTH_VERSION__: string; diff --git a/packages/cli/src/helpers/installDependencies.ts b/packages/cli/src/helpers/installDependencies.ts index f3bb1ac9..6fa2d9d1 100644 --- a/packages/cli/src/helpers/installDependencies.ts +++ b/packages/cli/src/helpers/installDependencies.ts @@ -28,15 +28,51 @@ const execWithSpinner = async ( const spinner = ora( options.loadingMessage ?? `Running ${pkgManager} ${args.join(" ")} ...` ).start(); - const subprocess = execa(pkgManager, args, { cwd: projectDir, stdout }); + const subprocess = execa(pkgManager, args, { + cwd: projectDir, + stdout, + stderr: "pipe", // Capture stderr to get error messages + }); await new Promise((res, rej) => { + let stdoutOutput = ""; + let stderrOutput = ""; + if (onDataHandle) { subprocess.stdout?.on("data", onDataHandle(spinner)); + } else { + // If no custom handler, capture stdout for error reporting + subprocess.stdout?.on("data", (data) => { + stdoutOutput += data.toString(); + }); } + // Capture stderr output for error reporting + subprocess.stderr?.on("data", (data) => { + stderrOutput += data.toString(); + }); + void subprocess.on("error", (e) => rej(e)); - void subprocess.on("close", () => res()); + void subprocess.on("close", (code) => { + if (code === 0) { + res(); + } else { + // Combine stdout and stderr for complete error message + const combinedOutput = [stdoutOutput, stderrOutput] + .filter((output) => output.trim()) + .join("\n") + .trim() + // Remove spinner-related lines that aren't useful in error output + .replace(/^- Checking registry\.$/gm, "") + .replace(/^\s*$/gm, "") // Remove empty lines + .trim(); + + const errorMessage = + combinedOutput || + `Command failed with exit code ${code}: ${pkgManager} ${args.join(" ")}`; + rej(new Error(errorMessage)); + } + }); }); return spinner; @@ -98,28 +134,41 @@ export const runExecCommand = async ({ command, projectDir = state.projectDir, successMessage, + errorMessage, loadingMessage, }: { command: string[]; projectDir?: string; successMessage?: string; + errorMessage?: string; loadingMessage?: string; }) => { - const spinner = await _runExecCommand({ - projectDir, - command, - loadingMessage, - }); + let spinner: Ora | null = null; - // If the spinner was used to show the progress, use succeed method on it - // If not, use the succeed on a new spinner - (spinner ?? ora()).succeed( - chalk.green( - successMessage - ? `${successMessage}\n` - : `Successfully ran ${command.join(" ")}!\n` - ) - ); + try { + spinner = await _runExecCommand({ + projectDir, + command, + loadingMessage, + }); + + // If the spinner was used to show the progress, use succeed method on it + // If not, use the succeed on a new spinner + (spinner ?? ora()).succeed( + chalk.green( + successMessage + ? `${successMessage}\n` + : `Successfully ran ${command.join(" ")}!\n` + ) + ); + } catch (error) { + // If we have a spinner, fail it, otherwise just throw the error + if (spinner) { + const failMessage = errorMessage || `Failed to run ${command.join(" ")}`; + spinner.fail(chalk.red(failMessage)); + } + throw error; + } }; export const _runExecCommand = async ({ @@ -134,36 +183,63 @@ export const _runExecCommand = async ({ }): Promise => { const pkgManager = getUserPkgManager(); switch (pkgManager) { - // When using npm, inherit the stderr stream so that the progress bar is shown + // When using npm, capture both stdout and stderr to show error messages case "npm": - await execa("npx", [...command], { + const result = await execa("npx", [...command], { cwd: projectDir, - stderr: "inherit", + stdout: "pipe", + stderr: "pipe", + reject: false, }); + if (result.exitCode !== 0) { + // Combine stdout and stderr for complete error message + const combinedOutput = [result.stdout, result.stderr] + .filter((output) => output?.trim()) + .join("\n") + .trim() + // Remove spinner-related lines that aren't useful in error output + .replace(/^- Checking registry\.$/gm, "") + .replace(/^\s*$/gm, "") // Remove empty lines + .trim(); + + const errorMessage = + combinedOutput || + `Command failed with exit code ${result.exitCode}: npx ${command.join(" ")}`; + throw new Error(errorMessage); + } + return null; // When using yarn or pnpm, use the stdout stream and ora spinner to show the progress case "pnpm": + // For shadcn commands, don't use progress handler to capture full output + const isInstallCommand = command.includes("install"); return execWithSpinner(projectDir, "pnpm", { args: ["dlx", ...command], loadingMessage, - onDataHandle: (spinner) => (data) => { - const text = data.toString(); + onDataHandle: isInstallCommand + ? (spinner) => (data) => { + const text = data.toString(); - if (text.includes("Progress")) { - spinner.text = text.includes("|") - ? (text.split(" | ")[1] ?? "") - : text; - } - }, + if (text.includes("Progress")) { + spinner.text = text.includes("|") + ? (text.split(" | ")[1] ?? "") + : text; + } + } + : undefined, }); case "yarn": + // For shadcn commands, don't use progress handler to capture full output + const isYarnInstallCommand = command.includes("install"); return execWithSpinner(projectDir, pkgManager, { args: [...command], loadingMessage, - onDataHandle: (spinner) => (data) => { - spinner.text = data.toString(); - }, + onDataHandle: isYarnInstallCommand + ? (spinner) => (data) => { + spinner.text = data.toString(); + } + : undefined, }); // When using bun, the stdout stream is ignored and the spinner is shown case "bun": diff --git a/packages/cli/src/helpers/shadcn-cli.ts b/packages/cli/src/helpers/shadcn-cli.ts index 27661862..6319d198 100644 --- a/packages/cli/src/helpers/shadcn-cli.ts +++ b/packages/cli/src/helpers/shadcn-cli.ts @@ -1,18 +1,86 @@ +import fs from "fs"; +import path from "path"; + import { DEFAULT_REGISTRY_URL } from "~/consts.js"; +import { state } from "~/state.js"; +import { logger } from "~/utils/logger.js"; import { getSettings } from "~/utils/parseSettings.js"; import { runExecCommand } from "./installDependencies.js"; +import { execa } from "execa"; -export async function shadcnInstall(components: string | string[]) { +export async function shadcnInstall( + components: string | string[], + friendlyComponentName?: string +) { const componentsArray = Array.isArray(components) ? components : [components]; - const command = ["shadcn@latest", "add", ...componentsArray]; - await runExecCommand({ - command, - loadingMessage: "Installing components...", - successMessage: "Components installed successfully!", - }); + const command = ["shadcn@latest", "add", ...componentsArray, "--overwrite"]; + // Use execa to run the shadcn add command directly + + try { + await execa("pnpm", ["dlx", ...command], { + stdio: "inherit", + cwd: process.cwd(), + }); + } catch (error) { + logger.error(`Failed to run shadcn add: ${error}`); + throw error; + } } export function getRegistryUrl(): string { - const url = getSettings().registryUrl ?? DEFAULT_REGISTRY_URL; + let url: string; + try { + url = getSettings().registryUrl ?? DEFAULT_REGISTRY_URL; + } catch { + // If we can't get settings (e.g., during development or outside a ProofKit project), + // fall back to the default registry URL + url = DEFAULT_REGISTRY_URL; + } return url.endsWith("/") ? url.slice(0, -1) : url; } + +export type ShadcnConfig = { + style: "default" | "new-york"; + tailwind: { + config: string; + css: string; + baseColor: string; + cssVariables: boolean; + prefix?: string; + [k: string]: unknown; + }; + rsc: boolean; + tsx?: boolean; + iconLibrary?: string; + aliases: { + utils: string; + components: string; + ui?: string; + lib?: string; + hooks?: string; + [k: string]: unknown; + }; + registries?: { + [k: string]: + | string + | { + url: string; + params?: { + [k: string]: string; + }; + headers?: { + [k: string]: string; + }; + [k: string]: unknown; + }; + }; + [k: string]: unknown; +}; + +export function getShadcnConfig() { + const componentsJsonPath = path.join(state.projectDir, "components.json"); + const componentsJson = JSON.parse( + fs.readFileSync(componentsJsonPath, "utf8") + ); + return componentsJson as ShadcnConfig; +} diff --git a/packages/cli/src/helpers/stealth-init.ts b/packages/cli/src/helpers/stealth-init.ts new file mode 100644 index 00000000..3d6637fe --- /dev/null +++ b/packages/cli/src/helpers/stealth-init.ts @@ -0,0 +1,23 @@ + + + + + + +import fs from "fs-extra"; +import { defaultSettings } from "~/utils/parseSettings.js"; + + +/** + * Used to add a proofkit.json file to an existing project + */ +export async function stealthInit() { + // check if proofkit.json exists + const proofkitJson = await fs.pathExists("proofkit.json"); + if (proofkitJson) { + return; + } + + // create proofkit.json + await fs.writeJson("proofkit.json", defaultSettings); +} \ No newline at end of file diff --git a/packages/cli/src/installers/better-auth.ts b/packages/cli/src/installers/better-auth.ts new file mode 100644 index 00000000..80cd905e --- /dev/null +++ b/packages/cli/src/installers/better-auth.ts @@ -0,0 +1 @@ +export async function betterAuthInstaller() {} diff --git a/packages/cli/src/installers/dependencyVersionMap.ts b/packages/cli/src/installers/dependencyVersionMap.ts index 59edbdd3..3811390c 100644 --- a/packages/cli/src/installers/dependencyVersionMap.ts +++ b/packages/cli/src/installers/dependencyVersionMap.ts @@ -1,6 +1,7 @@ import { getFmdapiVersion, getNodeMajorVersion, + getProofkitBetterAuthVersion, getVersion, } from "~/utils/getProofKitVersion.js"; @@ -73,10 +74,11 @@ export const dependencyVersionMap = { "@types/js-cookie": "^3.0.6", // React Email - "@react-email/components": "^0.0.28", - "@react-email/render": "1.0.2", + "@react-email/components": "^0.5.0", + "@react-email/render": "1.2.0", + "@react-email/preview-server": "^4.2.8", "@plunk/node": "^3.0.3", - "react-email": "^3.0.2", + "react-email": "^4.2.8", resend: "^4.0.0", "@sendgrid/mail": "^8.1.4", @@ -89,6 +91,11 @@ export const dependencyVersionMap = { // Icons (for shadcn/ui) "lucide-react": "^0.518.0", + // better-auth + "better-auth": "^1.3.4", + "@proofkit/better-auth": `${getProofkitBetterAuthVersion()}`, + "@daveyplate/better-auth-ui": "^2.1.3", + // Mantine UI "@mantine/core": "^7.15.0", "@mantine/dates": "^7.15.0", diff --git a/packages/cli/src/installers/proofkit-auth.ts b/packages/cli/src/installers/proofkit-auth.ts index 2726673f..ff1199d6 100644 --- a/packages/cli/src/installers/proofkit-auth.ts +++ b/packages/cli/src/installers/proofkit-auth.ts @@ -18,7 +18,7 @@ import { getSettings } from "~/utils/parseSettings.js"; import { formatAndSaveSourceFiles, getNewProject } from "~/utils/ts-morph.js"; import { addToHeaderSlot } from "./auth-shared.js"; import { installFmAddon } from "./install-fm-addon.js"; -import { installEmailProvider } from "./react-email.js"; +import { installReactEmail } from "./react-email.js"; export const proofkitAuthInstaller = async () => { const spinner = ora("Installing files for auth...").start(); @@ -77,7 +77,6 @@ export const proofkitAuthInstaller = async () => { ); await addConfig({ - project, config: { clientSuffix: "Layout", layouts: [ @@ -97,7 +96,7 @@ export const proofkitAuthInstaller = async () => { strictNumbers: true, }, { - layoutName : "proofkit_auth_password_reset", + layoutName: "proofkit_auth_password_reset", schemaName: "passwordReset", strictNumbers: true, }, @@ -111,7 +110,7 @@ export const proofkitAuthInstaller = async () => { }); // install email files based on the email provider in state - await installEmailProvider({ project }); + await installReactEmail({ project, installServerFiles: true }); protectMainLayout( project.addSourceFileAtPath( diff --git a/packages/cli/src/installers/react-email.ts b/packages/cli/src/installers/react-email.ts index 37f00c30..594192a7 100644 --- a/packages/cli/src/installers/react-email.ts +++ b/packages/cli/src/installers/react-email.ts @@ -7,21 +7,36 @@ import { type PackageJson } from "type-fest"; import { abortIfCancel } from "~/cli/utils.js"; import { PKG_ROOT } from "~/consts.js"; +import { installDependencies } from "~/helpers/installDependencies.js"; import { state } from "~/state.js"; import { addPackageDependency } from "~/utils/addPackageDependency.js"; import { addToEnv } from "~/utils/addToEnvs.js"; import { logger } from "~/utils/logger.js"; +import { getSettings, setSettings } from "~/utils/parseSettings.js"; import { formatAndSaveSourceFiles, getNewProject } from "~/utils/ts-morph.js"; -export async function installEmailProvider({ ...args }: { project?: Project }) { +export async function installReactEmail({ + ...args +}: { + project?: Project; + noInstall?: boolean; + installServerFiles?: boolean; +}) { const projectDir = state.projectDir; + + // Exit early if already installed + const settings = getSettings(); + if (settings.reactEmail) return false; + + // Ensure emails directory exists + fs.ensureDirSync(path.join(projectDir, "src/emails")); addPackageDependency({ dependencies: ["@react-email/components", "@react-email/render"], devMode: false, projectDir, }); addPackageDependency({ - dependencies: ["react-email"], + dependencies: ["react-email", "@react-email/preview-server"], devMode: true, projectDir, }); @@ -37,22 +52,49 @@ export async function installEmailProvider({ ...args }: { project?: Project }) { const project = args.project ?? getNewProject(projectDir); - const emailProvider = state.emailProvider; + if (args.installServerFiles) { + const emailProvider = state.emailProvider; + if (emailProvider === "plunk") { + await installPlunk({ project }); + } else if (emailProvider === "resend") { + await installResend({ project }); + } else { + await fs.copy( + path.join(PKG_ROOT, "template/extras/emailProviders/none/email.tsx"), + path.join(projectDir, "src/server/auth/email.tsx") + ); + } + } - if (emailProvider === "plunk") { - await installPlunk({ project }); - } else if (emailProvider === "resend") { - await installResend({ project }); - } else { + // Copy base email template(s) into src/emails for preview and reuse + await fs.copy( + path.join(PKG_ROOT, "template/extras/emailTemplates/generic.tsx"), + path.join(projectDir, "src/emails/generic.tsx") + ); + if (args.installServerFiles) { await fs.copy( - path.join(PKG_ROOT, "template/extras/emailProviders/none/email.tsx"), - path.join(projectDir, "src/server/auth/email.tsx") + path.join(PKG_ROOT, "template/extras/emailTemplates/auth-code.tsx"), + path.join(projectDir, "src/emails/auth-code.tsx") ); } if (!args.project) { await formatAndSaveSourceFiles(project); } + + // Mark as installed + setSettings({ + ...settings, + reactEmail: true, + reactEmailServer: + Boolean(args.installServerFiles) || settings.reactEmailServer, + }); + + // Install dependencies unless explicitly skipped + if (!args.noInstall) { + await installDependencies({ projectDir }); + } + return true; } export async function installPlunk({ project }: { project?: Project }) { diff --git a/packages/cli/src/utils/getProofKitVersion.ts b/packages/cli/src/utils/getProofKitVersion.ts index 771169f3..7328962e 100644 --- a/packages/cli/src/utils/getProofKitVersion.ts +++ b/packages/cli/src/utils/getProofKitVersion.ts @@ -13,14 +13,7 @@ export const getVersion = () => { }; export const getFmdapiVersion = () => { - const packageJsonPath = path.join( - PKG_ROOT, - "..", - "fmdapi", - "package.json" - ); - const packageJsonContent = fs.readJSONSync(packageJsonPath) as PackageJson; - return packageJsonContent.version ?? "1.0.0"; + return __FMDAPI_VERSION__; }; export const getNodeMajorVersion = () => { @@ -31,3 +24,7 @@ export const getNodeMajorVersion = () => { return defaultVersion; } }; + +export const getProofkitBetterAuthVersion = () => { + return __BETTER_AUTH_VERSION__; +}; diff --git a/packages/cli/src/utils/parseSettings.ts b/packages/cli/src/utils/parseSettings.ts index b999fcc6..bc0a9cdd 100644 --- a/packages/cli/src/utils/parseSettings.ts +++ b/packages/cli/src/utils/parseSettings.ts @@ -19,6 +19,9 @@ const authSchema = z z.object({ type: z.literal("fmaddon"), }), + z.object({ + type: z.literal("better-auth"), + }), z.object({ type: z.literal("none"), }), @@ -56,17 +59,28 @@ const settingsSchema = z.object({ dataSources: z.array(dataSourceSchema).default([]), tanstackQuery: z.boolean().catch(false), replacedMainPage: z.boolean().catch(false), + // Whether React Email scaffolding has been installed + reactEmail: z.boolean().catch(false), + // Whether provider-specific server email sender files have been installed + reactEmailServer: z.boolean().catch(false), appliedUpgrades: z.array(z.string()).default([]), registryUrl: z.url().optional(), + registryTemplates: z.array(z.string()).default([]), }); -export const defaultSettings = settingsSchema.parse({ auth: { type: "none" } }); +export const defaultSettings = settingsSchema.parse({ auth: { type: "none" },ui:"shadcn" }); let settings: Settings | undefined; export const getSettings = () => { if (settings) return settings; const settingsPath = path.join(state.projectDir, "proofkit.json"); + + // Check if the settings file exists before trying to read it + if (!fs.existsSync(settingsPath)) { + throw new Error(`ProofKit settings file not found at: ${settingsPath}`); + } + const settingsFile: unknown = fs.readJSONSync(settingsPath); const parsed = settingsSchema.parse(settingsFile); diff --git a/packages/cli/template/extras/config/query-provider-vite.tsx b/packages/cli/template/extras/config/query-provider-vite.tsx index 1c5d7f38..5af4ad27 100644 --- a/packages/cli/template/extras/config/query-provider-vite.tsx +++ b/packages/cli/template/extras/config/query-provider-vite.tsx @@ -1,4 +1,3 @@ - import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; @@ -9,7 +8,6 @@ export default function QueryProvider({ }: { children: React.ReactNode; }) { - return ( {children} diff --git a/packages/cli/template/extras/emailProviders/none/email.tsx b/packages/cli/template/extras/emailProviders/none/email.tsx index e6599ccd..21106a19 100644 --- a/packages/cli/template/extras/emailProviders/none/email.tsx +++ b/packages/cli/template/extras/emailProviders/none/email.tsx @@ -1,5 +1,5 @@ -import { render } from "@react-email/render"; import { AuthCodeEmail } from "@/emails/auth-code"; +import { render } from "@react-email/render"; export async function sendEmail({ to, @@ -14,11 +14,11 @@ export async function sendEmail({ const body = await render( ); - const subject = type === "verification" ? "Verify Your Email" : "Reset Your Password" - + const subject = + type === "verification" ? "Verify Your Email" : "Reset Your Password"; + // TODO: Customize this function to actually send the email to your users // Learn more: https://proofkit.dev/auth/fm-addon console.warn("TODO: Customize this function to actually send to your users"); console.log(`To ${to}: Your ${type} code is ${code}`); } - diff --git a/packages/cli/template/extras/emailProviders/plunk/email.tsx b/packages/cli/template/extras/emailProviders/plunk/email.tsx index a54ac656..ef94053e 100644 --- a/packages/cli/template/extras/emailProviders/plunk/email.tsx +++ b/packages/cli/template/extras/emailProviders/plunk/email.tsx @@ -1,5 +1,6 @@ -import { render } from "@react-email/render"; import { AuthCodeEmail } from "@/emails/auth-code"; +import { render } from "@react-email/render"; + import { plunk } from "../services/plunk"; export async function sendEmail({ @@ -15,12 +16,12 @@ export async function sendEmail({ const body = await render( ); - const subject = type === "verification" ? "Verify Your Email" : "Reset Your Password" - + const subject = + type === "verification" ? "Verify Your Email" : "Reset Your Password"; + await plunk.emails.send({ to, subject, body, }); } - diff --git a/packages/cli/template/extras/emailProviders/plunk/service.ts b/packages/cli/template/extras/emailProviders/plunk/service.ts index 080ae050..9f6a3ca6 100644 --- a/packages/cli/template/extras/emailProviders/plunk/service.ts +++ b/packages/cli/template/extras/emailProviders/plunk/service.ts @@ -1,4 +1,4 @@ -import Plunk from "@plunk/node"; import { env } from "@/config/env"; +import Plunk from "@plunk/node"; export const plunk = new Plunk(env.PLUNK_API_KEY); diff --git a/packages/cli/template/extras/emailProviders/resend/email.tsx b/packages/cli/template/extras/emailProviders/resend/email.tsx index d1b4e867..5ca905b8 100644 --- a/packages/cli/template/extras/emailProviders/resend/email.tsx +++ b/packages/cli/template/extras/emailProviders/resend/email.tsx @@ -1,4 +1,5 @@ import { AuthCodeEmail } from "@/emails/auth-code"; + import { resend } from "../services/resend"; export async function sendEmail({ diff --git a/packages/cli/template/extras/emailProviders/resend/service.ts b/packages/cli/template/extras/emailProviders/resend/service.ts index 6adeac4f..9af08cd1 100644 --- a/packages/cli/template/extras/emailProviders/resend/service.ts +++ b/packages/cli/template/extras/emailProviders/resend/service.ts @@ -1,4 +1,4 @@ -import { Resend } from "resend"; import { env } from "@/config/env"; +import { Resend } from "resend"; export const resend = new Resend(env.RESEND_API_KEY); diff --git a/packages/cli/template/extras/emailTemplates/auth-code.tsx b/packages/cli/template/extras/emailTemplates/auth-code.tsx new file mode 100644 index 00000000..e7262af6 --- /dev/null +++ b/packages/cli/template/extras/emailTemplates/auth-code.tsx @@ -0,0 +1,156 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Section, + Text, +} from "@react-email/components"; +import * as React from "react"; + +interface AuthCodeEmailProps { + validationCode: string; + type: "verification" | "password-reset"; +} + +export const AuthCodeEmail = ({ validationCode, type }: AuthCodeEmailProps) => ( + + + + + ProofKit + + {type === "verification" + ? "Verify Your Email" + : "Reset Your Password"} + + + Enter the following code to{" "} + {type === "verification" + ? "verify your email" + : "reset your password"} + +
+ {validationCode} +
+ + If you did not request this code, you can ignore this email. + +
+ + +); + +AuthCodeEmail.PreviewProps = { + validationCode: "D7CU4GOV", + type: "verification", +} as AuthCodeEmailProps; + +export default AuthCodeEmail; + +const main = { + backgroundColor: "#ffffff", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", +}; + +const container = { + backgroundColor: "#ffffff", + border: "1px solid #eee", + borderRadius: "5px", + boxShadow: "0 5px 10px rgba(20,50,70,.2)", + marginTop: "20px", + maxWidth: "360px", + margin: "0 auto", + padding: "68px 0 130px", +}; + +const logo: React.CSSProperties = { + margin: "0 auto", +}; + +const tertiary = { + color: "#0a85ea", + fontSize: "11px", + fontWeight: 700, + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + height: "16px", + letterSpacing: "0", + lineHeight: "16px", + margin: "16px 8px 8px 8px", + textTransform: "uppercase" as const, + textAlign: "center" as const, +}; + +const secondary = { + color: "#000", + display: "inline-block", + fontFamily: "HelveticaNeue-Medium,Helvetica,Arial,sans-serif", + fontSize: "20px", + fontWeight: 500, + lineHeight: "24px", + marginBottom: "0", + marginTop: "0", + textAlign: "center" as const, + padding: "0 40px", +}; + +const codeContainer = { + background: "rgba(0,0,0,.05)", + borderRadius: "4px", + margin: "16px auto 14px", + verticalAlign: "middle", + width: "280px", +}; + +const code = { + color: "#000", + display: "inline-block", + fontFamily: "HelveticaNeue-Bold", + fontSize: "32px", + fontWeight: 700, + letterSpacing: "6px", + lineHeight: "40px", + paddingBottom: "8px", + paddingTop: "8px", + margin: "0 auto", + width: "100%", + textAlign: "center" as const, +}; + +const paragraph = { + color: "#444", + fontSize: "15px", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + letterSpacing: "0", + lineHeight: "23px", + padding: "0 40px", + margin: "0", + textAlign: "center" as const, +}; + +const link = { + color: "#444", + textDecoration: "underline", +}; + +const footer = { + color: "#000", + fontSize: "12px", + fontWeight: 800, + letterSpacing: "0", + lineHeight: "23px", + margin: "0", + marginTop: "20px", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + textAlign: "center" as const, + textTransform: "uppercase" as const, +}; diff --git a/packages/cli/template/extras/emailTemplates/generic.tsx b/packages/cli/template/extras/emailTemplates/generic.tsx new file mode 100644 index 00000000..e5a248f8 --- /dev/null +++ b/packages/cli/template/extras/emailTemplates/generic.tsx @@ -0,0 +1,136 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Img, + Section, + Text, +} from "@react-email/components"; +import * as React from "react"; + +export interface GenericEmailProps { + title?: string; + description?: string; + ctaText?: string; + ctaHref?: string; + footer?: string; +} + +export const GenericEmail = ({ + title, + description, + ctaText, + ctaHref, + footer, +}: GenericEmailProps) => ( + + + + + ProofKit + + {title ? {title} : null} + + {description ? ( + {description} + ) : null} + + {ctaText && ctaHref ? ( +
+ +
+ ) : null} + + {(title || description || (ctaText && ctaHref)) && ( +
+ )} + + {footer ? {footer} : null} +
+ + +); + +GenericEmail.PreviewProps = { + title: "Welcome to ProofKit", + description: + "Thanks for trying ProofKit. This is a sample email template you can customize.", + ctaText: "Get Started", + ctaHref: "https://proofkit.dev", + footer: "You received this email because you signed up for updates.", +} as GenericEmailProps; + +export default GenericEmail; + +const styles = { + main: { + backgroundColor: "#ffffff", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + }, + container: { + backgroundColor: "#ffffff", + border: "1px solid #eee", + borderRadius: "5px", + boxShadow: "0 5px 10px rgba(20,50,70,.2)", + marginTop: "20px", + maxWidth: "520px", + margin: "0 auto", + padding: "48px 32px 36px", + } as React.CSSProperties, + logo: { + margin: "0 auto 12px", + display: "block", + } as React.CSSProperties, + title: { + color: "#111827", + fontSize: "22px", + fontWeight: 600, + lineHeight: "28px", + margin: "8px 0 4px", + textAlign: "center" as const, + }, + description: { + color: "#374151", + fontSize: "15px", + lineHeight: "22px", + margin: "8px 0 0", + textAlign: "center" as const, + }, + ctaSection: { + textAlign: "center" as const, + marginTop: "20px", + }, + ctaButton: { + backgroundColor: "#0a85ea", + color: "#fff", + fontSize: "14px", + fontWeight: 600, + lineHeight: "20px", + textDecoration: "none", + display: "inline-block", + padding: "10px 16px", + borderRadius: "6px", + } as React.CSSProperties, + hr: { + borderColor: "#e5e7eb", + margin: "24px 0 12px", + }, + footer: { + color: "#6b7280", + fontSize: "12px", + lineHeight: "18px", + textAlign: "center" as const, + }, +}; diff --git a/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/actions.ts b/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/actions.ts index bc8508e2..49191dfa 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/actions.ts +++ b/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/actions.ts @@ -1,6 +1,14 @@ "use server"; -import { actionClient } from "@/server/safe-action"; -import { updateEmailSchema, updatePasswordSchema } from "./schema"; + +import { + createEmailVerificationRequest, + sendVerificationEmail, + setEmailVerificationRequestCookie, +} from "@/server/auth/utils/email-verification"; +import { + verifyPasswordHash, + verifyPasswordStrength, +} from "@/server/auth/utils/password"; import { createSession, generateSessionToken, @@ -13,14 +21,10 @@ import { updateUserPassword, validateLogin, } from "@/server/auth/utils/user"; -import { - createEmailVerificationRequest, - sendVerificationEmail, - setEmailVerificationRequestCookie, -} from "@/server/auth/utils/email-verification"; +import { actionClient } from "@/server/safe-action"; import { redirect } from "next/navigation"; -import { verifyPasswordHash } from "@/server/auth/utils/password"; -import { verifyPasswordStrength } from "@/server/auth/utils/password"; + +import { updateEmailSchema, updatePasswordSchema } from "./schema"; export const updateEmailAction = actionClient .schema(updateEmailSchema) diff --git a/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/page.tsx b/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/page.tsx index 230e2f8a..76431716 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/page.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/page.tsx @@ -1,8 +1,10 @@ import { getCurrentSession } from "@/server/auth/utils/session"; import { Anchor, Container, Paper, Stack, Text, Title } from "@mantine/core"; import { redirect } from "next/navigation"; + import UpdateEmailForm from "./profile-form"; import UpdatePasswordForm from "./reset-password-form"; + // import EmailVerificationForm from "./email-verification-form"; export default async function Page() { diff --git a/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/profile-form.tsx b/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/profile-form.tsx index 229cc4db..13e3853a 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/profile-form.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/profile-form.tsx @@ -1,7 +1,5 @@ "use client"; -import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; -import { updateEmailSchema } from "./schema"; -import { updateEmailAction } from "./actions"; + import { zodResolver } from "@hookform/resolvers/zod"; import { Anchor, @@ -9,10 +7,14 @@ import { Group, Paper, PasswordInput, + Stack, Text, + TextInput, } from "@mantine/core"; -import { TextInput } from "@mantine/core"; -import { Stack } from "@mantine/core"; +import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; + +import { updateEmailAction } from "./actions"; +import { updateEmailSchema } from "./schema"; export default function UpdateEmailForm({ currentEmail, diff --git a/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/reset-password-form.tsx b/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/reset-password-form.tsx index 71004c1e..b22bee20 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/reset-password-form.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/(main)/auth/profile/reset-password-form.tsx @@ -1,7 +1,6 @@ "use client"; -import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; -import { updatePasswordSchema } from "./schema"; -import { updatePasswordAction } from "./actions"; + +import { showSuccessNotification } from "@/utils/notification-helpers"; import { zodResolver } from "@hookform/resolvers/zod"; import { Anchor, @@ -9,12 +8,15 @@ import { Group, Paper, PasswordInput, + Stack, Text, + TextInput, } from "@mantine/core"; -import { TextInput } from "@mantine/core"; -import { Stack } from "@mantine/core"; +import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; import { useState } from "react"; -import { showSuccessNotification } from "@/utils/notification-helpers"; + +import { updatePasswordAction } from "./actions"; +import { updatePasswordSchema } from "./schema"; export default function UpdatePasswordForm() { const [showForm, setShowForm] = useState(false); diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/actions.ts b/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/actions.ts index 4e96334d..78c14d96 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/actions.ts +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/actions.ts @@ -1,15 +1,17 @@ "use server"; -import { actionClient } from "@/server/safe-action"; -import { forgotPasswordSchema } from "./schema"; -import { getUserFromEmail } from "@/server/auth/utils/user"; -import { generateSessionToken } from "@/server/auth/utils/session"; -import { redirect } from "next/navigation"; + import { createPasswordResetSession, invalidateUserPasswordResetSessions, sendPasswordResetEmail, setPasswordResetSessionTokenCookie, } from "@/server/auth/utils/password-reset"; +import { generateSessionToken } from "@/server/auth/utils/session"; +import { getUserFromEmail } from "@/server/auth/utils/user"; +import { actionClient } from "@/server/safe-action"; +import { redirect } from "next/navigation"; + +import { forgotPasswordSchema } from "./schema"; export const forgotPasswordAction = actionClient .schema(forgotPasswordSchema) diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/forgot-form.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/forgot-form.tsx index 5cc28ca1..5ff49868 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/forgot-form.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/forgot-form.tsx @@ -1,8 +1,9 @@ "use client"; -import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; import { zodResolver } from "@hookform/resolvers/zod"; -import { TextInput, Button, Stack, Paper, Text } from "@mantine/core"; +import { Button, Paper, Stack, Text, TextInput } from "@mantine/core"; +import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; + import { forgotPasswordAction } from "./actions"; import { forgotPasswordSchema } from "./schema"; diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/page.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/page.tsx index 639a0f6a..09be86ba 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/page.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/forgot-password/page.tsx @@ -1,4 +1,5 @@ import { Anchor, Container, Text, Title } from "@mantine/core"; + import ForgotForm from "./forgot-form"; export default async function Page() { diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/login/actions.ts b/packages/cli/template/extras/fmaddon-auth/app/auth/login/actions.ts index c5ca8cfe..ca66a9df 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/login/actions.ts +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/login/actions.ts @@ -1,15 +1,16 @@ "use server"; -import { actionClient } from "@/server/safe-action"; -import { loginSchema } from "./schema"; -import { validateLogin } from "@/server/auth/utils/user"; +import { getRedirectCookie } from "@/server/auth/utils/redirect"; import { createSession, generateSessionToken, setSessionTokenCookie, } from "@/server/auth/utils/session"; +import { validateLogin } from "@/server/auth/utils/user"; +import { actionClient } from "@/server/safe-action"; import { redirect } from "next/navigation"; -import { getRedirectCookie } from "@/server/auth/utils/redirect"; + +import { loginSchema } from "./schema"; export const loginAction = actionClient .schema(loginSchema) diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/login/login-form.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/login/login-form.tsx index 4ba67d83..fa13fbb5 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/login/login-form.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/login/login-form.tsx @@ -1,7 +1,5 @@ "use client"; -import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; -import { loginSchema } from "./schema"; -import { loginAction } from "./actions"; + import { zodResolver } from "@hookform/resolvers/zod"; import { Anchor, @@ -9,10 +7,14 @@ import { Group, Paper, PasswordInput, + Stack, Text, + TextInput, } from "@mantine/core"; -import { TextInput } from "@mantine/core"; -import { Stack } from "@mantine/core"; +import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; + +import { loginAction } from "./actions"; +import { loginSchema } from "./schema"; export default function LoginForm() { const { form, handleSubmitWithAction, action } = useHookFormAction( diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/login/page.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/login/page.tsx index 1e97d35d..a98eb6c3 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/login/page.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/login/page.tsx @@ -1,6 +1,7 @@ import { getCurrentSession } from "@/server/auth/utils/session"; import { Anchor, Container, Text, Title } from "@mantine/core"; import { redirect } from "next/navigation"; + import LoginForm from "./login-form"; export default async function Page() { diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/actions.ts b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/actions.ts index d72c4470..a781546c 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/actions.ts +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/actions.ts @@ -1,20 +1,23 @@ "use server"; -import { actionClient } from "@/server/safe-action"; -import { resetPasswordSchema } from "./schema"; +import { verifyPasswordStrength } from "@/server/auth/utils/password"; import { deletePasswordResetSessionTokenCookie, invalidateUserPasswordResetSessions, + validatePasswordResetSessionRequest, } from "@/server/auth/utils/password-reset"; -import { validatePasswordResetSessionRequest } from "@/server/auth/utils/password-reset"; -import { createSession } from "@/server/auth/utils/session"; -import { generateSessionToken } from "@/server/auth/utils/session"; -import { setSessionTokenCookie } from "@/server/auth/utils/session"; -import { verifyPasswordStrength } from "@/server/auth/utils/password"; -import { invalidateUserSessions } from "@/server/auth/utils/session"; +import { + createSession, + generateSessionToken, + invalidateUserSessions, + setSessionTokenCookie, +} from "@/server/auth/utils/session"; import { updateUserPassword } from "@/server/auth/utils/user"; +import { actionClient } from "@/server/safe-action"; import { redirect } from "next/navigation"; +import { resetPasswordSchema } from "./schema"; + export const resetPasswordAction = actionClient .schema(resetPasswordSchema) .action(async ({ parsedInput }) => { diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/page.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/page.tsx index 1908cce3..9a164a1d 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/page.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/page.tsx @@ -1,9 +1,10 @@ -import { Alert, Anchor, Container, Text, Title } from "@mantine/core"; -import ResetPasswordForm from "./reset-password-form"; import { env } from "@/config/env"; import { validatePasswordResetSessionRequest } from "@/server/auth/utils/password-reset"; +import { Alert, Anchor, Container, Text, Title } from "@mantine/core"; import { redirect } from "next/navigation"; +import ResetPasswordForm from "./reset-password-form"; + export default async function Page() { const { session, user } = await validatePasswordResetSessionRequest(); if (session === null) { diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/reset-password-form.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/reset-password-form.tsx index f6436a17..e11b3acd 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/reset-password-form.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/reset-password-form.tsx @@ -1,15 +1,16 @@ "use client"; -import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; import { zodResolver } from "@hookform/resolvers/zod"; import { - TextInput, Button, - Stack, Paper, - Text, PasswordInput, + Stack, + Text, + TextInput, } from "@mantine/core"; +import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; + import { resetPasswordAction } from "./actions"; import { resetPasswordSchema } from "./schema"; diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/actions.ts b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/actions.ts index 2ac15e6d..4ce0b1b7 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/actions.ts +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/actions.ts @@ -1,14 +1,15 @@ "use server"; -import { actionClient } from "@/server/safe-action"; -import { verifyEmailSchema } from "./schema"; import { setPasswordResetSessionAsEmailVerified, validatePasswordResetSessionRequest, } from "@/server/auth/utils/password-reset"; import { setUserAsEmailVerifiedIfEmailMatches } from "@/server/auth/utils/user"; +import { actionClient } from "@/server/safe-action"; import { redirect } from "next/navigation"; +import { verifyEmailSchema } from "./schema"; + export const verifyEmailAction = actionClient .schema(verifyEmailSchema) .action(async ({ parsedInput }) => { diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/page.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/page.tsx index 1c687be6..b3796b06 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/page.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/page.tsx @@ -1,9 +1,10 @@ -import { Alert, Anchor, Container, Text, Title } from "@mantine/core"; -import VerifyEmailForm from "./verify-email-form"; import { env } from "@/config/env"; import { validatePasswordResetSessionRequest } from "@/server/auth/utils/password-reset"; +import { Alert, Anchor, Container, Text, Title } from "@mantine/core"; import { redirect } from "next/navigation"; +import VerifyEmailForm from "./verify-email-form"; + export default async function Page() { const { session } = await validatePasswordResetSessionRequest(); if (session === null) { diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/verify-email-form.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/verify-email-form.tsx index 6c2e5219..2d454b7e 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/verify-email-form.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/verify-email-form.tsx @@ -1,8 +1,9 @@ "use client"; -import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; import { zodResolver } from "@hookform/resolvers/zod"; -import { Button, Stack, Paper, Text, PinInput } from "@mantine/core"; +import { Button, Paper, PinInput, Stack, Text } from "@mantine/core"; +import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; + import { verifyEmailAction } from "./actions"; import { verifyEmailSchema } from "./schema"; diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/signup/actions.ts b/packages/cli/template/extras/fmaddon-auth/app/auth/signup/actions.ts index 475bd7f5..3faa5d0f 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/signup/actions.ts +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/signup/actions.ts @@ -1,20 +1,21 @@ "use server"; -import { actionClient } from "@/server/safe-action"; -import { signupSchema } from "./schema"; -import { checkEmailAvailability, createUser } from "@/server/auth/utils/user"; +import { + createEmailVerificationRequest, + sendVerificationEmail, + setEmailVerificationRequestCookie, +} from "@/server/auth/utils/email-verification"; import { verifyPasswordStrength } from "@/server/auth/utils/password"; import { createSession, + generateSessionToken, setSessionTokenCookie, } from "@/server/auth/utils/session"; -import { generateSessionToken } from "@/server/auth/utils/session"; +import { checkEmailAvailability, createUser } from "@/server/auth/utils/user"; +import { actionClient } from "@/server/safe-action"; import { redirect } from "next/navigation"; -import { - createEmailVerificationRequest, - sendVerificationEmail, - setEmailVerificationRequestCookie, -} from "@/server/auth/utils/email-verification"; + +import { signupSchema } from "./schema"; export const signupAction = actionClient .schema(signupSchema) diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/signup/page.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/signup/page.tsx index 81120242..056d5284 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/signup/page.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/signup/page.tsx @@ -1,6 +1,7 @@ import { getCurrentSession } from "@/server/auth/utils/session"; import { Anchor, Container, Text, Title } from "@mantine/core"; import { redirect } from "next/navigation"; + import SignupForm from "./signup-form"; export default async function Page() { diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/signup/signup-form.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/signup/signup-form.tsx index fdf4d44f..f41454ae 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/signup/signup-form.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/signup/signup-form.tsx @@ -1,19 +1,20 @@ "use client"; -import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; -import { signupAction } from "./actions"; import { zodResolver } from "@hookform/resolvers/zod"; -import { signupSchema } from "./schema"; import { Anchor, - PasswordInput, - TextInput, Button, Group, - Stack, Paper, + PasswordInput, + Stack, Text, + TextInput, } from "@mantine/core"; +import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; + +import { signupAction } from "./actions"; +import { signupSchema } from "./schema"; export default function SignupForm() { const { form, handleSubmitWithAction, action } = useHookFormAction( diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/actions.ts b/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/actions.ts index 6040c017..3ad9697a 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/actions.ts +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/actions.ts @@ -1,22 +1,21 @@ "use server"; -import { getCurrentSession } from "@/server/auth/utils/session"; -import { actionClient } from "@/server/safe-action"; -import { emailVerificationSchema } from "./schema"; import { + createEmailVerificationRequest, deleteEmailVerificationRequestCookie, deleteUserEmailVerificationRequest, + getUserEmailVerificationRequestFromRequest, sendVerificationEmail, setEmailVerificationRequestCookie, } from "@/server/auth/utils/email-verification"; -import { - createEmailVerificationRequest, - getUserEmailVerificationRequestFromRequest, -} from "@/server/auth/utils/email-verification"; import { invalidateUserPasswordResetSessions } from "@/server/auth/utils/password-reset"; +import { getRedirectCookie } from "@/server/auth/utils/redirect"; +import { getCurrentSession } from "@/server/auth/utils/session"; import { updateUserEmailAndSetEmailAsVerified } from "@/server/auth/utils/user"; +import { actionClient } from "@/server/safe-action"; import { redirect } from "next/navigation"; -import { getRedirectCookie } from "@/server/auth/utils/redirect"; + +import { emailVerificationSchema } from "./schema"; export const verifyEmailAction = actionClient .schema(emailVerificationSchema) diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/email-verification-form.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/email-verification-form.tsx index ea8fe2bc..3108c3fa 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/email-verification-form.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/email-verification-form.tsx @@ -1,10 +1,11 @@ "use client"; + +import { zodResolver } from "@hookform/resolvers/zod"; +import { Button, Paper, PinInput, Stack, Text } from "@mantine/core"; import { useHookFormAction } from "@next-safe-action/adapter-react-hook-form/hooks"; -import { emailVerificationSchema } from "./schema"; + import { verifyEmailAction } from "./actions"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { Button, Paper, PinInput, Text } from "@mantine/core"; -import { Stack } from "@mantine/core"; +import { emailVerificationSchema } from "./schema"; export default function LoginForm() { const { form, handleSubmitWithAction, action } = useHookFormAction( diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/page.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/page.tsx index 5b3069c6..bfad170d 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/page.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/page.tsx @@ -1,10 +1,11 @@ +import { getUserEmailVerificationRequestFromRequest } from "@/server/auth/utils/email-verification"; +import { getRedirectCookie } from "@/server/auth/utils/redirect"; import { getCurrentSession } from "@/server/auth/utils/session"; import { Anchor, Container, Text, Title } from "@mantine/core"; import { redirect } from "next/navigation"; + import EmailVerificationForm from "./email-verification-form"; import ResendButton from "./resend-button"; -import { getUserEmailVerificationRequestFromRequest } from "@/server/auth/utils/email-verification"; -import { getRedirectCookie } from "@/server/auth/utils/redirect"; export default async function Page() { const { user } = await getCurrentSession(); @@ -15,7 +16,8 @@ export default async function Page() { // TODO: Ideally we'd sent a new verification email automatically if the previous one is expired, // but we can't set cookies inside server components. - const verificationRequest = await getUserEmailVerificationRequestFromRequest(); + const verificationRequest = + await getUserEmailVerificationRequestFromRequest(); if (verificationRequest === null && user.emailVerified) { const redirectTo = await getRedirectCookie(); return redirect(redirectTo); diff --git a/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/resend-button.tsx b/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/resend-button.tsx index ca862eb4..ee36ae70 100644 --- a/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/resend-button.tsx +++ b/packages/cli/template/extras/fmaddon-auth/app/auth/verify-email/resend-button.tsx @@ -1,15 +1,17 @@ "use client"; + import { Alert, Anchor, Button, Group, Stack, Text } from "@mantine/core"; -import { resendEmailVerificationAction } from "./actions"; import { useAction } from "next-safe-action/hooks"; +import { resendEmailVerificationAction } from "./actions"; + export default function ResendButton() { const action = useAction(resendEmailVerificationAction); return ( - {"Didn't receive the email?"} + {"Didn't receive the email?"} ; + return ( + + ); } const isActive = route.exactMatch diff --git a/packages/cli/template/nextjs-mantine/src/utils/notification-helpers.ts b/packages/cli/template/nextjs-mantine/src/utils/notification-helpers.ts index 771fdffe..b5aa63e3 100644 --- a/packages/cli/template/nextjs-mantine/src/utils/notification-helpers.ts +++ b/packages/cli/template/nextjs-mantine/src/utils/notification-helpers.ts @@ -18,7 +18,7 @@ export function showSuccessNotification(): void; export function showSuccessNotification(props: NotificationData): void; export function showSuccessNotification(message: string): void; export function showSuccessNotification( - args?: string | NotificationData + args?: string | NotificationData, ): void { const message = typeof args === "string" ? args : "Success!"; const defaultProps = typeof args === "string" ? {} : (args ?? {}); diff --git a/packages/cli/template/nextjs-mantine/tsconfig.json b/packages/cli/template/nextjs-mantine/tsconfig.json index f48e7ee6..51d0dbce 100644 --- a/packages/cli/template/nextjs-mantine/tsconfig.json +++ b/packages/cli/template/nextjs-mantine/tsconfig.json @@ -1,10 +1,6 @@ { "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -22,19 +18,10 @@ } ], "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] }, "target": "ES2017" }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/packages/cli/template/nextjs-shadcn/src/components/AppShell/internal/HeaderNavLink.tsx b/packages/cli/template/nextjs-shadcn/src/components/AppShell/internal/HeaderNavLink.tsx index 5da52246..06ce2676 100644 --- a/packages/cli/template/nextjs-shadcn/src/components/AppShell/internal/HeaderNavLink.tsx +++ b/packages/cli/template/nextjs-shadcn/src/components/AppShell/internal/HeaderNavLink.tsx @@ -10,7 +10,11 @@ export default function HeaderNavLink(route: ProofKitRoute) { const pathname = usePathname(); if (route.type === "function") { - return ; + return ( + + ); } const isActive = route.exactMatch diff --git a/packages/cli/template/nextjs-shadcn/src/utils/notification-helpers.ts b/packages/cli/template/nextjs-shadcn/src/utils/notification-helpers.ts index dc0dd7c8..1a8d7ebb 100644 --- a/packages/cli/template/nextjs-shadcn/src/utils/notification-helpers.ts +++ b/packages/cli/template/nextjs-shadcn/src/utils/notification-helpers.ts @@ -1,7 +1,8 @@ export function showErrorNotification(): void; export function showErrorNotification(message: string): void; export function showErrorNotification(args?: string): void { - const message = typeof args === "string" ? args : "An unexpected error occurred."; + const message = + typeof args === "string" ? args : "An unexpected error occurred."; // TODO: Replace with your preferred toast library if (typeof window !== "undefined") console.error(message); } diff --git a/packages/cli/template/nextjs-shadcn/tsconfig.json b/packages/cli/template/nextjs-shadcn/tsconfig.json index f48e7ee6..51d0dbce 100644 --- a/packages/cli/template/nextjs-shadcn/tsconfig.json +++ b/packages/cli/template/nextjs-shadcn/tsconfig.json @@ -1,10 +1,6 @@ { "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -22,19 +18,10 @@ } ], "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] }, "target": "ES2017" }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/packages/cli/template/pages/nextjs/table-edit/page.tsx b/packages/cli/template/pages/nextjs/table-edit/page.tsx index f4facf18..5957658b 100644 --- a/packages/cli/template/pages/nextjs/table-edit/page.tsx +++ b/packages/cli/template/pages/nextjs/table-edit/page.tsx @@ -1,9 +1,9 @@ import { __CLIENT_NAME__ } from "@/config/schemas/__SOURCE_NAME__/client"; -import { Stack, Text, Code } from "@mantine/core"; +import { Code, Stack, Text } from "@mantine/core"; import React from "react"; -import TableContent from "./table"; import { idFieldName } from "./schema"; +import TableContent from "./table"; export default async function TablePage() { // this function is limited to 100 records by default. To load more, see the other table templates from the docs @@ -17,12 +17,12 @@ export default async function TablePage() { This table allows editing. Double-click on a cell to edit the value. - NOTE: This feature requires a primary key field on your API layout. If your - primary key field is not {idFieldName}, update the + NOTE: This feature requires a primary key field on your API layout. If + your primary key field is not {idFieldName}, update the idFieldName variable in the schema.ts file. d.fieldData)} /> ); -} \ No newline at end of file +} diff --git a/packages/cli/template/pages/nextjs/table-edit/table.tsx b/packages/cli/template/pages/nextjs/table-edit/table.tsx index 1f4d2721..2166994f 100644 --- a/packages/cli/template/pages/nextjs/table-edit/table.tsx +++ b/packages/cli/template/pages/nextjs/table-edit/table.tsx @@ -1,15 +1,16 @@ "use client"; import { type __TYPE_NAME__ } from "@/config/schemas/__SOURCE_NAME__/__SCHEMA_NAME__"; +import { showErrorNotification } from "@/utils/notification-helpers"; import { MantineReactTable, + useMantineReactTable, type MRT_Cell, type MRT_ColumnDef, - useMantineReactTable, } from "mantine-react-table"; import React from "react"; + import { updateRecord } from "./actions"; -import { showErrorNotification } from "@/utils/notification-helpers"; import { idFieldName } from "./schema"; type TData = __TYPE_NAME__; @@ -39,5 +40,6 @@ export default function MyTable({ data }: { data: TData[] }) { handleSaveCell(cell, event.target.value); }, }), - }); return ; + }); + return ; } diff --git a/packages/cli/template/pages/nextjs/table-infinite-edit/page.tsx b/packages/cli/template/pages/nextjs/table-infinite-edit/page.tsx index cec39a4d..d194b139 100644 --- a/packages/cli/template/pages/nextjs/table-infinite-edit/page.tsx +++ b/packages/cli/template/pages/nextjs/table-infinite-edit/page.tsx @@ -1,8 +1,8 @@ -import { Stack, Text, Code } from "@mantine/core"; +import { Code, Stack, Text } from "@mantine/core"; import React from "react"; -import TableContent from "./table"; import { idFieldName } from "./schema"; +import TableContent from "./table"; export default async function TablePage() { return ( @@ -12,12 +12,12 @@ export default async function TablePage() { This table allows editing. Double-click on a cell to edit the value. - NOTE: This feature requires a primary key field on your API layout. If your - primary key field is not {idFieldName}, update the + NOTE: This feature requires a primary key field on your API layout. If + your primary key field is not {idFieldName}, update the idFieldName variable in the schema.ts file. - + ); -} \ No newline at end of file +} diff --git a/packages/cli/template/pages/nextjs/table-infinite-edit/query.ts b/packages/cli/template/pages/nextjs/table-infinite-edit/query.ts index 53d86d1c..faf1675a 100644 --- a/packages/cli/template/pages/nextjs/table-infinite-edit/query.ts +++ b/packages/cli/template/pages/nextjs/table-infinite-edit/query.ts @@ -66,7 +66,7 @@ export function useAllData({ data: page.data.map((row) => row.fieldData[idFieldName] === newRecord[idFieldName] ? { ...row, fieldData: { ...row.fieldData, ...newRecord } } - : row, + : row ), })), }; @@ -77,5 +77,11 @@ export function useAllData({ }, }); - return { ...qr, data: flatData, totalDBRowCount, totalFetched, updateRecord: updateRecordMutation.mutate }; + return { + ...qr, + data: flatData, + totalDBRowCount, + totalFetched, + updateRecord: updateRecordMutation.mutate, + }; } diff --git a/packages/cli/template/pages/nextjs/table-infinite/query.ts b/packages/cli/template/pages/nextjs/table-infinite/query.ts index 4f28b6de..d4c0e26a 100644 --- a/packages/cli/template/pages/nextjs/table-infinite/query.ts +++ b/packages/cli/template/pages/nextjs/table-infinite/query.ts @@ -1,12 +1,13 @@ "use client"; import { useInfiniteQuery } from "@tanstack/react-query"; -import { fetchData } from "./actions"; -import { useMemo } from "react"; import type { - MRT_SortingState, MRT_ColumnFiltersState, + MRT_SortingState, } from "mantine-react-table"; +import { useMemo } from "react"; + +import { fetchData } from "./actions"; export function useAllData({ sorting, diff --git a/packages/cli/template/pages/nextjs/table-infinite/table.tsx b/packages/cli/template/pages/nextjs/table-infinite/table.tsx index fd7e22d4..d76daa43 100644 --- a/packages/cli/template/pages/nextjs/table-infinite/table.tsx +++ b/packages/cli/template/pages/nextjs/table-infinite/table.tsx @@ -1,6 +1,7 @@ "use client"; import { __TYPE_NAME__ } from "@/config/schemas/__SOURCE_NAME__/__SCHEMA_NAME__"; +import { Text } from "@mantine/core"; import { createMRTColumnHelper, MantineReactTable, @@ -11,14 +12,14 @@ import { useMantineReactTable, } from "mantine-react-table"; import React, { - type UIEvent, useCallback, useEffect, useRef, useState, + type UIEvent, } from "react"; + import { useAllData } from "./query"; -import { Text } from "@mantine/core"; type TData = __TYPE_NAME__; diff --git a/packages/cli/template/pages/vite-wv/table-edit/index.tsx b/packages/cli/template/pages/vite-wv/table-edit/index.tsx index 31e5181f..0db5cb10 100644 --- a/packages/cli/template/pages/vite-wv/table-edit/index.tsx +++ b/packages/cli/template/pages/vite-wv/table-edit/index.tsx @@ -1,3 +1,7 @@ +import FullScreenLoader from "@/components/full-screen-loader"; +import { __TYPE_NAME__ } from "@/config/schemas/__SOURCE_NAME__/__SCHEMA_NAME__"; +import { __CLIENT_NAME__ } from "@/config/schemas/__SOURCE_NAME__/client"; +import { Code, Stack, Text } from "@mantine/core"; import { createFileRoute } from "@tanstack/react-router"; import { MantineReactTable, @@ -5,10 +9,6 @@ import { MRT_ColumnDef, useMantineReactTable, } from "mantine-react-table"; -import { __CLIENT_NAME__ } from "@/config/schemas/__SOURCE_NAME__/client"; -import { __TYPE_NAME__ } from "@/config/schemas/__SOURCE_NAME__/__SCHEMA_NAME__"; -import { Code, Stack, Text } from "@mantine/core"; -import FullScreenLoader from "@/components/full-screen-loader"; export const Route = createFileRoute("/")({ component: RouteComponent, @@ -61,8 +61,8 @@ function RouteComponent() { This table allows editing. Double-click on a cell to edit the value. - NOTE: This feature requires a primary key field on your API layout. If your - primary key field is not {idFieldName}, update the + NOTE: This feature requires a primary key field on your API layout. If + your primary key field is not {idFieldName}, update the idFieldName variable in the code. diff --git a/packages/cli/template/pages/vite-wv/table/index.tsx b/packages/cli/template/pages/vite-wv/table/index.tsx index 44372204..6f09d89c 100644 --- a/packages/cli/template/pages/vite-wv/table/index.tsx +++ b/packages/cli/template/pages/vite-wv/table/index.tsx @@ -1,13 +1,14 @@ +import FullScreenLoader from "@/components/full-screen-loader"; +import { __TYPE_NAME__ } from "@/config/schemas/__SOURCE_NAME__/__SCHEMA_NAME__"; +import { __CLIENT_NAME__ } from "@/config/schemas/__SOURCE_NAME__/client"; +import { Stack, Text } from "@mantine/core"; import { createFileRoute } from "@tanstack/react-router"; import { MantineReactTable, MRT_ColumnDef, useMantineReactTable, } from "mantine-react-table"; -import { __CLIENT_NAME__ } from "@/config/schemas/__SOURCE_NAME__/client"; -import { __TYPE_NAME__ } from "@/config/schemas/__SOURCE_NAME__/__SCHEMA_NAME__"; -import { Stack, Text } from "@mantine/core"; -import FullScreenLoader from "@/components/full-screen-loader"; + export const Route = createFileRoute("/")({ component: RouteComponent, pendingComponent: () => , diff --git a/packages/cli/template/vite-wv/src/main.tsx b/packages/cli/template/vite-wv/src/main.tsx index 23fd6d08..3d04e4fa 100644 --- a/packages/cli/template/vite-wv/src/main.tsx +++ b/packages/cli/template/vite-wv/src/main.tsx @@ -37,6 +37,6 @@ if (!rootElement.innerHTML) { root.render( - + , ); } diff --git a/packages/cli/template/vite-wv/src/routeTree.gen.ts b/packages/cli/template/vite-wv/src/routeTree.gen.ts index 03d550a4..0528f785 100644 --- a/packages/cli/template/vite-wv/src/routeTree.gen.ts +++ b/packages/cli/template/vite-wv/src/routeTree.gen.ts @@ -10,85 +10,85 @@ // Import Routes -import { Route as rootRoute } from './routes/__root' -import { Route as SecondaryImport } from './routes/secondary' -import { Route as IndexImport } from './routes/index' +import { Route as rootRoute } from "./routes/__root"; +import { Route as SecondaryImport } from "./routes/secondary"; +import { Route as IndexImport } from "./routes/index"; // Create/Update Routes const SecondaryRoute = SecondaryImport.update({ - id: '/secondary', - path: '/secondary', + id: "/secondary", + path: "/secondary", getParentRoute: () => rootRoute, -} as any) +} as any); const IndexRoute = IndexImport.update({ - id: '/', - path: '/', + id: "/", + path: "/", getParentRoute: () => rootRoute, -} as any) +} as any); // Populate the FileRoutesByPath interface -declare module '@tanstack/react-router' { +declare module "@tanstack/react-router" { interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexImport - parentRoute: typeof rootRoute - } - '/secondary': { - id: '/secondary' - path: '/secondary' - fullPath: '/secondary' - preLoaderRoute: typeof SecondaryImport - parentRoute: typeof rootRoute - } + "/": { + id: "/"; + path: "/"; + fullPath: "/"; + preLoaderRoute: typeof IndexImport; + parentRoute: typeof rootRoute; + }; + "/secondary": { + id: "/secondary"; + path: "/secondary"; + fullPath: "/secondary"; + preLoaderRoute: typeof SecondaryImport; + parentRoute: typeof rootRoute; + }; } } // Create and export the route tree export interface FileRoutesByFullPath { - '/': typeof IndexRoute - '/secondary': typeof SecondaryRoute + "/": typeof IndexRoute; + "/secondary": typeof SecondaryRoute; } export interface FileRoutesByTo { - '/': typeof IndexRoute - '/secondary': typeof SecondaryRoute + "/": typeof IndexRoute; + "/secondary": typeof SecondaryRoute; } export interface FileRoutesById { - __root__: typeof rootRoute - '/': typeof IndexRoute - '/secondary': typeof SecondaryRoute + __root__: typeof rootRoute; + "/": typeof IndexRoute; + "/secondary": typeof SecondaryRoute; } export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: '/' | '/secondary' - fileRoutesByTo: FileRoutesByTo - to: '/' | '/secondary' - id: '__root__' | '/' | '/secondary' - fileRoutesById: FileRoutesById + fileRoutesByFullPath: FileRoutesByFullPath; + fullPaths: "/" | "/secondary"; + fileRoutesByTo: FileRoutesByTo; + to: "/" | "/secondary"; + id: "__root__" | "/" | "/secondary"; + fileRoutesById: FileRoutesById; } export interface RootRouteChildren { - IndexRoute: typeof IndexRoute - SecondaryRoute: typeof SecondaryRoute + IndexRoute: typeof IndexRoute; + SecondaryRoute: typeof SecondaryRoute; } const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, SecondaryRoute: SecondaryRoute, -} +}; export const routeTree = rootRoute ._addFileChildren(rootRouteChildren) - ._addFileTypes() + ._addFileTypes(); /* ROUTE_MANIFEST_START { diff --git a/packages/cli/tsconfig.eslint.json b/packages/cli/tsconfig.eslint.json index 66549986..29ba1ede 100644 --- a/packages/cli/tsconfig.eslint.json +++ b/packages/cli/tsconfig.eslint.json @@ -3,7 +3,7 @@ "include": [ "src", "template", - "tsup.config.ts", + "tsdown.config.ts", "prettier.config.mjs", "index.d.ts" ] diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 9b1f4a9a..82808879 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -11,7 +11,7 @@ "exclude": ["template"], "include": [ "src", - "tsup.config.ts", + "tsdown.config.ts", "../reset.d.ts", "prettier.config.mjs", "index.d.ts" diff --git a/packages/cli/tsdown.config.ts b/packages/cli/tsdown.config.ts new file mode 100644 index 00000000..9bdf8362 --- /dev/null +++ b/packages/cli/tsdown.config.ts @@ -0,0 +1,49 @@ +import path from "path"; +import { fileURLToPath } from "url"; +import fsExtra from "fs-extra"; +import { defineConfig } from "tsdown"; + +const { readJSONSync } = fsExtra; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const isDev = process.env.npm_lifecycle_event === "dev"; + +// Read package versions at build time +const readPackageVersion = (packagePath: string) => { + const packageJsonPath = path.join( + __dirname, + "..", + packagePath, + "package.json" + ); + const packageJson = readJSONSync(packageJsonPath); + if (!packageJson.version) { + throw new Error(`No version found in ${packageJsonPath}`); + } + return packageJson.version; +}; + +const FMDAPI_VERSION = readPackageVersion("fmdapi"); +const BETTER_AUTH_VERSION = readPackageVersion("better-auth"); + +export default defineConfig({ + clean: true, + entry: ["src/index.ts"], + format: ["esm"], + minify: !isDev, + target: "esnext", + outDir: "dist", + // Bundle workspace dependencies that shouldn't be external + noExternal: ["@proofkit/registry"], + // Keep Node.js built-in module imports as-is for better compatibility + nodeProtocol: false, + // Inject package versions and registry URL at build time + define: { + __FMDAPI_VERSION__: JSON.stringify(FMDAPI_VERSION), + __BETTER_AUTH_VERSION__: JSON.stringify(BETTER_AUTH_VERSION), + __REGISTRY_URL__: JSON.stringify( + isDev ? "http://localhost:3005" : "https://proofkit.dev" + ), + }, + onSuccess: isDev ? "node dist/index.js" : undefined, +}); diff --git a/packages/cli/tsup.config.ts b/packages/cli/tsup.config.ts deleted file mode 100644 index 35e7f4bc..00000000 --- a/packages/cli/tsup.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from "tsup"; - -const isDev = process.env.npm_lifecycle_event === "dev"; - -export default defineConfig({ - clean: true, - entry: ["src/index.ts"], - format: ["esm"], - minify: !isDev, - target: "esnext", - replaceNodeEnv: true, - outDir: "dist", - onSuccess: isDev ? "IS_LOCAL_DEV=1 node dist/index.js" : undefined, -}); diff --git a/packages/registry/lib/index.ts b/packages/registry/lib/index.ts new file mode 100644 index 00000000..860e983b --- /dev/null +++ b/packages/registry/lib/index.ts @@ -0,0 +1,6 @@ +// Re-export all types +export * from "./types.js"; + +// Re-export all utilities +export * from "./utils.js"; +export * from "./validator.js"; diff --git a/packages/registry/lib/types.ts b/packages/registry/lib/types.ts new file mode 100644 index 00000000..1a356909 --- /dev/null +++ b/packages/registry/lib/types.ts @@ -0,0 +1,156 @@ +import { z } from "zod/v3"; +import { + type RegistryItem as ShadcnRegistryItem, + registryItemSchema, +} from "shadcn/registry"; + +const registryTypeSchema = z + .enum([ + "registry:lib", + "registry:block", + "registry:component", + "registry:ui", + "registry:hook", + "registry:page", + "registry:file", + "registry:theme", + "registry:style", + "registry:item", + "registry:example", + "registry:internal", + ]) + .describe( + "The type property is used to specify the type of your registry item. This is used to determine the type and target path of the item when resolved for a project.", + ); + +// Defines a single file within a template +export const templateFileSchema = z.discriminatedUnion("type", [ + z.object({ + // The name of the file within this template directory + sourceFileName: z.string(), + // The destination path in a consumer project, relative to project root + destinationPath: z.string().optional(), + type: registryTypeSchema.extract(["registry:file", "registry:page"]), + }), + z.object({ + sourceFileName: z.string(), + destinationPath: z.string().optional(), + type: registryTypeSchema.exclude(["registry:file", "registry:page"]), + }), +]); + +export const postInstallStepsSchema = z.discriminatedUnion("action", [ + z.object({ + action: z.literal("package.json script"), + _from: z.string().optional(), + data: z.object({ + scriptName: z.string(), + scriptCommand: z.string(), + }), + }), + z.object({ + action: z.literal("wrap provider"), + _from: z.string().optional(), + data: z.object({ + providerOpenTag: z + .string() + .describe( + "The opening tag to use for the provider. This is used to wrap the provider in the correct location.", + ), + providerCloseTag: z + .string() + .describe("The closing tag to use for the provider."), + imports: z + .array( + z.object({ + moduleSpecifier: z + .string() + .describe( + "The module to import from (e.g., '@/config/query-provider')", + ), + defaultImport: z + .string() + .optional() + .describe("The default import name (e.g., 'QueryProvider')"), + namedImports: z + .array(z.string()) + .optional() + .describe( + "Array of named imports (e.g., ['QueryProvider', 'useQuery'])", + ), + }), + ) + .describe( + "Array of import configurations for the provider. Each import should have either defaultImport or namedImports.", + ), + parentTag: z + .array(z.string()) + .optional() + .describe( + "If set, the provider will attempt to go inside of the parent tag. The first found tag will be used as the parent. If not set or none of the tags are found, the provider will be wrapped at the very top level.", + ), + }), + }), +]); + +export type PostInstallStep = z.infer; + +const categorySchema = z.enum([ + "component", + "page", + "utility", + "hook", + "email", +]); + +export const frameworkSchema = z.enum(["next-pages", "next-app", "manual"]); + +const sharedMetadataSchema = registryItemSchema + .omit({ name: true, type: true, files: true }) + .extend({ + title: z.string(), + description: z.string().optional(), + category: categorySchema, + files: z.array(templateFileSchema), + registryType: registryTypeSchema, + postInstall: z + .array(postInstallStepsSchema) + .optional() + .describe( + "Steps that should be run by the ProofKit CLI after shadcn CLI is done", + ), + minimumProofKitVersion: z + .string() + .describe("The minimum version of ProofKit required to use this template") + .optional(), + allowedFrameworks: z.array(frameworkSchema).optional(), + }); + +// Defines the metadata for a single template (_meta.ts) +export const templateMetadataSchema = z.discriminatedUnion("type", [ + sharedMetadataSchema.extend({ + type: z.literal("static"), + }), + sharedMetadataSchema.extend({ + type: z.literal("dynamic"), + schema: z.unknown(), // a JSON schema for the required values to be passed as query(?) params + }), +]); + +export type TemplateFile = z.infer; +export type TemplateMetadata = z.infer; + +export const registryIndexSchema = sharedMetadataSchema + .pick({ title: true, category: true, description: true }) + .extend({ type: z.enum(["static", "dynamic"]) }) + .array(); + +// Adapt shadcn RegistryItem: require `content` in files and allow both single and array forms + +export type ShadcnFilesUnion = Required< + Exclude[number] +>[]; + +export type RegistryItem = Omit & { + files: ShadcnFilesUnion; +}; diff --git a/packages/registry/lib/utils.ts b/packages/registry/lib/utils.ts new file mode 100644 index 00000000..f426e73c --- /dev/null +++ b/packages/registry/lib/utils.ts @@ -0,0 +1,207 @@ +import { promises as fs } from "fs"; +import fsSync from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; +import createJiti from "jiti"; +import type { + RegistryItem, + ShadcnFilesUnion, + TemplateMetadata, +} from "./types.js"; + +// Find the templates path relative to this module +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const templatesPath = path.resolve(__dirname, "../templates"); + +export type RegistryIndexItem = { + name: string; + type: TemplateMetadata["type"]; + category: TemplateMetadata["category"]; + // files: string[]; // destination paths +}; + +/** + * Scans the templates directory and returns all template directories with _meta.ts files + */ +function getTemplateDirs(root: string, prefix = ""): string[] { + const entries = fsSync.readdirSync(root, { withFileTypes: true }); + const result: string[] = []; + for (const entry of entries) { + if (!entry.isDirectory()) continue; + const dirPath = path.join(root, entry.name); + const rel = prefix ? `${prefix}/${entry.name}` : entry.name; + const files = fsSync.readdirSync(dirPath); + // Look for either _meta.ts (source) or _meta.js (compiled) + if (files.includes("_meta.ts") || files.includes("_meta.js")) { + result.push(rel); + } + // Recurse for nested templates + const nested = getTemplateDirs(dirPath, rel); + result.push(...nested); + } + return result; +} + +/** + * Loads template metadata using jiti + */ +function loadTemplateMeta(templatePath: string) { + const jiti = createJiti(__filename, { + interopDefault: true, + requireCache: false, + }); + + // Try _meta.ts first (source), then _meta.js (compiled) + const templateDir = path.join(templatesPath, templatePath); + const files = fsSync.readdirSync(templateDir); + const metaFile = files.includes("_meta.ts") ? "_meta.ts" : "_meta.js"; + const metaPath = path.join(templateDir, metaFile); + + const metaModule = jiti(metaPath); + const meta: TemplateMetadata = + metaModule.meta || metaModule.default?.meta || metaModule.default; + + if (!meta) { + throw new Error( + `Template ${templatePath}: ${metaFile} must export a 'meta' object`, + ); + } + + return { + ...meta, + registryPath: templatePath, + }; +} + +export async function getRegistryIndex(): Promise { + const templateDirs = getTemplateDirs(templatesPath); + + const index = templateDirs.map((templatePath) => { + const meta = loadTemplateMeta(templatePath); + return { + ...meta, + name: templatePath, // Use the path as the name + }; + }); + + return index; +} + +function getNormalizedPath(namePath: string): string { + return namePath.replace(/^\/+|\/+$/g, ""); +} + +export function getOtherProofKitDependencies(meta: TemplateMetadata): string[] { + return (meta.registryDependencies ?? []) + .filter((x) => x.startsWith("{proofkit}/r/")) + .map((x) => x.replace("{proofkit}/r/", "")) + .map(getNormalizedPath); +} + +async function getComponentMetaInternal( + namePath: string, + visited: Set = new Set(), +): Promise { + const normalized = getNormalizedPath(namePath); + + // Check for circular dependency + if (visited.has(normalized)) { + // Return a minimal metadata to avoid circular processing + // but don't throw an error as circular deps might be valid + const meta = loadTemplateMeta(normalized); + return { + ...meta, + postInstall: meta.postInstall ?? [], + }; + } + + const templateDirs = getTemplateDirs(templatesPath); + if (!templateDirs.includes(normalized)) { + throw new Error(`Template "${normalized}" not found`); + } + + // Add to visited set before processing dependencies + visited.add(normalized); + + const meta = loadTemplateMeta(normalized); + + const otherProofKitDependencies = getOtherProofKitDependencies(meta).filter( + (name) => !visited.has(name), // Skip already visited dependencies + ); + + const otherProofKitDependenciesMeta = await Promise.all( + otherProofKitDependencies.map(async (name) => { + const meta = await getComponentMetaInternal(name, visited); + return { + ...meta, + name, + }; + }), + ); + + return { + ...meta, + postInstall: [ + ...(meta.postInstall ?? []), + ...otherProofKitDependenciesMeta.flatMap((x) => + (x.postInstall ?? []).map((step) => ({ + ...step, + _from: x.name, + })), + ), + ], + }; +} + +export async function getComponentMeta( + namePath: string, +): Promise { + return getComponentMetaInternal(namePath, new Set()); +} + +export async function getStaticComponent( + namePath: string, +): Promise { + const normalized = getNormalizedPath(namePath); + const meta = await getComponentMeta(namePath); + + if (meta.type !== "static") { + throw new Error(`Template "${normalized}" is not a static template`); + } + + const files: ShadcnFilesUnion = await Promise.all( + meta.files.map(async (file) => { + const contentPath = path.join( + templatesPath, + normalized, + file.sourceFileName, + ); + const content = await fs.readFile(contentPath, "utf-8"); + + const shadcnFile: ShadcnFilesUnion[number] = + file.type === "registry:file" || file.type === "registry:page" + ? { + path: file.sourceFileName, + type: file.type, + content, + target: file.destinationPath ?? file.sourceFileName, + } + : { + path: file.sourceFileName, + type: file.type, + content, + target: file.destinationPath! + }; + + return shadcnFile; + }), + ); + + return { + ...meta, + name: normalized, + type: meta.registryType, + files, + }; +} diff --git a/packages/registry/lib/validator.test.ts b/packages/registry/lib/validator.test.ts new file mode 100644 index 00000000..db17ad80 --- /dev/null +++ b/packages/registry/lib/validator.test.ts @@ -0,0 +1,359 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; +import { + validateTemplateMetadata, + isValidRegistryTemplate, + type ValidationContext, +} from "./validator.js"; +import fs from "fs"; +import path from "path"; + +// Mock fs module +vi.mock("fs"); +const mockedFs = vi.mocked(fs); + +describe("validator", () => { + let mockContext: ValidationContext; + + beforeEach(() => { + vi.clearAllMocks(); + mockContext = { + templatesPath: "/mock/templates", + templateName: "test-template", + templateDir: "/mock/templates/test-template", + }; + }); + + describe("isValidRegistryTemplate", () => { + it("should return true when template meta file exists", () => { + mockedFs.existsSync.mockReturnValue(true); + + const result = isValidRegistryTemplate( + "email/generic", + "/mock/templates", + ); + + expect(result).toBe(true); + expect(mockedFs.existsSync).toHaveBeenCalledWith( + "/mock/templates/email/generic/_meta.ts", + ); + }); + + it("should return false when template meta file does not exist", () => { + mockedFs.existsSync.mockReturnValue(false); + + const result = isValidRegistryTemplate("nonexistent", "/mock/templates"); + + expect(result).toBe(false); + expect(mockedFs.existsSync).toHaveBeenCalledWith( + "/mock/templates/nonexistent/_meta.ts", + ); + }); + }); + + describe("validateTemplateMetadata", () => { + beforeEach(() => { + // Mock readdir to return empty files by default + mockedFs.readdirSync.mockReturnValue([] as any); + }); + + it("should validate a basic valid template", () => { + const validMeta = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [], + }; + + expect(() => + validateTemplateMetadata(validMeta, mockContext), + ).not.toThrow(); + }); + + it("should throw error for invalid metadata structure", () => { + const invalidMeta = { + type: "invalid-type", + title: "Test", + }; + + expect(() => validateTemplateMetadata(invalidMeta, mockContext)).toThrow( + /Invalid metadata structure/, + ); + }); + + it("should throw error for missing required fields", () => { + const incompleteMeta = { + type: "static", + title: "Test", + // missing description, category, registryType + }; + + expect(() => + validateTemplateMetadata(incompleteMeta, mockContext), + ).toThrow(/Invalid metadata structure/); + }); + + it("should validate files exist when declared", () => { + const metaWithFiles = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [ + { + sourceFileName: "component.tsx", + destinationPath: "components/component.tsx", + type: "registry:component", + }, + ], + }; + + // Mock that the file exists + mockedFs.readdirSync.mockReturnValue([ + "component.tsx", + "_meta.ts", + ] as any); + + expect(() => + validateTemplateMetadata(metaWithFiles, mockContext), + ).not.toThrow(); + }); + + it("should throw error when declared file does not exist", () => { + const metaWithMissingFile = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [ + { + sourceFileName: "missing.tsx", + destinationPath: "components/missing.tsx", + type: "registry:component", + }, + ], + }; + + // Mock that the file doesn't exist + mockedFs.readdirSync.mockReturnValue(["_meta.ts"] as any); + + expect(() => + validateTemplateMetadata(metaWithMissingFile, mockContext), + ).toThrow(/Declared file 'missing.tsx' does not exist/); + }); + + it("should throw error when declared file does not exist (caught first)", () => { + const metaWithFiles = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [ + { + sourceFileName: "component.tsx", + destinationPath: "components/component.tsx", + type: "registry:component", + }, + ], + }; + + // Mock empty directory (only _meta.ts) - this will trigger "file does not exist" first + mockedFs.readdirSync.mockReturnValue(["_meta.ts"] as any); + + expect(() => + validateTemplateMetadata(metaWithFiles, mockContext), + ).toThrow(/Declared file 'component.tsx' does not exist/); + }); + + it("should allow templates with no files (dependency-only templates)", () => { + const dependencyOnlyMeta = { + type: "static", + title: "Dependency Template", + description: "A template that only adds dependencies", + category: "utility", + registryType: "registry:lib", + files: [], + dependencies: ["react", "react-dom"], + }; + + // Mock empty directory + mockedFs.readdirSync.mockReturnValue(["_meta.ts"] as any); + + expect(() => + validateTemplateMetadata(dependencyOnlyMeta, mockContext), + ).not.toThrow(); + }); + + it("should validate proofkitDependencies exist", () => { + const metaWithProofkitDeps = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [], + proofkitDependencies: ["react-email"], + }; + + // Mock that react-email template exists + mockedFs.existsSync.mockImplementation((filePath) => { + return filePath === "/mock/templates/react-email/_meta.ts"; + }); + + expect(() => + validateTemplateMetadata(metaWithProofkitDeps, mockContext), + ).not.toThrow(); + }); + + it("should throw error for invalid proofkitDependencies", () => { + const metaWithInvalidDeps = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [], + proofkitDependencies: ["nonexistent-template"], + }; + + // Mock that template doesn't exist + mockedFs.existsSync.mockReturnValue(false); + + expect(() => + validateTemplateMetadata(metaWithInvalidDeps, mockContext), + ).toThrow( + /Invalid proofkitDependencies reference 'nonexistent-template'/, + ); + }); + + it("should validate proofkit registryDependencies", () => { + const metaWithRegistryDeps = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [], + registryDependencies: [ + "{proofkit}/r/email/generic", + "external-component", // non-proofkit, should be ignored + ], + }; + + // Mock that email/generic template exists + mockedFs.existsSync.mockImplementation((filePath) => { + return filePath === "/mock/templates/email/generic/_meta.ts"; + }); + + expect(() => + validateTemplateMetadata(metaWithRegistryDeps, mockContext), + ).not.toThrow(); + }); + + it("should throw error for invalid proofkit registryDependencies", () => { + const metaWithInvalidRegistryDeps = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [], + registryDependencies: ["{proofkit}/r/email/nonexistent"], + }; + + // Mock that template doesn't exist + mockedFs.existsSync.mockReturnValue(false); + + expect(() => + validateTemplateMetadata(metaWithInvalidRegistryDeps, mockContext), + ).toThrow( + /Invalid registryDependencies reference '{proofkit}\/r\/email\/nonexistent'/, + ); + }); + + it("should ignore non-proofkit registryDependencies", () => { + const metaWithMixedDeps = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType: "registry:lib", + files: [], + registryDependencies: [ + "shadcn/ui/button", // external, should be ignored + "some-other-registry/component", // external, should be ignored + ], + }; + + expect(() => + validateTemplateMetadata(metaWithMixedDeps, mockContext), + ).not.toThrow(); + }); + + it("should validate dynamic templates", () => { + const dynamicMeta = { + type: "dynamic", + title: "Dynamic Template", + description: "A dynamic template", + category: "component", + registryType: "registry:component", + files: [], + schema: { + type: "object", + properties: { + name: { type: "string" }, + }, + }, + }; + + expect(() => + validateTemplateMetadata(dynamicMeta, mockContext), + ).not.toThrow(); + }); + + it("should validate all category types", () => { + const categories = ["component", "page", "utility", "hook", "email"]; + + categories.forEach((category) => { + const meta = { + type: "static", + title: "Test Template", + description: "A test template", + category, + registryType: "registry:lib", + files: [], + }; + + expect(() => validateTemplateMetadata(meta, mockContext)).not.toThrow(); + }); + }); + + it("should validate all registryType values", () => { + const registryTypes = [ + "registry:lib", + "registry:component", + "registry:hook", + "registry:ui", + "registry:file", + "registry:page", + ]; + + registryTypes.forEach((registryType) => { + const meta = { + type: "static", + title: "Test Template", + description: "A test template", + category: "utility", + registryType, + files: [], + }; + + expect(() => validateTemplateMetadata(meta, mockContext)).not.toThrow(); + }); + }); + }); +}); diff --git a/packages/registry/lib/validator.ts b/packages/registry/lib/validator.ts new file mode 100644 index 00000000..ff7242c5 --- /dev/null +++ b/packages/registry/lib/validator.ts @@ -0,0 +1,162 @@ +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; +import createJiti from "jiti"; +import { templateMetadataSchema, type TemplateMetadata } from "./types.js"; + +export interface ValidationContext { + templatesPath: string; + templateName: string; + templateDir: string; +} + +/** + * Check if a registry template path is valid + */ +export function isValidRegistryTemplate( + templatePath: string, + templatesPath: string, +): boolean { + const fullTemplatePath = path.join(templatesPath, templatePath); + const metaPath = path.join(fullTemplatePath, "_meta.ts"); + return fs.existsSync(metaPath); +} + +/** + * Validate a single template metadata object + */ +export function validateTemplateMetadata( + meta: unknown, + context: ValidationContext, +): void { + // Validate the metadata structure using zod schema + const validationResult = templateMetadataSchema.safeParse(meta); + if (!validationResult.success) { + throw new Error( + `Template ${context.templateName}: Invalid metadata structure:\n${validationResult.error.issues + .map((issue) => ` - ${issue.path.join(".")}: ${issue.message}`) + .join("\n")}`, + ); + } + + const validatedMeta = validationResult.data; + + // Validate that declared files actually exist + const declaredFiles = validatedMeta.files.map((f) => f.sourceFileName); + + for (const declaredFile of declaredFiles) { + const filePath = path.resolve(context.templateDir, declaredFile); + if (!fs.existsSync(filePath)) { + throw new Error( + `Template ${context.templateName}: Declared file '${declaredFile}' does not exist at path '${filePath}'`, + ); + } + } + + // Check if template has content files when it declares files + // Templates with empty files array in metadata are valid (e.g., dependency-only templates) + const actualFiles = fs + .readdirSync(context.templateDir) + .filter((f) => f !== "_meta.ts"); + if (declaredFiles.length > 0 && actualFiles.length === 0) { + throw new Error( + `Template ${context.templateName} declares files but has no content files`, + ); + } + + // Validate registryDependencies references (only ProofKit registry references) + if (validatedMeta.registryDependencies) { + for (const registryRef of validatedMeta.registryDependencies) { + if (registryRef.startsWith("{proofkit}/r/")) { + const templatePath = registryRef.replace("{proofkit}/r/", ""); + if (!isValidRegistryTemplate(templatePath, context.templatesPath)) { + throw new Error( + `Template ${context.templateName}: Invalid registryDependencies reference '${registryRef}' - template does not exist in the registry`, + ); + } + } + // Non-ProofKit registry dependencies are not validated + } + } +} + +function getTemplateDirs(root: string, prefix = ""): string[] { + const entries = fs.readdirSync(root, { withFileTypes: true }); + const result: string[] = []; + for (const entry of entries) { + if (!entry.isDirectory()) continue; + const dirPath = path.join(root, entry.name); + const rel = prefix ? `${prefix}/${entry.name}` : entry.name; + const files = fs.readdirSync(dirPath); + if (files.includes("_meta.ts")) { + result.push(rel); + } + // Recurse for nested templates + const nested = getTemplateDirs(dirPath, rel); + result.push(...nested); + } + return result; +} + +export function validateRegistry(): void { + // Find the templates path relative to this module + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + const templatesPath = path.resolve(__dirname, "../templates"); + const jiti = createJiti(__filename, { + interopDefault: true, + requireCache: false, + }); + + try { + const templateDirs = getTemplateDirs(templatesPath); + + for (const rel of templateDirs) { + const metaPath = path.join(templatesPath, rel, "_meta.ts"); + + // Check if meta file exists + if (!fs.existsSync(metaPath)) { + throw new Error(`Template ${rel} is missing _meta.ts file`); + } + + // Load and validate the meta file using jiti + try { + const metaModule = jiti(metaPath); + const meta = + metaModule.meta || metaModule.default?.meta || metaModule.default; + + if (!meta) { + throw new Error( + `Template ${rel}: _meta.ts must export a 'meta' object`, + ); + } + + // Use the refactored validation function + const context: ValidationContext = { + templatesPath, + templateName: rel, + templateDir: path.join(templatesPath, rel), + }; + + validateTemplateMetadata(meta, context); + } catch (loadError) { + if ( + loadError instanceof Error && + loadError.message.includes("Template") + ) { + throw loadError; // Re-throw our custom errors + } + throw new Error( + `Template ${rel}: Failed to load _meta.ts - ${loadError}`, + ); + } + } + + console.log( + `✅ Registry validation passed for ${templateDirs.length} templates`, + ); + } catch (err) { + console.error("Registry validation failed:", err); + throw err; // stop the build + } +} diff --git a/packages/registry/package.json b/packages/registry/package.json new file mode 100644 index 00000000..b42aadd0 --- /dev/null +++ b/packages/registry/package.json @@ -0,0 +1,55 @@ +{ + "name": "@proofkit/registry", + "version": "1.0.0", + "private": true, + "description": "ProofKit registry containing types and templates", + "type": "module", + "main": "./dist/lib/index.js", + "types": "./dist/lib/index.d.ts", + "exports": { + ".": { + "types": "./dist/lib/index.d.ts", + "import": "./dist/lib/index.js", + "default": "./dist/lib/index.js" + }, + "./lib/*": { + "types": "./dist/lib/*.d.ts", + "import": "./dist/lib/*.js", + "default": "./dist/lib/*.js" + }, + "./templates/*": "./templates/*" + }, + "files": [ + "dist", + "templates" + ], + "scripts": { + "build": "tsdown && tsc --emitDeclarationOnly && publint --strict", + "dev": "pnpm run build && chokidar ./lib/**/* ./templates/**/* -c \"tsdown && tsc --emitDeclarationOnly\" --silent", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage" + }, + "keywords": [ + "proofkit", + "registry", + "templates" + ], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.14.0", + "devDependencies": { + "@vitest/coverage-v8": "^2.1.8", + "chokidar-cli": "^3.0.0", + "concurrently": "^8.2.2", + "publint": "^0.3.12", + "tsdown": "^0.3.1", + "typescript": "^5.9.2", + "vitest": "^2.1.8" + }, + "dependencies": { + "jiti": "^1.21.7", + "shadcn": "^2.10.0", + "zod": "3.25.64" + } +} diff --git a/packages/registry/templates/better-auth/AuthUIProvider.tsx b/packages/registry/templates/better-auth/AuthUIProvider.tsx new file mode 100644 index 00000000..71169ce2 --- /dev/null +++ b/packages/registry/templates/better-auth/AuthUIProvider.tsx @@ -0,0 +1,25 @@ +"use client"; + +import { AuthUIProvider as BetterAuthUIProvider } from "@daveyplate/better-auth-ui"; +import { authClient } from "@/registry/lib/auth-client"; +import { useRouter } from "next/navigation"; +import Link from "next/link"; + +export function AuthUIProvider({ children }: { children: React.ReactNode }) { + const router = useRouter(); + + return ( + { + // Clear router cache (protected routes) + router.refresh(); + }} + Link={Link} + > + {children} + + ); +} diff --git a/packages/registry/templates/better-auth/_meta.ts b/packages/registry/templates/better-auth/_meta.ts new file mode 100644 index 00000000..3cbe5d71 --- /dev/null +++ b/packages/registry/templates/better-auth/_meta.ts @@ -0,0 +1,93 @@ +import type { TemplateMetadata } from "@/lib/types"; + +export const meta: TemplateMetadata = { + type: "static", + title: "BetterAuth", + description: "A better auth library for Next.js", + category: "utility", + registryType: "registry:block", + dependencies: [ + "better-auth", + "@daveyplate/better-auth-ui", + "@proofkit/better-auth", + ], + registryDependencies: [ + "{proofkit}/r/utils/t3-env", + "{proofkit}/r/react-email", + "{proofkit}/r/email/generic", + ], + css: { '@source "../../../node_modules/@daveyplate/better-auth-ui"': {} }, + files: [ + { + sourceFileName: "main-layout.tsx", + destinationPath: "src/app/(main)/layout.tsx", + type: "registry:file", + }, + { + sourceFileName: "AuthUIProvider.tsx", + destinationPath: "src/config/AuthUIProvider.tsx", + type: "registry:file", + }, + { + sourceFileName: "auth-api-route.ts", + destinationPath: "src/app/api/auth/[...all]/route.ts", + type: "registry:file", + }, + { + sourceFileName: "auth.ts", + type: "registry:lib", + }, + { + sourceFileName: "auth-client.ts", + type: "registry:lib", + }, + { + sourceFileName: "page.tsx", + destinationPath: "src/app/auth/[pathname]/page.tsx", + type: "registry:file", + }, + { + sourceFileName: "auth-layout.tsx", + destinationPath: "src/app/auth/[pathname]/layout.tsx", + type: "registry:file", + }, + ], + postInstall: [ + { + action: "package.json script", + data: { + scriptName: "better-auth:migrate", + scriptCommand: "pnpm dlx @proofkit/better-auth@latest migrate", + }, + }, + { + action: "wrap provider", + data: { + imports: [ + { + moduleSpecifier: "@daveyplate/better-auth-ui", + namedImports: ["AuthUIProvider"], + }, + { + moduleSpecifier: "@/auth-client", + namedImports: ["authClient"], + }, + ], + providerOpenTag: "", + providerCloseTag: "", + parentTag: ["ThemeProvider"], + }, + }, + ], +}; + +/** + * add to css + * @source "../../../node_modules/@daveyplate/better-auth-ui"; + * + * package.json script + * "better-auth:migrate": "pnpm dlx @proofkit/better-auth@latest migrate" + * + * Wrap the app in AuthUIProvider + * + */ diff --git a/packages/registry/templates/better-auth/auth-api-route.ts b/packages/registry/templates/better-auth/auth-api-route.ts new file mode 100644 index 00000000..366de395 --- /dev/null +++ b/packages/registry/templates/better-auth/auth-api-route.ts @@ -0,0 +1,4 @@ +import { auth } from "@/registry/lib/auth"; +import { toNextJsHandler } from "better-auth/next-js"; + +export const { GET, POST } = toNextJsHandler(auth.handler); diff --git a/packages/registry/templates/better-auth/auth-client.ts b/packages/registry/templates/better-auth/auth-client.ts new file mode 100644 index 00000000..b64de4a3 --- /dev/null +++ b/packages/registry/templates/better-auth/auth-client.ts @@ -0,0 +1,7 @@ +import { createAuthClient } from "better-auth/react"; + +export const authClient = createAuthClient({ + plugins: [], +}); + +export const { signIn, signUp, useSession } = authClient; diff --git a/packages/registry/templates/better-auth/auth-layout.tsx b/packages/registry/templates/better-auth/auth-layout.tsx new file mode 100644 index 00000000..ce8dffec --- /dev/null +++ b/packages/registry/templates/better-auth/auth-layout.tsx @@ -0,0 +1,11 @@ +export default function AuthLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+ {children} +
+ ); +} diff --git a/packages/registry/templates/better-auth/auth.ts b/packages/registry/templates/better-auth/auth.ts new file mode 100644 index 00000000..5174797f --- /dev/null +++ b/packages/registry/templates/better-auth/auth.ts @@ -0,0 +1,62 @@ +import { FileMakerAdapter } from "@proofkit/better-auth"; +import { betterAuth } from "better-auth"; +import { nextCookies } from "better-auth/next-js"; +import { env } from "@/registry/lib/env"; +import { render } from "@react-email/components"; +import { GenericEmail } from "@/emails/generic"; + +export const auth = betterAuth({ + // database + database: FileMakerAdapter({ + debugLogs: true, + odata: { + serverUrl: env.FM_SERVER, + auth: { apiKey: env.OTTO_API_KEY }, + database: env.FM_DATABASE, + }, + }), + + emailAndPassword: { + enabled: true, + autoSignIn: true, // Automatically sign in the user after sign up + sendResetPassword: async ({ url, user }) => { + // this is the HTML body of the email to be send + const body = await render( + GenericEmail({ + title: "Reset Your Password", + description: "Click the link to reset your password", + ctaText: "Reset Password", + ctaHref: url, + footer: + "If you did not request a password reset, please ignore this email.", + }), + ); + const subject = "Reset Your Password"; + + // TODO: Customize this function to actually send the email to your users + // Learn more: https://proofkit.dev/auth/better-auth + console.warn( + "TODO: Customize this function to actually send to your users", + ); + console.log( + `To ${user.email}: Click the link to reset your password: ${url}`, + ); + }, + + // if set to true, you'll have to create users in FileMaker first + disableSignUp: false, + }, + + // --- CUSTOMIZE TABLE NAMES HERE --- + // Account table: Stores OAuth tokens and/or hashed passwords + account: { modelName: "account" }, + // User table: Stores user data + user: { modelName: "user" }, + // Session table: The record that determines if a user is logged in + session: { modelName: "session" }, + // Verification table: Stores email verification and password reset tokens + verification: { modelName: "verification" }, + + // --- PLUGINS --- + plugins: [nextCookies()], +}); diff --git a/packages/registry/templates/better-auth/main-layout.tsx b/packages/registry/templates/better-auth/main-layout.tsx new file mode 100644 index 00000000..19ad63d5 --- /dev/null +++ b/packages/registry/templates/better-auth/main-layout.tsx @@ -0,0 +1,15 @@ +import AppShell from "@/components/AppShell/internal/AppShell"; +import { RedirectToSignIn, SignedIn } from "@daveyplate/better-auth-ui"; +import React from "react"; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + <> + + + + {children} + + + ); +} diff --git a/packages/registry/templates/better-auth/page.tsx b/packages/registry/templates/better-auth/page.tsx new file mode 100644 index 00000000..539851ba --- /dev/null +++ b/packages/registry/templates/better-auth/page.tsx @@ -0,0 +1,16 @@ +import { AuthView } from "@daveyplate/better-auth-ui"; +import { authViewPaths } from "@daveyplate/better-auth-ui/server"; + +export function generateStaticParams() { + return Object.values(authViewPaths).map((pathname) => ({ pathname })); +} + +export default async function AuthPage({ + params, +}: { + params: Promise<{ pathname: string }>; +}) { + const { pathname } = await params; + + return ; +} diff --git a/apps/docs/src/registry/templates/mode-toggle/_meta.ts b/packages/registry/templates/components/mode-toggle/_meta.ts similarity index 81% rename from apps/docs/src/registry/templates/mode-toggle/_meta.ts rename to packages/registry/templates/components/mode-toggle/_meta.ts index d85c8c8a..f7c1fbdd 100644 --- a/apps/docs/src/registry/templates/mode-toggle/_meta.ts +++ b/packages/registry/templates/components/mode-toggle/_meta.ts @@ -1,11 +1,11 @@ -import type { TemplateMetadata } from "../../lib/types"; +import type { TemplateMetadata } from "@/lib/types"; export const meta: TemplateMetadata = { type: "static", title: "Mode Toggle", description: "A toggle button to switch between light and dark mode.", - categories: ["component"], + category: "component", registryType: "registry:component", dependencies: ["next-themes"], diff --git a/apps/docs/src/registry/templates/mode-toggle/mode-toggle.tsx b/packages/registry/templates/components/mode-toggle/mode-toggle.tsx similarity index 100% rename from apps/docs/src/registry/templates/mode-toggle/mode-toggle.tsx rename to packages/registry/templates/components/mode-toggle/mode-toggle.tsx diff --git a/packages/registry/templates/email/auth-code/_meta.ts b/packages/registry/templates/email/auth-code/_meta.ts new file mode 100644 index 00000000..3a94e6ff --- /dev/null +++ b/packages/registry/templates/email/auth-code/_meta.ts @@ -0,0 +1,21 @@ +import type { TemplateMetadata } from "@/lib/types"; + +export const meta: TemplateMetadata = { + type: "static", + title: "Auth Code Email", + + description: + "A email template for sending a one-time code to the user's email address.", + category: "email", + + registryType: "registry:file", + dependencies: ["@react-email/components"], + + files: [ + { + sourceFileName: "auth-code.tsx", + type: "registry:file", + destinationPath: "src/emails/auth-code.tsx", + }, + ], +}; diff --git a/packages/registry/templates/email/auth-code/auth-code.tsx b/packages/registry/templates/email/auth-code/auth-code.tsx new file mode 100644 index 00000000..a1a8d775 --- /dev/null +++ b/packages/registry/templates/email/auth-code/auth-code.tsx @@ -0,0 +1,156 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Section, + Text, +} from "@react-email/components"; +import * as React from "react"; + +interface AuthCodeEmailProps { + validationCode: string; + type: "verification" | "password-reset"; +} + +export const AuthCodeEmail = ({ validationCode, type }: AuthCodeEmailProps) => ( + + + + + ProofKit + + {type === "verification" + ? "Verify Your Email" + : "Reset Your Password"} + + + Enter the following code to{" "} + {type === "verification" + ? "verify your email" + : "reset your password"} + +
+ {validationCode} +
+ + If you did not request this code, you can ignore this email. + +
+ + +); + +AuthCodeEmail.PreviewProps = { + validationCode: "D7CU4GOV", + type: "verification", +} as AuthCodeEmailProps; + +export default AuthCodeEmail; + +const main = { + backgroundColor: "#ffffff", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", +}; + +const container = { + backgroundColor: "#ffffff", + border: "1px solid #eee", + borderRadius: "5px", + boxShadow: "0 5px 10px rgba(20,50,70,.2)", + marginTop: "20px", + maxWidth: "360px", + margin: "0 auto", + padding: "68px 0 130px", +}; + +const logo: React.CSSProperties = { + margin: "0 auto", +}; + +const tertiary = { + color: "#0a85ea", + fontSize: "11px", + fontWeight: 700, + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + height: "16px", + letterSpacing: "0", + lineHeight: "16px", + margin: "16px 8px 8px 8px", + textTransform: "uppercase" as const, + textAlign: "center" as const, +}; + +const secondary = { + color: "#000", + display: "inline-block", + fontFamily: "HelveticaNeue-Medium,Helvetica,Arial,sans-serif", + fontSize: "20px", + fontWeight: 500, + lineHeight: "24px", + marginBottom: "0", + marginTop: "0", + textAlign: "center" as const, + padding: "0 40px", +}; + +const codeContainer = { + background: "rgba(0,0,0,.05)", + borderRadius: "4px", + margin: "16px auto 14px", + verticalAlign: "middle", + width: "280px", +}; + +const code = { + color: "#000", + display: "inline-block", + fontFamily: "HelveticaNeue-Bold", + fontSize: "32px", + fontWeight: 700, + letterSpacing: "6px", + lineHeight: "40px", + paddingBottom: "8px", + paddingTop: "8px", + margin: "0 auto", + width: "100%", + textAlign: "center" as const, +}; + +const paragraph = { + color: "#444", + fontSize: "15px", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + letterSpacing: "0", + lineHeight: "23px", + padding: "0 40px", + margin: "0", + textAlign: "center" as const, +}; + +const link = { + color: "#444", + textDecoration: "underline", +}; + +const footer = { + color: "#000", + fontSize: "12px", + fontWeight: 800, + letterSpacing: "0", + lineHeight: "23px", + margin: "0", + marginTop: "20px", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + textAlign: "center" as const, + textTransform: "uppercase" as const, +}; diff --git a/packages/registry/templates/email/generic/_meta.ts b/packages/registry/templates/email/generic/_meta.ts new file mode 100644 index 00000000..a3d443a7 --- /dev/null +++ b/packages/registry/templates/email/generic/_meta.ts @@ -0,0 +1,21 @@ +import type { TemplateMetadata } from "@/lib/types"; + +export const meta: TemplateMetadata = { + type: "static", + title: "Generic Email Template", + + description: + "A generic email template with optional title, description, CTA, and footer.", + category: "email", + + registryType: "registry:file", + dependencies: ["@react-email/components"], + + files: [ + { + sourceFileName: "generic.tsx", + type: "registry:file", + destinationPath: "src/emails/generic.tsx", + }, + ], +}; diff --git a/packages/registry/templates/email/generic/generic.tsx b/packages/registry/templates/email/generic/generic.tsx new file mode 100644 index 00000000..703115ea --- /dev/null +++ b/packages/registry/templates/email/generic/generic.tsx @@ -0,0 +1,136 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Img, + Section, + Text, +} from "@react-email/components"; +import * as React from "react"; + +export interface GenericEmailProps { + title?: string; + description?: string; + ctaText?: string; + ctaHref?: string; + footer?: string; +} + +export const GenericEmail = ({ + title, + description, + ctaText, + ctaHref, + footer, +}: GenericEmailProps) => ( + + + + + ProofKit + + {title ? {title} : null} + + {description ? ( + {description} + ) : null} + + {ctaText && ctaHref ? ( +
+ +
+ ) : null} + + {(title || description || (ctaText && ctaHref)) && ( +
+ )} + + {footer ? {footer} : null} +
+ + +); + +GenericEmail.PreviewProps = { + title: "Welcome to ProofKit", + description: + "Thanks for trying ProofKit. This is a sample email template you can customize.", + ctaText: "Get Started", + ctaHref: "https://proofkit.dev", + footer: "You received this email because you signed up for updates.", +} as GenericEmailProps; + +export default GenericEmail; + +const styles = { + main: { + backgroundColor: "#ffffff", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + }, + container: { + backgroundColor: "#ffffff", + border: "1px solid #eee", + borderRadius: "5px", + boxShadow: "0 5px 10px rgba(20,50,70,.2)", + marginTop: "20px", + maxWidth: "520px", + margin: "0 auto", + padding: "48px 32px 36px", + } as React.CSSProperties, + logo: { + margin: "0 auto 12px", + display: "block", + } as React.CSSProperties, + title: { + color: "#111827", + fontSize: "22px", + fontWeight: 600, + lineHeight: "28px", + margin: "8px 0 4px", + textAlign: "center" as const, + }, + description: { + color: "#374151", + fontSize: "15px", + lineHeight: "22px", + margin: "8px 0 0", + textAlign: "center" as const, + }, + ctaSection: { + textAlign: "center" as const, + marginTop: "20px", + }, + ctaButton: { + backgroundColor: "#0a85ea", + color: "#fff", + fontSize: "14px", + fontWeight: 600, + lineHeight: "20px", + textDecoration: "none", + display: "inline-block", + padding: "10px 16px", + borderRadius: "6px", + } as React.CSSProperties, + hr: { + borderColor: "#e5e7eb", + margin: "24px 0 12px", + }, + footer: { + color: "#6b7280", + fontSize: "12px", + lineHeight: "18px", + textAlign: "center" as const, + }, +}; diff --git a/packages/registry/templates/react-email/_meta.ts b/packages/registry/templates/react-email/_meta.ts new file mode 100644 index 00000000..1e0589d1 --- /dev/null +++ b/packages/registry/templates/react-email/_meta.ts @@ -0,0 +1,22 @@ +import type { TemplateMetadata } from "@/lib/types"; + +export const meta: TemplateMetadata = { + type: "static", + title: "React Email", + description: "Build and send emails using React and TypeScript.", + author: "https://react.email/docs", + category: "utility", + registryType: "registry:lib", + dependencies: ["@react-email/components", "react", "react-dom"], + devDependencies: ["react-email"], + files: [], + postInstall: [ + { + action: "package.json script", + data: { + scriptName: "email:preview", + scriptCommand: "email dev", + }, + }, + ], +}; diff --git a/packages/registry/templates/utils/t3-env/_meta.ts b/packages/registry/templates/utils/t3-env/_meta.ts new file mode 100644 index 00000000..6698569e --- /dev/null +++ b/packages/registry/templates/utils/t3-env/_meta.ts @@ -0,0 +1,18 @@ +import { TemplateMetadata } from "@/lib/types"; + +export const meta: TemplateMetadata={ + category:"utility", + title:"T3 Env Validation", + description:"A utility to validate environment variables", + registryType:"registry:lib", + type:"static", + dependencies:["@t3-oss/env-nextjs", "zod"], + docs:"Be sure to import the env.ts file into your next.config.ts to validate at build time.", + files:[ + { + type:"registry:lib", + sourceFileName:"env.ts", + + } + ] +} \ No newline at end of file diff --git a/packages/registry/templates/utils/t3-env/env.ts b/packages/registry/templates/utils/t3-env/env.ts new file mode 100644 index 00000000..2f88a1b4 --- /dev/null +++ b/packages/registry/templates/utils/t3-env/env.ts @@ -0,0 +1,14 @@ +import { createEnv } from "@t3-oss/env-nextjs"; +import { z } from "zod"; + +export const env = createEnv({ + server: { + NODE_ENV: z.enum(["development", "production"]), + }, + client: { + + }, + experimental__runtimeEnv:{ + + } +}); \ No newline at end of file diff --git a/packages/registry/tsconfig.json b/packages/registry/tsconfig.json new file mode 100644 index 00000000..ed30e8a7 --- /dev/null +++ b/packages/registry/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022"], + "module": "ESNext", + "moduleResolution": "bundler", + "outDir": "./dist", + "rootDir": ".", + + "noEmit": false, + "emitDeclarationOnly": true, + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true, + "paths": { + "@/lib/*": ["./lib/*"] + } + }, + "include": ["lib/**/*", "templates/**/_meta.ts", "scripts/**/*"] +} diff --git a/packages/registry/tsdown.config.ts b/packages/registry/tsdown.config.ts new file mode 100644 index 00000000..b8d9519d --- /dev/null +++ b/packages/registry/tsdown.config.ts @@ -0,0 +1,35 @@ +import { defineConfig } from "tsdown"; + +// Run validation before build starts +console.log("🔍 Validating registry before build..."); +try { + const { validateRegistry } = await import("./lib/validator.js"); + validateRegistry(); + console.log("✅ Registry validation completed successfully"); +} catch (error) { + console.error("❌ Registry validation failed:"); + console.error(error); + process.exit(1); +} + +export default defineConfig({ + entry: ["lib/index.ts"], + outDir: "dist/lib", + format: ["esm"], + clean: true, + dts: false, + sourcemap: true, + onSuccess: async () => { + // Copy templates to dist directory after successful build + console.log("📁 Copying templates to dist..."); + try { + const { execSync } = await import("child_process"); + execSync("cp -r templates dist/", { stdio: "inherit" }); + console.log("✅ Templates copied successfully"); + } catch (error) { + console.error("❌ Failed to copy templates:"); + console.error(error); + throw error; + } + }, +}); diff --git a/packages/registry/vitest.config.ts b/packages/registry/vitest.config.ts new file mode 100644 index 00000000..c88a255c --- /dev/null +++ b/packages/registry/vitest.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + environment: "node", + coverage: { + provider: "v8", + reporter: ["text", "json", "html"], + exclude: ["node_modules/", "dist/", "**/*.test.ts"], + }, + }, +}); diff --git a/packages/typegen/vite.config.ts b/packages/typegen/vite.config.ts index 0871a404..32a35a9f 100644 --- a/packages/typegen/vite.config.ts +++ b/packages/typegen/vite.config.ts @@ -8,7 +8,7 @@ const config = defineConfig({ export default mergeConfig( config, tanstackViteConfig({ - entry: ["./src/index.ts", "./src/cli.ts"], + entry: ["./src/index.ts", "./src/cli.ts", "./src/types.ts"], srcDir: "./src", cjs: false, outDir: "./dist", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd87f32a..57032458 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,6 +111,9 @@ importers: apps/docs: dependencies: + '@proofkit/registry': + specifier: workspace:* + version: link:../../packages/registry '@proofkit/typegen': specifier: workspace:* version: link:../../packages/typegen @@ -134,22 +137,22 @@ importers: version: 2.1.1 fumadocs-core: specifier: 15.3.3 - version: 15.3.3(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 15.3.3(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) fumadocs-docgen: specifier: ^2.1.0 version: 2.1.0 fumadocs-mdx: specifier: 11.6.4 - version: 11.6.4(acorn@8.14.1)(fumadocs-core@15.3.3(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + version: 11.6.4(acorn@8.14.1)(fumadocs-core@15.3.3(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) fumadocs-twoslash: specifier: ^3.1.4 - version: 3.1.4(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(fumadocs-ui@15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + version: 3.1.4(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(fumadocs-ui@15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) fumadocs-typescript: specifier: ^4.0.6 version: 4.0.6(@types/react@19.1.10)(typescript@5.9.2) fumadocs-ui: specifier: 15.3.3 - version: 15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11) + version: 15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11) hono: specifier: ^4.9.0 version: 4.9.0 @@ -299,6 +302,9 @@ importers: packages/cli: dependencies: + '@better-fetch/fetch': + specifier: 1.1.17 + version: 1.1.17 '@clack/core': specifier: ^0.3.4 version: 0.3.5 @@ -335,6 +341,9 @@ importers: execa: specifier: ^9.5.1 version: 9.5.3 + fast-glob: + specifier: ^3.3.3 + version: 3.3.3 fs-extra: specifier: ^11.3.0 version: 11.3.0 @@ -368,6 +377,9 @@ importers: semver: specifier: ^7.7.2 version: 7.7.2 + shadcn: + specifier: ^2.10.0 + version: 2.10.0(@types/node@22.17.1)(typescript@5.9.2) sort-package-json: specifier: ^2.10.0 version: 2.15.1 @@ -393,6 +405,9 @@ importers: '@prisma/client': specifier: ^5.14.0 version: 5.22.0(prisma@5.22.0) + '@proofkit/registry': + specifier: workspace:* + version: link:../registry '@t3-oss/env-nextjs': specifier: ^0.10.1 version: 0.10.1(typescript@5.9.2)(zod@3.25.64) @@ -404,7 +419,7 @@ importers: version: 11.0.0-rc.441(@trpc/server@11.0.0-rc.441) '@trpc/next': specifier: 11.0.0-rc.441 - version: 11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@trpc/server@11.0.0-rc.441)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@trpc/server@11.0.0-rc.441)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@trpc/react-query': specifier: 11.0.0-rc.441 version: 11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -449,7 +464,7 @@ importers: version: 15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.7 - version: 4.24.11(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) postgres: specifier: ^3.4.4 version: 3.4.5 @@ -471,9 +486,9 @@ importers: tailwindcss: specifier: ^4.1.11 version: 4.1.11 - tsup: - specifier: ^6.7.0 - version: 6.7.0(postcss@8.5.6)(typescript@5.9.2) + tsdown: + specifier: ^0.14.1 + version: 0.14.1(publint@0.3.12)(typescript@5.9.2) type-fest: specifier: ^3.13.1 version: 3.13.1 @@ -565,6 +580,40 @@ importers: packages/fmodata: {} + packages/registry: + dependencies: + jiti: + specifier: ^1.21.7 + version: 1.21.7 + shadcn: + specifier: ^2.10.0 + version: 2.10.0(@types/node@22.17.1)(typescript@5.9.2) + zod: + specifier: 3.25.64 + version: 3.25.64 + devDependencies: + '@vitest/coverage-v8': + specifier: ^2.1.8 + version: 2.1.9(vitest@2.1.9(@types/node@22.17.1)(@vitest/ui@3.2.4(vitest@3.2.4))(happy-dom@15.11.7)(lightningcss@1.30.1)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2))) + chokidar-cli: + specifier: ^3.0.0 + version: 3.0.0 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + publint: + specifier: ^0.3.12 + version: 0.3.12 + tsdown: + specifier: ^0.3.1 + version: 0.3.1(oxc-transform@0.75.1)(rollup@4.40.2)(typescript@5.9.2) + typescript: + specifier: ^5.9.2 + version: 5.9.2 + vitest: + specifier: ^2.1.8 + version: 2.1.9(@types/node@22.17.1)(@vitest/ui@3.2.4(vitest@3.2.4))(happy-dom@15.11.7)(lightningcss@1.30.1)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2)) + packages/tmp: {} packages/typegen: @@ -688,6 +737,9 @@ packages: resolution: {integrity: sha512-C90iyzm/jLV7Lomv2UzwWUzRv9WZr1oRsFRKsX5HjQL4EXrbi9H/RtBkjCP+NF+ABZXUKpAa4F1dkoTaea4zHg==} hasBin: true + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + '@arethetypeswrong/cli@0.17.4': resolution: {integrity: sha512-AeiKxtf67XD/NdOqXgBOE5TZWH3EOCt+0GkbUpekOzngc+Q/cRZ5azjWyMxISxxfp0EItgm5NoSld9p7BAA5xQ==} engines: {node: '>=18'} @@ -749,8 +801,8 @@ packages: resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -825,6 +877,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-jsx@7.27.1': resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} @@ -909,6 +966,10 @@ packages: resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1028,17 +1089,14 @@ packages: peerDependencies: commander: ~14.0.0 - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} @@ -1054,6 +1112,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.4': resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} @@ -1066,12 +1130,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.17.19': - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -1084,6 +1142,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.4': resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} @@ -1096,12 +1160,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.17.19': - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -1114,6 +1172,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.4': resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} @@ -1126,12 +1190,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.17.19': - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -1144,6 +1202,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.4': resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} @@ -1156,12 +1220,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.17.19': - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -1174,6 +1232,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.4': resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} @@ -1186,12 +1250,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.17.19': - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -1204,6 +1262,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.4': resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} @@ -1216,12 +1280,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.17.19': - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -1234,6 +1292,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.4': resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} @@ -1246,12 +1310,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.17.19': - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -1264,6 +1322,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.4': resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} @@ -1276,12 +1340,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.17.19': - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -1294,6 +1352,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.4': resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} @@ -1306,12 +1370,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.17.19': - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -1324,6 +1382,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.4': resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} @@ -1336,12 +1400,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.17.19': - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -1354,6 +1412,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.4': resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} @@ -1366,12 +1430,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.17.19': - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -1384,6 +1442,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.4': resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} @@ -1396,12 +1460,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.17.19': - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -1414,6 +1472,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.4': resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} @@ -1426,12 +1490,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.17.19': - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -1444,6 +1502,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.4': resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} @@ -1456,12 +1520,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.17.19': - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -1474,6 +1532,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.4': resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} @@ -1486,12 +1550,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.17.19': - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -1504,6 +1562,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.4': resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} @@ -1516,12 +1580,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.17.19': - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -1534,6 +1592,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.4': resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} @@ -1558,12 +1622,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.17.19': - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -1576,6 +1634,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.4': resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} @@ -1600,12 +1664,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.17.19': - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -1618,6 +1676,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.4': resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} @@ -1636,12 +1700,6 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.17.19': - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -1654,6 +1712,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.4': resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} @@ -1666,12 +1730,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.17.19': - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -1684,6 +1742,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.4': resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} @@ -1696,12 +1760,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.17.19': - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -1714,6 +1772,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.4': resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} @@ -1726,12 +1790,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.17.19': - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -1744,6 +1802,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.4': resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} @@ -2041,6 +2105,9 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -2059,6 +2126,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@levischuck/tiny-cbor@0.2.11': resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} @@ -2150,12 +2220,12 @@ packages: resolution: {integrity: sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==} engines: {node: '>=18'} - '@napi-rs/wasm-runtime@0.2.10': - resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} - '@napi-rs/wasm-runtime@0.2.11': resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + '@napi-rs/wasm-runtime@1.0.3': + resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} @@ -2249,6 +2319,63 @@ packages: resolution: {integrity: sha512-6yB0117ZjsgNevZw3LP+bkrZa9mU/POPVaXgzMPOBbBc35w2P3R+1vMMhEfC06kYCpd5bf0jodBaTkYQW5TVeQ==} engines: {node: '>= 20.0.0'} + '@oxc-parser/binding-darwin-arm64@0.36.0': + resolution: {integrity: sha512-i49m1L++ZAeAjNob5qho2ir3nflhIzgQl9hsFvmMBzG+we4OKseGlUAd/nEXJ2XnNvu1TEi/EocsE9XgWM5xlg==} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.36.0': + resolution: {integrity: sha512-+UYnDyItrh76gp7JNiTwCYyipwD1f1GkXlVkFt7L4y8GI2nMkTsvS1kUrYVsZTi33GHq4d7janrEN9HUTHqfGg==} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-linux-arm64-gnu@0.36.0': + resolution: {integrity: sha512-ZZXcl9FD77EbAENTpYXCYr/zZS1Ab+qomiKIhXVRC1PXIP8qqcYpFl2NtrJHKy0ScIqNHYjzB2F9pj84howN3w==} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.36.0': + resolution: {integrity: sha512-2PqTw3uiazv4vp8pGSNWDAp8DSHAxFPh3rIub5colRlu4lLGZJNXm9fgFIp0fS5Z6BFYyhnYzWNZm8bc0q2tYA==} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.36.0': + resolution: {integrity: sha512-kmRgQj/48VaBf4R9P0ccZdpgepz4F2k7nJgg5L+oPenrJhnZeD9eUzImBlN27XcpBZhDxsvj7jOTp5xSVZ7E/Q==} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.36.0': + resolution: {integrity: sha512-hxpR0DdK2Zm6Gt3m/bqVLw4nZJdzkr5SsPc6sv0rPtsABx8Q6zxAf300+9mWxUm/Bf4hGHoWsCWFgWN0n87dBA==} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-win32-arm64-msvc@0.36.0': + resolution: {integrity: sha512-IsarNWJhsbtARGa/7L2X2FfJt3mdQVH/CASWv99SowVaO62kLZ1lYHtU2Ps0F8dzfCwQUsWo5XnDtmfhd5nAkw==} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.36.0': + resolution: {integrity: sha512-NSlWyqWtmWA78nPWRWWzc4W6A8zY0YdX2yjbGg5PnEMiTXrW7NdVTyXdffX59ERDxtC3BT6E78e/sKS9u983pQ==} + cpu: [x64] + os: [win32] + + '@oxc-project/runtime@0.72.3': + resolution: {integrity: sha512-FtOS+0v7rZcnjXzYTTqv1vu/KDptD1UztFgoZkYBGe/6TcNFm+SP/jQoLvzau1SPir95WgDOBOUm2Gmsm+bQag==} + engines: {node: '>=6.9.0'} + + '@oxc-project/runtime@0.82.2': + resolution: {integrity: sha512-cYxcj5CPn/vo5QSpCZcYzBiLidU5+GlFSqIeNaMgBDtcVRBsBJHZg3pHw999W6nHamFQ1EHuPPByB26tjaJiJw==} + engines: {node: '>=6.9.0'} + + '@oxc-project/types@0.36.0': + resolution: {integrity: sha512-VAv7ANBGE6glvOX5PEhGcca8hqBeGGDXt3xfPApZg7GhkrvbI8YCf01HojlpdIewixN2rnNpfO6cFgHS6Ixe5A==} + + '@oxc-project/types@0.72.3': + resolution: {integrity: sha512-CfAC4wrmMkUoISpQkFAIfMVvlPfQV3xg7ZlcqPXPOIMQhdKIId44G8W0mCPgtpWdFFAyJ+SFtiM+9vbyCkoVng==} + + '@oxc-project/types@0.82.2': + resolution: {integrity: sha512-WMGSwd9FsNBs/WfqIOH0h3k1LBdjZJQGYjGnC+vla/fh6HUsu5HzGPerRljiq1hgMQ6gs031YJR12VyP57b/hQ==} + '@oxc-resolver/binding-darwin-arm64@9.0.2': resolution: {integrity: sha512-MVyRgP2gzJJtAowjG/cHN3VQXwNLWnY+FpOEsyvDepJki1SdAX/8XDijM1yN6ESD1kr9uhBKjGelC6h3qtT+rA==} cpu: [arm64] @@ -2472,6 +2599,9 @@ packages: resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -2907,39 +3037,175 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-rect@1.1.1': - resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.2': + resolution: {integrity: sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rolldown/binding-android-arm64@1.0.0-beta.33': + resolution: {integrity: sha512-xhDQXKftRkEULIxCddrKMR8y0YO/Y+6BKk/XrQP2B29YjV2wr8DByoEz+AHX9BfLHb2srfpdN46UquBW2QXWpQ==} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-dkMfisSkfS3Rbyj+qL6HFQmGNlwCKhkwH7pKg2oVhzpEQYnuP0YIUGV4WXsTd3hxoHNgs+LQU5LJe78IhE2q6g==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.33': + resolution: {integrity: sha512-7lhhY08v5ZtRq8JJQaJ49fnJombAPnqllKKCDLU/UvaqNAOEyTGC8J1WVOLC4EA4zbXO5U3CCRgVGyAFNH2VtQ==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-qbtggWQ+iiwls7A+M9RymMcMwga/LscZ+XamWNhDVzHPVEnv0bYePN7Kh+kPQDNdYxM+6xhZyZWBkMdLj1MNqg==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.33': + resolution: {integrity: sha512-U2iGjcDV7NWyYyhap8YuY0nwrLX6TvX/9i7gBtdEMPm9z3wIUVGNMVdGlA43uqg7xDpRGpEqGnxbeDgiEwYdnA==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-GrSy4boSJd7dR1fP0chqcxTdbDYa+KaRuffqZXZjh4aTaSuCEyuH0lmciDeJKOXBJaBoPFuisx7+Q/WDWdW0ng==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.33': + resolution: {integrity: sha512-gd6ASromVHFLlzrjJWMG5CXHkS7/36DEZ8HhvGt2NN8eZALCIuyEx8HMMLqvKA7z4EAztVkdToVrdxpGMsKZxw==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-AcTYqfzSbTsR5pxOdZeUR+7JzWojQSFcLQ8SrdmrQBOmubvMNhnObDJ+OqEFql8TrLhqRPJ+nzfdENGjVmMxEw==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.33': + resolution: {integrity: sha512-xmeLfkfGthuynO1EpCdyTVr0r4G+wqvnKCuyR6rXOet+hLrq5HNAC2XtP/jU2TB4Bc6aiLYxl868B8CGtFDhcw==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-Z2kfzCFGZcksDqXHiOddcPuMkEJNLG8wgBW3FmK8ucmiwIrYz4goqQcHvUkQ+n3FKKyq2h67EuBHHCXi4CnDWg==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.33': + resolution: {integrity: sha512-cHGp8yfHL4pes6uaLbO5L58ceFkUK4efd8iE86jClD1QPPDLKiqEXJCFYeuK3OfODuF5EBOmf0SlcUZNEYGdmw==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-2YOaZ6vsE6NDpj6PTo2nBRu/bjMSkhRG80oQahX0bt+pvigaWT3x0Nw522fT9FOuhvKhzsqaFhtVl8SFYcXYTQ==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.33': + resolution: {integrity: sha512-wZ1t7JAvVeFgskH1L9y7c47ITitPytpL0s8FmAT8pVfXcaTmS58ZyoXT+y6cz8uCkQnETjrX3YezTGI18u3ecg==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-bqb+MXYXcRTW9z26VmqttxDGYmhudne1jt1jvjbkIqDomjIJPCY6Gu6dQ9nPk561Zs2c5MB737KTc+HJe/EapA==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.33': + resolution: {integrity: sha512-cDndWo3VEYbm7yeujOV6Ie2XHz0K8YX/R/vbNmMo03m1QwtBKKvbYNSyJb3B9+8igltDjd8zNM9mpiNNrq/ekQ==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-oynj2ltmiV1gMYiuJ/HHqmRgfk7+a0tk9RoLt0xRSwQXPHWPMftcZYJh8r2pi0/bR/AGypDfpY9fsYcULa2Hpw==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.33': + resolution: {integrity: sha512-bl7uzi6es/l6LT++NZcBpiX43ldLyKXCPwEZGY1rZJ99HQ7m1g3KxWwYCcGxtKjlb2ExVvDZicF6k+96vxOJKg==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.33': + resolution: {integrity: sha512-TrgzQanpLgcmmzolCbYA9BPZgF1gYxkIGZhU/HROnJPsq67gcyaYw/JBLioqQLjIwMipETkn25YY799D2OZzJA==} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-7bOTebAR3zVY/TZTaaMnD6kGedlfPLlgcpD5Kuo02EHFgJnf02HpOvqRdzW39+mI/mDOf5K0JOULiXjgdKw5Zg==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.33': + resolution: {integrity: sha512-z0LltdUfvoKak9SuaLz/M9AVSg+RTOZjFksbZXzC6Svl1odyW4ai21VHhZy3m2Faeeb/rl/9efVLayj+qYEGxw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-bwUSHGdMFf2UmEfEqKBRdVW2Qt2Nhmk+4H8lSDsG4lMx8aJ2nAVK0Vem1skmuOZJYocJEe4lJZBxl8q8SAAgAg==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.33': + resolution: {integrity: sha512-CpvOHyqDNOYx9riD4giyXQDIu72bWRU2Dwt1xFSPlBudk6NumK0OJl6Ch+LPnkp5podQHcQg0mMauAXPVKct7g==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-QG+EWXIa7IcQgpVF6zpxjAikc82NP5Zmu2GjoOiRRWFHQNLaEZx9/WNt/k6ncRA2yI0+f9vNdq9G34Z0pW+Fwg==} + cpu: [ia32] + os: [win32] - '@radix-ui/react-use-size@1.1.1': - resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.33': + resolution: {integrity: sha512-/tNTvZTWHz6HiVuwpR3zR0kGIyCNb+/tFhnJmti+Aw2fAXs3l7Aj0DcXd0646eFKMX8L2w5hOW9H08FXTUkN0g==} + cpu: [ia32] + os: [win32] - '@radix-ui/react-visually-hidden@1.2.2': - resolution: {integrity: sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-40gOnsAJOP/jqnAgkYsj7kQD1+U5ZJcRA4hHeL6ouCsqMFIqS4bmOhUYDOM3O9dDawmrG7zadY+gu1FKtMix9g==} + cpu: [x64] + os: [win32] - '@radix-ui/rect@1.1.1': - resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.33': + resolution: {integrity: sha512-Bb2qK3z7g2mf4zaKRvkohHzweaP1lLbaoBmXZFkY6jJWMm0Z8Pfnh8cOoRlH1IVM1Ufbo8ZZ1WXp1LbOpRMtXw==} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.13-commit.024b632': + resolution: {integrity: sha512-9/h9ID36/orsoJx8kd2E/wxQ+bif87Blg/7LAu3t9wqfXPPezu02MYR96NOH9G/Aiwr8YgdaKfDE97IZcg/MTw==} + + '@rolldown/pluginutils@1.0.0-beta.33': + resolution: {integrity: sha512-she25NCG6NoEPC/SEB4pHs5STcnfI4VBFOzjeI63maSPrWME5J2XC8ogrBgp8NaE/xzj28/kbpSaebiMvFRj+w==} '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} @@ -3329,6 +3595,9 @@ packages: '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -3668,9 +3937,32 @@ packages: peerDependencies: vitest: 1.6.1 + '@vitest/coverage-v8@2.1.9': + resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} + peerDependencies: + '@vitest/browser': 2.1.9 + vitest: 2.1.9 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/mocker@3.2.4': resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: @@ -3682,15 +3974,27 @@ packages: vite: optional: true + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + '@vitest/runner@3.2.4': resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + '@vitest/snapshot@3.2.4': resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} @@ -3699,6 +4003,9 @@ packages: peerDependencies: vitest: 3.2.4 + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} @@ -3786,6 +4093,10 @@ packages: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -3794,6 +4105,10 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3806,6 +4121,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -3879,6 +4198,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@2.1.2: + resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} + engines: {node: '>=20.18.0'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -3945,6 +4268,9 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + birpc@2.5.0: + resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3983,11 +4309,11 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - bundle-require@4.2.1: - resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.17' + esbuild: '>=0.18' bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -4029,6 +4355,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + caniuse-lite@1.0.30001726: resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==} @@ -4073,6 +4403,11 @@ packages: chevrotain@10.5.0: resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==} + chokidar-cli@3.0.0: + resolution: {integrity: sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==} + engines: {node: '>= 8.10.0'} + hasBin: true + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -4133,6 +4468,9 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -4157,10 +4495,16 @@ packages: collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -4190,10 +4534,6 @@ packages: resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} engines: {node: '>=20'} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -4210,6 +4550,11 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -4298,6 +4643,10 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -4318,6 +4667,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decode-named-character-reference@1.1.0: resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} @@ -4419,6 +4772,10 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + difflib@0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} @@ -4619,6 +4976,15 @@ packages: sqlite3: optional: true + dts-resolver@2.1.1: + resolution: {integrity: sha512-3BiGFhB6mj5Kv+W2vdJseQUYW+SKVzAFJL6YNP6ursbrwy1fXHRotfHi3xLNxe4wZl/K8qbAFeCDjZLjzqxxRw==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -4632,6 +4998,9 @@ packages: electron-to-chromium@1.5.177: resolution: {integrity: sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==} + emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4641,6 +5010,10 @@ packages: emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -4738,11 +5111,6 @@ packages: peerDependencies: esbuild: '>=0.12 <1' - esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -4753,6 +5121,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.4: resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} @@ -4963,10 +5336,6 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - execa@7.2.0: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} @@ -5089,6 +5458,10 @@ packages: resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5448,6 +5821,9 @@ packages: resolution: {integrity: sha512-JAUc4Sqi3lhby2imRL/67LMcJFKiCu7ZKghM7iwvltVZzxEC5bVJCsAa4NTnSfmWGb+N2eOVtFE586R+K3fejA==} engines: {node: '>=16.9.0'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -5466,10 +5842,6 @@ packages: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} @@ -5514,6 +5886,9 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} + importx@0.5.2: + resolution: {integrity: sha512-YEwlK86Ml5WiTxN/ECUYC5U7jd1CisAVw7ya4i9ZppBoHfFkT2+hChhr3PE2fYxUKLkNyivxEQpa5Ruil1LJBQ==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -5610,6 +5985,10 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -5686,10 +6065,6 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5819,10 +6194,6 @@ packages: jose@6.0.11: resolution: {integrity: sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg==} - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} @@ -6011,6 +6382,10 @@ packages: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -6019,12 +6394,12 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -6528,10 +6903,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6659,6 +7030,9 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxc-parser@0.36.0: + resolution: {integrity: sha512-dcjn+8WvWVbIO0Bb0qAJcfq8JwdkbPflYyFBg3rcDb83awlXAQLnhZuheGUxuWEh18oQFAcxkgdUdObS6DvA7A==} + oxc-resolver@9.0.2: resolution: {integrity: sha512-w838ygc1p7rF+7+h5vR9A+Y9Fc4imy6C3xPthCMkdFUgFvUWkmABeNB8RBDQ6+afk44Q60/UMMQ+gfDUW99fBA==} @@ -6678,6 +7052,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -6734,6 +7112,10 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6772,6 +7154,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -6801,10 +7186,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - pkce-challenge@5.0.0: resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} engines: {node: '>=16.20.0'} @@ -6819,18 +7200,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-load-config@3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - postcss-selector-parser@7.1.0: resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} @@ -7011,6 +7380,9 @@ packages: quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -7191,6 +7563,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -7222,16 +7597,35 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown-plugin-dts@0.15.6: + resolution: {integrity: sha512-AxQlyx3Nszob5QLmVUjz/VnC5BevtUo0h8tliuE0egddss7IbtCBU7GOe7biRU0fJNRQJmQjPKXFcc7K98j3+w==} + engines: {node: '>=20.18.0'} + peerDependencies: + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.9 + typescript: ^5.0.0 + vue-tsc: ~3.0.3 + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.13-commit.024b632: + resolution: {integrity: sha512-sntAHxNJ22WdcXVHQDoRst4eOJZjuT3S1aqsNWsvK2aaFVPgpVPY3WGwvJ91SvH/oTdRCyJw5PwpzbaMdKdYqQ==} + hasBin: true + + rolldown@1.0.0-beta.33: + resolution: {integrity: sha512-mgu118ZuRguC8unhPCbdZbyRbjQfEMiWqlojBA5aRIncBelRaBomnHNpGKYkYWeK7twRz5Cql30xgqqrA3Xelw==} + hasBin: true + rollup-plugin-preserve-directives@0.4.0: resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} peerDependencies: rollup: 2.x || 3.x || 4.x - rollup@3.29.5: - resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.40.2: resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -7251,6 +7645,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -7308,6 +7705,9 @@ packages: resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} engines: {node: '>= 18'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} @@ -7342,6 +7742,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + shiki@3.4.2: resolution: {integrity: sha512-wuxzZzQG8kvZndD7nustrNFIKYJ1jJoWIPaBpVe2+KHSvtzMi4SBjOxrigs8qeqce/l3U0cwiC+VAkLKSunHQQ==} @@ -7424,14 +7828,12 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -7478,6 +7880,10 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -7519,6 +7925,10 @@ packages: resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} engines: {node: '>=14.16'} + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -7535,10 +7945,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -7588,11 +7994,6 @@ packages: babel-plugin-macros: optional: true - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - superjson@2.2.2: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} @@ -7650,6 +8051,10 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -7673,6 +8078,9 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -7688,10 +8096,18 @@ packages: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + tinyspy@4.0.3: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} @@ -7720,9 +8136,6 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -7739,9 +8152,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-morph@18.0.0: resolution: {integrity: sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==} @@ -7768,24 +8178,35 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsup@6.7.0: - resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} - engines: {node: '>=14.18'} + tsdown@0.14.1: + resolution: {integrity: sha512-/nBuFDKZeYln9hAxwWG5Cm55/823sNIVI693iVi0xRFHzf9OVUq4b/lx9PH1TErFr/IQ0kd2hutFbJIPM0XQWA==} + engines: {node: '>=20.19.0'} hasBin: true peerDependencies: - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.1.0' + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 peerDependenciesMeta: - '@swc/core': + '@arethetypeswrong/core': optional: true - postcss: + publint: optional: true typescript: optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + + tsdown@0.3.1: + resolution: {integrity: sha512-5WLFU7f2NRnsez0jxi7m2lEQNPvBOdos0W8vHvKDnS6tYTfOfmZ5D2z/G9pFTQSjeBhoi6BFRMybc4LzCOKR8A==} + engines: {node: '>=18.0.0'} + hasBin: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsx@4.20.3: resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} @@ -7905,6 +8326,12 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + unconfig@0.6.1: + resolution: {integrity: sha512-cVU+/sPloZqOyJEAfNwnQSFCzFrZm85vcVkryH7lnlB/PiTycUkAjt5Ds79cfIshGOZ+M5v3PBDnKgpmlE5DtA==} + + unconfig@7.3.2: + resolution: {integrity: sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -7956,6 +8383,29 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-isolated-decl@0.7.2: + resolution: {integrity: sha512-YhQbelS/iZ3x4fBWyZ3zJP8/26dCT9NdEN8/70+Ynh6zgxy3HncoEcs4PTItYcv1nYpEXBvfl6QgEdtpb0yG8w==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/core': ^1.6.6 + oxc-transform: '>=0.28.0' + typescript: ^5.5.2 + peerDependenciesMeta: + '@swc/core': + optional: true + oxc-transform: + optional: true + typescript: + optional: true + + unplugin-unused@0.2.3: + resolution: {integrity: sha512-qX708+nM4zi51RPMPgvOSqRs/73kUFKUO49oaBngg2t/VW5MhdbTkSQG/S1HEGsIvZcB/t32KzbISCF0n+UPSw==} + engines: {node: '>=18.12.0'} + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + unrs-resolver@1.7.9: resolution: {integrity: sha512-hhFtY782YKwpz54G1db49YYS1RuMn8mBylIrCldrjb9BxZKnQ2xHw7+2zcl7H6fnUlTHGWv23/+677cpufhfxQ==} @@ -8016,6 +8466,11 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -8044,6 +8499,37 @@ packages: vite: optional: true + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@6.3.5: resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -8084,6 +8570,31 @@ packages: yaml: optional: true + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@3.2.4: resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -8125,20 +8636,17 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -8151,6 +8659,9 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.19: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} @@ -8172,6 +8683,10 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -8199,6 +8714,9 @@ packages: utf-8-validate: optional: true + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -8213,15 +8731,14 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - yaml@2.8.0: resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} engines: {node: '>= 14.6'} hasBin: true + yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -8230,6 +8747,9 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -8287,6 +8807,8 @@ snapshots: '@antfu/ni@23.3.1': {} + '@antfu/utils@8.1.1': {} + '@arethetypeswrong/cli@0.17.4': dependencies: '@arethetypeswrong/core': 0.17.4 @@ -8355,14 +8877,14 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.7 + '@babel/parser': 7.28.3 '@babel/template': 7.27.2 '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -8379,17 +8901,17 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/generator@7.27.5': + '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.2 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -8415,14 +8937,14 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color @@ -8437,7 +8959,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.2 '@babel/helper-plugin-utils@7.27.1': {} @@ -8453,7 +8975,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color @@ -8466,7 +8988,7 @@ snapshots: '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.7 + '@babel/types': 7.28.2 '@babel/parser@7.27.2': dependencies: @@ -8476,6 +8998,10 @@ snapshots: dependencies: '@babel/types': 7.27.7 + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -8562,7 +9088,7 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.7 + '@babel/parser': 7.28.3 '@babel/types': 7.27.7 '@babel/traverse@7.27.1': @@ -8580,10 +9106,10 @@ snapshots: '@babel/traverse@7.27.7': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.7 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.3 '@babel/template': 7.27.2 - '@babel/types': 7.27.7 + '@babel/types': 7.28.2 debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: @@ -8599,6 +9125,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@bcoe/v8-coverage@0.2.3': {} '@better-auth/cli@1.2.10(@libsql/client@0.6.2)(@planetscale/database@1.19.0)(@types/react@19.1.10)(kysely@0.28.2)(magicast@0.3.5)(mysql2@3.14.1)(postgres@3.4.5)(react@19.1.1)': @@ -8870,14 +9401,9 @@ snapshots: dependencies: commander: 14.0.0 - '@emnapi/core@1.4.3': - dependencies: - '@emnapi/wasi-threads': 1.0.2 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.4.3': + '@emnapi/core@1.4.5': dependencies: + '@emnapi/wasi-threads': 1.0.4 tslib: 2.8.1 optional: true @@ -8886,7 +9412,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.2': + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true @@ -8904,13 +9430,13 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.25.4': + '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/aix-ppc64@0.25.4': optional: true - '@esbuild/android-arm64@0.17.19': + '@esbuild/aix-ppc64@0.25.8': optional: true '@esbuild/android-arm64@0.18.20': @@ -8919,13 +9445,13 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.25.4': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/android-arm64@0.25.4': optional: true - '@esbuild/android-arm@0.17.19': + '@esbuild/android-arm64@0.25.8': optional: true '@esbuild/android-arm@0.18.20': @@ -8934,13 +9460,13 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.25.4': + '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/android-arm@0.25.4': optional: true - '@esbuild/android-x64@0.17.19': + '@esbuild/android-arm@0.25.8': optional: true '@esbuild/android-x64@0.18.20': @@ -8949,13 +9475,13 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.25.4': + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/android-x64@0.25.4': optional: true - '@esbuild/darwin-arm64@0.17.19': + '@esbuild/android-x64@0.25.8': optional: true '@esbuild/darwin-arm64@0.18.20': @@ -8964,13 +9490,13 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.25.4': + '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/darwin-arm64@0.25.4': optional: true - '@esbuild/darwin-x64@0.17.19': + '@esbuild/darwin-arm64@0.25.8': optional: true '@esbuild/darwin-x64@0.18.20': @@ -8979,13 +9505,13 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.25.4': + '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/darwin-x64@0.25.4': optional: true - '@esbuild/freebsd-arm64@0.17.19': + '@esbuild/darwin-x64@0.25.8': optional: true '@esbuild/freebsd-arm64@0.18.20': @@ -8994,13 +9520,13 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.25.4': + '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/freebsd-arm64@0.25.4': optional: true - '@esbuild/freebsd-x64@0.17.19': + '@esbuild/freebsd-arm64@0.25.8': optional: true '@esbuild/freebsd-x64@0.18.20': @@ -9009,13 +9535,13 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.25.4': + '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/freebsd-x64@0.25.4': optional: true - '@esbuild/linux-arm64@0.17.19': + '@esbuild/freebsd-x64@0.25.8': optional: true '@esbuild/linux-arm64@0.18.20': @@ -9024,13 +9550,13 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.25.4': + '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/linux-arm64@0.25.4': optional: true - '@esbuild/linux-arm@0.17.19': + '@esbuild/linux-arm64@0.25.8': optional: true '@esbuild/linux-arm@0.18.20': @@ -9039,13 +9565,13 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.25.4': + '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/linux-arm@0.25.4': optional: true - '@esbuild/linux-ia32@0.17.19': + '@esbuild/linux-arm@0.25.8': optional: true '@esbuild/linux-ia32@0.18.20': @@ -9054,13 +9580,13 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.25.4': + '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/linux-ia32@0.25.4': optional: true - '@esbuild/linux-loong64@0.17.19': + '@esbuild/linux-ia32@0.25.8': optional: true '@esbuild/linux-loong64@0.18.20': @@ -9069,13 +9595,13 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.25.4': + '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.25.8': + '@esbuild/linux-loong64@0.25.4': optional: true - '@esbuild/linux-mips64el@0.17.19': + '@esbuild/linux-loong64@0.25.8': optional: true '@esbuild/linux-mips64el@0.18.20': @@ -9084,13 +9610,13 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.25.4': + '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/linux-mips64el@0.25.4': optional: true - '@esbuild/linux-ppc64@0.17.19': + '@esbuild/linux-mips64el@0.25.8': optional: true '@esbuild/linux-ppc64@0.18.20': @@ -9099,13 +9625,13 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.25.4': + '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.25.8': + '@esbuild/linux-ppc64@0.25.4': optional: true - '@esbuild/linux-riscv64@0.17.19': + '@esbuild/linux-ppc64@0.25.8': optional: true '@esbuild/linux-riscv64@0.18.20': @@ -9114,13 +9640,13 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.25.4': + '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.25.8': + '@esbuild/linux-riscv64@0.25.4': optional: true - '@esbuild/linux-s390x@0.17.19': + '@esbuild/linux-riscv64@0.25.8': optional: true '@esbuild/linux-s390x@0.18.20': @@ -9129,13 +9655,13 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.25.4': + '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.25.8': + '@esbuild/linux-s390x@0.25.4': optional: true - '@esbuild/linux-x64@0.17.19': + '@esbuild/linux-s390x@0.25.8': optional: true '@esbuild/linux-x64@0.18.20': @@ -9144,6 +9670,9 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.25.4': optional: true @@ -9156,15 +9685,15 @@ snapshots: '@esbuild/netbsd-arm64@0.25.8': optional: true - '@esbuild/netbsd-x64@0.17.19': - optional: true - '@esbuild/netbsd-x64@0.18.20': optional: true '@esbuild/netbsd-x64@0.19.12': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.25.4': optional: true @@ -9177,15 +9706,15 @@ snapshots: '@esbuild/openbsd-arm64@0.25.8': optional: true - '@esbuild/openbsd-x64@0.17.19': - optional: true - '@esbuild/openbsd-x64@0.18.20': optional: true '@esbuild/openbsd-x64@0.19.12': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.25.4': optional: true @@ -9195,22 +9724,19 @@ snapshots: '@esbuild/openharmony-arm64@0.25.8': optional: true - '@esbuild/sunos-x64@0.17.19': - optional: true - '@esbuild/sunos-x64@0.18.20': optional: true '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.25.4': + '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.25.8': + '@esbuild/sunos-x64@0.25.4': optional: true - '@esbuild/win32-arm64@0.17.19': + '@esbuild/sunos-x64@0.25.8': optional: true '@esbuild/win32-arm64@0.18.20': @@ -9219,13 +9745,13 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.25.4': + '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-arm64@0.25.4': optional: true - '@esbuild/win32-ia32@0.17.19': + '@esbuild/win32-arm64@0.25.8': optional: true '@esbuild/win32-ia32@0.18.20': @@ -9234,13 +9760,13 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.25.4': + '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.25.8': + '@esbuild/win32-ia32@0.25.4': optional: true - '@esbuild/win32-x64@0.17.19': + '@esbuild/win32-ia32@0.25.8': optional: true '@esbuild/win32-x64@0.18.20': @@ -9249,6 +9775,9 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.25.4': optional: true @@ -9516,6 +10045,11 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -9533,6 +10067,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@levischuck/tiny-cbor@0.2.11': {} '@libsql/client@0.6.2': @@ -9706,18 +10245,18 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@napi-rs/wasm-runtime@0.2.10': + '@napi-rs/wasm-runtime@0.2.11': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 '@tybys/wasm-util': 0.9.0 optional: true - '@napi-rs/wasm-runtime@0.2.11': + '@napi-rs/wasm-runtime@1.0.3': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.9.0 + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 optional: true '@neon-rs/load@0.0.4': {} @@ -9781,6 +10320,40 @@ snapshots: '@orama/orama@3.1.7': {} + '@oxc-parser/binding-darwin-arm64@0.36.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.36.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.36.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.36.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.36.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.36.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.36.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.36.0': + optional: true + + '@oxc-project/runtime@0.72.3': {} + + '@oxc-project/runtime@0.82.2': {} + + '@oxc-project/types@0.36.0': {} + + '@oxc-project/types@0.72.3': {} + + '@oxc-project/types@0.82.2': {} + '@oxc-resolver/binding-darwin-arm64@9.0.2': optional: true @@ -9949,6 +10522,10 @@ snapshots: '@publint/pack@0.1.2': {} + '@quansync/fs@0.1.5': + dependencies: + quansync: 0.2.11 + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.2': {} @@ -10407,6 +10984,92 @@ snapshots: '@radix-ui/rect@1.1.1': {} + '@rolldown/binding-android-arm64@1.0.0-beta.33': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.33': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.33': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.33': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.33': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.33': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.33': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.33': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.33': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.33': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.13-commit.024b632': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.33': + dependencies: + '@napi-rs/wasm-runtime': 1.0.3 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.33': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.33': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.13-commit.024b632': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.33': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.13-commit.024b632': {} + + '@rolldown/pluginutils@1.0.0-beta.33': {} + '@rollup/pluginutils@5.1.4(rollup@4.40.2)': dependencies: '@types/estree': 1.0.7 @@ -10756,7 +11419,7 @@ snapshots: dependencies: '@trpc/server': 11.0.0-rc.441 - '@trpc/next@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@trpc/server@11.0.0-rc.441)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@trpc/next@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@trpc/server@11.0.0-rc.441)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@trpc/client': 11.0.0-rc.441(@trpc/server@11.0.0-rc.441) '@trpc/server': 11.0.0-rc.441 @@ -10790,6 +11453,11 @@ snapshots: minimatch: 10.0.3 path-browserify: 1.0.1 + '@tybys/wasm-util@0.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 @@ -11144,7 +11812,7 @@ snapshots: '@unrs/resolver-binding-wasm32-wasi@1.7.9': dependencies: - '@napi-rs/wasm-runtime': 0.2.10 + '@napi-rs/wasm-runtime': 0.2.11 optional: true '@unrs/resolver-binding-win32-arm64-msvc@1.7.9': @@ -11179,6 +11847,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.17.1)(@vitest/ui@3.2.4(vitest@3.2.4))(happy-dom@15.11.7)(lightningcss@1.30.1)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2)))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.9.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.9(@types/node@22.17.1)(@vitest/ui@3.2.4(vitest@3.2.4))(happy-dom@15.11.7)(lightningcss@1.30.1)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2)) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + tinyrainbow: 1.2.0 + '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.2 @@ -11187,6 +11880,15 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 + '@vitest/mocker@2.1.9(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2))(vite@5.4.19(@types/node@22.17.1)(lightningcss@1.30.1))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + msw: 2.10.2(@types/node@22.17.1)(typescript@5.9.2) + vite: 5.4.19(@types/node@22.17.1)(lightningcss@1.30.1) + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2))(vite@6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 @@ -11205,22 +11907,41 @@ snapshots: msw: 2.10.2(@types/node@22.17.1)(typescript@5.9.2) vite: 6.3.5(@types/node@22.17.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + '@vitest/runner@3.2.4': dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.17 + pathe: 1.1.2 + '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 @@ -11234,7 +11955,13 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.1)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2))(tsx@4.20.3)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.1)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.1)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2))(tsx@4.20.3)(yaml@2.8.0) + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.2.0 + tinyrainbow: 1.2.0 '@vitest/utils@3.2.4': dependencies: @@ -11256,7 +11983,7 @@ snapshots: '@vue/compiler-core@3.5.14': dependencies: - '@babel/parser': 7.27.2 + '@babel/parser': 7.28.3 '@vue/shared': 3.5.14 entities: 4.5.0 estree-walker: 2.0.2 @@ -11339,10 +12066,16 @@ snapshots: dependencies: environment: 1.1.0 + ansi-regex@4.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -11351,6 +12084,8 @@ snapshots: ansi-styles@6.2.1: {} + ansis@4.1.0: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -11460,6 +12195,11 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@2.1.2: + dependencies: + '@babel/parser': 7.28.3 + pathe: 2.0.3 + ast-types-flow@0.0.8: {} ast-types@0.16.1: @@ -11533,6 +12273,8 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 + birpc@2.5.0: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -11595,9 +12337,9 @@ snapshots: dependencies: run-applescript: 7.0.0 - bundle-require@4.2.1(esbuild@0.17.19): + bundle-require@5.1.0(esbuild@0.25.8): dependencies: - esbuild: 0.17.19 + esbuild: 0.25.8 load-tsconfig: 0.2.5 bytes@3.1.2: {} @@ -11657,6 +12399,8 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: {} + caniuse-lite@1.0.30001726: {} ccount@2.0.1: {} @@ -11699,6 +12443,13 @@ snapshots: lodash: 4.17.21 regexp-to-ast: 0.5.0 + chokidar-cli@3.0.0: + dependencies: + chokidar: 3.6.0 + lodash.debounce: 4.0.8 + lodash.throttle: 4.1.1 + yargs: 13.3.2 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -11766,6 +12517,12 @@ snapshots: client-only@0.0.1: {} + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -11788,10 +12545,16 @@ snapshots: collapse-white-space@2.1.0: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} color-string@1.9.1: @@ -11818,8 +12581,6 @@ snapshots: commander@14.0.0: {} - commander@4.1.1: {} - commander@9.5.0: {} compare-versions@6.1.1: {} @@ -11830,6 +12591,18 @@ snapshots: concat-map@0.0.1: {} + concurrently@8.2.2: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.3 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + confbox@0.1.8: {} confbox@0.2.2: {} @@ -11907,6 +12680,10 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.27.1 + de-indent@1.0.2: {} debug@3.2.7: @@ -11917,6 +12694,8 @@ snapshots: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + decode-named-character-reference@1.1.0: dependencies: character-entities: 2.0.2 @@ -11990,6 +12769,8 @@ snapshots: diff@5.2.0: {} + diff@8.0.2: {} + difflib@0.2.4: dependencies: heap: 0.2.7 @@ -12057,6 +12838,8 @@ snapshots: prisma: 5.22.0 react: 19.1.1 + dts-resolver@2.1.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -12069,12 +12852,16 @@ snapshots: electron-to-chromium@1.5.177: {} + emoji-regex@7.0.3: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} emojilib@2.4.0: {} + empathic@2.0.0: {} + encodeurl@2.0.0: {} end-of-stream@1.4.5: @@ -12306,31 +13093,6 @@ snapshots: transitivePeerDependencies: - supports-color - esbuild@0.17.19: - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -12382,6 +13144,32 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.4: optionalDependencies: '@esbuild/aix-ppc64': 0.25.4 @@ -12438,7 +13226,6 @@ snapshots: '@esbuild/win32-arm64': 0.25.8 '@esbuild/win32-ia32': 0.25.8 '@esbuild/win32-x64': 0.25.8 - optional: true escalade@3.2.0: {} @@ -12458,7 +13245,7 @@ snapshots: '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2) eslint: 9.27.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-react: 7.37.5(eslint@9.27.0(jiti@2.4.2)) @@ -12478,7 +13265,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 @@ -12493,14 +13280,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2) eslint: 9.27.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color @@ -12515,7 +13302,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.27.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12757,18 +13544,6 @@ snapshots: dependencies: eventsource-parser: 3.0.3 - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - execa@7.2.0: dependencies: cross-spawn: 7.0.6 @@ -12943,6 +13718,10 @@ snapshots: transitivePeerDependencies: - supports-color + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -13023,7 +13802,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@15.3.3(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + fumadocs-core@15.3.3(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@formatjs/intl-localematcher': 0.6.1 '@orama/orama': 3.1.7 @@ -13057,7 +13836,7 @@ snapshots: unist-util-visit: 5.0.0 zod: 3.25.76 - fumadocs-mdx@11.6.4(acorn@8.14.1)(fumadocs-core@15.3.3(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)): + fumadocs-mdx@11.6.4(acorn@8.14.1)(fumadocs-core@15.3.3(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1)): dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.14.1) '@standard-schema/spec': 1.0.0 @@ -13066,7 +13845,7 @@ snapshots: esbuild: 0.25.4 estree-util-value-to-estree: 3.4.0 fast-glob: 3.3.3 - fumadocs-core: 15.3.3(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + fumadocs-core: 15.3.3(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) gray-matter: 4.0.3 js-yaml: 4.1.0 lru-cache: 11.1.0 @@ -13078,11 +13857,11 @@ snapshots: - acorn - supports-color - fumadocs-twoslash@3.1.4(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(fumadocs-ui@15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2): + fumadocs-twoslash@3.1.4(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(fumadocs-ui@15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2): dependencies: '@radix-ui/react-popover': 1.1.14(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@shikijs/twoslash': 3.7.0(typescript@5.9.2) - fumadocs-ui: 15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11) + fumadocs-ui: 15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11) mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 @@ -13115,7 +13894,7 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-ui@15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11): + fumadocs-ui@15.3.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@4.1.11): dependencies: '@radix-ui/react-accordion': 1.2.10(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-collapsible': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -13128,7 +13907,7 @@ snapshots: '@radix-ui/react-slot': 1.2.3(@types/react@19.1.10)(react@19.1.1) '@radix-ui/react-tabs': 1.1.11(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) class-variance-authority: 0.7.1 - fumadocs-core: 15.3.3(@types/react@19.1.10)(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + fumadocs-core: 15.3.3(@types/react@19.1.10)(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) lodash.merge: 4.6.2 next: 15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -13423,6 +14202,8 @@ snapshots: hono@4.9.0: {} + hookable@5.5.3: {} + html-escaper@2.0.2: {} html-void-elements@3.0.0: {} @@ -13444,8 +14225,6 @@ snapshots: human-id@4.1.1: {} - human-signals@2.1.0: {} - human-signals@4.3.1: {} human-signals@8.0.1: {} @@ -13475,6 +14254,17 @@ snapshots: import-lazy@4.0.0: {} + importx@0.5.2: + dependencies: + bundle-require: 5.1.0(esbuild@0.25.8) + debug: 4.4.1 + esbuild: 0.25.8 + jiti: 2.4.2 + pathe: 2.0.3 + tsx: 4.20.3 + transitivePeerDependencies: + - supports-color + imurmurhash@0.1.4: {} inflight@1.0.6: @@ -13568,6 +14358,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-fullwidth-code-point@2.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-generator-function@1.1.0: @@ -13627,8 +14419,6 @@ snapshots: dependencies: call-bound: 1.0.4 - is-stream@2.0.1: {} - is-stream@3.0.0: {} is-stream@4.0.1: {} @@ -13768,8 +14558,6 @@ snapshots: jose@6.0.11: {} - joycon@3.1.1: {} - js-base64@3.7.7: {} js-tokens@4.0.0: {} @@ -13940,6 +14728,11 @@ snapshots: mlly: 1.7.4 pkg-types: 1.3.1 + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -13948,9 +14741,9 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.merge@4.6.2: {} + lodash.debounce@4.0.8: {} - lodash.sortby@4.7.0: {} + lodash.merge@4.6.2: {} lodash.startcase@4.4.0: {} @@ -14636,7 +15429,7 @@ snapshots: optionalDependencies: '@rollup/rollup-linux-x64-gnu': 4.40.2 - next-auth@4.24.11(next@15.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next-auth@4.24.11(next@15.4.6(@babel/core@7.27.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.27.1 '@panva/hkdf': 1.2.1 @@ -14706,10 +15499,6 @@ snapshots: normalize-path@3.0.0: {} - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -14867,6 +15656,19 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-parser@0.36.0: + dependencies: + '@oxc-project/types': 0.36.0 + optionalDependencies: + '@oxc-parser/binding-darwin-arm64': 0.36.0 + '@oxc-parser/binding-darwin-x64': 0.36.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.36.0 + '@oxc-parser/binding-linux-arm64-musl': 0.36.0 + '@oxc-parser/binding-linux-x64-gnu': 0.36.0 + '@oxc-parser/binding-linux-x64-musl': 0.36.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.36.0 + '@oxc-parser/binding-win32-x64-msvc': 0.36.0 + oxc-resolver@9.0.2: optionalDependencies: '@oxc-resolver/binding-darwin-arm64': 9.0.2 @@ -14913,6 +15715,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -14968,6 +15774,8 @@ snapshots: path-browserify@1.0.1: {} + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -14994,6 +15802,8 @@ snapshots: path-type@4.0.0: {} + pathe@1.1.2: {} + pathe@2.0.3: {} pathval@2.0.0: {} @@ -15010,8 +15820,6 @@ snapshots: pify@4.0.1: {} - pirates@4.0.7: {} - pkce-challenge@5.0.0: {} pkg-types@1.3.1: @@ -15028,13 +15836,6 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-load-config@3.1.4(postcss@8.5.6): - dependencies: - lilconfig: 2.1.0 - yaml: 1.10.2 - optionalDependencies: - postcss: 8.5.6 - postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 @@ -15173,6 +15974,8 @@ snapshots: quansync@0.2.10: {} + quansync@0.2.11: {} + querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -15422,6 +16225,8 @@ snapshots: require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + requires-port@1.0.0: {} resolve-from@4.0.0: {} @@ -15449,16 +16254,71 @@ snapshots: reusify@1.1.0: {} + rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.33)(typescript@5.9.2): + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + ast-kit: 2.1.2 + birpc: 2.5.0 + debug: 4.4.1 + dts-resolver: 2.1.1 + get-tsconfig: 4.10.1 + rolldown: 1.0.0-beta.33 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.13-commit.024b632: + dependencies: + '@oxc-project/runtime': 0.72.3 + '@oxc-project/types': 0.72.3 + '@rolldown/pluginutils': 1.0.0-beta.13-commit.024b632 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-darwin-arm64': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-darwin-x64': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.13-commit.024b632 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.13-commit.024b632 + + rolldown@1.0.0-beta.33: + dependencies: + '@oxc-project/runtime': 0.82.2 + '@oxc-project/types': 0.82.2 + '@rolldown/pluginutils': 1.0.0-beta.33 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.33 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.33 + '@rolldown/binding-darwin-x64': 1.0.0-beta.33 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.33 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.33 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.33 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.33 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.33 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.33 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.33 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.33 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.33 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.33 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.33 + rollup-plugin-preserve-directives@0.4.0(rollup@4.40.2): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.40.2) magic-string: 0.30.17 rollup: 4.40.2 - rollup@3.29.5: - optionalDependencies: - fsevents: 2.3.3 - rollup@4.40.2: dependencies: '@types/estree': 1.0.7 @@ -15503,6 +16363,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + sade@1.8.1: dependencies: mri: 1.2.0 @@ -15576,6 +16440,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + set-cookie-parser@2.7.1: {} set-function-length@1.2.2: @@ -15606,7 +16472,7 @@ snapshots: dependencies: '@antfu/ni': 23.3.1 '@babel/core': 7.27.7 - '@babel/parser': 7.27.7 + '@babel/parser': 7.28.3 '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.7) '@modelcontextprotocol/sdk': 1.17.2 commander: 10.0.1 @@ -15670,6 +16536,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + shiki@3.4.2: dependencies: '@shikijs/core': 3.4.2 @@ -15779,12 +16647,10 @@ snapshots: source-map@0.7.4: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} + spawn-command@0.0.2: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -15821,6 +16687,12 @@ snapshots: string-argv@0.3.2: {} + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -15898,6 +16770,10 @@ snapshots: is-obj: 3.0.0 is-regexp: 3.1.0 + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -15910,8 +16786,6 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} strip-final-newline@4.0.0: {} @@ -15950,16 +16824,6 @@ snapshots: optionalDependencies: '@babel/core': 7.27.7 - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - ts-interface-checker: 0.1.13 - superjson@2.2.2: dependencies: copy-anything: 3.0.5 @@ -16030,6 +16894,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -16051,6 +16921,8 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.0.1: {} + tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -16068,8 +16940,12 @@ snapshots: tinypool@1.1.1: {} + tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} + tinyspy@3.0.2: {} + tinyspy@4.0.3: {} tmp@0.0.33: @@ -16096,10 +16972,6 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -16110,8 +16982,6 @@ snapshots: dependencies: typescript: 5.9.2 - ts-interface-checker@0.1.13: {} - ts-morph@18.0.0: dependencies: '@ts-morph/common': 0.19.0 @@ -16141,30 +17011,52 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.8.1: {} - - tsup@6.7.0(postcss@8.5.6)(typescript@5.9.2): + tsdown@0.14.1(publint@0.3.12)(typescript@5.9.2): dependencies: - bundle-require: 4.2.1(esbuild@0.17.19) + ansis: 4.1.0 cac: 6.7.14 - chokidar: 3.6.0 + chokidar: 4.0.3 debug: 4.4.1 - esbuild: 0.17.19 - execa: 5.1.1 - globby: 11.1.0 - joycon: 3.1.1 - postcss-load-config: 3.1.4(postcss@8.5.6) - resolve-from: 5.0.0 - rollup: 3.29.5 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 + diff: 8.0.2 + empathic: 2.0.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.33 + rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.33)(typescript@5.9.2) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.14 tree-kill: 1.2.2 + unconfig: 7.3.2 optionalDependencies: - postcss: 8.5.6 + publint: 0.3.12 typescript: 5.9.2 transitivePeerDependencies: + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc + + tsdown@0.3.1(oxc-transform@0.75.1)(rollup@4.40.2)(typescript@5.9.2): + dependencies: + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.1 + picocolors: 1.1.1 + pkg-types: 1.3.1 + rolldown: 1.0.0-beta.13-commit.024b632 + tinyglobby: 0.2.14 + unconfig: 0.6.1 + unplugin-isolated-decl: 0.7.2(oxc-transform@0.75.1)(rollup@4.40.2)(typescript@5.9.2) + unplugin-unused: 0.2.3(rollup@4.40.2) + transitivePeerDependencies: + - '@swc/core' + - oxc-transform + - rollup - supports-color - - ts-node + - typescript + + tslib@2.8.1: {} tsx@4.20.3: dependencies: @@ -16172,7 +17064,6 @@ snapshots: get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 - optional: true tunnel-agent@0.6.0: dependencies: @@ -16285,6 +17176,21 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + unconfig@0.6.1: + dependencies: + '@antfu/utils': 8.1.1 + defu: 6.1.4 + importx: 0.5.2 + transitivePeerDependencies: + - supports-color + + unconfig@7.3.2: + dependencies: + '@quansync/fs': 0.1.5 + defu: 6.1.4 + jiti: 2.4.2 + quansync: 0.2.10 + uncrypto@0.1.3: {} undici-types@6.21.0: {} @@ -16338,6 +17244,35 @@ snapshots: unpipe@1.0.0: {} + unplugin-isolated-decl@0.7.2(oxc-transform@0.75.1)(rollup@4.40.2)(typescript@5.9.2): + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.40.2) + debug: 4.4.1 + magic-string: 0.30.17 + oxc-parser: 0.36.0 + unplugin: 1.16.1 + optionalDependencies: + oxc-transform: 0.75.1 + typescript: 5.9.2 + transitivePeerDependencies: + - rollup + - supports-color + + unplugin-unused@0.2.3(rollup@4.40.2): + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.40.2) + js-tokens: 9.0.1 + picocolors: 1.1.1 + pkg-types: 1.3.1 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + + unplugin@1.16.1: + dependencies: + acorn: 8.14.1 + webpack-virtual-modules: 0.6.2 + unrs-resolver@1.7.9: dependencies: napi-postinstall: 0.2.4 @@ -16410,6 +17345,24 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + vite-node@2.1.9(@types/node@22.17.1)(lightningcss@1.30.1): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.19(@types/node@22.17.1)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@3.2.4(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 @@ -16486,6 +17439,16 @@ snapshots: - supports-color - typescript + vite@5.4.19(@types/node@22.17.1)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.40.2 + optionalDependencies: + '@types/node': 22.17.1 + fsevents: 2.3.3 + lightningcss: 1.30.1 + vite@6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.4 @@ -16518,6 +17481,43 @@ snapshots: tsx: 4.20.3 yaml: 2.8.0 + vitest@2.1.9(@types/node@22.17.1)(@vitest/ui@3.2.4(vitest@3.2.4))(happy-dom@15.11.7)(lightningcss@1.30.1)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2)): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2))(vite@5.4.19(@types/node@22.17.1)(lightningcss@1.30.1)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + debug: 4.4.1 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.19(@types/node@22.17.1)(lightningcss@1.30.1) + vite-node: 2.1.9(@types/node@22.17.1)(lightningcss@1.30.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.17.1 + '@vitest/ui': 3.2.4(vitest@3.2.4) + happy-dom: 15.11.7 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.17.1)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.1)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.2))(tsx@4.20.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 @@ -16616,17 +17616,11 @@ snapshots: web-streams-polyfill@3.3.3: {} - webidl-conversions@4.0.2: {} - webidl-conversions@7.0.0: {} - whatwg-mimetype@3.0.0: {} + webpack-virtual-modules@0.6.2: {} - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 + whatwg-mimetype@3.0.0: {} which-boxed-primitive@1.1.1: dependencies: @@ -16659,6 +17653,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 + which-module@2.0.1: {} + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 @@ -16682,6 +17678,12 @@ snapshots: wordwrap@1.0.0: {} + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -16704,6 +17706,8 @@ snapshots: ws@8.18.2: {} + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -16712,15 +17716,31 @@ snapshots: yallist@5.0.0: {} - yaml@1.10.2: {} - yaml@2.8.0: optional: true + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} + yargs@13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + yargs@16.2.0: dependencies: cliui: 7.0.4 diff --git a/tsconfig.json b/tsconfig.json index fa5a93fd..a363aeb1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,7 @@ /* EMIT RULES */ "outDir": "./dist", - "noEmit": true, // TSUP takes care of emitting js for us, in a MUCH faster way + "noEmit": true, "declaration": true, "declarationMap": true, "sourceMap": true,