@fumadocs/cli 1.3.2 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/build/index.d.ts +4 -6
  2. package/dist/build/index.d.ts.map +1 -1
  3. package/dist/build/index.js +10 -18
  4. package/dist/build/index.js.map +1 -1
  5. package/dist/{client-YTcWP1iz.js → client-C2A4Jf2w.js} +1 -1
  6. package/dist/{client-YTcWP1iz.js.map → client-C2A4Jf2w.js.map} +1 -1
  7. package/dist/{config-Dyass4D9.d.ts → config-Bx-m6awG.d.ts} +9 -5
  8. package/dist/config-Bx-m6awG.d.ts.map +1 -0
  9. package/dist/config.d.ts +2 -2
  10. package/dist/config.js +74 -1
  11. package/dist/config.js.map +1 -0
  12. package/dist/{fs-CigSthjp.js → fs-C3j4H046.js} +1 -1
  13. package/dist/{fs-CigSthjp.js.map → fs-C3j4H046.js.map} +1 -1
  14. package/dist/{ast-BRNdmLn5.js → import-CSbSteB3.js} +56 -2
  15. package/dist/import-CSbSteB3.js.map +1 -0
  16. package/dist/index.js +13 -15
  17. package/dist/index.js.map +1 -1
  18. package/dist/installer-BWoLnsXE.js +673 -0
  19. package/dist/installer-BWoLnsXE.js.map +1 -0
  20. package/dist/registry/client.d.ts +17 -9
  21. package/dist/registry/client.d.ts.map +1 -1
  22. package/dist/registry/client.js +1 -1
  23. package/dist/registry/installer/index.d.ts +17 -27
  24. package/dist/registry/installer/index.d.ts.map +1 -1
  25. package/dist/registry/installer/index.js +1 -3
  26. package/dist/registry/macros/route-handler.d.ts +21 -0
  27. package/dist/registry/macros/route-handler.d.ts.map +1 -0
  28. package/dist/registry/macros/route-handler.js +11 -0
  29. package/dist/registry/macros/route-handler.js.map +1 -0
  30. package/dist/registry/schema.d.ts +2 -2
  31. package/dist/registry/schema.js +14 -11
  32. package/dist/registry/schema.js.map +1 -1
  33. package/dist/{schema-DrgqlhpT.d.ts → schema-BAaUX4uu.d.ts} +21 -10
  34. package/dist/schema-BAaUX4uu.d.ts.map +1 -0
  35. package/dist/schema.json +1 -0
  36. package/dist/types-79PW0lgM.d.ts +6 -0
  37. package/dist/types-79PW0lgM.d.ts.map +1 -0
  38. package/package.json +6 -6
  39. package/dist/ast-BRNdmLn5.js.map +0 -1
  40. package/dist/config-BYrMmXOw.js +0 -55
  41. package/dist/config-BYrMmXOw.js.map +0 -1
  42. package/dist/config-Dyass4D9.d.ts.map +0 -1
  43. package/dist/installer-B3-my9zN.js +0 -248
  44. package/dist/installer-B3-my9zN.js.map +0 -1
  45. package/dist/schema/default.json +0 -1
  46. package/dist/schema/src.json +0 -1
  47. package/dist/schema-DrgqlhpT.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer-BWoLnsXE.js","names":[],"sources":["../src/registry/installer/dep-manager.ts","../src/utils/format.ts","../src/registry/macros/route-handler.build.ts","../src/utils/framework.ts","../src/registry/installer/index.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport { x } from 'tinyexec';\nimport path from 'node:path';\nimport { detect, type AgentName } from 'package-manager-detector';\n\ninterface PackageJsonType {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nexport async function createDeps(\n cwd: string,\n dependencies: Record<string, string | null>,\n devDependencies: Record<string, string | null>,\n) {\n const packageJsonPath = path.join(cwd, 'package.json');\n const packageJson = await fs\n .readFile(packageJsonPath)\n .then((res) => JSON.parse(res.toString()) as PackageJsonType)\n .catch(() => null);\n\n return new DependencyManager(cwd, packageJson, dependencies, devDependencies);\n}\n\nexport class DependencyManager {\n readonly dependencies: string[];\n readonly devDependencies: string[];\n\n constructor(\n private readonly cwd: string,\n private readonly packageJson: PackageJsonType | null,\n dependencies: Record<string, string | null>,\n devDependencies: Record<string, string | null>,\n ) {\n const installedDeps = {\n ...packageJson?.dependencies,\n ...packageJson?.devDependencies,\n };\n\n this.dependencies = Object.entries(dependencies)\n .filter(([k]) => !(k in installedDeps))\n .map(([k, v]) => encodeDep(k, v));\n\n this.devDependencies = Object.entries(devDependencies)\n .filter(([k]) => !(k in installedDeps))\n .map(([k, v]) => encodeDep(k, v));\n }\n\n hasRequired() {\n return this.dependencies.length > 0 || this.devDependencies.length > 0;\n }\n\n async writeRequired(packageJsonPath = path.resolve(this.cwd, 'package.json')) {\n if (this.packageJson === null) return false;\n\n for (const dep of this.dependencies) {\n const { name, version } = decodeDep(dep);\n this.packageJson.dependencies ??= {};\n this.packageJson.dependencies[name] ??= version;\n }\n\n for (const dep of this.devDependencies) {\n const { name, version } = decodeDep(dep);\n this.packageJson.devDependencies ??= {};\n this.packageJson.devDependencies[name] ??= version;\n }\n\n await fs.writeFile(packageJsonPath, JSON.stringify(this.packageJson, null, 2));\n }\n\n async installRequired(packageManager?: AgentName) {\n packageManager ??= (await detect())?.name ?? 'npm';\n\n if (this.dependencies.length > 0) await x(packageManager, ['install', ...this.dependencies]);\n if (this.devDependencies.length > 0)\n await x(packageManager, ['install', ...this.devDependencies, '-D']);\n }\n}\n\nfunction encodeDep(name: string, version: string | null): string {\n return version === null || version.length === 0 ? name : `${name}@${version}`;\n}\n\nfunction decodeDep(dep: string) {\n const idx = dep.indexOf('@', 1);\n if (idx === -1) {\n return { name: dep, version: 'latest' };\n } else {\n return { name: dep.slice(0, idx), version: dep.slice(idx + 1) };\n }\n}\n","export function indent(code: string, tab: number = 1) {\n const prefix = ' '.repeat(tab);\n return code\n .split('\\n')\n .map((v) => (v.length === 0 ? v : prefix + v))\n .join('\\n');\n}\n\nexport function dedent(code: string): string {\n const lines = code.split('\\n');\n const minIndent = lines.reduce((min, line) => {\n const match = line.match(/^(\\s*)\\S/);\n return match ? Math.min(min, match[1].length) : min;\n }, Infinity);\n\n return minIndent === Infinity\n ? lines.join('\\n')\n : lines.map((l) => l.slice(minIndent)).join('\\n');\n}\n","import path from 'node:path';\nimport MagicString from 'magic-string';\nimport { Visitor } from 'oxc-parser';\nimport type {\n Argument,\n CallExpression,\n Expression,\n ImportDeclaration,\n ObjectExpression,\n ParamPattern,\n Program,\n Statement,\n} from '@oxc-project/types';\nimport type { Framework } from '@/config';\nimport type { RouteHandlerHttpMethod, StaticInfo } from './route-handler';\nimport { dedent, indent } from '@/utils/format';\nimport { collectMacroBindings } from '@/utils/ast';\n\nconst reactRouterLoaderMethods = new Set(['GET', 'HEAD', 'OPTIONS']);\nconst reactRouterActionMethods = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\n\nexport type ParsedRouteInfo = StaticInfo<string, string | undefined>;\n\nfunction collectRouteHandlerCalls(program: Program, locals: Set<string>): CallExpression[] {\n const calls: CallExpression[] = [];\n new Visitor({\n CallExpression(node: CallExpression) {\n if (node.callee.type !== 'Identifier') return;\n if (!locals.has(node.callee.name)) return;\n calls.push(node);\n },\n }).visit(program);\n return calls;\n}\n\nfunction isSameCall(init: Expression | null | undefined, call: CallExpression): boolean {\n if (!init || init.type !== 'CallExpression') return false;\n return init.start === call.start && init.end === call.end;\n}\n\nfunction findStatementSpanForCall(\n program: Program,\n call: CallExpression,\n): { start: number; end: number } | null {\n for (const stmt of program.body) {\n const span = statementSpanIfContainsCall(stmt, call);\n if (span) return span;\n }\n return null;\n}\n\nfunction statementSpanIfContainsCall(\n stmt: Statement,\n call: CallExpression,\n): { start: number; end: number } | null {\n if (stmt.type === 'ExportNamedDeclaration' && stmt.declaration?.type === 'VariableDeclaration') {\n for (const d of stmt.declaration.declarations) {\n if (isSameCall(d.init, call)) return { start: stmt.start, end: stmt.end };\n }\n }\n if (stmt.type === 'VariableDeclaration') {\n for (const d of stmt.declarations) {\n if (isSameCall(d.init, call)) return { start: stmt.start, end: stmt.end };\n }\n }\n return null;\n}\n\nfunction objectPropertyKeyName(key: ObjectExpression['properties'][number]): string | null {\n if (key.type !== 'Property') return null;\n const k = key.key;\n if (k.type === 'Identifier') return k.name;\n if (k.type === 'Literal' && typeof k.value === 'string') return k.value;\n return null;\n}\n\n/**\n * Read `methods`, `params`, and optional `catchAll` from the `$routeHandler` info object literal (AST).\n */\nfunction parseRouteInfoFromAst(info: ObjectExpression): ParsedRouteInfo {\n let methods: string[] | undefined;\n let params: string[] | undefined;\n let catchAll: string | undefined;\n\n for (const prop of info.properties) {\n if (prop.type !== 'Property') continue;\n const name = objectPropertyKeyName(prop);\n if (name === 'methods') {\n if (prop.value.type !== 'ArrayExpression') {\n throw new Error(\n 'route-handler.build: `methods` in $routeHandler info must be an array literal',\n );\n }\n const out: string[] = [];\n for (const el of prop.value.elements) {\n if (el == null) continue;\n if (el.type === 'Literal' && typeof el.value === 'string') {\n out.push(el.value);\n continue;\n }\n throw new Error(\n 'route-handler.build: `methods` must be string literals (e.g. methods: [\"GET\", \"POST\"])',\n );\n }\n methods = out;\n }\n if (name === 'params') {\n if (prop.value.type !== 'ArrayExpression') {\n throw new Error('route-handler.build: `params` must be an array literal');\n }\n const out: string[] = [];\n for (const el of prop.value.elements) {\n if (el == null) continue;\n if (el.type === 'Literal' && typeof el.value === 'string') {\n out.push(el.value);\n continue;\n }\n throw new Error('route-handler.build: `params` must be string literals');\n }\n params = out;\n }\n if (name === 'catchAll') {\n if (prop.value.type === 'Literal' && typeof prop.value.value === 'string') {\n catchAll = prop.value.value;\n continue;\n }\n throw new Error('route-handler.build: `catchAll` must be a string literal');\n }\n }\n\n if (!methods?.length) {\n throw new Error(\n 'route-handler.build: $routeHandler info must include a non-empty `methods` array',\n );\n }\n if (!params) {\n throw new Error(\n 'route-handler.build: $routeHandler info must include a `params` array literal',\n );\n }\n\n return { methods: methods as RouteHandlerHttpMethod[], params, catchAll };\n}\n\nfunction needsRouteParams(info: ParsedRouteInfo): boolean {\n return info.params.length > 0 || Boolean(info.catchAll);\n}\n\nfunction encodeKey(key: string): string {\n if (key.includes('-')) {\n return JSON.stringify(key);\n }\n return key;\n}\n\nfunction bindingNameFromParam(p: ParamPattern): string | null {\n if (p.type === 'Identifier') return p.name;\n return null;\n}\n\ninterface HandlerInfo {\n requestName: string;\n paramsName: string | null;\n bodyText: string;\n}\n\nfunction parseHandlerFromAst(s: MagicString, expr: Argument): HandlerInfo {\n const isFn = expr.type === 'FunctionExpression';\n const isArrow = expr.type === 'ArrowFunctionExpression';\n if (!isFn && !isArrow) {\n throw new Error(\n 'route-handler.build: second argument to $routeHandler must be a function or async arrow function',\n );\n }\n const fn = expr;\n if (!fn.async) {\n throw new Error('route-handler.build: route handler must be async');\n }\n if (isFn && (!fn.body || fn.body.type !== 'BlockStatement')) {\n throw new Error('route-handler.build: function handler must use a block body');\n }\n\n const p0 = fn.params[0];\n const p1 = fn.params[1];\n if (fn.params.length > 2) {\n throw new Error('route-handler.build: route handler must have at most two parameters');\n }\n\n const requestName = (p0 && bindingNameFromParam(p0)) || 'request';\n const paramsName = p1 ? bindingNameFromParam(p1) : null;\n if (p1 && !paramsName) {\n throw new Error(\n 'route-handler.build: unsupported parameter pattern; use a simple identifier for (request, params)',\n );\n }\n\n const body = fn.body;\n let bodyText: string;\n\n if (body == null) {\n throw new Error('route-handler.build: handler has no body');\n } else if (body.type === 'BlockStatement') {\n bodyText = s.original\n .slice(body.start + 1, body.end - 1)\n .replace(/^\\s*?\\n/, '')\n .replace(/\\n\\s*?$/, '');\n } else if (fn.type === 'ArrowFunctionExpression') {\n const expr = s.original.slice(body.start, body.end);\n bodyText = `return ${expr};`;\n } else {\n throw new Error('route-handler.build: could not extract handler body');\n }\n\n return { requestName, paramsName, bodyText };\n}\n\nfunction generateRequestDeclaration(framework: Framework, binding: string): string {\n if (framework === 'tanstack-start') {\n if (binding === 'ctx') {\n throw new Error(\n 'route-handler.build: name the request parameter something other than `ctx` for TanStack file routes',\n );\n }\n return `const ${binding} = ctx.request;\\n`;\n }\n if (framework === 'react-router') {\n if (binding === 'args') {\n throw new Error(\n 'route-handler.build: name the request parameter something other than `args` for React Router resource routes',\n );\n }\n return `const ${binding} = args.request;\\n`;\n }\n return '';\n}\n\nfunction generateParamsDeclaration(\n framework: Framework,\n info: ParsedRouteInfo,\n paramsBinding: string,\n): string {\n let paramsIdentifier: string;\n let paramsCatchAllIdentifier: string;\n switch (framework) {\n // no renames\n case 'next':\n return `const ${paramsBinding} = await ctx.params;\\n`;\n case 'waku':\n return `const ${paramsBinding} = context.params;\\n`;\n case 'react-router':\n paramsIdentifier = 'args.params';\n paramsCatchAllIdentifier = \"args.params['*']\";\n break;\n case 'tanstack-start':\n paramsIdentifier = 'ctx.params';\n paramsCatchAllIdentifier = 'ctx.params._splat';\n break;\n }\n\n const parts: string[] = [];\n for (const k of info.params) {\n parts.push(`${encodeKey(k)}: ${paramsIdentifier}.${k}`);\n }\n\n if (info.catchAll) {\n parts.push(`${encodeKey(info.catchAll)}: ${paramsCatchAllIdentifier}`);\n }\n\n return `const ${paramsBinding} = {\\n${indent(parts.join(',\\n'))}\\n};\\n`;\n}\n\nfunction resolveParamsBindingName(info: ParsedRouteInfo, userSecond: string | null): string | null {\n if (!needsRouteParams(info)) return null;\n return userSecond ?? 'params';\n}\n\nfunction registryRouteToTanStackCreateFileRoutePath(route: string): string {\n const segments = route.split('/');\n const parts: string[] = [];\n\n for (const seg of segments) {\n if (/^\\[\\[\\.\\.\\.[^/\\]]+\\]\\]$/.test(seg) || /^\\[\\.\\.\\.[^/\\]]+\\]$/.test(seg)) {\n parts.push('$');\n continue;\n }\n\n const m = /^\\[([^/\\]]+)\\]$/.exec(seg);\n if (m) {\n parts.push(`$${m[1]}`);\n } else {\n parts.push(seg);\n }\n }\n\n return `/${parts.join('/')}`;\n}\n\n/** URL path for `RouteContext` / `ApiContext` string literals (leading slash, App Router–style segments). */\nfunction registryRouteToUrlPath(route: string): string {\n const t = route.replace(/^\\/+/, '').replace(/\\/+$/, '');\n return t ? `/${t}` : '/';\n}\n\n/**\n * React Router typegen: `./+types/<segments>` relative to the route file (see `+types` next to `routes/`).\n */\nfunction computeReactRouterTypesSpecifier(routeFilePath: string): string {\n return `./+types/${path.basename(routeFilePath, path.extname(routeFilePath))}`;\n}\n\nfunction generateImports(framework: Framework, routeFilePath: string): string {\n const lines: string[] = [];\n if (framework === 'tanstack-start') {\n lines.push(`import { createFileRoute } from '@tanstack/react-router';`);\n }\n if (framework === 'waku') {\n lines.push(`import type { ApiContext } from 'waku/router';`);\n }\n if (framework === 'react-router') {\n lines.push(`import type { Route } from '${computeReactRouterTypesSpecifier(routeFilePath)}';`);\n }\n return lines.length ? `${lines.join('\\n')}\\n` : '';\n}\n\nfunction generateDeclaration(\n framework: Framework,\n route: string,\n parsedInfo: ParsedRouteInfo,\n handler: HandlerInfo,\n): string {\n const paramsBinding = resolveParamsBindingName(parsedInfo, handler.paramsName);\n let inner = dedent(handler.bodyText);\n if (paramsBinding) {\n inner = generateParamsDeclaration(framework, parsedInfo, paramsBinding) + inner;\n }\n inner = generateRequestDeclaration(framework, handler.requestName) + inner;\n\n const urlPath = registryRouteToUrlPath(route);\n const urlPathLiteral = JSON.stringify(urlPath);\n\n switch (framework) {\n case 'next': {\n /** `RouteContext` is provided by Next.js typed routes / `next typegen` (global). */\n const ctxType = `RouteContext<${urlPathLiteral}>`;\n return parsedInfo.methods\n .map(\n (m) =>\n `export async function ${m}(${handler.requestName}: Request, ctx: ${ctxType}) {\\n${indent(inner)}\\n}`,\n )\n .join('\\n\\n');\n }\n case 'waku': {\n const ctxType = `ApiContext<${urlPathLiteral}>`;\n return parsedInfo.methods\n .map(\n (m) =>\n `export async function ${m}(${handler.requestName}: Request, context: ${ctxType}) {\\n${indent(inner)}\\n}`,\n )\n .join('\\n\\n');\n }\n case 'tanstack-start': {\n const fileRoutePath = JSON.stringify(registryRouteToTanStackCreateFileRoutePath(route));\n const entries = parsedInfo.methods\n .map((m) => ` ${m}: async (ctx) => {\\n${indent(inner, 4)}\\n },`)\n .join('\\n');\n return `export const Route = createFileRoute(${fileRoutePath})({\\n server: {\\n handlers: {\\n${entries}\\n },\\n },\\n});\\n`;\n }\n case 'react-router': {\n const includeLoader = parsedInfo.methods.some((x) => reactRouterLoaderMethods.has(x));\n const includeAction = parsedInfo.methods.some((x) => reactRouterActionMethods.has(x));\n if (!includeLoader && !includeAction) {\n throw new Error(\n 'route-handler.build: react-router needs at least one method mapped to loader (GET/HEAD/OPTIONS) or action (POST/PUT/PATCH/DELETE)',\n );\n }\n const parts: string[] = [];\n if (includeLoader) {\n parts.push(`export async function loader(args: Route.LoaderArgs) {\\n${indent(inner)}\\n}`);\n }\n if (includeAction) {\n parts.push(`export async function action(args: Route.ActionArgs) {\\n${indent(inner)}\\n}`);\n }\n return `${parts.join('\\n\\n')}\\n`;\n }\n }\n}\n\nfunction removeMacroImport(s: MagicString, importDecl: ImportDeclaration): void {\n const start = importDecl.start;\n let end = importDecl.end;\n if (s.original[end] === '\\n') end += 1;\n s.remove(start, end);\n}\n\n/**\n * Rewrites a module that calls `$routeHandler` into framework-native route code.\n *\n * Output does not import `@fumadocs/cli`.\n *\n * Uses framework typegen where applicable: global `RouteContext` (Next typed routes), `ApiContext` (Waku),\n * inferred handler `ctx` (TanStack `createFileRoute`), `Route.LoaderArgs` / `Route.ActionArgs` (React Router `+types`).\n */\nexport function transformRouteHandler(\n route: string,\n routeFilePath: string,\n framework: Framework,\n program: Program,\n s: MagicString,\n) {\n const macro = collectMacroBindings(program, '$routeHandler');\n if (!macro) return;\n\n const calls = collectRouteHandlerCalls(program, macro.locals);\n if (calls.length === 0) return;\n if (calls.length > 1) {\n throw new Error('route-handler.build: expected exactly one $routeHandler(...) call per file');\n }\n\n const call = calls[0]!;\n if (call.arguments.length !== 2) {\n throw new Error('route-handler.build: $routeHandler must be called with (info, handler)');\n }\n\n const arg0 = call.arguments[0];\n const arg1 = call.arguments[1];\n if (arg0.type !== 'ObjectExpression') {\n throw new Error(\n 'route-handler.build: first argument to $routeHandler must be an object literal',\n );\n }\n\n const parsedInfo = parseRouteInfoFromAst(arg0);\n const handler = parseHandlerFromAst(s, arg1);\n\n const stmtSpan = findStatementSpanForCall(program, call);\n if (!stmtSpan) {\n throw new Error(\n 'route-handler.build: $routeHandler(...) must be the initializer of a const (optionally exported)',\n );\n }\n\n for (const decl of macro.importDecls) {\n removeMacroImport(s, decl);\n }\n\n const extraImports = generateImports(framework, routeFilePath);\n if (extraImports) {\n const insertPos = findInsertPositionForNewImports(program);\n if (insertPos === 0) {\n s.prepend(extraImports);\n } else {\n s.appendLeft(insertPos, `\\n${extraImports}`);\n }\n }\n\n s.overwrite(\n stmtSpan.start,\n stmtSpan.end,\n generateDeclaration(framework, route, parsedInfo, handler),\n );\n\n s.trim();\n}\n\nfunction findInsertPositionForNewImports(program: Program): number {\n const last = program.body.findLast(\n (stmt): stmt is ImportDeclaration => stmt.type === 'ImportDeclaration',\n );\n\n if (last) return last.end;\n return 0;\n}\n","import fs from 'node:fs/promises';\nimport MagicString from 'magic-string';\nimport { parse } from 'oxc-parser';\nimport type {\n Argument,\n ArrayExpression,\n ExportDefaultDeclarationKind,\n Expression,\n Program,\n} from '@oxc-project/types';\nimport type { Framework } from '@/config';\n\n/**\n * Resolves the route file path (relative to the CLI `baseDir`) from an App Router–style route string.\n *\n * @param route - The route path, e.g., \"api/auth/[[...slug]]\".\n * @param framework - Value of `framework` in CLI config.\n * @param extension - Optional file extension, default is \"ts\".\n * @returns Relative path incl. framework route root, e.g. \"app/api/foo/route.ts\" (next), \"routes/api.foo.$.ts\" (tanstack-start), or \"routes/api/foo/$.ts\" (react-router).\n */\nexport function resolveRouteFilePath(\n route: string,\n framework: Framework,\n extension: string = 'ts',\n): string {\n route = route.replace(/^\\/+/, '').replace(/\\/+$/, '');\n\n switch (framework) {\n case 'next': {\n return `app/${route}/route.${extension}`;\n }\n case 'tanstack-start': {\n let flat = route\n .replace(/\\[\\[\\.\\.\\.[^/\\]]+\\]\\]/g, '$')\n .replace(/\\[\\.\\.\\.[^/\\]]+\\]/g, '$')\n .replace(/\\[([^/\\]]+)\\]/g, (_, p1) => `$${p1}`);\n flat = flat.replaceAll('/', '.');\n return `routes/${flat}.${extension}`;\n }\n case 'react-router': {\n const rrPath = route\n .replace(/\\[\\[\\.\\.\\.[^/\\]]+\\]\\]/g, 'all')\n .replace(/\\[\\.\\.\\.[^/\\]]+\\]/g, 'all')\n .replace(/\\[([^/\\]]+)\\]/g, (_, v) => `$${v}`);\n return `app/routes/${rrPath}.${extension}`;\n }\n case 'waku': {\n const underApi = route\n .replace(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/g, '[...$1]')\n .replace(/\\[\\.\\.\\.([^\\]]+)\\]/g, '[...$1]');\n return `pages/_api/${underApi}.${extension}`;\n }\n default: {\n const _exhaustive: never = framework;\n return _exhaustive;\n }\n }\n}\n\nexport function resolveReactRouterRoute(route: string): string {\n return route\n .replace(/\\[\\[\\.\\.\\.[^/\\]]+\\]\\]/g, '*')\n .replace(/\\[\\.\\.\\.[^/\\]]+\\]/g, '*')\n .replace(/\\[([^/\\]]+)\\]/g, (_, v) => `:${v}`);\n}\n\nfunction tsSingleQuotedLiteral(value: string): string {\n return `'${value.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n}\n\nfunction unwrapExportDefaultToArrayExpression(\n decl: ExportDefaultDeclarationKind,\n): ArrayExpression | null {\n if (decl.type === 'FunctionDeclaration' || decl.type === 'ClassDeclaration') {\n return null;\n }\n let expr = decl;\n while (expr) {\n if (expr.type === 'ArrayExpression') return expr;\n if (expr.type === 'TSSatisfiesExpression' || expr.type === 'TSAsExpression') {\n expr = expr.expression;\n continue;\n }\n return null;\n }\n return null;\n}\n\nfunction parseStringArgument(expr: Argument | undefined): string | null {\n if (!expr) return null;\n if (expr.type === 'Literal' && typeof expr.value === 'string') return expr.value;\n return null;\n}\n\ntype ReactRouterRoutesItem =\n | {\n type: 'route';\n path: string;\n module: string;\n expression: Expression;\n }\n | {\n type: 'index';\n module: string;\n expression: Expression;\n };\nfunction parseReactRouterRoutesItem(item: Expression): ReactRouterRoutesItem | undefined {\n if (!item || item.type !== 'CallExpression') return;\n const callee = item.callee;\n if (callee.type !== 'Identifier') return;\n\n if (callee.name === 'route') {\n const path = parseStringArgument(item.arguments[0]);\n const module = parseStringArgument(item.arguments[1]);\n if (path === null || module === null) return;\n\n return {\n type: 'route',\n path,\n module,\n expression: item,\n };\n }\n\n if (callee.name === 'index') {\n const module = parseStringArgument(item.arguments[0]);\n if (module === null) return;\n\n return {\n type: 'index',\n module,\n expression: item,\n };\n }\n}\n\nfunction findReactRouterRoutesArray(program: Program): ArrayExpression | null {\n for (const stmt of program.body) {\n if (stmt.type !== 'ExportDefaultDeclaration') continue;\n if (stmt.declaration == null) continue;\n return unwrapExportDefaultToArrayExpression(stmt.declaration);\n }\n return null;\n}\n\nexport type AddReactRouterRouteToFileInput =\n | { kind?: 'route'; path: string; module: string }\n | { kind: 'index'; module: string };\n\nexport interface AddReactRouterRouteToFileResult {\n /** False when an equivalent entry was already present. */\n added: boolean;\n content: string;\n}\n\n/**\n * Inserts a `route(...)` or `index(...)` entry into a React Router `routes.ts` config\n * (`export default [ ... ] satisfies RouteConfig`), writing the file in place.\n *\n * New `route` entries are placed before the first `route('*', ...)` splat (if any) so the\n * catch-all remains last.\n */\nexport async function addReactRouterRouteToFile(\n routesFilePath: string,\n content: string,\n spec: AddReactRouterRouteToFileInput,\n write = true,\n): Promise<AddReactRouterRouteToFileResult> {\n const parsed = await parse(routesFilePath, content, {\n lang: routesFilePath.endsWith('.tsx') ? 'tsx' : 'ts',\n astType: 'ts',\n });\n if (parsed.errors.length > 0) {\n throw new Error(\n `addReactRouterRouteToFile: failed to parse ${routesFilePath}:\\n${parsed.errors.map((e) => e.message).join('\\n')}`,\n );\n }\n\n const array = findReactRouterRoutesArray(parsed.program);\n if (!array) {\n throw new Error(\n `addReactRouterRouteToFile: no export default array found in ${routesFilePath}`,\n );\n }\n\n const elements: ReactRouterRoutesItem[] = [];\n for (const v of array.elements) {\n if (v && v.type !== 'SpreadElement') {\n const parsed = parseReactRouterRoutesItem(v);\n if (parsed) elements.push(parsed);\n }\n }\n\n if (spec.kind === 'index') {\n if (elements.some((element) => element.type === 'index')) {\n return { added: false, content };\n }\n } else if (elements.some((element) => element.type === 'route' && element.path === spec.path)) {\n return { added: false, content };\n }\n\n const line =\n spec.kind === 'index'\n ? `index(${tsSingleQuotedLiteral(spec.module)})`\n : `route(${tsSingleQuotedLiteral(spec.path)}, ${tsSingleQuotedLiteral(spec.module)})`;\n\n const s = new MagicString(content);\n const insertAt = elements.findLast(\n (element) => element.type !== 'route' || !element.path.endsWith('*'),\n );\n\n if (!insertAt) {\n s.appendRight(array.start + 1, `\\n ${line},\\n`);\n } else {\n s.appendRight(insertAt.expression.end, `,\\n ${line}`);\n }\n\n const out = s.toString();\n if (write) {\n await fs.writeFile(routesFilePath, out, 'utf8');\n }\n\n return { added: true, content: out };\n}\n","import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { typescriptExtensions } from '@/constants';\nimport { toImportSpecifier, transformSpecifiers } from '@/utils/ast';\nimport type { Component, File } from '@/registry/schema';\nimport { HttpRegistryClient, type RegistryClient } from '@/registry/client';\nimport { x } from 'tinyexec';\nimport { createDeps } from '@/registry/installer/dep-manager';\nimport { createCache } from '@/utils/cache';\nimport { parse } from 'oxc-parser';\nimport MagicString from 'magic-string';\nimport { decodeImport, encodeImport } from '../protocols/import';\nimport type { Awaitable } from '@/types';\nimport { transformRouteHandler } from '@/registry/macros/route-handler.build';\nimport {\n addReactRouterRouteToFile,\n resolveReactRouterRoute,\n resolveRouteFilePath,\n} from '@/utils/framework';\n\ninterface PluginContext {\n installer: ComponentInstaller;\n}\n\ninterface TransformContext extends PluginContext, InstallContext {\n file: File;\n filePath: string;\n component: DownloadedComponent;\n}\n\ninterface InstallContext {\n io: IOInterface;\n importLookup: Map<string, File>;\n /** full variables of the current component. */\n $variables: Record<string, unknown>;\n /** the last item is always the current component. */\n stack: DownloadedComponent[];\n}\n\ninterface DownloadedComponent extends Component {\n $subComponents: DownloadedComponent[];\n $registry: RegistryClient;\n}\n\nexport interface ComponentInstallerPlugin {\n transform?: (file: string, context: TransformContext) => Awaitable<string>;\n transformImport?: (specifier: string, context: TransformContext) => string;\n\n /**\n * transform component before install\n */\n beforeInstall?: (\n comp: DownloadedComponent,\n context: InstallContext & PluginContext,\n ) => Awaitable<DownloadedComponent | undefined>;\n\n beforeDownload?: (\n context: PluginContext & {\n name: string;\n },\n ) => void | Promise<void>;\n\n afterDownload?: (\n context: PluginContext & {\n name: string;\n result: DownloadedComponent;\n },\n ) => void | Promise<void>;\n}\n\nexport interface IOInterface {\n onWarn: (message: string) => void;\n confirmFileOverride: (options: { path: string }) => Promise<boolean>;\n onFileDownloaded: (options: { path: string; file: File; component: Component }) => void;\n}\n\nexport interface ComponentInstallerOptions {\n plugins?: ComponentInstallerPlugin[];\n cwd?: string;\n}\n\nexport class ComponentInstaller {\n private readonly installedFiles = new Set<string>();\n private readonly downloadCache = createCache<DownloadedComponent>();\n private readonly cwd: string;\n private readonly plugins: ComponentInstallerPlugin[];\n readonly dependencies: Record<string, string | null> = {};\n readonly devDependencies: Record<string, string | null> = {};\n\n constructor(\n private readonly rootClient: RegistryClient,\n options: ComponentInstallerOptions = {},\n ) {\n this.cwd = options.cwd ?? process.cwd();\n this.plugins = options.plugins ?? [];\n }\n\n private async installComponent(comp: DownloadedComponent, ctx: InstallContext) {\n // avoid circular refs\n if (ctx.stack.indexOf(comp) !== ctx.stack.length - 1) return;\n\n const pluginCtx = { installer: this, ...ctx };\n for (const plugin of this.plugins) {\n comp = (await plugin.beforeInstall?.(comp, pluginCtx)) ?? comp;\n }\n\n Object.assign(this.dependencies, comp.dependencies);\n Object.assign(this.devDependencies, comp.devDependencies);\n\n for (const file of comp.files) {\n const outPath = this.resolveOutputPath(file);\n if (this.installedFiles.has(outPath)) continue;\n this.installedFiles.add(outPath);\n\n const output = typescriptExtensions.includes(path.extname(outPath))\n ? await this.transform(file, comp, ctx)\n : file.content;\n\n const status = await fs\n .readFile(outPath)\n .then((res) => {\n if (res.toString().trim() === output.trim()) return 'ignore';\n return 'need-update';\n })\n .catch(() => 'write');\n\n if (status === 'ignore') continue;\n\n if (status === 'need-update') {\n const override = await ctx.io.confirmFileOverride({ path: outPath });\n if (!override) continue;\n }\n\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.writeFile(outPath, output);\n ctx.io.onFileDownloaded({ path: outPath, file, component: comp });\n }\n\n for (const child of comp.$subComponents) {\n const stack = [...ctx.stack, child];\n const variables = { ...ctx.$variables };\n if (child.$registry.registryId !== comp.$registry.registryId) {\n const info = await child.$registry.fetchRegistryInfo();\n Object.assign(variables, info.variables);\n }\n Object.assign(variables, child.variables);\n\n await this.installComponent(child, { ...ctx, stack, $variables: variables });\n }\n }\n\n async install(name: string, io: IOInterface) {\n let downloaded: DownloadedComponent;\n // detect linked registry\n const rootInfo = await this.rootClient.fetchRegistryInfo();\n const registry = rootInfo.registries?.find((registry) => name.startsWith(`${registry}/`));\n\n if (registry) {\n downloaded = await this.download(\n name.slice(registry.length + 1),\n this.rootClient.createLinkedRegistryClient(registry),\n );\n } else {\n downloaded = await this.download(name, this.rootClient);\n }\n\n const allComponents = new Set<DownloadedComponent>();\n function scan(comp: DownloadedComponent) {\n if (allComponents.has(comp)) return;\n\n allComponents.add(comp);\n for (const child of comp.$subComponents) scan(child);\n }\n\n scan(downloaded);\n\n const importLookup = new Map<string, File>();\n for (const comp of allComponents) {\n for (const file of comp.files) {\n importLookup.set(encodeImport(file), file);\n }\n }\n\n const info = await downloaded.$registry.fetchRegistryInfo();\n await this.installComponent(downloaded, {\n importLookup,\n io,\n $variables: { ...info.env, ...downloaded.variables },\n stack: [downloaded],\n });\n }\n\n deps() {\n return createDeps(this.cwd, this.dependencies, this.devDependencies);\n }\n\n async onEnd() {\n const config = this.rootClient.config;\n if (config.commands.format) {\n await x(config.commands.format);\n }\n }\n\n /**\n * download component & its sub components\n */\n private async download(name: string, client: RegistryClient): Promise<DownloadedComponent> {\n return this.downloadCache.cached(\n JSON.stringify([client.registryId, name]),\n async (presolve) => {\n for (const plugin of this.plugins) {\n await plugin.beforeDownload?.({\n installer: this,\n name,\n });\n }\n\n const comp = await client.fetchComponent(name);\n const result: DownloadedComponent = {\n ...comp,\n $registry: client,\n $subComponents: [],\n };\n // place it before downloading child components to avoid recursive downloads\n presolve(result);\n\n result.$subComponents = await Promise.all(\n comp.subComponents.map((sub) => {\n if (typeof sub === 'string') return this.download(sub, client);\n\n let subClient: RegistryClient;\n if (this.rootClient instanceof HttpRegistryClient) {\n const baseUrl = new URL(sub.baseUrl, `${this.rootClient.baseUrl}/`).href;\n subClient =\n client instanceof HttpRegistryClient && client.baseUrl === baseUrl\n ? client\n : new HttpRegistryClient(baseUrl, client.config);\n } else {\n subClient = new HttpRegistryClient(sub.baseUrl, client.config);\n }\n\n return this.download(sub.component, subClient);\n }),\n );\n\n for (const plugin of this.plugins) {\n await plugin.afterDownload?.({\n installer: this,\n name,\n result,\n });\n }\n\n return result;\n },\n );\n }\n\n private async transform(\n file: File,\n component: DownloadedComponent,\n ctx: InstallContext,\n ): Promise<string> {\n const filePath = this.resolveOutputPath(file);\n const transformCtx: TransformContext = { installer: this, file, filePath, component, ...ctx };\n let transformed = await this.defaultTransform(file.content, transformCtx);\n\n for (const plugin of this.plugins) {\n if (!plugin.transform) continue;\n transformed = await plugin.transform(transformed, transformCtx);\n }\n\n return transformed;\n }\n\n private async defaultTransform(content: string, ctx: TransformContext) {\n const { file, importLookup, filePath, $variables, io } = ctx;\n const config = this.rootClient.config;\n const parsed = await parse(filePath, content);\n const s = new MagicString(content);\n\n transformSpecifiers(parsed.program, s, (specifier) => {\n for (const plugin of this.plugins) {\n if (plugin.transformImport) {\n specifier = plugin.transformImport(specifier, ctx);\n }\n }\n\n if (importLookup.has(specifier)) {\n let outputPath = this.resolveOutputPath(importLookup.get(specifier)!);\n\n for (const [k, v] of Object.entries($variables)) {\n if (typeof v === 'string') outputPath = outputPath.replaceAll(`<${k}>`, v);\n }\n\n return toImportSpecifier(filePath, outputPath);\n }\n\n const decoded = decodeImport(specifier);\n if ('raw' in decoded) {\n return decoded.raw;\n }\n\n io.onWarn(`cannot find the referenced file of ${specifier}`);\n return specifier;\n });\n\n if (file.type === 'route-handler') {\n transformRouteHandler(file.route, filePath, config.framework, parsed.program, s);\n\n if (config.framework === 'react-router') {\n const routesFile = path.join(this.cwd, 'app/routes.ts');\n const content = await fs\n .readFile(routesFile, 'utf-8')\n .then((res) => res.toString())\n .catch(() => null);\n\n if (content)\n await addReactRouterRouteToFile(routesFile, content, {\n path: resolveReactRouterRoute(file.route),\n module: path.relative(path.dirname(routesFile), filePath),\n });\n }\n }\n\n return s.toString();\n }\n\n private resolveOutputPath(file: File): string {\n const config = this.rootClient.config;\n if (file.type === 'route-handler') {\n const rel = resolveRouteFilePath(file.route, config.framework, 'ts');\n return path.resolve(this.cwd, config.baseDir, rel);\n }\n\n const dir = (\n {\n components: config.aliases.componentsDir,\n ui: config.aliases.uiDir,\n css: config.aliases.cssDir,\n lib: config.aliases.libDir,\n layout: config.aliases.layoutDir,\n } as const\n )[file.type];\n if (file.target) {\n return path.resolve(this.cwd, config.baseDir, file.target.replace('<dir>', dir));\n }\n\n return path.resolve(this.cwd, config.baseDir, dir, path.basename(file.path));\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { a as DownloadedRegistryInfo, i as Component } from "../schema-DrgqlhpT.js";
2
- import { n as LoadedConfig } from "../config-Dyass4D9.js";
1
+ import { a as DownloadedRegistryInfo, i as Component } from "../schema-BAaUX4uu.js";
2
+ import { r as LoadedConfig } from "../config-Bx-m6awG.js";
3
3
 
4
4
  //#region src/registry/client.d.ts
5
5
  interface RegistryClient {
@@ -34,12 +34,16 @@ declare class HttpRegistryClient implements RegistryClient {
34
34
  }>;
35
35
  fetchComponent(name: string): Promise<{
36
36
  name: string;
37
- files: {
38
- type: "components" | "lib" | "css" | "route" | "ui" | "layout";
37
+ files: ({
38
+ type: "components" | "lib" | "css" | "ui" | "layout";
39
39
  path: string;
40
40
  content: string;
41
41
  target?: string | undefined;
42
- }[];
42
+ } | {
43
+ type: "route-handler";
44
+ route: string;
45
+ content: string;
46
+ })[];
43
47
  dependencies: Record<string, string | null>;
44
48
  devDependencies: Record<string, string | null>;
45
49
  subComponents: (string | {
@@ -51,7 +55,7 @@ declare class HttpRegistryClient implements RegistryClient {
51
55
  description?: string | undefined;
52
56
  variables?: Record<string, unknown> | undefined;
53
57
  }>;
54
- hasComponent(name: string): Promise<boolean>;
58
+ hasComponent(name: string): Promise<any>;
55
59
  createLinkedRegistryClient(name: string): HttpRegistryClient;
56
60
  }
57
61
  declare class LocalRegistryClient implements RegistryClient {
@@ -79,12 +83,16 @@ declare class LocalRegistryClient implements RegistryClient {
79
83
  }>;
80
84
  fetchComponent(name: string): Promise<{
81
85
  name: string;
82
- files: {
83
- type: "components" | "lib" | "css" | "route" | "ui" | "layout";
86
+ files: ({
87
+ type: "components" | "lib" | "css" | "ui" | "layout";
84
88
  path: string;
85
89
  content: string;
86
90
  target?: string | undefined;
87
- }[];
91
+ } | {
92
+ type: "route-handler";
93
+ route: string;
94
+ content: string;
95
+ })[];
88
96
  dependencies: Record<string, string | null>;
89
97
  devDependencies: Record<string, string | null>;
90
98
  subComponents: (string | {
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","names":[],"sources":["../../src/registry/client.ts"],"mappings":";;;;UAWiB,cAAA;EAAA,SACN,UAAA;EAAA,SACA,MAAA,EAAQ,YAAA;EACjB,iBAAA,QAAyB,OAAA,CAAQ,sBAAA;EACjC,cAAA,GAAiB,IAAA,aAAiB,OAAA,CAAQ,SAAA;EAC1C,YAAA,GAAe,IAAA,aAAiB,OAAA;EAChC,0BAAA,GAA6B,YAAA,aAAyB,cAAA;AAAA;AAAA,cAK3C,kBAAA,YAA8B,cAAA;EAAA,SAI9B,OAAA;EAAA,SACA,MAAA,EAAQ,YAAA;EAAA,SAJV,UAAA;cAGE,OAAA,UACA,MAAA,EAAQ,YAAA;EAKb,iBAAA,CAAkB,OAAA,YAAsB,OAAA;;;;;;;;;;;;;;;;;EAaxC,cAAA,CAAe,IAAA,WAAY,OAAA;;;;;;;;;;;;;;;;;;;EAgB3B,YAAA,CAAa,IAAA,WAAY,OAAA;EAM/B,0BAAA,CAA2B,IAAA,WAAY,kBAAA;AAAA;AAAA,cAK5B,mBAAA,YAA+B,cAAA;EAAA,iBAKvB,GAAA;EAAA,SACR,MAAA,EAAQ,YAAA;EAAA,SALV,UAAA;EAAA,QACD,YAAA;cAGW,GAAA,UACR,MAAA,EAAQ,YAAA;EAKb,iBAAA,CAAkB,GAAA,YAAc,OAAA;;;;;;;;;;;;;;;;;EAgBhC,cAAA,CAAe,IAAA,WAAY,OAAA;;;;;;;;;;;;;;;;;;;EAY3B,YAAA,CAAa,IAAA,WAAY,OAAA;EAU/B,0BAAA,CAA2B,IAAA,WAAY,mBAAA;AAAA"}
1
+ {"version":3,"file":"client.d.ts","names":[],"sources":["../../src/registry/client.ts"],"mappings":";;;;UAWiB,cAAA;EAAA,SACN,UAAA;EAAA,SACA,MAAA,EAAQ,YAAA;EACjB,iBAAA,QAAyB,OAAA,CAAQ,sBAAA;EACjC,cAAA,GAAiB,IAAA,aAAiB,OAAA,CAAQ,SAAA;EAC1C,YAAA,GAAe,IAAA,aAAiB,OAAA;EAChC,0BAAA,GAA6B,YAAA,aAAyB,cAAA;AAAA;AAAA,cAK3C,kBAAA,YAA8B,cAAA;EAAA,SAI9B,OAAA;EAAA,SACA,MAAA,EAAQ,YAAA;EAAA,SAJV,UAAA;cAGE,OAAA,UACA,MAAA,EAAQ,YAAA;EAKb,iBAAA,CAAkB,OAAA,YAAsB,OAAA;;;;;;;;;;;;;;;;;EAaxC,cAAA,CAAe,IAAA,WAAY,OAAA;;;;;;;;;;;;;;;;;;;;;;;EAgB3B,YAAA,CAAa,IAAA,WAAY,OAAA;EAM/B,0BAAA,CAA2B,IAAA,WAAY,kBAAA;AAAA;AAAA,cAK5B,mBAAA,YAA+B,cAAA;EAAA,iBAKvB,GAAA;EAAA,SACR,MAAA,EAAQ,YAAA;EAAA,SALV,UAAA;EAAA,QACD,YAAA;cAGW,GAAA,UACR,MAAA,EAAQ,YAAA;EAKb,iBAAA,CAAkB,GAAA,YAAc,OAAA;;;;;;;;;;;;;;;;;EAgBhC,cAAA,CAAe,IAAA,WAAY,OAAA;;;;;;;;;;;;;;;;;;;;;;;EAY3B,YAAA,CAAa,IAAA,WAAY,OAAA;EAU/B,0BAAA,CAA2B,IAAA,WAAY,mBAAA;AAAA"}
@@ -1,2 +1,2 @@
1
- import { n as LocalRegistryClient, t as HttpRegistryClient } from "../client-YTcWP1iz.js";
1
+ import { n as LocalRegistryClient, t as HttpRegistryClient } from "../client-C2A4Jf2w.js";
2
2
  export { HttpRegistryClient, LocalRegistryClient };
@@ -1,25 +1,22 @@
1
- import { i as Component, o as File } from "../../schema-DrgqlhpT.js";
1
+ import { i as Component, o as File } from "../../schema-BAaUX4uu.js";
2
+ import { t as Awaitable } from "../../types-79PW0lgM.js";
2
3
  import { RegistryClient } from "../client.js";
3
- import { ParseResult } from "oxc-parser";
4
4
  import { AgentName } from "package-manager-detector";
5
- import MagicString from "magic-string";
6
5
 
7
- //#region src/utils/get-package-manager.d.ts
8
- type PackageManager = AgentName;
9
- //#endregion
10
6
  //#region src/registry/installer/dep-manager.d.ts
7
+ interface PackageJsonType {
8
+ dependencies?: Record<string, string>;
9
+ devDependencies?: Record<string, string>;
10
+ }
11
11
  declare class DependencyManager {
12
12
  private readonly cwd;
13
- private installedDeps;
14
- dependencies: string[];
15
- devDependencies: string[];
16
- packageManager: PackageManager;
17
- constructor(cwd: string);
18
- init(deps: Record<string, string | null>, devDeps: Record<string, string | null>): Promise<void>;
19
- private resolveRequiredDependencies;
13
+ private readonly packageJson;
14
+ readonly dependencies: string[];
15
+ readonly devDependencies: string[];
16
+ constructor(cwd: string, packageJson: PackageJsonType | null, dependencies: Record<string, string | null>, devDependencies: Record<string, string | null>);
20
17
  hasRequired(): boolean;
21
- writeRequired(): Promise<false | undefined>;
22
- installRequired(): Promise<void>;
18
+ writeRequired(packageJsonPath?: any): Promise<false | undefined>;
19
+ installRequired(packageManager?: AgentName): Promise<void>;
23
20
  }
24
21
  //#endregion
25
22
  //#region src/registry/installer/index.d.ts
@@ -27,14 +24,13 @@ interface PluginContext {
27
24
  installer: ComponentInstaller;
28
25
  }
29
26
  interface TransformContext extends PluginContext, InstallContext {
30
- s: MagicString;
31
- parsed: ParseResult;
32
27
  file: File;
28
+ filePath: string;
33
29
  component: DownloadedComponent;
34
30
  }
35
31
  interface InstallContext {
36
- pathToFile: Map<string, File>;
37
32
  io: IOInterface;
33
+ importLookup: Map<string, File>;
38
34
  /** full variables of the current component. */
39
35
  $variables: Record<string, unknown>;
40
36
  /** the last item is always the current component. */
@@ -44,16 +40,9 @@ interface DownloadedComponent extends Component {
44
40
  $subComponents: DownloadedComponent[];
45
41
  $registry: RegistryClient;
46
42
  }
47
- type Awaitable<T> = T | Promise<T>;
48
43
  interface ComponentInstallerPlugin {
49
- /**
50
- * transform file before writing (before default transformation)
51
- */
52
- beforeTransform?: (context: TransformContext) => Awaitable<void>;
53
- /**
54
- * transform file before writing (after default transformation)
55
- */
56
- afterTransform?: (context: TransformContext) => Awaitable<void>;
44
+ transform?: (file: string, context: TransformContext) => Awaitable<string>;
45
+ transformImport?: (specifier: string, context: TransformContext) => string;
57
46
  /**
58
47
  * transform component before install
59
48
  */
@@ -99,6 +88,7 @@ declare class ComponentInstaller {
99
88
  */
100
89
  private download;
101
90
  private transform;
91
+ private defaultTransform;
102
92
  private resolveOutputPath;
103
93
  }
104
94
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/utils/get-package-manager.ts","../../../src/registry/installer/dep-manager.ts","../../../src/registry/installer/index.ts"],"mappings":";;;;;;;KAEY,cAAA,GAAiB,SAAA;;;cCQhB,iBAAA;EAAA,iBAMkB,GAAA;EAAA,QALrB,aAAA;EACR,YAAA;EACA,eAAA;EACA,cAAA,EAAgB,cAAA;cAEa,GAAA;EAEvB,IAAA,CAAK,IAAA,EAAM,MAAA,yBAA+B,OAAA,EAAS,MAAA,0BAA6B,OAAA;EAAA,QAyB9E,2BAAA;EAMR,WAAA,CAAA;EAIM,aAAA,CAAA,GAAa,OAAA;EAuBb,eAAA,CAAA,GAAe,OAAA;AAAA;;;UChEb,aAAA;EACR,SAAA,EAAW,kBAAA;AAAA;AAAA,UAGH,gBAAA,SAAyB,aAAA,EAAe,cAAA;EAChD,CAAA,EAAG,WAAA;EACH,MAAA,EAAQ,WAAA;EACR,IAAA,EAAM,IAAA;EACN,SAAA,EAAW,mBAAA;AAAA;AAAA,UAGH,cAAA;EACR,UAAA,EAAY,GAAA,SAAY,IAAA;EACxB,EAAA,EAAI,WAAA;EDfwB;ECiB5B,UAAA,EAAY,MAAA;EDbI;ECehB,KAAA,EAAO,mBAAA;AAAA;AAAA,UAGC,mBAAA,SAA4B,SAAA;EACpC,cAAA,EAAgB,mBAAA;EAChB,SAAA,EAAW,cAAA;AAAA;AAAA,KAGR,SAAA,MAAe,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,UAEf,wBAAA;ED5BP;;;ECgCR,eAAA,IAAmB,OAAA,EAAS,gBAAA,KAAqB,SAAA;ED7BjC;;;ECkChB,cAAA,IAAkB,OAAA,EAAS,gBAAA,KAAqB,SAAA;ED9B/B;;;ECmCjB,aAAA,IACE,IAAA,EAAM,mBAAA,EACN,OAAA,EAAS,cAAA,GAAiB,aAAA,KACvB,SAAA,CAAU,mBAAA;EAEf,cAAA,IACE,OAAA,EAAS,aAAA;IACP,IAAA;EAAA,aAEQ,OAAA;EAEZ,aAAA,IACE,OAAA,EAAS,aAAA;IACP,IAAA;IACA,MAAA,EAAQ,mBAAA;EAAA,aAEA,OAAA;AAAA;AAAA,UAGG,WAAA;EACf,MAAA,GAAS,OAAA;EACT,mBAAA,GAAsB,OAAA;IAAW,IAAA;EAAA,MAAmB,OAAA;EACpD,gBAAA,GAAmB,OAAA;IAAW,IAAA;IAAc,IAAA,EAAM,IAAA;IAAM,SAAA,EAAW,SAAA;EAAA;AAAA;AAAA,UAGpD,yBAAA;EACf,OAAA,GAAU,wBAAA;EACV,GAAA;AAAA;AAAA,cAGW,kBAAA;EAAA,iBASQ,UAAA;EAAA,iBARF,cAAA;EAAA,iBACA,aAAA;EAAA,iBACA,GAAA;EAAA,iBACA,OAAA;EAAA,SACR,YAAA,EAAc,MAAA;EAAA,SACd,eAAA,EAAiB,MAAA;cAGP,UAAA,EAAY,cAAA,EAC7B,OAAA,GAAS,yBAAA;EAAA,QAMG,gBAAA;EAsDR,OAAA,CAAQ,IAAA,UAAc,EAAA,EAAI,WAAA,GAAW,OAAA;EAuCrC,IAAA,CAAA,GAAI,OAAA,CAAA,iBAAA;EAMJ,KAAA,CAAA,GAAK,OAAA;EAlLX;;;EAAA,QA4Lc,QAAA;EAAA,QAoDA,SAAA;EAAA,QA2CN,iBAAA;AAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/registry/installer/dep-manager.ts","../../../src/registry/installer/index.ts"],"mappings":";;;;;;UAKU,eAAA;EACR,YAAA,GAAe,MAAA;EACf,eAAA,GAAkB,MAAA;AAAA;AAAA,cAiBP,iBAAA;EAAA,iBAKQ,GAAA;EAAA,iBACA,WAAA;EAAA,SALV,YAAA;EAAA,SACA,eAAA;cAGU,GAAA,UACA,WAAA,EAAa,eAAA,SAC9B,YAAA,EAAc,MAAA,yBACd,eAAA,EAAiB,MAAA;EAgBnB,WAAA,CAAA;EAIM,aAAA,CAAc,eAAA,SAAwD,OAAA;EAkBtE,eAAA,CAAgB,cAAA,GAAiB,SAAA,GAAS,OAAA;AAAA;;;UClDxC,aAAA;EACR,SAAA,EAAW,kBAAA;AAAA;AAAA,UAGH,gBAAA,SAAyB,aAAA,EAAe,cAAA;EAChD,IAAA,EAAM,IAAA;EACN,QAAA;EACA,SAAA,EAAW,mBAAA;AAAA;AAAA,UAGH,cAAA;EACR,EAAA,EAAI,WAAA;EACJ,YAAA,EAAc,GAAA,SAAY,IAAA;EDzBF;EC2BxB,UAAA,EAAY,MAAA;EDVD;ECYX,KAAA,EAAO,mBAAA;AAAA;AAAA,UAGC,mBAAA,SAA4B,SAAA;EACpC,cAAA,EAAgB,mBAAA;EAChB,SAAA,EAAW,cAAA;AAAA;AAAA,UAGI,wBAAA;EACf,SAAA,IAAa,IAAA,UAAc,OAAA,EAAS,gBAAA,KAAqB,SAAA;EACzD,eAAA,IAAmB,SAAA,UAAmB,OAAA,EAAS,gBAAA;EDwBC;;;ECnBhD,aAAA,IACE,IAAA,EAAM,mBAAA,EACN,OAAA,EAAS,cAAA,GAAiB,aAAA,KACvB,SAAA,CAAU,mBAAA;EAEf,cAAA,IACE,OAAA,EAAS,aAAA;IACP,IAAA;EAAA,aAEQ,OAAA;EAEZ,aAAA,IACE,OAAA,EAAS,aAAA;IACP,IAAA;IACA,MAAA,EAAQ,mBAAA;EAAA,aAEA,OAAA;AAAA;AAAA,UAGG,WAAA;EACf,MAAA,GAAS,OAAA;EACT,mBAAA,GAAsB,OAAA;IAAW,IAAA;EAAA,MAAmB,OAAA;EACpD,gBAAA,GAAmB,OAAA;IAAW,IAAA;IAAc,IAAA,EAAM,IAAA;IAAM,SAAA,EAAW,SAAA;EAAA;AAAA;AAAA,UAGpD,yBAAA;EACf,OAAA,GAAU,wBAAA;EACV,GAAA;AAAA;AAAA,cAGW,kBAAA;EAAA,iBASQ,UAAA;EAAA,iBARF,cAAA;EAAA,iBACA,aAAA;EAAA,iBACA,GAAA;EAAA,iBACA,OAAA;EAAA,SACR,YAAA,EAAc,MAAA;EAAA,SACd,eAAA,EAAiB,MAAA;cAGP,UAAA,EAAY,cAAA,EAC7B,OAAA,GAAS,yBAAA;EAAA,QAMG,gBAAA;EAsDR,OAAA,CAAQ,IAAA,UAAc,EAAA,EAAI,WAAA,GAAW,OAAA;EAyC3C,IAAA,CAAA,GAAI,OAAA,CAzCuC,iBAAA;EA6CrC,KAAA,CAAA,GAAK,OAAA;EA5KsB;;;EAAA,QAsLnB,QAAA;EAAA,QAoDA,SAAA;EAAA,QAiBA,gBAAA;EAAA,QAqDN,iBAAA;AAAA"}
@@ -1,4 +1,2 @@
1
- import "../../ast-BRNdmLn5.js";
2
- import "../../client-YTcWP1iz.js";
3
- import { t as ComponentInstaller } from "../../installer-B3-my9zN.js";
1
+ import { t as ComponentInstaller } from "../../installer-BWoLnsXE.js";
4
2
  export { ComponentInstaller };
@@ -0,0 +1,21 @@
1
+ import { t as Awaitable } from "../../types-79PW0lgM.js";
2
+
3
+ //#region src/registry/macros/route-handler.d.ts
4
+ type RouteHandlerHttpMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS';
5
+ interface StaticInfo<Params extends string, CatchAll extends string | undefined> {
6
+ params: Params[];
7
+ catchAll?: CatchAll;
8
+ /**
9
+ * HTTP verbs this route implements.
10
+ */
11
+ methods: readonly RouteHandlerHttpMethod[];
12
+ }
13
+ type RouteHandler<Params extends string, CatchAll extends string | undefined> = (request: Request, params: RouteHandlerParams<Params, CatchAll>) => Awaitable<Response>;
14
+ type RouteHandlerParams<Params extends string, CatchAll extends string | undefined> = Record<Params, string> & (CatchAll extends string ? Record<CatchAll, string[] | undefined> : unknown);
15
+ declare function $routeHandler<Params extends string, CatchAll extends string | undefined = undefined>(info: StaticInfo<Params, CatchAll>, handler: RouteHandler<NoInfer<Params>, NoInfer<CatchAll>>): {
16
+ info: StaticInfo<Params, CatchAll>;
17
+ handler: RouteHandler<NoInfer<Params>, NoInfer<CatchAll>>;
18
+ };
19
+ //#endregion
20
+ export { $routeHandler, RouteHandlerHttpMethod, StaticInfo };
21
+ //# sourceMappingURL=route-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-handler.d.ts","names":[],"sources":["../../../src/registry/macros/route-handler.ts"],"mappings":";;;KAEY,sBAAA;AAAA,UASK,UAAA;EACf,MAAA,EAAQ,MAAA;EACR,QAAA,GAAW,QAAA;;;;EAIX,OAAA,WAAkB,sBAAA;AAAA;AAAA,KAGf,YAAA,gEACH,OAAA,EAAS,OAAA,EACT,MAAA,EAAQ,kBAAA,CAAmB,MAAA,EAAQ,QAAA,MAChC,SAAA,CAAU,QAAA;AAAA,KAEV,kBAAA,+DAAiF,MAAA,CACpF,MAAA,aAGC,QAAA,kBAA0B,MAAA,CAAO,QAAA;AAAA,iBAEpB,aAAA,wEAAA,CAGd,IAAA,EAAM,UAAA,CAAW,MAAA,EAAQ,QAAA,GAAW,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,QAAA"}
@@ -0,0 +1,11 @@
1
+ //#region src/registry/macros/route-handler.ts
2
+ function $routeHandler(info, handler) {
3
+ return {
4
+ info,
5
+ handler
6
+ };
7
+ }
8
+ //#endregion
9
+ export { $routeHandler };
10
+
11
+ //# sourceMappingURL=route-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-handler.js","names":[],"sources":["../../../src/registry/macros/route-handler.ts"],"sourcesContent":["import type { Awaitable } from '@/types';\n\nexport type RouteHandlerHttpMethod =\n | 'GET'\n | 'HEAD'\n | 'POST'\n | 'PUT'\n | 'PATCH'\n | 'DELETE'\n | 'OPTIONS';\n\nexport interface StaticInfo<Params extends string, CatchAll extends string | undefined> {\n params: Params[];\n catchAll?: CatchAll;\n /**\n * HTTP verbs this route implements.\n */\n methods: readonly RouteHandlerHttpMethod[];\n}\n\ntype RouteHandler<Params extends string, CatchAll extends string | undefined> = (\n request: Request,\n params: RouteHandlerParams<Params, CatchAll>,\n) => Awaitable<Response>;\n\ntype RouteHandlerParams<Params extends string, CatchAll extends string | undefined> = Record<\n Params,\n string\n> &\n (CatchAll extends string ? Record<CatchAll, string[] | undefined> : unknown);\n\nexport function $routeHandler<\n Params extends string,\n CatchAll extends string | undefined = undefined,\n>(info: StaticInfo<Params, CatchAll>, handler: RouteHandler<NoInfer<Params>, NoInfer<CatchAll>>) {\n return {\n info,\n handler,\n };\n}\n"],"mappings":";AA+BA,SAAgB,cAGd,MAAoC,SAA2D;AAC/F,QAAO;EACL;EACA;EACD"}
@@ -1,2 +1,2 @@
1
- import { a as DownloadedRegistryInfo, c as componentSchema, d as indexSchema, f as namespaces, i as Component, l as fileSchema, n as CompiledFile, o as File, p as registryInfoSchema, r as CompiledRegistryInfo, s as NamespaceType, t as CompiledComponent, u as httpSubComponent } from "../schema-DrgqlhpT.js";
2
- export { CompiledComponent, CompiledFile, CompiledRegistryInfo, Component, DownloadedRegistryInfo, File, NamespaceType, componentSchema, fileSchema, httpSubComponent, indexSchema, namespaces, registryInfoSchema };
1
+ import { a as DownloadedRegistryInfo, c as fileSchema, d as registryInfoSchema, f as routeFileSchema, i as Component, l as httpSubComponent, n as CompiledFile, o as File, r as CompiledRegistryInfo, s as componentSchema, t as CompiledComponent, u as indexSchema } from "../schema-BAaUX4uu.js";
2
+ export { CompiledComponent, CompiledFile, CompiledRegistryInfo, Component, DownloadedRegistryInfo, File, componentSchema, fileSchema, httpSubComponent, indexSchema, registryInfoSchema, routeFileSchema };
@@ -1,24 +1,27 @@
1
1
  import { z } from "zod";
2
2
  //#region src/registry/schema.ts
3
- const namespaces = [
4
- "components",
5
- "lib",
6
- "css",
7
- "route",
8
- "ui",
9
- "layout"
10
- ];
11
3
  const indexSchema = z.object({
12
4
  name: z.string(),
13
5
  title: z.string().optional(),
14
6
  description: z.string().optional()
15
7
  });
8
+ const routeFileSchema = z.object({
9
+ type: z.literal("route-handler"),
10
+ route: z.string(),
11
+ content: z.string()
12
+ });
16
13
  const fileSchema = z.object({
17
- type: z.literal(namespaces),
14
+ type: z.literal([
15
+ "components",
16
+ "lib",
17
+ "css",
18
+ "ui",
19
+ "layout"
20
+ ]),
18
21
  path: z.string(),
19
22
  target: z.string().optional(),
20
23
  content: z.string()
21
- });
24
+ }).or(routeFileSchema);
22
25
  const httpSubComponent = z.object({
23
26
  type: z.literal("http"),
24
27
  baseUrl: z.string(),
@@ -42,6 +45,6 @@ const registryInfoSchema = z.object({
42
45
  registries: z.array(z.string()).optional()
43
46
  });
44
47
  //#endregion
45
- export { componentSchema, fileSchema, httpSubComponent, indexSchema, namespaces, registryInfoSchema };
48
+ export { componentSchema, fileSchema, httpSubComponent, indexSchema, registryInfoSchema, routeFileSchema };
46
49
 
47
50
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../src/registry/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type NamespaceType = (typeof namespaces)[number];\nexport type CompiledFile = z.input<typeof fileSchema>;\nexport type CompiledComponent = z.input<typeof componentSchema>;\nexport type CompiledRegistryInfo = z.input<typeof registryInfoSchema>;\nexport type DownloadedRegistryInfo = z.output<typeof registryInfoSchema>;\nexport type File = z.output<typeof fileSchema>;\nexport type Component = z.output<typeof componentSchema>;\n\nexport const namespaces = ['components', 'lib', 'css', 'route', 'ui', 'layout'] as const;\n\nexport const indexSchema = z.object({\n name: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport const fileSchema = z.object({\n type: z.literal(namespaces),\n path: z.string(),\n target: z.string().optional(),\n content: z.string(),\n});\n\nexport const httpSubComponent = z.object({\n type: z.literal('http'),\n baseUrl: z.string(),\n component: z.string(),\n});\n\nexport const componentSchema = z.object({\n name: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n files: z.array(fileSchema),\n dependencies: z.record(z.string(), z.string().or(z.null())),\n devDependencies: z.record(z.string(), z.string().or(z.null())),\n /**\n * list of sub components, either local (component name) or remote (registry info & component name)\n */\n subComponents: z.array(z.string().or(httpSubComponent)).default([]),\n\n /**\n * override variables for the current component & its sub components.\n *\n * this is powerful to customise how sub components are installed vs. installing them directly.\n */\n variables: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const registryInfoSchema = z.object({\n /**\n * define metadata for variables, variables can be referenced in the target path of component files, or in plugins.\n */\n variables: z\n .record(\n z.string(),\n z.object({\n description: z.string().optional(),\n }),\n )\n .optional(),\n /**\n * override variables for all components.\n */\n env: z.record(z.string(), z.unknown()).optional(),\n indexes: z.array(indexSchema).default([]),\n unlistedIndexes: z.array(indexSchema).default([]),\n\n registries: z.array(z.string()).optional(),\n});\n"],"mappings":";;AAUA,MAAa,aAAa;CAAC;CAAc;CAAO;CAAO;CAAS;CAAM;CAAS;AAE/E,MAAa,cAAc,EAAE,OAAO;CAClC,MAAM,EAAE,QAAQ;CAChB,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,aAAa,EAAE,QAAQ,CAAC,UAAU;CACnC,CAAC;AAEF,MAAa,aAAa,EAAE,OAAO;CACjC,MAAM,EAAE,QAAQ,WAAW;CAC3B,MAAM,EAAE,QAAQ;CAChB,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,MAAM,EAAE,QAAQ,OAAO;CACvB,SAAS,EAAE,QAAQ;CACnB,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO;CACtC,MAAM,EAAE,QAAQ;CAChB,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,OAAO,EAAE,MAAM,WAAW;CAC1B,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;CAC3D,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;CAI9D,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC;CAOnE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACxD,CAAC;AAEF,MAAa,qBAAqB,EAAE,OAAO;CAIzC,WAAW,EACR,OACC,EAAE,QAAQ,EACV,EAAE,OAAO,EACP,aAAa,EAAE,QAAQ,CAAC,UAAU,EACnC,CAAC,CACH,CACA,UAAU;CAIb,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACjD,SAAS,EAAE,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;CACzC,iBAAiB,EAAE,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;CAEjD,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC3C,CAAC"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../src/registry/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type CompiledFile = z.input<typeof fileSchema>;\nexport type CompiledComponent = z.input<typeof componentSchema>;\nexport type CompiledRegistryInfo = z.input<typeof registryInfoSchema>;\nexport type DownloadedRegistryInfo = z.output<typeof registryInfoSchema>;\nexport type File = z.output<typeof fileSchema>;\nexport type Component = z.output<typeof componentSchema>;\n\nexport const indexSchema = z.object({\n name: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport const routeFileSchema = z.object({\n type: z.literal('route-handler'),\n route: z.string(),\n content: z.string(),\n});\n\nexport const fileSchema = z\n .object({\n type: z.literal(['components', 'lib', 'css', 'ui', 'layout']),\n path: z.string(),\n target: z.string().optional(),\n content: z.string(),\n })\n .or(routeFileSchema);\n\nexport const httpSubComponent = z.object({\n type: z.literal('http'),\n baseUrl: z.string(),\n component: z.string(),\n});\n\nexport const componentSchema = z.object({\n name: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n files: z.array(fileSchema),\n dependencies: z.record(z.string(), z.string().or(z.null())),\n devDependencies: z.record(z.string(), z.string().or(z.null())),\n /**\n * list of sub components, either local (component name) or remote (registry info & component name)\n */\n subComponents: z.array(z.string().or(httpSubComponent)).default([]),\n\n /**\n * override variables for the current component & its sub components.\n *\n * this is powerful to customise how sub components are installed vs. installing them directly.\n */\n variables: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const registryInfoSchema = z.object({\n /**\n * define metadata for variables, variables can be referenced in the target path of component files, or in plugins.\n */\n variables: z\n .record(\n z.string(),\n z.object({\n description: z.string().optional(),\n }),\n )\n .optional(),\n /**\n * override variables for all components.\n */\n env: z.record(z.string(), z.unknown()).optional(),\n indexes: z.array(indexSchema).default([]),\n unlistedIndexes: z.array(indexSchema).default([]),\n\n registries: z.array(z.string()).optional(),\n});\n"],"mappings":";;AASA,MAAa,cAAc,EAAE,OAAO;CAClC,MAAM,EAAE,QAAQ;CAChB,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,aAAa,EAAE,QAAQ,CAAC,UAAU;CACnC,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO;CACtC,MAAM,EAAE,QAAQ,gBAAgB;CAChC,OAAO,EAAE,QAAQ;CACjB,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,MAAa,aAAa,EACvB,OAAO;CACN,MAAM,EAAE,QAAQ;EAAC;EAAc;EAAO;EAAO;EAAM;EAAS,CAAC;CAC7D,MAAM,EAAE,QAAQ;CAChB,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,SAAS,EAAE,QAAQ;CACpB,CAAC,CACD,GAAG,gBAAgB;AAEtB,MAAa,mBAAmB,EAAE,OAAO;CACvC,MAAM,EAAE,QAAQ,OAAO;CACvB,SAAS,EAAE,QAAQ;CACnB,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO;CACtC,MAAM,EAAE,QAAQ;CAChB,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,OAAO,EAAE,MAAM,WAAW;CAC1B,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;CAC3D,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;CAI9D,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC;CAOnE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACxD,CAAC;AAEF,MAAa,qBAAqB,EAAE,OAAO;CAIzC,WAAW,EACR,OACC,EAAE,QAAQ,EACV,EAAE,OAAO,EACP,aAAa,EAAE,QAAQ,CAAC,UAAU,EACnC,CAAC,CACH,CACA,UAAU;CAIb,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACjD,SAAS,EAAE,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;CACzC,iBAAiB,EAAE,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;CAEjD,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC3C,CAAC"}
@@ -1,25 +1,32 @@
1
1
  import { z } from "zod";
2
2
 
3
3
  //#region src/registry/schema.d.ts
4
- type NamespaceType = (typeof namespaces)[number];
5
4
  type CompiledFile = z.input<typeof fileSchema>;
6
5
  type CompiledComponent = z.input<typeof componentSchema>;
7
6
  type CompiledRegistryInfo = z.input<typeof registryInfoSchema>;
8
7
  type DownloadedRegistryInfo = z.output<typeof registryInfoSchema>;
9
8
  type File = z.output<typeof fileSchema>;
10
9
  type Component = z.output<typeof componentSchema>;
11
- declare const namespaces: readonly ["components", "lib", "css", "route", "ui", "layout"];
12
10
  declare const indexSchema: z.ZodObject<{
13
11
  name: z.ZodString;
14
12
  title: z.ZodOptional<z.ZodString>;
15
13
  description: z.ZodOptional<z.ZodString>;
16
14
  }, z.core.$strip>;
17
- declare const fileSchema: z.ZodObject<{
18
- type: z.ZodLiteral<"components" | "lib" | "css" | "route" | "ui" | "layout">;
15
+ declare const routeFileSchema: z.ZodObject<{
16
+ type: z.ZodLiteral<"route-handler">;
17
+ route: z.ZodString;
18
+ content: z.ZodString;
19
+ }, z.core.$strip>;
20
+ declare const fileSchema: z.ZodUnion<[z.ZodObject<{
21
+ type: z.ZodLiteral<"components" | "lib" | "css" | "ui" | "layout">;
19
22
  path: z.ZodString;
20
23
  target: z.ZodOptional<z.ZodString>;
21
24
  content: z.ZodString;
22
- }, z.core.$strip>;
25
+ }, z.core.$strip>, z.ZodObject<{
26
+ type: z.ZodLiteral<"route-handler">;
27
+ route: z.ZodString;
28
+ content: z.ZodString;
29
+ }, z.core.$strip>]>;
23
30
  declare const httpSubComponent: z.ZodObject<{
24
31
  type: z.ZodLiteral<"http">;
25
32
  baseUrl: z.ZodString;
@@ -29,12 +36,16 @@ declare const componentSchema: z.ZodObject<{
29
36
  name: z.ZodString;
30
37
  title: z.ZodOptional<z.ZodString>;
31
38
  description: z.ZodOptional<z.ZodString>;
32
- files: z.ZodArray<z.ZodObject<{
33
- type: z.ZodLiteral<"components" | "lib" | "css" | "route" | "ui" | "layout">;
39
+ files: z.ZodArray<z.ZodUnion<[z.ZodObject<{
40
+ type: z.ZodLiteral<"components" | "lib" | "css" | "ui" | "layout">;
34
41
  path: z.ZodString;
35
42
  target: z.ZodOptional<z.ZodString>;
36
43
  content: z.ZodString;
37
- }, z.core.$strip>>;
44
+ }, z.core.$strip>, z.ZodObject<{
45
+ type: z.ZodLiteral<"route-handler">;
46
+ route: z.ZodString;
47
+ content: z.ZodString;
48
+ }, z.core.$strip>]>>;
38
49
  dependencies: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNull]>>;
39
50
  devDependencies: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNull]>>;
40
51
  subComponents: z.ZodDefault<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
@@ -62,5 +73,5 @@ declare const registryInfoSchema: z.ZodObject<{
62
73
  registries: z.ZodOptional<z.ZodArray<z.ZodString>>;
63
74
  }, z.core.$strip>;
64
75
  //#endregion
65
- export { DownloadedRegistryInfo as a, componentSchema as c, indexSchema as d, namespaces as f, Component as i, fileSchema as l, CompiledFile as n, File as o, registryInfoSchema as p, CompiledRegistryInfo as r, NamespaceType as s, CompiledComponent as t, httpSubComponent as u };
66
- //# sourceMappingURL=schema-DrgqlhpT.d.ts.map
76
+ export { DownloadedRegistryInfo as a, fileSchema as c, registryInfoSchema as d, routeFileSchema as f, Component as i, httpSubComponent as l, CompiledFile as n, File as o, CompiledRegistryInfo as r, componentSchema as s, CompiledComponent as t, indexSchema as u };
77
+ //# sourceMappingURL=schema-BAaUX4uu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-BAaUX4uu.d.ts","names":[],"sources":["../src/registry/schema.ts"],"mappings":";;;KAEY,YAAA,GAAe,CAAA,CAAE,KAAA,QAAa,UAAA;AAAA,KAC9B,iBAAA,GAAoB,CAAA,CAAE,KAAA,QAAa,eAAA;AAAA,KACnC,oBAAA,GAAuB,CAAA,CAAE,KAAA,QAAa,kBAAA;AAAA,KACtC,sBAAA,GAAyB,CAAA,CAAE,MAAA,QAAc,kBAAA;AAAA,KACzC,IAAA,GAAO,CAAA,CAAE,MAAA,QAAc,UAAA;AAAA,KACvB,SAAA,GAAY,CAAA,CAAE,MAAA,QAAc,eAAA;AAAA,cAE3B,WAAA,EAAW,CAAA,CAAA,SAAA;;;;;cAMX,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;cAMf,UAAA,EAAU,CAAA,CAAA,QAAA,EAAA,CAAA,CAAA,SAAA;;;;;;;;;;cASV,gBAAA,EAAgB,CAAA,CAAA,SAAA;;;;;cAMhB,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;cAoBf,kBAAA,EAAkB,CAAA,CAAA,SAAA"}
@@ -0,0 +1 @@
1
+ {"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"$schema":{"default":"node_modules/@fumadocs/cli/dist/schema.json","type":"string"},"aliases":{"default":{"uiDir":"./components/ui","componentsDir":"./components","layoutDir":"./layouts","cssDir":"./styles","libDir":"./lib"},"type":"object","properties":{"uiDir":{"default":"./components/ui","type":"string"},"componentsDir":{"default":"./components/ui","type":"string"},"layoutDir":{"default":"./layouts","type":"string"},"cssDir":{"default":"./components","type":"string"},"libDir":{"default":"./lib","type":"string"}}},"baseDir":{"default":"src","type":"string"},"uiLibrary":{"default":"radix-ui","type":"string","enum":["radix-ui","base-ui"]},"framework":{"default":"next","type":"string","enum":["next","waku","react-router","tanstack-start"]},"commands":{"default":{},"type":"object","properties":{"format":{"type":"string"}}}}}
@@ -0,0 +1,6 @@
1
+ //#region src/types.d.ts
2
+ type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
3
+ type Awaitable<T> = T | Promise<T>;
4
+ //#endregion
5
+ export { DistributiveOmit as n, Awaitable as t };
6
+ //# sourceMappingURL=types-79PW0lgM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-79PW0lgM.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";KAAY,gBAAA,cAA8B,WAAA,IAAe,CAAA,mBAAoB,IAAA,CAAK,CAAA,EAAG,CAAA;AAAA,KACzE,SAAA,MAAe,CAAA,GAAI,OAAA,CAAQ,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fumadocs/cli",
3
- "version": "1.3.2",
3
+ "version": "1.3.3",
4
4
  "description": "The CLI tool for Fumadocs",
5
5
  "keywords": [
6
6
  "Docs",
@@ -22,6 +22,7 @@
22
22
  "./config": "./dist/config.js",
23
23
  "./registry/client": "./dist/registry/client.js",
24
24
  "./registry/installer": "./dist/registry/installer/index.js",
25
+ "./registry/macros/route-handler": "./dist/registry/macros/route-handler.js",
25
26
  "./registry/schema": "./dist/registry/schema.js",
26
27
  "./package.json": "./package.json"
27
28
  },
@@ -40,18 +41,17 @@
40
41
  "zod": "^4.3.6"
41
42
  },
42
43
  "devDependencies": {
43
- "@oxc-project/types": "^0.121.0",
44
+ "@oxc-project/types": "^0.122.0",
44
45
  "@types/node": "25.5.0",
45
- "shadcn": "4.1.0",
46
- "tsdown": "0.21.4",
47
- "eslint-config-custom": "0.0.0",
46
+ "shadcn": "4.1.1",
47
+ "tsdown": "0.21.6",
48
48
  "tsconfig": "0.0.0"
49
49
  },
50
50
  "scripts": {
51
51
  "build": "tsdown --config-loader unrun",
52
52
  "clean": "rimraf dist",
53
53
  "dev": "tsdown --watch --config-loader unrun",
54
- "lint": "eslint .",
54
+ "lint": "oxlint .",
55
55
  "types:check": "tsc --noEmit"
56
56
  }
57
57
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"ast-BRNdmLn5.js","names":[],"sources":["../src/constants.ts","../src/utils/ast.ts"],"sourcesContent":["export const typescriptExtensions = ['.ts', '.tsx', '.js', '.jsx'];\n","import path from 'node:path';\nimport { typescriptExtensions } from '@/constants';\nimport { type Program, Visitor } from 'oxc-parser';\nimport type MagicString from 'magic-string';\n\n/**\n * Return the import modifier for `sourceFile` to import `referenceFile`\n *\n * @example\n * ```ts\n * toReferencePath('index.ts', 'dir/hello.ts')\n * // should output './dir/hello'\n * ```\n */\nexport function toImportSpecifier(sourceFile: string, referenceFile: string): string {\n const extname = path.extname(referenceFile);\n const removeExt = typescriptExtensions.includes(extname);\n\n let importPath = path\n .relative(\n path.dirname(sourceFile),\n removeExt ? referenceFile.substring(0, referenceFile.length - extname.length) : referenceFile,\n )\n .replaceAll(path.sep, '/');\n\n if (removeExt && importPath.endsWith('/index')) {\n importPath = importPath.slice(0, -'/index'.length);\n }\n\n return importPath.startsWith('../') ? importPath : `./${importPath}`;\n}\n\nexport function transformSpecifiers(\n program: Program,\n s: MagicString,\n transformSpecifier: (value: string) => string | undefined,\n) {\n new Visitor({\n // static imports\n ImportDeclaration(node) {\n const source = node.source;\n const out = transformSpecifier(source.value);\n if (out) {\n s.update(source.start + 1, source.end - 1, out);\n source.value = out;\n }\n },\n // dynamic imports\n ImportExpression(node) {\n if (node.source.type === 'Literal') {\n const source = node.source;\n const out = transformSpecifier(source.value as string);\n if (out) {\n s.update(source.start + 1, source.end - 1, out);\n source.value = out;\n }\n }\n },\n // exports\n ExportAllDeclaration(node) {\n const source = node.source;\n const out = transformSpecifier(source.value);\n if (out) {\n s.update(source.start + 1, source.end - 1, out);\n source.value = out;\n }\n },\n ExportNamedDeclaration(node) {\n const source = node.source;\n if (!source) return;\n const out = transformSpecifier(source.value);\n if (out) {\n s.update(source.start + 1, source.end - 1, out);\n source.value = out;\n }\n },\n }).visit(program);\n}\n"],"mappings":";;;AAAA,MAAa,uBAAuB;CAAC;CAAO;CAAQ;CAAO;CAAO;;;;;;;;;;;;ACclE,SAAgB,kBAAkB,YAAoB,eAA+B;CACnF,MAAM,UAAU,KAAK,QAAQ,cAAc;CAC3C,MAAM,YAAY,qBAAqB,SAAS,QAAQ;CAExD,IAAI,aAAa,KACd,SACC,KAAK,QAAQ,WAAW,EACxB,YAAY,cAAc,UAAU,GAAG,cAAc,SAAS,QAAQ,OAAO,GAAG,cACjF,CACA,WAAW,KAAK,KAAK,IAAI;AAE5B,KAAI,aAAa,WAAW,SAAS,SAAS,CAC5C,cAAa,WAAW,MAAM,GAAG,GAAiB;AAGpD,QAAO,WAAW,WAAW,MAAM,GAAG,aAAa,KAAK;;AAG1D,SAAgB,oBACd,SACA,GACA,oBACA;AACA,KAAI,QAAQ;EAEV,kBAAkB,MAAM;GACtB,MAAM,SAAS,KAAK;GACpB,MAAM,MAAM,mBAAmB,OAAO,MAAM;AAC5C,OAAI,KAAK;AACP,MAAE,OAAO,OAAO,QAAQ,GAAG,OAAO,MAAM,GAAG,IAAI;AAC/C,WAAO,QAAQ;;;EAInB,iBAAiB,MAAM;AACrB,OAAI,KAAK,OAAO,SAAS,WAAW;IAClC,MAAM,SAAS,KAAK;IACpB,MAAM,MAAM,mBAAmB,OAAO,MAAgB;AACtD,QAAI,KAAK;AACP,OAAE,OAAO,OAAO,QAAQ,GAAG,OAAO,MAAM,GAAG,IAAI;AAC/C,YAAO,QAAQ;;;;EAKrB,qBAAqB,MAAM;GACzB,MAAM,SAAS,KAAK;GACpB,MAAM,MAAM,mBAAmB,OAAO,MAAM;AAC5C,OAAI,KAAK;AACP,MAAE,OAAO,OAAO,QAAQ,GAAG,OAAO,MAAM,GAAG,IAAI;AAC/C,WAAO,QAAQ;;;EAGnB,uBAAuB,MAAM;GAC3B,MAAM,SAAS,KAAK;AACpB,OAAI,CAAC,OAAQ;GACb,MAAM,MAAM,mBAAmB,OAAO,MAAM;AAC5C,OAAI,KAAK;AACP,MAAE,OAAO,OAAO,QAAQ,GAAG,OAAO,MAAM,GAAG,IAAI;AAC/C,WAAO,QAAQ;;;EAGpB,CAAC,CAAC,MAAM,QAAQ"}
@@ -1,55 +0,0 @@
1
- import { t as exists } from "./fs-CigSthjp.js";
2
- import fs from "node:fs/promises";
3
- import { z } from "zod";
4
- //#region src/utils/is-src.ts
5
- async function isSrc() {
6
- return exists("./src");
7
- }
8
- //#endregion
9
- //#region src/config.ts
10
- function createConfigSchema(isSrc) {
11
- const defaultAliases = {
12
- uiDir: "./components/ui",
13
- componentsDir: "./components",
14
- layoutDir: "./layouts",
15
- cssDir: "./styles",
16
- libDir: "./lib"
17
- };
18
- return z.object({
19
- $schema: z.string().default(isSrc ? "node_modules/@fumadocs/cli/dist/schema/src.json" : "node_modules/@fumadocs/cli/dist/schema/default.json").optional(),
20
- aliases: z.object({
21
- uiDir: z.string().default(defaultAliases.uiDir),
22
- componentsDir: z.string().default(defaultAliases.uiDir),
23
- layoutDir: z.string().default(defaultAliases.layoutDir),
24
- cssDir: z.string().default(defaultAliases.componentsDir),
25
- libDir: z.string().default(defaultAliases.libDir)
26
- }).default(defaultAliases),
27
- baseDir: z.string().default(isSrc ? "src" : ""),
28
- uiLibrary: z.enum(["radix-ui", "base-ui"]).default("radix-ui"),
29
- commands: z.object({ format: z.string().optional() }).default({})
30
- });
31
- }
32
- async function createOrLoadConfig(file = "./cli.json") {
33
- const inited = await initConfig(file);
34
- if (inited) return inited;
35
- const content = (await fs.readFile(file)).toString();
36
- return createConfigSchema(await isSrc()).parse(JSON.parse(content));
37
- }
38
- /**
39
- * Write new config, skip if a config already exists
40
- *
41
- * @returns the created config, `undefined` if not created
42
- */
43
- async function initConfig(file = "./cli.json", src) {
44
- if (await fs.stat(file).then(() => true).catch(() => false)) return;
45
- const defaultConfig = await getDefaultConfig(src);
46
- await fs.writeFile(file, JSON.stringify(defaultConfig, null, 2));
47
- return defaultConfig;
48
- }
49
- async function getDefaultConfig(src) {
50
- return createConfigSchema(src ?? await isSrc()).parse({});
51
- }
52
- //#endregion
53
- export { initConfig as i, createOrLoadConfig as n, getDefaultConfig as r, createConfigSchema as t };
54
-
55
- //# sourceMappingURL=config-BYrMmXOw.js.map