@kosmojs/dev 0.2.10 → 0.3.0
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.
- package/package.json +16 -16
- package/pkg/chassis.js +8 -6
- package/pkg/chassis.js.map +1 -1
- package/pkg/index.js +270 -149
- package/pkg/index.js.map +1 -1
package/pkg/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","l","u","d","f","p","m","t","n","r","s","i","a","o","e","d","f","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","n","r","a","u","l","s","i","e","o","t","d","f","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","n","r","a","u","l","s","i","e","o","j","t","u","d","f","o","l","c","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","j","M","N","P","F","I","L","R","t","n","r","s","a","i","e","d","f","s","c","o","p","u","i","m","t","n","r","h","e","d","f","u","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","j","M","N","P","F","I","L","R","t","r","i","l","s","a","n","c","z","e","d","f","p","u","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","j","M","N","P","F","I","L","R","z","t","r","i","l","s","a","n","o","c","e","g","t","r","p","o","s","m","i","c","f","h","n","a","_","l","d","u","e","p","m","h","g","_","v","y","b","x","t","r","i","f","a","o","d","n","l","s","u","c","e","l","u","d","f","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","j","M","N","P","F","I","L","t","n","r","c","o","i","a","s","e","a","o","c","l","d","f","t","n","r","i","p","m","e","u","h","_","v","S","j","R","z","B","t","r","i","l","s","a","n","o","c","e"],"sources":["../../../generators/fetch-generator/pkg/index.js","../../../generators/hono-generator/pkg/index.js","../../../generators/koa-generator/pkg/index.js","../../../generators/mdx-generator/pkg/index.js","../../../generators/openapi-generator/pkg/index.js","../../../generators/react-generator/pkg/index.js","../../../generators/solid-generator/pkg/index.js","../../../generators/ssg-generator/pkg/index.js","../../../generators/ssr-generator/pkg/index.js","../../../generators/svelte-generator/pkg/index.js","../../../generators/typebox-generator/pkg/index.js","../../../generators/vue-generator/pkg/index.js","../src/index.ts"],"sourcesContent":["import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderFactory as r,sortRoutes as i}from\"@kosmojs/lib\";import{RequestValidationTargets as a,defaults as o}from\"@kosmojs/core\";import{routeRenderHelpers as s}from\"@kosmojs/core/generators\";var c={type:`module`,private:!0,name:`@kosmojs/fetch-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/fetch-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`},devDependencies:{\"path-to-regexp\":`^8.4.2`}},l=`import { compile } from \"path-to-regexp\";\n\nimport type { ApiRouteSerialized, ValidationTarget } from \"@kosmojs/core\";\nimport type { HTTPMethod } from \"@kosmojs/core/api\";\nimport { createHost, type HostOpt, join, stringify } from \"@kosmojs/core/fetch\";\n\nexport * from \"./transport\";\n\nexport const fetchHelpers = <ParamsT extends readonly unknown[]>(\n basePath: string,\n route: ApiRouteSerialized,\n) => {\n const toPath = compile(route.pathPattern);\n\n const maybeNumber = (val: unknown) => {\n if (val === undefined || val === null) {\n return val;\n }\n const n = Number(val);\n return Number.isFinite(n) ? n : val;\n };\n\n const paramsMapper = (params: ParamsT, opt?: { coerceNumbers?: boolean }) => {\n return route.params.reduce<Record<string, unknown>>((map, name, i) => {\n const coerceNumbers = opt?.coerceNumbers\n ? route.numericProperties.params.includes(name)\n : false;\n if (Array.isArray(params[i])) {\n map[name] = coerceNumbers\n ? params[i].map((v) => maybeNumber(v))\n : params[i].map(String);\n } else if (params[i] !== undefined) {\n map[name] = coerceNumbers ? maybeNumber(params[i]) : String(params[i]);\n }\n return map;\n }, {});\n };\n\n const parametrize = (params: ParamsT) => {\n try {\n return toPath(paramsMapper(params) as never);\n } catch (error) {\n console.error(\\`❗ERROR: Failed building path for \\${route.name}\\`);\n throw error;\n }\n };\n\n const base = (params: ParamsT, query?: Record<string, unknown>) => {\n const path = join(\"/\", parametrize(params));\n return query ? [path, stringify(query)].join(\"?\") : path;\n };\n\n const path = (params: ParamsT, query?: Record<string, unknown>) => {\n return join(basePath, base(params, query));\n };\n\n const href = (\n host: HostOpt,\n params: ParamsT,\n query?: Record<string, unknown>,\n ) => {\n return createHost(host) + path(params, query);\n };\n\n const payloadResolver = <T>(\n payload: Record<ValidationTarget, T> | undefined,\n target: ValidationTarget,\n method: HTTPMethod,\n ) => {\n const data = payload?.[target];\n\n if (target === \"query\") {\n return Object.fromEntries(\n Object.entries({ ...data }).map(([k, v]) => {\n return [\n k,\n route.numericProperties.query[method]?.includes(k)\n ? Array.isArray(v)\n ? v.map((v) => maybeNumber(v))\n : maybeNumber(v)\n : v,\n ];\n }),\n );\n }\n\n if (data instanceof FormData) {\n return [...data].reduce<\n Record<string, FormDataEntryValue | Array<FormDataEntryValue>>\n >((map, [key, val]) => {\n if (key in map) {\n map[key] = [map[key]].flat().concat(val);\n } else {\n map[key] = val;\n }\n return map;\n }, {}) as T;\n }\n\n return data;\n };\n\n return {\n paramsMapper,\n parametrize,\n base,\n path,\n href,\n payloadResolver,\n };\n};\n`,u=`export const transport = undefined;\n`,d=`{{#each routes}}\nimport {{id}} from \"{{ createImport 'libApi' name 'fetch' }}\";\n{{/each}}\n\nexport { ValidationError } from \"@kosmojs/core/errors\";\n\nexport type ResponseT = {\n{{#each routes}}\n \"{{name}}\": import(\"{{ createImport 'libApi' name 'fetch' }}\").ResponseT;\n{{/each}}\n}\n\nexport default {\n{{#each routes}} \"{{name}}\": {{id}},\n{{#each alias }} \"{{this}}\": {{../id}},\n{{/each}}\n{{/each}}\n}\n`,f=`import fetchFactory, { join, stringify } from \"@kosmojs/core/fetch\";\n\nimport { base, apiBase, apiRouteMap } from \"{{ createImport 'libCore' }}\";\nimport { transport, fetchHelpers } from \"{{ createImport 'lib' '@fetch' }}\";\n\nimport {\n type MaybeWrapped,\n unwrap,\n} from \"{{ createImport 'lib' 'unwrap' }}\";\n\n{{#each validationTypes}}\nimport type { {{id}} } from \"./types\";\n{{/each}}\n\nimport { validationSchemas } from \"./schemas\";\n\nexport { ValidationError } from \"@kosmojs/core/errors\";\n\nexport { validationSchemas };\n\nexport type ParamsT = [\n {{serializeParamsTupleElements route}}\n];\n\n{{#each payloadTypes}}\nexport type {{name}} = {\n {{#each types}}{{method}}: {{id}};\n {{/each}}\n}\n{{/each}}\n\nexport type ResponseT = {\n {{#each responseTypes}}\n {{method}}: {{#each types}}{{#unless @first}}|{{/unless}} {{id}}{{/each}};\n {{/each}}\n}\n\nconst {\n paramsMapper,\n parametrize,\n payloadResolver,\n path,\n href,\n} = fetchHelpers<[{{serializeParamsTupleElements route}}]>(\n apiBase,\n apiRouteMap[\"{{route.name}}\"],\n);\n\nconst fetchApi = fetchFactory(\n join(base, apiBase),\n { transport, stringify },\n);\n\n{{#each routeMethods}}\nexport const {{method}} = (\n _params{{#if ../route.optionalParams}}?{{/if}}: MaybeWrapped<ParamsT>,\n _payload?: {\n {{#each ../payloadTargets}}\n {{#if payloadType}}\n {{target}}: {{payloadType.name}} extends { {{../method}}: unknown }\n ? MaybeWrapped<{{payloadType.name}}[\"{{../method}}\"]>\n : unknown,\n {{else}}\n {{target}}?: unknown;\n {{/if}}\n {{/each}}\n },\n opt?: {\n unwrap?: <T>(data: MaybeWrapped<T>) => T;\n },\n): Promise<\n {{#if responseType}}\n ResponseT[\"{{method}}\"]\n {{else}}\n unknown\n {{/if}}\n> => {\n const [params, payload] = [_params, _payload].map((data) => {\n return typeof opt?.unwrap === \"function\" ? opt.unwrap(data) : unwrap(data);\n })\n // validate only on client, skip double validation in SSR mode\n if (!import.meta.env.SSR) {\n if (validationSchemas.params) {\n validationSchemas.params.validate(\n paramsMapper(params as never, { coerceNumbers: true }),\n );\n }\n {{#each ../payloadTypes}}\n if (validationSchemas.{{target}}?.{{../method}}) {\n validationSchemas.{{target}}.{{../method}}.validate(\n payloadResolver(payload, \"{{target}}\", \"{{../method}}\"),\n );\n }\n {{/each}}\n }\n return fetchApi.{{method}}(parametrize(params as never), payload as never);\n};\n{{/each}}\n\nexport default {\n {{#each routeMethods}}\n {{method}},\n {{/each}}\n path,\n href,\n validationSchemas,\n};\n`,p=`export type MaybeWrapped<T> = T;\nexport const unwrap = <T>(data: T) => data;\n`,m=t(e=>{let{createPath:t,createImportHelpers:c}=n(e),{renderToFile:m}=r({helpers:{...c({origin:`lib`}),...s()}}),h=async(e,n)=>{let r=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]).sort(i);await m(t.lib(`fetch.ts`),d,{routes:r});for(let{kind:e,entry:r}of n)if(e===`apiRoute`){let e=[];for(let t of r.validationDefinitions)if(t.target===`response`)for(let{id:n,body:r,resolvedType:i}of t.variants)r&&e.push({id:n,target:t.target,method:t.method,resolvedType:i});else{let{id:n,resolvedType:r}=t.schema;e.push({id:n,target:t.target,method:t.method,resolvedType:r})}let n=r.methods.map(t=>({method:t,responseType:e.find(e=>e.target===`response`&&e.method===t)})),i=Object.entries(e.reduce((e,{id:t,target:n,method:r,resolvedType:i})=>{if([`headers`,`cookies`,`response`].includes(n))return e;let a=`${n.replace(/^./,e=>e.toUpperCase())}T`;return e[a]||(e[a]=[]),e[a].push({id:t,target:n,method:r,resolvedType:i}),e},{})).map(([e,t])=>({name:e,types:t,target:t[0].target})),o=Object.keys(a).map(e=>({target:e,payloadType:i.find(t=>t.target===e)})),s=Object.values(e.reduce((e,{id:t,target:n,method:r,resolvedType:i})=>(n===`response`&&(e[r]||(e[r]={method:r,types:[]}),e[r].types.push({id:t,target:n,method:r,resolvedType:i})),e),{}));await m(t.libApi(r.name,`fetch.ts`),f,{route:r,validationTypes:e,routeMethods:n,payloadTypes:i,payloadTargets:o,responseTypes:s})}};return{async start(){for(let[e,n]of[[`unwrap.ts`,p],[`@fetch/transport.ts`,u],[`@fetch/index.ts`,l]])await m(t.lib(e),n,{})},async watch(e,t){await h(e,t?e.filter(({kind:e,entry:n})=>t.kind===`update`&&e===`apiRoute`&&n.fileFullpath===t.file):e)},async build(e){await h(e,e)},async ssrBuild(){for(let[e,n]of[[`@fetch/transport.ts`,`export { transport } from \"${o.libPrefix}/@ssr/fetch\";`]])await m(t.lib(e),n,{})}}}),h=e({meta:{name:`Fetch`,slot:`fetch`},dependencies:{\"path-to-regexp\":c.devDependencies[`path-to-regexp`]},factory:m});export{h as default};\n//# sourceMappingURL=index.js.map","import{createHonoPattern as e,defineGenerator as t,defineGeneratorFactory as n,pathResolver as r,pathTokensFactory as i,renderFactory as a,sortRoutes as o}from\"@kosmojs/lib\";import{join as s}from\"node:path\";import c from\"crc/crc32\";import{createTemplateResolver as l}from\"@kosmojs/core\";import{routeRenderHelpers as u}from\"@kosmojs/core/generators\";var d={type:`module`,private:!0,name:`@kosmojs/hono-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/hono-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,crc:`^4.3.2`},devDependencies:{\"@hono/node-server\":`^2.1.0`,hono:`^4.13.1`,\"path-to-regexp\":`^8.4.2`,vite:`^8.2.1`}},f=`import { Hono } from \"hono\";\n\nimport type { AppFactory } from \"@kosmojs/core/api\";\n\nimport type { DefaultBindings, DefaultVariables } from \"../api\";\n\nexport type AppEnv = {\n Variables: DefaultVariables;\n Bindings: DefaultBindings;\n};\n\nexport type App = Hono<AppEnv>;\n\nexport type AppOptions = ConstructorParameters<typeof Hono<AppEnv>>[0];\n\nexport const appFactory: AppFactory<App, AppOptions> = (factory) => {\n const createApp = (options?: AppOptions) => {\n return new Hono({ strict: false, ...options });\n };\n return factory({ createApp });\n};\n`,p=`import type { DevSetup } from \"@kosmojs/core/api\";\n\nexport const devSetup = (setup: DevSetup) => setup;\n`,m=`import type { Context } from \"hono\";\n\nimport type { AppEnv } from \"./app\";\n\ntype ErrorHandler = (\n error: any,\n ctx: Context<AppEnv>,\n) => Promise<Response> | Response;\n\nexport type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;\n\nexport const errorHandlerFactory: ErrorHandlerFactory = (handler) => {\n return handler;\n};\n`,h=`import type { Context } from \"hono\";\n\nimport type { RequestBodyTarget, RequestMetadataTarget } from \"@kosmojs/core\";\nimport { parseCookies, parseQuerystring } from \"@kosmojs/core/api\";\n\nexport type BodyparserOptions = {\n json: never;\n form: { all?: boolean; dot?: boolean };\n raw: { as?: \"text\" | \"arrayBuffer\" | \"blob\" | \"formData\" };\n};\n\nexport const metaparsers: {\n [T in RequestMetadataTarget]: (ctx: Context) => unknown;\n} = {\n query(ctx) {\n return parseQuerystring(ctx.req.url);\n },\n\n headers(ctx) {\n return Object.fromEntries(ctx.req.raw.headers);\n },\n\n cookies(ctx) {\n return parseCookies(Object.fromEntries(ctx.req.raw.headers));\n },\n};\n\nexport const bodyparsers: {\n [T in RequestBodyTarget]: (\n ctx: Context,\n opt?: BodyparserOptions[T],\n ) => Promise<unknown>;\n} = {\n json(ctx) {\n return ctx.req.json();\n },\n\n form(ctx, opt) {\n return ctx.req.parseBody(opt);\n },\n\n raw(ctx, { as = \"text\" } = {}) {\n return ctx.req[as]();\n },\n};\n`,g=`import type { MiddlewareHandler } from \"hono\";\nimport type { Router } from \"hono/router\";\nimport { RegExpRouter } from \"hono/router/reg-exp-router\";\nimport { SmartRouter } from \"hono/router/smart-router\";\nimport { TrieRouter } from \"hono/router/trie-router\";\nimport { match } from \"path-to-regexp\";\n\nimport type {\n RequestBodyTarget,\n RequestMetadataTarget,\n RequestValidationTarget,\n ValidationErrorEntry,\n} from \"@kosmojs/core\";\nimport {\n type CreateRouteMiddleware,\n createRoutes,\n type HTTPMethod,\n type RouterFactory,\n StateKey,\n} from \"@kosmojs/core/api\";\nimport { ValidationError } from \"@kosmojs/core/errors\";\n\nimport {\n type DefaultBindings,\n type DefaultVariables,\n type ParameterizedContext,\n type ParameterizedMiddleware,\n use,\n} from \"../api\";\nimport { type BodyparserOptions, bodyparsers, metaparsers } from \"./parsers\";\nimport { routeSources } from \"./routes\";\n\nimport globalMiddleware from \"{{ createImport 'api' 'use' }}\";\nimport { apiRouteMap } from \"{{ createImport 'libCore' }}\";\n\n/**\n * Create route-level middleware stack that handles:\n * 1. Context extension - adds \\`ctx.bodyparser\\` (lazy, cached) and \\`ctx.validated\\` accessors\n * 2. Params validation - normalizes and validates URL params (including splat/numeric params)\n * 3. Request validation - validates query, headers, cookies, and body against schemas\n * 4. Response validation - validates outgoing response against defined variants\n *\n * Middleware are assigned named slots (e.g. \"validate:params\", \"validate:json\")\n * so they can be replaced by user-defined middleware in the stack.\n *\n * All validation errors are thrown as \\`ValidationError\\` instances,\n * caught and formatted by the global error handler middleware upstream.\n * */\nexport const createRouteMiddleware: CreateRouteMiddleware<\n ParameterizedMiddleware\n> = ({ name, pathPattern, validationSchemas }) => {\n const route = apiRouteMap[name];\n\n if (!route) {\n throw new Error(\\`createRouteMiddleware: \\${name} route does not exists\\`);\n }\n\n const { params, numericProperties } = route;\n\n const pathMatcher = match(pathPattern);\n\n const matchPath = (path: string) => {\n try {\n return pathMatcher(path);\n } catch (_e) {\n return undefined;\n }\n };\n\n const maybeNumber = (val: unknown) => {\n if (val === undefined || val === null) {\n return val;\n }\n const n = Number(val);\n return Number.isFinite(n) ? n : val;\n };\n\n const validationMiddleware = [\n /**\n * Extends Hono context with:\n *\n * - \\`ctx.metaparser[target]()\\` - lazy, cached meta parsers.\n * Each parser (query, headers, cookies) runs at most once per request;\n * subsequent calls return the cached result.\n *\n * - \\`ctx.bodyparser[target](opts?)\\` - lazy, cached body parsers.\n * Each parser (json, form, raw) runs at most once per request;\n * subsequent calls return the cached result.\n * This allows both user middleware/handlers and validators\n * to call the same parser without re-consuming the request stream.\n *\n * - \\`ctx.validated\\` - getter that returns all validated data collected so far\n * (params, query, headers, cookies, json etc.) as a plain object.\n *\n * Cache is stored on \\`ctx[StateKey]\\` (a Symbol-keyed Map) to keep it\n * hidden from public API surface and serialization.\n * */\n use(\n function useExtendContext(ctx, next) {\n if (!ctx[StateKey]) {\n // initialize per-request cache with empty params\n // (later populated by useValidateParams)\n ctx[StateKey] = new Map([[\"params\", {}]]);\n\n Object.defineProperty(ctx, \"metaparser\", {\n value: Object.entries(metaparsers).reduce<{\n [T in RequestMetadataTarget]?: () => unknown;\n }>((map, entry) => {\n const [target, parser] = entry as [\n RequestMetadataTarget,\n Function,\n ];\n map[target] = () => {\n if (!ctx[StateKey].has(target)) {\n ctx[StateKey].set(\n target,\n target === \"query\"\n ? Object.fromEntries(\n Object.entries(parser(ctx)).map(([k, v]) => [\n k,\n numericProperties.query[ctx.req.method]?.includes(k)\n ? Array.isArray(v)\n ? v.map((e) => maybeNumber(e))\n : maybeNumber(v)\n : v,\n ]),\n )\n : parser(ctx),\n );\n }\n return ctx[StateKey].get(target);\n };\n return map;\n }, {}),\n enumerable: true,\n });\n\n Object.defineProperty(ctx, \"bodyparser\", {\n value: Object.entries(bodyparsers).reduce<{\n [T in RequestBodyTarget]?: (\n opt?: BodyparserOptions[T],\n ) => Promise<unknown>;\n }>((map, entry) => {\n const [target, parser] = entry as [RequestBodyTarget, Function];\n map[target] = async (opt) => {\n if (!ctx[StateKey].has(target)) {\n ctx[StateKey].set(target, await parser(ctx, opt as never));\n }\n return ctx[StateKey].get(target);\n };\n return map;\n }, {}),\n enumerable: true,\n });\n\n Object.defineProperty(ctx, \"validated\", {\n get() {\n return Object.fromEntries(ctx[StateKey]);\n },\n enumerable: true,\n });\n }\n return next();\n },\n { slot: \"@extendContext\" },\n ) as never,\n\n /**\n * Normalize and validate URL params:\n * - Splat params (e.g. \\`/files{/*path}\\`) are split into arrays by \"/\"\n * - Numeric params are cast to Number (or array of Numbers for splat params)\n * - Non-splat, non-numeric params pass through as strings\n *\n * Validated params are stored in the cache so \\`ctx.validated.params\\`\n * reflects the normalized (and validated) values.\n * */\n use(\n function useValidateParams(ctx, next) {\n const matched = matchPath(ctx.req.path);\n const normalizedParams = params.reduce(\n (map: Record<string, unknown>, name) => {\n const value = matched ? matched.params[name] : undefined;\n if (Array.isArray(value)) {\n map[name] = numericProperties.params.includes(name)\n ? value.map((e) => maybeNumber(e))\n : value;\n } else if (value) {\n map[name] = numericProperties.params.includes(name)\n ? maybeNumber(value)\n : value;\n }\n return map;\n },\n {},\n );\n validationSchemas.params?.validate(normalizedParams);\n ctx[StateKey].set(\"params\", normalizedParams);\n return next();\n },\n { slot: \"validate:params\" },\n ) as never,\n\n /**\n * Response validation - runs AFTER the handler (post-\\`next()\\`).\n *\n * Each response schema defines one or more variants, each with:\n * - expected status code\n * - optional content-type\n * - optional body schema\n *\n * All variants are checked; if at least one passes, validation succeeds.\n * If none pass, a ValidationError is thrown with collected errors from all variants.\n *\n * Activation rules:\n * - In dev/test mode: runs unless \\`runtimeValidation\\` is explicitly \\`false\\`\n * - In production: runs only if \\`runtimeValidation\\` is explicitly \\`true\\`\n *\n * Only attached to HTTP methods that have response schemas defined.\n * */\n use(\n async function useValidateResponse(ctx, next) {\n const variants = validationSchemas.response?.[ctx.req.method] || [];\n\n if (!Array.isArray(variants) || !variants.length) {\n return next();\n }\n\n // options are same for all variants\n const { runtimeValidation, customErrors } = variants[0];\n\n if (KOSMO_PRODUCTION_BUILD) {\n // skip if undefined or explicitly set to false\n if (runtimeValidation === undefined || runtimeValidation === false) {\n return next();\n }\n } else {\n // skip only if explicitly set to false\n if (runtimeValidation === false) {\n return next();\n }\n }\n\n // run all downstream middleware (including the route handler)\n await next();\n\n const response: {\n status: number;\n contentType: string | null;\n body?: unknown;\n } = {\n status: ctx.res.status,\n contentType: ctx.res.headers.get(\"Content-Type\"),\n };\n\n // Validate body only for JSON variants\n if (variants.some((e) => e.contentType?.includes(\"json\"))) {\n const cloned = ctx.res.clone();\n response.body = await cloned.json();\n }\n\n /**\n * Returns an array of validator functions for a single response variant.\n * Each validator checks one aspect (status, content-type, body)\n * and returns an error entry or undefined if the check passes.\n * */\n const variantValidators: (\n v: (typeof variants)[number],\n ) => Array<(i: number) => ValidationErrorEntry | undefined> = (\n schema,\n ) => {\n return [\n (i) => {\n return schema.status === response.status\n ? undefined\n : {\n keyword: \"Status\",\n path: \\`Variant #\\${i}\\`,\n message: \\`expected: \\${schema.status}; actual: \\${ctx.status}\\`,\n };\n },\n (i) => {\n if (\n !schema.contentType ||\n schema.contentType === response.contentType\n ) {\n return undefined;\n }\n return {\n keyword: \"ContentType\",\n path: \\`Variant #\\${i}\\`,\n message: \\`expected: \\${schema.contentType}; actual: \\${response.contentType}\\`,\n };\n },\n (i) => {\n if (!schema.check || \"body\" in response === false) {\n // no body schema or contentType is not JSON\n return;\n }\n return schema.check(response.body)\n ? undefined\n : {\n keyword: \"Body\",\n path: \\`Variant #\\${i}\\`,\n message: schema.errorMessage(response.body),\n };\n },\n ];\n };\n\n // collect errors across all variants; exit early if any variant passes\n const errors: Array<ValidationErrorEntry> = [];\n\n for (const [i, variant] of variants.entries()) {\n const variantErrors = variantValidators(variant).flatMap(\n (validator) => {\n const error = validator(i);\n return error ? [error] : [];\n },\n );\n if (!variantErrors.length) {\n // variant fully matched - response is valid\n return;\n }\n errors.push(...variantErrors);\n }\n\n const errorMessage = \\`The response did not match any of the expected formats\\`;\n const errorSummary = \\`\\${variants.length} variants checked, none valid\\`;\n\n // no variant passed validation\n throw new ValidationError([\n \"response\",\n {\n errors,\n errorMessage: customErrors?.error || errorMessage,\n errorSummary,\n route: name,\n data: response,\n },\n ]);\n },\n {\n slot: \"validate:response\",\n on: Object.keys(validationSchemas.response || {}) as Array<HTTPMethod>,\n },\n ) as never,\n ];\n\n /**\n * Request validation - dynamically creates one middleware per target\n * (query, headers, cookies, json, form, multipart, raw).\n *\n * Each middleware:\n * 1. Checks if a schema exists for the current HTTP method\n * 2. Skips if \\`runtimeValidation\\` is explicitly disabled\n * 3. Loads data via the appropriate source (ctx.query, ctx.headers, or ctx.bodyparser)\n * 4. Validates via \\`schema.validate()\\` which throws on failure\n *\n * Body targets (json, form, raw) go through \\`ctx.bodyparser[target]()\\`,\n * benefiting from the lazy parsing and caching set up by slot:extendContext middleware.\n *\n * All request validators are active on any HTTP method that has at least one\n * schema defined across any target - this is intentionally broad to avoid\n * silently skipping validation when methods overlap.\n * */\n const requestTargets: Record<\n RequestValidationTarget,\n (\n ctx: ParameterizedContext<\n Record<string, string>,\n DefaultVariables,\n DefaultBindings\n >,\n ) => Promise<unknown>\n > = {\n query: async (ctx) => ctx.metaparser.query(),\n headers: async (ctx) => ctx.metaparser.headers(),\n cookies: async (ctx) => ctx.metaparser.cookies(),\n json: async (ctx) => ctx.bodyparser.json(),\n form: async (ctx) => ctx.bodyparser.form(),\n raw: async (ctx) => ctx.bodyparser.raw(),\n };\n\n const requestEntries = Object.entries(requestTargets) as Array<\n [RequestValidationTarget, (typeof requestTargets)[RequestValidationTarget]]\n >;\n\n for (const [target, loadData] of requestEntries) {\n validationMiddleware.push(\n use(\n async (ctx, next) => {\n const schema = {\n ...validationSchemas[target]?.[ctx.req.method],\n };\n if (schema.validate && schema.runtimeValidation !== false) {\n schema.validate(await loadData(ctx as never));\n }\n return next();\n },\n {\n slot: \\`validate:\\${target}\\`,\n // duplicates not an issue here\n on: requestEntries.flatMap(([target]) => {\n return Object.keys(\n validationSchemas[target] || {},\n ) as Array<HTTPMethod>;\n }),\n },\n ) as never,\n );\n }\n\n return validationMiddleware;\n};\n\nexport const routes = createRoutes<ParameterizedMiddleware, MiddlewareHandler>(\n routeSources,\n {\n globalMiddleware: globalMiddleware as never,\n createRouteMiddleware,\n },\n);\n\nexport const routerFactory: RouterFactory<Router<never>, never> = (factory) => {\n const createRouter = () => {\n return new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()],\n }) as Router<never>;\n };\n return factory({ createRouter });\n};\n`,_=`import { join } from \"node:path\";\n\nimport type { RouteSource } from \"@kosmojs/core/api\";\n\nimport { base, apiBase } from \"{{ createImport 'libCore' }}\";\n\n{{#each routes}}\nimport {{id}} from \"{{ createImport 'api' file }}\";\nimport { validationSchemas as {{id}}_schemas } from \"{{ createImport 'libApi' name 'schemas' }}\";\n{{/each}}\n\n{{#each cascadingMiddleware}}\nimport {{id}}, { type UseT as UseT{{id}} } from \"{{ createImport 'api' file }}\";\n{{/each}}\n\ntype Override<A, B> = Omit<A, keyof B> & B;\n\nexport type RouteMap = {\n{{#each routes}}\n \"{{name}}\": {\n paramsDefaults: {{paramsDefaults .}},\n paramsMappings: {{paramsMappings .}},\n cascadingState: {{cascadingState .}},\n },\n{{/each}}\n}\n\nexport const routeSources: Array<RouteSource<never>> = [\n {{#each routes}}\n {\n name: \"{{name}}\",\n {{#if fullpath}}\n path: \"{{fullpath}}\",\n pathPattern: \"{{fullpath}}\",\n {{else}}\n path: join(base, apiBase, \"{{path}}\"),\n pathPattern: join(base, apiBase, \"{{pathPattern}}\"),\n {{/if}}\n file: \"{{file}}\",\n cascadingMiddleware: [ {{#each cascadingMiddleware}}{{id}}, {{/each}}].flat() as Array<never>,\n definitionItems: {{id}} as never,\n validationSchemas: {{id}}_schemas,\n },\n {{/each}}\n];\n`,v=`import { chmod, unlink } from \"node:fs/promises\";\nimport { parseArgs, styleText } from \"node:util\";\n\nimport { createAdaptorServer } from \"@hono/node-server\";\n\nimport type { ServerFactory } from \"@kosmojs/core/api\";\n\nimport type { App } from \"./app\";\n\nexport const serverFactory: ServerFactory<App> = (factory) => {\n const { values } = parseArgs({\n options: {\n port: {\n type: \"string\",\n short: \"p\",\n },\n sock: {\n type: \"string\",\n short: \"s\",\n },\n },\n });\n\n const getListenHandles = async () => {\n const { port, sock } = { ...values };\n\n if (![port, sock].some(Boolean)) {\n console.error(\"Please provide either -p/--port number or -s/--sock path\");\n process.exit(1);\n }\n\n if (sock) {\n await unlink(sock).catch((error) => {\n if (error.code === \"ENOENT\") {\n return;\n }\n console.error(error.message);\n process.exit(1);\n });\n }\n\n return { port, sock };\n };\n\n const onListen = async () => {\n const { port, sock } = await getListenHandles();\n if (sock) {\n // Make Unix socket world-writable so other processes (e.g. a reverse proxy)\n // can connect without permission issues.\n await chmod(sock, 0o777);\n }\n console.log(\n \\`\\\\n ✨ Server Started \\${styleText([\"dim\"], \"[ %s ]\")}\\`,\n sock ? \\`sock: \\${sock}\\` : \\`port: \\${port}\\`,\n );\n };\n\n return factory({\n async createServer(app) {\n const { port, sock } = await getListenHandles();\n\n if (typeof Bun !== \"undefined\") {\n const server = Bun.serve(\n sock\n ? { unix: sock, fetch: app.fetch }\n : { port: Number(port), fetch: app.fetch },\n );\n await onListen();\n return server as never;\n }\n\n if (typeof Deno !== \"undefined\") {\n const server = sock\n ? Deno.serve({ path: sock, onListen }, app.fetch)\n : Deno.serve({ port: Number(port), onListen }, app.fetch);\n return server as never;\n }\n\n const server = createAdaptorServer(app);\n server.listen(sock || port, onListen);\n\n return server as never;\n },\n getListenHandles,\n onListen,\n });\n};\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\"💥 UNHANDLED REJECTION - This is likely caused by:\");\n console.error(\" - Middleware not awaiting next()\");\n console.error(\" - Middleware not returning next()\");\n console.error(\"\");\n console.error(\"Reason:\", reason);\n console.error(\"\");\n // In development, crash hard\n if (process.env.NODE_ENV === \"development\") {\n process.exit(1);\n }\n});\n`,y=`import type { Context, Next } from \"hono\";\n\nimport type { ValidationDefmap, ValidationOptmap } from \"@kosmojs/core\";\nimport {\n use as createUse,\n type ExtendContext,\n type HandlerDefinition,\n type HTTPMethod,\n type MiddlewareDefinition,\n type RouteDefinitionItem,\n type UseOptions,\n} from \"@kosmojs/core/api\";\n\nimport type { BodyparserOptions } from \"./@api/parsers\";\nimport type { RouteMap } from \"./@api/routes\";\n\nexport interface DefaultVariables {}\nexport interface DefaultBindings {}\n\ntype ExtractJsonBody<R> = R extends [\n number,\n \\`\\${string}json\\${string}\\`,\n infer Body,\n]\n ? Body\n : never;\n\ntype ExtractJsonStatus<R> = R extends [\n infer S extends number,\n \\`\\${string}json\\${string}\\`,\n ...unknown[],\n]\n ? S extends 300 | 301 | 302 | 303 | 304 | 307 | 308\n ? never\n : S\n : never;\n\ntype ResponseJsonOverride<VDefs extends ValidationDefmap> = [\n ExtractJsonBody<VDefs[\"response\"]>,\n] extends [never]\n ? {}\n : {\n json: (\n body: ExtractJsonBody<VDefs[\"response\"]>,\n status?: ExtractJsonStatus<VDefs[\"response\"]>,\n ) => Response;\n };\n\nexport type ParameterizedContext<\n ParamsT,\n VariablesT,\n BindingsT,\n VDefs extends ValidationDefmap = {},\n VOpts extends ValidationOptmap = {},\n> = Context<{\n Bindings: DefaultBindings & BindingsT;\n Variables: DefaultVariables & VariablesT;\n}> &\n ExtendContext<ParamsT, VDefs, VOpts, BodyparserOptions> &\n ResponseJsonOverride<VDefs>;\n\nexport type ParameterizedMiddleware<\n ParamsT = Record<string, string>,\n VariablesT = Record<string, unknown>,\n BindingsT = Record<string, unknown>,\n> = (\n ctx: ParameterizedContext<ParamsT, VariablesT, BindingsT>,\n next: Next,\n) => Promise<unknown> | unknown;\n\nexport const use = <VariablesT = DefaultVariables>(\n middleware:\n | ParameterizedMiddleware<Record<string, string>, VariablesT>\n | Array<ParameterizedMiddleware<Record<string, string>, VariablesT>>,\n options?: UseOptions,\n) => {\n return createUse<ParameterizedMiddleware<Record<string, string>, VariablesT>>(\n middleware,\n options,\n );\n};\n\nexport type RouteHandler<\n ParamsT,\n VariablesT,\n BindingsT,\n VDefs extends ValidationDefmap,\n VOpts extends ValidationOptmap = {},\n> = (\n ctx: ParameterizedContext<ParamsT, VariablesT, BindingsT, VDefs, VOpts>,\n next: Next,\n) => Promise<unknown> | unknown;\n\nexport type DefineRouteFactory<ParamsT, VariablesT, BindingsT> = (\n a: {\n // NOTE: The \\`use\\` helper intentionally does not accept validation types.\n // Allowing these type parameters on \\`use\\` would be misleading,\n // since middleware operates across multiple request methods with varying types.\n use: (\n middleware:\n | ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>\n | Array<ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>>,\n options?: UseOptions,\n ) => MiddlewareDefinition<\n ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>\n >;\n } & {\n [M in HTTPMethod]: <\n VDefs extends ValidationDefmap,\n VOpts extends ValidationOptmap = {},\n >(\n handler:\n | RouteHandler<ParamsT, VariablesT, BindingsT, VDefs, VOpts>\n | Array<RouteHandler<ParamsT, VariablesT, BindingsT, VDefs, VOpts>>,\n ) => HandlerDefinition<\n ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>\n >;\n },\n) => Array<\n RouteDefinitionItem<ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>>\n>;\n\ntype ParamsMap<\n Mappings extends Array<[string, unknown, boolean]>,\n Refinements extends Array<unknown>,\n> = {\n [I in Extract<keyof Mappings, \\`\\${number}\\`> as Mappings[I] extends [\n infer ParamName extends string,\n ...Array<unknown>,\n ]\n ? ParamName\n : never]: Mappings[I] extends [string, infer Default, true]\n ? I extends keyof Refinements\n ? Refinements[I]\n : Default\n : Mappings[I] extends [string, infer Default, false]\n ? I extends keyof Refinements\n ? Refinements[I] | undefined\n : Default | undefined\n : never;\n};\n\nexport const defineRoute: <\n R extends keyof RouteMap,\n ParamsD extends RouteMap[R][\"paramsDefaults\"] = RouteMap[R][\"paramsDefaults\"],\n VariablesT extends object = object,\n BindingsT extends object = object,\n>(\n factory: DefineRouteFactory<\n ParamsMap<RouteMap[R][\"paramsMappings\"], ParamsD>,\n VariablesT & RouteMap[R][\"cascadingState\"],\n BindingsT\n >,\n) => Array<\n RouteDefinitionItem<\n ParameterizedMiddleware<\n ParamsMap<RouteMap[R][\"paramsMappings\"], ParamsD>,\n VariablesT & RouteMap[R][\"cascadingState\"],\n BindingsT\n >\n >\n> = (factory) => {\n const createHandler = <MiddlewareT>(method: HTTPMethod) => {\n return (middleware: MiddlewareT | Array<MiddlewareT>) => {\n return {\n kind: \"handler\",\n method,\n middleware: [middleware].flat(),\n };\n };\n };\n return factory({\n HEAD: createHandler(\"HEAD\") as never,\n OPTIONS: createHandler(\"OPTIONS\") as never,\n GET: createHandler(\"GET\") as never,\n POST: createHandler(\"POST\") as never,\n PUT: createHandler(\"PUT\") as never,\n PATCH: createHandler(\"PATCH\") as never,\n DELETE: createHandler(\"DELETE\") as never,\n // route-specific \\`use\\`, contains types for current route\n use: use as never,\n });\n};\n`,b=`export * from \"./@api/app\";\nexport * from \"./@api/dev\";\nexport * from \"./@api/errors\";\nexport * from \"./@api/router\";\nexport * from \"./@api/routes\";\nexport * from \"./@api/server\";\n`,x=`import defaultErrorHandler from \"./errors\";\nimport router from \"./router\";\n\nimport { appFactory, routes } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default appFactory(({ createApp }) => {\n const app = createApp({ router });\n\n app.onError(defaultErrorHandler);\n\n for (const { path, methods, middleware } of routes) {\n app.on(methods, [path], ...middleware);\n }\n\n return app;\n});\n`,S=`import { getRequestListener } from \"@hono/node-server\";\n\nimport app from \"./app\";\n\nimport { devSetup } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default devSetup({\n requestHandler() {\n return getRequestListener(app.fetch);\n },\n teardownHandler() {\n // close db connections, server sockets etc.\n },\n});\n`,C=`export declare module \"{{ createImport 'libApi' }}\" {\n interface DefaultVariables {}\n interface DefaultBindings {}\n}\n`,w=`import { accepts } from \"hono/accepts\";\nimport { HTTPException } from \"hono/http-exception\";\n\nimport { ValidationError, HTTPError } from \"@kosmojs/core/errors\";\n\nimport { errorHandlerFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default errorHandlerFactory(\n async function defaultErrorHandler(error, ctx) {\n // Let Hono's HTTPException handle its own response\n if (error instanceof HTTPException) {\n return error.getResponse();\n }\n\n const [status, message] = Array.isArray(error)\n ? error\n : error instanceof HTTPError\n ? [error.status, error.message]\n : error instanceof ValidationError\n ? [400, \\`\\${error.target}: \\${error.errorMessage}\\`]\n : [error.statusCode || 500, error.message];\n\n // Respond based on what the client accepts\n const type = accepts(ctx, {\n header: \"Accept\",\n supports: [\"application/json\", \"text/plain\"],\n default: \"text/plain\",\n });\n\n return type === \"application/json\"\n ? ctx.json({ error: message }, status)\n : ctx.text(message, status);\n },\n);\n`,T=`import { defineRoute } from \"{{ createImport 'libApi' }}\";\n\nexport default defineRoute<\"{{route.name}}\">(({ GET }) => [\n GET(async (ctx) => {\n // Always \\`return\\` the response!\n // ❗ Never call \\`ctx.json()\\` / \\`ctx.text()\\` / \\`ctx.body()\\` without returning!\n return ctx.text(\"Automatically generated route\");\n }),\n]);\n`,E=`import { use } from \"{{ createImport 'libApi' }}\";\n\nexport type UseT = {};\n\nexport default [\n use<UseT>(async (ctx, next) => {\n // Always \\`return next()\\` or \\`await next()\\`;\n // ❗ Never call \\`next()\\` by itself!\n return next();\n }),\n];\n`,D=`import { routerFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default routerFactory(({ createRouter }) => {\n const router = createRouter();\n return router;\n});\n`,O=`import app from \"./app\";\n\nimport { serverFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nserverFactory(async ({ createServer }) => {\n await createServer(app);\n});\n`,k=`import { use } from \"{{ createImport 'libApi' }}\";\n\n/**\n * Define global middleware applied to all routes.\n * Can be overridden on a per-route basis using the slot key.\n * */\nexport default [\n use(async function useExample(ctx, next) {\n return next();\n }),\n];\n`,A=n((t,n)=>{let{createPath:d,createImportHelpers:A}=r(t),j=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${j(e.slice(1))}>`,{renderToFile:M}=a({helpers:{...A({origin:`lib`}),...u(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`[\"${e}\", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return j(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:N}=a({helpers:A({origin:`src`})}),P=e=>e?.trim().length===0,F=l(n?.templates,T),I=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await N(d.api(n.file),F(n.name,n),{route:n},{overwrite:P}):t===`apiUse`&&await N(d.api(n.file),E,{},{overwrite:P})},L=async t=>{let r=t.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=t.flatMap(({kind:t,entry:a})=>{if(t!==`apiRoute`)return[];let o=a.name.split(`/`).reduce((e,t)=>{let n=e[e.length-1];return e.push(n?s(n,t):t),e},[]),l={...a,path:a.honoPattern,cascadingMiddleware:r.flatMap(e=>o.some(t=>e.name===t)?[e]:[])};return[l,...Object.entries({...n?.alias}).flatMap(([t,n])=>{let r=i(t);return n===a.name?[{...l,name:t,id:`${l.id}_${c(t)}`,fullpath:e(r),pathTokens:r}]:[]})]}).sort(o);for(let[e,t]of[[`@api/routes.ts`,_]])await M(d.lib(e),t,{routes:a,cascadingMiddleware:r})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,y],[`api:factory.ts`,b],[`@api/app.ts`,f],[`@api/parsers.ts`,h],[`@api/dev.ts`,p],[`@api/errors.ts`,m],[`@api/router.ts`,g],[`@api/server.ts`,v]])await M(d.lib(e),t,{});for(let[e,t]of[[`app.ts`,x],[`dev.ts`,S],[`errors.ts`,w],[`router.ts`,D],[`server.ts`,O],[`use.ts`,k]])await N(d.api(e),t,{},{overwrite:P});await M(d.api(`env.d.ts`),C,{},{overwrite:P})},async watch(e,t){(!t||t.kind===`create`)&&await I(e),await L(e)},async build(e){await I(e),await L(e)}}}),j=t({meta:{name:`Hono`,slot:`backend`},dependencies:{hono:d.devDependencies.hono,\"@hono/node-server\":d.devDependencies[`@hono/node-server`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`]},factory:A});export{j as default};\n//# sourceMappingURL=index.js.map","import{createPathPattern as e,defineGenerator as t,defineGeneratorFactory as n,pathResolver as r,pathTokensFactory as i,renderFactory as a,sortRoutes as o}from\"@kosmojs/lib\";import{join as s}from\"node:path\";import c from\"crc/crc32\";import{createTemplateResolver as l}from\"@kosmojs/core\";import{routeRenderHelpers as u}from\"@kosmojs/core/generators\";var d={type:`module`,private:!0,name:`@kosmojs/koa-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`},\"./lib\":{types:`./pkg/lib.d.ts`,default:`./pkg/lib.js`}},scripts:{build:`wsbuild src/index.ts src/lib.ts`,test:`vitest --root ../.. --project generators/koa-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,crc:`^4.3.2`},devDependencies:{\"@koa/router\":`^15.7.0`,\"@types/formidable\":`^3.5.1`,\"@types/koa\":`^3.0.3`,\"@types/koa-compose\":`^3.2.9`,formidable:`^3.5.4`,koa:`^3.2.1`,\"koa-compose\":`^4.1.0`,\"light-my-request\":`^6.6.0`,\"path-to-regexp\":`^8.4.2`,\"raw-body\":`^4.0.0`,vite:`^8.2.1`}},f=`import Koa from \"koa\";\n\nimport type { AppFactory } from \"@kosmojs/core/api\";\n\nimport type { DefaultContext, DefaultState } from \"../api\";\n\nexport type App = Koa<DefaultState, DefaultContext>;\n\nexport type AppOptions = ConstructorParameters<\n typeof Koa<DefaultState, DefaultContext>\n>[0];\n\nexport const appFactory: AppFactory<App, AppOptions> = (factory) => {\n const createApp = (options?: AppOptions) => {\n return new Koa(options);\n };\n return factory({ createApp });\n};\n`,p=`import type { DevSetup } from \"@kosmojs/core/api\";\n\nexport const devSetup = (setup: DevSetup) => setup;\n`,m=`import type { ParameterizedMiddleware } from \"../api\";\n\nexport type ErrorHandlerFactory = (\n h: ParameterizedMiddleware,\n) => ParameterizedMiddleware;\n\nexport const errorHandlerFactory: ErrorHandlerFactory = (handler) => {\n return handler;\n};\n`,h=`import zlib from \"node:zlib\";\n\nimport type { RouterContext } from \"@koa/router\";\nimport Formidable, { type Options as FormidableOptions } from \"formidable\";\nimport rawParser from \"raw-body\";\n\nimport type { RequestBodyTarget, RequestMetadataTarget } from \"@kosmojs/core\";\nimport { parseCookies, parseQuerystring } from \"@kosmojs/core/api\";\n\nimport type {\n DefaultContext,\n DefaultState,\n ParameterizedContext,\n} from \"../api\";\n\nexport const metaparsers: {\n [T in RequestMetadataTarget]: (ctx: RouterContext) => unknown;\n} = {\n query(ctx) {\n return parseQuerystring(ctx.req.url ?? \"\");\n },\n\n headers(ctx) {\n return ctx.req.headers;\n },\n\n cookies(ctx) {\n return parseCookies(ctx.req.headers);\n },\n};\n\ntype JsonOptions = {\n limit?: number;\n};\n\n/**\n * Controls whether parsed field values are unwrapped from arrays.\n *\n * By default, all field values are returned as arrays (formidable v3 behavior),\n * since forms can submit multiple values under the same field name.\n *\n * - \\`false\\` (default) - no unwrapping, all values remain as arrays\n * - \\`true\\` - unwrap all fields; single-element arrays become scalars\n * - \\`{ only: string[] }\\` - unwrap only the specified fields\n * - \\`{ except: string[] }\\` - unwrap all fields except the specified ones\n *\n * Fields with multiple values are always kept as arrays regardless of this option.\n * If both \\`only\\` and \\`except\\` are provided, \\`only\\` takes precedence.\n *\n * @example\n * // all fields unwrapped: { username: 'john', role: 'admin' }\n * unwrap: true\n *\n * @example\n * // keep tags as array: { username: 'john', tags: ['a', 'b'] }\n * unwrap: { except: ['tags'] }\n *\n * @default false\n * */\ntype UnwrapControl =\n | boolean\n | {\n // unwrap only these keys\n only?: Array<string>;\n // unwrap all keys xcept these ones\n except?: Array<string>;\n };\n\ntype FormOptions = Pick<FormidableOptions, \"encoding\" | \"maxFields\"> &\n Partial<{\n // alias for maxFieldsSize\n limit: number;\n unwrap: UnwrapControl | undefined;\n }>;\n\ntype MultipartOptions = Omit<FormOptions, \"enabledPlugins\"> &\n Partial<{\n // alias for maxFieldsSize and maxFileSize\n limit: number;\n unwrap: UnwrapControl | undefined;\n }>;\n\ntype RawOptions = Partial<{\n /**\n * The byte limit of the body.\n * If the body ends up being larger than this limit, a 413 error code is returned.\n * */\n limit: number;\n\n /**\n * The length of the stream.\n * If the contents of the stream do not add up to this length,\n * an 400 error code is returned\n * */\n length: number;\n\n /**\n * The encoding to use to decode the body into a string.\n * By default, a Buffer instance will be returned when no encoding is specified.\n * utf-8 would decode as plain text.\n * use any encoding supported by iconv-lite.\n * */\n encoding: string;\n\n /**\n * zlib options\n * */\n chunkSize: number; // Default: 16 * 1024\n}>;\n\nexport const defaults: {\n json: JsonOptions;\n form: FormOptions | MultipartOptions;\n raw: RawOptions;\n} = {\n json: {\n limit: 1024 ** 2,\n },\n form: {\n limit: 1024 ** 2,\n },\n raw: {\n limit: 1024 ** 2,\n },\n};\n\nexport type BodyparserOptions = {\n json: JsonOptions;\n form: FormOptions | MultipartOptions;\n raw: RawOptions;\n};\n\nconst unwrap = (\n obj: Record<string, unknown | Array<unknown>>,\n opt: UnwrapControl | undefined,\n) => {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => {\n if (!Array.isArray(v) || v.length > 1) {\n return [k, v];\n }\n if (opt === false) {\n return [k, v];\n }\n if (opt === undefined || opt === true) {\n return [k, v[0]];\n }\n const { only, except } = { ...opt } as Exclude<UnwrapControl, boolean>;\n if (only?.includes(k)) {\n return [k, v[0]];\n }\n return [k, !except || except.includes(k) ? v : v[0]];\n }),\n );\n};\n\nexport const bodyparsers: {\n [T in RequestBodyTarget]: (\n ctx: ParameterizedContext<\n Record<string, string>,\n DefaultState,\n DefaultContext\n >,\n opt?: BodyparserOptions[T],\n ) => Promise<unknown>;\n} = {\n async json(ctx, opt) {\n const body = await bodyparsers.raw(ctx, {\n ...opt,\n encoding: \"utf-8\",\n });\n return body ? JSON.parse(body as never) : undefined;\n },\n\n async form(ctx, opt) {\n const form = Formidable({\n maxFieldsSize: opt?.limit || defaults.form.limit,\n maxFileSize: opt?.limit || defaults.form.limit,\n ...opt,\n });\n return new Promise((resolve, reject) => {\n form.parse(ctx.request.req, (err, fields, files) => {\n if (err) {\n return reject(err);\n }\n resolve(\n unwrap(\n // files should go last to override fields in case of name conflicting\n { ...fields, ...files },\n opt?.unwrap,\n ),\n );\n });\n });\n },\n\n async raw(ctx, opt) {\n const { chunkSize, ...rawParserOptions } = { ...defaults.raw, ...opt };\n\n const encoding = ctx.request.headers[\"content-encoding\"];\n const compressed = encoding ? encoding !== \"identity\" : false;\n\n const stream = compressed\n ? ctx.request.req.pipe(zlib.createUnzip({ chunkSize }))\n : ctx.request.req;\n\n return rawParser(stream, rawParserOptions);\n },\n};\n`,g=`import KoaRouter, { type RouterMiddleware } from \"@koa/router\";\nimport { match } from \"path-to-regexp\";\n\nimport type {\n RequestBodyTarget,\n RequestMetadataTarget,\n RequestValidationTarget,\n ValidationErrorEntry,\n} from \"@kosmojs/core\";\nimport {\n type CreateRouteMiddleware,\n createRoutes,\n type HTTPMethod,\n type RouterFactory,\n StateKey,\n} from \"@kosmojs/core/api\";\nimport { ValidationError } from \"@kosmojs/core/errors\";\n\nimport {\n type DefaultContext,\n type DefaultState,\n type ParameterizedContext,\n type ParameterizedMiddleware,\n use,\n} from \"../api\";\nimport { type BodyparserOptions, bodyparsers, metaparsers } from \"./parsers\";\nimport { routeSources } from \"./routes\";\n\nimport globalMiddleware from \"{{ createImport 'api' 'use' }}\";\nimport { apiRouteMap } from \"{{ createImport 'libCore' }}\";\n\nexport type Router = import(\"@koa/router\").Router<DefaultState, DefaultContext>;\nexport type RouterOptions = import(\"@koa/router\").RouterOptions;\n\n/**\n * Create route-level middleware stack that handles:\n * 1. Context extension - adds \\`ctx.bodyparser\\` (lazy, cached) and \\`ctx.validated\\` accessors\n * 2. Params validation - normalizes and validates URL params (including splat/numeric params)\n * 3. Request validation - validates query, headers, cookies, and body against schemas\n * 4. Response validation - validates outgoing response against defined variants\n *\n * Middleware are assigned named slots (e.g. \"validate:params\", \"validate:json\")\n * so they can be replaced by user-defined middleware in the stack.\n *\n * All validation errors are thrown as \\`ValidationError\\` instances,\n * caught and formatted by the global error handler middleware upstream.\n * */\nexport const createRouteMiddleware: CreateRouteMiddleware<\n ParameterizedMiddleware\n> = ({ name, pathPattern, validationSchemas }) => {\n const route = apiRouteMap[name];\n\n if (!route) {\n throw new Error(\\`createRouteMiddleware: \\${name} route does not exists\\`);\n }\n\n const { params, numericProperties } = route;\n\n const pathMatcher = match(pathPattern);\n\n const matchPath = (path: string) => {\n try {\n return pathMatcher(path);\n } catch (e) {\n return undefined;\n }\n };\n\n const maybeNumber = (val: unknown) => {\n if (val === undefined || val === null) {\n return val;\n }\n const n = Number(val);\n return Number.isFinite(n) ? n : val;\n };\n\n const validationMiddleware = [\n /**\n * Extends Koa context with:\n *\n * - \\`ctx.metaparser[target]()\\` - lazy, cached meta parsers.\n * Each parser (query, headers, cookies) runs at most once per request;\n * subsequent calls return the cached result.\n *\n * - \\`ctx.bodyparser[target](opts?)\\` - lazy, cached body parsers.\n * Each parser (json, form, raw) runs at most once per request;\n * subsequent calls return the cached result.\n * This allows both user middleware/handlers and validators\n * to call the same parser without re-consuming the request stream.\n *\n * - \\`ctx.validated\\` - getter that returns all validated data collected so far\n * (params, query, headers, cookies, json etc.) as a plain object.\n *\n * Cache is stored on \\`ctx[StateKey]\\` (a Symbol-keyed Map) to keep it\n * hidden from public API surface and serialization.\n * */\n use(\n function useExtendContext(ctx, next) {\n if (!ctx[StateKey]) {\n // initialize per-request cache with empty params\n // (later populated by useValidateParams)\n ctx[StateKey] = new Map([[\"params\", {}]]);\n\n Object.defineProperty(ctx, \"metaparser\", {\n value: Object.entries(metaparsers).reduce<{\n [T in RequestMetadataTarget]?: () => unknown;\n }>((map, entry) => {\n const [target, parser] = entry as [\n RequestMetadataTarget,\n Function,\n ];\n map[target] = () => {\n if (!ctx[StateKey].has(target)) {\n ctx[StateKey].set(\n target,\n target === \"query\"\n ? Object.fromEntries(\n Object.entries(parser(ctx)).map(([k, v]) => [\n k,\n numericProperties.query[ctx.method]?.includes(k)\n ? Array.isArray(v)\n ? v.map((e) => maybeNumber(e))\n : maybeNumber(v)\n : v,\n ]),\n )\n : parser(ctx),\n );\n }\n return ctx[StateKey].get(target);\n };\n return map;\n }, {}),\n enumerable: true,\n });\n\n Object.defineProperty(ctx, \"bodyparser\", {\n value: Object.entries(bodyparsers).reduce<{\n [T in RequestBodyTarget]?: (\n opt?: BodyparserOptions[T],\n ) => Promise<unknown>;\n }>((map, entry) => {\n const [target, parser] = entry as [RequestBodyTarget, Function];\n map[target] = async (opt) => {\n if (!ctx[StateKey].has(target)) {\n ctx[StateKey].set(target, await parser(ctx, opt as never));\n }\n return ctx[StateKey].get(target);\n };\n return map;\n }, {}),\n enumerable: true,\n });\n\n Object.defineProperty(ctx, \"validated\", {\n get() {\n return Object.fromEntries(ctx[StateKey]);\n },\n enumerable: true,\n });\n }\n return next();\n },\n { slot: \"@extendContext\" },\n ) as never,\n\n /**\n * Normalize and validate URL params:\n * - Splat params (e.g. \\`/files{/*path}\\`) are split into arrays by \"/\"\n * - Numeric params are cast to Number (or array of Numbers for splat params)\n * - Non-splat, non-numeric params pass through as strings\n *\n * Validated params are stored in the cache so \\`ctx.validated.params\\`\n * reflects the normalized (and validated) values.\n * */\n use(\n function useValidateParams(ctx, next) {\n const matched = matchPath(ctx.path);\n const normalizedParams = params.reduce(\n (map: Record<string, unknown>, name) => {\n const value = matched ? matched.params[name] : undefined;\n if (Array.isArray(value)) {\n map[name] = numericProperties.params.includes(name)\n ? value.map((e) => maybeNumber(e))\n : value;\n } else if (value) {\n map[name] = numericProperties.params.includes(name)\n ? maybeNumber(value)\n : value;\n }\n return map;\n },\n {},\n );\n validationSchemas.params?.validate(normalizedParams);\n ctx[StateKey].set(\"params\", normalizedParams);\n return next();\n },\n { slot: \"validate:params\" },\n ) as never,\n\n /**\n * Response validation - runs AFTER the handler (post-\\`next()\\`).\n *\n * Each response schema defines one or more variants, each with:\n * - expected status code\n * - optional content-type\n * - optional body schema\n *\n * All variants are checked; if at least one passes, validation succeeds.\n * If none pass, a ValidationError is thrown with collected errors from all variants.\n *\n * Activation rules:\n * - In dev/test mode: runs unless \\`runtimeValidation\\` is explicitly \\`false\\`\n * - In production: runs only if \\`runtimeValidation\\` is explicitly \\`true\\`\n *\n * Only attached to HTTP methods that have response schemas defined.\n * */\n use(\n async function useValidateResponse(ctx, next) {\n const variants = validationSchemas.response?.[ctx.method] || [];\n\n if (!Array.isArray(variants) || !variants.length) {\n return next();\n }\n\n // options are same for all variants\n const { runtimeValidation, customErrors } = variants[0];\n\n if (KOSMO_PRODUCTION_BUILD) {\n // skip if undefined or explicitly set to false\n if (runtimeValidation === undefined || runtimeValidation === false) {\n return next();\n }\n } else {\n // skip only if explicitly set to false\n if (runtimeValidation === false) {\n return next();\n }\n }\n\n // run all downstream middleware (including the route handler)\n // so ctx.status / ctx.type / ctx.body are set before we validate the response\n await next();\n\n const response: {\n status: number;\n contentType: string | null;\n body?: unknown;\n } = {\n status: ctx.status,\n contentType: ctx.type,\n };\n\n // Validate body only for JSON variants\n if (variants.some((e) => e.contentType?.includes(\"json\"))) {\n response.body = ctx.body;\n }\n\n /**\n * Returns an array of validator functions for a single response variant.\n * Each validator checks one aspect (status, content-type, body)\n * and returns an error entry or undefined if the check passes.\n * */\n const variantValidators: (\n v: (typeof variants)[number],\n ) => Array<(i: number) => ValidationErrorEntry | undefined> = (\n schema,\n ) => {\n return [\n (i) => {\n return schema.status === response.status\n ? undefined\n : {\n keyword: \"Status\",\n path: \\`Variant #\\${i}\\`,\n message: \\`expected: \\${schema.status}; actual: \\${response.status}\\`,\n };\n },\n (i) => {\n if (\n !schema.contentType ||\n schema.contentType === response.contentType\n ) {\n return undefined;\n }\n\n return {\n keyword: \"ContentType\",\n path: \\`Variant #\\${i}\\`,\n message: \\`expected: \\${schema.contentType}; actual: \\${response.contentType}\\`,\n };\n },\n (i) => {\n if (!schema.check || \"body\" in response === false) {\n // no body schema or contentType is not JSON\n return;\n }\n return schema.check(response.body)\n ? undefined\n : {\n keyword: \"Body\",\n path: \\`Variant #\\${i}\\`,\n message: schema.errorMessage(response.body),\n };\n },\n ];\n };\n\n // collect errors across all variants; exit early if any variant passes\n const errors: Array<ValidationErrorEntry> = [];\n\n for (const [i, variant] of variants.entries()) {\n const variantErrors = variantValidators(variant).flatMap(\n (validator) => {\n const error = validator(i);\n return error ? [error] : [];\n },\n );\n if (!variantErrors.length) {\n // variant fully matched - response is valid\n return;\n }\n errors.push(...variantErrors);\n }\n\n const errorMessage = \\`The response did not match any of the expected formats\\`;\n const errorSummary = \\`\\${variants.length} variants checked, none valid\\`;\n\n // no variant passed validation\n throw new ValidationError([\n \"response\",\n {\n errors,\n errorMessage: customErrors?.error || errorMessage,\n errorSummary,\n route: name,\n data: response,\n },\n ]);\n },\n {\n slot: \"validate:response\",\n on: Object.keys(validationSchemas.response || {}) as Array<HTTPMethod>,\n },\n ) as never,\n ];\n\n /**\n * Request validation - dynamically creates one middleware per target\n * (query, headers, cookies, json, form, raw).\n *\n * Each middleware:\n * 1. Checks if a schema exists for the current HTTP method\n * 2. Skips if \\`runtimeValidation\\` is explicitly disabled\n * 3. Loads data via the appropriate source (ctx.query, ctx.headers, or ctx.bodyparser)\n * 4. Validates via \\`schema.validate()\\` which throws on failure\n *\n * Body targets (json, form, raw) go through \\`ctx.bodyparser[target]()\\`,\n * benefiting from the lazy parsing and caching set up by slot:extendContext middleware.\n *\n * All request validators are active on any HTTP method that has at least one\n * schema defined across any target - this is intentionally broad to avoid\n * silently skipping validation when methods overlap.\n * */\n const requestTargets: Record<\n RequestValidationTarget,\n (\n ctx: ParameterizedContext<\n Record<string, string>,\n DefaultState,\n DefaultContext\n >,\n ) => Promise<unknown>\n > = {\n query: async (ctx) => ctx.metaparser.query(),\n headers: async (ctx) => ctx.metaparser.headers(),\n cookies: async (ctx) => ctx.metaparser.cookies(),\n json: async (ctx) => ctx.bodyparser.json(),\n form: async (ctx) => ctx.bodyparser.form(),\n raw: async (ctx) => ctx.bodyparser.raw(),\n };\n\n const requestEntries = Object.entries(requestTargets) as Array<\n [RequestValidationTarget, (typeof requestTargets)[RequestValidationTarget]]\n >;\n\n for (const [target, loadData] of requestEntries) {\n validationMiddleware.push(\n use(\n async (ctx, next) => {\n const schema = {\n ...validationSchemas[target]?.[ctx.method],\n };\n if (schema.validate && schema.runtimeValidation !== false) {\n schema.validate(await loadData(ctx as never));\n }\n return next();\n },\n {\n slot: \\`validate:\\${target}\\`,\n // duplicates not an issue here\n on: requestEntries.flatMap(([target]) => {\n return Object.keys(\n validationSchemas[target] || {},\n ) as Array<HTTPMethod>;\n }),\n },\n ) as never,\n );\n }\n\n return validationMiddleware;\n};\n\nexport const routes = createRoutes<ParameterizedMiddleware, RouterMiddleware>(\n routeSources,\n {\n globalMiddleware: globalMiddleware as never,\n createRouteMiddleware,\n },\n);\n\nexport const routerFactory: RouterFactory<Router, RouterOptions> = (\n factory,\n) => {\n const createRouter = (options?: RouterOptions): Router => {\n return new KoaRouter(options);\n };\n return factory({ createRouter });\n};\n`,_=`import { join } from \"node:path\";\n\nimport type { RouteSource } from \"@kosmojs/core/api\";\n\nimport { base, apiBase } from \"{{ createImport 'libCore' }}\";\n\n{{#each routes}}\nimport {{id}} from \"{{ createImport 'api' file }}\";\nimport { validationSchemas as {{id}}_schemas } from \"{{ createImport 'libApi' name 'schemas' }}\";\n{{/each}}\n\n{{#each cascadingMiddleware}}\nimport {{id}}, { type UseT as UseT{{id}} } from \"{{ createImport 'api' file }}\";\n{{/each}}\n\ntype Override<A, B> = Omit<A, keyof B> & B;\n\nexport type RouteMap = {\n{{#each routes}}\n \"{{name}}\": {\n paramsDefaults: {{paramsDefaults .}},\n paramsMappings: {{paramsMappings .}},\n cascadingState: {{cascadingState .}},\n },\n{{/each}}\n}\n\nexport const routeSources: Array<RouteSource<never>> = [\n {{#each routes}}\n {\n name: \"{{name}}\",\n {{#if fullpath}}\n path: \"{{fullpath}}\",\n pathPattern: \"{{fullpath}}\",\n {{else}}\n path: join(base, apiBase, \"{{path}}\"),\n pathPattern: join(base, apiBase, \"{{pathPattern}}\"),\n {{/if}}\n file: \"{{file}}\",\n cascadingMiddleware: [ {{#each cascadingMiddleware}}{{id}}, {{/each}}].flat() as Array<never>,\n definitionItems: {{id}} as never,\n validationSchemas: {{id}}_schemas,\n },\n {{/each}}\n] as const;\n`,v=`import { chmod, unlink } from \"node:fs/promises\";\nimport { parseArgs, styleText } from \"node:util\";\n\nimport type { ServerFactory } from \"@kosmojs/core/api\";\n\nimport type { App } from \"./app\";\n\nexport const serverFactory: ServerFactory<App> = (factory) => {\n const { values } = parseArgs({\n options: {\n port: {\n type: \"string\",\n short: \"p\",\n },\n sock: {\n type: \"string\",\n short: \"s\",\n },\n },\n });\n\n const getListenHandles = async () => {\n const { port, sock } = { ...values };\n\n if (![port, sock].some(Boolean)) {\n console.error(\"Please provide either -p/--port number or -s/--sock path\");\n process.exit(1);\n }\n\n if (sock) {\n await unlink(sock).catch((error) => {\n if (error.code === \"ENOENT\") {\n return;\n }\n console.error(error.message);\n process.exit(1);\n });\n }\n\n return { port, sock };\n };\n\n const onListen = async () => {\n const { port, sock } = await getListenHandles();\n if (sock) {\n // Make Unix socket world-writable so other processes (e.g. a reverse proxy)\n // can connect without permission issues.\n await chmod(sock, 0o777);\n }\n console.log(\n \\`\\\\n ✨ Server Started \\${styleText([\"dim\"], \"[ %s ]\")}\\`,\n sock ? \\`sock: \\${sock}\\` : \\`port: \\${port}\\`,\n );\n };\n\n return factory({\n async createServer(app) {\n const { port, sock } = await getListenHandles();\n const server = app.listen(port || sock, onListen);\n return server as never;\n },\n getListenHandles,\n onListen,\n });\n};\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\"💥 UNHANDLED REJECTION - This is likely caused by:\");\n console.error(\" - Middleware not awaiting next()\");\n console.error(\" - Middleware not returning next()\");\n console.error(\"\");\n console.error(\"Reason:\", reason);\n console.error(\"\");\n // In development, crash hard\n if (process.env.NODE_ENV === \"development\") {\n process.exit(1);\n }\n});\n`,y=`import type { RouterContext } from \"@koa/router\";\nimport type { Next } from \"koa\";\n\nimport type { ValidationDefmap, ValidationOptmap } from \"@kosmojs/core\";\nimport {\n use as createUse,\n type ExtendContext,\n type HandlerDefinition,\n type HTTPMethod,\n type MiddlewareDefinition,\n type RouteDefinitionItem,\n type UseOptions,\n} from \"@kosmojs/core/api\";\n\nimport type { BodyparserOptions } from \"./@api/parsers\";\nimport type { RouteMap } from \"./@api/routes\";\n\nexport interface DefaultState {}\nexport interface DefaultContext {}\n\ntype ExtractBodies<R> = R extends [number, string, infer Body] ? Body : never;\n\ntype ValidatedResponseBodies<VDefs extends ValidationDefmap> = [\n ExtractBodies<VDefs[\"response\"]>,\n] extends [never]\n ? unknown // No bodies extracted at all - fallback to unknown\n : ExtractBodies<VDefs[\"response\"]>;\n\nexport type ParameterizedContext<\n ParamsT,\n StateT,\n ContextT,\n VDefs extends ValidationDefmap = {},\n VOpts extends ValidationOptmap = {},\n> = RouterContext<\n DefaultState & StateT,\n DefaultContext &\n ContextT &\n ExtendContext<ParamsT, VDefs, VOpts, BodyparserOptions>,\n ValidatedResponseBodies<VDefs>\n>;\n\nexport type ParameterizedMiddleware<\n ParamsT = Record<string, string>,\n StateT = Record<string, unknown>,\n ContextT = Record<string, unknown>,\n> = (\n ctx: ParameterizedContext<ParamsT, StateT, ContextT>,\n next: Next,\n) => Promise<void> | void;\n\nexport type RouteHandler<\n ParamsT,\n StateT,\n ContextT,\n VDefs extends ValidationDefmap,\n VOpts extends ValidationOptmap = {},\n> = (\n ctx: ParameterizedContext<ParamsT, StateT, ContextT, VDefs, VOpts>,\n next: Next,\n) => Promise<void> | void;\n\nexport type DefineRouteFactory<ParamsT, StateT, ContextT> = (\n a: {\n // INFO: The \\`use\\` helper intentionally does not accept validation types.\n // Allowing these type parameters on \\`use\\` would be misleading,\n // since middleware operates across multiple request methods with varying types.\n use: (\n middleware:\n | ParameterizedMiddleware<ParamsT, StateT, ContextT>\n | Array<ParameterizedMiddleware<ParamsT, StateT, ContextT>>,\n options?: UseOptions,\n ) => MiddlewareDefinition<\n ParameterizedMiddleware<ParamsT, StateT, ContextT>\n >;\n } & {\n [M in HTTPMethod]: <\n VDefs extends ValidationDefmap,\n VOpts extends ValidationOptmap = {},\n >(\n handler:\n | RouteHandler<ParamsT, StateT, ContextT, VDefs, VOpts>\n | Array<RouteHandler<ParamsT, StateT, ContextT, VDefs, VOpts>>,\n ) => HandlerDefinition<ParameterizedMiddleware<ParamsT, StateT, ContextT>>;\n },\n) => Array<\n RouteDefinitionItem<ParameterizedMiddleware<ParamsT, StateT, ContextT>>\n>;\n\ntype ParamsMap<\n Mappings extends Array<[string, unknown, boolean]>,\n Refinements extends Array<unknown>,\n> = {\n [I in Extract<keyof Mappings, \\`\\${number}\\`> as Mappings[I] extends [\n infer ParamName extends string,\n ...Array<unknown>,\n ]\n ? ParamName\n : never]: Mappings[I] extends [string, infer Default, true]\n ? I extends keyof Refinements\n ? Refinements[I]\n : Default\n : Mappings[I] extends [string, infer Default, false]\n ? I extends keyof Refinements\n ? Refinements[I] | undefined\n : Default | undefined\n : never;\n};\n\nexport const use = <StateT = DefaultState>(\n middleware:\n | ParameterizedMiddleware<Record<string, string>, StateT>\n | Array<ParameterizedMiddleware<Record<string, string>, StateT>>,\n options?: UseOptions,\n) => {\n return createUse<ParameterizedMiddleware<Record<string, string>, StateT>>(\n middleware,\n options,\n );\n};\n\nexport const defineRoute: <\n R extends keyof RouteMap,\n ParamsD extends RouteMap[R][\"paramsDefaults\"] = RouteMap[R][\"paramsDefaults\"],\n StateT extends object = object,\n ContextT extends object = object,\n>(\n factory: DefineRouteFactory<\n ParamsMap<RouteMap[R][\"paramsMappings\"], ParamsD>,\n StateT & RouteMap[R][\"cascadingState\"],\n ContextT\n >,\n) => Array<\n RouteDefinitionItem<\n ParameterizedMiddleware<\n ParamsMap<RouteMap[R][\"paramsMappings\"], ParamsD>,\n StateT & RouteMap[R][\"cascadingState\"],\n ContextT\n >\n >\n> = (factory) => {\n const createHandler = <MiddlewareT>(method: HTTPMethod) => {\n return (middleware: MiddlewareT | Array<MiddlewareT>) => {\n return {\n kind: \"handler\",\n method,\n middleware: [middleware].flat(),\n };\n };\n };\n return factory({\n HEAD: createHandler(\"HEAD\") as never,\n OPTIONS: createHandler(\"OPTIONS\") as never,\n GET: createHandler(\"GET\") as never,\n POST: createHandler(\"POST\") as never,\n PUT: createHandler(\"PUT\") as never,\n PATCH: createHandler(\"PATCH\") as never,\n DELETE: createHandler(\"DELETE\") as never,\n // route-specific \\`use\\`, contains types for current route\n use: use as never,\n });\n};\n`,b=`export * from \"./@api/app\";\nexport * from \"./@api/dev\";\nexport * from \"./@api/errors\";\nexport * from \"./@api/router\";\nexport * from \"./@api/routes\";\nexport * from \"./@api/server\";\n`,x=`import router from \"./router\";\n\nimport { appFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default appFactory(({ createApp }) => {\n const app = createApp();\n\n // NOTE: Routes should be added last, after any middleware\n app.use(router.routes());\n\n return app;\n});\n`,S=`import app from \"./app\";\n\nimport { devSetup } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default devSetup({\n requestHandler() {\n return app.callback();\n },\n teardownHandler() {\n // close db connections, server sockets etc.\n },\n});\n`,C=`export declare module \"{{ createImport 'libApi' }}\" {\n interface DefaultState {}\n interface DefaultContext {}\n}\n`,w=`import { HTTPError, ValidationError } from \"@kosmojs/core/errors\";\n\nimport { errorHandlerFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default errorHandlerFactory(\n async function defaultErrorHandler(ctx, next) {\n try {\n await next();\n } catch (error: any) {\n const [status, message] = Array.isArray(error)\n ? error\n : error instanceof HTTPError\n ? [error.status, error.message]\n : error instanceof ValidationError\n ? [400, \\`\\${error.target}: \\${error.errorMessage}\\`]\n : [error.statusCode || 500, error.message];\n\n ctx.status = status;\n\n if (ctx.accepts(\"json\")) {\n ctx.body = { error: message };\n } else {\n ctx.body = message;\n }\n }\n },\n);\n`,T=`import { defineRoute } from \"{{ createImport 'libApi' }}\";\n\nexport default defineRoute<\"{{route.name}}\">(({ GET }) => [\n GET(async (ctx) => {\n ctx.body = \"Automatically generated route\";\n }),\n]);\n`,E=`import { use } from \"{{ createImport 'libApi' }}\";\n\nexport type UseT = {};\n\nexport default [\n use<UseT>(async (ctx, next) => {\n // Always \\`return next()\\` or \\`await next()\\`;\n // ❗ Never call \\`next()\\` by itself!\n return next();\n }),\n];\n`,D=`import { routerFactory, routes } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default routerFactory(({ createRouter }) => {\n const router = createRouter();\n\n for (const { name, path, methods, middleware } of routes) {\n router.register(path, methods, middleware, { name });\n }\n\n return router;\n});\n`,O=`import app from \"./app\";\n\nimport { serverFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nserverFactory(async ({ createServer }) => {\n await createServer(app);\n});\n`,k=`import defaultErrorHandler from \"./errors\";\n\nimport { use } from \"{{ createImport 'libApi' }}\";\n\nexport default [\n /**\n * Define global middleware applied to all routes.\n * Can be overridden on a per-route basis using the slot key.\n * */\n use(defaultErrorHandler, { slot: \"errorHandler\" }),\n];\n`,A=n((t,n)=>{let{createPath:d,createImportHelpers:A}=r(t),j=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${j(e.slice(1))}>`,{renderToFile:M}=a({helpers:{...A({origin:`lib`}),...u(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`[\"${e}\", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return j(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:N}=a({helpers:A({origin:`src`})}),P=e=>e?.trim().length===0,F=l(n?.templates,T),I=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await N(d.api(n.file),F(n.name,n),{route:n},{overwrite:P}):t===`apiUse`&&await N(d.api(n.file),E,{},{overwrite:P})},L=async t=>{let r=t.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=t.flatMap(({kind:t,entry:a})=>{if(t!==`apiRoute`)return[];let o=a.name.split(`/`).reduce((e,t)=>{let n=e[e.length-1];return e.push(n?s(n,t):t),e},[]),l={...a,path:a.pathPattern,cascadingMiddleware:r.flatMap(e=>o.some(t=>e.name===t)?[e]:[])};return[l,...Object.entries({...n?.alias}).flatMap(([t,n])=>{let r=i(t);return n===a.name?[{...l,name:t,id:`${l.id}_${c(t)}`,fullpath:e(r),pathTokens:r}]:[]})]}).sort(o);for(let[e,t]of[[`@api/routes.ts`,_]])await M(d.lib(e),t,{routes:a,cascadingMiddleware:r})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,y],[`api:factory.ts`,b],[`@api/app.ts`,f],[`@api/dev.ts`,p],[`@api/errors.ts`,m],[`@api/parsers.ts`,h],[`@api/router.ts`,g],[`@api/server.ts`,v]])await M(d.lib(e),t,{});for(let[e,t]of[[`app.ts`,x],[`dev.ts`,S],[`errors.ts`,w],[`router.ts`,D],[`server.ts`,O],[`use.ts`,k]])await N(d.api(e),t,{},{overwrite:P});await M(d.api(`env.d.ts`),C,{},{overwrite:P})},async watch(e,t){(!t||t.kind===`create`)&&await I(e),await L(e)},async build(e){await I(e),await L(e)}}}),j=t({meta:{name:`Koa`,slot:`backend`,types:[`@types/koa`]},dependencies:{koa:d.devDependencies.koa,\"@koa/router\":d.devDependencies[`@koa/router`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`],formidable:d.devDependencies.formidable,\"raw-body\":d.devDependencies[`raw-body`]},devDependencies:{\"@types/koa\":d.devDependencies[`@types/koa`],\"@types/formidable\":d.devDependencies[`@types/formidable`]},factory:A});export{j as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderFactory as r,sortRoutes as i}from\"@kosmojs/lib\";import{createTemplateResolver as a,defaults as o}from\"@kosmojs/core\";import{routeRenderHelpers as s}from\"@kosmojs/core/generators\";import c from\"@mdx-js/rollup\";import{createFilter as l}from\"vite\";var u={type:`module`,private:!0,name:`@kosmojs/mdx-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"@mdx-js/rollup\":`^3.1.1`,vite:`^8.2.1`},devDependencies:{\"@mdx-js/mdx\":`^3.1.1`,\"@mdx-js/preact\":`^3.1.1`,\"path-to-regexp\":`^8.4.2`,preact:`^10.29.8`,\"preact-render-to-string\":`^6.7.0`,\"remark-frontmatter\":`^5.0.0`,\"remark-mdx-frontmatter\":`^5.2.0`}},d=()=>{let e=[`🎉 Well done! You just created a new MDX page.`,`🚀 Success! A fresh MDX page is ready to roll.`,`🌟 Nice work! Another MDX page added to your site.`,`🧩 All set! A new MDX page has been scaffolded.`,`🔧 Scaffold complete! Your new MDX page is in place.`,`✅ Built! Your MDX page is scaffolded and ready.`,`✨ Fantastic! Your new MDX page is good to go.`,`🎯 Nailed it! A brand new MDX page just landed.`,`💫 Awesome! Another MDX page joins the party.`,`⚡ Lightning fast! A new MDX page created successfully.`];return e[Math.floor(Math.random()*e.length)]},f=(e,t,n)=>{let{remarkPlugins:r=[],rehypePlugins:i=[]}={...n},a=()=>{let t=[`${o.srcDir}/${e.name}/${o.entryDir}/client.ts`].map(e=>l(e)),n=e=>t.some(t=>t(e));return{name:`kosmo:mdx[hmr]`,enforce:`post`,transform(e,t){if(!(!n(t)||e.includes(`import.meta.hot.accept`)))return{code:[e,`\nif (import.meta.hot) {\n import.meta.hot.accept(() => {});\n}\n`].join(`\n`)}}}},s=[c({jsxImportSource:`preact`,providerImportSource:`@mdx-js/preact`,remarkPlugins:r,rehypePlugins:i})];return t===`serve`&&s.push(a()),s},p=`import type { FunctionComponent } from \"preact\";\n\nexport const AppProvider: FunctionComponent = (props) => {\n return props.children;\n};\n`,m=`import { render, hydrate as hydrateOrig } from \"preact\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { createRoute, type RouteComponent } from \"../mdx\";\n\n{{#each pageRoutes}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n{{#each layouts}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nexport const createRoutes = () => {\n return [\n {{#each pageRoutes}}\n createRoute(\"{{name}}\", \"{{pathPattern}}\", {{id}}, [\n {{#each layouts}}[\"{{name}}\", {{id}}], {{/each}}\n ]),\n {{/each}}\n ];\n};\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<Promise<RouteComponent>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n hydrateOrig(component, root);\n window.__KOSMO_HYDRATION_DATA__ = undefined;\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<Promise<RouteComponent>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n render(component, root);\n}\n\nexport default clientRenderFactory();\n`,h=`import { renderToString as renderToStringOrig } from \"preact-render-to-string\";\n\nimport type {\n RenderToStringWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { createRoute, type Route, type RouteComponent } from \"../mdx\";\n\n{{#each pageRoutes}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n{{#each layouts}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n\nexport const createRoutes = () => {\n return [\n {{#each pageRoutes}}\n createRoute(\"{{name}}\", \"{{pathPattern}}\", async () => {{id}}, [\n {{#each layouts}}[\"{{name}}\", async () => {{id}}], {{/each}}\n ]),\n {{/each}}\n ];\n};\n\nconst generateHeaderTags = ({ name, frontmatter, loaderData }: Route) => {\n const tags: Array<string> = [];\n\n if (typeof frontmatter?.title === \"string\") {\n tags.push(\\`<title>\\${frontmatter.title}</title>\\`);\n }\n\n if (typeof frontmatter?.description === \"string\") {\n tags.push(\\`<meta name=\"description\" content=\"\\${frontmatter.description}\">\\`);\n }\n\n if (Array.isArray(frontmatter?.head)) {\n for (const [tag, attrs] of frontmatter.head) {\n const attrStr = Object.entries(attrs)\n .map(([k, v]) => \\`\\${k}=\"\\${v}\"\\`)\n .join(\" \");\n tags.push(\\`<\\${tag} \\${attrStr}>\\`);\n }\n }\n\n tags.push(\n \\`<script>\n window.__KOSMO_HYDRATION_DATA__ = JSON.parse(\n \\${JSON.stringify(JSON.stringify(loaderData))}\n );\n <\\/script>\\`\n )\n\n return tags\n};\n\nexport const renderWrapper: SSRRenderWrapper = (_context, render) => render();\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<Promise<RouteComponent>, { route: Route }>\n> = async (resolver, { headerTags = [] } = {}) => {\n const { component, route } = await resolver();\n const html = renderToStringOrig(component);\n return {\n head: [...headerTags, ...generateHeaderTags(route as never)].join(\"\\\\n\"),\n html,\n }\n}\n\nexport default serverRenderFactory<false>();\n`,g=`declare module \"*.mdx\" {\n import type { ComponentType } from \"preact\";\n export const frontmatter: Record<string, unknown>;\n const component: ComponentType;\n export default component;\n}\n\ndeclare module \"*.md\" {\n import type { ComponentType } from \"preact\";\n export const frontmatter: Record<string, unknown>;\n const component: ComponentType;\n export default component;\n}\n`,_=`import { MDXProvider } from \"@mdx-js/preact\";\nimport { match, pathToRegexp } from \"path-to-regexp\";\nimport { type ComponentType, createContext, h, type VNode } from \"preact\";\n\nimport { paramNames } from \"{{ createImport 'lib' 'params' }}\";\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nexport type RawRoute = {\n name: string;\n pathSegments: number | undefined;\n regexp: RegExp;\n extractParams: (path: string) => Route[\"params\"];\n loader: () => Promise<RouteModule>;\n layouts: Array<[name: string, source: () => Promise<LayoutModule>]>;\n};\n\ntype Loader = (\n route: Pick<Route, \"name\" | \"params\" | \"paramsEntries\">,\n) => Promise<unknown> | undefined;\n\ntype LayoutModule = {\n default: ComponentType;\n loader?: Loader;\n};\n\ntype RouteModule = {\n default: ComponentType;\n frontmatter: Route[\"frontmatter\"];\n loader?: Loader;\n};\n\nexport type RouteComponent = VNode<{ value: Route }>;\n\nexport type Route = {\n name: string;\n params: Record<string, string | Array<string>>;\n paramsEntries: [keys: Array<string>, values: Array<unknown>];\n frontmatter: Record<string, unknown>;\n loaderData: Record<string, unknown>;\n};\n\nexport const RouterContext = createContext<Route>({\n name: \"\",\n params: {},\n paramsEntries: [[], []],\n frontmatter: {},\n loaderData: {},\n});\n\nexport const RouterProvider = RouterContext.Provider;\n\nexport const createRouter = (\n routes: Array<RawRoute>,\n app: ComponentType,\n opt: { components?: Record<string, ComponentType<never>> },\n) => {\n const catchallRoute = createRoute(\n \"NotFound\",\n \"\",\n () => import(\"{{ createImport 'pages' '404.mdx' }}\"),\n [],\n );\n\n const runLoader = async (key: string, fetcher: () => ReturnType<Loader>) => {\n if (typeof window === \"undefined\" || !window.__KOSMO_HYDRATION_DATA__) {\n return fetcher();\n }\n return key in window.__KOSMO_HYDRATION_DATA__\n ? window.__KOSMO_HYDRATION_DATA__[key]\n : fetcher();\n };\n\n return {\n async resolve(url: URL = new URL(window.location.href)) {\n const urlSegments = url.pathname.split(\"/\").filter(Boolean).length;\n\n // 1: use lightweight \\`RegExp.test()\\` on linear scan - no capture allocation\n const matchedRoutes = routes.filter(({ regexp }) => {\n return regexp.test(url.pathname);\n });\n\n const matchedRoute =\n matchedRoutes.length > 1\n ? matchedRoutes.find(({ pathSegments }) => {\n return pathSegments === undefined || pathSegments === urlSegments;\n }) || catchallRoute\n : matchedRoutes.length === 1\n ? matchedRoutes[0]\n : catchallRoute;\n\n // 2: capture params only on matched route\n const params = matchedRoute\n ? matchedRoute.extractParams(url.pathname)\n : {};\n\n const { name } = matchedRoute;\n\n const routeModule = await matchedRoute.loader();\n\n const paramsEntries = (\n Array.isArray(paramNames[name as never])\n ? [\n [...paramNames[name as never]],\n [...paramNames[name as never]].map((key) => params[key]),\n ]\n : [\n // fallback\n Object.keys(params),\n Object.values(params),\n ]\n ) as never;\n\n const { frontmatter = {} } = routeModule;\n\n const loaderData: Record<string, unknown> = {};\n\n loaderData[name] = await runLoader(name, () => {\n return routeModule.loader\n ? routeModule.loader({ name, params, paramsEntries })\n : undefined; // should not survive serialization if no loader defined\n });\n\n const layouts: Array<{\n name: string;\n component: LayoutModule[\"default\"];\n }> = [];\n\n for (const [name, source] of matchedRoute.layouts || []) {\n const layoutModule = await source();\n layouts.push({ name, component: layoutModule.default });\n const key = \\`\\${name}/layout\\`;\n loaderData[key] = await runLoader(key, () => {\n return layoutModule.loader\n ? layoutModule.loader({ name, params, paramsEntries })\n : undefined; // should not survive serialization if no loader defined\n });\n }\n\n const route: Route = {\n name,\n params,\n paramsEntries,\n frontmatter,\n loaderData,\n };\n\n const component = [{ name: \"\", component: app }, ...layouts].reduce(\n (children, { component }) => {\n return h(component, { children } as never);\n },\n h(routeModule.default, {}),\n );\n\n return {\n component: h(\n RouterProvider,\n { value: route },\n h(MDXProvider, opt as never, component),\n ),\n route,\n };\n },\n };\n};\n\nexport const createRoute = (\n name: string,\n pathPattern: string,\n loader: RawRoute[\"loader\"],\n layouts: RawRoute[\"layouts\"],\n): RawRoute => {\n const path = \\`\\${base}/\\${pathPattern}\\`.replace(/\\\\/+/g, \"/\");\n\n const { regexp } = pathToRegexp(path, { sensitive: true });\n const matcher = match<Route[\"params\"]>(path);\n\n return {\n name,\n regexp,\n pathSegments: name.includes(\"...\")\n ? undefined\n : name.replace(/^index(\\\\/?|$)/, \"\").split(\"/\").length,\n extractParams: (path) => {\n const match = matcher(path);\n return match ? match.params : {};\n },\n loader,\n layouts,\n };\n};\n`,v=`/* @jsxImportSource preact */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n headline?: string;\n}) {\n return (\n <div class={styles.container}>\n <div class={styles.card}>\n\n <h2 class={styles.title}>\n {props.headline || \"404: Not Found\"}\n </h2>\n <br />\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>\n Something went wrong...\n </h2>\n 🚧 No page found here\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,y=`/* @jsxImportSource preact */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string }\n}) {\n return (\n <div data-page-route={props.routeName} class={styles.container}>\n <div class={styles.card}>\n\n <h2 class={styles.subtitle}>\n {props.message}\n </h2>\n <br />\n\n <div class={styles.stepsBox}>\n <ul class={styles.stepsList}>\n <li>\n Edit this page at <code>{props.pathMap.page}</code>\n </li>\n <li>\n Create new pages by adding folders in\n <code>{props.pathMap.pages}/</code>\n </li>\n <li>\n Add API endpoints in\n <code>{props.pathMap.api}/</code>\n </li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,b=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,x=`/* @jsxImportSource preact */\n\nimport styles from \"./styles.module.css\";\n\nexport default function WelcomePage() {\n return (\n <div class={styles.container}>\n <div class={styles.card}>\n <div class={styles.header}>\n <div class={styles.icon}>✨</div>\n <h1 class={styles.title}>Welcome to KosmoJS</h1>\n <p class={styles.subtitle}>\n Content-first development with MDX and Vite\n </p>\n </div>\n\n <div class={styles.featuresBox}>\n <h2 class={styles.featuresTitle}>\n Powered by MDX and ready to publish\n </h2>\n <div class={styles.featuresSubtitle}>What's included:</div>\n <ul class={styles.featuresList}>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Directory-based routing\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n MDX content with Preact components\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Nested layouts and frontmatter\n </li>\n </ul>\n </div>\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>Next Steps 🢂</h2>\n <ul class={styles.stepsList}>\n <li>\n Edit this page at <code>pages/index/index.mdx</code>\n </li>\n <li>Create new pages by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,S=`export type ParamsMap = {\n{{#each pageRoutes}}\"{{name}}\": {{serializeParamsLiteral .}};\n{{/each}}\n};\n\nexport const paramNames = {\n{{#each pageRoutes}}\"{{name}}\": [ {{#each params.schema}}\"{{name}}\", {{/each}}],\n{{/each}}\n} as const;\n`,C=`import type { ComponentType } from \"preact\";\n\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport {\n createRouter,\n type RawRoute,\n type Route,\n type RouteComponent,\n} from \"./mdx\";\n\nexport const createRouters = (\n routes: Array<RawRoute>,\n {\n app,\n components,\n }: {\n app: ComponentType;\n components: Record<string, ComponentType<never>>;\n },\n): {\n clientRouter: () => RouterFactoryReturn<Promise<RouteComponent>>;\n serverRouter: (\n url: URL,\n ) => RouterFactoryReturn<Promise<RouteComponent>, { route: Route }>;\n} => {\n const router = createRouter(routes, app, { components });\n\n return {\n clientRouter() {\n return router.resolve();\n },\n serverRouter(url) {\n return router.resolve(url);\n },\n };\n};\n\nexport default createRouterFactory<\n RawRoute,\n Promise<RouteComponent>,\n { server: { route: Route } }\n>();\n`,w=`import { join } from \"node:path\";\n\nimport { compile } from \"path-to-regexp\";\n\nimport type { PageRoute } from \"@kosmojs/core\";\n\nimport routes from \"{{ createImport 'lib' 'ssg:routes' }}\";\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nconst paramsMapper = (params: PageRoute[\"params\"], value: Array<unknown>) => {\n return params.schema.reduce<Record<string, unknown>>(\n (map, { name, kind }, i) => {\n if (kind === \"splat\") {\n if (Array.isArray(value[i]) && value[i].length) {\n map[name] = value[i].map(String);\n }\n } else if (value[i] !== undefined) {\n map[name] = String(value[i]);\n }\n return map;\n },\n {},\n );\n};\n\nexport default Object.entries(routes)\n .flatMap(([name, { pathPattern, params, frontmatter }]) => {\n if (!params.schema.length || Array.isArray(frontmatter?.staticParams)) {\n if (params.schema.length) {\n const toPath = compile(pathPattern);\n return Array.from(frontmatter?.staticParams || []).flatMap((entry) => {\n try {\n return [toPath(paramsMapper(params, entry) as never)];\n } catch (error: any) {\n console.error(\\`❗SSG: Failed building path for \\${name}\\`);\n console.error(error);\n return [];\n }\n });\n }\n // static route\n return [pathPattern.replace(/^index\\\\/?/, \"\")];\n }\n return [];\n })\n .map((path) => join(base, path));\n`,T=`import type { PageRoute } from \"@kosmojs/core\";\n\n{{#each pageRoutes}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n\nconst routeMap: Record<\n string,\n {\n frontmatter?: { staticParams?: Array<Array<string | Array<string>>> };\n pathPattern: string;\n params: PageRoute[\"params\"];\n }\n> = {\n{{#each pageRoutes}}\n \"{{name}}\": {\n frontmatter: {{id}}.frontmatter,\n pathPattern: \"{{pathPattern}}\",\n params: {{serializeParams .}},\n },\n{{/each}}\n}\n\nexport default routeMap;\n`,E=`import { useContext } from \"preact/hooks\";\n\nimport { RouterContext } from \"./mdx\";\n\nimport type { ParamsMap, paramNames } from \"{{ createImport 'lib' 'params' }}\";\n\nexport function useRoute() {\n return useContext(RouterContext);\n}\n\nexport function useParams<T extends keyof ParamsMap>(): ParamsMap[T] {\n return useContext(RouterContext).params as ParamsMap[T];\n}\n\ntype SameLengthTuple<T extends readonly unknown[], U> = { [K in keyof T]: U };\n\nexport function useParamsEntries<T extends keyof ParamsMap>(): [\n (typeof paramNames)[T],\n SameLengthTuple<(typeof paramNames)[T], unknown>,\n] {\n return useContext(RouterContext).paramsEntries as never;\n}\n\n/**\n * Reads loader data for the current page or one of its layouts.\n * Without a key, returns the page's own data.\n * For a layout, pass its path-qualified name (e.g. \"dashboard/layout\") -\n * a hook can't tell which layout it runs in.\n * */\nexport const useLoaderData = <T>(key?: string): T | undefined => {\n const route = useContext(RouterContext);\n return route.loaderData?.[key || route.name] as T;\n};\n\n/**\n * Reads the current route's frontmatter.\n * */\nexport const useFrontmatter = <\n T extends Record<string, unknown> = Record<string, unknown>,\n>(): T => {\n return useContext(RouterContext).frontmatter as T;\n};\n`,D=`import { AppProvider } from \"{{ createImport 'lib' 'app' }}\";\n\n<AppProvider>{props.children}</AppProvider>\n`,O=`import { h, type JSX } from \"preact\";\n\nimport { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\nexport default function Link(\n props: Omit<h.JSX.IntrinsicElements[\"a\"], \"href\"> & {\n to: LinkProps;\n query?: Record<string | number, unknown>;\n },\n): JSX.Element {\n const { to, query, children, ...restProps } = props;\n\n const [key, ...params] = to;\n const href = pageRouteMap[key]?.base(params as never, query);\n\n return h(\"a\", { ...restProps, href }, children);\n}\n`,k=`/**\n * MDX component overrides.\n *\n * Every standard markdown element (headings, links, code blocks, etc.)\n * can be replaced with a custom Preact component here.\n * These overrides apply globally to all MDX pages via the MDXProvider.\n * Individual pages can still import and use additional components directly.\n *\n * @see https://mdxjs.com/docs/using-mdx/#components\n * */\nimport type { ComponentType } from \"preact\";\nimport Link from \"./Link.tsx\";\n\nexport const components = {\n Link,\n // example overrides:\n // h1: (props) => <h1 style=\\\\{{ color: \"tomato\" }} {...props} />,\n // pre: (props) => <pre class=\"code-block\" {...props} />,\n} satisfies Record<string, ComponentType<never>>;;\n\ndeclare global {\n type MDXProvidedComponents = typeof components;\n}\n`,A=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,j=`import renderFactory, {\n createRoutes,\n renderToString,\n // no renderToStream on MDX folders\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,M=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,N=`import PageSample from \"{{ createImport 'lib' 'pageSamples/404.tsx' }}\";\n\nexport default function Page() {\n return <PageSample />;\n}\n`,P=`{props.children}\n`,F=`---\ntitle: \"{{title}}\"\n---\n\nimport PageSample from \"{{ createImport 'lib' 'pageSamples/page.tsx' }}\";\n\nexport const pathMap = {\n page: \"{{ createImport 'pages' route.file }}\",\n pages: \"{{ createImport 'pages' }}\",\n api: \"{{ createImport 'api' }}\",\n};\n\n<PageSample\n message=\"{{message}}\"\n routeName=\"{{route.name}}\"\n pathMap={pathMap}\n/>\n`,I=`---\ntitle: Welcome to KosmoJS\ndescription: Content-first development with MDX and Vite\n---\n\nimport WelcomePage from \"{{ createImport 'lib' 'pageSamples/welcome.tsx' }}\"\n\n<WelcomePage />\n`,L=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\n\nimport app from \"./app.mdx\";\nimport { components } from \"./components/mdx\"\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, { app, components });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,R=t((e,t)=>{let{createPath:c,createImportHelpers:l}=n(e),{renderToFile:u}=r({helpers:{...l({origin:`lib`}),...s(),serializeParams(e){return JSON.stringify(e.params)}}}),{renderToFile:R}=r({helpers:l({origin:`src`})}),z=e=>!e?.trim().length,B=a(t?.templates,F),V=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await R(c.pages(n.file),n.name===`index`?I:B(n.name,n),{route:n,title:n.name.replace(/\\{([^}]+)\\}/g,`$1`),message:d()},{overwrite:z}):t===`pageLayout`&&await R(c.pages(n.file),P,{route:n},{overwrite:z})},H=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),n=e.flatMap(({kind:e,entry:n})=>{if(e===`pageRoute`){let{name:e,file:r}=n;return[{...n,layouts:t.flatMap(t=>t.name===e||r.startsWith(`${t.name}/`)?[t]:[]).sort(i)}]}return[]}).sort(i);for(let[e,r]of[[`client.ts`,m],[`server.ts`,h]])await u(c.libEntry(e),r,{pageRoutes:n,layouts:t});for(let[e,t]of[[`params.ts`,S],[`router.ts`,C],[`ssg:routes.ts`,T]])await u(c.lib(e),t,{pageRoutes:n})};return{config({command:n}){return{oxc:{jsx:{importSource:`preact`}},plugins:f(e,n,t)}},async start(){for(let[e,t]of[[`env.d.ts`,g],[`app.ts`,p],[`mdx.ts`,_],[`use.ts`,E],[`ssg.ts`,w],[`pageSamples/styles.module.css`,b],[`pageSamples/welcome.tsx`,x],[`pageSamples/page.tsx`,y],[`pageSamples/404.tsx`,v]])await u(c.lib(e),t,{});for(let[e,t]of[[`pages/404.mdx`,N],[`components/Link.tsx`,O],[`components/mdx.ts`,k],[`app.mdx`,D],[`router.ts`,L]])await R(c.src(e),t,{entryDir:o.entryDir},{overwrite:z});await R(c.src(`index.html`),M,{entryDir:o.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,A],[`server.ts`,j]])await R(c.entry(e),t,{},{overwrite:z})},async watch(e,t){(!t||t.kind===`create`)&&await V(e),await H(e)},async build(e){await V(e),await H(e)}}}),z=e({meta:{name:`MDX`,jsxImportSource:`preact`},dependencies:{\"path-to-regexp\":u.devDependencies[`path-to-regexp`]},devDependencies:{preact:u.devDependencies.preact,\"preact-render-to-string\":u.devDependencies[`preact-render-to-string`],\"@mdx-js/preact\":u.devDependencies[`@mdx-js/preact`],\"remark-frontmatter\":u.devDependencies[`remark-frontmatter`],\"remark-mdx-frontmatter\":u.devDependencies[`remark-mdx-frontmatter`]},factory:R});export{z as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderToFile as r,sortRoutes as i}from\"@kosmojs/lib\";import a from\"yaml\";import{join as o}from\"node:path\";import s from\"crc/crc32\";import{parse as c}from\"path-to-regexp\";import l from\"typebox\";import{RequestBodyTargets as u}from\"@kosmojs/core\";var d={json:`application/json`,form:[`application/x-www-form-urlencoded`,`multipart/form-data`],raw:void 0},f=()=>{let e=e=>[`Buffer`,`ArrayBuffer`,`Blob`].includes(e)?{type:`string`,format:`binary`}:l.Script(e),t=(e,t,n)=>{let r=n?`${t}_${n.replace(/[^\\w.-]/g,`_`)}${s(n)}`:t;return`${e.id}_${r}`},n=(e,n,r,i)=>[`#`,`components`,e,t(n,r,i)].join(`/`),r=e=>e.split(`/`).reduce((e,t)=>e+ +!t.includes(`{`),0),a=e=>{if(e.name===`index`)return[`/`];let{tokens:t}=c(e.pathPattern),n=e=>e.flatMap(e=>{switch(e.type){case`param`:return[e.name];case`wildcard`:return[e.name];case`group`:return n(e.tokens);default:return[]}}),i=(e,t)=>{if(!e.length)return[t];let[r,...a]=e;switch(r.type){case`text`:return i(a,{path:`${t.path}${r.value}`,params:t.params});case`param`:return i(a,{path:`${t.path}{${r.name}}`,params:[...t.params,r.name]});case`wildcard`:return i(a,{path:`${t.path}{${r.name}*}`,params:[...t.params,r.name]});case`group`:{let e=i(a,t),o=i([...r.tokens,...a],t),s=n(r.tokens),c=o.filter(e=>s.some(t=>e.params.includes(t)));return[...e,...c]}}},a=i(t,{path:``,params:[]}),s=e.params.schema.reduce((e,{name:t},n)=>(e[n]=t,e),{});return a.reduce((e,t)=>{let n=o(`/`,t.path);return e.includes(n)||t.params.every((e,t)=>e===s[t])&&e.push(n),e},[]).sort((e,t)=>r(t)-r(e))},f=(e,t)=>{let r=e.params.resolvedType?.properties?.flatMap(r=>RegExp(`\\\\{${r.name}\\\\*?\\\\}`).test(t)?[{$ref:n(`parameters`,e,e.params.id,r.name)}]:[]);return r?.length?r:void 0},m=(e,t)=>{let r=e.validationDefinitions.find(e=>e.method===t&&e.target===`response`);return Array.isArray(r?.variants)?r.variants.reduce((t,{id:r,status:i,contentType:a,body:o})=>(t[i]=p(i,a)||{description:`Success`,content:{[a||`application/json`]:{schema:o?{$ref:n(`schemas`,e,r)}:{type:`object`}}}},t),{}):{200:{description:`Success - TODO: Add response schema`,content:{\"text/plain\":{schema:{type:`string`}}}}}},h=n=>{let{parameters:r,schemas:i}={parameters:{},schemas:{}};for(let r of n.validationDefinitions)if(r.target===`response`)for(let{id:a,resolvedType:o}of r.variants)o?.typeboxSchema&&(i[t(n,a)]=e(o.typeboxSchema));else if(r.target===`query`){let{id:a,resolvedType:o}=r.schema;for(let r of o?.properties||[])if(r?.typeboxSchema){let o=t(n,a,r.name);i[o]=e(r.typeboxSchema)}}else{let{id:a,resolvedType:o}=r.schema;o?.typeboxSchema&&(i[t(n,a)]=e(o.typeboxSchema))}if(n.params.resolvedType)for(let i of n.params.resolvedType.properties||[])i?.typeboxSchema&&(r[t(n,n.params.id,i.name)]={name:i.name,in:`path`,required:!0,schema:e(i.typeboxSchema)});return{parameters:r,schemas:i}},g=e=>{let t={},r=e.validationDefinitions.flatMap(e=>e.target===`response`?[]:e.schema.resolvedType?[e]:[]);for(let i of a(e))for(let a of e.methods){let o={responses:m(e,a)},s=f(e,i);s&&(o.parameters=s);let c=r.find(e=>e.method===a&&e.target===`query`);if(c?.schema)for(let t of c.schema.resolvedType?.properties||[])o.parameters||=[],o.parameters.push({name:t.name,in:`query`,required:!t.optional,schema:{$ref:n(`schemas`,e,c.schema.id,t.name)}});let l=r.filter(e=>e.method===a&&Object.keys(u).includes(e.target));l.length&&(o.requestBody={required:!0,content:l.reduce((t,r)=>{let{contentType:i=d[r.target]}=r;if(i){let a={$ref:n(`schemas`,e,r.schema.id)};for(let e of[i].flat())t[e]={schema:a}}return t},{})}),t[i]||(t[i]={}),t[i][a.toLowerCase()]=o}return t};return{generateComponentId:t,generateComponentPath:n,generatePathVariations:a,generateOpenAPISchema:e=>{let{components:t,paths:n}=e.sort(i).flatMap(t=>e.some(e=>e.name!==t.name&&e.name.startsWith(t.name))?[]:[t]).reduce((e,t)=>{let n=g(t),{parameters:r,schemas:i}=h(t);return{paths:{...e.paths,...n},components:{parameters:{...e.components.parameters,...r},schemas:{...e.components.schemas,...i}}}},{paths:{},components:{parameters:{},schemas:{}}});return{paths:n,components:t}}}},p=(e,t)=>{let n={type:`string`,format:`uri`,...t?{enum:[t]}:{}};return{301:{description:`Moved Permanently`,headers:{Location:{description:`New permanent location`,schema:n}}},302:{description:`Found`,headers:{Location:{description:`Temporary location`,schema:n}}},303:{description:`See Other`,headers:{Location:{description:`Location to GET after POST/PUT/DELETE`,schema:n}}},307:{description:`Temporary Redirect`,headers:{Location:{description:`Temporary location (preserves request method)`,schema:n}}},308:{description:`Permanent Redirect`,headers:{Location:{description:`New permanent location (preserves request method)`,schema:n}}}}[e]},m=t((e,t)=>{let{outfile:i=``,...o}={...t},{createPath:s}=n(e),{generateOpenAPISchema:c}=f(),l=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]),{paths:n,components:l}=c(t),u={...JSON.parse(JSON.stringify(o)),paths:n,components:l},d=/ya?ml/.test(i)?a.stringify(u):JSON.stringify(u,null,2);await r(s.src(i),d,{})};return{async watch(e){await l(e)},async build(e){await l(e)}}}),h=e({meta:{name:`OpenAPI`,resolveTypes:!0},factory:m});export{h as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,nestedRoutesFactory as n,pathResolver as r,renderFactory as i,sortRoutes as a}from\"@kosmojs/lib\";import o from\"@vitejs/plugin-react\";import{createTemplateResolver as s,defaults as c}from\"@kosmojs/core\";import{routeRenderHelpers as l}from\"@kosmojs/core/generators\";import{styleText as u}from\"node:util\";var d={type:`module`,private:!0,name:`@kosmojs/react-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/react-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"@vitejs/plugin-react\":`^6.0.5`},devDependencies:{\"@tanstack/react-query\":`^5.101.4`,\"@types/react\":`^19.2.18`,\"@types/react-dom\":`^19.2.4`,\"path-to-regexp\":`^8.4.2`,react:`^19.2.8`,\"react-dom\":`^19.2.8`,\"react-router\":`^8.3.0`}},f=e=>{let t=e.map(e=>e.orig).join(`/`),n=e=>e.kind===`splat`?`*`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[n(e.parts[0])]:(/\\.\\w+$/.test(e.orig)||(console.warn(`❗${u([`red`,`bold`],`WARN`)}: React Router v7 only supports dot-suffix mixed segments (e.g. :param.html).`),console.warn(` ${u([`magenta`],e.orig)} in ${u([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},p=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=n=>n.flatMap(({index:n,layout:r,children:i})=>{let{name:a,pathTokens:o}={...n,...r};if(!o)return[];let s=`${a}:layout`,c=f(o),l=o.at(-1);return e(l)?n&&r?[{name:s,path:c,component:r.id,children:[{name:a,path:`*`,component:n.id}]}]:n?[{path:c,children:[{name:a,path:`*`,component:n.id},...t(i)]}]:r?[{name:s,path:c,component:r.id,children:t(i)}]:[]:n&&r?[{name:s,path:c,component:r.id,children:[{name:a,index:!0,component:n.id},...t(i)]}]:n?[{path:c,children:[{name:a,index:!0,component:n.id},...t(i)]}]:r?[{name:s,path:c,component:r.id,children:t(i)}]:[]});return t},m=()=>{let e=[`🎉 Well done! You just created a new React route.`,`🚀 Success! A fresh React route is ready to roll.`,`🌟 Nice work! Another React route added to your app.`,`⚡ Quick and easy! Your new React route is good to go.`,`🥳 Congrats! Your app just leveled up with a new React route.`,`🧩 All set! A new React route has been scaffolded.`,`🔧 Scaffold complete! Your new React route is in place.`,`✨ Fantastic! Your new React route is ready.`,`🎯 Nailed it! A brand new React route just landed.`,`💫 Awesome! Another React route joins the lineup.`];return e[Math.floor(Math.random()*e.length)]},h=`import type { ReactNode } from \"react\";\n\nexport const AppProvider = ({ children }: { children: ReactNode }) => {\n return children;\n}\n`,g=`import { type QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport type { ReactNode } from \"react\";\n\nimport { getQueryClient } from \"./query\";\n\nexport const AppProvider = ({\n client,\n children,\n}: {\n client?: QueryClient;\n children: ReactNode;\n}) => {\n const queryClient = client ?? getQueryClient();\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n </QueryClientProvider>\n );\n}\n`,_=`import { lazy, type JSX } from \"react\";\n\nimport {\n createRoot,\n hydrateRoot,\n type HydrationOptions,\n type RootOptions,\n} from \"react-dom/client\";\n\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\n\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { loaderFactory } from \"../react\";\n\n{{#each pageEntries}}\nconst {{id}}_component = lazy(() => import(\"{{ createImport 'pages' file }}\"));\nconst {{id}}_loader = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nconst NotFound = lazy(() => import(\"{{ createImport 'pages' '404.tsx' }}\"));\n\nexport const createRoutes = (opt?: { withPreload?: boolean }) => {\n const maybeLoader = loaderFactory(opt);\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"*\",\n Component: NotFound,\n },\n ];\n}\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<Promise<JSX.Element>>,\n root: HTMLElement,\n options?: HydrationOptions,\n) => {\n const { component } = await resolver();\n hydrateRoot(root, component, options);\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<Promise<JSX.Element>>,\n root: HTMLElement,\n options?: RootOptions,\n) => {\n const { component } = await resolver();\n createRoot(root, options).render(component);\n}\n\nexport default clientRenderFactory();\n`,v=`{\n {{#if name}}\n id: \"{{name}}\",\n {{/if}}\n {{#if path}}\n path: \"{{path}}\",\n {{/if}}\n {{#if index}}\n index: true,\n {{/if}}\n {{#if component}}\n Component: {{component}}_component,\n ...maybeLoader({{component}}_loader as never),\n {{/if}}\n {{#if children.length}}\n children: [ {{#each children}}{{> routePartial}}, {{/each}}],\n {{/if}}\n}\n`,y=`import type { JSX } from \"react\";\n\nimport {\n renderToString as renderToStringOrig,\n renderToReadableStream,\n} from \"react-dom/server\";\n\nimport type { StaticHandlerContext } from \"react-router\";\n\nimport type {\n RenderToStringWrapper,\n RenderToStreamWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { loaderFactory } from \"../react\";\n\n{{#each pageEntries}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\nconst {{id}}_component = {{id}}.default;\nconst {{id}}_loader = async () => {{id}};\n{{/each}}\n\nimport NotFound from \"{{ createImport 'pages' '404.tsx' }}\";\n\nexport const createRoutes = (opt?: { withPreload?: boolean }) => {\n const maybeLoader = loaderFactory(opt);\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"*\",\n Component: NotFound,\n },\n ];\n}\n\nexport const renderWrapper: SSRRenderWrapper = (_context, render) => render();\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<Promise<JSX.Element>>,\n Parameters<typeof renderToStringOrig>[1]\n> = async (resolver, { headerTags = [], ...options } = {}) => {\n const { component } = await resolver();\n return {\n head: [...headerTags].join(\"\\\\n\"),\n html: renderToStringOrig(component, options),\n };\n};\n\nexport const renderToStream: RenderToStreamWrapper<\n () => RouterFactoryReturn<Promise<JSX.Element>>,\n Parameters<typeof renderToReadableStream>[1]\n> = async (resolver, { headerTags = [], ...options } = {}) => {\n const { component } = await resolver();\n return {\n head: [...headerTags].join(\"\\\\n\"),\n html: await renderToReadableStream(component, options),\n };\n};\n\nexport default serverRenderFactory();\n`,b=`/* @jsxImportSource react */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n headline?: string;\n}) {\n return (\n <div className={styles.container}>\n <div className={styles.card}>\n\n <h2 className={styles.title}>\n {props.headline || \"404: Not Found\"}\n </h2>\n <br />\n\n <div className={styles.stepsBox}>\n <h2 className={styles.stepsTitle}>\n Something went wrong...\n </h2>\n 🚧 No page found here\n </div>\n\n <div className={styles.footer}>\n <p className={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n className={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,x=`/* @jsxImportSource react */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string }\n}) {\n return (\n <div data-page-route={props.routeName} className={styles.container}>\n <div className={styles.card}>\n\n <h2 className={styles.subtitle}>\n {props.message}\n </h2>\n <br />\n\n <div className={styles.stepsBox}>\n <ul className={styles.stepsList}>\n <li>\n Edit this page at <code>{props.pathMap.page}</code>\n </li>\n <li>\n Create new pages by adding folders in\n <code>{props.pathMap.pages}/</code>\n </li>\n <li>\n Add API endpoints in\n <code>{props.pathMap.api}/</code>\n </li>\n </ul>\n </div>\n\n <div className={styles.footer}>\n <p className={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n className={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,S=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,C=`/* @jsxImportSource react */\n\nimport styles from \"./styles.module.css\";\n\nexport default function WelcomePage() {\n return (\n <div className={styles.container}>\n <div className={styles.card}>\n <div className={styles.header}>\n <div className={styles.icon}>✨</div>\n <h1 className={styles.title}>Welcome to KosmoJS</h1>\n <p className={styles.subtitle}>\n Type-safe full-stack development with Vite\n </p>\n </div>\n\n <div className={styles.featuresBox}>\n <h2 className={styles.featuresTitle}>\n Powered by React and ready to perform\n </h2>\n <div className={styles.featuresSubtitle}>What's included:</div>\n <ul className={styles.featuresList}>\n <li className={styles.featureItem}>\n <span className={styles.featureBullet}>🔹</span>\n Directory-based routing\n </li>\n <li className={styles.featureItem}>\n <span className={styles.featureBullet}>🔹</span>\n End-to-End Type Safety\n </li>\n <li className={styles.featureItem}>\n <span className={styles.featureBullet}>🔹</span>\n Generated Fetch Clients\n </li>\n </ul>\n </div>\n\n <div className={styles.stepsBox}>\n <h2 className={styles.stepsTitle}>Next Steps 🢂</h2>\n <ul className={styles.stepsList}>\n <li>\n Edit this page at <code>pages/index/index.tsx</code>\n </li>\n <li>Create new routes by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div className={styles.footer}>\n <p className={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n className={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,w=`import { QueryClient, type QueryClientConfig } from \"@tanstack/react-query\";\n\nlet client: QueryClient | undefined;\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n client = new QueryClient(options);\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n if (!client) {\n client = new QueryClient();\n }\n return client;\n};\n`,T=`import { QueryClient, type QueryClientConfig } from \"@tanstack/react-query\";\n\nimport { store } from \"{{ createImport 'lib' '@ssr/base' }}\";\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n const client = new QueryClient(options);\n const ctx = store?.getStore();\n if (ctx) {\n ctx.tsqClient = client;\n }\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n const ctx = store?.getStore();\n if (!ctx) {\n throw new Error(\"getQueryClient(): called outside an SSR request scope\");\n }\n if (!ctx.tsqClient) {\n ctx.tsqClient = new QueryClient();\n }\n return ctx.tsqClient as QueryClient;\n};\n`,E=`export type ComponentLoader = () => Promise<{\n loader?: (arg: unknown) => Promise<unknown>;\n}>;\n\nexport const loaderFactory = (opt?: { withPreload?: boolean }) => {\n return (componentLoader: ComponentLoader) => {\n const loader = async (arg: unknown) => {\n try {\n const component = await componentLoader();\n // Return null, not undefined, when a route has no loader. RR keys\n // hydration data by route id; an undefined value is dropped by\n // JSON.stringify during serialization, leaving the id absent, which\n // makes RR re-run the loader on the client and double-render. null\n // survives serialization, so the id stays present and RR skips it.\n return typeof component.loader === \"function\"\n ? await component.loader(arg)\n : null;\n } catch (error) {\n // TODO: swallowing loader errors is wrong. Returning null hydrates the\n // route as \"loaded, value null\" - RR never sees the failure, so no\n // errorElement/ErrorBoundary fires on server or client, and this\n // console.error runs server-side during SSR so the client sees nothing.\n // Proper fix: let the error reach RR's \\`context.errors\\` (rethrow, or\n // return a Response/data() with an error status) so it serializes into\n // __staticRouterHydrationData.errors and renders the route boundary\n // isomorphically.\n console.error(error);\n return null;\n }\n };\n return opt?.withPreload ? { loader } : {};\n };\n};\n`,D=`import type { JSX, ComponentType } from \"react\";\n\nimport {\n type RouteObject,\n createBrowserRouter,\n createStaticHandler,\n createStaticRouter,\n RouterProvider,\n StaticRouterProvider,\n} from \"react-router\";\n\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nexport const createRouters = (\n routes: Array<RouteObject>,\n { app }: { app: ComponentType },\n): {\n clientRouter: () => RouterFactoryReturn<Promise<JSX.Element>>;\n serverRouter: (url: URL) => RouterFactoryReturn<Promise<JSX.Element>>;\n} => {\n const routeStack = [\n {\n path: \"/\",\n Component: app,\n children: routes,\n },\n ];\n\n const handler = createStaticHandler(routeStack, { basename: base });\n\n const clientRouter = async () => {\n const router = createBrowserRouter(routeStack, { basename: base });\n const component = <RouterProvider router={router} />;\n return { component };\n }\n\n const serverRouter = async (url: URL) => {\n\n const context = await handler.query(new Request(url.href));\n\n if (context instanceof Response) {\n // handled by SSR server\n throw context;\n }\n\n const router = createStaticRouter(routeStack, context);\n const component = <StaticRouterProvider router={router} context={context} />;\n\n return { component };\n }\n\n return { clientRouter, serverRouter }\n}\n\nexport default createRouterFactory<RouteObject, Promise<JSX.Element>>();\n`,O=`import { Outlet } from \"react-router\";\nimport { AppProvider } from \"{{ createImport 'lib' 'app' }}\";\n\nexport default function App() {\n return (\n <AppProvider>\n <Outlet />\n </AppProvider>\n );\n}\n`,k=`import {\n type LinkProps as RouterLinkProps,\n Link as RouterLink,\n} from \"react-router\";\nimport type { ReactNode } from \"react\";\n\nimport { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\nexport default function Link(\n props: Omit<RouterLinkProps, \"to\"> & {\n to: LinkProps;\n query?: Record<string | number, unknown>;\n children: ReactNode;\n },\n) {\n const { to, query, children, ...restProps } = props;\n\n const href = () => {\n const [key, ...params] = to;\n return pageRouteMap[key]?.base(params as never, query);\n };\n\n return (\n <RouterLink {...restProps} to={href()}>\n {children}\n </RouterLink>\n );\n}\n`,A=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes({ withPreload: true });\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,j=`import renderFactory, {\n createRoutes,\n renderToStream,\n renderToString,\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes({ withPreload: true });\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n renderToStream(url, { assets }) {\n return renderToStream(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,M=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,N=`import PageSample from \"{{ createImport 'lib' 'pageSamples/404.tsx' }}\";\n\nexport default function Page() {\n return <PageSample />;\n}\n`,P=`import { Outlet } from \"react-router\";\n\nexport default function Layout() {\n return <Outlet />;\n}\n`,F=`import PageSample from \"{{ createImport 'lib' 'pageSamples/page.tsx' }}\";\n\nexport default function Page() {\n return PageSample({\n message: \"{{message}}\",\n routeName: \"{{route.name}}\",\n pathMap: {\n page: \"{{ createImport 'pages' route.file }}\",\n pages: \"{{ createImport 'pages' }}\",\n api: \"{{ createImport 'api' }}\",\n },\n });\n}\n`,I=`export { default } from \"{{ createImport 'lib' 'pageSamples/welcome.tsx' }}\";\n`,L=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\n\nimport app from \"./app\";\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, { app });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,R=t((e,t)=>{let{createPath:u,createImportHelpers:d}=r(e),{renderToFile:f}=i({helpers:{...d({origin:`lib`}),...l()},partials:{routePartial:v}}),{renderToFile:R}=i({helpers:d({origin:`src`})}),z=p(),B=e=>!e?.trim().length,V=s(t?.templates,F),H=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await R(u.pages(n.file),n.name===`index`?I:V(n.name,n),{route:n,message:m()},{overwrite:B}):t===`pageLayout`&&await R(u.pages(n.file),P,{route:n},{overwrite:B})},U=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(a),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=z(n(r));for(let[e,t]of[[`client.ts`,_],[`server.ts`,y]])await f(u.libEntry(e),t,{pageEntries:r,nestedRoutes:i});await f(u.lib(`router.tsx`),D,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[o(n)]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`react.ts`,E],[`pageSamples/styles.module.css`,S],[`pageSamples/welcome.tsx`,C],[`pageSamples/page.tsx`,x],[`pageSamples/404.tsx`,b],...t?.tanstack?.query?[[`app.tsx`,g],[`query.ts`,w]]:[[`app.tsx`,h],[`query.ts`,`/** tanstack query disabled */`]]])await f(u.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,N],[`components/Link.tsx`,k],[`app.tsx`,O],[`router.ts`,L]])await R(u.src(e),t,{entryDir:c.entryDir},{overwrite:B});await R(u.src(`index.html`),M,{entryDir:c.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,A],[`server.ts`,j]])await R(u.entry(e),t,{},{overwrite:B})},async watch(e,t){(!t||t.kind===`create`)&&await H(e),await U(e)},async build(e){await H(e),await U(e)},async ssrBuild(){await f(u.lib(`query.ts`),t?.tanstack?.query?T:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),z=e({meta:{name:`React`,jsx:`preserve`,jsxImportSource:`react`},dependencies(e){return{react:d.devDependencies.react,\"react-router\":d.devDependencies[`react-router`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{\"@tanstack/react-query\":d.devDependencies[`@tanstack/react-query`]}:{}}},devDependencies:{\"@types/react\":d.devDependencies[`@types/react`],\"@types/react-dom\":d.devDependencies[`@types/react-dom`],\"react-dom\":d.devDependencies[`react-dom`]},factory:R});export{z as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,nestedRoutesFactory as n,pathResolver as r,renderFactory as i,sortRoutes as a}from\"@kosmojs/lib\";import o from\"vite-plugin-solid\";import{createTemplateResolver as s,defaults as c}from\"@kosmojs/core\";import{routeRenderHelpers as l}from\"@kosmojs/core/generators\";import{styleText as u}from\"node:util\";var d={type:`module`,private:!0,name:`@kosmojs/solid-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/solid-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"vite-plugin-solid\":`^2.11.14`},devDependencies:{\"@solidjs/router\":`^1.0.0`,\"@tanstack/solid-query\":`^5.101.4`,\"path-to-regexp\":`^8.4.2`,\"solid-js\":`^1.9.14`}},f=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=t=>t?.kind===`param`?t.parts[0]?.kind===`optional`||e(t):!1,n=r=>r.flatMap(({index:r,layout:i,children:a})=>{let{pathTokens:o}={...r,...i},s=p(o.map((e,n)=>e.kind===`param`&&(t(o[n+1])||a.some(e=>e.index?.pathTokens.some(t)))?{...e,parts:[{...e.parts[0],kind:`required`}]}:e)),c=o.at(-1);if(e(c)){let e=p([c]);return r&&i?[{path:s,component:i.id,children:[{path:e,component:r.id}]}]:r?[{path:s,children:[{path:e,component:r.id},...n(a)]}]:i?[{path:s,component:i.id,children:n(a)}]:[]}return r&&i?[{path:s,component:i.id,children:[{path:`/`,component:r.id},...n(a)]}]:r?[{path:s,children:[{path:`/`,component:r.id},...n(a)]}]:i?[{path:s,component:i.id,children:n(a)}]:[]});return n},p=e=>{let t=e.map(e=>e.orig).join(`/`),n=e=>e.kind===`splat`?`*${e.name}`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[n(e.parts[0])]:(e.parts.length&&(console.warn(`❗${u([`red`,`bold`],`WARN`)}: At the moment Solid Router does not support mixed path segments.`),console.warn(` ${u([`magenta`],e.orig)} segment in ${u([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},m=()=>{let e=[`🎉 Well done! You just created a new Solid route.`,`🚀 Success! A fresh Solid route is ready to roll.`,`🌟 Nice work! Another Solid route added to your app.`,`🧩 All set! A new Solid route has been scaffolded.`,`🔧 Scaffold complete! Your new Solid route is in place.`,`✅ Built! Your Solid route is scaffolded and ready.`,`✨ Fantastic! Your new Solid route is good to go.`,`🎯 Nailed it! A brand new Solid route just landed.`,`💫 Awesome! Another Solid route joins the party.`,`⚡ Lightning fast! A new Solid route created successfully.`];return e[Math.floor(Math.random()*e.length)]},h=`import type { ParentComponent } from \"solid-js\";\n\nexport const AppProvider: ParentComponent = (props) => {\n return props.children;\n};\n`,g=`import type { ParentComponent } from \"solid-js\";\nimport { type QueryClient, QueryClientProvider } from \"@tanstack/solid-query\";\n\nimport { getQueryClient } from \"./query\";\n\nexport const AppProvider: ParentComponent<{ client?: QueryClient }> = (props) => {\n return (\n <QueryClientProvider client={props.client ?? getQueryClient()}>\n {props.children}\n </QueryClientProvider>\n );\n};\n`,_=`import { lazy, type JSX } from \"solid-js\";\nimport { hydrate as hydrateOrig, render } from \"solid-js/web\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { loaderFactory } from \"../solid\";\n\n{{#each pageEntries}}\nconst {{id}}_component = lazy(() => import(\"{{ createImport 'pages' file }}\"));\nconst {{id}}_loader = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nconst NotFound = lazy(() => import(\"{{ createImport 'pages' '404.tsx' }}\"));\n\nexport const createRoutes = (opt?: { withPreload?: boolean }) => {\n const maybeLoader = loaderFactory(opt);\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"*\",\n component: NotFound,\n },\n ];\n}\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<JSX.Element>,\n root: HTMLElement,\n opts?: Parameters<typeof hydrateOrig>[2],\n) => {\n hydrateOrig(() => resolver().component, root, opts);\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<JSX.Element>,\n root: HTMLElement,\n init?: Parameters<typeof render>[2],\n opts?: Parameters<typeof render>[3],\n) => {\n render(() => resolver().component, root, init, opts);\n}\n\nexport default clientRenderFactory();\n`,v=`{\n path: \"{{path}}\",\n {{#if component}}\n component: {{component}}_component,\n ...maybeLoader({{component}}_loader as never),\n {{/if}}\n {{#if children.length}}\n children: [ {{#each children}}{{> routePartial}}, {{/each}}],\n {{/if}}\n}\n`,y=`import type { JSX } from \"solid-js\";\n\nimport {\n generateHydrationScript,\n renderToStringAsync,\n renderToStream as renderToStreamOrig,\n} from \"solid-js/web\";\n\nimport { provideRequestEvent } from \"solid-js/web/storage\";\n\nimport type {\n RenderToStringWrapper,\n RenderToStreamWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { loaderFactory } from \"../solid\";\n\n{{#each pageEntries}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\nconst {{id}}_component = {{id}}.default;\nconst {{id}}_loader = async () => {{id}};\n{{/each}}\n\nimport NotFound from \"{{ createImport 'pages' '404.tsx' }}\";\n\nexport const createRoutes = (opt?: { withPreload?: boolean }) => {\n const maybeLoader = loaderFactory(opt);\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"*\",\n component: NotFound,\n },\n ];\n}\n\nexport const renderWrapper: SSRRenderWrapper = (context, render) => {\n const event = {\n request: new Request(context.url ?? \"http://ssr.local\", {\n headers: new Headers(context.headers),\n }),\n locals: {},\n };\n return provideRequestEvent(event as never, render);\n};\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<JSX.Element>,\n Parameters<typeof renderToStringAsync>[1]\n> = async (resolver, { headerTags = [], ...options } = {}) => {\n return {\n head: [...headerTags, generateHydrationScript()].join(\"\\\\n\"),\n html: await renderToStringAsync(() => resolver().component, options),\n };\n};\n\nexport const renderToStream: RenderToStreamWrapper<\n () => RouterFactoryReturn<JSX.Element>,\n Parameters<typeof renderToStreamOrig>[1]\n> = async (resolver, { headerTags = [], ...options } = {}) => {\n const stream = renderToStreamOrig(() => resolver().component, options);\n const { readable, writable } = new TransformStream<string, string>();\n stream.pipeTo(writable);\n return {\n head: [...headerTags, generateHydrationScript()].join(\"\\\\n\"),\n html: readable,\n };\n};\n\nexport default serverRenderFactory<true>();\n`,b=`/* @jsxImportSource solid-js */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n headline?: string;\n}) {\n return (\n <div class={styles.container}>\n <div class={styles.card}>\n\n <h2 class={styles.title}>\n {props.headline || \"404: Not Found\"}\n </h2>\n <br />\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>\n Something went wrong...\n </h2>\n 🚧 No page found here\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,x=`/* @jsxImportSource solid-js */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string }\n}) {\n return (\n <div data-page-route={props.routeName} class={styles.container}>\n <div class={styles.card}>\n\n <h2 class={styles.subtitle}>\n {props.message}\n </h2>\n <br />\n\n <div class={styles.stepsBox}>\n <ul class={styles.stepsList}>\n <li>\n Edit this page at <code>{props.pathMap.page}</code>\n </li>\n <li>\n Create new pages by adding folders in\n <code>{props.pathMap.pages}/</code>\n </li>\n <li>\n Add API endpoints in\n <code>{props.pathMap.api}/</code>\n </li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,S=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,C=`/* @jsxImportSource solid-js */\n\nimport styles from \"./styles.module.css\";\n\nexport default function WelcomePage() {\n return (\n <div class={styles.container}>\n <div class={styles.card}>\n <div class={styles.header}>\n <div class={styles.icon}>✨</div>\n <h1 class={styles.title}>Welcome to KosmoJS</h1>\n <p class={styles.subtitle}>\n Type-safe full-stack development with Vite\n </p>\n </div>\n\n <div class={styles.featuresBox}>\n <h2 class={styles.featuresTitle}>\n Powered by SolidJS and ready to perform\n </h2>\n <div class={styles.featuresSubtitle}>What's included:</div>\n <ul class={styles.featuresList}>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Directory-based routing\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n End-to-End Type Safety\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Generated Fetch Clients\n </li>\n </ul>\n </div>\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>Next Steps 🢂</h2>\n <ul class={styles.stepsList}>\n <li>\n Edit this page at <code>pages/index/index.tsx</code>\n </li>\n <li>Create new routes by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,w=`import { QueryClient, type QueryClientConfig } from \"@tanstack/solid-query\";\n\nlet client: QueryClient | undefined;\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n client = new QueryClient(options);\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n if (!client) {\n client = new QueryClient();\n }\n return client;\n};\n`,T=`import { QueryClient, type QueryClientConfig } from \"@tanstack/solid-query\";\n\nimport { store } from \"{{ createImport 'lib' '@ssr/base' }}\";\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n const client = new QueryClient(options);\n const ctx = store?.getStore();\n if (ctx) {\n ctx.tsqClient = client;\n }\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n const ctx = store?.getStore();\n if (!ctx) {\n throw new Error(\"getQueryClient(): called outside an SSR request scope\");\n }\n if (!ctx.tsqClient) {\n ctx.tsqClient = new QueryClient();\n }\n return ctx.tsqClient as QueryClient;\n};\n`,E=`import type { JSX, ParentComponent } from \"solid-js\";\nimport { Router, type RouteDefinition } from \"@solidjs/router\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nexport const createRouters = (\n routes: Array<RouteDefinition>,\n { app }: { app: ParentComponent },\n): {\n clientRouter: () => RouterFactoryReturn<JSX.Element>;\n serverRouter: (url: URL) => RouterFactoryReturn<JSX.Element>;\n} => {\n const clientRouter = () => {\n const component = (\n <Router root={app} base={base}>\n {routes}\n </Router>\n );\n return { component };\n }\n\n const serverRouter = (url: URL) => {\n const component = (\n <Router root={app} base={base} url={url.pathname}>\n {routes}\n </Router>\n );\n return { component };\n }\n\n return { clientRouter, serverRouter };\n}\n\nexport default createRouterFactory<RouteDefinition, JSX.Element>();\n`,D=`export type ComponentLoader = () => Promise<{\n preload?: () => Promise<unknown>;\n}>;\n\nexport const loaderFactory = (opt?: { withPreload?: boolean }) => {\n return (componentLoader: ComponentLoader) => {\n const preload = async () => {\n try {\n const component = await componentLoader();\n return typeof component.preload === \"function\"\n ? component.preload\n : undefined;\n } catch (error) {\n console.error(error);\n return;\n }\n };\n return opt?.withPreload ? { preload } : {};\n };\n};\n`,O=`export type MaybeWrapped<T> = import(\"solid-js/store\").Store<T> | T;\n\nexport { unwrap } from \"solid-js/store\";\n`,k=`import type { ParentComponent } from \"solid-js\";\nimport { AppProvider } from \"{{ createImport 'lib' 'app' }}\";\n\nconst App: ParentComponent = (props) => {\n return <AppProvider>{props.children}</AppProvider>;\n};\n\nexport default App;\n`,A=`import { A, type AnchorProps } from \"@solidjs/router\";\nimport { type JSXElement, splitProps } from \"solid-js\";\n\nimport { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\nexport default function Link(\n props: Omit<AnchorProps, \"href\"> & {\n to: LinkProps;\n query?: Record<string | number, unknown>;\n children: JSXElement;\n },\n) {\n const [knownProps, restProps] = splitProps(props, [\n \"to\",\n \"query\",\n \"children\",\n ]);\n\n const href = () => {\n const [key, ...params] = knownProps.to;\n return pageRouteMap[key]?.base(params as never, knownProps.query);\n };\n\n return <A {...{ ...restProps, href: href() }}>{knownProps.children}</A>;\n}\n`,j=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes({ withPreload: true });\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,M=`import renderFactory, {\n createRoutes,\n renderToStream,\n renderToString,\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes({ withPreload: true });\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n renderToStream(url, { assets }) {\n return renderToStream(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,N=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,P=`import PageSample from \"{{ createImport 'lib' 'pageSamples/404.tsx' }}\";\n\nexport default function Page() {\n return <PageSample />;\n}\n`,F=`import type { ParentComponent } from \"solid-js\";\n\nconst Layout: ParentComponent = (props) => {\n return props.children;\n};\n\nexport default Layout;\n`,I=`import PageSample from \"{{ createImport 'lib' 'pageSamples/page.tsx' }}\";\n\nexport default function Page() {\n return PageSample({\n message: \"{{message}}\",\n routeName: \"{{route.name}}\",\n pathMap: {\n page: \"{{ createImport 'pages' route.file }}\",\n pages: \"{{ createImport 'pages' }}\",\n api: \"{{ createImport 'api' }}\",\n },\n });\n}\n`,L=`export { default } from \"{{ createImport 'lib' 'pageSamples/welcome.tsx' }}\";\n`,R=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\n\nimport app from \"./app\";\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, { app });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,z=t((e,t)=>{let{generators:u=[]}=e.config,{createPath:d,createImportHelpers:p}=r(e),{renderToFile:z}=i({helpers:{...p({origin:`lib`}),...l()},partials:{routePartial:v}}),{renderToFile:B}=i({helpers:p({origin:`src`})}),V=f(),H=e=>!e?.trim().length,U=s(t?.templates,I),W=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await B(d.pages(n.file),n.name===`index`?L:U(n.name,n),{route:n,message:m()},{overwrite:H}):t===`pageLayout`&&await B(d.pages(n.file),F,{route:n},{overwrite:H})},G=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(a),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=V(n(r));for(let[e,t]of[[`client.ts`,_],[`server.ts`,y]])await z(d.libEntry(e),t,{pageEntries:r,nestedRoutes:i});await z(d.lib(`router.tsx`),E,{entries:e,indexRoutes:t})};return{config({command:e}){let{templates:n,...r}={...t};return{oxc:{jsx:{importSource:`solid-js`}},plugins:e===`build`?[o({...r,...u.some(e=>e.meta.slot===`ssr`)?{ssr:!0,solid:{...r?.solid,hydratable:!0}}:{}})]:[o({...r,dev:!0,hot:!0})]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`solid.ts`,D],[`unwrap.ts`,O],[`pageSamples/styles.module.css`,S],[`pageSamples/welcome.tsx`,C],[`pageSamples/page.tsx`,x],[`pageSamples/404.tsx`,b],...t?.tanstack?.query?[[`app.tsx`,g],[`query.ts`,w]]:[[`app.tsx`,h],[`query.ts`,`/** tanstack query disabled */`]]])await z(d.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,P],[`components/Link.tsx`,A],[`app.tsx`,k],[`router.ts`,R]])await B(d.src(e),t,{entryDir:c.entryDir},{overwrite:H});await B(d.src(`index.html`),N,{entryDir:c.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,j],[`server.ts`,M]])await B(d.entry(e),t,{},{overwrite:H})},async watch(e,t){(!t||t.kind===`create`)&&await W(e),await G(e)},async build(e){await W(e),await G(e)},async ssrBuild(){await z(d.lib(`query.ts`),t?.tanstack?.query?T:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),B=e({meta:{name:`SolidJS`,jsx:`preserve`,jsxImportSource:`solid-js`},dependencies(e){return{\"solid-js\":d.devDependencies[`solid-js`],\"@solidjs/router\":d.devDependencies[`@solidjs/router`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{\"@tanstack/solid-query\":d.devDependencies[`@tanstack/solid-query`]}:{}}},factory:z});export{B as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,mergeConfigs as n,pathResolver as r,spinnerFactory as i,vitePlugins as a}from\"@kosmojs/lib\";import{access as o,constants as s,cp as c,mkdir as l,rm as u,writeFile as d}from\"node:fs/promises\";import{join as f,resolve as p}from\"node:path\";import{styleText as m}from\"node:util\";import{build as h}from\"vite\";var g=t(e=>{let{generators:t=[],refineTypeName:g,...v}={...e.config},{createPath:y}=r(e);return{async postBuild(){let r=y.distDir(`ssg`),g=p(r,`../ssr/server.js`);if(!await o(g,s.F_OK).then(()=>!0,()=>!1)){console.error(),console.error(m(`red`,`❗Please enable ssrGenerator in ${e.name}/kosmo.config.ts`)),console.error(` SSG generator can not run without SSR server`),console.error();return}let b=i(`${e.name}: SSG`);b.append(`preparing...`);let{createDisposableServer:x}=await import(g);await c(p(r,`../client/assets`),f(r,`assets`),{recursive:!0}),b.append(`bundling routes...`),await h(n(v,...t.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:y.lib(),appType:`custom`,plugins:[a.tsconfigPaths(e),a.nodePrefix()],resolve:{conditions:[`node`]},build:{ssr:y.lib(`ssg.ts`),target:`esnext`,sourcemap:!1,emptyOutDir:!0,rolldownOptions:{output:{dir:r,entryFileNames:`routes.js`,format:`esm`}}}}));try{let e=await import(f(r,`routes.js`)).then(e=>e.default);x(async t=>{for(let[n,i]of e.entries()){b.append(`[ ${n+1} of ${e.length} ] ${i}`);let a=await _(t,i);a!==void 0&&(await l(f(r,i),{recursive:!0}),await d(f(r,f(i,`index.html`)),a,`utf8`))}b.succeed(`done ✨`)})}finally{await u(`${r}/routes.js`)}}}}),_=async(e,t)=>{try{let n=`http://localhost:${e}${t}`;return await(await fetch(n)).text()}catch(e){console.error(m(`red`,`✗ SSG: Failed generating ${t} route: ${e.message}`));return}},v=e({meta:{name:`SSG`,slot:`ssg`},factory:g});export{v as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,mergeConfigs as n,pathResolver as r,renderFactory as i,sortRoutes as a,vitePlugins as o}from\"@kosmojs/lib\";import{cp as s,rm as c}from\"node:fs/promises\";import{join as l,resolve as u}from\"node:path\";import{build as d}from\"vite\";import{createRouteResolver as f}from\"@kosmojs/core\";var p={type:`module`,private:!0,name:`@kosmojs/ssr-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,vite:`^8.2.1`},devDependencies:{\"@hono/node-server\":`^2.1.0`,hono:`^4.13.1`,\"light-my-request\":`^6.6.0`,tinyglobby:`^0.2.17`}},m=`{{#if apiGenerator}}\nexport { default as apiApp } from \"{{ createImport 'api' 'app' }}\";\n{{else}}\nexport const apiApp = undefined;\n{{/if}}\n`,h=`import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type RequestContext = {\n headers?: HeadersInit;\n tsqClient?: unknown;\n};\n\nexport const redirectCodes = [\n // Moved Permanently\n 301,\n // Found (temporary)\n 302,\n // See Other (redirect after POST)\n 303,\n // Temporary Redirect (preserves method)\n 307,\n // Permanent Redirect (preserves method)\n 308,\n];\n\n/**\n * Origin used to absolutize the relative URLs the client produces.\n * Never resolved over the network; the host part is irrelevant to\n * route matching in both Hono and Koa.\n * */\nexport const ssrOrigin = \"http://ssr.local\";\n\n/**\n * Maximum redirect hops, mirroring the fetch spec limit.\n * */\nexport const maxRedirects = 5;\n\n/**\n * Request-scoped context store.\n * Server-only module - never reaches browser bundles.\n * */\nexport const store = new AsyncLocalStorage<RequestContext>();\n`,g=`import { type RequestContext, store } from \"./base\";\n\nimport { renderWrapper } from \"{{ createImport 'libEntry' 'server' }}\";\n\nexport { default as ssrApp } from \"{{ createImport 'entry' 'server' }}\";\nexport { apiApp } from \"{{ createImport 'lib' '@ssr/api' }}\";\n\n/**\n * Wraps a render call, making the given context visible to every\n * fetch dispatch that happens during it - across await points,\n * stream chunks and parallel component data loads.\n * */\nexport const withSsrContext = <T>(\n context: RequestContext,\n render: () => T,\n): T => {\n return store.run(context, () => renderWrapper(context, render));\n};\n`,_=`import { inject } from \"light-my-request\";\n\nimport { type FetchApp, isFetchApp, type NodeApp } from \"@kosmojs/core\";\nimport type { Transport } from \"@kosmojs/core/fetch\";\n\nimport { maxRedirects, redirectCodes, ssrOrigin, store } from \"./base\";\n\nimport { apiApp } from \"{{ createImport 'lib' '@ssr/api' }}\";\n\n/**\n * HeadersProvider for createTransport.\n * */\nconst headersProvider = (): HeadersInit | undefined => {\n return store.getStore()?.headers;\n};\n\n/**\n * Builds a fetch-compatible transport that dispatches requests\n * directly into the given app - no sockets, no interception.\n * Redirects are followed in-process, including the 303 and 301/302 method rewrite to GET.\n * */\nconst createTransport = (app: FetchApp | NodeApp): Transport => {\n const dispatch = isFetchApp(app) //\n ? app.fetch\n : createNodeDispatch(app);\n\n return async (input, init) => {\n /**\n * Request-scoped headers act as defaults: anything set explicitly\n * on the call itself wins over forwarded values.\n * */\n const headers = new Headers(init?.headers);\n\n // When the body is FormData, the Request constructor sets a multipart\n // Content-Type with a fresh boundary. A forwarded Content-Type default would\n // override that boundary and desync it from the serialized body, so never\n // forward Content-Type for FormData bodies.\n const isFormBody = init?.body instanceof FormData;\n\n for (const [key, value] of new Headers(headersProvider() || undefined)) {\n if (isFormBody && key.toLowerCase() === \"content-type\") {\n continue;\n }\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n }\n\n let request = new Request(new URL(String(input), ssrOrigin), {\n ...init,\n headers,\n });\n\n /**\n * Bodies are buffered once so they can be replayed across\n * 307/308 hops; the client only ever sends strings, FormData\n * and buffer-ish payloads, so this is safe and cheap.\n * */\n const body = [\"GET\", \"HEAD\"].includes(request.method)\n ? undefined\n : await request.arrayBuffer();\n\n for (let hop = 0; ; hop++) {\n if (hop === maxRedirects) {\n throw new TypeError(\"Failed to fetch: too many redirects\");\n }\n\n const response = await dispatch(\n body === undefined || request.method === \"GET\"\n ? new Request(request, { body: null })\n : new Request(request, { body }),\n );\n\n const location = response.headers.get(\"location\");\n\n if (!location || !redirectCodes.includes(response.status)) {\n return response;\n }\n\n const method =\n response.status === 303 ||\n ([301, 302].includes(response.status) && request.method === \"POST\")\n ? \"GET\"\n : request.method;\n\n request = new Request(new URL(location, request.url), {\n method,\n headers: request.headers,\n });\n }\n };\n};\n\n/**\n * Node dispatch: serializes the web Request into light-my-request's\n * injection format and lifts the injected response back into a web Response.\n * */\nconst createNodeDispatch = (app: NodeApp) => {\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n\n const payload = [\"GET\", \"HEAD\"].includes(request.method)\n ? undefined\n : Buffer.from(await request.arrayBuffer());\n\n const result = await inject(app.callback() as never, {\n method: request.method as never,\n url: url.pathname + url.search,\n headers: Object.fromEntries(request.headers),\n ...(payload?.length ? { payload } : {}),\n });\n\n const headers = new Headers();\n\n for (const [key, value] of Object.entries(result.headers)) {\n for (const entry of Array.isArray(value) ? value : [value]) {\n if (entry !== undefined) {\n headers.append(key, String(entry));\n }\n }\n }\n\n /**\n * 204/304 responses must not carry a body per the Response\n * constructor contract.\n * */\n const body = [204, 304].includes(result.statusCode)\n ? null\n : new Uint8Array(result.rawPayload);\n\n return new Response(body, {\n status: result.statusCode,\n statusText: result.statusMessage,\n headers,\n });\n };\n};\n\nexport const transport = apiApp ? createTransport(apiApp) : globalThis.fetch;\n`,v=`export const routeMap = [\n{{#each pageRoutes}}\n { pathPattern: \"{{honoPattern}}\", renderMode: \"{{renderMode}}\" },\n{{/each}}\n];\n`,y=`import { access, chmod, constants, readFile, unlink } from \"node:fs/promises\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { extname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseArgs, styleText } from \"node:util\";\n\nimport { createAdaptorServer, getRequestListener } from \"@hono/node-server\";\nimport { type Context, Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { stream } from \"hono/streaming\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n type FetchApp,\n isFetchApp,\n type NodeApp,\n type SSRSetup,\n} from \"@kosmojs/core\";\n\nimport { redirectCodes, ssrOrigin } from \"./@ssr/base\";\n\nimport { routeMap } from \"{{ createImport 'lib' '@ssr/routes' }}\";\nimport { apiBase, base } from \"{{ createImport 'libCore' }}\";\n\nconst ROOT = import.meta.dirname;\n\ntype AssetInfo = {\n file: string;\n // Raw file contents kept in memory for fast, zero-I/O responses.\n buffer: Uint8Array;\n // HTTP Content-Type header for this asset (derived from extension).\n contentType: string;\n // Cached size to set Content-Length without re-measuring the buffer.\n size: number;\n};\n\nexport const createApp = async () => {\n // Import the SSR entry produced by Vite's ssr build.\n const {\n ssrApp,\n withSsrContext,\n }: {\n ssrApp: SSRSetup;\n withSsrContext: <T>(\n context: { headers?: Record<string, string>; url?: string },\n render: () => T,\n ) => Promise<T>;\n } = await import(\\`\\${ROOT}/app.js\\`);\n\n // Read the client index.html that includes <!--app-head--> and <!--app-html-->\n // placeholders used for SSR injection.\n const template = await readFile(\\`\\${ROOT}/index.html\\`, \"utf8\");\n\n // Load the Vite manifest\n const manifest = await import(\\`\\${ROOT}/.vite/manifest.json\\`, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const { renderToString, renderToStream } = ssrApp;\n const [htmlStart, htmlEnd] = template.split(\"<!--app-html-->\");\n\n const assets = await loadAssets(ROOT);\n\n const ssrOptions = () => {\n const cssAssets = [...assets.entries()].flatMap(\n ([path, { file, buffer, size }]) => {\n // Vite is naming assets by entry name\n if (!/^__kosmo_ssr_bundle-.+\\\\.css$/i.test(file)) {\n return [];\n }\n\n // skip if template contains a file with same hash\n if (template.includes(file.replace(/^__kosmo_ssr_bundle\\\\b/, \"\"))) {\n return [];\n }\n\n return [\n {\n kind: \"css\" as const,\n tag: \\`<link rel=\"stylesheet\" crossorigin href=\"\\${path}\" />\\`,\n content: new TextDecoder().decode(buffer),\n size,\n path,\n },\n ];\n },\n );\n\n const content = \"window.__KOSMO_HYDRATION_BOOL__ = true;\";\n\n return {\n template,\n manifest,\n assets: [\n ...cssAssets,\n {\n kind: \"js\" as const,\n tag: \\`<script>\\${content}<\\/script>\\`,\n content,\n size: content.length,\n },\n ],\n };\n };\n\n const renderPage = async (url: URL, ctx: Context) => {\n const { head = \"\", html } = await withSsrContext(\n {\n headers: Object.fromEntries(ctx.req.raw.headers),\n url: ctx.req.url,\n },\n () => renderToString(url, ssrOptions()),\n );\n return [\n htmlStart.replace(\"<!--app-head-->\", head),\n html ?? \"\",\n htmlEnd,\n ].join(\"\");\n };\n\n const app = new Hono({ strict: false });\n\n for (const { pathPattern, renderMode } of routeMap) {\n app.get(join(base, pathPattern), async (ctx) => {\n try {\n const url = new URL(ctx.req.url);\n\n if (renderMode === \"string\" && typeof renderToString === \"function\") {\n const page = await renderPage(url, ctx);\n return ctx.html(page);\n }\n\n if (renderMode === \"stream\" && typeof renderToStream === \"function\") {\n ctx.header(\"Content-Type\", \"text/html\");\n return stream(ctx, async (stream) => {\n const { head = \"\", html } = await withSsrContext(\n {\n headers: Object.fromEntries(ctx.req.raw.headers),\n url: ctx.req.url,\n },\n () => renderToStream(url, ssrOptions(), stream as never),\n );\n await stream.write(htmlStart.replace(\"<!--app-head-->\", head));\n await stream.pipe(html);\n await stream.write(htmlEnd);\n });\n }\n\n ctx.status(501);\n return ctx.html(\"<h1>501: Not Implemented</h1>\");\n } catch (error: any) {\n // Handle thrown Response instances as redirects.\n // Re-throw other errors for upstream handling.\n if (error instanceof Response) {\n const Location = error.headers.get(\"Location\");\n\n if (!Location || !redirectCodes.includes(error.status)) {\n ctx.status(500);\n return ctx.html(\"<h1>500: Malformed redirect</h1>\");\n }\n\n return ctx.redirect(Location, error.status as never);\n }\n throw new HTTPException(500, { message: error.message, cause: error });\n }\n });\n }\n\n app.get(\"/*\", async (ctx) => {\n const { path } = ctx.req;\n\n // If incoming request path matches something cached at startup, serve it directly.\n // This covers JS, CSS, images, fonts, etc., including their .map siblings.\n const asset = assets.get(path);\n\n if (asset) {\n return new Response(asset.buffer as never, {\n headers: {\n \"Content-Type\": asset.contentType,\n \"Content-Length\": String(asset.size),\n },\n });\n }\n\n // render 404 page\n if (typeof renderToString === \"function\") {\n const url = new URL(ctx.req.url);\n const page = await renderPage(url, ctx);\n ctx.status(404);\n return ctx.html(page);\n }\n\n return ctx.notFound();\n });\n\n return app;\n};\n\n/**\n * Build an in-memory asset graph, loading asset content into memory.\n * The asset graph always includes every built asset URL so the SSR server\n * can correctly recognize static asset requests.\n * */\nconst loadAssets = async (\n root: string,\n patterns: string | Array<string> = \"**\",\n) => {\n const mimeTypeMap: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".apng\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".webp\": \"image/webp\",\n };\n\n // Resolve HTTP Content-Type from the asset's file extension.\n const contentTypeResolver = (filePath: string) => {\n const ext = extname(filePath).toLowerCase();\n return mimeTypeMap[ext] || \"application/octet-stream\";\n };\n\n // Map from URL path (as used in requests) to asset metadata.\n const assetCache = new Map<string, AssetInfo>();\n\n const folder = \"assets\";\n const cwd = resolve(root, folder);\n\n if (\n await access(cwd, constants.R_OK)\n .then(() => true)\n .catch(() => false)\n ) {\n const files = await glob(patterns, {\n cwd,\n onlyFiles: true,\n absolute: false,\n });\n\n for (const file of files) {\n const buffer = new Uint8Array(await readFile(resolve(cwd, file)));\n assetCache.set(join(base, folder, file), {\n file,\n buffer,\n contentType: contentTypeResolver(file),\n size: buffer?.length,\n });\n }\n }\n\n return assetCache;\n};\n\ntype NodeListener = (req: IncomingMessage, res: ServerResponse) => void;\n\nconst createNodeListener = (app: FetchApp | NodeApp): NodeListener => {\n return isFetchApp(app)\n ? getRequestListener((app as FetchApp).fetch)\n : (app as NodeApp).callback();\n};\n\nexport const startServer = async ({\n sock,\n port,\n}: {\n sock?: string | undefined;\n port?: string | number | undefined;\n}) => {\n if (![sock, port].some(Boolean)) {\n throw new Error(\"Please provide either -p/--port or -s/--sock\");\n }\n\n const {\n apiApp,\n }: {\n apiApp: FetchApp | NodeApp;\n } = await import(\\`\\${ROOT}/app.js\\`);\n\n if (sock) {\n // Clean up any stale socket file before binding.\n await unlink(sock).catch((error) => {\n if (error.code === \"ENOENT\") {\n return;\n }\n console.error(error.message);\n process.exit(1);\n });\n }\n\n console.log(\n \\`\\\\n ➜ Starting SSR Server \\${styleText([\"dim\"], \"[ %s ]\")}\\`,\n sock ? \\`sock: \\${sock}\\` : \\`port: \\${port}\\`,\n );\n\n const ssrApp = await createApp();\n const apiPrefix = join(base, apiBase);\n\n const ssrListener = createNodeListener(ssrApp as never);\n\n const apiListener = apiApp\n ? createNodeListener(apiApp as never)\n : async () => {};\n\n const gatewayListener: NodeListener = (req, res) => {\n const { pathname } = new URL(req.url ?? \"/\", ssrOrigin);\n return pathname === apiPrefix || pathname.startsWith(\\`\\${apiPrefix}/\\`)\n ? apiListener(req, res)\n : ssrListener(req, res);\n };\n\n const server = createServer(gatewayListener);\n\n server.listen(sock || port, async () => {\n if (sock) {\n // Make Unix socket world-writable so other processes (e.g. a reverse proxy)\n // can connect without permission issues.\n await chmod(sock, 0o777);\n }\n console.log(\"\\\\n ➜ Server Started ✨\");\n });\n\n return server;\n};\n\nexport const createDisposableServer = async (\n callback: (port: number) => Promise<void>,\n) => {\n const app = await createApp();\n const server = createAdaptorServer(app).listen(0); // OS picks a free port\n const address = server.address();\n\n if (!address || typeof address === \"string\") {\n throw new Error(\"SSR: Failed starting disposable server on a free port\");\n }\n\n try {\n await callback(address.port);\n } finally {\n server.close();\n }\n};\n\nconst isMain = fileURLToPath(import.meta.url) === resolve(process.argv[1]);\n\nif (isMain) {\n /**\n * Parse CLI arguments so this file can be used both as a module\n * and a standalone executable\n * */\n const {\n values: { port, sock },\n } = parseArgs({\n options: {\n port: {\n type: \"string\",\n short: \"p\",\n },\n sock: {\n type: \"string\",\n short: \"s\",\n },\n },\n });\n\n try {\n await startServer({ sock, port });\n } catch (error: any) {\n console.error(styleText(\"red\", \"✗ Failed starting SSR server\"));\n console.error(error);\n process.exit(1);\n }\n}\n`,b=`string`,x=t((e,t)=>{let{generators:p=[],refineTypeName:x,...S}=e.config,{createPath:C,createImportHelpers:w}=r(e),{renderToFile:T}=i({helpers:{...w({origin:`lib`})}});return{async build(e){let n=t?.renderMode?typeof t.renderMode==`string`?()=>t.renderMode:f(t?.renderMode,`string`):()=>b,r={renderMode:JSON.stringify(t?.renderMode||null),pageRoutes:e.flatMap(e=>e.kind===`pageRoute`?[{...e.entry,renderMode:n(e.entry.name)}]:[]).sort(a),apiGenerator:p.some(e=>e.meta.slot===`backend`)};for(let[e,t]of[[`ssr.ts`,y],[`@ssr/api.ts`,m],[`@ssr/__kosmo_ssr_bundle.ts`,g],[`@ssr/base.ts`,h],[`@ssr/fetch.ts`,_],[`@ssr/routes.ts`,v]])await T(C.lib(e),t,r)},async postBuild(){let t=C.distDir(`ssr`),r=[o.tsconfigPaths(e),o.nodePrefix()];for(let t of p)await t.factory(e).ssrBuild?.();await d(n(S,...p.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:C.src(),plugins:r,define:{KOSMO_PRODUCTION_BUILD:`true`},build:{ssr:C.lib(`@ssr/__kosmo_ssr_bundle`),ssrEmitAssets:!0,sourcemap:!0,emptyOutDir:!0,minify:!1,rolldownOptions:{output:{dir:t,entryFileNames:`app.js`,format:`esm`}}}})),await d({root:C.lib(),configFile:!1,appType:`custom`,plugins:r,resolve:{conditions:[`node`]},build:{ssr:C.lib(`ssr.ts`),target:`esnext`,sourcemap:!0,emptyOutDir:!0,rolldownOptions:{output:{dir:l(t,`server`),entryFileNames:`server.js`,format:`esm`}}}}),await s(u(t,`../client`),t,{recursive:!0});for(let e of[`server.js`,`server.js.map`])await s(`${t}/server/${e}`,`${t}/${e}`);await c(`${t}/server`,{recursive:!0,force:!0})}}}),S=e({meta:{name:`SSR`,slot:`ssr`},dependencies:{tinyglobby:p.devDependencies.tinyglobby,hono:p.devDependencies.hono,\"@hono/node-server\":p.devDependencies[`@hono/node-server`],\"light-my-request\":p.devDependencies[`light-my-request`]},factory:x});export{S as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderFactory as r,sortRoutes as i}from\"@kosmojs/lib\";import{svelte as a}from\"@sveltejs/vite-plugin-svelte\";import{createTemplateResolver as o,defaults as s}from\"@kosmojs/core\";import{routeRenderHelpers as c}from\"@kosmojs/core/generators\";var l={type:`module`,private:!0,name:`@kosmojs/svelte-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"@sveltejs/vite-plugin-svelte\":`^7.2.0`,vite:`^8.2.1`},devDependencies:{\"@tanstack/svelte-query\":`^6.1.38`,\"path-to-regexp\":`^8.4.2`,svelte:`^5.56.8`}},u=()=>{let e=[`🎉 Well done! You just created a new Svelte page.`,`🚀 Success! A fresh Svelte page is ready to roll.`,`🌟 Nice work! Another Svelte page added to your app.`,`🧩 All set! A new Svelte page has been scaffolded.`,`🔧 Scaffold complete! Your new Svelte page is in place.`,`✅ Built! Your Svelte page is scaffolded and ready.`,`✨ Fantastic! Your new Svelte page is good to go.`,`🎯 Nailed it! A brand new Svelte page just landed.`,`💫 Awesome! Another Svelte page joins the party.`,`⚡ Lightning fast! A new Svelte page created successfully.`];return e[Math.floor(Math.random()*e.length)]},d=`<script lang=\"ts\">\n import type { Snippet } from \"svelte\";\n\n let { children }: { children: Snippet } = $props();\n<\\/script>\n\n{@render children()}\n`,f=`<script lang=\"ts\">\n import { type QueryClient, QueryClientProvider } from \"@tanstack/svelte-query\";\n import type { Snippet } from \"svelte\";\n\n import { getQueryClient } from \"../query\";\n\n let { client, children }: {\n client?: QueryClient;\n children: Snippet;\n } = $props();\n\n const queryClient = $derived(client ?? getQueryClient());\n<\\/script>\n\n<QueryClientProvider client={queryClient}>\n {@render children()}\n</QueryClientProvider>\n`,p=`import { hydrate as hydrateOrig, mount as mountOrig } from \"svelte\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { createRoute, type RouteComponent } from \"../svelte\";\n\n{{#each pageRoutes}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n{{#each layouts}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nexport const createRoutes = () => {\n return [\n {{#each pageRoutes}}\n createRoute(\"{{name}}\", \"{{pathPattern}}\", {{id}}, [\n {{#each layouts}}[\"{{name}}\", {{id}}], {{/each}}\n ]),\n {{/each}}\n ];\n};\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<Promise<RouteComponent>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n hydrateOrig(component.Component, { target: root, props: component.props });\n window.__KOSMO_HYDRATION_DATA__ = undefined;\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<Promise<RouteComponent>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n mountOrig(component.Component, { target: root, props: component.props });\n}\n\nexport default clientRenderFactory();\n`,m=`import { render as renderOrig } from \"svelte/server\";\n\nimport type {\n RenderToStringWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { createRoute, type Route, type RouteComponent } from \"../svelte\";\n\n{{#each pageRoutes}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n{{#each layouts}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n\nexport const createRoutes = () => {\n return [\n {{#each pageRoutes}}\n createRoute(\"{{name}}\", \"{{pathPattern}}\", async () => {{id}}, [\n {{#each layouts}}[\"{{name}}\", async () => {{id}}], {{/each}}\n ]),\n {{/each}}\n ];\n};\n\nconst createHydrationScript = (loaderData: Route[\"loaderData\"]) => {\n return loaderData\n ? \\`<script>\n window.__KOSMO_HYDRATION_DATA__ = JSON.parse(\n \\${JSON.stringify(JSON.stringify(loaderData))}\n );\n <\\/script>\\`\n : undefined;\n};\n\nexport const renderWrapper: SSRRenderWrapper = (_context, render) => render();\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<Promise<RouteComponent>, { route: Route }>\n> = async (resolver, { headerTags = [] } = {}) => {\n const { component, route } = await resolver();\n\n // svelte/server render() returns \\`head\\` - everything the page and its\n // layouts put in <svelte:head> - plus \\`body\\`. That covers what MDX builds\n // from frontmatter, so there is no generateHeaderTags() counterpart here.\n const { head, body } = await renderOrig(component.Component, {\n props: component.props,\n });\n\n const script = createHydrationScript(route.loaderData);\n\n return {\n head: [...headerTags, head, ...(script ? [script] : [])]\n .filter(Boolean)\n .join(\"\\\\n\"),\n html: body,\n }\n}\n\n// svelte/server exposes only render() - no web-stream renderer -\n// so this folder is string-only SSR.\nexport default serverRenderFactory<false>();\n`,h=`declare module \"*.svelte\" {\n import type { Component } from \"svelte\";\n const component: Component;\n export default component;\n}\n`,g=`<script lang=\"ts\">\n /**\n * Folds [app, ...layouts] around the page component.\n *\n * MDX does this with \\`reduce((children, layout) => h(layout, { children }))\\`.\n * Svelte has no vnode children to reduce over, so the chain is walked with a\n * recursive snippet and the page is rendered at the leaf.\n *\n * Layouts receive nothing but their \\`children\\` snippet - same as MDX, where\n * a layout gets only \\`props.children\\`. Route data is read from context via\n * useRoute()/useParams()/useLoaderData().\n * */\n import { setRouteContext, type LayoutsProps } from \"./svelte\";\n\n let { app, layouts, page, route }: LayoutsProps = $props();\n\n setRouteContext(() => route);\n\n const chain = $derived([app, ...layouts.toReversed()]);\n<\\/script>\n\n{#snippet layer(index: number)}\n {#if index < chain.length}\n {@const Layout = chain[index]}\n <Layout>\n {@render layer(index + 1)}\n </Layout>\n {:else}\n {@const Page = page}\n <Page />\n {/if}\n{/snippet}\n\n{@render layer(0)}\n`,_=`<script lang=\"ts\">\n import styles from \"./styles.module.css\";\n\n let { headline }: { headline?: string } = $props();\n<\\/script>\n\n<div class={styles.container}>\n <div class={styles.card}>\n <h2 class={styles.title}>{headline || \"404: Not Found\"}</h2>\n <br />\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>Something went wrong...</h2>\n 🚧 No page found here\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n</div>\n`,v=`<script lang=\"ts\">\n import styles from \"./styles.module.css\";\n\n let {\n message,\n routeName,\n pathMap,\n }: {\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string };\n } = $props();\n<\\/script>\n\n<div data-page-route={routeName} class={styles.container}>\n <div class={styles.card}>\n <h2 class={styles.subtitle}>{message}</h2>\n <br />\n\n <div class={styles.stepsBox}>\n <ul class={styles.stepsList}>\n <li>Edit this page at <code>{pathMap.page}</code></li>\n <li>\n Create new pages by adding folders in <code>{pathMap.pages}/</code>\n </li>\n <li>Add API endpoints in <code>{pathMap.api}/</code></li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n</div>\n`,y=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,b=`<script lang=\"ts\">\n import styles from \"./styles.module.css\";\n<\\/script>\n\n<div class={styles.container}>\n <div class={styles.card}>\n <div class={styles.header}>\n <div class={styles.icon}>✨</div>\n <h1 class={styles.title}>Welcome to KosmoJS</h1>\n <p class={styles.subtitle}>\n Component-first development with Svelte and Vite\n </p>\n </div>\n\n <div class={styles.featuresBox}>\n <h2 class={styles.featuresTitle}>Powered by Svelte and ready to ship</h2>\n <div class={styles.featuresSubtitle}>What's included:</div>\n <ul class={styles.featuresList}>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Directory-based routing\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Svelte 5 runes and snippets\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Nested layouts, loaders and <svelte:head>\n </li>\n </ul>\n </div>\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>Next Steps 🢂</h2>\n <ul class={styles.stepsList}>\n <li>Edit this page at <code>pages/index/index.svelte</code></li>\n <li>Create new pages by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation ➜\n </a>\n </div>\n </div>\n</div>\n`,x=`export type ParamsMap = {\n{{#each pageRoutes}}\"{{name}}\": {{serializeParamsLiteral .}};\n{{/each}}\n};\n\nexport const paramNames = {\n{{#each pageRoutes}}\"{{name}}\": [ {{#each params.schema}}\"{{name}}\", {{/each}}],\n{{/each}}\n} as const;\n`,S=`import { QueryClient, type QueryClientConfig } from \"@tanstack/svelte-query\";\n\nlet client: QueryClient | undefined;\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n client = new QueryClient(options);\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n if (!client) {\n client = new QueryClient();\n }\n return client;\n};\n`,C=`import { QueryClient, type QueryClientConfig } from \"@tanstack/svelte-query\";\n\nimport { store } from \"{{ createImport 'lib' '@ssr/base' }}\";\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n const client = new QueryClient(options);\n const ctx = store?.getStore();\n if (ctx) {\n ctx.tsqClient = client;\n }\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n const ctx = store?.getStore();\n if (!ctx) {\n throw new Error(\"getQueryClient(): called outside an SSR request scope\");\n }\n if (!ctx.tsqClient) {\n ctx.tsqClient = new QueryClient();\n }\n return ctx.tsqClient as QueryClient;\n};\n`,w=`import type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport Layouts from \"./Layouts.svelte\";\nimport {\n type AnyComponent,\n createRouter,\n type RawRoute,\n type Route,\n type RouteComponent,\n} from \"./svelte\";\n\nexport const createRouters = (\n routes: Array<RawRoute>,\n { app }: { app: AnyComponent },\n): {\n clientRouter: () => RouterFactoryReturn<Promise<RouteComponent>>;\n serverRouter: (\n url: URL,\n ) => RouterFactoryReturn<Promise<RouteComponent>, { route: Route }>;\n} => {\n // <Layouts> is injected here rather than imported by ./svelte, so the core\n // router stays a plain module and there is no .ts <-> .svelte import cycle.\n const router = createRouter(routes, app, Layouts);\n\n return {\n clientRouter() {\n return router.resolve();\n },\n serverRouter(url) {\n return router.resolve(url);\n },\n };\n};\n\nexport default createRouterFactory<\n RawRoute,\n Promise<RouteComponent>,\n { server: { route: Route } }\n>();\n`,T=`import { match, pathToRegexp } from \"path-to-regexp\";\nimport { type Component, createContext } from \"svelte\";\n\nimport { paramNames } from \"{{ createImport 'lib' 'params' }}\";\nimport { base } from \"{{ createImport 'libCore' }}\";\n\n/**\n * The loose component type for anything resolved dynamically from a \\`.svelte\\`\n * module's default export.\n *\n * It must be \\`any\\`-propped, not \\`never\\`-propped: a \\`Component<never>\\` is a\n * function accepting \\`never\\`, so - by parameter contravariance - no real\n * component is assignable to it and \\`<Layout />\\` fails to typecheck.\n * */\nexport type AnyComponent = Component<any, any, any>;\n\nexport type RawRoute = {\n name: string;\n pathSegments: number | undefined;\n regexp: RegExp;\n extractParams: (path: string) => Route[\"params\"];\n loader: () => Promise<RouteModule>;\n layouts: Array<[name: string, source: () => Promise<LayoutModule>]>;\n};\n\ntype Loader = (\n route: Pick<Route, \"name\" | \"params\" | \"paramsEntries\">,\n) => Promise<unknown> | undefined;\n\n/**\n * \\`.svelte\\` modules export their component as \\`default\\`; an optional data\n * \\`loader\\` comes from a \\`<script module>\\` block.\n * */\ntype LayoutModule = {\n default: AnyComponent;\n loader?: Loader;\n};\n\ntype RouteModule = {\n default: AnyComponent;\n loader?: Loader;\n};\n\n/**\n * Props of <Layouts>, the fixed root component every route renders through.\n * */\nexport type LayoutsProps = {\n app: AnyComponent;\n layouts: Array<AnyComponent>;\n page: AnyComponent;\n route: Route;\n};\n\n/**\n * Preact can prebuild the whole tree and hand back a VNode; Svelte cannot -\n * components are constructors, not values. So the resolved \"component\" is a\n * (constructor, props) pair and the entry templates feed it to\n * mount()/hydrate()/render().\n * */\nexport type RouteComponent = {\n Component: Component<LayoutsProps>;\n props: LayoutsProps;\n};\n\nexport type Route = {\n name: string;\n params: Record<string, string | Array<string>>;\n paramsEntries: [keys: Array<string>, values: Array<unknown>];\n loaderData: Record<string, unknown>;\n};\n\n/**\n * Route context, the Svelte counterpart to MDX's Preact RouterContext.\n *\n * Holds a getter rather than the value: <Layouts> receives \\`route\\` as a prop,\n * and reading a prop into a non-reactive position at init is exactly what\n * Svelte's \\`state_referenced_locally\\` check flags. The getter also keeps reads\n * current if the wrapper is ever reused instead of remounted.\n *\n * \\`createContext\\` returns a typed [get, set] pair and \\`get\\` throws when no\n * parent called \\`set\\`, so a page rendered outside <Layouts> fails loudly.\n * */\nexport const [getRouteContext, setRouteContext] = createContext<() => Route>();\n\nexport const createRouter = (\n routes: Array<RawRoute>,\n app: AnyComponent,\n Layouts: Component<LayoutsProps>,\n) => {\n const catchallRoute = createRoute(\n \"NotFound\",\n \"\",\n () => import(\"{{ createImport 'pages' '404.svelte' }}\"),\n [],\n );\n\n const runLoader = async (key: string, fetcher: () => ReturnType<Loader>) => {\n if (typeof window === \"undefined\" || !window.__KOSMO_HYDRATION_DATA__) {\n return fetcher();\n }\n return key in window.__KOSMO_HYDRATION_DATA__\n ? window.__KOSMO_HYDRATION_DATA__[key]\n : fetcher();\n };\n\n return {\n async resolve(url: URL = new URL(window.location.href)) {\n const urlSegments = url.pathname.split(\"/\").filter(Boolean).length;\n\n // 1: use lightweight \\`RegExp.test()\\` on linear scan - no capture allocation\n const matchedRoutes = routes.filter(({ regexp }) => {\n return regexp.test(url.pathname);\n });\n\n const matchedRoute =\n matchedRoutes.length > 1\n ? matchedRoutes.find(({ pathSegments }) => {\n return pathSegments === undefined || pathSegments === urlSegments;\n }) || catchallRoute\n : matchedRoutes.length === 1\n ? matchedRoutes[0]\n : catchallRoute;\n\n // 2: capture params only on matched route\n const params = matchedRoute\n ? matchedRoute.extractParams(url.pathname)\n : {};\n\n const { name } = matchedRoute;\n\n const routeModule = await matchedRoute.loader();\n\n const paramsEntries = (\n Array.isArray(paramNames[name as never])\n ? [\n [...paramNames[name as never]],\n [...paramNames[name as never]].map((key) => params[key]),\n ]\n : [\n // fallback\n Object.keys(params),\n Object.values(params),\n ]\n ) as never;\n\n const loaderData: Record<string, unknown> = {};\n\n loaderData[name] = await runLoader(name, () => {\n return routeModule.loader\n ? routeModule.loader({ name, params, paramsEntries })\n : undefined; // should not survive serialization if no loader defined\n });\n\n const layouts: Array<AnyComponent> = [];\n\n for (const [layoutName, source] of matchedRoute.layouts || []) {\n const layoutModule = await source();\n layouts.push(layoutModule.default);\n const key = \\`\\${layoutName}/layout\\`;\n loaderData[key] = await runLoader(key, () => {\n return layoutModule.loader\n ? layoutModule.loader({ name: layoutName, params, paramsEntries })\n : undefined; // should not survive serialization if no loader defined\n });\n }\n\n const route: Route = {\n name,\n params,\n paramsEntries,\n loaderData,\n };\n\n return {\n // <Layouts> folds [app, ...layouts] around the page - Svelte has no\n // vnode children to reduce over the way \\`h(layout, { children })\\` does.\n component: {\n Component: Layouts,\n props: { app, layouts, page: routeModule.default, route },\n } satisfies RouteComponent,\n route,\n };\n },\n };\n};\n\nexport const createRoute = (\n name: string,\n pathPattern: string,\n loader: RawRoute[\"loader\"],\n layouts: RawRoute[\"layouts\"],\n): RawRoute => {\n const path = \\`\\${base}/\\${pathPattern}\\`.replace(/\\\\/+/g, \"/\");\n\n const { regexp } = pathToRegexp(path, { sensitive: true });\n const matcher = match<Route[\"params\"]>(path);\n\n return {\n name,\n regexp,\n pathSegments: name.includes(\"...\")\n ? undefined\n : name.replace(/^index(\\\\/?|$)/, \"\").split(\"/\").length,\n extractParams: (path) => {\n const match = matcher(path);\n return match ? match.params : {};\n },\n loader,\n layouts,\n };\n};\n`,E=`import { getRouteContext } from \"./svelte\";\n\nimport type { ParamsMap, paramNames } from \"{{ createImport 'lib' 'params' }}\";\n\n/**\n * These read Svelte context, so - like every getContext() call - they are only\n * valid during component initialisation: at the top level of a \\`<script>\\`,\n * never inside an event handler or a callback that runs later.\n * */\nexport function useRoute() {\n return getRouteContext()();\n}\n\nexport function useParams<T extends keyof ParamsMap>(): ParamsMap[T] {\n return useRoute().params as ParamsMap[T];\n}\n\ntype SameLengthTuple<T extends readonly unknown[], U> = { [K in keyof T]: U };\n\nexport function useParamsEntries<T extends keyof ParamsMap>(): [\n (typeof paramNames)[T],\n SameLengthTuple<(typeof paramNames)[T], unknown>,\n] {\n return useRoute().paramsEntries as never;\n}\n\n/**\n * Reads loader data for the current page or one of its layouts.\n * Without a key, returns the page's own data.\n * For a layout, pass its path-qualified name (e.g. \"dashboard/layout\") -\n * context can't tell which layout it runs in.\n * */\nexport const useLoaderData = <T>(key?: string): T | undefined => {\n const route = useRoute();\n return route.loaderData?.[key || route.name] as T;\n};\n`,D=`<script lang=\"ts\">\n import { AppProvider } from \"{{ createImport 'lib' 'app' }}\";\n import type { Snippet } from \"svelte\";\n\n let { children }: { children: Snippet } = $props();\n<\\/script>\n\n<AppProvider>\n {@render children()}\n</AppProvider>\n`,O=`<script lang=\"ts\">\n import type { Snippet } from \"svelte\";\n import type { HTMLAnchorAttributes } from \"svelte/elements\";\n\n import { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\n let {\n to,\n query,\n children,\n ...rest\n }: Omit<HTMLAnchorAttributes, \"href\"> & {\n to: LinkProps;\n query?: Record<string | number, unknown>;\n children?: Snippet;\n } = $props();\n\n const href = $derived.by(() => {\n const [key, ...params] = to;\n return pageRouteMap[key]?.base(params as never, query);\n });\n<\\/script>\n\n<a {href} {...rest}>{@render children?.()}</a>\n`,k=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,A=`import renderFactory, {\n createRoutes,\n renderToString,\n // no renderToStream on Svelte folders\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,j=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,M=`<script lang=\"ts\">\n import PageSample from \"{{ createImport 'lib' 'pageSamples/404.svelte' }}\";\n<\\/script>\n\n<PageSample />\n`,N=`<script lang=\"ts\">\n import type { Snippet } from \"svelte\";\n\n let { children }: { children: Snippet } = $props();\n<\\/script>\n\n{@render children()}\n`,P=`<script lang=\"ts\">\n import PageSample from \"{{ createImport 'lib' 'pageSamples/page.svelte' }}\";\n\n const pathMap = {\n page: \"{{ createImport 'pages' route.file }}\",\n pages: \"{{ createImport 'pages' }}\",\n api: \"{{ createImport 'api' }}\",\n };\n<\\/script>\n\n<svelte:head>\n <title>{{title}}</title>\n</svelte:head>\n\n<PageSample\n message=\"{{message}}\"\n routeName={\"{{route.name}}\"}\n {pathMap}\n/>\n`,F=`<script lang=\"ts\">\n import WelcomePage from \"{{ createImport 'lib' 'pageSamples/welcome.svelte' }}\";\n<\\/script>\n\n<svelte:head>\n <title>Welcome to KosmoJS</title>\n <meta\n name=\"description\"\n content=\"Component-first development with Svelte and Vite\"\n />\n</svelte:head>\n\n<WelcomePage />\n`,I=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\n\nimport app from \"./app.svelte\";\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, { app });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,L=t((e,t)=>{let{createPath:l,createImportHelpers:L}=n(e),{renderToFile:R}=r({helpers:{...L({origin:`lib`}),...c()}}),{renderToFile:z}=r({helpers:L({origin:`src`})}),B=e=>!e?.trim().length,V=o(t?.templates,P),H=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await z(l.pages(n.file),n.name===`index`?F:V(n.name,n),{route:n,title:n.name.replace(/\\{([^}]+)\\}/g,`$1`),message:u()},{overwrite:B}):t===`pageLayout`&&await z(l.pages(n.file),N,{route:n},{overwrite:B})},U=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),n=e.flatMap(({kind:e,entry:n})=>{if(e===`pageRoute`){let{name:e,file:r}=n;return[{...n,layouts:t.flatMap(t=>t.name===e||r.startsWith(`${t.name}/`)?[t]:[]).sort(i)}]}return[]}).sort(i);for(let[e,r]of[[`client.ts`,p],[`server.ts`,m]])await R(l.libEntry(e),r,{pageRoutes:n,layouts:t});for(let[e,t]of[[`params.ts`,x],[`router.ts`,w]])await R(l.lib(e),t,{pageRoutes:n})};return{config(){let{templates:e,...n}={...t};return{plugins:a(n)}},async start(){for(let[e,n]of[[`env.d.ts`,h],[`svelte.ts`,T],[`Layouts.svelte`,g],[`use.ts`,E],[`pageSamples/styles.module.css`,y],[`pageSamples/welcome.svelte`,b],[`pageSamples/page.svelte`,v],[`pageSamples/404.svelte`,_],...t?.tanstack?.query?[[`app/app.svelte`,d],[`app/app-tsq.svelte`,f],[`app/index.ts`,`export { default as AppProvider } from \"./app-tsq.svelte\";`],[`query.ts`,S]]:[[`app/app.svelte`,d],[`app/app-tsq.svelte`,`/** tanstack query disabled */`],[`app/index.ts`,`export { default as AppProvider } from \"./app.svelte\";`],[`query.ts`,`/** tanstack query disabled */`]]])await R(l.lib(e),n,{});for(let[e,t]of[[`pages/404.svelte`,M],[`components/Link.svelte`,O],[`app.svelte`,D],[`router.ts`,I]])await z(l.src(e),t,{entryDir:s.entryDir},{overwrite:B});await z(l.src(`index.html`),j,{entryDir:s.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,k],[`server.ts`,A]])await z(l.entry(e),t,{},{overwrite:B})},async watch(e,t){(!t||t.kind===`create`)&&await H(e),await U(e)},async build(e){await H(e),await U(e)},async ssrBuild(){await R(l.lib(`query.ts`),t?.tanstack?.query?C:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),R=e({meta:{name:`Svelte`},dependencies(e){return{svelte:l.devDependencies.svelte,\"path-to-regexp\":l.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{\"@tanstack/svelte-query\":l.devDependencies[`@tanstack/svelte-query`]}:{}}},factory:L});export{R as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderFactory as r}from\"@kosmojs/lib\";import{RequestValidationTargets as i}from\"@kosmojs/core\";var a={type:`module`,private:!0,name:`@kosmojs/typebox-generator`,version:`0.2.10`,cacheVersion:`1`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/typebox-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,crc:`^4.3.2`,semver:`^7.8.5`},devDependencies:{\"@kosmojs/core-generator\":`workspace:^`,\"@kosmojs/koa-generator\":`workspace:^`,typebox:`^1.3.11`}},o=`import Type from \"typebox\";\n\n/**\n * Custom types for JavaScript constructs that have no JSON Schema\n * representation (Date, File, Blob, Buffer, ArrayBuffer).\n *\n * Each entry is a factory so every use site gets a fresh schema instance,\n * matching the previous behaviour of \\`new TDate()\\` etc.\n * */\n\nconst customType = <T>(\n check: (value: unknown) => value is T,\n message: string,\n) => Type.Refine(Type.Unsafe<T>({}), check, () => message);\n\nexport const TDate = () => {\n return customType(\n (value): value is Date => value instanceof Date,\n \"must be Date\",\n );\n};\n\nconst isFormidableFile = (value: unknown) => {\n return value\n ? typeof value === \"object\"\n ? [\n //\n \"filepath\",\n \"originalFilename\",\n \"newFilename\",\n \"mimetype\",\n ].every((e) => e in value)\n : false\n : false;\n};\n\nexport const TFile = () => {\n return customType(\n (value): value is File => value instanceof File || isFormidableFile(value),\n \"must be File\",\n );\n};\n\nexport const TBlob = () => {\n return customType(\n (value): value is Blob => value instanceof Blob,\n \"must be Blob\",\n );\n};\n\nexport const TBuffer = () => {\n return customType(\n (value): value is Buffer =>\n typeof Buffer !== \"undefined\" && Buffer.isBuffer(value),\n \"must be Buffer\",\n );\n};\n\nexport const TArrayBuffer = () => {\n return customType(\n (value): value is ArrayBuffer => value instanceof ArrayBuffer,\n \"must be ArrayBuffer\",\n );\n};\n\nexport default {\n Date: TDate(),\n File: TFile(),\n Blob: TBlob(),\n Buffer: TBuffer(),\n ArrayBuffer: TArrayBuffer(),\n};\n`,s=`import type { TValidationError } from \"typebox/error\";\n\nimport type { ValidationErrorEntry } from \"@kosmojs/core\";\n\n/**\n * Message codes for i18n/l10n support\n */\nexport const MESSAGE_CODES = {\n // Generic messages\n\n /** Singular form of \"property\" word for i18n */\n PROPERTY: \"PROPERTY\",\n /** Plural form of \"properties\" word for i18n */\n PROPERTIES: \"PROPERTIES\",\n\n /** Text for \"allowed values\" phrase for i18n */\n ALLOWED_VALUES: \"ALLOWED_VALUES\",\n /** Message template for displaying count of duplicate items found */\n FOUND_N_DUPLICATES: \"FOUND_N_DUPLICATES\",\n\n /** Message displayed when validation succeeds */\n VALIDATION_PASSED: \"VALIDATION_PASSED\",\n /** Prefix text for validation error messages (e.g., \"Validation failed:\") */\n VALIDATION_FAILED_PREFIX: \"VALIDATION_FAILED_PREFIX\",\n\n /** Template for error summary showing error count and affected fields */\n ERROR_SUMMARY: \"ERROR_SUMMARY\",\n /** Plural suffix for words (e.g., \"s\" in English) */\n PLURAL_SUFFIX: \"PLURAL_SUFFIX\",\n\n /** Ordinal position label for first element in tuple/array */\n FIRST: \"FIRST\",\n /** Ordinal position label for second element in tuple/array */\n SECOND: \"SECOND\",\n /** Ordinal position label for third element in tuple/array */\n THIRD: \"THIRD\",\n /** Ordinal position label for fourth element in tuple/array */\n FOURTH: \"FOURTH\",\n /** Ordinal position label for fifth element in tuple/array */\n FIFTH: \"FIFTH\",\n\n // Error messages\n\n // Type validation\n /** Invalid data type - expected a specific type */\n TYPE_INVALID: \"TYPE_INVALID\",\n\n // String validation\n /** String is too short - minimum length constraint violated */\n STRING_MIN_LENGTH: \"STRING_MIN_LENGTH\",\n /** String is too long - maximum length constraint violated */\n STRING_MAX_LENGTH: \"STRING_MAX_LENGTH\",\n /** String doesn't match required pattern/regex */\n STRING_PATTERN: \"STRING_PATTERN\",\n /** String doesn't match required format (generic) */\n STRING_FORMAT: \"STRING_FORMAT\",\n /** Invalid email address format */\n STRING_FORMAT_EMAIL: \"STRING_FORMAT_EMAIL\",\n /** Invalid date format */\n STRING_FORMAT_DATE: \"STRING_FORMAT_DATE\",\n /** Invalid date-time format */\n STRING_FORMAT_DATETIME: \"STRING_FORMAT_DATETIME\",\n /** Invalid time format */\n STRING_FORMAT_TIME: \"STRING_FORMAT_TIME\",\n /** Invalid URI format */\n STRING_FORMAT_URI: \"STRING_FORMAT_URI\",\n /** Invalid URL format */\n STRING_FORMAT_URL: \"STRING_FORMAT_URL\",\n /** Invalid UUID format */\n STRING_FORMAT_UUID: \"STRING_FORMAT_UUID\",\n /** Invalid IPv4 address format */\n STRING_FORMAT_IPV4: \"STRING_FORMAT_IPV4\",\n /** Invalid IPv6 address format */\n STRING_FORMAT_IPV6: \"STRING_FORMAT_IPV6\",\n /** Invalid hostname format */\n STRING_FORMAT_HOSTNAME: \"STRING_FORMAT_HOSTNAME\",\n /** Invalid JSON pointer format */\n STRING_FORMAT_JSON_POINTER: \"STRING_FORMAT_JSON_POINTER\",\n /** Invalid regular expression format */\n STRING_FORMAT_REGEX: \"STRING_FORMAT_REGEX\",\n\n // Number validation\n /** Number is below minimum value */\n NUMBER_MINIMUM: \"NUMBER_MINIMUM\",\n /** Number exceeds maximum value */\n NUMBER_MAXIMUM: \"NUMBER_MAXIMUM\",\n /** Number is below exclusive minimum value */\n NUMBER_EXCLUSIVE_MINIMUM: \"NUMBER_EXCLUSIVE_MINIMUM\",\n /** Number exceeds exclusive maximum value */\n NUMBER_EXCLUSIVE_MAXIMUM: \"NUMBER_EXCLUSIVE_MAXIMUM\",\n /** Number is not a multiple of required value */\n NUMBER_MULTIPLE_OF: \"NUMBER_MULTIPLE_OF\",\n\n // Array validation\n /** Array has too few items - minimum items constraint violated */\n ARRAY_MIN_ITEMS: \"ARRAY_MIN_ITEMS\",\n /** Array has too many items - maximum items constraint violated */\n ARRAY_MAX_ITEMS: \"ARRAY_MAX_ITEMS\",\n /** Array contains duplicate items when uniqueness is required */\n ARRAY_UNIQUE_ITEMS: \"ARRAY_UNIQUE_ITEMS\",\n /** Array doesn't contain required valid items */\n ARRAY_CONTAINS: \"ARRAY_CONTAINS\",\n /** Array contains too few items matching criteria */\n ARRAY_MIN_CONTAINS: \"ARRAY_MIN_CONTAINS\",\n /** Array contains too many items matching criteria */\n ARRAY_MAX_CONTAINS: \"ARRAY_MAX_CONTAINS\",\n /** Invalid tuple structure */\n ARRAY_PREFIX_ITEMS: \"ARRAY_PREFIX_ITEMS\",\n /** Invalid additional items beyond tuple definition */\n ARRAY_ITEMS: \"ARRAY_ITEMS\",\n /** Invalid unevaluated items in array */\n ARRAY_UNEVALUATED_ITEMS: \"ARRAY_UNEVALUATED_ITEMS\",\n\n // Tuple-specific validation\n /** Tuple has too few elements */\n TUPLE_MIN_ITEMS: \"TUPLE_MIN_ITEMS\",\n /** Tuple has too many elements */\n TUPLE_MAX_ITEMS: \"TUPLE_MAX_ITEMS\",\n\n // Object validation\n /** Missing required property/properties */\n OBJECT_REQUIRED: \"OBJECT_REQUIRED\",\n /** Object contains additional properties not allowed by schema */\n OBJECT_ADDITIONAL_PROPERTIES: \"OBJECT_ADDITIONAL_PROPERTIES\",\n /** Object has too few properties */\n OBJECT_MIN_PROPERTIES: \"OBJECT_MIN_PROPERTIES\",\n /** Object has too many properties */\n OBJECT_MAX_PROPERTIES: \"OBJECT_MAX_PROPERTIES\",\n /** Invalid property name */\n OBJECT_PROPERTY_NAMES: \"OBJECT_PROPERTY_NAMES\",\n /** Missing dependent required properties */\n OBJECT_DEPENDENCIES: \"OBJECT_DEPENDENCIES\",\n /** Object contains unevaluated properties */\n OBJECT_UNEVALUATED_PROPERTIES: \"OBJECT_UNEVALUATED_PROPERTIES\",\n\n // Enum and const validation\n /** Value is not one of the allowed enum values */\n ENUM_MISMATCH: \"ENUM_MISMATCH\",\n /** Value doesn't match the required constant value */\n CONST_MISMATCH: \"CONST_MISMATCH\",\n\n // Conditional schema validation\n /** Doesn't match conditional if schema */\n CONDITIONAL_IF: \"CONDITIONAL_IF\",\n /** Doesn't satisfy then schema condition */\n CONDITIONAL_THEN: \"CONDITIONAL_THEN\",\n /** Doesn't satisfy else schema condition */\n CONDITIONAL_ELSE: \"CONDITIONAL_ELSE\",\n\n // Composition validation\n /** Must match exactly one schema (oneOf) */\n COMPOSITION_ONE_OF: \"COMPOSITION_ONE_OF\",\n /** Must match at least one schema (anyOf) */\n COMPOSITION_ANY_OF: \"COMPOSITION_ANY_OF\",\n /** Must match all schemas (allOf) */\n COMPOSITION_ALL_OF: \"COMPOSITION_ALL_OF\",\n /** Must not match the schema (not) */\n COMPOSITION_NOT: \"COMPOSITION_NOT\",\n\n // Content validation\n /** Invalid discriminator value */\n CONTENT_DISCRIMINATOR: \"CONTENT_DISCRIMINATOR\",\n /** Invalid content encoding */\n CONTENT_ENCODING: \"CONTENT_ENCODING\",\n /** Invalid content media type */\n CONTENT_MEDIA_TYPE: \"CONTENT_MEDIA_TYPE\",\n\n // Custom keywords (ajv-keywords)\n /** Value outside allowed range */\n CUSTOM_RANGE: \"CUSTOM_RANGE\",\n /** Value outside exclusive range */\n CUSTOM_EXCLUSIVE_RANGE: \"CUSTOM_EXCLUSIVE_RANGE\",\n /** Doesn't match regular expression */\n CUSTOM_REGEXP: \"CUSTOM_REGEXP\",\n /** Failed to apply dynamic default */\n CUSTOM_DYNAMIC_DEFAULTS: \"CUSTOM_DYNAMIC_DEFAULTS\",\n /** Doesn't match any selected case */\n CUSTOM_SELECT: \"CUSTOM_SELECT\",\n /** Transformation failed */\n CUSTOM_TRANSFORM: \"CUSTOM_TRANSFORM\",\n /** Items don't have unique property values */\n CUSTOM_UNIQUE_ITEM_PROPERTIES: \"CUSTOM_UNIQUE_ITEM_PROPERTIES\",\n\n // Fallback\n /** Unknown validation error */\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type ValidationMessages = typeof MESSAGE_CODES;\n\n/**\n * Error message templates using node:util format syntax\n * Placeholders: %s (string), %d (number), %j (JSON)\n *\n * Usage: format(ERROR_MESSAGES[ErrorCode.STRING_MIN_LENGTH], 5)\n * Result: \"must be at least 5 characters long\"\n */\nconst MESSAGE_MAP: Record<keyof ValidationMessages, string> = {\n // Generic messages\n\n [MESSAGE_CODES.PROPERTY]: \"property\",\n [MESSAGE_CODES.PROPERTIES]: \"properties\",\n\n [MESSAGE_CODES.ALLOWED_VALUES]: \"the allowed values\",\n [MESSAGE_CODES.FOUND_N_DUPLICATES]: \" (found %d duplicate%s)\",\n\n [MESSAGE_CODES.VALIDATION_PASSED]: \"Validation Passed\",\n [MESSAGE_CODES.VALIDATION_FAILED_PREFIX]: \"\",\n\n [MESSAGE_CODES.ERROR_SUMMARY]:\n \"%d validation error%s found across %d field%s\",\n [MESSAGE_CODES.PLURAL_SUFFIX]: \"s\",\n\n [MESSAGE_CODES.FIRST]: \"first\",\n [MESSAGE_CODES.SECOND]: \"second\",\n [MESSAGE_CODES.THIRD]: \"third\",\n [MESSAGE_CODES.FOURTH]: \"fourth\",\n [MESSAGE_CODES.FIFTH]: \"fifth\",\n\n // Error messages\n\n // Type validation\n [MESSAGE_CODES.TYPE_INVALID]: \"must be %s\",\n\n // String validation\n [MESSAGE_CODES.STRING_MIN_LENGTH]: \"must be at least %d character%s long\",\n [MESSAGE_CODES.STRING_MAX_LENGTH]: \"must not exceed %d character%s\",\n [MESSAGE_CODES.STRING_PATTERN]: \"must match the required pattern\",\n [MESSAGE_CODES.STRING_FORMAT]: \\`must match format \"%s\"\\`,\n [MESSAGE_CODES.STRING_FORMAT_EMAIL]: \"must be a valid email address\",\n [MESSAGE_CODES.STRING_FORMAT_DATE]: \"must be a valid date\",\n [MESSAGE_CODES.STRING_FORMAT_DATETIME]: \"must be a valid date-time\",\n [MESSAGE_CODES.STRING_FORMAT_TIME]: \"must be a valid time\",\n [MESSAGE_CODES.STRING_FORMAT_URI]: \"must be a valid URI\",\n [MESSAGE_CODES.STRING_FORMAT_URL]: \"must be a valid URL\",\n [MESSAGE_CODES.STRING_FORMAT_UUID]: \"must be a valid UUID\",\n [MESSAGE_CODES.STRING_FORMAT_IPV4]: \"must be a valid IPv4 address\",\n [MESSAGE_CODES.STRING_FORMAT_IPV6]: \"must be a valid IPv6 address\",\n [MESSAGE_CODES.STRING_FORMAT_HOSTNAME]: \"must be a valid hostname\",\n [MESSAGE_CODES.STRING_FORMAT_JSON_POINTER]: \"must be a valid JSON pointer\",\n [MESSAGE_CODES.STRING_FORMAT_REGEX]: \"must be a valid regular expression\",\n\n // Number validation\n [MESSAGE_CODES.NUMBER_MINIMUM]: \"must be %s %s\",\n [MESSAGE_CODES.NUMBER_MAXIMUM]: \"must be %s %s\",\n [MESSAGE_CODES.NUMBER_EXCLUSIVE_MINIMUM]: \"must be %s %s\",\n [MESSAGE_CODES.NUMBER_EXCLUSIVE_MAXIMUM]: \"must be %s %s\",\n [MESSAGE_CODES.NUMBER_MULTIPLE_OF]: \"must be a multiple of %s\",\n\n // Array validation\n [MESSAGE_CODES.ARRAY_MIN_ITEMS]: \"must have at least %d item%s\",\n [MESSAGE_CODES.ARRAY_MAX_ITEMS]: \"must not have more than %d item%s\",\n [MESSAGE_CODES.ARRAY_UNIQUE_ITEMS]: \"must not have duplicate items%s\",\n [MESSAGE_CODES.ARRAY_CONTAINS]: \"must contain at least %d valid item%s\",\n [MESSAGE_CODES.ARRAY_MIN_CONTAINS]:\n \"must contain at least %d item%s matching the criteria\",\n [MESSAGE_CODES.ARRAY_MAX_CONTAINS]:\n \"must contain no more than %d item%s matching the criteria\",\n [MESSAGE_CODES.ARRAY_PREFIX_ITEMS]: \"tuple structure is invalid\",\n [MESSAGE_CODES.ARRAY_ITEMS]: \"array items are invalid\",\n [MESSAGE_CODES.ARRAY_UNEVALUATED_ITEMS]: \"should not have unevaluated items\",\n\n // Tuple-specific\n [MESSAGE_CODES.TUPLE_MIN_ITEMS]: \"tuple must have at least %d element%s\",\n [MESSAGE_CODES.TUPLE_MAX_ITEMS]: \"tuple must not have more than %d element%s\",\n\n // Object validation\n [MESSAGE_CODES.OBJECT_REQUIRED]: \"missing required %s: %s\",\n [MESSAGE_CODES.OBJECT_ADDITIONAL_PROPERTIES]: \\`should not have additional property \"%s\"\\`,\n [MESSAGE_CODES.OBJECT_MIN_PROPERTIES]: \"must have at least %d %s\",\n [MESSAGE_CODES.OBJECT_MAX_PROPERTIES]: \"must not have more than %d %s\",\n [MESSAGE_CODES.OBJECT_PROPERTY_NAMES]: \\`property name \"%s\" is invalid\\`,\n [MESSAGE_CODES.OBJECT_DEPENDENCIES]: \"requires %s when present\",\n [MESSAGE_CODES.OBJECT_UNEVALUATED_PROPERTIES]: \\`should not have unevaluated property \"%s\"\\`,\n\n // Enum and const\n [MESSAGE_CODES.ENUM_MISMATCH]: \"must be one of: %s\",\n [MESSAGE_CODES.CONST_MISMATCH]: \"must be equal to %s\",\n\n // Conditional\n [MESSAGE_CODES.CONDITIONAL_IF]: \"does not match the conditional schema\",\n [MESSAGE_CODES.CONDITIONAL_THEN]: \\`does not satisfy the \"then\" schema condition\\`,\n [MESSAGE_CODES.CONDITIONAL_ELSE]: \\`does not satisfy the \"else\" schema condition\\`,\n\n // Composition\n [MESSAGE_CODES.COMPOSITION_ONE_OF]:\n \"must match exactly one schema (currently matches %d)\",\n [MESSAGE_CODES.COMPOSITION_ANY_OF]: \"must match at least one schema\",\n [MESSAGE_CODES.COMPOSITION_ALL_OF]: \"must match all schemas\",\n [MESSAGE_CODES.COMPOSITION_NOT]: \"must not match the schema\",\n\n // Content\n [MESSAGE_CODES.CONTENT_DISCRIMINATOR]: \\`discriminator property \"%s\" has invalid value\\`,\n [MESSAGE_CODES.CONTENT_ENCODING]: \\`content encoding \"%s\" is invalid\\`,\n [MESSAGE_CODES.CONTENT_MEDIA_TYPE]: \\`content media type \"%s\" is invalid\\`,\n\n // Custom keywords\n [MESSAGE_CODES.CUSTOM_RANGE]: \"must be within the range %s to %s\",\n [MESSAGE_CODES.CUSTOM_EXCLUSIVE_RANGE]:\n \"must be strictly within the range %s to %s\",\n [MESSAGE_CODES.CUSTOM_REGEXP]: \"must match the regular expression pattern\",\n [MESSAGE_CODES.CUSTOM_DYNAMIC_DEFAULTS]:\n \"failed to apply dynamic default value\",\n [MESSAGE_CODES.CUSTOM_SELECT]: \"does not match any of the selected cases\",\n [MESSAGE_CODES.CUSTOM_TRANSFORM]: \"transformation failed\",\n [MESSAGE_CODES.CUSTOM_UNIQUE_ITEM_PROPERTIES]:\n \"must have unique values for %s: %s\",\n\n // Fallback\n [MESSAGE_CODES.UNKNOWN]: \\`validation failed for keyword \"%s\"\\`,\n};\n\n/**\n * Comprehensive error handler for TypeBox validation errors.\n * Supports most JSON Schema validation keywords and produces human-friendly messages\n * with i18n/l10n support through message code mapping.\n */\nexport const errorHandlerFactory = (\n customMessages?: Partial<Record<keyof ValidationMessages, string>>,\n) => {\n const messageMap = { ...MESSAGE_MAP, ...customMessages };\n\n /**\n * Formats the instancePath into a human-readable field name\n */\n function formatFieldPath(instancePath: string, schemaPath?: string): string {\n if (!instancePath?.trim?.()) {\n return \"root\";\n }\n\n // Check if this is a tuple validation (prefixItems in schemaPath)\n const isTupleItem = schemaPath?.includes(\"/prefixItems/\");\n\n // Remove leading slash and convert to readable format\n const formatted = instancePath\n .replace(/^\\\\//, \"\")\n .replace(/\\\\//g, \" ➜ \")\n .replace(/(\\\\d+)/g, (match) => {\n const index = Number(match);\n // For tuples, use more readable position labels\n if (isTupleItem) {\n const positions = [\n messageMap[MESSAGE_CODES.FIRST],\n messageMap[MESSAGE_CODES.SECOND],\n messageMap[MESSAGE_CODES.THIRD],\n messageMap[MESSAGE_CODES.FOURTH],\n messageMap[MESSAGE_CODES.FIFTH],\n ];\n return positions[index] //\n ? \\`(\\${positions[index]})\\`\n : \\`[\\${match}]\\`;\n }\n return \\`[\\${match}]\\`;\n })\n .replace(/➜ \\\\[/g, \"[\")\n .replace(/➜ \\\\(/g, \" \");\n\n return formatted;\n }\n\n /**\n * Pluralizes a word based on count\n */\n function pluralize(\n count: number,\n plural: string = messageMap[MESSAGE_CODES.PLURAL_SUFFIX],\n ): string {\n return count === 1 ? \"\" : plural;\n }\n\n /**\n * Maps validation error to error code and formats message\n */\n function getErrorCodeAndMessage(error: TValidationError): {\n code: keyof ValidationMessages;\n message: string;\n } {\n const { keyword, params, schemaPath } = error;\n const isTupleValidation = schemaPath?.includes(\"/prefixItems/\");\n\n const defaultMessage = format(messageMap[MESSAGE_CODES.UNKNOWN], keyword);\n\n const defaultError = {\n code: MESSAGE_CODES.UNKNOWN,\n message:\n \"message\" in error\n ? typeof error.message === \"string\"\n ? error.message || defaultMessage\n : JSON.stringify(error.message)\n : defaultMessage,\n };\n\n switch (keyword) {\n // Type validation\n case \"type\": {\n const p = params as { type: string };\n return {\n code: MESSAGE_CODES.TYPE_INVALID,\n message: format(messageMap[MESSAGE_CODES.TYPE_INVALID], p.type),\n };\n }\n\n // String validation\n case \"minLength\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.STRING_MIN_LENGTH,\n message: format(\n messageMap[MESSAGE_CODES.STRING_MIN_LENGTH],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"maxLength\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.STRING_MAX_LENGTH,\n message: format(\n messageMap[MESSAGE_CODES.STRING_MAX_LENGTH],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"pattern\":\n return {\n code: MESSAGE_CODES.STRING_PATTERN,\n message: messageMap[MESSAGE_CODES.STRING_PATTERN],\n };\n\n case \"format\": {\n const p = params as { format: string };\n const formatMap: Record<string, keyof ValidationMessages> = {\n email: MESSAGE_CODES.STRING_FORMAT_EMAIL,\n date: MESSAGE_CODES.STRING_FORMAT_DATE,\n \"date-time\": MESSAGE_CODES.STRING_FORMAT_DATETIME,\n time: MESSAGE_CODES.STRING_FORMAT_TIME,\n uri: MESSAGE_CODES.STRING_FORMAT_URI,\n url: MESSAGE_CODES.STRING_FORMAT_URL,\n uuid: MESSAGE_CODES.STRING_FORMAT_UUID,\n ipv4: MESSAGE_CODES.STRING_FORMAT_IPV4,\n ipv6: MESSAGE_CODES.STRING_FORMAT_IPV6,\n hostname: MESSAGE_CODES.STRING_FORMAT_HOSTNAME,\n \"json-pointer\": MESSAGE_CODES.STRING_FORMAT_JSON_POINTER,\n regex: MESSAGE_CODES.STRING_FORMAT_REGEX,\n };\n const code = formatMap[p.format] || MESSAGE_CODES.STRING_FORMAT;\n const message = formatMap[p.format]\n ? messageMap[code]\n : format(messageMap[MESSAGE_CODES.STRING_FORMAT], p.format);\n return { code, message };\n }\n\n // Number validation\n case \"minimum\": {\n const p = params as { comparison: string; limit: number };\n return {\n code: MESSAGE_CODES.NUMBER_MINIMUM,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_MINIMUM],\n p.comparison,\n p.limit,\n ),\n };\n }\n\n case \"maximum\": {\n const p = params as { comparison: string; limit: number };\n return {\n code: MESSAGE_CODES.NUMBER_MAXIMUM,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_MAXIMUM],\n p.comparison,\n p.limit,\n ),\n };\n }\n\n case \"exclusiveMinimum\": {\n const p = params as { comparison: string; limit: number };\n return {\n code: MESSAGE_CODES.NUMBER_EXCLUSIVE_MINIMUM,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_EXCLUSIVE_MINIMUM],\n p.comparison,\n p.limit,\n ),\n };\n }\n\n case \"exclusiveMaximum\": {\n const p = params as { comparison: string; limit: number };\n return {\n code: MESSAGE_CODES.NUMBER_EXCLUSIVE_MAXIMUM,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_EXCLUSIVE_MAXIMUM],\n p.comparison,\n p.limit,\n ),\n };\n }\n\n case \"multipleOf\": {\n const p = params as { multipleOf: number };\n return {\n code: MESSAGE_CODES.NUMBER_MULTIPLE_OF,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_MULTIPLE_OF],\n p.multipleOf,\n ),\n };\n }\n\n // Array validation\n case \"minItems\": {\n const p = params as { limit: number };\n if (isTupleValidation) {\n return {\n code: MESSAGE_CODES.TUPLE_MIN_ITEMS,\n message: format(\n messageMap[MESSAGE_CODES.TUPLE_MIN_ITEMS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n return {\n code: MESSAGE_CODES.ARRAY_MIN_ITEMS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_MIN_ITEMS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"maxItems\": {\n const p = params as { limit: number };\n if (isTupleValidation) {\n return {\n code: MESSAGE_CODES.TUPLE_MAX_ITEMS,\n message: format(\n messageMap[MESSAGE_CODES.TUPLE_MAX_ITEMS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n return {\n code: MESSAGE_CODES.ARRAY_MAX_ITEMS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_MAX_ITEMS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"uniqueItems\": {\n const p = params as { duplicateItems?: number[] };\n const duplicateCount = p.duplicateItems?.length || 0;\n const suffix = duplicateCount\n ? format(\n messageMap[MESSAGE_CODES.FOUND_N_DUPLICATES],\n duplicateCount,\n pluralize(duplicateCount),\n )\n : \"\";\n return {\n code: MESSAGE_CODES.ARRAY_UNIQUE_ITEMS,\n message: format(messageMap[MESSAGE_CODES.ARRAY_UNIQUE_ITEMS], suffix),\n };\n }\n\n case \"contains\": {\n const p = params as { minContains?: number };\n const minContains = p.minContains || 1;\n return {\n code: MESSAGE_CODES.ARRAY_CONTAINS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_CONTAINS],\n minContains,\n pluralize(minContains),\n ),\n };\n }\n\n case \"unevaluatedItems\":\n return {\n code: MESSAGE_CODES.ARRAY_UNEVALUATED_ITEMS,\n message: messageMap[MESSAGE_CODES.ARRAY_UNEVALUATED_ITEMS],\n };\n\n // Object validation\n case \"required\": {\n const p = params as {\n requiredProperties?: string[];\n missingProperty?: string;\n };\n const missingProps = p.requiredProperties || p.missingProperty;\n if (Array.isArray(missingProps)) {\n const props = missingProps.map((prop) => \\`\"\\${prop}\"\\`).join(\", \");\n const propWord =\n missingProps.length === 1 //\n ? messageMap[MESSAGE_CODES.PROPERTY]\n : messageMap[MESSAGE_CODES.PROPERTIES];\n return {\n code: MESSAGE_CODES.OBJECT_REQUIRED,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_REQUIRED],\n propWord,\n props,\n ),\n };\n }\n return {\n code: MESSAGE_CODES.OBJECT_REQUIRED,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_REQUIRED],\n messageMap[MESSAGE_CODES.PROPERTY],\n \\`\"\\${missingProps}\"\\`,\n ),\n };\n }\n\n case \"additionalProperties\": {\n const p = params as { additionalProperties: string[] };\n return {\n code: MESSAGE_CODES.OBJECT_ADDITIONAL_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_ADDITIONAL_PROPERTIES],\n p.additionalProperties.join(\", \"),\n ),\n };\n }\n\n case \"minProperties\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.OBJECT_MIN_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_MIN_PROPERTIES],\n p.limit,\n messageMap[\n p.limit === 1 //\n ? MESSAGE_CODES.PROPERTY\n : MESSAGE_CODES.PROPERTIES\n ],\n ),\n };\n }\n\n case \"maxProperties\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.OBJECT_MAX_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_MAX_PROPERTIES],\n p.limit,\n messageMap[\n p.limit === 1 //\n ? MESSAGE_CODES.PROPERTY\n : MESSAGE_CODES.PROPERTIES\n ],\n ),\n };\n }\n\n case \"propertyNames\": {\n const p = params as { propertyNames: string[] };\n return {\n code: MESSAGE_CODES.OBJECT_PROPERTY_NAMES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_PROPERTY_NAMES],\n p.propertyNames.join(\", \"),\n ),\n };\n }\n\n case \"dependencies\":\n case \"dependentRequired\": {\n const p = params as {\n deps?: string | string[];\n dependentRequired?: string | string[];\n };\n const deps = p.deps || p.dependentRequired;\n const depsStr = Array.isArray(deps)\n ? deps.map((d) => \\`\"\\${d}\"\\`).join(\", \")\n : deps;\n return {\n code: MESSAGE_CODES.OBJECT_DEPENDENCIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_DEPENDENCIES],\n depsStr,\n ),\n };\n }\n\n case \"unevaluatedProperties\": {\n const p = params as { unevaluatedProperties: string[] };\n return {\n code: MESSAGE_CODES.OBJECT_UNEVALUATED_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_UNEVALUATED_PROPERTIES],\n p.unevaluatedProperties.join(\", \"),\n ),\n };\n }\n\n // Enum and const\n case \"enum\": {\n const p = params as { allowedValues: unknown[] };\n if (Array.isArray(p.allowedValues) && p.allowedValues.length <= 5) {\n const values = p.allowedValues\n .map((v) => JSON.stringify(v))\n .join(\", \");\n return {\n code: MESSAGE_CODES.ENUM_MISMATCH,\n message: format(messageMap[MESSAGE_CODES.ENUM_MISMATCH], values),\n };\n }\n return {\n code: MESSAGE_CODES.ENUM_MISMATCH,\n message: format(\n messageMap[MESSAGE_CODES.ENUM_MISMATCH],\n messageMap[MESSAGE_CODES.ALLOWED_VALUES],\n ),\n };\n }\n\n case \"const\": {\n const p = params as { allowedValue: unknown };\n return {\n code: MESSAGE_CODES.CONST_MISMATCH,\n message: format(\n messageMap[MESSAGE_CODES.CONST_MISMATCH],\n JSON.stringify(p.allowedValue),\n ),\n };\n }\n\n // Conditional schemas\n case \"if\":\n return {\n code: MESSAGE_CODES.CONDITIONAL_IF,\n message: messageMap[MESSAGE_CODES.CONDITIONAL_IF],\n };\n\n // Composition\n case \"oneOf\": {\n const p = params as { passingSchemas?: number[] };\n return {\n code: MESSAGE_CODES.COMPOSITION_ONE_OF,\n message: format(\n messageMap[MESSAGE_CODES.COMPOSITION_ONE_OF],\n p.passingSchemas?.length || 0,\n ),\n };\n }\n\n case \"anyOf\":\n return {\n code: MESSAGE_CODES.COMPOSITION_ANY_OF,\n message: messageMap[MESSAGE_CODES.COMPOSITION_ANY_OF],\n };\n\n case \"not\":\n return {\n code: MESSAGE_CODES.COMPOSITION_NOT,\n message: messageMap[MESSAGE_CODES.COMPOSITION_NOT],\n };\n\n case \"boolean\":\n // Schema explicitly set to false - usually for additionalItems in tuples\n if (\n schemaPath?.includes(\"/items\") ||\n schemaPath?.includes(\"/additionalItems\")\n ) {\n return {\n code: MESSAGE_CODES.ARRAY_ITEMS,\n message: messageMap[MESSAGE_CODES.ARRAY_ITEMS],\n };\n }\n return defaultError;\n\n /**\n * TODO: Periodically check the TypeBox repository for implementation updates.\n * Some validation cases (minContains, prefixItems, etc.) are not yet\n * implemented by TypeBox, so they are commented out below.\n */\n\n /**\n case \"minContains\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.ARRAY_MIN_CONTAINS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_MIN_CONTAINS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"maxContains\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.ARRAY_MAX_CONTAINS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_MAX_CONTAINS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"prefixItems\":\n return {\n code: MESSAGE_CODES.ARRAY_PREFIX_ITEMS,\n message: messageMap[MESSAGE_CODES.ARRAY_PREFIX_ITEMS],\n };\n\n case \"items\":\n return {\n code: MESSAGE_CODES.ARRAY_ITEMS,\n message: messageMap[MESSAGE_CODES.ARRAY_ITEMS],\n };\n\n case \"then\":\n return {\n code: MESSAGE_CODES.CONDITIONAL_THEN,\n message: messageMap[MESSAGE_CODES.CONDITIONAL_THEN],\n };\n\n case \"else\":\n return {\n code: MESSAGE_CODES.CONDITIONAL_ELSE,\n message: messageMap[MESSAGE_CODES.CONDITIONAL_ELSE],\n };\n\n case \"allOf\":\n return {\n code: MESSAGE_CODES.COMPOSITION_ALL_OF,\n message: messageMap[MESSAGE_CODES.COMPOSITION_ALL_OF],\n };\n\n // Content validation\n case \"discriminator\": {\n const p = params as { propertyName: string };\n return {\n code: MESSAGE_CODES.CONTENT_DISCRIMINATOR,\n message: format(\n messageMap[MESSAGE_CODES.CONTENT_DISCRIMINATOR],\n p.propertyName,\n ),\n };\n }\n\n case \"contentEncoding\": {\n const p = params as { encoding: string };\n return {\n code: MESSAGE_CODES.CONTENT_ENCODING,\n message: format(\n messageMap[MESSAGE_CODES.CONTENT_ENCODING],\n p.encoding,\n ),\n };\n }\n\n case \"contentMediaType\": {\n const p = params as { mediaType: string };\n return {\n code: MESSAGE_CODES.CONTENT_MEDIA_TYPE,\n message: format(\n messageMap[MESSAGE_CODES.CONTENT_MEDIA_TYPE],\n p.mediaType,\n ),\n };\n }\n\n // Custom keywords\n case \"range\": {\n const p = params as { min?: number; max?: number };\n return {\n code: MESSAGE_CODES.CUSTOM_RANGE,\n message: format(messageMap[MESSAGE_CODES.CUSTOM_RANGE], p.min, p.max),\n };\n }\n\n case \"exclusiveRange\": {\n const p = params as { min?: number; max?: number };\n return {\n code: MESSAGE_CODES.CUSTOM_EXCLUSIVE_RANGE,\n message: format(\n messageMap[MESSAGE_CODES.CUSTOM_EXCLUSIVE_RANGE],\n p.min,\n p.max,\n ),\n };\n }\n\n case \"regexp\":\n return {\n code: MESSAGE_CODES.CUSTOM_REGEXP,\n message: messageMap[MESSAGE_CODES.CUSTOM_REGEXP],\n };\n\n case \"dynamicDefaults\":\n return {\n code: MESSAGE_CODES.CUSTOM_DYNAMIC_DEFAULTS,\n message: messageMap[MESSAGE_CODES.CUSTOM_DYNAMIC_DEFAULTS],\n };\n\n case \"select\":\n case \"selectCases\":\n case \"selectDefault\":\n return {\n code: MESSAGE_CODES.CUSTOM_SELECT,\n message: messageMap[MESSAGE_CODES.CUSTOM_SELECT],\n };\n\n case \"transform\":\n return {\n code: MESSAGE_CODES.CUSTOM_TRANSFORM,\n message: messageMap[MESSAGE_CODES.CUSTOM_TRANSFORM],\n };\n\n case \"uniqueItemProperties\": {\n const p = params as { properties?: string[] };\n const props = p.properties || [];\n return {\n code: MESSAGE_CODES.CUSTOM_UNIQUE_ITEM_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.CUSTOM_UNIQUE_ITEM_PROPERTIES],\n messageMap[\n props.length === 1 //\n ? MESSAGE_CODES.PROPERTY\n : MESSAGE_CODES.PROPERTIES\n ],\n props.join(\", \"),\n ),\n };\n }\n */\n\n // Default fallback\n default: {\n return defaultError;\n }\n }\n }\n\n /**\n * Groups errors by field to avoid duplicate messages\n */\n function groupErrorsByField(\n errors: TValidationError[],\n ): Map<string, TValidationError[]> {\n const grouped = new Map<string, TValidationError[]>();\n\n for (const error of errors) {\n const field = error.instancePath;\n if (!grouped.has(field)) {\n grouped.set(field, []);\n }\n grouped.get(field)?.push(error);\n }\n\n return grouped;\n }\n\n /**\n * Prioritizes errors to show the most important one per field\n */\n function prioritizeErrors(errors: TValidationError[]): TValidationError {\n // Priority order: required > type > format > const/enum > other constraints\n const priority: Record<string, number> = {\n required: 1,\n type: 2,\n format: 3,\n const: 4,\n enum: 4,\n pattern: 5,\n minimum: 6,\n maximum: 6,\n exclusiveMinimum: 6,\n exclusiveMaximum: 6,\n minLength: 6,\n maxLength: 6,\n minItems: 6,\n maxItems: 6,\n minProperties: 6,\n maxProperties: 6,\n };\n\n return errors.sort((a, b) => {\n const aPriority = priority[a.keyword] || 99;\n const bPriority = priority[b.keyword] || 99;\n return aPriority - bPriority;\n })[0];\n }\n\n // ============================================================================\n // Public API\n // ============================================================================\n\n /**\n * Main function to format validation errors\n */\n function formatValidationErrors(\n errors: TValidationError[],\n options: {\n groupByField?: boolean;\n singleError?: boolean;\n } = {},\n ): Array<ValidationErrorEntry> {\n if (!errors?.length) {\n return [];\n }\n\n const { groupByField = true, singleError = false } = options;\n\n if (singleError) {\n // Return only the first error\n const error = errors[0];\n const { code, message } = getErrorCodeAndMessage(error);\n return [\n {\n keyword: error.keyword,\n path: formatFieldPath(error.instancePath, error.schemaPath),\n message,\n code,\n params: error.params,\n },\n ];\n }\n\n if (groupByField) {\n // Group errors by field and return one error per field\n const grouped = groupErrorsByField(errors);\n const formatted: ValidationErrorEntry[] = [];\n\n for (const [_, fieldErrors] of grouped) {\n const prioritized = prioritizeErrors(fieldErrors);\n const { code, message } = getErrorCodeAndMessage(prioritized);\n formatted.push({\n keyword: prioritized.keyword,\n path: formatFieldPath(\n prioritized.instancePath,\n prioritized.schemaPath,\n ),\n message,\n code,\n params: prioritized.params,\n });\n }\n\n return formatted;\n }\n\n // Return all errors\n return errors.map((error) => {\n const { code, message } = getErrorCodeAndMessage(error);\n return {\n keyword: error.keyword,\n path: formatFieldPath(error.instancePath, error.schemaPath),\n message,\n code,\n params: error.params,\n };\n });\n }\n\n /**\n * Formats errors into a single human-readable message\n */\n function formatValidationErrorMessage(\n errors: TValidationError[],\n options: {\n prefix?: string;\n separator?: string;\n includeField?: boolean;\n } = {},\n ): string {\n const {\n prefix = messageMap[MESSAGE_CODES.VALIDATION_FAILED_PREFIX],\n separator = \"; \",\n includeField = true,\n } = options;\n\n const formatted = formatValidationErrors(errors, { groupByField: true });\n\n const messageList = formatted.map((error) => {\n if (includeField && error.path !== \"root\") {\n return \\`\\${error.path}: \\${error.message}\\`;\n }\n return error.message;\n });\n\n return \\`\\${prefix}\\${prefix ? \" \" : \"\"}\\${messageList.join(separator)}\\`;\n }\n\n /**\n * Gets a simple error summary for quick feedback\n */\n function getErrorSummary(errors: TValidationError[]): string {\n if (!errors?.length) {\n return messageMap[MESSAGE_CODES.VALIDATION_PASSED];\n }\n\n const uniqueFields = new Set(errors.map((e) => e.instancePath));\n const fieldCount = uniqueFields.size;\n\n if (fieldCount === 1) {\n const error = errors[0];\n const { message } = getErrorCodeAndMessage(error);\n const field = formatFieldPath(error.instancePath, error.schemaPath);\n return field === \"root\" ? message : \\`\\${field}: \\${message}\\`;\n }\n\n return format(\n messageMap[MESSAGE_CODES.ERROR_SUMMARY],\n errors.length,\n pluralize(errors.length),\n fieldCount,\n pluralize(fieldCount),\n );\n }\n\n return {\n formatValidationErrors,\n formatValidationErrorMessage,\n getErrorSummary,\n };\n};\n\n/**\n * Standalone format function for browser builds.\n * Avoids importing node:util to keep bundle size small and browser-compatible.\n * Supports: %s (string), %d (number), %i (integer), %f (float), %% (literal %)\n * */\nconst format = (fmt: string, ...args: unknown[]): string => {\n const argsIterator = args[Symbol.iterator]();\n\n // Handle format specifiers\n const str = String(fmt).replace(/%[sdif%]/g, (match) => {\n if (match === \"%%\") {\n return \"%\";\n }\n\n const next = argsIterator.next();\n\n if (next.done) {\n return match;\n }\n\n const arg = next.value;\n\n switch (match) {\n case \"%s\": // String\n return String(arg);\n case \"%d\": // Number\n return String(Number(arg));\n case \"%i\": // Integer\n return String(parseInt(String(arg), 10));\n case \"%f\": // Float\n return String(parseFloat(String(arg)));\n default:\n return match;\n }\n });\n\n // Append remaining arguments\n const remaining = [...argsIterator];\n\n if (remaining.length > 0) {\n return [str, remaining.map((arg) => String(arg)).join(\" \")].join(\" \");\n }\n\n return str;\n};\n`,c=`import Type from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport Value from \"typebox/value\";\n\nimport type { ValidationSchema, ValidationTarget } from \"@kosmojs/core\";\nimport { ValidationError } from \"@kosmojs/core/errors\";\n\nimport { errorHandlerFactory } from \"./error-handler\";\nimport { customTypes, validationMessages } from \"./setup\";\n\nconst {\n formatValidationErrors,\n formatValidationErrorMessage,\n getErrorSummary,\n} = errorHandlerFactory(validationMessages);\n\nexport const validationSchemaFactory = (\n schemaText: string,\n { target, route }: { target: ValidationTarget | \"params\"; route: string },\n): ValidationSchema => {\n const schema = Type.Script(customTypes, schemaText);\n const compiledSchema = Compile(schema);\n const getSchemaErrors = (data: unknown) => Value.Errors(schema, data);\n return {\n check(data) {\n return compiledSchema.Check(data);\n },\n errors(data) {\n return formatValidationErrors(getSchemaErrors(data));\n },\n errorMessage(data) {\n return formatValidationErrorMessage(getSchemaErrors(data));\n },\n errorSummary(data) {\n return getErrorSummary(getSchemaErrors(data));\n },\n validate(data) {\n if (!this.check(data)) {\n throw new ValidationError([\n target,\n {\n errors: this.errors(data),\n errorMessage: this.errorMessage(data),\n errorSummary: this.errorSummary(data),\n route,\n data,\n },\n ]);\n }\n },\n };\n};\n`,l=`import { Settings } from \"typebox/system\";\n\nSettings.Set({{settings}});\n\nexport { default as customTypes } from \"{{customTypesImport}}\";\n\nexport const validationMessages = {{validationMessages}};\n`,u=`import type { ValidationSchemas } from \"@kosmojs/core\";\n\nimport { validationSchemaFactory } from \"{{ createImport 'lib' '@typebox' }}\";\n\nconst schemas = {\n{{#each resolvedTypes}} {{name}}: \\`{{typeboxSchema}}\\`,\n{{/each}}\n}\n\nexport const validationSchemas: ValidationSchemas = {\n params: validationSchemaFactory(\n schemas.{{route.params.id}},\n { route: \"{{route.name}}\", target: \"params\" },\n ),\n\n {{#each requestSchemas}}\n {{target}}: {\n {{#each methods}}\n {{method}}: {\n ...validationSchemaFactory(\n schemas.{{schema.id}},\n { route: \"{{route}}\", target: \"{{target}}\" },\n ),\n {{#if runtimeValidation}}\n runtimeValidation: {{runtimeValidation}},\n {{/if}}\n {{#if customErrors}}\n customErrors: {{customErrors}},\n {{/if}}\n },\n {{/each}}\n },\n {{/each}}\n\n response: {\n {{#each responseSchemas}}\n {{method}}: [\n {{#each variants}}\n {\n {{#if resolvedType}}\n ...validationSchemaFactory(\n schemas.{{id}},\n { route: \"{{route}}\", target: \"{{target}}\" },\n ),\n {{/if}}\n status: {{status}},\n {{#if contentType}}\n contentType: \"{{contentType}}\",\n {{/if}}\n {{#if runtimeValidation}}\n runtimeValidation: {{runtimeValidation}},\n {{/if}}\n {{#if customErrors}}\n customErrors: {{customErrors}},\n {{/if}}\n },\n {{/each}}\n ],\n {{/each}}\n },\n};\n`,d={exactOptionalPropertyTypes:!0},f=t((e,t)=>{let{createPath:a,createImport:f,createImportHelpers:p}=n(e),{renderToFile:m}=r({helpers:{...p({origin:`lib`})}}),{validationMessages:h={},customTypesImport:g=f.lib([`@typebox/custom-types`],{origin:`lib`}),settings:_}={...t},v=async e=>{for(let{kind:t,entry:n}of e){if(t!==`apiRoute`)continue;let e=[n.params,...n.validationDefinitions.flatMap(e=>e.target===`response`?e.variants:[e.schema])].flatMap(({resolvedType:e})=>e?[e]:[]),r=[...new Set(n.validationDefinitions.flatMap(({target:e})=>Object.keys(i).includes(e)?[e]:[]))].map(e=>({target:e,methods:n.methods.flatMap(t=>{let r=n.validationDefinitions.find(n=>n.method===t&&n.target===e);return r?[{route:n.name,method:t,target:e,schema:r.schema,...r.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(r.runtimeValidation)},...r.customErrors===void 0?{}:{customErrors:JSON.stringify(r.customErrors)}}]:[]})})),o=n.methods.flatMap(e=>{let t=n.validationDefinitions.find(t=>t.method===e&&t.target===`response`);return t?[{method:e,variants:t.variants.map(e=>({route:n.name,target:`response`,...e,...t.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(t.runtimeValidation)},...t.customErrors===void 0?{}:{customErrors:JSON.stringify(t.customErrors)}}))}]:[]});await m(a.libApi(n.name,`schemas.ts`),u,{route:n,resolvedTypes:e,requestSchemas:r,responseSchemas:o})}};return{async start(){for(let[e,t]of[[`custom-types.ts`,o],[`error-handler.ts`,s],[`index.ts`,c],[`setup.ts`,l]])await m(a.lib(`@typebox`,e),t,{validationMessages:JSON.stringify(h),customTypesImport:g,settings:JSON.stringify({...d,..._})})},async watch(e,t){await v(t?e.filter(({kind:e,entry:n})=>t.kind===`update`&&e===`apiRoute`&&n.fileFullpath===t.file):e)},async build(e){await v(e)}}}),p={PROPERTY:`PROPERTY`,PROPERTIES:`PROPERTIES`,ALLOWED_VALUES:`ALLOWED_VALUES`,FOUND_N_DUPLICATES:`FOUND_N_DUPLICATES`,VALIDATION_PASSED:`VALIDATION_PASSED`,VALIDATION_FAILED_PREFIX:`VALIDATION_FAILED_PREFIX`,ERROR_SUMMARY:`ERROR_SUMMARY`,PLURAL_SUFFIX:`PLURAL_SUFFIX`,FIRST:`FIRST`,SECOND:`SECOND`,THIRD:`THIRD`,FOURTH:`FOURTH`,FIFTH:`FIFTH`,TYPE_INVALID:`TYPE_INVALID`,STRING_MIN_LENGTH:`STRING_MIN_LENGTH`,STRING_MAX_LENGTH:`STRING_MAX_LENGTH`,STRING_PATTERN:`STRING_PATTERN`,STRING_FORMAT:`STRING_FORMAT`,STRING_FORMAT_EMAIL:`STRING_FORMAT_EMAIL`,STRING_FORMAT_DATE:`STRING_FORMAT_DATE`,STRING_FORMAT_DATETIME:`STRING_FORMAT_DATETIME`,STRING_FORMAT_TIME:`STRING_FORMAT_TIME`,STRING_FORMAT_URI:`STRING_FORMAT_URI`,STRING_FORMAT_URL:`STRING_FORMAT_URL`,STRING_FORMAT_UUID:`STRING_FORMAT_UUID`,STRING_FORMAT_IPV4:`STRING_FORMAT_IPV4`,STRING_FORMAT_IPV6:`STRING_FORMAT_IPV6`,STRING_FORMAT_HOSTNAME:`STRING_FORMAT_HOSTNAME`,STRING_FORMAT_JSON_POINTER:`STRING_FORMAT_JSON_POINTER`,STRING_FORMAT_REGEX:`STRING_FORMAT_REGEX`,NUMBER_MINIMUM:`NUMBER_MINIMUM`,NUMBER_MAXIMUM:`NUMBER_MAXIMUM`,NUMBER_EXCLUSIVE_MINIMUM:`NUMBER_EXCLUSIVE_MINIMUM`,NUMBER_EXCLUSIVE_MAXIMUM:`NUMBER_EXCLUSIVE_MAXIMUM`,NUMBER_MULTIPLE_OF:`NUMBER_MULTIPLE_OF`,ARRAY_MIN_ITEMS:`ARRAY_MIN_ITEMS`,ARRAY_MAX_ITEMS:`ARRAY_MAX_ITEMS`,ARRAY_UNIQUE_ITEMS:`ARRAY_UNIQUE_ITEMS`,ARRAY_CONTAINS:`ARRAY_CONTAINS`,ARRAY_MIN_CONTAINS:`ARRAY_MIN_CONTAINS`,ARRAY_MAX_CONTAINS:`ARRAY_MAX_CONTAINS`,ARRAY_PREFIX_ITEMS:`ARRAY_PREFIX_ITEMS`,ARRAY_ITEMS:`ARRAY_ITEMS`,ARRAY_UNEVALUATED_ITEMS:`ARRAY_UNEVALUATED_ITEMS`,TUPLE_MIN_ITEMS:`TUPLE_MIN_ITEMS`,TUPLE_MAX_ITEMS:`TUPLE_MAX_ITEMS`,OBJECT_REQUIRED:`OBJECT_REQUIRED`,OBJECT_ADDITIONAL_PROPERTIES:`OBJECT_ADDITIONAL_PROPERTIES`,OBJECT_MIN_PROPERTIES:`OBJECT_MIN_PROPERTIES`,OBJECT_MAX_PROPERTIES:`OBJECT_MAX_PROPERTIES`,OBJECT_PROPERTY_NAMES:`OBJECT_PROPERTY_NAMES`,OBJECT_DEPENDENCIES:`OBJECT_DEPENDENCIES`,OBJECT_UNEVALUATED_PROPERTIES:`OBJECT_UNEVALUATED_PROPERTIES`,ENUM_MISMATCH:`ENUM_MISMATCH`,CONST_MISMATCH:`CONST_MISMATCH`,CONDITIONAL_IF:`CONDITIONAL_IF`,CONDITIONAL_THEN:`CONDITIONAL_THEN`,CONDITIONAL_ELSE:`CONDITIONAL_ELSE`,COMPOSITION_ONE_OF:`COMPOSITION_ONE_OF`,COMPOSITION_ANY_OF:`COMPOSITION_ANY_OF`,COMPOSITION_ALL_OF:`COMPOSITION_ALL_OF`,COMPOSITION_NOT:`COMPOSITION_NOT`,CONTENT_DISCRIMINATOR:`CONTENT_DISCRIMINATOR`,CONTENT_ENCODING:`CONTENT_ENCODING`,CONTENT_MEDIA_TYPE:`CONTENT_MEDIA_TYPE`,CUSTOM_RANGE:`CUSTOM_RANGE`,CUSTOM_EXCLUSIVE_RANGE:`CUSTOM_EXCLUSIVE_RANGE`,CUSTOM_REGEXP:`CUSTOM_REGEXP`,CUSTOM_DYNAMIC_DEFAULTS:`CUSTOM_DYNAMIC_DEFAULTS`,CUSTOM_SELECT:`CUSTOM_SELECT`,CUSTOM_TRANSFORM:`CUSTOM_TRANSFORM`,CUSTOM_UNIQUE_ITEM_PROPERTIES:`CUSTOM_UNIQUE_ITEM_PROPERTIES`,UNKNOWN:`UNKNOWN`},m={[p.PROPERTY]:`property`,[p.PROPERTIES]:`properties`,[p.ALLOWED_VALUES]:`the allowed values`,[p.FOUND_N_DUPLICATES]:` (found %d duplicate%s)`,[p.VALIDATION_PASSED]:`Validation Passed`,[p.VALIDATION_FAILED_PREFIX]:``,[p.ERROR_SUMMARY]:`%d validation error%s found across %d field%s`,[p.PLURAL_SUFFIX]:`s`,[p.FIRST]:`first`,[p.SECOND]:`second`,[p.THIRD]:`third`,[p.FOURTH]:`fourth`,[p.FIFTH]:`fifth`,[p.TYPE_INVALID]:`must be %s`,[p.STRING_MIN_LENGTH]:`must be at least %d character%s long`,[p.STRING_MAX_LENGTH]:`must not exceed %d character%s`,[p.STRING_PATTERN]:`must match the required pattern`,[p.STRING_FORMAT]:`must match format \"%s\"`,[p.STRING_FORMAT_EMAIL]:`must be a valid email address`,[p.STRING_FORMAT_DATE]:`must be a valid date`,[p.STRING_FORMAT_DATETIME]:`must be a valid date-time`,[p.STRING_FORMAT_TIME]:`must be a valid time`,[p.STRING_FORMAT_URI]:`must be a valid URI`,[p.STRING_FORMAT_URL]:`must be a valid URL`,[p.STRING_FORMAT_UUID]:`must be a valid UUID`,[p.STRING_FORMAT_IPV4]:`must be a valid IPv4 address`,[p.STRING_FORMAT_IPV6]:`must be a valid IPv6 address`,[p.STRING_FORMAT_HOSTNAME]:`must be a valid hostname`,[p.STRING_FORMAT_JSON_POINTER]:`must be a valid JSON pointer`,[p.STRING_FORMAT_REGEX]:`must be a valid regular expression`,[p.NUMBER_MINIMUM]:`must be %s %s`,[p.NUMBER_MAXIMUM]:`must be %s %s`,[p.NUMBER_EXCLUSIVE_MINIMUM]:`must be %s %s`,[p.NUMBER_EXCLUSIVE_MAXIMUM]:`must be %s %s`,[p.NUMBER_MULTIPLE_OF]:`must be a multiple of %s`,[p.ARRAY_MIN_ITEMS]:`must have at least %d item%s`,[p.ARRAY_MAX_ITEMS]:`must not have more than %d item%s`,[p.ARRAY_UNIQUE_ITEMS]:`must not have duplicate items%s`,[p.ARRAY_CONTAINS]:`must contain at least %d valid item%s`,[p.ARRAY_MIN_CONTAINS]:`must contain at least %d item%s matching the criteria`,[p.ARRAY_MAX_CONTAINS]:`must contain no more than %d item%s matching the criteria`,[p.ARRAY_PREFIX_ITEMS]:`tuple structure is invalid`,[p.ARRAY_ITEMS]:`array items are invalid`,[p.ARRAY_UNEVALUATED_ITEMS]:`should not have unevaluated items`,[p.TUPLE_MIN_ITEMS]:`tuple must have at least %d element%s`,[p.TUPLE_MAX_ITEMS]:`tuple must not have more than %d element%s`,[p.OBJECT_REQUIRED]:`missing required %s: %s`,[p.OBJECT_ADDITIONAL_PROPERTIES]:`should not have additional property \"%s\"`,[p.OBJECT_MIN_PROPERTIES]:`must have at least %d %s`,[p.OBJECT_MAX_PROPERTIES]:`must not have more than %d %s`,[p.OBJECT_PROPERTY_NAMES]:`property name \"%s\" is invalid`,[p.OBJECT_DEPENDENCIES]:`requires %s when present`,[p.OBJECT_UNEVALUATED_PROPERTIES]:`should not have unevaluated property \"%s\"`,[p.ENUM_MISMATCH]:`must be one of: %s`,[p.CONST_MISMATCH]:`must be equal to %s`,[p.CONDITIONAL_IF]:`does not match the conditional schema`,[p.CONDITIONAL_THEN]:`does not satisfy the \"then\" schema condition`,[p.CONDITIONAL_ELSE]:`does not satisfy the \"else\" schema condition`,[p.COMPOSITION_ONE_OF]:`must match exactly one schema (currently matches %d)`,[p.COMPOSITION_ANY_OF]:`must match at least one schema`,[p.COMPOSITION_ALL_OF]:`must match all schemas`,[p.COMPOSITION_NOT]:`must not match the schema`,[p.CONTENT_DISCRIMINATOR]:`discriminator property \"%s\" has invalid value`,[p.CONTENT_ENCODING]:`content encoding \"%s\" is invalid`,[p.CONTENT_MEDIA_TYPE]:`content media type \"%s\" is invalid`,[p.CUSTOM_RANGE]:`must be within the range %s to %s`,[p.CUSTOM_EXCLUSIVE_RANGE]:`must be strictly within the range %s to %s`,[p.CUSTOM_REGEXP]:`must match the regular expression pattern`,[p.CUSTOM_DYNAMIC_DEFAULTS]:`failed to apply dynamic default value`,[p.CUSTOM_SELECT]:`does not match any of the selected cases`,[p.CUSTOM_TRANSFORM]:`transformation failed`,[p.CUSTOM_UNIQUE_ITEM_PROPERTIES]:`must have unique values for %s: %s`,[p.UNKNOWN]:`validation failed for keyword \"%s\"`},h=e=>{let t={...m,...e};function n(e,n){if(!e?.trim?.())return`root`;let r=n?.includes(`/prefixItems/`);return e.replace(/^\\//,``).replace(/\\//g,` ➜ `).replace(/(\\d+)/g,e=>{let n=Number(e);if(r){let r=[t[p.FIRST],t[p.SECOND],t[p.THIRD],t[p.FOURTH],t[p.FIFTH]];return r[n]?`(${r[n]})`:`[${e}]`}return`[${e}]`}).replace(/➜ \\[/g,`[`).replace(/➜ \\(/g,` `)}function r(e,n=t[p.PLURAL_SUFFIX]){return e===1?``:n}function i(e){let{keyword:n,params:i,schemaPath:a}=e,o=a?.includes(`/prefixItems/`),s=g(t[p.UNKNOWN],n),c={code:p.UNKNOWN,message:`message`in e?typeof e.message==`string`?e.message||s:JSON.stringify(e.message):s};switch(n){case`type`:{let e=i;return{code:p.TYPE_INVALID,message:g(t[p.TYPE_INVALID],e.type)}}case`minLength`:{let e=i;return{code:p.STRING_MIN_LENGTH,message:g(t[p.STRING_MIN_LENGTH],e.limit,r(e.limit))}}case`maxLength`:{let e=i;return{code:p.STRING_MAX_LENGTH,message:g(t[p.STRING_MAX_LENGTH],e.limit,r(e.limit))}}case`pattern`:return{code:p.STRING_PATTERN,message:t[p.STRING_PATTERN]};case`format`:{let e=i,n={email:p.STRING_FORMAT_EMAIL,date:p.STRING_FORMAT_DATE,\"date-time\":p.STRING_FORMAT_DATETIME,time:p.STRING_FORMAT_TIME,uri:p.STRING_FORMAT_URI,url:p.STRING_FORMAT_URL,uuid:p.STRING_FORMAT_UUID,ipv4:p.STRING_FORMAT_IPV4,ipv6:p.STRING_FORMAT_IPV6,hostname:p.STRING_FORMAT_HOSTNAME,\"json-pointer\":p.STRING_FORMAT_JSON_POINTER,regex:p.STRING_FORMAT_REGEX},r=n[e.format]||p.STRING_FORMAT;return{code:r,message:n[e.format]?t[r]:g(t[p.STRING_FORMAT],e.format)}}case`minimum`:{let e=i;return{code:p.NUMBER_MINIMUM,message:g(t[p.NUMBER_MINIMUM],e.comparison,e.limit)}}case`maximum`:{let e=i;return{code:p.NUMBER_MAXIMUM,message:g(t[p.NUMBER_MAXIMUM],e.comparison,e.limit)}}case`exclusiveMinimum`:{let e=i;return{code:p.NUMBER_EXCLUSIVE_MINIMUM,message:g(t[p.NUMBER_EXCLUSIVE_MINIMUM],e.comparison,e.limit)}}case`exclusiveMaximum`:{let e=i;return{code:p.NUMBER_EXCLUSIVE_MAXIMUM,message:g(t[p.NUMBER_EXCLUSIVE_MAXIMUM],e.comparison,e.limit)}}case`multipleOf`:{let e=i;return{code:p.NUMBER_MULTIPLE_OF,message:g(t[p.NUMBER_MULTIPLE_OF],e.multipleOf)}}case`minItems`:{let e=i;return o?{code:p.TUPLE_MIN_ITEMS,message:g(t[p.TUPLE_MIN_ITEMS],e.limit,r(e.limit))}:{code:p.ARRAY_MIN_ITEMS,message:g(t[p.ARRAY_MIN_ITEMS],e.limit,r(e.limit))}}case`maxItems`:{let e=i;return o?{code:p.TUPLE_MAX_ITEMS,message:g(t[p.TUPLE_MAX_ITEMS],e.limit,r(e.limit))}:{code:p.ARRAY_MAX_ITEMS,message:g(t[p.ARRAY_MAX_ITEMS],e.limit,r(e.limit))}}case`uniqueItems`:{let e=i.duplicateItems?.length||0,n=e?g(t[p.FOUND_N_DUPLICATES],e,r(e)):``;return{code:p.ARRAY_UNIQUE_ITEMS,message:g(t[p.ARRAY_UNIQUE_ITEMS],n)}}case`contains`:{let e=i.minContains||1;return{code:p.ARRAY_CONTAINS,message:g(t[p.ARRAY_CONTAINS],e,r(e))}}case`unevaluatedItems`:return{code:p.ARRAY_UNEVALUATED_ITEMS,message:t[p.ARRAY_UNEVALUATED_ITEMS]};case`required`:{let e=i,n=e.requiredProperties||e.missingProperty;if(Array.isArray(n)){let e=n.map(e=>`\"${e}\"`).join(`, `),r=n.length===1?t[p.PROPERTY]:t[p.PROPERTIES];return{code:p.OBJECT_REQUIRED,message:g(t[p.OBJECT_REQUIRED],r,e)}}return{code:p.OBJECT_REQUIRED,message:g(t[p.OBJECT_REQUIRED],t[p.PROPERTY],`\"${n}\"`)}}case`additionalProperties`:{let e=i;return{code:p.OBJECT_ADDITIONAL_PROPERTIES,message:g(t[p.OBJECT_ADDITIONAL_PROPERTIES],e.additionalProperties.join(`, `))}}case`minProperties`:{let e=i;return{code:p.OBJECT_MIN_PROPERTIES,message:g(t[p.OBJECT_MIN_PROPERTIES],e.limit,t[e.limit===1?p.PROPERTY:p.PROPERTIES])}}case`maxProperties`:{let e=i;return{code:p.OBJECT_MAX_PROPERTIES,message:g(t[p.OBJECT_MAX_PROPERTIES],e.limit,t[e.limit===1?p.PROPERTY:p.PROPERTIES])}}case`propertyNames`:{let e=i;return{code:p.OBJECT_PROPERTY_NAMES,message:g(t[p.OBJECT_PROPERTY_NAMES],e.propertyNames.join(`, `))}}case`dependencies`:case`dependentRequired`:{let e=i,n=e.deps||e.dependentRequired,r=Array.isArray(n)?n.map(e=>`\"${e}\"`).join(`, `):n;return{code:p.OBJECT_DEPENDENCIES,message:g(t[p.OBJECT_DEPENDENCIES],r)}}case`unevaluatedProperties`:{let e=i;return{code:p.OBJECT_UNEVALUATED_PROPERTIES,message:g(t[p.OBJECT_UNEVALUATED_PROPERTIES],e.unevaluatedProperties.join(`, `))}}case`enum`:{let e=i;if(Array.isArray(e.allowedValues)&&e.allowedValues.length<=5){let n=e.allowedValues.map(e=>JSON.stringify(e)).join(`, `);return{code:p.ENUM_MISMATCH,message:g(t[p.ENUM_MISMATCH],n)}}return{code:p.ENUM_MISMATCH,message:g(t[p.ENUM_MISMATCH],t[p.ALLOWED_VALUES])}}case`const`:{let e=i;return{code:p.CONST_MISMATCH,message:g(t[p.CONST_MISMATCH],JSON.stringify(e.allowedValue))}}case`if`:return{code:p.CONDITIONAL_IF,message:t[p.CONDITIONAL_IF]};case`oneOf`:{let e=i;return{code:p.COMPOSITION_ONE_OF,message:g(t[p.COMPOSITION_ONE_OF],e.passingSchemas?.length||0)}}case`anyOf`:return{code:p.COMPOSITION_ANY_OF,message:t[p.COMPOSITION_ANY_OF]};case`not`:return{code:p.COMPOSITION_NOT,message:t[p.COMPOSITION_NOT]};case`boolean`:return a?.includes(`/items`)||a?.includes(`/additionalItems`)?{code:p.ARRAY_ITEMS,message:t[p.ARRAY_ITEMS]}:c;default:return c}}function a(e){let t=new Map;for(let n of e){let e=n.instancePath;t.has(e)||t.set(e,[]),t.get(e)?.push(n)}return t}function o(e){let t={required:1,type:2,format:3,const:4,enum:4,pattern:5,minimum:6,maximum:6,exclusiveMinimum:6,exclusiveMaximum:6,minLength:6,maxLength:6,minItems:6,maxItems:6,minProperties:6,maxProperties:6};return e.sort((e,n)=>(t[e.keyword]||99)-(t[n.keyword]||99))[0]}function s(e,t={}){if(!e?.length)return[];let{groupByField:r=!0,singleError:s=!1}=t;if(s){let t=e[0],{code:r,message:a}=i(t);return[{keyword:t.keyword,path:n(t.instancePath,t.schemaPath),message:a,code:r,params:t.params}]}if(r){let t=a(e),r=[];for(let[e,a]of t){let e=o(a),{code:t,message:s}=i(e);r.push({keyword:e.keyword,path:n(e.instancePath,e.schemaPath),message:s,code:t,params:e.params})}return r}return e.map(e=>{let{code:t,message:r}=i(e);return{keyword:e.keyword,path:n(e.instancePath,e.schemaPath),message:r,code:t,params:e.params}})}function c(e,n={}){let{prefix:r=t[p.VALIDATION_FAILED_PREFIX],separator:i=`; `,includeField:a=!0}=n,o=s(e,{groupByField:!0}).map(e=>a&&e.path!==`root`?`${e.path}: ${e.message}`:e.message);return`${r}${r?` `:``}${o.join(i)}`}function l(e){if(!e?.length)return t[p.VALIDATION_PASSED];let a=new Set(e.map(e=>e.instancePath)).size;if(a===1){let t=e[0],{message:r}=i(t),a=n(t.instancePath,t.schemaPath);return a===`root`?r:`${a}: ${r}`}return g(t[p.ERROR_SUMMARY],e.length,r(e.length),a,r(a))}return{formatValidationErrors:s,formatValidationErrorMessage:c,getErrorSummary:l}},g=(e,...t)=>{let n=t[Symbol.iterator](),r=String(e).replace(/%[sdif%]/g,e=>{if(e===`%%`)return`%`;let t=n.next();if(t.done)return e;let r=t.value;switch(e){case`%s`:return String(r);case`%d`:return String(Number(r));case`%i`:return String(parseInt(String(r),10));case`%f`:return String(parseFloat(String(r)));default:return e}}),i=[...n];return i.length>0?[r,i.map(e=>String(e)).join(` `)].join(` `):r},_=e({meta:{name:`TypeBox`,resolveTypes:!0},dependencies:{typebox:a.devDependencies.typebox},factory:f});export{p as MESSAGE_CODES,_ as default,h as errorHandlerFactory};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,nestedRoutesFactory as n,pathResolver as r,renderFactory as i,sortRoutes as a}from\"@kosmojs/lib\";import o from\"@vitejs/plugin-vue\";import{createTemplateResolver as s,defaults as c}from\"@kosmojs/core\";import{routeRenderHelpers as l}from\"@kosmojs/core/generators\";import{join as u}from\"node:path\";var d={type:`module`,private:!0,name:`@kosmojs/vue-generator`,version:`0.2.10`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/vue-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"@vitejs/plugin-vue\":`^6.0.8`},devDependencies:{\"@tanstack/vue-query\":`^5.101.4`,\"path-to-regexp\":`^8.4.2`,vue:`^3.5.41`,\"vue-router\":`^5.2.0`}},f=e=>{let t=e=>e.kind===`splat`?`:${e.name}(.*)?`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[t(e.parts[0])]:[e.parts.map(e=>e.type===`static`?e.value:t(e)).join(``)]).join(`/`)},p=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=(n,r)=>n.flatMap(({index:n,layout:i,children:a})=>{let{name:o,pathTokens:s}={...n,...i};if(!s)return[];let c=`${o}/layout`,l=r?f(s):u(`/`,f(s)),d=s.at(-1);return e(d)?n&&i?[{name:c,path:l,component:i.id,children:[{name:o,path:``,component:n.id}]}]:n?[{path:l,children:[{name:o,path:``,component:n.id},...t(a,o)]}]:i?[{name:c,path:l,component:i.id,children:t(a,o)}]:[]:n&&i?[{name:c,path:l,component:i.id,children:[{name:o,path:``,component:n.id},...t(a,o)]}]:n?[{path:l,children:[{name:o,path:``,component:n.id},...t(a,o)]}]:i?[{name:c,path:l,component:i.id,children:t(a,o)}]:[]});return t},m=()=>{let e=[`🎉 Well done! You just created a new Vue route.`,`🚀 Success! A fresh Vue route is ready to roll.`,`🌟 Nice work! Another Vue route added to your app.`,`🧩 All set! A new Vue route has been scaffolded.`,`🔧 Scaffold complete! Your new Vue route is in place.`,`✅ Built! Your Vue route is scaffolded and ready.`,`✨ Fantastic! Your new Vue route is good to go.`,`🎯 Nailed it! A brand new Vue route just landed.`,`💫 Awesome! Another Vue route joins the party.`,`⚡ Lightning fast! A new Vue route created successfully.`];return e[Math.floor(Math.random()*e.length)]},h=`import type { Plugin } from \"vue\";\n\nexport { default as AppProvider } from \"./provider.vue\";\n\nexport const appProvider: Plugin = {\n install() {},\n};\n`,g=`import { VueQueryPlugin } from \"@tanstack/vue-query\";\nimport type { Plugin } from \"vue\";\n\nimport { getQueryClient } from \"../query\";\n\nexport { default as AppProvider } from \"./provider.vue\";\n\nexport const appProvider: Plugin = {\n install(app) {\n app.use(VueQueryPlugin, { queryClient: getQueryClient() });\n },\n};\n`,_=`<template>\n <slot />\n</template>\n`,v=`import type { App } from \"vue\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\n{{#each pageEntries}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nconst NotFound = () => import(\"{{ createImport 'pages' '404.vue' }}\");\n\nexport const createRoutes = () => {\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"/:catchAll(.*)*\",\n name: \"NotFound\",\n component: NotFound,\n },\n ];\n}\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<Promise<App>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n component.mount(root, true);\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<Promise<App>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n component.mount(root);\n}\n\nexport default clientRenderFactory();\n`,y=`{\n path: \"{{path}}\",\n {{#if name}}\n name: \"{{name}}\",\n {{/if}}\n {{#if component}}\n {{#if @root.lazyLoad}}\n component: {{component}},\n meta: { module: {{component}} },\n {{else}}\n component: {{component}}.default,\n meta: { module: async () => {{component}} },\n {{/if}}\n {{/if}}\n {{#if children.length}}\n children: [ {{#each children}}{{> routePartial}}, {{/each}}],\n {{/if}}\n}\n`,b=`import type { App } from \"vue\";\n\nimport {\n renderToString as renderToStringOrig,\n renderToWebStream,\n} from \"vue/server-renderer\";\n\nimport type {\n RenderToStringWrapper,\n RenderToStreamWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\n{{#each pageEntries}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n\nimport * as NotFound from \"{{ createImport 'pages' '404.vue' }}\";\n\nexport const createRoutes = () => {\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"/:catchAll(.*)*\",\n name: \"NotFound\",\n component: NotFound.default,\n meta: { module: NotFound },\n },\n ];\n}\n\nexport const baseHeaderTags = (): Array<string> => [];\n\nconst createHydrationScript = (\n loaderData: Record<string, unknown>,\n) => {\n return loaderData\n ? \\`<script>\n window.__KOSMO_HYDRATION_DATA__ = JSON.parse(\n \\${JSON.stringify(JSON.stringify(loaderData))}\n );\n <\\/script>\\`\n : undefined;\n};\n\nexport const renderWrapper: SSRRenderWrapper = (_context, render) => render();\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<\n Promise<App>,\n { loaderData: Record<string, unknown> }\n >,\n Parameters<typeof renderToStringOrig>[1]\n> = async (resolver, { headerTags = [], context = {} } = {}) => {\n const { component, loaderData } = await resolver();\n const html = await renderToStringOrig(component, context);\n const script = createHydrationScript(loaderData);\n return {\n head: [...headerTags, ...script ? [script] : []].join(\"\\\\n\"),\n html,\n }\n}\n\nexport const renderToStream: RenderToStreamWrapper<\n () => RouterFactoryReturn<\n Promise<App>,\n { loaderData: Record<string, unknown> }\n >,\n Parameters<typeof renderToWebStream>[1]\n> = async (resolver, { headerTags = [], context = {} } = {}) => {\n const { component, loaderData } = await resolver();\n const source = renderToWebStream(component, context);\n\n const appendScript = new TransformStream<Uint8Array, Uint8Array>({\n flush(controller) {\n // runs once, after \\`source\\` has fully flushed and closed\n const script = createHydrationScript(loaderData);\n if (script) {\n controller.enqueue(new TextEncoder().encode(script));\n }\n },\n });\n\n return {\n head: [...headerTags].join(\"\\\\n\"),\n html: source.pipeThrough(appendScript),\n };\n}\n\nexport default serverRenderFactory();\n`,x=`declare module \"*.vue\" {\n import type { DefineComponent } from \"vue\";\n const component: DefineComponent<{}, {}, any>;\n export default component;\n}\n`,S=`<script setup lang=\"ts\">\nimport styles from \"./styles.module.css\";\ndefineProps<{\n headline?: string;\n}>();\n<\\/script>\n\n<template>\n <div :class=\"styles.container\">\n <div :class=\"styles.card\">\n <h1 :class=\"styles.title\">\n \\\\{{headline || \"404: Not Found\"}}\n </h1>\n <br />\n\n <div :class=\"styles.stepsBox\">\n <h2 :class=\"styles.stepsTitle\">\n Something went wrong...\n </h2>\n 🚧 No page found here\n </div>\n\n <div :class=\"styles.footer\">\n <p :class=\"styles.footerText\">\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n :class=\"styles.docsLink\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation →\n </a>\n </div>\n </div>\n </div>\n</template>\n`,C=`<script setup lang=\"ts\">\nimport styles from \"./styles.module.css\";\ndefineProps<{\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string }\n}>();\n<\\/script>\n\n<template>\n <div :data-page-route=\"routeName\" :class=\"styles.container\">\n <div :class=\"styles.card\">\n <h2 :class=\"styles.subtitle\">\n \\\\{{message}}\n </h2>\n <br />\n\n <div :class=\"styles.stepsBox\">\n <ul :class=\"styles.stepsList\">\n <li>\n Edit this page at <code>\\\\{{pathMap.page}}</code>\n </li>\n <li>\n Create new routes by adding folders in\n <code>\\\\{{pathMap.pages}}/</code>\n </li>\n <li>\n Add API endpoints in <code>\\\\{{pathMap.api}}/</code>\n </li>\n </ul>\n </div>\n\n <div :class=\"styles.footer\">\n <p :class=\"styles.footerText\">\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n :class=\"styles.docsLink\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation →\n </a>\n </div>\n </div>\n </div>\n</template>\n`,w=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: .5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,T=`<script setup lang=\"ts\">\nimport styles from \"./styles.module.css\";\n<\\/script>\n\n<template>\n <div :class=\"styles.container\">\n <div :class=\"styles.card\">\n <div :class=\"styles.header\">\n <div :class=\"styles.icon\">✨</div>\n <h1 :class=\"styles.title\">Welcome to KosmoJS</h1>\n <p :class=\"styles.subtitle\">\n Type-safe full-stack development with Vite\n </p>\n </div>\n\n <div :class=\"styles.featuresBox\">\n <h2 :class=\"styles.featuresTitle\">\n Powered by Vue and ready to perform\n </h2>\n <div :class=\"styles.featuresSubtitle\">What's included:</div>\n <ul :class=\"styles.featuresList\">\n <li :class=\"styles.featureItem\">\n <span :class=\"styles.featureBullet\">🔹</span>\n Directory-based routing\n </li>\n <li :class=\"styles.featureItem\">\n <span :class=\"styles.featureBullet\">🔹</span>\n End-to-End Type Safety\n </li>\n <li :class=\"styles.featureItem\">\n <span :class=\"styles.featureBullet\">🔹</span>\n Generated Fetch Clients\n </li>\n </ul>\n </div>\n\n <div :class=\"styles.stepsBox\">\n <h2 :class=\"styles.stepsTitle\">Next Steps 🚂</h2>\n <ul :class=\"styles.stepsList\">\n <li>\n Edit this page at <code>pages/index/index.vue</code>\n </li>\n <li>Create new routes by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div :class=\"styles.footer\">\n <p :class=\"styles.footerText\">\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n :class=\"styles.docsLink\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation →\n </a>\n </div>\n </div>\n </div>\n</template>\n`,E=`import { QueryClient, type QueryClientConfig } from \"@tanstack/vue-query\";\n\nlet client: QueryClient | undefined;\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n client = new QueryClient(options);\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n if (!client) {\n client = new QueryClient();\n }\n return client;\n};\n`,D=`import { QueryClient, type QueryClientConfig } from \"@tanstack/vue-query\";\n\nimport { store } from \"{{ createImport 'lib' '@ssr/base' }}\";\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n const client = new QueryClient(options);\n const ctx = store?.getStore();\n if (ctx) {\n ctx.tsqClient = client;\n }\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n const ctx = store?.getStore();\n if (!ctx) {\n throw new Error(\"getQueryClient(): called outside an SSR request scope\");\n }\n if (!ctx.tsqClient) {\n ctx.tsqClient = new QueryClient();\n }\n return ctx.tsqClient as QueryClient;\n};\n`,O=`import {\n type App,\n type Component,\n createApp,\n createSSRApp,\n type Plugin,\n} from \"vue\";\nimport {\n createMemoryHistory,\n createRouter,\n createWebHistory,\n type RouteRecordRaw,\n type Router,\n} from \"vue-router\";\n\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nexport type RouterWithLoaderData = Router & {\n __loaderData: Record<string, unknown>;\n};\n\nconst runLoader = async (\n key: string,\n route: unknown,\n fetcher: (r: never) => Promise<unknown>,\n) => {\n if (typeof window === \"undefined\" || !window.__KOSMO_HYDRATION_DATA__) {\n return fetcher(route as never);\n }\n return key in window.__KOSMO_HYDRATION_DATA__\n ? window.__KOSMO_HYDRATION_DATA__[key]\n : fetcher(route as never);\n};\n\n/**\n * Installs a beforeResolve guard that runs the matched chain's loaders\n * (layouts + leaf) before navigation commits, so components read data\n * synchronously at render time - no onServerPrefetch, no Suspense.\n * */\nconst installLoaderGuard = (router: RouterWithLoaderData) => {\n router.__loaderData = {};\n\n router.beforeResolve(async (to) => {\n const data: RouterWithLoaderData[\"__loaderData\"] = {};\n\n for (const { name, meta } of to.matched) {\n if (!name || typeof name !== \"string\" || !meta.module) {\n continue;\n }\n\n const { loader } =\n typeof meta.module === \"function\" //\n ? await meta.module()\n : {};\n\n if (loader) {\n await runLoader(name, to, loader as never).then((v) => {\n // undefined does not survive JSON.stringify, thus null\n data[name] = v ?? null;\n });\n }\n }\n\n router.__loaderData = data;\n\n // consumed: clear so client navigations refetch, and click-handlers don't reuse\n if (typeof window !== \"undefined\") {\n window.__KOSMO_HYDRATION_DATA__ = undefined;\n }\n });\n};\n\nexport const createRouters = (\n routes: Array<RouteRecordRaw>,\n {\n app,\n use,\n }: {\n app: Component;\n use?: Array<[plugin: Plugin, options: object | undefined]>;\n },\n): {\n clientRouter: () => RouterFactoryReturn<Promise<App>>;\n serverRouter: (\n url: URL,\n ) => RouterFactoryReturn<\n Promise<App>,\n { loaderData: Record<string, unknown> }\n >;\n} => {\n return {\n async clientRouter() {\n const component = createApp(app);\n\n const router = createRouter({\n history: createWebHistory(base),\n routes,\n strict: true,\n });\n\n installLoaderGuard(router as never);\n\n component.use(router);\n\n if (Array.isArray(use)) {\n for (const [plugin, options] of use) {\n component.use(plugin, options);\n }\n }\n\n return { component };\n },\n\n async serverRouter(url) {\n const component = createSSRApp(app);\n\n const router = createRouter({\n history: createMemoryHistory(base),\n routes,\n strict: true,\n }) as RouterWithLoaderData;\n\n // must be installed before push - the initial navigation\n // would otherwise skip the guard\n installLoaderGuard(router);\n\n await router.push(url.pathname.replace(base, \"\"));\n\n await router.isReady();\n\n component.use(router);\n\n if (Array.isArray(use)) {\n for (const [plugin, options] of use) {\n component.use(plugin, options);\n }\n }\n\n return { component, loaderData: router.__loaderData };\n },\n };\n};\n\nexport default createRouterFactory<\n RouteRecordRaw,\n Promise<App>,\n { server: { loaderData: Record<string, unknown> } }\n>();\n`,k=`import { type Ref, unref } from \"vue\";\n\nexport type MaybeWrapped<T> = Ref<T> | T;\n\nexport function unwrap<T>(value: MaybeWrapped<T>): T {\n return unref(value);\n}\n`,A=`import { useRoute, useRouter } from \"vue-router\";\n\nimport type { RouterWithLoaderData } from \"./router\";\n\n/**\n * Reads loader data for the current page or one of its layouts.\n * Without a key, returns the page's own data.\n * For a layout, pass its path-qualified name (e.g. \"dashboard/layout\") -\n * a hook can't tell which layout it runs in.\n * */\nexport const useLoaderData = <T>(key?: string): T | undefined => {\n const router = useRouter() as RouterWithLoaderData;\n const route = useRoute();\n return router.__loaderData?.[key || (route.name as string)] as T;\n};\n`,j=`<script setup lang=\"ts\">\nimport { AppProvider } from \"_/app\";\n<\\/script>\n\n<template>\n <AppProvider>\n <RouterView />\n </AppProvider>\n</template>\n`,M=`<script setup lang=\"ts\" generic=\"T extends LinkProps\">\nimport { computed } from \"vue\";\nimport { RouterLink } from \"vue-router\";\n\nimport { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\ninterface Props {\n to: T\n query?: Record<string | number, unknown>\n replace?: boolean\n activeClass?: string\n exactActiveClass?: string\n}\n\nconst props = defineProps<Props>();\n\nconst href = computed(() => {\n const [key, ...params] = props.to\n return pageRouteMap[key]?.base(params as never, props.query)\n})\n<\\/script>\n\n<template>\n <RouterLink\n :to=\"href\"\n :replace=\"replace\"\n :active-class=\"activeClass\"\n :exact-active-class=\"exactActiveClass\"\n >\n <slot />\n </RouterLink>\n</template>\n`,N=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,P=`import renderFactory, {\n createRoutes,\n renderToStream,\n renderToString,\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n renderToStream(url, { assets }) {\n return renderToStream(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,F=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,I=`<script setup lang=\"ts\">\nimport PageSample from \"{{ createImport 'lib' 'pageSamples/404.vue' }}\";\n<\\/script>\n\n<template>\n <PageSample />\n</template>\n`,L=`<template>\n <router-view />\n</template>\n`,R=`<script setup lang=\"ts\">\nimport PageSample from \"{{ createImport 'lib' 'pageSamples/page.vue' }}\";\n<\\/script>\n\n<template>\n <PageSample\n message=\"{{message}}\"\n routeName=\"{{route.name}}\"\n :pathMap=\"{\n page: '{{ createImport 'pages' route.file }}',\n pages: '{{ createImport 'pages' }}',\n api: '{{ createImport 'api' }}',\n }\"\n />\n</template>\n`,z=`<script setup lang=\"ts\">\nimport WelcomePage from \"{{ createImport 'lib' 'pageSamples/welcome.vue' }}\";\n<\\/script>\n\n<template>\n <WelcomePage />\n</template>\n`,B=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\nimport { appProvider } from \"{{ createImport 'lib' 'app' }}\";\n\nimport app from \"./app.vue\";\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, {\n app,\n use: [[appProvider, undefined]],\n });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,V=t((e,t)=>{let{createPath:u,createImportHelpers:d}=r(e),{renderToFile:f}=i({helpers:{...d({origin:`lib`}),...l()},partials:{routePartial:y}}),{renderToFile:V}=i({helpers:d({origin:`src`})}),H=p(),U=e=>!e?.trim().length,W=s(t?.templates,R),G=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await V(u.pages(n.file),n.name===`index`?z:W(n.name,n),{route:n,message:m()},{overwrite:U}):t===`pageLayout`&&await V(u.pages(n.file),L,{route:n},{overwrite:U})},K=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(a),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=H(n(r));for(let[e,t]of[[`client.ts`,v],[`server.ts`,b]])await f(u.libEntry(e),t,{pageEntries:r,nestedRoutes:i,lazyLoad:e===`client.ts`});await f(u.lib(`router.ts`),O,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[o(n)]}},async start(){for(let[e,n]of[[`env.d.ts`,x],[`unwrap.ts`,k],[`use.ts`,A],[`pageSamples/styles.module.css`,w],[`pageSamples/welcome.vue`,T],[`pageSamples/page.vue`,C],[`pageSamples/404.vue`,S],[`app/provider.vue`,_],...t?.tanstack?.query?[[`app/index.ts`,g],[`query.ts`,E]]:[[`app/index.ts`,h],[`query.ts`,`/** tanstack query disabled */`]]])await f(u.lib(e),n,{});for(let[e,t]of[[`pages/404.vue`,I],[`components/Link.vue`,M],[`app.vue`,j],[`router.ts`,B]])await V(u.src(e),t,{entryDir:c.entryDir},{overwrite:U});await V(u.src(`index.html`),F,{entryDir:c.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,N],[`server.ts`,P]])await V(u.entry(e),t,{},{overwrite:U})},async watch(e,t){(!t||t.kind===`create`)&&await G(e),await K(e)},async build(e){await G(e),await K(e)},async ssrBuild(){await f(u.lib(`query.ts`),t?.tanstack?.query?D:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),H=e({meta:{name:`Vue`,jsxImportSource:`vue`},dependencies(e){return{vue:d.devDependencies.vue,\"vue-router\":d.devDependencies[`vue-router`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{\"@tanstack/vue-query\":d.devDependencies[`@tanstack/vue-query`]}:{}}},factory:V});export{H as default};\n//# sourceMappingURL=index.js.map","import { join } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport {\n DEFAULT_APIBASE,\n type FolderConfig,\n type SourceFolder,\n} from \"@kosmojs/core\";\n\nexport { default as fetchGenerator } from \"@kosmojs/fetch-generator\";\nexport { default as honoGenerator } from \"@kosmojs/hono-generator\";\nexport { default as koaGenerator } from \"@kosmojs/koa-generator\";\nexport { default as mdxGenerator } from \"@kosmojs/mdx-generator\";\nexport { default as openapiGenerator } from \"@kosmojs/openapi-generator\";\nexport { default as reactGenerator } from \"@kosmojs/react-generator\";\nexport { default as solidGenerator } from \"@kosmojs/solid-generator\";\nexport { default as ssgGenerator } from \"@kosmojs/ssg-generator\";\nexport { default as ssrGenerator } from \"@kosmojs/ssr-generator\";\nexport { default as svelteGenerator } from \"@kosmojs/svelte-generator\";\nexport { default as typeboxGenerator } from \"@kosmojs/typebox-generator\";\nexport { default as vueGenerator } from \"@kosmojs/vue-generator\";\n\nexport const defineConfig: (config: FolderConfig) => SourceFolder[\"config\"] = (\n config,\n) => {\n const env = process.env.NODE_ENV || \"development\";\n const base = typeof config.base === \"string\" ? config.base : config.base[env];\n if (!base?.trim()) {\n throw new Error(\n styleText([\"red\"], \"ERROR: Invalid Config - no base provided\"),\n );\n }\n return {\n ...config,\n base: join(\"/\", base),\n apiBase: join(\"/\", config.apiBase || DEFAULT_APIBASE),\n };\n};\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgqCFC,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDFC,GAAE;;;;;;;EAOF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DFC,GAAE,CAAC,2BAA2B,CAAC,CAAC,EAAEC,GAAEC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,oBAAoB,GAAGC,EAAE,CAAC,EAAE,CAAC,aAAa,GAAGC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,kBAAkB,EAAE,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAM,IAAG,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC,GAAG,IAAI,WAAW,SAAS,IAAI,EAAE,CAAC,EAAE,OAAO,GAAG,EAAE,sBAAsB,QAAQ,GAAG,EAAE,SAAS,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,sBAAsB,SAAS,CAAC,OAAO,KAAK,OAAO,KAAKC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,sBAAsB,KAAK,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,oBAAoB,IAAK,GAAE,CAAC,EAAE,CAAC,kBAAkB,KAAK,UAAU,EAAE,iBAAiB,CAAC,EAAE,GAAG,EAAE,eAAe,IAAK,GAAE,CAAC,EAAE,CAAC,aAAa,KAAK,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,sBAAsB,KAAK,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO,WAAW,GAAG,EAAE,GAAG,EAAE,oBAAoB,IAAK,GAAE,CAAC,EAAE,CAAC,kBAAkB,KAAK,UAAU,EAAE,iBAAiB,CAAC,EAAE,GAAG,EAAE,eAAe,IAAK,GAAE,CAAC,EAAE,CAAC,aAAa,KAAK,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,GAAE,CAAC,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,kBAAkBR,EAAC,EAAE,CAAC,mBAAmB,EAAC,EAAE,CAAC,WAAWC,EAAC,EAAE,CAAC,WAAWC,EAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC,mBAAmB,KAAK,UAAU,CAAC,EAAE,kBAAkB,EAAE,SAAS,KAAK,UAAU,CAAC,GAAGC,GAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,UAAU,IAAI,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAEM,EAAE,CAAC,SAAS,WAAW,WAAW,aAAa,eAAe,iBAAiB,mBAAmB,qBAAqB,kBAAkB,oBAAoB,yBAAyB,2BAA2B,cAAc,gBAAgB,cAAc,gBAAgB,MAAM,QAAQ,OAAO,SAAS,MAAM,QAAQ,OAAO,SAAS,MAAM,QAAQ,aAAa,eAAe,kBAAkB,oBAAoB,kBAAkB,oBAAoB,eAAe,iBAAiB,cAAc,gBAAgB,oBAAoB,sBAAsB,mBAAmB,qBAAqB,uBAAuB,yBAAyB,mBAAmB,qBAAqB,kBAAkB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,qBAAqB,mBAAmB,qBAAqB,mBAAmB,qBAAqB,uBAAuB,yBAAyB,2BAA2B,6BAA6B,oBAAoB,sBAAsB,eAAe,iBAAiB,eAAe,iBAAiB,yBAAyB,2BAA2B,yBAAyB,2BAA2B,mBAAmB,qBAAqB,gBAAgB,kBAAkB,gBAAgB,kBAAkB,mBAAmB,qBAAqB,eAAe,iBAAiB,mBAAmB,qBAAqB,mBAAmB,qBAAqB,mBAAmB,qBAAqB,YAAY,cAAc,wBAAwB,0BAA0B,gBAAgB,kBAAkB,gBAAgB,kBAAkB,gBAAgB,kBAAkB,6BAA6B,+BAA+B,sBAAsB,wBAAwB,sBAAsB,wBAAwB,sBAAsB,wBAAwB,oBAAoB,sBAAsB,8BAA8B,gCAAgC,cAAc,gBAAgB,eAAe,iBAAiB,eAAe,iBAAiB,iBAAiB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,qBAAqB,mBAAmB,qBAAqB,gBAAgB,kBAAkB,sBAAsB,wBAAwB,iBAAiB,mBAAmB,mBAAmB,qBAAqB,aAAa,eAAe,uBAAuB,yBAAyB,cAAc,gBAAgB,wBAAwB,0BAA0B,cAAc,gBAAgB,iBAAiB,mBAAmB,8BAA8B,gCAAgC,QAAQ,SAAS,EAAMA,EAAE,SAAsBA,EAAE,WAA0BA,EAAE,eAAsCA,EAAE,mBAA+CA,EAAE,kBAAwCA,EAAE,yBAA8BA,EAAE,cAAgEA,EAAE,cAAoBA,EAAE,MAAgBA,EAAE,OAAkBA,EAAE,MAAgBA,EAAE,OAAkBA,EAAE,MAAgBA,EAAE,aAA4BA,EAAE,kBAA2DA,EAAE,kBAAqDA,EAAE,eAAmDA,EAAE,cAAyCA,EAAE,oBAAsDA,EAAE,mBAA4CA,EAAE,uBAAqDA,EAAE,mBAA4CA,EAAE,kBAA0CA,EAAE,kBAA0CA,EAAE,mBAA4CA,EAAE,mBAAoDA,EAAE,mBAAoDA,EAAE,uBAAoDA,EAAE,2BAA4DA,EAAE,oBAA2DA,EAAE,eAAiCA,EAAE,eAAiCA,EAAE,yBAA2CA,EAAE,yBAA2CA,EAAE,mBAAgDA,EAAE,gBAAiDA,EAAE,gBAAsDA,EAAE,mBAAuDA,EAAE,eAAyDA,EAAE,mBAA6EA,EAAE,mBAAiFA,EAAE,mBAAkDA,EAAE,YAAwCA,EAAE,wBAA8DA,EAAE,gBAA0DA,EAAE,gBAA+DA,EAAE,gBAA4CA,EAAE,6BAA0EA,EAAE,sBAAmDA,EAAE,sBAAwDA,EAAE,sBAAwDA,EAAE,oBAAiDA,EAAE,8BAA4EA,EAAE,cAAqCA,EAAE,eAAuCA,EAAE,eAAyDA,EAAE,iBAAkEA,EAAE,iBAAkEA,EAAE,mBAA4EA,EAAE,mBAAsDA,EAAE,mBAA8CA,EAAE,gBAA8CA,EAAE,sBAAwEA,EAAE,iBAAsDA,EAAE,mBAA0DA,EAAE,aAAmDA,EAAE,uBAAsEA,EAAE,cAA4DA,EAAE,wBAAkEA,EAAE,cAA2DA,EAAE,iBAA2CA,EAAE,8BAAqEA,EAAE,QAAiwN,IAAA,GAAEE,EAAE,CAAC,KAAK,CAAC,KAAK,UAAU,aAAa,CAAC,CAAC,EAAE,aAAa,CAAC,QAAQZ,GAAE,gBAAgB,OAAO,EAAE,QAAQK,EAAC,CAAC,ECh2C9/c,EAAE,CAAC,KAAK,SAAS,QAAQ,CAAC,EAAE,KAAK,yBAAyB,QAAQ,SAAS,OAAO,WAAW,QAAQ,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,mBAAmB,QAAQ,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,uBAAuB,KAAK,wDAAwD,EAAE,aAAa,CAAC,gBAAgB,cAAc,eAAe,cAAc,qBAAqB,QAAQ,EAAE,gBAAgB,CAAC,sBAAsB,WAAW,iBAAiB,SAAS,IAAI,UAAU,aAAa,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,QAAQ,IAAI,EAAE,KAAK,OAAO,EAAE,OAAO,WAAW,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,OAAO,EAAE,QAAQ,GAAG,EAAE,OAAO,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,OAAO,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,GAAG,EAAE,OAAO,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,OAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAEQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAM,CAAC,IAAI,EAAE,CAAC,kDAAkD,kDAAkD,qDAAqD,mDAAmD,wDAAwD,mDAAmD,iDAAiD,mDAAmD,iDAAiD,yDAAyD,EAAE,OAAO,EAAE,KAAK,MAAM,KAAK,OAAO,EAAE,EAAE,MAAM,EAAE,EAAEC,GAAE;;;;;;;EAOlzE,GAAE;;;;;;;;;;;;EAYFC,GAAE;;;EAGFC,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCF,GAAE;;;;;;;;;;;;;;;;;;EAkBF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+FF,EAAE;;;;;EAKFC,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqIF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgEF,GAAE;;;;;;;;;;;;;;;EAeF,GAAE;;;;;;;;;;;;;;;;;;;;;;;EAuBF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuJF,GAAE;;;;;;;EAOF,GAAE;;;;;;;;;;;;;;;EAeFC,GAAE;;;;;;;;;EASF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BF,GAAE;;;;;;;;;;;;EAYF,GAAE;;;;;;;EAOF,GAAE;;;EAGFC,GAAE;;;;;;;;;;;;;;;EAeFC,GAAE;;;;;;;EAOFC,GAAE;;;;;;;;;;;;;;;;;;;EAmBF,GAAEC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,oBAAoB,GAAGC,EAAE,CAAC,EAAE,CAAC,aAAa,GAAGC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,GAAGC,EAAE,CAAC,EAAE,SAAS,CAAC,aAAa,EAAC,CAAC,CAAC,EAAE,CAAC,aAAa,GAAGD,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAE,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAEE,EAAE,GAAG,UAAUP,EAAC,EAAE,EAAE,KAAM,IAAG,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,YAAY,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,QAAQC,GAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,cAAc,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,KAAM,IAAG,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAKO,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,aAAa,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAEC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,YAAYZ,EAAC,EAAE,CAAC,YAAY,EAAC,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,SAAS,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,WAAW,EAAE,GAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,CAACa,GAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,EAAC,EAAE,CAAC,SAAS,EAAC,EAAE,CAAC,gCAAgC,EAAC,EAAE,CAAC,0BAA0B,EAAC,EAAE,CAAC,uBAAuB,EAAC,EAAE,CAAC,sBAAsBZ,EAAC,EAAE,CAAC,mBAAmBF,EAAC,EAAE,GAAG,GAAG,UAAU,MAAM,CAAC,CAAC,eAAe,EAAC,EAAE,CAAC,WAAW,EAAC,CAAC,EAAE,CAAC,CAAC,eAAeD,EAAC,EAAE,CAAC,WAAW,gCAAgC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,gBAAgB,EAAC,EAAE,CAAC,sBAAsB,EAAC,EAAE,CAAC,UAAUI,EAAC,EAAE,CAAC,YAAYG,EAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,SAASS,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,YAAY,EAAE,GAAE,CAAC,SAASA,EAAE,QAAQ,EAAE,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,YAAY,EAAC,EAAE,CAAC,YAAY,EAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,WAAW,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,UAAU,EAAE,GAAG,UAAU,MAAM,GAAE,iCAAiC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAEC,EAAE,CAAC,KAAK,CAAC,KAAK,MAAM,gBAAgB,KAAK,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,IAAI,aAAa,EAAE,gBAAgB,cAAc,iBAAiB,EAAE,gBAAgB,kBAAkB,GAAG,GAAG,UAAU,MAAM,CAAC,sBAAsB,EAAE,gBAAgB,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAC,CAAC,EC5yBnkE,GACX,GACG,CACH,IAAM,EAAA,QAAA,IAAA,UAA8B,cAC9B,EAAO,OAAO,EAAO,MAAS,SAAW,EAAO,KAAO,EAAO,KAAK,GACzE,GAAI,CAAC,GAAM,KAAK,EACd,MAAU,MACR,EAAU,CAAC,KAAK,EAAG,0CAA0C,CAC/D,EAEF,MAAO,CACL,GAAG,EACH,KAAM,EAAK,IAAK,CAAI,EACpB,QAAS,EAAK,IAAK,EAAO,SAAW,CAAe,CACtD,CACF"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["s","c","l","u","d","f","p","t","n","r","o","i","a","e","d","f","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","n","r","a","u","l","s","i","e","o","t","d","f","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","n","r","a","u","l","s","i","e","o","j","t","u","d","f","o","l","c","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","j","M","N","P","F","I","L","R","t","n","r","s","a","i","e","d","f","s","c","o","p","u","i","m","t","n","r","e","d","f","u","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","j","M","N","P","F","I","L","R","t","r","i","l","s","a","n","c","z","e","d","f","p","u","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","j","M","N","P","F","I","L","R","z","t","r","i","l","s","a","n","o","c","e","g","t","r","p","o","s","m","i","c","f","h","n","a","_","l","d","u","e","p","m","h","g","_","v","y","b","x","t","r","i","f","a","o","d","n","l","s","u","c","e","l","u","d","f","p","m","h","g","_","v","y","b","x","S","C","w","T","E","D","O","k","A","j","M","N","P","F","I","L","t","n","r","c","o","i","a","s","e","a","o","c","l","d","f","t","n","r","i","p","m","e","u","m","h","_","v","S","j","R","z","B","t","r","i","l","s","a","n","o","c","e"],"sources":["../../../generators/fetch-generator/pkg/index.js","../../../generators/hono-generator/pkg/index.js","../../../generators/koa-generator/pkg/index.js","../../../generators/mdx-generator/pkg/index.js","../../../generators/openapi-generator/pkg/index.js","../../../generators/react-generator/pkg/index.js","../../../generators/solid-generator/pkg/index.js","../../../generators/ssg-generator/pkg/index.js","../../../generators/ssr-generator/pkg/index.js","../../../generators/svelte-generator/pkg/index.js","../../../generators/typebox-generator/pkg/index.js","../../../generators/vue-generator/pkg/index.js","../src/index.ts"],"sourcesContent":["import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderFactory as r,sortRoutes as i}from\"@kosmojs/lib\";import{defaults as a}from\"@kosmojs/core\";import{routeRenderHelpers as o}from\"@kosmojs/core/generators\";var s={type:`module`,private:!0,name:`@kosmojs/fetch-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/fetch-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`},devDependencies:{\"path-to-regexp\":`^8.4.2`}},c=`import { compile } from \"path-to-regexp\";\n\nimport {\n type ApiRouteSerialized,\n stringifySearchParams,\n type ValidationTarget,\n} from \"@kosmojs/core\";\nimport type { HTTPMethod } from \"@kosmojs/core/api\";\nimport { createHost, type HostOpt, join } from \"@kosmojs/core/fetch\";\n\nexport * from \"./transport\";\n\nexport const fetchHelpers = <ParamsT extends readonly unknown[]>(\n basePath: string,\n route: ApiRouteSerialized,\n) => {\n const toPath = compile(route.pathPattern);\n\n const maybeNumber = (val: unknown) => {\n if (val === undefined || val === null) {\n return val;\n }\n const n = Number(val);\n return Number.isFinite(n) ? n : val;\n };\n\n const paramsMapper = (params: ParamsT, opt?: { coerceNumbers?: boolean }) => {\n return route.params.reduce<Record<string, unknown>>((map, name, i) => {\n const coerceNumbers = opt?.coerceNumbers\n ? route.numericProperties.params.includes(name)\n : false;\n if (Array.isArray(params[i])) {\n map[name] = coerceNumbers\n ? params[i].map((v) => maybeNumber(v))\n : params[i].map(String);\n } else if (params[i] !== undefined) {\n map[name] = coerceNumbers ? maybeNumber(params[i]) : String(params[i]);\n }\n return map;\n }, {});\n };\n\n const parametrize = (params: ParamsT) => {\n try {\n return toPath(paramsMapper(params) as never);\n } catch (error) {\n console.error(\\`❗ERROR: Failed building path for \\${route.name}\\`);\n throw error;\n }\n };\n\n const base = (params: ParamsT, query?: Record<string, unknown>) => {\n const path = join(\"/\", parametrize(params));\n return query ? [path, stringifySearchParams(query)].join(\"?\") : path;\n };\n\n const path = (params: ParamsT, query?: Record<string, unknown>) => {\n return join(basePath, base(params, query));\n };\n\n const href = (\n host: HostOpt,\n params: ParamsT,\n query?: Record<string, unknown>,\n ) => {\n return createHost(host) + path(params, query);\n };\n\n const payloadResolver = <T>(\n payload: Record<ValidationTarget, T> | undefined,\n target: ValidationTarget,\n method: HTTPMethod,\n ) => {\n const data = payload?.[target];\n\n if (target === \"query\") {\n return Object.fromEntries(\n Object.entries({ ...data }).map(([k, v]) => {\n return [\n k,\n route.numericProperties.query[method]?.includes(k)\n ? Array.isArray(v)\n ? v.map((v) => maybeNumber(v))\n : maybeNumber(v)\n : v,\n ];\n }),\n );\n }\n\n if (data instanceof FormData) {\n return [...data].reduce<\n Record<string, FormDataEntryValue | Array<FormDataEntryValue>>\n >((map, [key, val]) => {\n if (key in map) {\n map[key] = [map[key]].flat().concat(val);\n } else {\n map[key] = val;\n }\n return map;\n }, {}) as T;\n }\n\n return data;\n };\n\n return {\n paramsMapper,\n parametrize,\n base,\n path,\n href,\n payloadResolver,\n };\n};\n`,l=`export const transport = undefined;\n`,u=`{{#each routes}}\nimport {{id}} from \"{{ createImport 'libApi' name 'fetch' }}\";\n{{/each}}\n\nexport { ValidationError } from \"@kosmojs/core/errors\";\n\nexport type ResponseT = {\n{{#each routes}}\n \"{{name}}\": import(\"{{ createImport 'libApi' name 'fetch' }}\").ResponseT;\n{{/each}}\n}\n\nexport default {\n{{#each routes}} \"{{name}}\": {{id}},\n{{#each alias }} \"{{this}}\": {{../id}},\n{{/each}}\n{{/each}}\n}\n`,d=`import fetchFactory, { join } from \"@kosmojs/core/fetch\";\n\nimport { base, apiBase, apiRouteMap } from \"{{ createImport 'libCore' }}\";\nimport { transport, fetchHelpers } from \"{{ createImport 'lib' '@fetch' }}\";\n\nimport {\n type MaybeWrapped,\n unwrap,\n} from \"{{ createImport 'lib' 'unwrap' }}\";\n\n{{#each validationTypes}}\nimport type { {{id}} } from \"./types\";\n{{/each}}\n\nimport { validationSchemas } from \"./schemas\";\n\nexport { ValidationError } from \"@kosmojs/core/errors\";\n\nexport { validationSchemas };\n\nexport type ParamsT = [\n {{serializeParamsTupleElements route}}\n];\n\n{{#each payloadTypes}}\nexport type {{name}} = {\n {{#each types}}{{method}}: {{id}};\n {{/each}}\n}\n{{/each}}\n\nexport type ResponseT = {\n {{#each responseTypes}}\n {{method}}: {{#each types}}{{#unless @first}}|{{/unless}} {{id}}{{/each}};\n {{/each}}\n}\n\nconst {\n paramsMapper,\n parametrize,\n payloadResolver,\n path,\n href,\n} = fetchHelpers<[{{serializeParamsTupleElements route}}]>(\n apiBase,\n apiRouteMap[\"{{route.name}}\"],\n);\n\nconst fetchApi = fetchFactory(\n join(base, apiBase),\n { transport },\n);\n\n{{#each routeMethods}}\nexport const {{method}} = (\n _params{{#if ../route.optionalParams}}?{{/if}}: MaybeWrapped<ParamsT>,\n _payload?: {\n {{#each payloadTypes}}\n {{target}}: {{id}} extends { {{method}}: unknown }\n ? MaybeWrapped<{{id}}[\"{{method}}\"]>\n : unknown,\n {{/each}}\n },\n opt?: {\n unwrap?: <T>(data: MaybeWrapped<T>) => T;\n },\n): Promise<\n {{#if responseType}}\n ResponseT[\"{{method}}\"]\n {{else}}\n unknown\n {{/if}}\n> => {\n const [params, payload] = [_params, _payload].map((data) => {\n return typeof opt?.unwrap === \"function\" ? opt.unwrap(data) : unwrap(data);\n })\n // validate only on client, skip double validation in SSR mode\n if (!import.meta.env.SSR) {\n if (validationSchemas.params) {\n validationSchemas.params.validate(\n paramsMapper(params as never, { coerceNumbers: true }),\n );\n }\n {{#each payloadTypes}}\n if (validationSchemas.{{target}}?.{{method}}) {\n validationSchemas.{{target}}.{{method}}.validate(\n payloadResolver(payload as never, \"{{target}}\", \"{{../method}}\"),\n );\n }\n {{/each}}\n }\n return fetchApi.{{method}}(parametrize(params as never), payload as never);\n};\n{{/each}}\n\nexport default {\n {{#each routeMethods}}\n {{method}},\n {{/each}}\n path,\n href,\n validationSchemas,\n};\n`,f=`export type MaybeWrapped<T> = T;\nexport const unwrap = <T>(data: T) => data;\n`,p=t(e=>{let{createPath:t,createImportHelpers:s}=n(e),{renderToFile:p}=r({helpers:{...s({origin:`lib`}),...o()}}),m=async(e,n)=>{let r=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]).sort(i);await p(t.lib(`fetch.ts`),u,{routes:r});for(let{kind:e,entry:r}of n)if(e===`apiRoute`){let e=[];for(let t of r.validationDefinitions)if(t.target===`response`)for(let{id:n,body:r,resolvedType:i}of t.variants)r&&e.push({id:n,target:t.target,method:t.method,resolvedType:i});else{let{id:n,resolvedType:r}=t.schema;e.push({id:n,target:t.target,method:t.method,resolvedType:r})}let n=r.methods.map(t=>({method:t,payloadTypes:e.filter(e=>e.method===t&&![`headers`,`cookies`,`response`].includes(e.target)),responseType:e.find(e=>e.target===`response`&&e.method===t)})),i=Object.values(e.reduce((e,{id:t,target:n,method:r,resolvedType:i})=>(n===`response`&&(e[r]||(e[r]={method:r,types:[]}),e[r].types.push({id:t,target:n,method:r,resolvedType:i})),e),{}));await p(t.libApi(r.name,`fetch.ts`),d,{route:r,validationTypes:e,routeMethods:n,responseTypes:i})}};return{async start(){for(let[e,n]of[[`unwrap.ts`,f],[`@fetch/transport.ts`,l],[`@fetch/index.ts`,c]])await p(t.lib(e),n,{})},async watch(e,t){await m(e,t?e.filter(({kind:e,entry:n})=>t.kind===`update`&&e===`apiRoute`&&n.fileFullpath===t.file):e)},async build(e){await m(e,e)},async ssrBuild(){for(let[e,n]of[[`@fetch/transport.ts`,`export { transport } from \"${a.libPrefix}/@ssr/fetch\";`]])await p(t.lib(e),n,{})}}}),m=e({meta:{name:`Fetch`,slot:`fetch`},dependencies:{\"path-to-regexp\":s.devDependencies[`path-to-regexp`]},factory:p});export{m as default};\n//# sourceMappingURL=index.js.map","import{createHonoPattern as e,defineGenerator as t,defineGeneratorFactory as n,pathResolver as r,pathTokensFactory as i,renderFactory as a,sortRoutes as o}from\"@kosmojs/lib\";import{join as s}from\"node:path\";import c from\"crc/crc32\";import{createTemplateResolver as l}from\"@kosmojs/core\";import{routeRenderHelpers as u}from\"@kosmojs/core/generators\";var d={type:`module`,private:!0,name:`@kosmojs/hono-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/hono-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,crc:`^4.3.2`},devDependencies:{\"@hono/node-server\":`^2.1.0`,hono:`^4.13.1`,\"path-to-regexp\":`^8.4.2`,vite:`^8.2.1`}},f=`import { Hono } from \"hono\";\n\nimport type { AppFactory } from \"@kosmojs/core/api\";\n\nimport type { DefaultBindings, DefaultVariables } from \"../api\";\n\nexport type AppEnv = {\n Variables: DefaultVariables;\n Bindings: DefaultBindings;\n};\n\nexport type App = Hono<AppEnv>;\n\nexport type AppOptions = ConstructorParameters<typeof Hono<AppEnv>>[0];\n\nexport const appFactory: AppFactory<App, AppOptions> = (factory) => {\n const createApp = (options?: AppOptions) => {\n return new Hono({ strict: false, ...options });\n };\n return factory({ createApp });\n};\n`,p=`import type { DevSetup } from \"@kosmojs/core/api\";\n\nexport const devSetup = (setup: DevSetup) => setup;\n`,m=`import type { Context } from \"hono\";\n\nimport type { AppEnv } from \"./app\";\n\ntype ErrorHandler = (\n error: any,\n ctx: Context<AppEnv>,\n) => Promise<Response> | Response;\n\nexport type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;\n\nexport const errorHandlerFactory: ErrorHandlerFactory = (handler) => {\n return handler;\n};\n`,h=`import type { Context } from \"hono\";\n\nimport {\n parseCookies,\n parseSearchParams,\n type RequestBodyTarget,\n type RequestMetadataTarget,\n} from \"@kosmojs/core\";\n\nexport type BodyparserOptions = {\n json: never;\n form: { all?: boolean; dot?: boolean };\n raw: { as?: \"text\" | \"arrayBuffer\" | \"blob\" | \"formData\" };\n};\n\nexport const metaparsers: {\n [T in RequestMetadataTarget]: (ctx: Context) => unknown;\n} = {\n query(ctx) {\n return parseSearchParams(ctx.req.url);\n },\n\n headers(ctx) {\n return Object.fromEntries(ctx.req.raw.headers);\n },\n\n cookies(ctx) {\n return parseCookies(Object.fromEntries(ctx.req.raw.headers));\n },\n};\n\nexport const bodyparsers: {\n [T in RequestBodyTarget]: (\n ctx: Context,\n opt?: BodyparserOptions[T],\n ) => Promise<unknown>;\n} = {\n json(ctx) {\n return ctx.req.json();\n },\n\n form(ctx, opt) {\n return ctx.req.parseBody(opt);\n },\n\n raw(ctx, { as = \"text\" } = {}) {\n return ctx.req[as]();\n },\n};\n`,g=`import type { MiddlewareHandler } from \"hono\";\nimport type { Router } from \"hono/router\";\nimport { RegExpRouter } from \"hono/router/reg-exp-router\";\nimport { SmartRouter } from \"hono/router/smart-router\";\nimport { TrieRouter } from \"hono/router/trie-router\";\nimport { match } from \"path-to-regexp\";\n\nimport type {\n RequestBodyTarget,\n RequestMetadataTarget,\n RequestValidationTarget,\n ValidationErrorEntry,\n} from \"@kosmojs/core\";\nimport {\n type CreateRouteMiddleware,\n createRoutes,\n type HTTPMethod,\n type RouterFactory,\n StateKey,\n} from \"@kosmojs/core/api\";\nimport { ValidationError } from \"@kosmojs/core/errors\";\n\nimport {\n type DefaultBindings,\n type DefaultVariables,\n type ParameterizedContext,\n type ParameterizedMiddleware,\n use,\n} from \"../api\";\nimport { type BodyparserOptions, bodyparsers, metaparsers } from \"./parsers\";\nimport { routeSources } from \"./routes\";\n\nimport globalMiddleware from \"{{ createImport 'api' 'use' }}\";\nimport { apiRouteMap } from \"{{ createImport 'libCore' }}\";\n\n/**\n * Create route-level middleware stack that handles:\n * 1. Context extension - adds \\`ctx.bodyparser\\` (lazy, cached) and \\`ctx.validated\\` accessors\n * 2. Params validation - normalizes and validates URL params (including splat/numeric params)\n * 3. Request validation - validates query, headers, cookies, and body against schemas\n * 4. Response validation - validates outgoing response against defined variants\n *\n * Middleware are assigned named slots (e.g. \"validate:params\", \"validate:json\")\n * so they can be replaced by user-defined middleware in the stack.\n *\n * All validation errors are thrown as \\`ValidationError\\` instances,\n * caught and formatted by the global error handler middleware upstream.\n * */\nexport const createRouteMiddleware: CreateRouteMiddleware<\n ParameterizedMiddleware\n> = ({ name, pathPattern, validationSchemas }) => {\n const route = apiRouteMap[name];\n\n if (!route) {\n throw new Error(\\`createRouteMiddleware: \\${name} route does not exists\\`);\n }\n\n const { params, numericProperties } = route;\n\n const pathMatcher = match(pathPattern);\n\n const matchPath = (path: string) => {\n try {\n return pathMatcher(path);\n } catch (_e) {\n return undefined;\n }\n };\n\n const maybeNumber = (val: unknown) => {\n if (val === undefined || val === null) {\n return val;\n }\n const n = Number(val);\n return Number.isFinite(n) ? n : val;\n };\n\n const validationMiddleware = [\n /**\n * Extends Hono context with:\n *\n * - \\`ctx.metaparser[target]()\\` - lazy, cached meta parsers.\n * Each parser (query, headers, cookies) runs at most once per request;\n * subsequent calls return the cached result.\n *\n * - \\`ctx.bodyparser[target](opts?)\\` - lazy, cached body parsers.\n * Each parser (json, form, raw) runs at most once per request;\n * subsequent calls return the cached result.\n * This allows both user middleware/handlers and validators\n * to call the same parser without re-consuming the request stream.\n *\n * - \\`ctx.validated\\` - getter that returns all validated data collected so far\n * (params, query, headers, cookies, json etc.) as a plain object.\n *\n * Cache is stored on \\`ctx[StateKey]\\` (a Symbol-keyed Map) to keep it\n * hidden from public API surface and serialization.\n * */\n use(\n function useExtendContext(ctx, next) {\n if (!ctx[StateKey]) {\n // initialize per-request cache with empty params\n // (later populated by useValidateParams)\n ctx[StateKey] = new Map([[\"params\", {}]]);\n\n Object.defineProperty(ctx, \"metaparser\", {\n value: Object.entries(metaparsers).reduce<{\n [T in RequestMetadataTarget]?: () => unknown;\n }>((map, entry) => {\n const [target, parser] = entry as [\n RequestMetadataTarget,\n Function,\n ];\n map[target] = () => {\n if (!ctx[StateKey].has(target)) {\n ctx[StateKey].set(\n target,\n target === \"query\"\n ? Object.fromEntries(\n Object.entries(parser(ctx)).map(([k, v]) => [\n k,\n numericProperties.query[ctx.req.method]?.includes(k)\n ? Array.isArray(v)\n ? v.map((e) => maybeNumber(e))\n : maybeNumber(v)\n : v,\n ]),\n )\n : parser(ctx),\n );\n }\n return ctx[StateKey].get(target);\n };\n return map;\n }, {}),\n enumerable: true,\n });\n\n Object.defineProperty(ctx, \"bodyparser\", {\n value: Object.entries(bodyparsers).reduce<{\n [T in RequestBodyTarget]?: (\n opt?: BodyparserOptions[T],\n ) => Promise<unknown>;\n }>((map, entry) => {\n const [target, parser] = entry as [RequestBodyTarget, Function];\n map[target] = async (opt) => {\n if (!ctx[StateKey].has(target)) {\n ctx[StateKey].set(target, await parser(ctx, opt as never));\n }\n return ctx[StateKey].get(target);\n };\n return map;\n }, {}),\n enumerable: true,\n });\n\n Object.defineProperty(ctx, \"validated\", {\n get() {\n return Object.fromEntries(ctx[StateKey]);\n },\n enumerable: true,\n });\n }\n return next();\n },\n { slot: \"@extendContext\" },\n ) as never,\n\n /**\n * Normalize and validate URL params:\n * - Splat params (e.g. \\`/files{/*path}\\`) are split into arrays by \"/\"\n * - Numeric params are cast to Number (or array of Numbers for splat params)\n * - Non-splat, non-numeric params pass through as strings\n *\n * Validated params are stored in the cache so \\`ctx.validated.params\\`\n * reflects the normalized (and validated) values.\n * */\n use(\n function useValidateParams(ctx, next) {\n const matched = matchPath(ctx.req.path);\n const normalizedParams = params.reduce(\n (map: Record<string, unknown>, name) => {\n const value = matched ? matched.params[name] : undefined;\n if (Array.isArray(value)) {\n map[name] = numericProperties.params.includes(name)\n ? value.map((e) => maybeNumber(e))\n : value;\n } else if (value) {\n map[name] = numericProperties.params.includes(name)\n ? maybeNumber(value)\n : value;\n }\n return map;\n },\n {},\n );\n validationSchemas.params?.validate(normalizedParams);\n ctx[StateKey].set(\"params\", normalizedParams);\n return next();\n },\n { slot: \"validate:params\" },\n ) as never,\n\n /**\n * Response validation - runs AFTER the handler (post-\\`next()\\`).\n *\n * Each response schema defines one or more variants, each with:\n * - expected status code\n * - optional content-type\n * - optional body schema\n *\n * All variants are checked; if at least one passes, validation succeeds.\n * If none pass, a ValidationError is thrown with collected errors from all variants.\n *\n * Activation rules:\n * - In dev/test mode: runs unless \\`runtimeValidation\\` is explicitly \\`false\\`\n * - In production: runs only if \\`runtimeValidation\\` is explicitly \\`true\\`\n *\n * Only attached to HTTP methods that have response schemas defined.\n * */\n use(\n async function useValidateResponse(ctx, next) {\n const variants = validationSchemas.response?.[ctx.req.method] || [];\n\n if (!Array.isArray(variants) || !variants.length) {\n return next();\n }\n\n // options are same for all variants\n const { runtimeValidation, customErrors } = variants[0];\n\n if (KOSMO_PRODUCTION_BUILD) {\n // skip if undefined or explicitly set to false\n if (runtimeValidation === undefined || runtimeValidation === false) {\n return next();\n }\n } else {\n // skip only if explicitly set to false\n if (runtimeValidation === false) {\n return next();\n }\n }\n\n // run all downstream middleware (including the route handler)\n await next();\n\n const response: {\n status: number;\n contentType: string | null;\n body?: unknown;\n } = {\n status: ctx.res.status,\n contentType: ctx.res.headers.get(\"Content-Type\"),\n };\n\n // Validate body only for JSON variants\n if (variants.some((e) => e.contentType?.includes(\"json\"))) {\n const cloned = ctx.res.clone();\n response.body = await cloned.json();\n }\n\n /**\n * Returns an array of validator functions for a single response variant.\n * Each validator checks one aspect (status, content-type, body)\n * and returns an error entry or undefined if the check passes.\n * */\n const variantValidators: (\n v: (typeof variants)[number],\n ) => Array<(i: number) => ValidationErrorEntry | undefined> = (\n schema,\n ) => {\n return [\n (i) => {\n return schema.status === response.status\n ? undefined\n : {\n keyword: \"Status\",\n path: \\`Variant #\\${i}\\`,\n message: \\`expected: \\${schema.status}; actual: \\${ctx.status}\\`,\n };\n },\n (i) => {\n if (\n !schema.contentType ||\n schema.contentType === response.contentType\n ) {\n return undefined;\n }\n return {\n keyword: \"ContentType\",\n path: \\`Variant #\\${i}\\`,\n message: \\`expected: \\${schema.contentType}; actual: \\${response.contentType}\\`,\n };\n },\n (i) => {\n if (!schema.check || \"body\" in response === false) {\n // no body schema or contentType is not JSON\n return;\n }\n return schema.check(response.body)\n ? undefined\n : {\n keyword: \"Body\",\n path: \\`Variant #\\${i}\\`,\n message: schema.errorMessage(response.body),\n };\n },\n ];\n };\n\n // collect errors across all variants; exit early if any variant passes\n const errors: Array<ValidationErrorEntry> = [];\n\n for (const [i, variant] of variants.entries()) {\n const variantErrors = variantValidators(variant).flatMap(\n (validator) => {\n const error = validator(i);\n return error ? [error] : [];\n },\n );\n if (!variantErrors.length) {\n // variant fully matched - response is valid\n return;\n }\n errors.push(...variantErrors);\n }\n\n const errorMessage = \\`The response did not match any of the expected formats\\`;\n const errorSummary = \\`\\${variants.length} variants checked, none valid\\`;\n\n // no variant passed validation\n throw new ValidationError([\n \"response\",\n {\n errors,\n errorMessage: customErrors?.error || errorMessage,\n errorSummary,\n route: name,\n data: response,\n },\n ]);\n },\n {\n slot: \"validate:response\",\n on: Object.keys(validationSchemas.response || {}) as Array<HTTPMethod>,\n },\n ) as never,\n ];\n\n /**\n * Request validation - dynamically creates one middleware per target\n * (query, headers, cookies, json, form, multipart, raw).\n *\n * Each middleware:\n * 1. Checks if a schema exists for the current HTTP method\n * 2. Skips if \\`runtimeValidation\\` is explicitly disabled\n * 3. Loads data via the appropriate source (ctx.query, ctx.headers, or ctx.bodyparser)\n * 4. Validates via \\`schema.validate()\\` which throws on failure\n *\n * Body targets (json, form, raw) go through \\`ctx.bodyparser[target]()\\`,\n * benefiting from the lazy parsing and caching set up by slot:extendContext middleware.\n *\n * All request validators are active on any HTTP method that has at least one\n * schema defined across any target - this is intentionally broad to avoid\n * silently skipping validation when methods overlap.\n * */\n const requestTargets: Record<\n RequestValidationTarget,\n (\n ctx: ParameterizedContext<\n Record<string, string>,\n DefaultVariables,\n DefaultBindings\n >,\n ) => Promise<unknown>\n > = {\n query: async (ctx) => ctx.metaparser.query(),\n headers: async (ctx) => ctx.metaparser.headers(),\n cookies: async (ctx) => ctx.metaparser.cookies(),\n json: async (ctx) => ctx.bodyparser.json(),\n form: async (ctx) => ctx.bodyparser.form(),\n raw: async (ctx) => ctx.bodyparser.raw(),\n };\n\n const requestEntries = Object.entries(requestTargets) as Array<\n [RequestValidationTarget, (typeof requestTargets)[RequestValidationTarget]]\n >;\n\n for (const [target, loadData] of requestEntries) {\n validationMiddleware.push(\n use(\n async (ctx, next) => {\n const schema = {\n ...validationSchemas[target]?.[ctx.req.method],\n };\n if (schema.validate && schema.runtimeValidation !== false) {\n schema.validate(await loadData(ctx as never));\n }\n return next();\n },\n {\n slot: \\`validate:\\${target}\\`,\n // duplicates not an issue here\n on: requestEntries.flatMap(([target]) => {\n return Object.keys(\n validationSchemas[target] || {},\n ) as Array<HTTPMethod>;\n }),\n },\n ) as never,\n );\n }\n\n return validationMiddleware;\n};\n\nexport const routes = createRoutes<ParameterizedMiddleware, MiddlewareHandler>(\n routeSources,\n {\n globalMiddleware: globalMiddleware as never,\n createRouteMiddleware,\n },\n);\n\nexport const routerFactory: RouterFactory<Router<never>, never> = (factory) => {\n const createRouter = () => {\n return new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()],\n }) as Router<never>;\n };\n return factory({ createRouter });\n};\n`,_=`import { join } from \"node:path\";\n\nimport type { RouteSource } from \"@kosmojs/core/api\";\n\nimport { base, apiBase } from \"{{ createImport 'libCore' }}\";\n\n{{#each routes}}\nimport {{id}} from \"{{ createImport 'api' file }}\";\nimport { validationSchemas as {{id}}_schemas } from \"{{ createImport 'libApi' name 'schemas' }}\";\n{{/each}}\n\n{{#each cascadingMiddleware}}\nimport {{id}}, { type UseT as UseT{{id}} } from \"{{ createImport 'api' file }}\";\n{{/each}}\n\ntype Override<A, B> = Omit<A, keyof B> & B;\n\nexport type RouteMap = {\n{{#each routes}}\n \"{{name}}\": {\n paramsDefaults: {{paramsDefaults .}},\n paramsMappings: {{paramsMappings .}},\n cascadingState: {{cascadingState .}},\n },\n{{/each}}\n}\n\nexport const routeSources: Array<RouteSource<never>> = [\n {{#each routes}}\n {\n name: \"{{name}}\",\n {{#if fullpath}}\n path: \"{{fullpath}}\",\n pathPattern: \"{{fullpath}}\",\n {{else}}\n path: join(base, apiBase, \"{{path}}\"),\n pathPattern: join(base, apiBase, \"{{pathPattern}}\"),\n {{/if}}\n file: \"{{file}}\",\n cascadingMiddleware: [ {{#each cascadingMiddleware}}{{id}}, {{/each}}].flat() as Array<never>,\n definitionItems: {{id}} as never,\n validationSchemas: {{id}}_schemas,\n },\n {{/each}}\n];\n`,v=`import { chmod, unlink } from \"node:fs/promises\";\nimport { parseArgs, styleText } from \"node:util\";\n\nimport { createAdaptorServer } from \"@hono/node-server\";\n\nimport type { ServerFactory } from \"@kosmojs/core/api\";\n\nimport type { App } from \"./app\";\n\nexport const serverFactory: ServerFactory<App> = (factory) => {\n const { values } = parseArgs({\n options: {\n port: {\n type: \"string\",\n short: \"p\",\n },\n sock: {\n type: \"string\",\n short: \"s\",\n },\n },\n });\n\n const getListenHandles = async () => {\n const { port, sock } = { ...values };\n\n if (![port, sock].some(Boolean)) {\n console.error(\"Please provide either -p/--port number or -s/--sock path\");\n process.exit(1);\n }\n\n if (sock) {\n await unlink(sock).catch((error) => {\n if (error.code === \"ENOENT\") {\n return;\n }\n console.error(error.message);\n process.exit(1);\n });\n }\n\n return { port, sock };\n };\n\n const onListen = async () => {\n const { port, sock } = await getListenHandles();\n if (sock) {\n // Make Unix socket world-writable so other processes (e.g. a reverse proxy)\n // can connect without permission issues.\n await chmod(sock, 0o777);\n }\n console.log(\n \\`\\\\n ✨ Server Started \\${styleText([\"dim\"], \"[ %s ]\")}\\`,\n sock ? \\`sock: \\${sock}\\` : \\`port: \\${port}\\`,\n );\n };\n\n return factory({\n async createServer(app) {\n const { port, sock } = await getListenHandles();\n\n if (typeof Bun !== \"undefined\") {\n const server = Bun.serve(\n sock\n ? { unix: sock, fetch: app.fetch }\n : { port: Number(port), fetch: app.fetch },\n );\n await onListen();\n return server as never;\n }\n\n if (typeof Deno !== \"undefined\") {\n const server = sock\n ? Deno.serve({ path: sock, onListen }, app.fetch)\n : Deno.serve({ port: Number(port), onListen }, app.fetch);\n return server as never;\n }\n\n const server = createAdaptorServer(app);\n server.listen(sock || port, onListen);\n\n return server as never;\n },\n getListenHandles,\n onListen,\n });\n};\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\"💥 UNHANDLED REJECTION - This is likely caused by:\");\n console.error(\" - Middleware not awaiting next()\");\n console.error(\" - Middleware not returning next()\");\n console.error(\"\");\n console.error(\"Reason:\", reason);\n console.error(\"\");\n // In development, crash hard\n if (process.env.NODE_ENV === \"development\") {\n process.exit(1);\n }\n});\n`,y=`import type { Context, Next } from \"hono\";\n\nimport type { ValidationDefmap, ValidationOptmap } from \"@kosmojs/core\";\nimport {\n use as createUse,\n type ExtendContext,\n type HandlerDefinition,\n type HTTPMethod,\n type MiddlewareDefinition,\n type RouteDefinitionItem,\n type UseOptions,\n} from \"@kosmojs/core/api\";\n\nimport type { BodyparserOptions } from \"./@api/parsers\";\nimport type { RouteMap } from \"./@api/routes\";\n\nexport interface DefaultVariables {}\nexport interface DefaultBindings {}\n\ntype ExtractJsonBody<R> = R extends [\n number,\n \\`\\${string}json\\${string}\\`,\n infer Body,\n]\n ? Body\n : never;\n\ntype ExtractJsonStatus<R> = R extends [\n infer S extends number,\n \\`\\${string}json\\${string}\\`,\n ...unknown[],\n]\n ? S extends 300 | 301 | 302 | 303 | 304 | 307 | 308\n ? never\n : S\n : never;\n\ntype ResponseJsonOverride<VDefs extends ValidationDefmap> = [\n ExtractJsonBody<VDefs[\"response\"]>,\n] extends [never]\n ? {}\n : {\n json: (\n body: ExtractJsonBody<VDefs[\"response\"]>,\n status?: ExtractJsonStatus<VDefs[\"response\"]>,\n ) => Response;\n };\n\nexport type ParameterizedContext<\n ParamsT,\n VariablesT,\n BindingsT,\n VDefs extends ValidationDefmap = {},\n VOpts extends ValidationOptmap = {},\n> = Context<{\n Bindings: DefaultBindings & BindingsT;\n Variables: DefaultVariables & VariablesT;\n}> &\n ExtendContext<ParamsT, VDefs, VOpts, BodyparserOptions> &\n ResponseJsonOverride<VDefs>;\n\nexport type ParameterizedMiddleware<\n ParamsT = Record<string, string>,\n VariablesT = Record<string, unknown>,\n BindingsT = Record<string, unknown>,\n> = (\n ctx: ParameterizedContext<ParamsT, VariablesT, BindingsT>,\n next: Next,\n) => Promise<unknown> | unknown;\n\nexport const use = <VariablesT = DefaultVariables>(\n middleware:\n | ParameterizedMiddleware<Record<string, string>, VariablesT>\n | Array<ParameterizedMiddleware<Record<string, string>, VariablesT>>,\n options?: UseOptions,\n) => {\n return createUse<ParameterizedMiddleware<Record<string, string>, VariablesT>>(\n middleware,\n options,\n );\n};\n\nexport type RouteHandler<\n ParamsT,\n VariablesT,\n BindingsT,\n VDefs extends ValidationDefmap,\n VOpts extends ValidationOptmap = {},\n> = (\n ctx: ParameterizedContext<ParamsT, VariablesT, BindingsT, VDefs, VOpts>,\n next: Next,\n) => Promise<unknown> | unknown;\n\nexport type DefineRouteFactory<ParamsT, VariablesT, BindingsT> = (\n a: {\n // NOTE: The \\`use\\` helper intentionally does not accept validation types.\n // Allowing these type parameters on \\`use\\` would be misleading,\n // since middleware operates across multiple request methods with varying types.\n use: (\n middleware:\n | ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>\n | Array<ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>>,\n options?: UseOptions,\n ) => MiddlewareDefinition<\n ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>\n >;\n } & {\n [M in HTTPMethod]: <\n VDefs extends ValidationDefmap,\n VOpts extends ValidationOptmap = {},\n >(\n handler:\n | RouteHandler<ParamsT, VariablesT, BindingsT, VDefs, VOpts>\n | Array<RouteHandler<ParamsT, VariablesT, BindingsT, VDefs, VOpts>>,\n ) => HandlerDefinition<\n ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>\n >;\n },\n) => Array<\n RouteDefinitionItem<ParameterizedMiddleware<ParamsT, VariablesT, BindingsT>>\n>;\n\ntype ParamsMap<\n Mappings extends Array<[string, unknown, boolean]>,\n Refinements extends Array<unknown>,\n> = {\n [I in Extract<keyof Mappings, \\`\\${number}\\`> as Mappings[I] extends [\n infer ParamName extends string,\n ...Array<unknown>,\n ]\n ? ParamName\n : never]: Mappings[I] extends [string, infer Default, true]\n ? I extends keyof Refinements\n ? Refinements[I]\n : Default\n : Mappings[I] extends [string, infer Default, false]\n ? I extends keyof Refinements\n ? Refinements[I] | undefined\n : Default | undefined\n : never;\n};\n\nexport const defineRoute: <\n R extends keyof RouteMap,\n ParamsD extends RouteMap[R][\"paramsDefaults\"] = RouteMap[R][\"paramsDefaults\"],\n VariablesT extends object = object,\n BindingsT extends object = object,\n>(\n factory: DefineRouteFactory<\n ParamsMap<RouteMap[R][\"paramsMappings\"], ParamsD>,\n VariablesT & RouteMap[R][\"cascadingState\"],\n BindingsT\n >,\n) => Array<\n RouteDefinitionItem<\n ParameterizedMiddleware<\n ParamsMap<RouteMap[R][\"paramsMappings\"], ParamsD>,\n VariablesT & RouteMap[R][\"cascadingState\"],\n BindingsT\n >\n >\n> = (factory) => {\n const createHandler = <MiddlewareT>(method: HTTPMethod) => {\n return (middleware: MiddlewareT | Array<MiddlewareT>) => {\n return {\n kind: \"handler\",\n method,\n middleware: [middleware].flat(),\n };\n };\n };\n return factory({\n HEAD: createHandler(\"HEAD\") as never,\n OPTIONS: createHandler(\"OPTIONS\") as never,\n GET: createHandler(\"GET\") as never,\n POST: createHandler(\"POST\") as never,\n PUT: createHandler(\"PUT\") as never,\n PATCH: createHandler(\"PATCH\") as never,\n DELETE: createHandler(\"DELETE\") as never,\n // route-specific \\`use\\`, contains types for current route\n use: use as never,\n });\n};\n`,b=`export * from \"./@api/app\";\nexport * from \"./@api/dev\";\nexport * from \"./@api/errors\";\nexport * from \"./@api/router\";\nexport * from \"./@api/routes\";\nexport * from \"./@api/server\";\n`,x=`import defaultErrorHandler from \"./errors\";\nimport router from \"./router\";\n\nimport { appFactory, routes } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default appFactory(({ createApp }) => {\n const app = createApp({ router });\n\n app.onError(defaultErrorHandler);\n\n for (const { path, methods, middleware } of routes) {\n app.on(methods, [path], ...middleware);\n }\n\n return app;\n});\n`,S=`import { getRequestListener } from \"@hono/node-server\";\n\nimport app from \"./app\";\n\nimport { devSetup } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default devSetup({\n requestHandler() {\n return getRequestListener(app.fetch);\n },\n teardownHandler() {\n // close db connections, server sockets etc.\n },\n});\n`,C=`export declare module \"{{ createImport 'libApi' }}\" {\n interface DefaultVariables {}\n interface DefaultBindings {}\n}\n`,w=`import { accepts } from \"hono/accepts\";\nimport { HTTPException } from \"hono/http-exception\";\n\nimport { ValidationError, HTTPError } from \"@kosmojs/core/errors\";\n\nimport { errorHandlerFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default errorHandlerFactory(\n async function defaultErrorHandler(error, ctx) {\n // Let Hono's HTTPException handle its own response\n if (error instanceof HTTPException) {\n return error.getResponse();\n }\n\n const [status, message] = Array.isArray(error)\n ? error\n : error instanceof HTTPError\n ? [error.status, error.message]\n : error instanceof ValidationError\n ? [400, \\`\\${error.target}: \\${error.errorMessage}\\`]\n : [error.statusCode || 500, error.message];\n\n // Respond based on what the client accepts\n const type = accepts(ctx, {\n header: \"Accept\",\n supports: [\"application/json\", \"text/plain\"],\n default: \"text/plain\",\n });\n\n return type === \"application/json\"\n ? ctx.json({ error: message }, status)\n : ctx.text(message, status);\n },\n);\n`,T=`import { defineRoute } from \"{{ createImport 'libApi' }}\";\n\nexport default defineRoute<\"{{route.name}}\">(({ GET }) => [\n GET(async (ctx) => {\n // Always \\`return\\` the response!\n // ❗ Never call \\`ctx.json()\\` / \\`ctx.text()\\` / \\`ctx.body()\\` without returning!\n return ctx.text(\"Automatically generated route\");\n }),\n]);\n`,E=`import { use } from \"{{ createImport 'libApi' }}\";\n\nexport type UseT = {};\n\nexport default [\n use<UseT>(async (ctx, next) => {\n // Always \\`return next()\\` or \\`await next()\\`;\n // ❗ Never call \\`next()\\` by itself!\n return next();\n }),\n];\n`,D=`import { routerFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default routerFactory(({ createRouter }) => {\n const router = createRouter();\n return router;\n});\n`,O=`import app from \"./app\";\n\nimport { serverFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nserverFactory(async ({ createServer }) => {\n await createServer(app);\n});\n`,k=`import { use } from \"{{ createImport 'libApi' }}\";\n\n/**\n * Define global middleware applied to all routes.\n * Can be overridden on a per-route basis using the slot key.\n * */\nexport default [\n use(async function useExample(ctx, next) {\n return next();\n }),\n];\n`,A=n((t,n)=>{let{createPath:d,createImportHelpers:A}=r(t),j=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${j(e.slice(1))}>`,{renderToFile:M}=a({helpers:{...A({origin:`lib`}),...u(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`[\"${e}\", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return j(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:N}=a({helpers:A({origin:`src`})}),P=e=>e?.trim().length===0,F=l(n?.templates,T),I=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await N(d.api(n.file),F(n.name,n),{route:n},{overwrite:P}):t===`apiUse`&&await N(d.api(n.file),E,{},{overwrite:P})},L=async t=>{let r=t.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=t.flatMap(({kind:t,entry:a})=>{if(t!==`apiRoute`)return[];let o=a.name.split(`/`).reduce((e,t)=>{let n=e[e.length-1];return e.push(n?s(n,t):t),e},[]),l={...a,path:a.honoPattern,cascadingMiddleware:r.flatMap(e=>o.some(t=>e.name===t)?[e]:[])};return[l,...Object.entries({...n?.alias}).flatMap(([t,n])=>{let r=i(t);return n===a.name?[{...l,name:t,id:`${l.id}_${c(t)}`,fullpath:e(r),pathTokens:r}]:[]})]}).sort(o);for(let[e,t]of[[`@api/routes.ts`,_]])await M(d.lib(e),t,{routes:a,cascadingMiddleware:r})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,y],[`api:factory.ts`,b],[`@api/app.ts`,f],[`@api/parsers.ts`,h],[`@api/dev.ts`,p],[`@api/errors.ts`,m],[`@api/router.ts`,g],[`@api/server.ts`,v]])await M(d.lib(e),t,{});for(let[e,t]of[[`app.ts`,x],[`dev.ts`,S],[`errors.ts`,w],[`router.ts`,D],[`server.ts`,O],[`use.ts`,k]])await N(d.api(e),t,{},{overwrite:P});await M(d.api(`env.d.ts`),C,{},{overwrite:P})},async watch(e,t){(!t||t.kind===`create`)&&await I(e),await L(e)},async build(e){await I(e),await L(e)}}}),j=t({meta:{name:`Hono`,slot:`backend`},dependencies:{hono:d.devDependencies.hono,\"@hono/node-server\":d.devDependencies[`@hono/node-server`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`]},factory:A});export{j as default};\n//# sourceMappingURL=index.js.map","import{createPathPattern as e,defineGenerator as t,defineGeneratorFactory as n,pathResolver as r,pathTokensFactory as i,renderFactory as a,sortRoutes as o}from\"@kosmojs/lib\";import{join as s}from\"node:path\";import c from\"crc/crc32\";import{createTemplateResolver as l}from\"@kosmojs/core\";import{routeRenderHelpers as u}from\"@kosmojs/core/generators\";var d={type:`module`,private:!0,name:`@kosmojs/koa-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`},\"./lib\":{types:`./pkg/lib.d.ts`,default:`./pkg/lib.js`}},scripts:{build:`wsbuild src/index.ts src/lib.ts`,test:`vitest --root ../.. --project generators/koa-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,crc:`^4.3.2`},devDependencies:{\"@koa/router\":`^15.7.0`,\"@types/formidable\":`^3.5.1`,\"@types/koa\":`^3.0.3`,\"@types/koa-compose\":`^3.2.9`,formidable:`^3.5.4`,koa:`^3.2.1`,\"koa-compose\":`^4.1.0`,\"light-my-request\":`^6.6.0`,\"path-to-regexp\":`^8.4.2`,\"raw-body\":`^4.0.0`,vite:`^8.2.1`}},f=`import Koa from \"koa\";\n\nimport type { AppFactory } from \"@kosmojs/core/api\";\n\nimport type { DefaultContext, DefaultState } from \"../api\";\n\nexport type App = Koa<DefaultState, DefaultContext>;\n\nexport type AppOptions = ConstructorParameters<\n typeof Koa<DefaultState, DefaultContext>\n>[0];\n\nexport const appFactory: AppFactory<App, AppOptions> = (factory) => {\n const createApp = (options?: AppOptions) => {\n return new Koa(options);\n };\n return factory({ createApp });\n};\n`,p=`import type { DevSetup } from \"@kosmojs/core/api\";\n\nexport const devSetup = (setup: DevSetup) => setup;\n`,m=`import type { ParameterizedMiddleware } from \"../api\";\n\nexport type ErrorHandlerFactory = (\n h: ParameterizedMiddleware,\n) => ParameterizedMiddleware;\n\nexport const errorHandlerFactory: ErrorHandlerFactory = (handler) => {\n return handler;\n};\n`,h=`import zlib from \"node:zlib\";\n\nimport type { RouterContext } from \"@koa/router\";\nimport Formidable, { type Options as FormidableOptions } from \"formidable\";\nimport rawParser from \"raw-body\";\n\nimport {\n parseCookies,\n parseSearchParams,\n type RequestBodyTarget,\n type RequestMetadataTarget,\n} from \"@kosmojs/core\";\n\nimport type {\n DefaultContext,\n DefaultState,\n ParameterizedContext,\n} from \"../api\";\n\nexport const metaparsers: {\n [T in RequestMetadataTarget]: (ctx: RouterContext) => unknown;\n} = {\n query(ctx) {\n return parseSearchParams(ctx.req.url ?? \"\");\n },\n\n headers(ctx) {\n return ctx.req.headers;\n },\n\n cookies(ctx) {\n return parseCookies(ctx.req.headers);\n },\n};\n\ntype JsonOptions = {\n limit?: number;\n};\n\n/**\n * Controls whether parsed field values are unwrapped from arrays.\n *\n * By default, all field values are returned as arrays (formidable v3 behavior),\n * since forms can submit multiple values under the same field name.\n *\n * - \\`false\\` (default) - no unwrapping, all values remain as arrays\n * - \\`true\\` - unwrap all fields; single-element arrays become scalars\n * - \\`{ only: string[] }\\` - unwrap only the specified fields\n * - \\`{ except: string[] }\\` - unwrap all fields except the specified ones\n *\n * Fields with multiple values are always kept as arrays regardless of this option.\n * If both \\`only\\` and \\`except\\` are provided, \\`only\\` takes precedence.\n *\n * @example\n * // all fields unwrapped: { username: 'john', role: 'admin' }\n * unwrap: true\n *\n * @example\n * // keep tags as array: { username: 'john', tags: ['a', 'b'] }\n * unwrap: { except: ['tags'] }\n *\n * @default false\n * */\ntype UnwrapControl =\n | boolean\n | {\n // unwrap only these keys\n only?: Array<string>;\n // unwrap all keys xcept these ones\n except?: Array<string>;\n };\n\ntype FormOptions = Pick<FormidableOptions, \"encoding\" | \"maxFields\"> &\n Partial<{\n // alias for maxFieldsSize\n limit: number;\n unwrap: UnwrapControl | undefined;\n }>;\n\ntype MultipartOptions = Omit<FormOptions, \"enabledPlugins\"> &\n Partial<{\n // alias for maxFieldsSize and maxFileSize\n limit: number;\n unwrap: UnwrapControl | undefined;\n }>;\n\ntype RawOptions = Partial<{\n /**\n * The byte limit of the body.\n * If the body ends up being larger than this limit, a 413 error code is returned.\n * */\n limit: number;\n\n /**\n * The length of the stream.\n * If the contents of the stream do not add up to this length,\n * an 400 error code is returned\n * */\n length: number;\n\n /**\n * The encoding to use to decode the body into a string.\n * By default, a Buffer instance will be returned when no encoding is specified.\n * utf-8 would decode as plain text.\n * use any encoding supported by iconv-lite.\n * */\n encoding: string;\n\n /**\n * zlib options\n * */\n chunkSize: number; // Default: 16 * 1024\n}>;\n\nexport const defaults: {\n json: JsonOptions;\n form: FormOptions | MultipartOptions;\n raw: RawOptions;\n} = {\n json: {\n limit: 1024 ** 2,\n },\n form: {\n limit: 1024 ** 2,\n },\n raw: {\n limit: 1024 ** 2,\n },\n};\n\nexport type BodyparserOptions = {\n json: JsonOptions;\n form: FormOptions | MultipartOptions;\n raw: RawOptions;\n};\n\nconst unwrap = (\n obj: Record<string, unknown | Array<unknown>>,\n opt: UnwrapControl | undefined,\n) => {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => {\n if (!Array.isArray(v) || v.length > 1) {\n return [k, v];\n }\n if (opt === false) {\n return [k, v];\n }\n if (opt === undefined || opt === true) {\n return [k, v[0]];\n }\n const { only, except } = { ...opt } as Exclude<UnwrapControl, boolean>;\n if (only?.includes(k)) {\n return [k, v[0]];\n }\n return [k, !except || except.includes(k) ? v : v[0]];\n }),\n );\n};\n\nexport const bodyparsers: {\n [T in RequestBodyTarget]: (\n ctx: ParameterizedContext<\n Record<string, string>,\n DefaultState,\n DefaultContext\n >,\n opt?: BodyparserOptions[T],\n ) => Promise<unknown>;\n} = {\n async json(ctx, opt) {\n const body = await bodyparsers.raw(ctx, {\n ...opt,\n encoding: \"utf-8\",\n });\n return body ? JSON.parse(body as never) : undefined;\n },\n\n async form(ctx, opt) {\n const form = Formidable({\n maxFieldsSize: opt?.limit || defaults.form.limit,\n maxFileSize: opt?.limit || defaults.form.limit,\n ...opt,\n });\n return new Promise((resolve, reject) => {\n form.parse(ctx.request.req, (err, fields, files) => {\n if (err) {\n return reject(err);\n }\n resolve(\n unwrap(\n // files should go last to override fields in case of name conflicting\n { ...fields, ...files },\n opt?.unwrap,\n ),\n );\n });\n });\n },\n\n async raw(ctx, opt) {\n const { chunkSize, ...rawParserOptions } = { ...defaults.raw, ...opt };\n\n const encoding = ctx.request.headers[\"content-encoding\"];\n const compressed = encoding ? encoding !== \"identity\" : false;\n\n const stream = compressed\n ? ctx.request.req.pipe(zlib.createUnzip({ chunkSize }))\n : ctx.request.req;\n\n return rawParser(stream, rawParserOptions);\n },\n};\n`,g=`import KoaRouter, { type RouterMiddleware } from \"@koa/router\";\nimport { match } from \"path-to-regexp\";\n\nimport type {\n RequestBodyTarget,\n RequestMetadataTarget,\n RequestValidationTarget,\n ValidationErrorEntry,\n} from \"@kosmojs/core\";\nimport {\n type CreateRouteMiddleware,\n createRoutes,\n type HTTPMethod,\n type RouterFactory,\n StateKey,\n} from \"@kosmojs/core/api\";\nimport { ValidationError } from \"@kosmojs/core/errors\";\n\nimport {\n type DefaultContext,\n type DefaultState,\n type ParameterizedContext,\n type ParameterizedMiddleware,\n use,\n} from \"../api\";\nimport { type BodyparserOptions, bodyparsers, metaparsers } from \"./parsers\";\nimport { routeSources } from \"./routes\";\n\nimport globalMiddleware from \"{{ createImport 'api' 'use' }}\";\nimport { apiRouteMap } from \"{{ createImport 'libCore' }}\";\n\nexport type Router = import(\"@koa/router\").Router<DefaultState, DefaultContext>;\nexport type RouterOptions = import(\"@koa/router\").RouterOptions;\n\n/**\n * Create route-level middleware stack that handles:\n * 1. Context extension - adds \\`ctx.bodyparser\\` (lazy, cached) and \\`ctx.validated\\` accessors\n * 2. Params validation - normalizes and validates URL params (including splat/numeric params)\n * 3. Request validation - validates query, headers, cookies, and body against schemas\n * 4. Response validation - validates outgoing response against defined variants\n *\n * Middleware are assigned named slots (e.g. \"validate:params\", \"validate:json\")\n * so they can be replaced by user-defined middleware in the stack.\n *\n * All validation errors are thrown as \\`ValidationError\\` instances,\n * caught and formatted by the global error handler middleware upstream.\n * */\nexport const createRouteMiddleware: CreateRouteMiddleware<\n ParameterizedMiddleware\n> = ({ name, pathPattern, validationSchemas }) => {\n const route = apiRouteMap[name];\n\n if (!route) {\n throw new Error(\\`createRouteMiddleware: \\${name} route does not exists\\`);\n }\n\n const { params, numericProperties } = route;\n\n const pathMatcher = match(pathPattern);\n\n const matchPath = (path: string) => {\n try {\n return pathMatcher(path);\n } catch (e) {\n return undefined;\n }\n };\n\n const maybeNumber = (val: unknown) => {\n if (val === undefined || val === null) {\n return val;\n }\n const n = Number(val);\n return Number.isFinite(n) ? n : val;\n };\n\n const validationMiddleware = [\n /**\n * Extends Koa context with:\n *\n * - \\`ctx.metaparser[target]()\\` - lazy, cached meta parsers.\n * Each parser (query, headers, cookies) runs at most once per request;\n * subsequent calls return the cached result.\n *\n * - \\`ctx.bodyparser[target](opts?)\\` - lazy, cached body parsers.\n * Each parser (json, form, raw) runs at most once per request;\n * subsequent calls return the cached result.\n * This allows both user middleware/handlers and validators\n * to call the same parser without re-consuming the request stream.\n *\n * - \\`ctx.validated\\` - getter that returns all validated data collected so far\n * (params, query, headers, cookies, json etc.) as a plain object.\n *\n * Cache is stored on \\`ctx[StateKey]\\` (a Symbol-keyed Map) to keep it\n * hidden from public API surface and serialization.\n * */\n use(\n function useExtendContext(ctx, next) {\n if (!ctx[StateKey]) {\n // initialize per-request cache with empty params\n // (later populated by useValidateParams)\n ctx[StateKey] = new Map([[\"params\", {}]]);\n\n Object.defineProperty(ctx, \"metaparser\", {\n value: Object.entries(metaparsers).reduce<{\n [T in RequestMetadataTarget]?: () => unknown;\n }>((map, entry) => {\n const [target, parser] = entry as [\n RequestMetadataTarget,\n Function,\n ];\n map[target] = () => {\n if (!ctx[StateKey].has(target)) {\n ctx[StateKey].set(\n target,\n target === \"query\"\n ? Object.fromEntries(\n Object.entries(parser(ctx)).map(([k, v]) => [\n k,\n numericProperties.query[ctx.method]?.includes(k)\n ? Array.isArray(v)\n ? v.map((e) => maybeNumber(e))\n : maybeNumber(v)\n : v,\n ]),\n )\n : parser(ctx),\n );\n }\n return ctx[StateKey].get(target);\n };\n return map;\n }, {}),\n enumerable: true,\n });\n\n Object.defineProperty(ctx, \"bodyparser\", {\n value: Object.entries(bodyparsers).reduce<{\n [T in RequestBodyTarget]?: (\n opt?: BodyparserOptions[T],\n ) => Promise<unknown>;\n }>((map, entry) => {\n const [target, parser] = entry as [RequestBodyTarget, Function];\n map[target] = async (opt) => {\n if (!ctx[StateKey].has(target)) {\n ctx[StateKey].set(target, await parser(ctx, opt as never));\n }\n return ctx[StateKey].get(target);\n };\n return map;\n }, {}),\n enumerable: true,\n });\n\n Object.defineProperty(ctx, \"validated\", {\n get() {\n return Object.fromEntries(ctx[StateKey]);\n },\n enumerable: true,\n });\n }\n return next();\n },\n { slot: \"@extendContext\" },\n ) as never,\n\n /**\n * Normalize and validate URL params:\n * - Splat params (e.g. \\`/files{/*path}\\`) are split into arrays by \"/\"\n * - Numeric params are cast to Number (or array of Numbers for splat params)\n * - Non-splat, non-numeric params pass through as strings\n *\n * Validated params are stored in the cache so \\`ctx.validated.params\\`\n * reflects the normalized (and validated) values.\n * */\n use(\n function useValidateParams(ctx, next) {\n const matched = matchPath(ctx.path);\n const normalizedParams = params.reduce(\n (map: Record<string, unknown>, name) => {\n const value = matched ? matched.params[name] : undefined;\n if (Array.isArray(value)) {\n map[name] = numericProperties.params.includes(name)\n ? value.map((e) => maybeNumber(e))\n : value;\n } else if (value) {\n map[name] = numericProperties.params.includes(name)\n ? maybeNumber(value)\n : value;\n }\n return map;\n },\n {},\n );\n validationSchemas.params?.validate(normalizedParams);\n ctx[StateKey].set(\"params\", normalizedParams);\n return next();\n },\n { slot: \"validate:params\" },\n ) as never,\n\n /**\n * Response validation - runs AFTER the handler (post-\\`next()\\`).\n *\n * Each response schema defines one or more variants, each with:\n * - expected status code\n * - optional content-type\n * - optional body schema\n *\n * All variants are checked; if at least one passes, validation succeeds.\n * If none pass, a ValidationError is thrown with collected errors from all variants.\n *\n * Activation rules:\n * - In dev/test mode: runs unless \\`runtimeValidation\\` is explicitly \\`false\\`\n * - In production: runs only if \\`runtimeValidation\\` is explicitly \\`true\\`\n *\n * Only attached to HTTP methods that have response schemas defined.\n * */\n use(\n async function useValidateResponse(ctx, next) {\n const variants = validationSchemas.response?.[ctx.method] || [];\n\n if (!Array.isArray(variants) || !variants.length) {\n return next();\n }\n\n // options are same for all variants\n const { runtimeValidation, customErrors } = variants[0];\n\n if (KOSMO_PRODUCTION_BUILD) {\n // skip if undefined or explicitly set to false\n if (runtimeValidation === undefined || runtimeValidation === false) {\n return next();\n }\n } else {\n // skip only if explicitly set to false\n if (runtimeValidation === false) {\n return next();\n }\n }\n\n // run all downstream middleware (including the route handler)\n // so ctx.status / ctx.type / ctx.body are set before we validate the response\n await next();\n\n const response: {\n status: number;\n contentType: string | null;\n body?: unknown;\n } = {\n status: ctx.status,\n contentType: ctx.type,\n };\n\n // Validate body only for JSON variants\n if (variants.some((e) => e.contentType?.includes(\"json\"))) {\n response.body = ctx.body;\n }\n\n /**\n * Returns an array of validator functions for a single response variant.\n * Each validator checks one aspect (status, content-type, body)\n * and returns an error entry or undefined if the check passes.\n * */\n const variantValidators: (\n v: (typeof variants)[number],\n ) => Array<(i: number) => ValidationErrorEntry | undefined> = (\n schema,\n ) => {\n return [\n (i) => {\n return schema.status === response.status\n ? undefined\n : {\n keyword: \"Status\",\n path: \\`Variant #\\${i}\\`,\n message: \\`expected: \\${schema.status}; actual: \\${response.status}\\`,\n };\n },\n (i) => {\n if (\n !schema.contentType ||\n schema.contentType === response.contentType\n ) {\n return undefined;\n }\n\n return {\n keyword: \"ContentType\",\n path: \\`Variant #\\${i}\\`,\n message: \\`expected: \\${schema.contentType}; actual: \\${response.contentType}\\`,\n };\n },\n (i) => {\n if (!schema.check || \"body\" in response === false) {\n // no body schema or contentType is not JSON\n return;\n }\n return schema.check(response.body)\n ? undefined\n : {\n keyword: \"Body\",\n path: \\`Variant #\\${i}\\`,\n message: schema.errorMessage(response.body),\n };\n },\n ];\n };\n\n // collect errors across all variants; exit early if any variant passes\n const errors: Array<ValidationErrorEntry> = [];\n\n for (const [i, variant] of variants.entries()) {\n const variantErrors = variantValidators(variant).flatMap(\n (validator) => {\n const error = validator(i);\n return error ? [error] : [];\n },\n );\n if (!variantErrors.length) {\n // variant fully matched - response is valid\n return;\n }\n errors.push(...variantErrors);\n }\n\n const errorMessage = \\`The response did not match any of the expected formats\\`;\n const errorSummary = \\`\\${variants.length} variants checked, none valid\\`;\n\n // no variant passed validation\n throw new ValidationError([\n \"response\",\n {\n errors,\n errorMessage: customErrors?.error || errorMessage,\n errorSummary,\n route: name,\n data: response,\n },\n ]);\n },\n {\n slot: \"validate:response\",\n on: Object.keys(validationSchemas.response || {}) as Array<HTTPMethod>,\n },\n ) as never,\n ];\n\n /**\n * Request validation - dynamically creates one middleware per target\n * (query, headers, cookies, json, form, raw).\n *\n * Each middleware:\n * 1. Checks if a schema exists for the current HTTP method\n * 2. Skips if \\`runtimeValidation\\` is explicitly disabled\n * 3. Loads data via the appropriate source (ctx.query, ctx.headers, or ctx.bodyparser)\n * 4. Validates via \\`schema.validate()\\` which throws on failure\n *\n * Body targets (json, form, raw) go through \\`ctx.bodyparser[target]()\\`,\n * benefiting from the lazy parsing and caching set up by slot:extendContext middleware.\n *\n * All request validators are active on any HTTP method that has at least one\n * schema defined across any target - this is intentionally broad to avoid\n * silently skipping validation when methods overlap.\n * */\n const requestTargets: Record<\n RequestValidationTarget,\n (\n ctx: ParameterizedContext<\n Record<string, string>,\n DefaultState,\n DefaultContext\n >,\n ) => Promise<unknown>\n > = {\n query: async (ctx) => ctx.metaparser.query(),\n headers: async (ctx) => ctx.metaparser.headers(),\n cookies: async (ctx) => ctx.metaparser.cookies(),\n json: async (ctx) => ctx.bodyparser.json(),\n form: async (ctx) => ctx.bodyparser.form(),\n raw: async (ctx) => ctx.bodyparser.raw(),\n };\n\n const requestEntries = Object.entries(requestTargets) as Array<\n [RequestValidationTarget, (typeof requestTargets)[RequestValidationTarget]]\n >;\n\n for (const [target, loadData] of requestEntries) {\n validationMiddleware.push(\n use(\n async (ctx, next) => {\n const schema = {\n ...validationSchemas[target]?.[ctx.method],\n };\n if (schema.validate && schema.runtimeValidation !== false) {\n schema.validate(await loadData(ctx as never));\n }\n return next();\n },\n {\n slot: \\`validate:\\${target}\\`,\n // duplicates not an issue here\n on: requestEntries.flatMap(([target]) => {\n return Object.keys(\n validationSchemas[target] || {},\n ) as Array<HTTPMethod>;\n }),\n },\n ) as never,\n );\n }\n\n return validationMiddleware;\n};\n\nexport const routes = createRoutes<ParameterizedMiddleware, RouterMiddleware>(\n routeSources,\n {\n globalMiddleware: globalMiddleware as never,\n createRouteMiddleware,\n },\n);\n\nexport const routerFactory: RouterFactory<Router, RouterOptions> = (\n factory,\n) => {\n const createRouter = (options?: RouterOptions): Router => {\n return new KoaRouter(options);\n };\n return factory({ createRouter });\n};\n`,_=`import { join } from \"node:path\";\n\nimport type { RouteSource } from \"@kosmojs/core/api\";\n\nimport { base, apiBase } from \"{{ createImport 'libCore' }}\";\n\n{{#each routes}}\nimport {{id}} from \"{{ createImport 'api' file }}\";\nimport { validationSchemas as {{id}}_schemas } from \"{{ createImport 'libApi' name 'schemas' }}\";\n{{/each}}\n\n{{#each cascadingMiddleware}}\nimport {{id}}, { type UseT as UseT{{id}} } from \"{{ createImport 'api' file }}\";\n{{/each}}\n\ntype Override<A, B> = Omit<A, keyof B> & B;\n\nexport type RouteMap = {\n{{#each routes}}\n \"{{name}}\": {\n paramsDefaults: {{paramsDefaults .}},\n paramsMappings: {{paramsMappings .}},\n cascadingState: {{cascadingState .}},\n },\n{{/each}}\n}\n\nexport const routeSources: Array<RouteSource<never>> = [\n {{#each routes}}\n {\n name: \"{{name}}\",\n {{#if fullpath}}\n path: \"{{fullpath}}\",\n pathPattern: \"{{fullpath}}\",\n {{else}}\n path: join(base, apiBase, \"{{path}}\"),\n pathPattern: join(base, apiBase, \"{{pathPattern}}\"),\n {{/if}}\n file: \"{{file}}\",\n cascadingMiddleware: [ {{#each cascadingMiddleware}}{{id}}, {{/each}}].flat() as Array<never>,\n definitionItems: {{id}} as never,\n validationSchemas: {{id}}_schemas,\n },\n {{/each}}\n] as const;\n`,v=`import { chmod, unlink } from \"node:fs/promises\";\nimport { parseArgs, styleText } from \"node:util\";\n\nimport type { ServerFactory } from \"@kosmojs/core/api\";\n\nimport type { App } from \"./app\";\n\nexport const serverFactory: ServerFactory<App> = (factory) => {\n const { values } = parseArgs({\n options: {\n port: {\n type: \"string\",\n short: \"p\",\n },\n sock: {\n type: \"string\",\n short: \"s\",\n },\n },\n });\n\n const getListenHandles = async () => {\n const { port, sock } = { ...values };\n\n if (![port, sock].some(Boolean)) {\n console.error(\"Please provide either -p/--port number or -s/--sock path\");\n process.exit(1);\n }\n\n if (sock) {\n await unlink(sock).catch((error) => {\n if (error.code === \"ENOENT\") {\n return;\n }\n console.error(error.message);\n process.exit(1);\n });\n }\n\n return { port, sock };\n };\n\n const onListen = async () => {\n const { port, sock } = await getListenHandles();\n if (sock) {\n // Make Unix socket world-writable so other processes (e.g. a reverse proxy)\n // can connect without permission issues.\n await chmod(sock, 0o777);\n }\n console.log(\n \\`\\\\n ✨ Server Started \\${styleText([\"dim\"], \"[ %s ]\")}\\`,\n sock ? \\`sock: \\${sock}\\` : \\`port: \\${port}\\`,\n );\n };\n\n return factory({\n async createServer(app) {\n const { port, sock } = await getListenHandles();\n const server = app.listen(port || sock, onListen);\n return server as never;\n },\n getListenHandles,\n onListen,\n });\n};\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\"💥 UNHANDLED REJECTION - This is likely caused by:\");\n console.error(\" - Middleware not awaiting next()\");\n console.error(\" - Middleware not returning next()\");\n console.error(\"\");\n console.error(\"Reason:\", reason);\n console.error(\"\");\n // In development, crash hard\n if (process.env.NODE_ENV === \"development\") {\n process.exit(1);\n }\n});\n`,y=`import type { RouterContext } from \"@koa/router\";\nimport type { Next } from \"koa\";\n\nimport type { ValidationDefmap, ValidationOptmap } from \"@kosmojs/core\";\nimport {\n use as createUse,\n type ExtendContext,\n type HandlerDefinition,\n type HTTPMethod,\n type MiddlewareDefinition,\n type RouteDefinitionItem,\n type UseOptions,\n} from \"@kosmojs/core/api\";\n\nimport type { BodyparserOptions } from \"./@api/parsers\";\nimport type { RouteMap } from \"./@api/routes\";\n\nexport interface DefaultState {}\nexport interface DefaultContext {}\n\ntype ExtractBodies<R> = R extends [number, string, infer Body] ? Body : never;\n\ntype ValidatedResponseBodies<VDefs extends ValidationDefmap> = [\n ExtractBodies<VDefs[\"response\"]>,\n] extends [never]\n ? unknown // No bodies extracted at all - fallback to unknown\n : ExtractBodies<VDefs[\"response\"]>;\n\nexport type ParameterizedContext<\n ParamsT,\n StateT,\n ContextT,\n VDefs extends ValidationDefmap = {},\n VOpts extends ValidationOptmap = {},\n> = RouterContext<\n DefaultState & StateT,\n DefaultContext &\n ContextT &\n ExtendContext<ParamsT, VDefs, VOpts, BodyparserOptions>,\n ValidatedResponseBodies<VDefs>\n>;\n\nexport type ParameterizedMiddleware<\n ParamsT = Record<string, string>,\n StateT = Record<string, unknown>,\n ContextT = Record<string, unknown>,\n> = (\n ctx: ParameterizedContext<ParamsT, StateT, ContextT>,\n next: Next,\n) => Promise<void> | void;\n\nexport type RouteHandler<\n ParamsT,\n StateT,\n ContextT,\n VDefs extends ValidationDefmap,\n VOpts extends ValidationOptmap = {},\n> = (\n ctx: ParameterizedContext<ParamsT, StateT, ContextT, VDefs, VOpts>,\n next: Next,\n) => Promise<void> | void;\n\nexport type DefineRouteFactory<ParamsT, StateT, ContextT> = (\n a: {\n // INFO: The \\`use\\` helper intentionally does not accept validation types.\n // Allowing these type parameters on \\`use\\` would be misleading,\n // since middleware operates across multiple request methods with varying types.\n use: (\n middleware:\n | ParameterizedMiddleware<ParamsT, StateT, ContextT>\n | Array<ParameterizedMiddleware<ParamsT, StateT, ContextT>>,\n options?: UseOptions,\n ) => MiddlewareDefinition<\n ParameterizedMiddleware<ParamsT, StateT, ContextT>\n >;\n } & {\n [M in HTTPMethod]: <\n VDefs extends ValidationDefmap,\n VOpts extends ValidationOptmap = {},\n >(\n handler:\n | RouteHandler<ParamsT, StateT, ContextT, VDefs, VOpts>\n | Array<RouteHandler<ParamsT, StateT, ContextT, VDefs, VOpts>>,\n ) => HandlerDefinition<ParameterizedMiddleware<ParamsT, StateT, ContextT>>;\n },\n) => Array<\n RouteDefinitionItem<ParameterizedMiddleware<ParamsT, StateT, ContextT>>\n>;\n\ntype ParamsMap<\n Mappings extends Array<[string, unknown, boolean]>,\n Refinements extends Array<unknown>,\n> = {\n [I in Extract<keyof Mappings, \\`\\${number}\\`> as Mappings[I] extends [\n infer ParamName extends string,\n ...Array<unknown>,\n ]\n ? ParamName\n : never]: Mappings[I] extends [string, infer Default, true]\n ? I extends keyof Refinements\n ? Refinements[I]\n : Default\n : Mappings[I] extends [string, infer Default, false]\n ? I extends keyof Refinements\n ? Refinements[I] | undefined\n : Default | undefined\n : never;\n};\n\nexport const use = <StateT = DefaultState>(\n middleware:\n | ParameterizedMiddleware<Record<string, string>, StateT>\n | Array<ParameterizedMiddleware<Record<string, string>, StateT>>,\n options?: UseOptions,\n) => {\n return createUse<ParameterizedMiddleware<Record<string, string>, StateT>>(\n middleware,\n options,\n );\n};\n\nexport const defineRoute: <\n R extends keyof RouteMap,\n ParamsD extends RouteMap[R][\"paramsDefaults\"] = RouteMap[R][\"paramsDefaults\"],\n StateT extends object = object,\n ContextT extends object = object,\n>(\n factory: DefineRouteFactory<\n ParamsMap<RouteMap[R][\"paramsMappings\"], ParamsD>,\n StateT & RouteMap[R][\"cascadingState\"],\n ContextT\n >,\n) => Array<\n RouteDefinitionItem<\n ParameterizedMiddleware<\n ParamsMap<RouteMap[R][\"paramsMappings\"], ParamsD>,\n StateT & RouteMap[R][\"cascadingState\"],\n ContextT\n >\n >\n> = (factory) => {\n const createHandler = <MiddlewareT>(method: HTTPMethod) => {\n return (middleware: MiddlewareT | Array<MiddlewareT>) => {\n return {\n kind: \"handler\",\n method,\n middleware: [middleware].flat(),\n };\n };\n };\n return factory({\n HEAD: createHandler(\"HEAD\") as never,\n OPTIONS: createHandler(\"OPTIONS\") as never,\n GET: createHandler(\"GET\") as never,\n POST: createHandler(\"POST\") as never,\n PUT: createHandler(\"PUT\") as never,\n PATCH: createHandler(\"PATCH\") as never,\n DELETE: createHandler(\"DELETE\") as never,\n // route-specific \\`use\\`, contains types for current route\n use: use as never,\n });\n};\n`,b=`export * from \"./@api/app\";\nexport * from \"./@api/dev\";\nexport * from \"./@api/errors\";\nexport * from \"./@api/router\";\nexport * from \"./@api/routes\";\nexport * from \"./@api/server\";\n`,x=`import router from \"./router\";\n\nimport { appFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default appFactory(({ createApp }) => {\n const app = createApp();\n\n // NOTE: Routes should be added last, after any middleware\n app.use(router.routes());\n\n return app;\n});\n`,S=`import app from \"./app\";\n\nimport { devSetup } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default devSetup({\n requestHandler() {\n return app.callback();\n },\n teardownHandler() {\n // close db connections, server sockets etc.\n },\n});\n`,C=`export declare module \"{{ createImport 'libApi' }}\" {\n interface DefaultState {}\n interface DefaultContext {}\n}\n`,w=`import { HTTPError, ValidationError } from \"@kosmojs/core/errors\";\n\nimport { errorHandlerFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default errorHandlerFactory(\n async function defaultErrorHandler(ctx, next) {\n try {\n await next();\n } catch (error: any) {\n const [status, message] = Array.isArray(error)\n ? error\n : error instanceof HTTPError\n ? [error.status, error.message]\n : error instanceof ValidationError\n ? [400, \\`\\${error.target}: \\${error.errorMessage}\\`]\n : [error.statusCode || 500, error.message];\n\n ctx.status = status;\n\n if (ctx.accepts(\"json\")) {\n ctx.body = { error: message };\n } else {\n ctx.body = message;\n }\n }\n },\n);\n`,T=`import { defineRoute } from \"{{ createImport 'libApi' }}\";\n\nexport default defineRoute<\"{{route.name}}\">(({ GET }) => [\n GET(async (ctx) => {\n ctx.body = \"Automatically generated route\";\n }),\n]);\n`,E=`import { use } from \"{{ createImport 'libApi' }}\";\n\nexport type UseT = {};\n\nexport default [\n use<UseT>(async (ctx, next) => {\n // Always \\`return next()\\` or \\`await next()\\`;\n // ❗ Never call \\`next()\\` by itself!\n return next();\n }),\n];\n`,D=`import { routerFactory, routes } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nexport default routerFactory(({ createRouter }) => {\n const router = createRouter();\n\n for (const { name, path, methods, middleware } of routes) {\n router.register(path, methods, middleware, { name });\n }\n\n return router;\n});\n`,O=`import app from \"./app\";\n\nimport { serverFactory } from \"{{ createImport 'lib' 'api:factory' }}\";\n\nserverFactory(async ({ createServer }) => {\n await createServer(app);\n});\n`,k=`import defaultErrorHandler from \"./errors\";\n\nimport { use } from \"{{ createImport 'libApi' }}\";\n\nexport default [\n /**\n * Define global middleware applied to all routes.\n * Can be overridden on a per-route basis using the slot key.\n * */\n use(defaultErrorHandler, { slot: \"errorHandler\" }),\n];\n`,A=n((t,n)=>{let{createPath:d,createImportHelpers:A}=r(t),j=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${j(e.slice(1))}>`,{renderToFile:M}=a({helpers:{...A({origin:`lib`}),...u(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`[\"${e}\", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return j(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:N}=a({helpers:A({origin:`src`})}),P=e=>e?.trim().length===0,F=l(n?.templates,T),I=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await N(d.api(n.file),F(n.name,n),{route:n},{overwrite:P}):t===`apiUse`&&await N(d.api(n.file),E,{},{overwrite:P})},L=async t=>{let r=t.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=t.flatMap(({kind:t,entry:a})=>{if(t!==`apiRoute`)return[];let o=a.name.split(`/`).reduce((e,t)=>{let n=e[e.length-1];return e.push(n?s(n,t):t),e},[]),l={...a,path:a.pathPattern,cascadingMiddleware:r.flatMap(e=>o.some(t=>e.name===t)?[e]:[])};return[l,...Object.entries({...n?.alias}).flatMap(([t,n])=>{let r=i(t);return n===a.name?[{...l,name:t,id:`${l.id}_${c(t)}`,fullpath:e(r),pathTokens:r}]:[]})]}).sort(o);for(let[e,t]of[[`@api/routes.ts`,_]])await M(d.lib(e),t,{routes:a,cascadingMiddleware:r})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,y],[`api:factory.ts`,b],[`@api/app.ts`,f],[`@api/dev.ts`,p],[`@api/errors.ts`,m],[`@api/parsers.ts`,h],[`@api/router.ts`,g],[`@api/server.ts`,v]])await M(d.lib(e),t,{});for(let[e,t]of[[`app.ts`,x],[`dev.ts`,S],[`errors.ts`,w],[`router.ts`,D],[`server.ts`,O],[`use.ts`,k]])await N(d.api(e),t,{},{overwrite:P});await M(d.api(`env.d.ts`),C,{},{overwrite:P})},async watch(e,t){(!t||t.kind===`create`)&&await I(e),await L(e)},async build(e){await I(e),await L(e)}}}),j=t({meta:{name:`Koa`,slot:`backend`,types:[`@types/koa`]},dependencies:{koa:d.devDependencies.koa,\"@koa/router\":d.devDependencies[`@koa/router`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`],formidable:d.devDependencies.formidable,\"raw-body\":d.devDependencies[`raw-body`]},devDependencies:{\"@types/koa\":d.devDependencies[`@types/koa`],\"@types/formidable\":d.devDependencies[`@types/formidable`]},factory:A});export{j as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderFactory as r,sortRoutes as i}from\"@kosmojs/lib\";import{createTemplateResolver as a,defaults as o}from\"@kosmojs/core\";import{routeRenderHelpers as s}from\"@kosmojs/core/generators\";import c from\"@mdx-js/rollup\";import{createFilter as l}from\"vite\";var u={type:`module`,private:!0,name:`@kosmojs/mdx-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"@mdx-js/rollup\":`^3.1.1`,vite:`^8.2.1`},devDependencies:{\"@mdx-js/mdx\":`^3.1.1`,\"@mdx-js/preact\":`^3.1.1`,\"path-to-regexp\":`^8.4.2`,preact:`^10.29.8`,\"preact-render-to-string\":`^6.7.0`,\"remark-frontmatter\":`^5.0.0`,\"remark-mdx-frontmatter\":`^5.2.0`}},d=()=>{let e=[`🎉 Well done! You just created a new MDX page.`,`🚀 Success! A fresh MDX page is ready to roll.`,`🌟 Nice work! Another MDX page added to your site.`,`🧩 All set! A new MDX page has been scaffolded.`,`🔧 Scaffold complete! Your new MDX page is in place.`,`✅ Built! Your MDX page is scaffolded and ready.`,`✨ Fantastic! Your new MDX page is good to go.`,`🎯 Nailed it! A brand new MDX page just landed.`,`💫 Awesome! Another MDX page joins the party.`,`⚡ Lightning fast! A new MDX page created successfully.`];return e[Math.floor(Math.random()*e.length)]},f=(e,t,n)=>{let{remarkPlugins:r=[],rehypePlugins:i=[]}={...n},a=()=>{let t=[`${o.srcDir}/${e.name}/${o.entryDir}/client.ts`].map(e=>l(e)),n=e=>t.some(t=>t(e));return{name:`kosmo:mdx[hmr]`,enforce:`post`,transform(e,t){if(!(!n(t)||e.includes(`import.meta.hot.accept`)))return{code:[e,`\nif (import.meta.hot) {\n import.meta.hot.accept(() => {});\n}\n`].join(`\n`)}}}},s=[c({jsxImportSource:`preact`,providerImportSource:`@mdx-js/preact`,remarkPlugins:r,rehypePlugins:i})];return t===`serve`&&s.push(a()),s},p=`import type { FunctionComponent } from \"preact\";\n\nexport const AppProvider: FunctionComponent = (props) => {\n return props.children;\n};\n`,m=`import { render, hydrate as hydrateOrig } from \"preact\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { createRoute, type RouteComponent } from \"../mdx\";\n\n{{#each pageRoutes}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n{{#each layouts}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nexport const createRoutes = () => {\n return [\n {{#each pageRoutes}}\n createRoute(\"{{name}}\", \"{{pathPattern}}\", {{id}}, [\n {{#each layouts}}[\"{{name}}\", {{id}}], {{/each}}\n ]),\n {{/each}}\n ];\n};\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<Promise<RouteComponent>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n hydrateOrig(component, root);\n window.__KOSMO_HYDRATION_DATA__ = undefined;\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<Promise<RouteComponent>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n render(component, root);\n}\n\nexport default clientRenderFactory();\n`,h=`import { renderToString as renderToStringOrig } from \"preact-render-to-string\";\n\nimport type {\n RenderToStringWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { createRoute, type Route, type RouteComponent } from \"../mdx\";\n\n{{#each pageRoutes}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n{{#each layouts}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n\nexport const createRoutes = () => {\n return [\n {{#each pageRoutes}}\n createRoute(\"{{name}}\", \"{{pathPattern}}\", async () => {{id}}, [\n {{#each layouts}}[\"{{name}}\", async () => {{id}}], {{/each}}\n ]),\n {{/each}}\n ];\n};\n\nconst generateHeaderTags = ({ name, frontmatter, loaderData }: Route) => {\n const tags: Array<string> = [];\n\n if (typeof frontmatter?.title === \"string\") {\n tags.push(\\`<title>\\${frontmatter.title}</title>\\`);\n }\n\n if (typeof frontmatter?.description === \"string\") {\n tags.push(\\`<meta name=\"description\" content=\"\\${frontmatter.description}\">\\`);\n }\n\n if (Array.isArray(frontmatter?.head)) {\n for (const [tag, attrs] of frontmatter.head) {\n const attrStr = Object.entries(attrs)\n .map(([k, v]) => \\`\\${k}=\"\\${v}\"\\`)\n .join(\" \");\n tags.push(\\`<\\${tag} \\${attrStr}>\\`);\n }\n }\n\n tags.push(\n \\`<script>\n window.__KOSMO_HYDRATION_DATA__ = JSON.parse(\n \\${JSON.stringify(JSON.stringify(loaderData))}\n );\n <\\/script>\\`\n )\n\n return tags\n};\n\nexport const renderWrapper: SSRRenderWrapper = (_context, render) => render();\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<Promise<RouteComponent>, { route: Route }>\n> = async (resolver, { headerTags = [] } = {}) => {\n const { component, route } = await resolver();\n const html = renderToStringOrig(component);\n return {\n head: [...headerTags, ...generateHeaderTags(route as never)].join(\"\\\\n\"),\n html,\n }\n}\n\nexport default serverRenderFactory<false>();\n`,g=`declare module \"*.mdx\" {\n import type { ComponentType } from \"preact\";\n export const frontmatter: Record<string, unknown>;\n const component: ComponentType;\n export default component;\n}\n\ndeclare module \"*.md\" {\n import type { ComponentType } from \"preact\";\n export const frontmatter: Record<string, unknown>;\n const component: ComponentType;\n export default component;\n}\n`,_=`import { MDXProvider } from \"@mdx-js/preact\";\nimport { match, pathToRegexp } from \"path-to-regexp\";\nimport { type ComponentType, createContext, h, type VNode } from \"preact\";\n\nimport { parseSearchParams } from \"@kosmojs/core\";\n\nimport { paramNames } from \"{{ createImport 'lib' 'params' }}\";\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nexport type RawRoute = {\n name: string;\n pathSegments: number | undefined;\n regexp: RegExp;\n extractParams: (path: string) => Route[\"params\"];\n loader: () => Promise<RouteModule>;\n layouts: Array<[name: string, source: () => Promise<LayoutModule>]>;\n};\n\ntype Loader = (\n route: Pick<Route, \"name\" | \"params\" | \"paramsEntries\" | \"searchParams\">,\n) => Promise<unknown> | undefined;\n\ntype LayoutModule = {\n default: ComponentType;\n loader?: Loader;\n};\n\ntype RouteModule = {\n default: ComponentType;\n frontmatter: Route[\"frontmatter\"];\n loader?: Loader;\n};\n\nexport type RouteComponent = VNode<{ value: Route }>;\n\nexport type Route = {\n name: string;\n params: Record<string, string | Array<string>>;\n paramsEntries: [keys: Array<string>, values: Array<unknown>];\n searchParams: Record<string, unknown>;\n frontmatter: Record<string, unknown>;\n loaderData: Record<string, unknown>;\n};\n\nexport const RouterContext = createContext<Route>({\n name: \"\",\n params: {},\n paramsEntries: [[], []],\n searchParams: {},\n frontmatter: {},\n loaderData: {},\n});\n\nexport const RouterProvider = RouterContext.Provider;\n\nexport const createRouter = (\n routes: Array<RawRoute>,\n app: ComponentType,\n opt: { components?: Record<string, ComponentType<never>> },\n) => {\n const catchallRoute = createRoute(\n \"NotFound\",\n \"\",\n () => import(\"{{ createImport 'pages' '404.mdx' }}\"),\n [],\n );\n\n const runLoader = async (key: string, fetcher: () => ReturnType<Loader>) => {\n if (typeof window === \"undefined\" || !window.__KOSMO_HYDRATION_DATA__) {\n return fetcher();\n }\n return key in window.__KOSMO_HYDRATION_DATA__\n ? window.__KOSMO_HYDRATION_DATA__[key]\n : fetcher();\n };\n\n return {\n async resolve(url: URL = new URL(window.location.href)) {\n const searchParams = parseSearchParams(url);\n const urlSegments = url.pathname.split(\"/\").filter(Boolean).length;\n\n // 1: use lightweight \\`RegExp.test()\\` on linear scan - no capture allocation\n const matchedRoutes = routes.filter(({ regexp }) => {\n return regexp.test(url.pathname);\n });\n\n const matchedRoute =\n matchedRoutes.length > 1\n ? matchedRoutes.find(({ pathSegments }) => {\n return pathSegments === undefined || pathSegments === urlSegments;\n }) || catchallRoute\n : matchedRoutes.length === 1\n ? matchedRoutes[0]\n : catchallRoute;\n\n // 2: capture params only on matched route\n const params = matchedRoute\n ? matchedRoute.extractParams(url.pathname)\n : {};\n\n const { name } = matchedRoute;\n\n const routeModule = await matchedRoute.loader();\n\n const paramsEntries = (\n Array.isArray(paramNames[name as never])\n ? [\n [...paramNames[name as never]],\n [...paramNames[name as never]].map((key) => params[key]),\n ]\n : [\n // fallback\n Object.keys(params),\n Object.values(params),\n ]\n ) as never;\n\n const { frontmatter = {} } = routeModule;\n\n const loaderData: Record<string, unknown> = {};\n\n loaderData[name] = await runLoader(name, () => {\n return routeModule.loader\n ? routeModule.loader({ name, params, paramsEntries, searchParams })\n : undefined; // should not survive serialization if no loader defined\n });\n\n const layouts: Array<{\n name: string;\n component: LayoutModule[\"default\"];\n }> = [];\n\n for (const [name, source] of matchedRoute.layouts || []) {\n const layoutModule = await source();\n layouts.push({ name, component: layoutModule.default });\n const key = \\`\\${name}/layout\\`;\n loaderData[key] = await runLoader(key, () => {\n return layoutModule.loader\n ? layoutModule.loader({ name, params, paramsEntries, searchParams })\n : undefined; // should not survive serialization if no loader defined\n });\n }\n\n const route: Route = {\n name,\n params,\n paramsEntries,\n searchParams,\n frontmatter,\n loaderData,\n };\n\n const component = [{ name: \"\", component: app }, ...layouts].reduce(\n (children, { component }) => {\n return h(component, { children } as never);\n },\n h(routeModule.default, {}),\n );\n\n return {\n component: h(\n RouterProvider,\n { value: route },\n h(MDXProvider, opt as never, component),\n ),\n route,\n };\n },\n };\n};\n\nexport const createRoute = (\n name: string,\n pathPattern: string,\n loader: RawRoute[\"loader\"],\n layouts: RawRoute[\"layouts\"],\n): RawRoute => {\n const path = \\`\\${base}/\\${pathPattern}\\`.replace(/\\\\/+/g, \"/\");\n\n const { regexp } = pathToRegexp(path, { sensitive: true });\n const matcher = match<Route[\"params\"]>(path);\n\n return {\n name,\n regexp,\n pathSegments: name.includes(\"...\")\n ? undefined\n : name.replace(/^index(\\\\/?|$)/, \"\").split(\"/\").length,\n extractParams: (path) => {\n const match = matcher(path);\n return match ? match.params : {};\n },\n loader,\n layouts,\n };\n};\n`,v=`/* @jsxImportSource preact */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n headline?: string;\n}) {\n return (\n <div class={styles.container}>\n <div class={styles.card}>\n\n <h2 class={styles.title}>\n {props.headline || \"404: Not Found\"}\n </h2>\n <br />\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>\n Something went wrong...\n </h2>\n 🚧 No page found here\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,y=`/* @jsxImportSource preact */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string }\n}) {\n return (\n <div data-page-route={props.routeName} class={styles.container}>\n <div class={styles.card}>\n\n <h2 class={styles.subtitle}>\n {props.message}\n </h2>\n <br />\n\n <div class={styles.stepsBox}>\n <ul class={styles.stepsList}>\n <li>\n Edit this page at <code>{props.pathMap.page}</code>\n </li>\n <li>\n Create new pages by adding folders in\n <code>{props.pathMap.pages}/</code>\n </li>\n <li>\n Add API endpoints in\n <code>{props.pathMap.api}/</code>\n </li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,b=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,x=`/* @jsxImportSource preact */\n\nimport styles from \"./styles.module.css\";\n\nexport default function WelcomePage() {\n return (\n <div class={styles.container}>\n <div class={styles.card}>\n <div class={styles.header}>\n <div class={styles.icon}>✨</div>\n <h1 class={styles.title}>Welcome to KosmoJS</h1>\n <p class={styles.subtitle}>\n Content-first development with MDX and Vite\n </p>\n </div>\n\n <div class={styles.featuresBox}>\n <h2 class={styles.featuresTitle}>\n Powered by MDX and ready to publish\n </h2>\n <div class={styles.featuresSubtitle}>What's included:</div>\n <ul class={styles.featuresList}>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Directory-based routing\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n MDX content with Preact components\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Nested layouts and frontmatter\n </li>\n </ul>\n </div>\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>Next Steps 🢂</h2>\n <ul class={styles.stepsList}>\n <li>\n Edit this page at <code>pages/index/index.mdx</code>\n </li>\n <li>Create new pages by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,S=`export type ParamsMap = {\n{{#each pageRoutes}}\"{{name}}\": {{serializeParamsLiteral .}};\n{{/each}}\n};\n\nexport const paramNames = {\n{{#each pageRoutes}}\"{{name}}\": [ {{#each params.schema}}\"{{name}}\", {{/each}}],\n{{/each}}\n} as const;\n`,C=`import type { ComponentType } from \"preact\";\n\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport {\n createRouter,\n type RawRoute,\n type Route,\n type RouteComponent,\n} from \"./mdx\";\n\nexport const createRouters = (\n routes: Array<RawRoute>,\n {\n app,\n components,\n }: {\n app: ComponentType;\n components: Record<string, ComponentType<never>>;\n },\n): {\n clientRouter: () => RouterFactoryReturn<Promise<RouteComponent>>;\n serverRouter: (\n url: URL,\n ) => RouterFactoryReturn<Promise<RouteComponent>, { route: Route }>;\n} => {\n const router = createRouter(routes, app, { components });\n\n return {\n clientRouter() {\n return router.resolve();\n },\n serverRouter(url) {\n return router.resolve(url);\n },\n };\n};\n\nexport default createRouterFactory<\n RawRoute,\n Promise<RouteComponent>,\n { server: { route: Route } }\n>();\n`,w=`import { join } from \"node:path\";\n\nimport { compile } from \"path-to-regexp\";\n\nimport type { PageRoute } from \"@kosmojs/core\";\n\nimport routes from \"{{ createImport 'lib' 'ssg:routes' }}\";\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nconst paramsMapper = (params: PageRoute[\"params\"], value: Array<unknown>) => {\n return params.schema.reduce<Record<string, unknown>>(\n (map, { name, kind }, i) => {\n if (kind === \"splat\") {\n if (Array.isArray(value[i]) && value[i].length) {\n map[name] = value[i].map(String);\n }\n } else if (value[i] !== undefined) {\n map[name] = String(value[i]);\n }\n return map;\n },\n {},\n );\n};\n\nexport default Object.entries(routes)\n .flatMap(([name, { pathPattern, params, frontmatter }]) => {\n if (!params.schema.length || Array.isArray(frontmatter?.staticParams)) {\n if (params.schema.length) {\n const toPath = compile(pathPattern);\n return Array.from(frontmatter?.staticParams || []).flatMap((entry) => {\n try {\n return [toPath(paramsMapper(params, entry) as never)];\n } catch (error: any) {\n console.error(\\`❗SSG: Failed building path for \\${name}\\`);\n console.error(error);\n return [];\n }\n });\n }\n // static route\n return [pathPattern.replace(/^index\\\\/?/, \"\")];\n }\n return [];\n })\n .map((path) => join(base, path));\n`,T=`import type { PageRoute } from \"@kosmojs/core\";\n\n{{#each pageRoutes}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n\nconst routeMap: Record<\n string,\n {\n frontmatter?: { staticParams?: Array<Array<string | Array<string>>> };\n pathPattern: string;\n params: PageRoute[\"params\"];\n }\n> = {\n{{#each pageRoutes}}\n \"{{name}}\": {\n frontmatter: {{id}}.frontmatter,\n pathPattern: \"{{pathPattern}}\",\n params: {{serializeParams .}},\n },\n{{/each}}\n}\n\nexport default routeMap;\n`,E=`import { useContext } from \"preact/hooks\";\n\nimport { RouterContext } from \"./mdx\";\n\nimport type { ParamsMap, paramNames } from \"{{ createImport 'lib' 'params' }}\";\n\nexport function useRoute() {\n return structuredClone(useContext(RouterContext));\n}\n\nexport function useParams<T extends keyof ParamsMap>(): ParamsMap[T] {\n return useRoute().params as ParamsMap[T];\n}\n\ntype SameLengthTuple<T extends readonly unknown[], U> = { [K in keyof T]: U };\n\nexport function useParamsEntries<T extends keyof ParamsMap>(): [\n (typeof paramNames)[T],\n SameLengthTuple<(typeof paramNames)[T], unknown>,\n] {\n return useRoute().paramsEntries as never;\n}\n\nexport function useSearchParams() {\n return useRoute().searchParams;\n}\n\n/**\n * Reads loader data for the current page or one of its layouts.\n * Without a key, returns the page's own data.\n * For a layout, pass its path-qualified name (e.g. \"dashboard/layout\") -\n * a hook can't tell which layout it runs in.\n * */\nexport const useLoaderData = <T>(key?: string): T | undefined => {\n const route = useRoute();\n return route.loaderData?.[key || route.name] as T;\n};\n\n/**\n * Reads the current route's frontmatter.\n * */\nexport const useFrontmatter = <\n T extends Record<string, unknown> = Record<string, unknown>,\n>(): T => {\n return useRoute().frontmatter as T;\n};\n`,D=`import { AppProvider } from \"{{ createImport 'lib' 'app' }}\";\n\n<AppProvider>{props.children}</AppProvider>\n`,O=`import { h, type JSX } from \"preact\";\n\nimport { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\nexport default function Link(\n props: Omit<h.JSX.IntrinsicElements[\"a\"], \"href\"> & {\n to: LinkProps;\n query?: Record<string | number, unknown>;\n },\n): JSX.Element {\n const { to, query, children, ...restProps } = props;\n\n const [key, ...params] = to;\n const href = pageRouteMap[key]?.base(params as never, query);\n\n return h(\"a\", { ...restProps, href }, children);\n}\n`,k=`/**\n * MDX component overrides.\n *\n * Every standard markdown element (headings, links, code blocks, etc.)\n * can be replaced with a custom Preact component here.\n * These overrides apply globally to all MDX pages via the MDXProvider.\n * Individual pages can still import and use additional components directly.\n *\n * @see https://mdxjs.com/docs/using-mdx/#components\n * */\nimport type { ComponentType } from \"preact\";\nimport Link from \"./Link.tsx\";\n\nexport const components = {\n Link,\n // example overrides:\n // h1: (props) => <h1 style=\\\\{{ color: \"tomato\" }} {...props} />,\n // pre: (props) => <pre class=\"code-block\" {...props} />,\n} satisfies Record<string, ComponentType<never>>;;\n\ndeclare global {\n type MDXProvidedComponents = typeof components;\n}\n`,A=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,j=`import renderFactory, {\n createRoutes,\n renderToString,\n // no renderToStream on MDX folders\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,M=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,N=`import PageSample from \"{{ createImport 'lib' 'pageSamples/404.tsx' }}\";\n\nexport default function Page() {\n return <PageSample />;\n}\n`,P=`{props.children}\n`,F=`---\ntitle: \"{{title}}\"\n---\n\nimport PageSample from \"{{ createImport 'lib' 'pageSamples/page.tsx' }}\";\n\nexport const pathMap = {\n page: \"{{ createImport 'pages' route.file }}\",\n pages: \"{{ createImport 'pages' }}\",\n api: \"{{ createImport 'api' }}\",\n};\n\n<PageSample\n message=\"{{message}}\"\n routeName=\"{{route.name}}\"\n pathMap={pathMap}\n/>\n`,I=`---\ntitle: Welcome to KosmoJS\ndescription: Content-first development with MDX and Vite\n---\n\nimport WelcomePage from \"{{ createImport 'lib' 'pageSamples/welcome.tsx' }}\"\n\n<WelcomePage />\n`,L=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\n\nimport app from \"./app.mdx\";\nimport { components } from \"./components/mdx\"\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, { app, components });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,R=t((e,t)=>{let{createPath:c,createImportHelpers:l}=n(e),{renderToFile:u}=r({helpers:{...l({origin:`lib`}),...s(),serializeParams(e){return JSON.stringify(e.params)}}}),{renderToFile:R}=r({helpers:l({origin:`src`})}),z=e=>!e?.trim().length,B=a(t?.templates,F),V=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await R(c.pages(n.file),n.name===`index`?I:B(n.name,n),{route:n,title:n.name.replace(/\\{([^}]+)\\}/g,`$1`),message:d()},{overwrite:z}):t===`pageLayout`&&await R(c.pages(n.file),P,{route:n},{overwrite:z})},H=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),n=e.flatMap(({kind:e,entry:n})=>{if(e===`pageRoute`){let{name:e,file:r}=n;return[{...n,layouts:t.flatMap(t=>t.name===e||r.startsWith(`${t.name}/`)?[t]:[]).sort(i)}]}return[]}).sort(i);for(let[e,r]of[[`client.ts`,m],[`server.ts`,h]])await u(c.libEntry(e),r,{pageRoutes:n,layouts:t});for(let[e,t]of[[`params.ts`,S],[`router.ts`,C],[`ssg:routes.ts`,T]])await u(c.lib(e),t,{pageRoutes:n})};return{config({command:n}){return{oxc:{jsx:{importSource:`preact`}},plugins:f(e,n,t)}},async start(){for(let[e,t]of[[`env.d.ts`,g],[`app.ts`,p],[`mdx.ts`,_],[`use.ts`,E],[`ssg.ts`,w],[`pageSamples/styles.module.css`,b],[`pageSamples/welcome.tsx`,x],[`pageSamples/page.tsx`,y],[`pageSamples/404.tsx`,v]])await u(c.lib(e),t,{});for(let[e,t]of[[`pages/404.mdx`,N],[`components/Link.tsx`,O],[`components/mdx.ts`,k],[`app.mdx`,D],[`router.ts`,L]])await R(c.src(e),t,{entryDir:o.entryDir},{overwrite:z});await R(c.src(`index.html`),M,{entryDir:o.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,A],[`server.ts`,j]])await R(c.entry(e),t,{},{overwrite:z})},async watch(e,t){(!t||t.kind===`create`)&&await V(e),await H(e)},async build(e){await V(e),await H(e)}}}),z=e({meta:{name:`MDX`,jsxImportSource:`preact`},dependencies:{\"path-to-regexp\":u.devDependencies[`path-to-regexp`]},devDependencies:{preact:u.devDependencies.preact,\"preact-render-to-string\":u.devDependencies[`preact-render-to-string`],\"@mdx-js/preact\":u.devDependencies[`@mdx-js/preact`],\"remark-frontmatter\":u.devDependencies[`remark-frontmatter`],\"remark-mdx-frontmatter\":u.devDependencies[`remark-mdx-frontmatter`]},factory:R});export{z as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderToFile as r,sortRoutes as i}from\"@kosmojs/lib\";import a from\"yaml\";import{join as o}from\"node:path\";import s from\"crc/crc32\";import{parse as c}from\"path-to-regexp\";import l from\"typebox\";import{RequestBodyTargets as u}from\"@kosmojs/core\";var d={json:`application/json`,form:[`application/x-www-form-urlencoded`,`multipart/form-data`],raw:void 0},f=()=>{let e=e=>[`Buffer`,`ArrayBuffer`,`Blob`].includes(e)?{type:`string`,format:`binary`}:l.Script(e),t=(e,t,n)=>{let r=n?`${t}_${n.replace(/[^\\w.-]/g,`_`)}${s(n)}`:t;return`${e.id}_${r}`},n=(e,n,r,i)=>[`#`,`components`,e,t(n,r,i)].join(`/`),r=e=>e.split(`/`).reduce((e,t)=>e+ +!t.includes(`{`),0),a=e=>{if(e.name===`index`)return[`/`];let{tokens:t}=c(e.pathPattern),n=e=>e.flatMap(e=>{switch(e.type){case`param`:return[e.name];case`wildcard`:return[e.name];case`group`:return n(e.tokens);default:return[]}}),i=(e,t)=>{if(!e.length)return[t];let[r,...a]=e;switch(r.type){case`text`:return i(a,{path:`${t.path}${r.value}`,params:t.params});case`param`:return i(a,{path:`${t.path}{${r.name}}`,params:[...t.params,r.name]});case`wildcard`:return i(a,{path:`${t.path}{${r.name}*}`,params:[...t.params,r.name]});case`group`:{let e=i(a,t),o=i([...r.tokens,...a],t),s=n(r.tokens),c=o.filter(e=>s.some(t=>e.params.includes(t)));return[...e,...c]}}},a=i(t,{path:``,params:[]}),s=e.params.schema.reduce((e,{name:t},n)=>(e[n]=t,e),{});return a.reduce((e,t)=>{let n=o(`/`,t.path);return e.includes(n)||t.params.every((e,t)=>e===s[t])&&e.push(n),e},[]).sort((e,t)=>r(t)-r(e))},f=(e,t)=>{let r=e.params.resolvedType?.properties?.flatMap(r=>RegExp(`\\\\{${r.name}\\\\*?\\\\}`).test(t)?[{$ref:n(`parameters`,e,e.params.id,r.name)}]:[]);return r?.length?r:void 0},m=(e,t)=>{let r=e.validationDefinitions.find(e=>e.method===t&&e.target===`response`);return Array.isArray(r?.variants)?r.variants.reduce((t,{id:r,status:i,contentType:a,body:o})=>(t[i]=p(i,a)||{description:`Success`,content:{[a||`application/json`]:{schema:o?{$ref:n(`schemas`,e,r)}:{type:`object`}}}},t),{}):{200:{description:`Success - TODO: Add response schema`,content:{\"text/plain\":{schema:{type:`string`}}}}}},h=n=>{let{parameters:r,schemas:i}={parameters:{},schemas:{}};for(let r of n.validationDefinitions)if(r.target===`response`)for(let{id:a,resolvedType:o}of r.variants)o?.typeboxSchema&&(i[t(n,a)]=e(o.typeboxSchema));else if(r.target===`query`){let{id:a,resolvedType:o}=r.schema;for(let r of o?.properties||[])if(r?.typeboxSchema){let o=t(n,a,r.name);i[o]=e(r.typeboxSchema)}}else{let{id:a,resolvedType:o}=r.schema;o?.typeboxSchema&&(i[t(n,a)]=e(o.typeboxSchema))}if(n.params.resolvedType)for(let i of n.params.resolvedType.properties||[])i?.typeboxSchema&&(r[t(n,n.params.id,i.name)]={name:i.name,in:`path`,required:!0,schema:e(i.typeboxSchema)});return{parameters:r,schemas:i}},g=e=>{let t={},r=e.validationDefinitions.flatMap(e=>e.target===`response`?[]:e.schema.resolvedType?[e]:[]);for(let i of a(e))for(let a of e.methods){let o={responses:m(e,a)},s=f(e,i);s&&(o.parameters=s);let c=r.find(e=>e.method===a&&e.target===`query`);if(c?.schema)for(let t of c.schema.resolvedType?.properties||[])o.parameters||=[],o.parameters.push({name:t.name,in:`query`,required:!t.optional,schema:{$ref:n(`schemas`,e,c.schema.id,t.name)}});let l=r.filter(e=>e.method===a&&Object.keys(u).includes(e.target));l.length&&(o.requestBody={required:!0,content:l.reduce((t,r)=>{let{contentType:i=d[r.target]}=r;if(i){let a={$ref:n(`schemas`,e,r.schema.id)};for(let e of[i].flat())t[e]={schema:a}}return t},{})}),t[i]||(t[i]={}),t[i][a.toLowerCase()]=o}return t};return{generateComponentId:t,generateComponentPath:n,generatePathVariations:a,generateOpenAPISchema:e=>{let t=new Map;for(let n of e)t.set(n.name,a(n));let{components:n,paths:r}=e.sort(i).flatMap(n=>{let r=t.get(n.name)??[];return r.length>0&&e.some(e=>{if(e.name===n.name)return!1;let i=t.get(e.name)??[],a=new Set(i);return r.every(e=>a.has(e))})?[]:[n]}).reduce((e,t)=>{let n=g(t),{parameters:r,schemas:i}=h(t);return{paths:{...e.paths,...n},components:{parameters:{...e.components.parameters,...r},schemas:{...e.components.schemas,...i}}}},{paths:{},components:{parameters:{},schemas:{}}});return{paths:r,components:n}}}},p=(e,t)=>{let n={type:`string`,format:`uri`,...t?{enum:[t]}:{}};return{301:{description:`Moved Permanently`,headers:{Location:{description:`New permanent location`,schema:n}}},302:{description:`Found`,headers:{Location:{description:`Temporary location`,schema:n}}},303:{description:`See Other`,headers:{Location:{description:`Location to GET after POST/PUT/DELETE`,schema:n}}},307:{description:`Temporary Redirect`,headers:{Location:{description:`Temporary location (preserves request method)`,schema:n}}},308:{description:`Permanent Redirect`,headers:{Location:{description:`New permanent location (preserves request method)`,schema:n}}}}[e]},m=t((e,t)=>{let{outfile:i=``,...o}={...t},{createPath:s}=n(e),{generateOpenAPISchema:c}=f(),l=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]),{paths:n,components:l}=c(t),u={...JSON.parse(JSON.stringify(o)),paths:n,components:l},d=/ya?ml/.test(i)?a.stringify(u):JSON.stringify(u,null,2);await r(s.src(i),d,{})};return{async watch(e){await l(e)},async build(e){await l(e)}}}),h=e({meta:{name:`OpenAPI`,resolveTypes:!0},factory:m});export{h as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,nestedRoutesFactory as n,pathResolver as r,renderFactory as i,sortRoutes as a}from\"@kosmojs/lib\";import o from\"@vitejs/plugin-react\";import{createTemplateResolver as s,defaults as c}from\"@kosmojs/core\";import{routeRenderHelpers as l}from\"@kosmojs/core/generators\";import{styleText as u}from\"node:util\";var d={type:`module`,private:!0,name:`@kosmojs/react-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/react-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"@vitejs/plugin-react\":`^6.0.5`},devDependencies:{\"@tanstack/react-query\":`^5.101.4`,\"@types/react\":`^19.2.18`,\"@types/react-dom\":`^19.2.4`,\"path-to-regexp\":`^8.4.2`,react:`^19.2.8`,\"react-dom\":`^19.2.8`,\"react-router\":`^8.3.0`}},f=e=>{let t=e.map(e=>e.orig).join(`/`),n=e=>e.kind===`splat`?`*`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[n(e.parts[0])]:(/\\.\\w+$/.test(e.orig)||(console.warn(`❗${u([`red`,`bold`],`WARN`)}: React Router v7 only supports dot-suffix mixed segments (e.g. :param.html).`),console.warn(` ${u([`magenta`],e.orig)} in ${u([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},p=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=n=>n.flatMap(({index:n,layout:r,children:i})=>{let{name:a,pathTokens:o}={...n,...r};if(!o)return[];let s=`${a}:layout`,c=f(o),l=o.at(-1);return e(l)?n&&r?[{name:s,path:c,component:r.id,children:[{name:a,path:`*`,component:n.id}]}]:n?[{path:c,children:[{name:a,path:`*`,component:n.id},...t(i)]}]:r?[{name:s,path:c,component:r.id,children:t(i)}]:[]:n&&r?[{name:s,path:c,component:r.id,children:[{name:a,index:!0,component:n.id},...t(i)]}]:n?[{path:c,children:[{name:a,index:!0,component:n.id},...t(i)]}]:r?[{name:s,path:c,component:r.id,children:t(i)}]:[]});return t},m=()=>{let e=[`🎉 Well done! You just created a new React route.`,`🚀 Success! A fresh React route is ready to roll.`,`🌟 Nice work! Another React route added to your app.`,`⚡ Quick and easy! Your new React route is good to go.`,`🥳 Congrats! Your app just leveled up with a new React route.`,`🧩 All set! A new React route has been scaffolded.`,`🔧 Scaffold complete! Your new React route is in place.`,`✨ Fantastic! Your new React route is ready.`,`🎯 Nailed it! A brand new React route just landed.`,`💫 Awesome! Another React route joins the lineup.`];return e[Math.floor(Math.random()*e.length)]},h=`import type { ReactNode } from \"react\";\n\nexport const AppProvider = ({ children }: { children: ReactNode }) => {\n return children;\n}\n`,g=`import { type QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport type { ReactNode } from \"react\";\n\nimport { getQueryClient } from \"./query\";\n\nexport const AppProvider = ({\n client,\n children,\n}: {\n client?: QueryClient;\n children: ReactNode;\n}) => {\n const queryClient = client ?? getQueryClient();\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n </QueryClientProvider>\n );\n}\n`,_=`import { lazy, type JSX } from \"react\";\n\nimport {\n createRoot,\n hydrateRoot,\n type HydrationOptions,\n type RootOptions,\n} from \"react-dom/client\";\n\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\n\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { loaderFactory } from \"../react\";\n\n{{#each pageEntries}}\nconst {{id}}_component = lazy(() => import(\"{{ createImport 'pages' file }}\"));\nconst {{id}}_loader = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nconst NotFound = lazy(() => import(\"{{ createImport 'pages' '404.tsx' }}\"));\n\nexport const createRoutes = (opt?: { withPreload?: boolean }) => {\n const maybeLoader = loaderFactory(opt);\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"*\",\n Component: NotFound,\n },\n ];\n}\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<Promise<JSX.Element>>,\n root: HTMLElement,\n options?: HydrationOptions,\n) => {\n const { component } = await resolver();\n hydrateRoot(root, component, options);\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<Promise<JSX.Element>>,\n root: HTMLElement,\n options?: RootOptions,\n) => {\n const { component } = await resolver();\n createRoot(root, options).render(component);\n}\n\nexport default clientRenderFactory();\n`,v=`{\n {{#if name}}\n id: \"{{name}}\",\n {{/if}}\n {{#if path}}\n path: \"{{path}}\",\n {{/if}}\n {{#if index}}\n index: true,\n {{/if}}\n {{#if component}}\n Component: {{component}}_component,\n ...maybeLoader({{component}}_loader as never),\n {{/if}}\n {{#if children.length}}\n children: [ {{#each children}}{{> routePartial}}, {{/each}}],\n {{/if}}\n}\n`,y=`import type { JSX } from \"react\";\n\nimport {\n renderToString as renderToStringOrig,\n renderToReadableStream,\n} from \"react-dom/server\";\n\nimport type { StaticHandlerContext } from \"react-router\";\n\nimport type {\n RenderToStringWrapper,\n RenderToStreamWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { loaderFactory } from \"../react\";\n\n{{#each pageEntries}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\nconst {{id}}_component = {{id}}.default;\nconst {{id}}_loader = async () => {{id}};\n{{/each}}\n\nimport NotFound from \"{{ createImport 'pages' '404.tsx' }}\";\n\nexport const createRoutes = (opt?: { withPreload?: boolean }) => {\n const maybeLoader = loaderFactory(opt);\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"*\",\n Component: NotFound,\n },\n ];\n}\n\nexport const renderWrapper: SSRRenderWrapper = (_context, render) => render();\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<Promise<JSX.Element>>,\n Parameters<typeof renderToStringOrig>[1]\n> = async (resolver, { headerTags = [], ...options } = {}) => {\n const { component } = await resolver();\n return {\n head: [...headerTags].join(\"\\\\n\"),\n html: renderToStringOrig(component, options),\n };\n};\n\nexport const renderToStream: RenderToStreamWrapper<\n () => RouterFactoryReturn<Promise<JSX.Element>>,\n Parameters<typeof renderToReadableStream>[1]\n> = async (resolver, { headerTags = [], ...options } = {}) => {\n const { component } = await resolver();\n return {\n head: [...headerTags].join(\"\\\\n\"),\n html: await renderToReadableStream(component, options),\n };\n};\n\nexport default serverRenderFactory();\n`,b=`/* @jsxImportSource react */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n headline?: string;\n}) {\n return (\n <div className={styles.container}>\n <div className={styles.card}>\n\n <h2 className={styles.title}>\n {props.headline || \"404: Not Found\"}\n </h2>\n <br />\n\n <div className={styles.stepsBox}>\n <h2 className={styles.stepsTitle}>\n Something went wrong...\n </h2>\n 🚧 No page found here\n </div>\n\n <div className={styles.footer}>\n <p className={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n className={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,x=`/* @jsxImportSource react */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string }\n}) {\n return (\n <div data-page-route={props.routeName} className={styles.container}>\n <div className={styles.card}>\n\n <h2 className={styles.subtitle}>\n {props.message}\n </h2>\n <br />\n\n <div className={styles.stepsBox}>\n <ul className={styles.stepsList}>\n <li>\n Edit this page at <code>{props.pathMap.page}</code>\n </li>\n <li>\n Create new pages by adding folders in\n <code>{props.pathMap.pages}/</code>\n </li>\n <li>\n Add API endpoints in\n <code>{props.pathMap.api}/</code>\n </li>\n </ul>\n </div>\n\n <div className={styles.footer}>\n <p className={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n className={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,S=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,C=`/* @jsxImportSource react */\n\nimport styles from \"./styles.module.css\";\n\nexport default function WelcomePage() {\n return (\n <div className={styles.container}>\n <div className={styles.card}>\n <div className={styles.header}>\n <div className={styles.icon}>✨</div>\n <h1 className={styles.title}>Welcome to KosmoJS</h1>\n <p className={styles.subtitle}>\n Type-safe full-stack development with Vite\n </p>\n </div>\n\n <div className={styles.featuresBox}>\n <h2 className={styles.featuresTitle}>\n Powered by React and ready to perform\n </h2>\n <div className={styles.featuresSubtitle}>What's included:</div>\n <ul className={styles.featuresList}>\n <li className={styles.featureItem}>\n <span className={styles.featureBullet}>🔹</span>\n Directory-based routing\n </li>\n <li className={styles.featureItem}>\n <span className={styles.featureBullet}>🔹</span>\n End-to-End Type Safety\n </li>\n <li className={styles.featureItem}>\n <span className={styles.featureBullet}>🔹</span>\n Generated Fetch Clients\n </li>\n </ul>\n </div>\n\n <div className={styles.stepsBox}>\n <h2 className={styles.stepsTitle}>Next Steps 🢂</h2>\n <ul className={styles.stepsList}>\n <li>\n Edit this page at <code>pages/index/index.tsx</code>\n </li>\n <li>Create new routes by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div className={styles.footer}>\n <p className={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n className={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,w=`import { QueryClient, type QueryClientConfig } from \"@tanstack/react-query\";\n\nlet client: QueryClient | undefined;\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n client = new QueryClient(options);\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n if (!client) {\n client = new QueryClient();\n }\n return client;\n};\n`,T=`import { QueryClient, type QueryClientConfig } from \"@tanstack/react-query\";\n\nimport { store } from \"{{ createImport 'lib' '@ssr/base' }}\";\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n const client = new QueryClient(options);\n const ctx = store?.getStore();\n if (ctx) {\n ctx.tsqClient = client;\n }\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n const ctx = store?.getStore();\n if (!ctx) {\n throw new Error(\"getQueryClient(): called outside an SSR request scope\");\n }\n if (!ctx.tsqClient) {\n ctx.tsqClient = new QueryClient();\n }\n return ctx.tsqClient as QueryClient;\n};\n`,E=`export type ComponentLoader = () => Promise<{\n loader?: (arg: unknown) => Promise<unknown>;\n}>;\n\nexport const loaderFactory = (opt?: { withPreload?: boolean }) => {\n return (componentLoader: ComponentLoader) => {\n const loader = async (arg: unknown) => {\n const component = await componentLoader();\n // Return null, not undefined, when a route has no loader.\n // React Router keys hydration data by route id;\n // an undefined value is dropped by JSON.stringify during serialization,\n // leaving the id absent, which makes RR re-run the loader on the client and double-render.\n // null survives serialization, so the id stays present.\n return typeof component.loader === \"function\"\n ? await component.loader(arg)\n : null;\n };\n return opt?.withPreload ? { loader } : {};\n };\n};\n`,D=`import type { JSX, ComponentType } from \"react\";\n\nimport {\n type RouteObject,\n createBrowserRouter,\n createStaticHandler,\n createStaticRouter,\n RouterProvider,\n StaticRouterProvider,\n} from \"react-router\";\n\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nexport const createRouters = (\n routes: Array<RouteObject>,\n { app }: { app: ComponentType },\n): {\n clientRouter: () => RouterFactoryReturn<Promise<JSX.Element>>;\n serverRouter: (url: URL) => RouterFactoryReturn<Promise<JSX.Element>>;\n} => {\n const routeStack = [\n {\n path: \"/\",\n Component: app,\n children: routes,\n },\n ];\n\n const handler = createStaticHandler(routeStack, { basename: base });\n\n const clientRouter = async () => {\n const router = createBrowserRouter(routeStack, { basename: base });\n const component = <RouterProvider router={router} />;\n return { component };\n }\n\n const serverRouter = async (url: URL) => {\n\n const context = await handler.query(new Request(url.href));\n\n if (context instanceof Response) {\n // handled by SSR server\n throw context;\n }\n\n const router = createStaticRouter(routeStack, context);\n const component = <StaticRouterProvider router={router} context={context} />;\n\n return { component };\n }\n\n return { clientRouter, serverRouter }\n}\n\nexport default createRouterFactory<RouteObject, Promise<JSX.Element>>();\n`,O=`import { Outlet } from \"react-router\";\nimport { AppProvider } from \"{{ createImport 'lib' 'app' }}\";\n\nexport default function App() {\n return (\n <AppProvider>\n <Outlet />\n </AppProvider>\n );\n}\n`,k=`import {\n type LinkProps as RouterLinkProps,\n Link as RouterLink,\n} from \"react-router\";\nimport type { ReactNode } from \"react\";\n\nimport { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\nexport default function Link(\n props: Omit<RouterLinkProps, \"to\"> & {\n to: LinkProps;\n query?: Record<string | number, unknown>;\n children: ReactNode;\n },\n) {\n const { to, query, children, ...restProps } = props;\n\n const href = () => {\n const [key, ...params] = to;\n return pageRouteMap[key]?.base(params as never, query);\n };\n\n return (\n <RouterLink {...restProps} to={href()}>\n {children}\n </RouterLink>\n );\n}\n`,A=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes({ withPreload: true });\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,j=`import renderFactory, {\n createRoutes,\n renderToStream,\n renderToString,\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes({ withPreload: true });\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n renderToStream(url, { assets }) {\n return renderToStream(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,M=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,N=`import PageSample from \"{{ createImport 'lib' 'pageSamples/404.tsx' }}\";\n\nexport default function Page() {\n return <PageSample />;\n}\n`,P=`import { Outlet } from \"react-router\";\n\nexport default function Layout() {\n return <Outlet />;\n}\n`,F=`import PageSample from \"{{ createImport 'lib' 'pageSamples/page.tsx' }}\";\n\nexport default function Page() {\n return PageSample({\n message: \"{{message}}\",\n routeName: \"{{route.name}}\",\n pathMap: {\n page: \"{{ createImport 'pages' route.file }}\",\n pages: \"{{ createImport 'pages' }}\",\n api: \"{{ createImport 'api' }}\",\n },\n });\n}\n`,I=`export { default } from \"{{ createImport 'lib' 'pageSamples/welcome.tsx' }}\";\n`,L=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\n\nimport app from \"./app\";\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, { app });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,R=t((e,t)=>{let{createPath:u,createImportHelpers:d}=r(e),{renderToFile:f}=i({helpers:{...d({origin:`lib`}),...l()},partials:{routePartial:v}}),{renderToFile:R}=i({helpers:d({origin:`src`})}),z=p(),B=e=>!e?.trim().length,V=s(t?.templates,F),H=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await R(u.pages(n.file),n.name===`index`?I:V(n.name,n),{route:n,message:m()},{overwrite:B}):t===`pageLayout`&&await R(u.pages(n.file),P,{route:n},{overwrite:B})},U=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(a),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=z(n(r));for(let[e,t]of[[`client.ts`,_],[`server.ts`,y]])await f(u.libEntry(e),t,{pageEntries:r,nestedRoutes:i});await f(u.lib(`router.tsx`),D,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[o(n)]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`react.ts`,E],[`pageSamples/styles.module.css`,S],[`pageSamples/welcome.tsx`,C],[`pageSamples/page.tsx`,x],[`pageSamples/404.tsx`,b],...t?.tanstack?.query?[[`app.tsx`,g],[`query.ts`,w]]:[[`app.tsx`,h],[`query.ts`,`/** tanstack query disabled */`]]])await f(u.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,N],[`components/Link.tsx`,k],[`app.tsx`,O],[`router.ts`,L]])await R(u.src(e),t,{entryDir:c.entryDir},{overwrite:B});await R(u.src(`index.html`),M,{entryDir:c.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,A],[`server.ts`,j]])await R(u.entry(e),t,{},{overwrite:B})},async watch(e,t){(!t||t.kind===`create`)&&await H(e),await U(e)},async build(e){await H(e),await U(e)},async ssrBuild(){await f(u.lib(`query.ts`),t?.tanstack?.query?T:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),z=e({meta:{name:`React`,jsx:`preserve`,jsxImportSource:`react`},dependencies(e){return{react:d.devDependencies.react,\"react-router\":d.devDependencies[`react-router`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{\"@tanstack/react-query\":d.devDependencies[`@tanstack/react-query`]}:{}}},devDependencies:{\"@types/react\":d.devDependencies[`@types/react`],\"@types/react-dom\":d.devDependencies[`@types/react-dom`],\"react-dom\":d.devDependencies[`react-dom`]},factory:R});export{z as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,nestedRoutesFactory as n,pathResolver as r,renderFactory as i,sortRoutes as a}from\"@kosmojs/lib\";import o from\"vite-plugin-solid\";import{createTemplateResolver as s,defaults as c}from\"@kosmojs/core\";import{routeRenderHelpers as l}from\"@kosmojs/core/generators\";import{styleText as u}from\"node:util\";var d={type:`module`,private:!0,name:`@kosmojs/solid-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/solid-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"vite-plugin-solid\":`^2.11.14`},devDependencies:{\"@solidjs/router\":`^1.0.0`,\"@tanstack/solid-query\":`^5.101.4`,\"path-to-regexp\":`^8.4.2`,\"solid-js\":`^1.9.14`}},f=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=t=>t?.kind===`param`?t.parts[0]?.kind===`optional`||e(t):!1,n=r=>r.flatMap(({index:r,layout:i,children:a})=>{let{pathTokens:o}={...r,...i},s=p(o.map((e,n)=>e.kind===`param`&&(t(o[n+1])||a.some(e=>e.index?.pathTokens.some(t)))?{...e,parts:[{...e.parts[0],kind:`required`}]}:e)),c=o.at(-1);if(e(c)){let e=p([c]);return r&&i?[{path:s,component:i.id,children:[{path:e,component:r.id}]}]:r?[{path:s,children:[{path:e,component:r.id},...n(a)]}]:i?[{path:s,component:i.id,children:n(a)}]:[]}return r&&i?[{path:s,component:i.id,children:[{path:`/`,component:r.id},...n(a)]}]:r?[{path:s,children:[{path:`/`,component:r.id},...n(a)]}]:i?[{path:s,component:i.id,children:n(a)}]:[]});return n},p=e=>{let t=e.map(e=>e.orig).join(`/`),n=e=>e.kind===`splat`?`*${e.name}`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[n(e.parts[0])]:(e.parts.length&&(console.warn(`❗${u([`red`,`bold`],`WARN`)}: At the moment Solid Router does not support mixed path segments.`),console.warn(` ${u([`magenta`],e.orig)} segment in ${u([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},m=()=>{let e=[`🎉 Well done! You just created a new Solid route.`,`🚀 Success! A fresh Solid route is ready to roll.`,`🌟 Nice work! Another Solid route added to your app.`,`🧩 All set! A new Solid route has been scaffolded.`,`🔧 Scaffold complete! Your new Solid route is in place.`,`✅ Built! Your Solid route is scaffolded and ready.`,`✨ Fantastic! Your new Solid route is good to go.`,`🎯 Nailed it! A brand new Solid route just landed.`,`💫 Awesome! Another Solid route joins the party.`,`⚡ Lightning fast! A new Solid route created successfully.`];return e[Math.floor(Math.random()*e.length)]},h=`import type { ParentComponent } from \"solid-js\";\n\nexport const AppProvider: ParentComponent = (props) => {\n return props.children;\n};\n`,g=`import type { ParentComponent } from \"solid-js\";\nimport { type QueryClient, QueryClientProvider } from \"@tanstack/solid-query\";\n\nimport { getQueryClient } from \"./query\";\n\nexport const AppProvider: ParentComponent<{ client?: QueryClient }> = (props) => {\n return (\n <QueryClientProvider client={props.client ?? getQueryClient()}>\n {props.children}\n </QueryClientProvider>\n );\n};\n`,_=`import { lazy, type JSX } from \"solid-js\";\nimport { hydrate as hydrateOrig, render } from \"solid-js/web\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { loaderFactory } from \"../solid\";\n\n{{#each pageEntries}}\nconst {{id}}_component = lazy(() => import(\"{{ createImport 'pages' file }}\"));\nconst {{id}}_loader = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nconst NotFound = lazy(() => import(\"{{ createImport 'pages' '404.tsx' }}\"));\n\nexport const createRoutes = (opt?: { withPreload?: boolean }) => {\n const maybeLoader = loaderFactory(opt);\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"*\",\n component: NotFound,\n },\n ];\n}\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<JSX.Element>,\n root: HTMLElement,\n opts?: Parameters<typeof hydrateOrig>[2],\n) => {\n hydrateOrig(() => resolver().component, root, opts);\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<JSX.Element>,\n root: HTMLElement,\n init?: Parameters<typeof render>[2],\n opts?: Parameters<typeof render>[3],\n) => {\n render(() => resolver().component, root, init, opts);\n}\n\nexport default clientRenderFactory();\n`,v=`{\n path: \"{{path}}\",\n {{#if component}}\n component: {{component}}_component,\n ...maybeLoader({{component}}_loader as never),\n {{/if}}\n {{#if children.length}}\n children: [ {{#each children}}{{> routePartial}}, {{/each}}],\n {{/if}}\n}\n`,y=`import type { JSX } from \"solid-js\";\n\nimport {\n generateHydrationScript,\n renderToStringAsync,\n renderToStream as renderToStreamOrig,\n} from \"solid-js/web\";\n\nimport { provideRequestEvent } from \"solid-js/web/storage\";\n\nimport type {\n RenderToStringWrapper,\n RenderToStreamWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { loaderFactory } from \"../solid\";\n\n{{#each pageEntries}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\nconst {{id}}_component = {{id}}.default;\nconst {{id}}_loader = async () => {{id}};\n{{/each}}\n\nimport NotFound from \"{{ createImport 'pages' '404.tsx' }}\";\n\nexport const createRoutes = (opt?: { withPreload?: boolean }) => {\n const maybeLoader = loaderFactory(opt);\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"*\",\n component: NotFound,\n },\n ];\n}\n\nexport const renderWrapper: SSRRenderWrapper = (context, render) => {\n const event = {\n request: new Request(context.url ?? \"http://ssr.local\", {\n headers: new Headers(context.headers),\n }),\n locals: {},\n };\n return provideRequestEvent(event as never, render);\n};\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<JSX.Element>,\n Parameters<typeof renderToStringAsync>[1]\n> = async (resolver, { headerTags = [], ...options } = {}) => {\n return {\n head: [...headerTags, generateHydrationScript()].join(\"\\\\n\"),\n html: await renderToStringAsync(() => resolver().component, options),\n };\n};\n\nexport const renderToStream: RenderToStreamWrapper<\n () => RouterFactoryReturn<JSX.Element>,\n Parameters<typeof renderToStreamOrig>[1]\n> = async (resolver, { headerTags = [], ...options } = {}) => {\n const stream = renderToStreamOrig(() => resolver().component, options);\n const { readable, writable } = new TransformStream<string, string>();\n /**\n * On failure, pipeTo aborts the writable, which errors the readable side\n * and surfaces the error to the stream consumer; catching here only keeps\n * the rejection from escaping as an unhandled one.\n * */\n stream.pipeTo(writable).catch(() => {});\n return {\n head: [...headerTags, generateHydrationScript()].join(\"\\\\n\"),\n html: readable,\n };\n};\n\nexport default serverRenderFactory<true>();\n`,b=`/* @jsxImportSource solid-js */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n headline?: string;\n}) {\n return (\n <div class={styles.container}>\n <div class={styles.card}>\n\n <h2 class={styles.title}>\n {props.headline || \"404: Not Found\"}\n </h2>\n <br />\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>\n Something went wrong...\n </h2>\n 🚧 No page found here\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,x=`/* @jsxImportSource solid-js */\n\nimport styles from \"./styles.module.css\";\n\nexport default function PageSample(props: {\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string }\n}) {\n return (\n <div data-page-route={props.routeName} class={styles.container}>\n <div class={styles.card}>\n\n <h2 class={styles.subtitle}>\n {props.message}\n </h2>\n <br />\n\n <div class={styles.stepsBox}>\n <ul class={styles.stepsList}>\n <li>\n Edit this page at <code>{props.pathMap.page}</code>\n </li>\n <li>\n Create new pages by adding folders in\n <code>{props.pathMap.pages}/</code>\n </li>\n <li>\n Add API endpoints in\n <code>{props.pathMap.api}/</code>\n </li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,S=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,C=`/* @jsxImportSource solid-js */\n\nimport styles from \"./styles.module.css\";\n\nexport default function WelcomePage() {\n return (\n <div class={styles.container}>\n <div class={styles.card}>\n <div class={styles.header}>\n <div class={styles.icon}>✨</div>\n <h1 class={styles.title}>Welcome to KosmoJS</h1>\n <p class={styles.subtitle}>\n Type-safe full-stack development with Vite\n </p>\n </div>\n\n <div class={styles.featuresBox}>\n <h2 class={styles.featuresTitle}>\n Powered by SolidJS and ready to perform\n </h2>\n <div class={styles.featuresSubtitle}>What's included:</div>\n <ul class={styles.featuresList}>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Directory-based routing\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n End-to-End Type Safety\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Generated Fetch Clients\n </li>\n </ul>\n </div>\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>Next Steps 🢂</h2>\n <ul class={styles.stepsList}>\n <li>\n Edit this page at <code>pages/index/index.tsx</code>\n </li>\n <li>Create new routes by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation ➜\n </a>\n </div>\n </div>\n </div>\n );\n}\n`,w=`import { QueryClient, type QueryClientConfig } from \"@tanstack/solid-query\";\n\nlet client: QueryClient | undefined;\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n client = new QueryClient(options);\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n if (!client) {\n client = new QueryClient();\n }\n return client;\n};\n`,T=`import { QueryClient, type QueryClientConfig } from \"@tanstack/solid-query\";\n\nimport { store } from \"{{ createImport 'lib' '@ssr/base' }}\";\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n const client = new QueryClient(options);\n const ctx = store?.getStore();\n if (ctx) {\n ctx.tsqClient = client;\n }\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n const ctx = store?.getStore();\n if (!ctx) {\n throw new Error(\"getQueryClient(): called outside an SSR request scope\");\n }\n if (!ctx.tsqClient) {\n ctx.tsqClient = new QueryClient();\n }\n return ctx.tsqClient as QueryClient;\n};\n`,E=`import type { JSX, ParentComponent } from \"solid-js\";\nimport { Router, type RouteDefinition } from \"@solidjs/router\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nexport const createRouters = (\n routes: Array<RouteDefinition>,\n { app }: { app: ParentComponent },\n): {\n clientRouter: () => RouterFactoryReturn<JSX.Element>;\n serverRouter: (url: URL) => RouterFactoryReturn<JSX.Element>;\n} => {\n const clientRouter = () => {\n const component = (\n <Router root={app} base={base}>\n {routes}\n </Router>\n );\n return { component };\n }\n\n const serverRouter = (url: URL) => {\n const component = (\n <Router root={app} base={base} url={url.pathname + url.search}>\n {routes}\n </Router>\n );\n return { component };\n }\n\n return { clientRouter, serverRouter };\n}\n\nexport default createRouterFactory<RouteDefinition, JSX.Element>();\n`,D=`export type ComponentLoader = () => Promise<{\n preload?: () => Promise<unknown>;\n}>;\n\nexport const loaderFactory = (opt?: { withPreload?: boolean }) => {\n return (componentLoader: ComponentLoader) => {\n const preload = async () => {\n const component = await componentLoader();\n return typeof component.preload === \"function\"\n ? component.preload\n : undefined;\n };\n return opt?.withPreload ? { preload } : {};\n };\n};\n`,O=`export type MaybeWrapped<T> = import(\"solid-js/store\").Store<T> | T;\n\nexport { unwrap } from \"solid-js/store\";\n`,k=`import type { ParentComponent } from \"solid-js\";\nimport { AppProvider } from \"{{ createImport 'lib' 'app' }}\";\n\nconst App: ParentComponent = (props) => {\n return <AppProvider>{props.children}</AppProvider>;\n};\n\nexport default App;\n`,A=`import { A, type AnchorProps } from \"@solidjs/router\";\nimport { type JSXElement, splitProps } from \"solid-js\";\n\nimport { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\nexport default function Link(\n props: Omit<AnchorProps, \"href\"> & {\n to: LinkProps;\n query?: Record<string | number, unknown>;\n children: JSXElement;\n },\n) {\n const [knownProps, restProps] = splitProps(props, [\n \"to\",\n \"query\",\n \"children\",\n ]);\n\n const href = () => {\n const [key, ...params] = knownProps.to;\n return pageRouteMap[key]?.base(params as never, knownProps.query);\n };\n\n return <A {...{ ...restProps, href: href() }}>{knownProps.children}</A>;\n}\n`,j=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes({ withPreload: true });\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,M=`import renderFactory, {\n createRoutes,\n renderToStream,\n renderToString,\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes({ withPreload: true });\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n renderToStream(url, { assets }) {\n return renderToStream(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,N=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,P=`import PageSample from \"{{ createImport 'lib' 'pageSamples/404.tsx' }}\";\n\nexport default function Page() {\n return <PageSample />;\n}\n`,F=`import type { ParentComponent } from \"solid-js\";\n\nconst Layout: ParentComponent = (props) => {\n return props.children;\n};\n\nexport default Layout;\n`,I=`import PageSample from \"{{ createImport 'lib' 'pageSamples/page.tsx' }}\";\n\nexport default function Page() {\n return PageSample({\n message: \"{{message}}\",\n routeName: \"{{route.name}}\",\n pathMap: {\n page: \"{{ createImport 'pages' route.file }}\",\n pages: \"{{ createImport 'pages' }}\",\n api: \"{{ createImport 'api' }}\",\n },\n });\n}\n`,L=`export { default } from \"{{ createImport 'lib' 'pageSamples/welcome.tsx' }}\";\n`,R=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\n\nimport app from \"./app\";\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, { app });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,z=t((e,t)=>{let{generators:u=[]}=e.config,{createPath:d,createImportHelpers:p}=r(e),{renderToFile:z}=i({helpers:{...p({origin:`lib`}),...l()},partials:{routePartial:v}}),{renderToFile:B}=i({helpers:p({origin:`src`})}),V=f(),H=e=>!e?.trim().length,U=s(t?.templates,I),W=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await B(d.pages(n.file),n.name===`index`?L:U(n.name,n),{route:n,message:m()},{overwrite:H}):t===`pageLayout`&&await B(d.pages(n.file),F,{route:n},{overwrite:H})},G=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(a),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=V(n(r));for(let[e,t]of[[`client.ts`,_],[`server.ts`,y]])await z(d.libEntry(e),t,{pageEntries:r,nestedRoutes:i});await z(d.lib(`router.tsx`),E,{entries:e,indexRoutes:t})};return{config({command:e}){let{templates:n,...r}={...t};return{oxc:{jsx:{importSource:`solid-js`}},plugins:e===`build`?[o({...r,...u.some(e=>e.meta.slot===`ssr`)?{ssr:!0,solid:{...r?.solid,hydratable:!0}}:{}})]:[o({...r,dev:!0,hot:!0})]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`solid.ts`,D],[`unwrap.ts`,O],[`pageSamples/styles.module.css`,S],[`pageSamples/welcome.tsx`,C],[`pageSamples/page.tsx`,x],[`pageSamples/404.tsx`,b],...t?.tanstack?.query?[[`app.tsx`,g],[`query.ts`,w]]:[[`app.tsx`,h],[`query.ts`,`/** tanstack query disabled */`]]])await z(d.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,P],[`components/Link.tsx`,A],[`app.tsx`,k],[`router.ts`,R]])await B(d.src(e),t,{entryDir:c.entryDir},{overwrite:H});await B(d.src(`index.html`),N,{entryDir:c.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,j],[`server.ts`,M]])await B(d.entry(e),t,{},{overwrite:H})},async watch(e,t){(!t||t.kind===`create`)&&await W(e),await G(e)},async build(e){await W(e),await G(e)},async ssrBuild(){await z(d.lib(`query.ts`),t?.tanstack?.query?T:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),B=e({meta:{name:`SolidJS`,jsx:`preserve`,jsxImportSource:`solid-js`},dependencies(e){return{\"solid-js\":d.devDependencies[`solid-js`],\"@solidjs/router\":d.devDependencies[`@solidjs/router`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{\"@tanstack/solid-query\":d.devDependencies[`@tanstack/solid-query`]}:{}}},factory:z});export{B as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,mergeConfigs as n,pathResolver as r,spinnerFactory as i,vitePlugins as a}from\"@kosmojs/lib\";import{access as o,constants as s,cp as c,mkdir as l,rm as u,writeFile as d}from\"node:fs/promises\";import{join as f,resolve as p}from\"node:path\";import{styleText as m}from\"node:util\";import{build as h}from\"vite\";var g=t(e=>{let{generators:t=[],refineTypeName:g,...v}={...e.config},{createPath:y}=r(e);return{async postBuild(){let r=y.distDir(`ssg`),g=p(r,`../ssr/server.js`);if(!await o(g,s.F_OK).then(()=>!0,()=>!1)){console.error(),console.error(m(`red`,`❗Please enable ssrGenerator in ${e.name}/kosmo.config.ts`)),console.error(` SSG generator can not run without SSR server`),console.error();return}let b=i(`${e.name}: SSG`);b.append(`preparing...`);let{createDisposableServer:x}=await import(g);await c(p(r,`../client/assets`),f(r,`assets`),{recursive:!0}),b.append(`bundling routes...`),await h(n(v,...t.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:y.lib(),appType:`custom`,plugins:[a.tsconfigPaths(e),a.nodePrefix()],resolve:{conditions:[`node`]},build:{ssr:y.lib(`ssg.ts`),target:`esnext`,sourcemap:!1,emptyOutDir:!0,rolldownOptions:{output:{dir:r,entryFileNames:`routes.js`,format:`esm`}}}}));try{let e=await import(f(r,`routes.js`)).then(e=>e.default);x(async t=>{for(let[n,i]of e.entries()){b.append(`[ ${n+1} of ${e.length} ] ${i}`);let a=await _(t,i);a!==void 0&&(await l(f(r,i),{recursive:!0}),await d(f(r,f(i,`index.html`)),a,`utf8`))}b.succeed(`done ✨`)})}finally{await u(`${r}/routes.js`)}}}}),_=async(e,t)=>{try{let n=`http://localhost:${e}${t}`;return await(await fetch(n)).text()}catch(e){console.error(m(`red`,`✗ SSG: Failed generating ${t} route: ${e.message}`));return}},v=e({meta:{name:`SSG`,slot:`ssg`},factory:g});export{v as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,mergeConfigs as n,pathResolver as r,renderFactory as i,sortRoutes as a,vitePlugins as o}from\"@kosmojs/lib\";import{cp as s,rm as c}from\"node:fs/promises\";import{join as l,resolve as u}from\"node:path\";import{build as d}from\"vite\";import{createRouteResolver as f}from\"@kosmojs/core\";var p={type:`module`,private:!0,name:`@kosmojs/ssr-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,vite:`^8.2.1`},devDependencies:{\"@hono/node-server\":`^2.1.0`,hono:`^4.13.1`,\"light-my-request\":`^6.6.0`,tinyglobby:`^0.2.17`}},m=`{{#if apiGenerator}}\nexport { default as apiApp } from \"{{ createImport 'api' 'app' }}\";\n{{else}}\nexport const apiApp = undefined;\n{{/if}}\n`,h=`import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { FetchApp, NodeApp } from \"@kosmojs/core\";\n\nexport type RequestContext = {\n headers?: HeadersInit;\n tsqClient?: unknown;\n error?: unknown;\n};\n\nexport const redirectCodes = [\n // Moved Permanently\n 301,\n // Found (temporary)\n 302,\n // See Other (redirect after POST)\n 303,\n // Temporary Redirect (preserves method)\n 307,\n // Permanent Redirect (preserves method)\n 308,\n];\n\n/**\n * Origin used to absolutize the relative URLs the client produces.\n * Never resolved over the network; the host part is irrelevant to\n * route matching in both Hono and Koa.\n * */\nexport const ssrOrigin = \"http://ssr.local\";\n\n/**\n * Maximum redirect hops, mirroring the fetch spec limit.\n * */\nexport const maxRedirects = 5;\n\n/**\n * Request-scoped context store.\n * Server-only module - never reaches browser bundles.\n * */\nexport const store = new AsyncLocalStorage<RequestContext>();\n\nexport const isFetchApp = (app: FetchApp | NodeApp): app is FetchApp => {\n return typeof (app as FetchApp).fetch === \"function\";\n};\n`,g=`import { type RequestContext, store } from \"./base\";\n\nimport { renderWrapper } from \"{{ createImport 'libEntry' 'server' }}\";\n\nexport { default as ssrApp } from \"{{ createImport 'entry' 'server' }}\";\nexport { apiApp } from \"{{ createImport 'lib' '@ssr/api' }}\";\n\n/**\n * Wraps a render call, making the given context visible to every\n * fetch dispatch that happens during it - across await points,\n * stream chunks and parallel component data loads.\n * */\nexport const withSsrContext = <T>(\n context: RequestContext,\n render: () => T,\n): T => {\n return store.run(context, () => renderWrapper(context, render));\n};\n\nexport const errorProvider = () => {\n return store.getStore()?.error;\n};\n`,_=`import { inject } from \"light-my-request\";\n\nimport type { FetchApp, NodeApp } from \"@kosmojs/core\";\nimport type { Transport } from \"@kosmojs/core/fetch\";\n\nimport {\n isFetchApp,\n maxRedirects,\n redirectCodes,\n ssrOrigin,\n store,\n} from \"./base\";\n\nimport { apiApp } from \"{{ createImport 'lib' '@ssr/api' }}\";\n\n/**\n * HeadersProvider for createTransport.\n * */\nconst headersProvider = (): HeadersInit | undefined => {\n return store.getStore()?.headers;\n};\n\nconst createDispatch = (app: FetchApp | NodeApp) => {\n return isFetchApp(app)\n ? app.fetch\n : async (request: Request): Promise<Response> => {\n /**\n * Node dispatch: serializes the web Request into light-my-request's\n * injection format and lifts the injected response back into a web Response.\n * */\n const url = new URL(request.url);\n\n const payload = [\"GET\", \"HEAD\"].includes(request.method)\n ? undefined\n : Buffer.from(await request.arrayBuffer());\n\n const result = await inject(app.callback() as never, {\n method: request.method as never,\n url: url.pathname + url.search,\n headers: Object.fromEntries(request.headers),\n ...(payload?.length ? { payload } : {}),\n });\n\n const headers = new Headers();\n\n for (const [key, value] of Object.entries(result.headers)) {\n for (const entry of Array.isArray(value) ? value : [value]) {\n if (entry !== undefined) {\n headers.append(key, String(entry));\n }\n }\n }\n\n /**\n * 204/304 responses must not carry a body per the Response\n * constructor contract.\n * */\n const body = [204, 304].includes(result.statusCode)\n ? null\n : new Uint8Array(result.rawPayload);\n\n return new Response(body, {\n status: result.statusCode,\n statusText: result.statusMessage,\n headers,\n });\n };\n};\n\nconst createTransport = (app: FetchApp | NodeApp): Transport => {\n const dispatch = createDispatch(app);\n\n /**\n * Build a fetch-compatible transport that dispatches requests\n * directly into the given app - no sockets, no interception.\n * Redirects are followed in-process, including the 303 and 301/302 method rewrite to GET.\n * */\n return async (input, init) => {\n /**\n * Request-scoped headers act as defaults: anything set explicitly\n * on the call itself wins over forwarded values.\n * */\n const headers = new Headers(init?.headers);\n\n // When the body is FormData, the Request constructor sets a multipart\n // Content-Type with a fresh boundary. A forwarded Content-Type default would\n // override that boundary and desync it from the serialized body, so never\n // forward Content-Type for FormData bodies.\n const isFormBody = init?.body instanceof FormData;\n\n for (const [key, value] of new Headers(headersProvider() || undefined)) {\n if (isFormBody && key.toLowerCase() === \"content-type\") {\n continue;\n }\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n }\n\n let request = new Request(new URL(String(input), ssrOrigin), {\n ...init,\n headers,\n });\n\n /**\n * Bodies are buffered once so they can be replayed across\n * 307/308 hops; the client only ever sends strings, FormData\n * and buffer-ish payloads, so this is safe and cheap.\n * */\n const body = [\"GET\", \"HEAD\"].includes(request.method)\n ? undefined\n : await request.arrayBuffer();\n\n for (let hop = 0; ; hop++) {\n if (hop === maxRedirects) {\n throw new TypeError(\"Failed to fetch: too many redirects\");\n }\n\n const response = await dispatch(\n body === undefined || request.method === \"GET\"\n ? new Request(request, { body: null })\n : new Request(request, { body }),\n );\n\n const location = response.headers.get(\"location\");\n\n if (!location || !redirectCodes.includes(response.status)) {\n return response;\n }\n\n const method =\n response.status === 303 ||\n ([301, 302].includes(response.status) && request.method === \"POST\")\n ? \"GET\"\n : request.method;\n\n request = new Request(new URL(location, request.url), {\n method,\n headers: request.headers,\n });\n }\n };\n};\n\nconst ssrTransport = apiApp ? createTransport(apiApp) : undefined;\n\nexport const transport = ssrTransport\n ? async (input: RequestInfo | URL, init?: RequestInit) => {\n try {\n const response = await ssrTransport(input, init);\n if (response?.ok) {\n return response;\n }\n // the rethrow here needed cause ssrTransport does not throw on non-2xx responses\n throw new SSRFetchError([\n input,\n response,\n typeof response?.text === \"function\"\n ? await response.text()\n : response?.statusText,\n ]);\n } catch (error) {\n /**\n * Capture the fetch error at the transport level and stash it on the request store.\n * Some frameworks - Solid notably - swallow a rejecting loader and still emit a partial render tree.\n * Storing the error here keeps it observable regardless of how the framework handles the loader rejection.\n * */\n const storage = store.getStore();\n if (storage) {\n storage.error = error;\n }\n throw error;\n }\n }\n : undefined; // let fetch clients pick the transport\n\nclass SSRFetchError extends Error {\n constructor([input, response, message]: [\n input: RequestInfo | URL,\n response: Response,\n message: string | undefined,\n ]) {\n const pathname = pathnameOf(input);\n const status = response.status ?? \"unknown\";\n super(\\`\\${pathname}: \\${status} [ \\${message} ]\\`.trim());\n this.name = \"SSRFetchError\";\n }\n}\n\nconst pathnameOf = (input: RequestInfo | URL): string => {\n try {\n if (typeof input === \"string\") {\n return new URL(input, \"http://x\").pathname;\n }\n if (input instanceof URL) {\n return input.pathname;\n }\n if (input instanceof Request) {\n return new URL(input.url).pathname;\n }\n } catch {}\n return String(input);\n};\n`,v=`export const routeMap = [\n{{#each pageRoutes}}\n { pathPattern: \"{{honoPattern}}\", renderMode: \"{{renderMode}}\" },\n{{/each}}\n];\n`,y=`import { access, chmod, constants, readFile, unlink } from \"node:fs/promises\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { extname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseArgs, styleText } from \"node:util\";\n\nimport { createAdaptorServer, getRequestListener } from \"@hono/node-server\";\nimport { type Context, Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { stream } from \"hono/streaming\";\nimport { glob } from \"tinyglobby\";\n\nimport type { FetchApp, NodeApp, SSRSetup } from \"@kosmojs/core\";\n\nimport { isFetchApp, redirectCodes, ssrOrigin } from \"./@ssr/base\";\n\nimport { routeMap } from \"{{ createImport 'lib' '@ssr/routes' }}\";\nimport { apiBase, base } from \"{{ createImport 'libCore' }}\";\n\nconst ROOT = import.meta.dirname;\n\ntype AssetInfo = {\n file: string;\n // Raw file contents kept in memory for fast, zero-I/O responses.\n buffer: Uint8Array;\n // HTTP Content-Type header for this asset (derived from extension).\n contentType: string;\n // Cached size to set Content-Length without re-measuring the buffer.\n size: number;\n};\n\nexport const createApp = async () => {\n // Import the SSR entry produced by Vite's ssr build.\n const {\n ssrApp,\n withSsrContext,\n errorProvider,\n }: {\n ssrApp: SSRSetup;\n withSsrContext: <T>(\n context: { headers?: Record<string, string>; url?: string },\n render: () => T,\n ) => Promise<T>;\n errorProvider: () => Error | undefined;\n } = await import(\\`\\${ROOT}/app.js\\`);\n\n // Read the client index.html that includes <!--app-head--> and <!--app-html-->\n // placeholders used for SSR injection.\n const template = await readFile(\\`\\${ROOT}/index.html\\`, \"utf8\");\n\n // Load the Vite manifest\n const manifest = await import(\\`\\${ROOT}/.vite/manifest.json\\`, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const { renderToString, renderToStream } = ssrApp;\n const [htmlStart, htmlEnd] = template.split(\"<!--app-html-->\");\n\n const assets = await loadAssets(ROOT);\n\n const ssrOptions = () => {\n const cssAssets = [...assets.entries()].flatMap(\n ([path, { file, buffer, size }]) => {\n // Vite is naming assets by entry name\n if (!/^__kosmo_ssr_bundle-.+\\\\.css$/i.test(file)) {\n return [];\n }\n\n // skip if template contains a file with same hash\n if (template.includes(file.replace(/^__kosmo_ssr_bundle\\\\b/, \"\"))) {\n return [];\n }\n\n return [\n {\n kind: \"css\" as const,\n tag: \\`<link rel=\"stylesheet\" crossorigin href=\"\\${path}\" />\\`,\n content: new TextDecoder().decode(buffer),\n size,\n path,\n },\n ];\n },\n );\n\n const content = \"window.__KOSMO_HYDRATION_BOOL__ = true;\";\n\n return {\n template,\n manifest,\n assets: [\n ...cssAssets,\n {\n kind: \"js\" as const,\n tag: \\`<script>\\${content}<\\/script>\\`,\n content,\n size: content.length,\n },\n ],\n };\n };\n\n const renderPage = async (url: URL, ctx: Context) => {\n const {\n head = \"\",\n html,\n error,\n } = await withSsrContext(\n {\n headers: Object.fromEntries(ctx.req.raw.headers),\n url: ctx.req.url,\n },\n async () => {\n try {\n /**\n * Catch a hard SSR render failure and fall back to CSR,\n * where the client's error boundaries can surface a meaningful error.\n * Server-side error boundaries behave inconsistently across frameworks,\n * can not rely on them here.\n * Instead, the SSR output are discarded and the client shell served verbatim,\n * letting the client re-render and handle the error uniformly.\n * This is the render-level counterpart to the transport-level catch in loaders.\n * */\n const { head = \"\", html } = await renderToString(url, ssrOptions());\n return { head, html, error: errorProvider() };\n } catch (error) {\n return { error };\n }\n },\n );\n\n if (error) {\n console.error(\"WARN: SSR failed, fallback to CSR\");\n console.error(error);\n console.error();\n return [\n htmlStart.replace(\n \"<!--app-head-->\",\n \\`<script>console.error(\"WARN: SSR failed, fallback to CSR\")<\\/script>\\`,\n ),\n htmlEnd,\n ].join(\"\");\n }\n\n return [\n htmlStart.replace(\"<!--app-head-->\", head),\n html ?? \"\",\n htmlEnd,\n ].join(\"\");\n };\n\n const app = new Hono({ strict: false });\n\n for (const { pathPattern, renderMode } of routeMap) {\n app.get(join(base, pathPattern), async (ctx) => {\n try {\n const url = new URL(ctx.req.url);\n\n if (renderMode === \"string\" && typeof renderToString === \"function\") {\n const page = await renderPage(url, ctx);\n return ctx.html(page);\n }\n\n if (renderMode === \"stream\" && typeof renderToStream === \"function\") {\n ctx.header(\"Content-Type\", \"text/html\");\n return stream(ctx, async (stream) => {\n const { head = \"\", html } = await withSsrContext(\n {\n headers: Object.fromEntries(ctx.req.raw.headers),\n url: ctx.req.url,\n },\n () => renderToStream(url, ssrOptions(), stream as never),\n );\n await stream.write(htmlStart.replace(\"<!--app-head-->\", head));\n await stream.pipe(html);\n await stream.write(htmlEnd);\n });\n }\n\n ctx.status(501);\n return ctx.html(\"<h1>501: Not Implemented</h1>\");\n } catch (error: any) {\n // Handle thrown Response instances as redirects.\n // Re-throw other errors for upstream handling.\n if (error instanceof Response) {\n const Location = error.headers.get(\"Location\");\n\n if (!Location || !redirectCodes.includes(error.status)) {\n ctx.status(500);\n return ctx.html(\"<h1>500: Malformed redirect</h1>\");\n }\n\n return ctx.redirect(Location, error.status as never);\n }\n throw new HTTPException(500, { message: error.message, cause: error });\n }\n });\n }\n\n app.get(\"/*\", async (ctx) => {\n const { path } = ctx.req;\n\n // If incoming request path matches something cached at startup, serve it directly.\n // This covers JS, CSS, images, fonts, etc., including their .map siblings.\n const asset = assets.get(path);\n\n if (asset) {\n return new Response(asset.buffer as never, {\n headers: {\n \"Content-Type\": asset.contentType,\n \"Content-Length\": String(asset.size),\n },\n });\n }\n\n // render 404 page\n if (typeof renderToString === \"function\") {\n const url = new URL(ctx.req.url);\n const page = await renderPage(url, ctx);\n ctx.status(404);\n return ctx.html(page);\n }\n\n return ctx.notFound();\n });\n\n return app;\n};\n\n/**\n * Build an in-memory asset graph, loading asset content into memory.\n * The asset graph always includes every built asset URL so the SSR server\n * can correctly recognize static asset requests.\n * */\nconst loadAssets = async (\n root: string,\n patterns: string | Array<string> = \"**\",\n) => {\n const mimeTypeMap: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".apng\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".webp\": \"image/webp\",\n };\n\n // Resolve HTTP Content-Type from the asset's file extension.\n const contentTypeResolver = (filePath: string) => {\n const ext = extname(filePath).toLowerCase();\n return mimeTypeMap[ext] || \"application/octet-stream\";\n };\n\n // Map from URL path (as used in requests) to asset metadata.\n const assetCache = new Map<string, AssetInfo>();\n\n const folder = \"assets\";\n const cwd = resolve(root, folder);\n\n if (\n await access(cwd, constants.R_OK)\n .then(() => true)\n .catch(() => false)\n ) {\n const files = await glob(patterns, {\n cwd,\n onlyFiles: true,\n absolute: false,\n });\n\n for (const file of files) {\n const buffer = new Uint8Array(await readFile(resolve(cwd, file)));\n assetCache.set(join(base, folder, file), {\n file,\n buffer,\n contentType: contentTypeResolver(file),\n size: buffer?.length,\n });\n }\n }\n\n return assetCache;\n};\n\ntype NodeListener = (req: IncomingMessage, res: ServerResponse) => void;\n\nconst createNodeListener = (app: FetchApp | NodeApp): NodeListener => {\n return isFetchApp(app)\n ? getRequestListener((app as FetchApp).fetch)\n : (app as NodeApp).callback();\n};\n\nexport const startServer = async ({\n sock,\n port,\n}: {\n sock?: string | undefined;\n port?: string | number | undefined;\n}) => {\n if (![sock, port].some(Boolean)) {\n throw new Error(\"Please provide either -p/--port or -s/--sock\");\n }\n\n const {\n apiApp,\n }: {\n apiApp: FetchApp | NodeApp;\n } = await import(\\`\\${ROOT}/app.js\\`);\n\n if (sock) {\n // Clean up any stale socket file before binding.\n await unlink(sock).catch((error) => {\n if (error.code === \"ENOENT\") {\n return;\n }\n console.error(error.message);\n process.exit(1);\n });\n }\n\n console.log(\n \\`\\\\n ➜ Starting SSR Server \\${styleText([\"dim\"], \"[ %s ]\")}\\`,\n sock ? \\`sock: \\${sock}\\` : \\`port: \\${port}\\`,\n );\n\n const ssrApp = await createApp();\n const apiPrefix = join(base, apiBase);\n\n const ssrListener = createNodeListener(ssrApp as never);\n\n const apiListener = apiApp\n ? createNodeListener(apiApp as never)\n : async () => {};\n\n const gatewayListener: NodeListener = (req, res) => {\n const { pathname } = new URL(req.url ?? \"/\", ssrOrigin);\n return pathname === apiPrefix || pathname.startsWith(\\`\\${apiPrefix}/\\`)\n ? apiListener(req, res)\n : ssrListener(req, res);\n };\n\n const server = createServer(gatewayListener);\n\n server.listen(sock || port, async () => {\n if (sock) {\n // Make Unix socket world-writable so other processes (e.g. a reverse proxy)\n // can connect without permission issues.\n await chmod(sock, 0o777);\n }\n console.log(\"\\\\n ➜ Server Started ✨\");\n });\n\n return server;\n};\n\nexport const createDisposableServer = async (\n callback: (port: number) => Promise<void>,\n) => {\n const app = await createApp();\n const server = createAdaptorServer(app).listen(0); // OS picks a free port\n const address = server.address();\n\n if (!address || typeof address === \"string\") {\n throw new Error(\"SSR: Failed starting disposable server on a free port\");\n }\n\n try {\n await callback(address.port);\n } finally {\n server.close();\n }\n};\n\nconst isMain = fileURLToPath(import.meta.url) === resolve(process.argv[1]);\n\nif (isMain) {\n /**\n * Parse CLI arguments so this file can be used both as a module\n * and a standalone executable\n * */\n const {\n values: { port, sock },\n } = parseArgs({\n options: {\n port: {\n type: \"string\",\n short: \"p\",\n },\n sock: {\n type: \"string\",\n short: \"s\",\n },\n },\n });\n\n try {\n await startServer({ sock, port });\n } catch (error: any) {\n console.error(styleText(\"red\", \"✗ Failed starting SSR server\"));\n console.error(error);\n process.exit(1);\n }\n}\n`,b=`string`,x=t((e,t)=>{let{generators:p=[],refineTypeName:x,...S}=e.config,{createPath:C,createImportHelpers:w}=r(e),{renderToFile:T}=i({helpers:{...w({origin:`lib`})}});return{async build(e){let n=t?.renderMode?typeof t.renderMode==`string`?()=>t.renderMode:f(t?.renderMode,`string`):()=>b,r={renderMode:JSON.stringify(t?.renderMode||null),pageRoutes:e.flatMap(e=>e.kind===`pageRoute`?[{...e.entry,renderMode:n(e.entry.name)}]:[]).sort(a),apiGenerator:p.some(e=>e.meta.slot===`backend`)};for(let[e,t]of[[`ssr.ts`,y],[`@ssr/api.ts`,m],[`@ssr/__kosmo_ssr_bundle.ts`,g],[`@ssr/base.ts`,h],[`@ssr/fetch.ts`,_],[`@ssr/routes.ts`,v]])await T(C.lib(e),t,r)},async postBuild(){let t=C.distDir(`ssr`),r=[o.tsconfigPaths(e),o.nodePrefix()];for(let t of p)await t.factory(e).ssrBuild?.();await d(n(S,...p.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:C.src(),plugins:r,define:{KOSMO_PRODUCTION_BUILD:`true`},build:{ssr:C.lib(`@ssr/__kosmo_ssr_bundle`),ssrEmitAssets:!0,sourcemap:!0,emptyOutDir:!0,minify:!1,rolldownOptions:{output:{dir:t,entryFileNames:`app.js`,format:`esm`}}}})),await d({root:C.lib(),configFile:!1,appType:`custom`,plugins:r,resolve:{conditions:[`node`]},build:{ssr:C.lib(`ssr.ts`),target:`esnext`,sourcemap:!0,emptyOutDir:!0,rolldownOptions:{output:{dir:l(t,`server`),entryFileNames:`server.js`,format:`esm`}}}}),await s(u(t,`../client`),t,{recursive:!0});for(let e of[`server.js`,`server.js.map`])await s(`${t}/server/${e}`,`${t}/${e}`);await c(`${t}/server`,{recursive:!0,force:!0})}}}),S=e({meta:{name:`SSR`,slot:`ssr`},dependencies:{tinyglobby:p.devDependencies.tinyglobby,hono:p.devDependencies.hono,\"@hono/node-server\":p.devDependencies[`@hono/node-server`],\"light-my-request\":p.devDependencies[`light-my-request`]},factory:x});export{S as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderFactory as r,sortRoutes as i}from\"@kosmojs/lib\";import{svelte as a}from\"@sveltejs/vite-plugin-svelte\";import{createTemplateResolver as o,defaults as s}from\"@kosmojs/core\";import{routeRenderHelpers as c}from\"@kosmojs/core/generators\";var l={type:`module`,private:!0,name:`@kosmojs/svelte-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"@sveltejs/vite-plugin-svelte\":`^7.2.0`,vite:`^8.2.1`},devDependencies:{\"@tanstack/svelte-query\":`^6.1.38`,\"path-to-regexp\":`^8.4.2`,svelte:`^5.56.8`}},u=()=>{let e=[`🎉 Well done! You just created a new Svelte page.`,`🚀 Success! A fresh Svelte page is ready to roll.`,`🌟 Nice work! Another Svelte page added to your app.`,`🧩 All set! A new Svelte page has been scaffolded.`,`🔧 Scaffold complete! Your new Svelte page is in place.`,`✅ Built! Your Svelte page is scaffolded and ready.`,`✨ Fantastic! Your new Svelte page is good to go.`,`🎯 Nailed it! A brand new Svelte page just landed.`,`💫 Awesome! Another Svelte page joins the party.`,`⚡ Lightning fast! A new Svelte page created successfully.`];return e[Math.floor(Math.random()*e.length)]},d=`<script lang=\"ts\">\n import type { Snippet } from \"svelte\";\n\n let { children }: { children: Snippet } = $props();\n<\\/script>\n\n{@render children()}\n`,f=`<script lang=\"ts\">\n import { type QueryClient, QueryClientProvider } from \"@tanstack/svelte-query\";\n import type { Snippet } from \"svelte\";\n\n import { getQueryClient } from \"../query\";\n\n let { client, children }: {\n client?: QueryClient;\n children: Snippet;\n } = $props();\n\n const queryClient = $derived(client ?? getQueryClient());\n<\\/script>\n\n<QueryClientProvider client={queryClient}>\n {@render children()}\n</QueryClientProvider>\n`,p=`import { hydrate as hydrateOrig, mount as mountOrig } from \"svelte\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { createRoute, type RouteComponent } from \"../svelte\";\n\n{{#each pageRoutes}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n{{#each layouts}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nexport const createRoutes = () => {\n return [\n {{#each pageRoutes}}\n createRoute(\"{{name}}\", \"{{pathPattern}}\", {{id}}, [\n {{#each layouts}}[\"{{name}}\", {{id}}], {{/each}}\n ]),\n {{/each}}\n ];\n};\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<Promise<RouteComponent>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n hydrateOrig(component.Component, { target: root, props: component.props });\n window.__KOSMO_HYDRATION_DATA__ = undefined;\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<Promise<RouteComponent>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n mountOrig(component.Component, { target: root, props: component.props });\n}\n\nexport default clientRenderFactory();\n`,m=`import { render as renderOrig } from \"svelte/server\";\n\nimport type {\n RenderToStringWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\nimport { createRoute, type Route, type RouteComponent } from \"../svelte\";\n\n{{#each pageRoutes}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n{{#each layouts}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n\nexport const createRoutes = () => {\n return [\n {{#each pageRoutes}}\n createRoute(\"{{name}}\", \"{{pathPattern}}\", async () => {{id}}, [\n {{#each layouts}}[\"{{name}}\", async () => {{id}}], {{/each}}\n ]),\n {{/each}}\n ];\n};\n\nconst createHydrationScript = (loaderData: Route[\"loaderData\"]) => {\n return loaderData\n ? \\`<script>\n window.__KOSMO_HYDRATION_DATA__ = JSON.parse(\n \\${JSON.stringify(JSON.stringify(loaderData))}\n );\n <\\/script>\\`\n : undefined;\n};\n\nexport const renderWrapper: SSRRenderWrapper = (_context, render) => render();\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<Promise<RouteComponent>, { route: Route }>\n> = async (resolver, { headerTags = [] } = {}) => {\n const { component, route } = await resolver();\n\n // svelte/server render() returns \\`head\\` - everything the page and its\n // layouts put in <svelte:head> - plus \\`body\\`. That covers what MDX builds\n // from frontmatter, so there is no generateHeaderTags() counterpart here.\n const { head, body } = await renderOrig(component.Component, {\n props: component.props,\n });\n\n const script = createHydrationScript(route.loaderData);\n\n return {\n head: [...headerTags, head, ...(script ? [script] : [])]\n .filter(Boolean)\n .join(\"\\\\n\"),\n html: body,\n }\n}\n\n// svelte/server exposes only render() - no web-stream renderer -\n// so this folder is string-only SSR.\nexport default serverRenderFactory<false>();\n`,h=`declare module \"*.svelte\" {\n import type { Component } from \"svelte\";\n const component: Component;\n export default component;\n}\n`,g=`<script lang=\"ts\">\n /**\n * Folds [app, ...layouts] around the page component.\n *\n * MDX does this with \\`reduce((children, layout) => h(layout, { children }))\\`.\n * Svelte has no vnode children to reduce over, so the chain is walked with a\n * recursive snippet and the page is rendered at the leaf.\n *\n * Layouts receive nothing but their \\`children\\` snippet - same as MDX, where\n * a layout gets only \\`props.children\\`. Route data is read from context via\n * useRoute()/useParams()/useLoaderData().\n * */\n import { setRouteContext, type LayoutsProps } from \"./svelte\";\n\n let { app, layouts, page, route }: LayoutsProps = $props();\n\n setRouteContext(() => route);\n\n const chain = $derived([app, ...layouts.toReversed()]);\n<\\/script>\n\n{#snippet layer(index: number)}\n {#if index < chain.length}\n {@const Layout = chain[index]}\n <Layout>\n {@render layer(index + 1)}\n </Layout>\n {:else}\n {@const Page = page}\n <Page />\n {/if}\n{/snippet}\n\n{@render layer(0)}\n`,_=`<script lang=\"ts\">\n import styles from \"./styles.module.css\";\n\n let { headline }: { headline?: string } = $props();\n<\\/script>\n\n<div class={styles.container}>\n <div class={styles.card}>\n <h2 class={styles.title}>{headline || \"404: Not Found\"}</h2>\n <br />\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>Something went wrong...</h2>\n 🚧 No page found here\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n</div>\n`,v=`<script lang=\"ts\">\n import styles from \"./styles.module.css\";\n\n let {\n message,\n routeName,\n pathMap,\n }: {\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string };\n } = $props();\n<\\/script>\n\n<div data-page-route={routeName} class={styles.container}>\n <div class={styles.card}>\n <h2 class={styles.subtitle}>{message}</h2>\n <br />\n\n <div class={styles.stepsBox}>\n <ul class={styles.stepsList}>\n <li>Edit this page at <code>{pathMap.page}</code></li>\n <li>\n Create new pages by adding folders in <code>{pathMap.pages}/</code>\n </li>\n <li>Add API endpoints in <code>{pathMap.api}/</code></li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation ➜\n </a>\n </div>\n </div>\n</div>\n`,y=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,b=`<script lang=\"ts\">\n import styles from \"./styles.module.css\";\n<\\/script>\n\n<div class={styles.container}>\n <div class={styles.card}>\n <div class={styles.header}>\n <div class={styles.icon}>✨</div>\n <h1 class={styles.title}>Welcome to KosmoJS</h1>\n <p class={styles.subtitle}>\n Component-first development with Svelte and Vite\n </p>\n </div>\n\n <div class={styles.featuresBox}>\n <h2 class={styles.featuresTitle}>Powered by Svelte and ready to ship</h2>\n <div class={styles.featuresSubtitle}>What's included:</div>\n <ul class={styles.featuresList}>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Directory-based routing\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Svelte 5 runes and snippets\n </li>\n <li class={styles.featureItem}>\n <span class={styles.featureBullet}>🔹</span>\n Nested layouts, loaders and <svelte:head>\n </li>\n </ul>\n </div>\n\n <div class={styles.stepsBox}>\n <h2 class={styles.stepsTitle}>Next Steps 🢂</h2>\n <ul class={styles.stepsList}>\n <li>Edit this page at <code>pages/index/index.svelte</code></li>\n <li>Create new pages by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div class={styles.footer}>\n <p class={styles.footerText}>\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n class={styles.docsLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation ➜\n </a>\n </div>\n </div>\n</div>\n`,x=`export type ParamsMap = {\n{{#each pageRoutes}}\"{{name}}\": {{serializeParamsLiteral .}};\n{{/each}}\n};\n\nexport const paramNames = {\n{{#each pageRoutes}}\"{{name}}\": [ {{#each params.schema}}\"{{name}}\", {{/each}}],\n{{/each}}\n} as const;\n`,S=`import { QueryClient, type QueryClientConfig } from \"@tanstack/svelte-query\";\n\nlet client: QueryClient | undefined;\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n client = new QueryClient(options);\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n if (!client) {\n client = new QueryClient();\n }\n return client;\n};\n`,C=`import { QueryClient, type QueryClientConfig } from \"@tanstack/svelte-query\";\n\nimport { store } from \"{{ createImport 'lib' '@ssr/base' }}\";\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n const client = new QueryClient(options);\n const ctx = store?.getStore();\n if (ctx) {\n ctx.tsqClient = client;\n }\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n const ctx = store?.getStore();\n if (!ctx) {\n throw new Error(\"getQueryClient(): called outside an SSR request scope\");\n }\n if (!ctx.tsqClient) {\n ctx.tsqClient = new QueryClient();\n }\n return ctx.tsqClient as QueryClient;\n};\n`,w=`import type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport Layouts from \"./Layouts.svelte\";\nimport {\n type AnyComponent,\n createRouter,\n type RawRoute,\n type Route,\n type RouteComponent,\n} from \"./svelte\";\n\nexport const createRouters = (\n routes: Array<RawRoute>,\n { app }: { app: AnyComponent },\n): {\n clientRouter: () => RouterFactoryReturn<Promise<RouteComponent>>;\n serverRouter: (\n url: URL,\n ) => RouterFactoryReturn<Promise<RouteComponent>, { route: Route }>;\n} => {\n // <Layouts> is injected here rather than imported by ./svelte, so the core\n // router stays a plain module and there is no .ts <-> .svelte import cycle.\n const router = createRouter(routes, app, Layouts);\n\n return {\n clientRouter() {\n return router.resolve();\n },\n serverRouter(url) {\n return router.resolve(url);\n },\n };\n};\n\nexport default createRouterFactory<\n RawRoute,\n Promise<RouteComponent>,\n { server: { route: Route } }\n>();\n`,T=`import { match, pathToRegexp } from \"path-to-regexp\";\nimport { type Component, createContext } from \"svelte\";\n\nimport { parseSearchParams } from \"@kosmojs/core\";\n\nimport { paramNames } from \"{{ createImport 'lib' 'params' }}\";\nimport { base } from \"{{ createImport 'libCore' }}\";\n\n/**\n * The loose component type for anything resolved dynamically from a \\`.svelte\\`\n * module's default export.\n *\n * It must be \\`any\\`-propped, not \\`never\\`-propped: a \\`Component<never>\\` is a\n * function accepting \\`never\\`, so - by parameter contravariance - no real\n * component is assignable to it and \\`<Layout />\\` fails to typecheck.\n * */\nexport type AnyComponent = Component<any, any, any>;\n\nexport type RawRoute = {\n name: string;\n pathSegments: number | undefined;\n regexp: RegExp;\n extractParams: (path: string) => Route[\"params\"];\n loader: () => Promise<RouteModule>;\n layouts: Array<[name: string, source: () => Promise<LayoutModule>]>;\n};\n\ntype Loader = (\n route: Pick<Route, \"name\" | \"params\" | \"paramsEntries\" | \"searchParams\">,\n) => Promise<unknown> | undefined;\n\n/**\n * \\`.svelte\\` modules export their component as \\`default\\`; an optional data\n * \\`loader\\` comes from a \\`<script module>\\` block.\n * */\ntype LayoutModule = {\n default: AnyComponent;\n loader?: Loader;\n};\n\ntype RouteModule = {\n default: AnyComponent;\n loader?: Loader;\n};\n\n/**\n * Props of <Layouts>, the fixed root component every route renders through.\n * */\nexport type LayoutsProps = {\n app: AnyComponent;\n layouts: Array<AnyComponent>;\n page: AnyComponent;\n route: Route;\n};\n\n/**\n * Preact can prebuild the whole tree and hand back a VNode; Svelte cannot -\n * components are constructors, not values. So the resolved \"component\" is a\n * (constructor, props) pair and the entry templates feed it to\n * mount()/hydrate()/render().\n * */\nexport type RouteComponent = {\n Component: Component<LayoutsProps>;\n props: LayoutsProps;\n};\n\nexport type Route = {\n name: string;\n params: Record<string, string | Array<string>>;\n paramsEntries: [keys: Array<string>, values: Array<unknown>];\n searchParams: Record<string, unknown>;\n loaderData: Record<string, unknown>;\n};\n\n/**\n * Route context, the Svelte counterpart to MDX's Preact RouterContext.\n *\n * Holds a getter rather than the value: <Layouts> receives \\`route\\` as a prop,\n * and reading a prop into a non-reactive position at init is exactly what\n * Svelte's \\`state_referenced_locally\\` check flags. The getter also keeps reads\n * current if the wrapper is ever reused instead of remounted.\n *\n * \\`createContext\\` returns a typed [get, set] pair and \\`get\\` throws when no\n * parent called \\`set\\`, so a page rendered outside <Layouts> fails loudly.\n * */\nexport const [getRouteContext, setRouteContext] = createContext<() => Route>();\n\nexport const createRouter = (\n routes: Array<RawRoute>,\n app: AnyComponent,\n Layouts: Component<LayoutsProps>,\n) => {\n const catchallRoute = createRoute(\n \"NotFound\",\n \"\",\n () => import(\"{{ createImport 'pages' '404.svelte' }}\"),\n [],\n );\n\n const runLoader = async (key: string, fetcher: () => ReturnType<Loader>) => {\n if (typeof window === \"undefined\" || !window.__KOSMO_HYDRATION_DATA__) {\n return fetcher();\n }\n return key in window.__KOSMO_HYDRATION_DATA__\n ? window.__KOSMO_HYDRATION_DATA__[key]\n : fetcher();\n };\n\n return {\n async resolve(url: URL = new URL(window.location.href)) {\n const searchParams = parseSearchParams(url);\n const urlSegments = url.pathname.split(\"/\").filter(Boolean).length;\n\n // 1: use lightweight \\`RegExp.test()\\` on linear scan - no capture allocation\n const matchedRoutes = routes.filter(({ regexp }) => {\n return regexp.test(url.pathname);\n });\n\n const matchedRoute =\n matchedRoutes.length > 1\n ? matchedRoutes.find(({ pathSegments }) => {\n return pathSegments === undefined || pathSegments === urlSegments;\n }) || catchallRoute\n : matchedRoutes.length === 1\n ? matchedRoutes[0]\n : catchallRoute;\n\n // 2: capture params only on matched route\n const params = matchedRoute\n ? matchedRoute.extractParams(url.pathname)\n : {};\n\n const { name } = matchedRoute;\n\n const routeModule = await matchedRoute.loader();\n\n const paramsEntries = (\n Array.isArray(paramNames[name as never])\n ? [\n [...paramNames[name as never]],\n [...paramNames[name as never]].map((key) => params[key]),\n ]\n : [\n // fallback\n Object.keys(params),\n Object.values(params),\n ]\n ) as never;\n\n const loaderData: Record<string, unknown> = {};\n\n loaderData[name] = await runLoader(name, () => {\n return routeModule.loader\n ? routeModule.loader({ name, params, paramsEntries, searchParams })\n : undefined; // should not survive serialization if no loader defined\n });\n\n const layouts: Array<AnyComponent> = [];\n\n for (const [layoutName, source] of matchedRoute.layouts || []) {\n const layoutModule = await source();\n layouts.push(layoutModule.default);\n const key = \\`\\${layoutName}/layout\\`;\n loaderData[key] = await runLoader(key, () => {\n return layoutModule.loader\n ? layoutModule.loader({\n name: layoutName,\n params,\n paramsEntries,\n searchParams,\n })\n : undefined; // should not survive serialization if no loader defined\n });\n }\n\n const route: Route = {\n name,\n params,\n paramsEntries,\n searchParams,\n loaderData,\n };\n\n return {\n // <Layouts> folds [app, ...layouts] around the page - Svelte has no\n // vnode children to reduce over the way \\`h(layout, { children })\\` does.\n component: {\n Component: Layouts,\n props: { app, layouts, page: routeModule.default, route },\n } satisfies RouteComponent,\n route,\n };\n },\n };\n};\n\nexport const createRoute = (\n name: string,\n pathPattern: string,\n loader: RawRoute[\"loader\"],\n layouts: RawRoute[\"layouts\"],\n): RawRoute => {\n const path = \\`\\${base}/\\${pathPattern}\\`.replace(/\\\\/+/g, \"/\");\n\n const { regexp } = pathToRegexp(path, { sensitive: true });\n const matcher = match<Route[\"params\"]>(path);\n\n return {\n name,\n regexp,\n pathSegments: name.includes(\"...\")\n ? undefined\n : name.replace(/^index(\\\\/?|$)/, \"\").split(\"/\").length,\n extractParams: (path) => {\n const match = matcher(path);\n return match ? match.params : {};\n },\n loader,\n layouts,\n };\n};\n`,E=`import { getRouteContext } from \"./svelte\";\n\nimport type { ParamsMap, paramNames } from \"{{ createImport 'lib' 'params' }}\";\n\n/**\n * These read Svelte context, so - like every getContext() call - they are only\n * valid during component initialisation: at the top level of a \\`<script>\\`,\n * never inside an event handler or a callback that runs later.\n * */\nexport function useRoute() {\n return getRouteContext()();\n}\n\nexport function useParams<T extends keyof ParamsMap>(): ParamsMap[T] {\n return useRoute().params as ParamsMap[T];\n}\n\ntype SameLengthTuple<T extends readonly unknown[], U> = { [K in keyof T]: U };\n\nexport function useParamsEntries<T extends keyof ParamsMap>(): [\n (typeof paramNames)[T],\n SameLengthTuple<(typeof paramNames)[T], unknown>,\n] {\n return useRoute().paramsEntries as never;\n}\n\nexport function useSearchParams() {\n return useRoute().searchParams;\n}\n\n/**\n * Reads loader data for the current page or one of its layouts.\n * Without a key, returns the page's own data.\n * For a layout, pass its path-qualified name (e.g. \"dashboard/layout\") -\n * context can't tell which layout it runs in.\n * */\nexport const useLoaderData = <T>(key?: string): T | undefined => {\n const route = useRoute();\n return route.loaderData?.[key || route.name] as T;\n};\n`,D=`<script lang=\"ts\">\n import { AppProvider } from \"{{ createImport 'lib' 'app' }}\";\n import type { Snippet } from \"svelte\";\n\n let { children }: { children: Snippet } = $props();\n<\\/script>\n\n<AppProvider>\n {@render children()}\n</AppProvider>\n`,O=`<script lang=\"ts\">\n import type { Snippet } from \"svelte\";\n import type { HTMLAnchorAttributes } from \"svelte/elements\";\n\n import { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\n let {\n to,\n query,\n children,\n ...rest\n }: Omit<HTMLAnchorAttributes, \"href\"> & {\n to: LinkProps;\n query?: Record<string | number, unknown>;\n children?: Snippet;\n } = $props();\n\n const href = $derived.by(() => {\n const [key, ...params] = to;\n return pageRouteMap[key]?.base(params as never, query);\n });\n<\\/script>\n\n<a {href} {...rest}>{@render children?.()}</a>\n`,k=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,A=`import renderFactory, {\n createRoutes,\n renderToString,\n // no renderToStream on Svelte folders\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,j=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,M=`<script lang=\"ts\">\n import PageSample from \"{{ createImport 'lib' 'pageSamples/404.svelte' }}\";\n<\\/script>\n\n<PageSample />\n`,N=`<script lang=\"ts\">\n import type { Snippet } from \"svelte\";\n\n let { children }: { children: Snippet } = $props();\n<\\/script>\n\n{@render children()}\n`,P=`<script lang=\"ts\">\n import PageSample from \"{{ createImport 'lib' 'pageSamples/page.svelte' }}\";\n\n const pathMap = {\n page: \"{{ createImport 'pages' route.file }}\",\n pages: \"{{ createImport 'pages' }}\",\n api: \"{{ createImport 'api' }}\",\n };\n<\\/script>\n\n<svelte:head>\n <title>{{title}}</title>\n</svelte:head>\n\n<PageSample\n message=\"{{message}}\"\n routeName={\"{{route.name}}\"}\n {pathMap}\n/>\n`,F=`<script lang=\"ts\">\n import WelcomePage from \"{{ createImport 'lib' 'pageSamples/welcome.svelte' }}\";\n<\\/script>\n\n<svelte:head>\n <title>Welcome to KosmoJS</title>\n <meta\n name=\"description\"\n content=\"Component-first development with Svelte and Vite\"\n />\n</svelte:head>\n\n<WelcomePage />\n`,I=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\n\nimport app from \"./app.svelte\";\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, { app });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,L=t((e,t)=>{let{createPath:l,createImportHelpers:L}=n(e),{renderToFile:R}=r({helpers:{...L({origin:`lib`}),...c()}}),{renderToFile:z}=r({helpers:L({origin:`src`})}),B=e=>!e?.trim().length,V=o(t?.templates,P),H=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await z(l.pages(n.file),n.name===`index`?F:V(n.name,n),{route:n,title:n.name.replace(/\\{([^}]+)\\}/g,`$1`),message:u()},{overwrite:B}):t===`pageLayout`&&await z(l.pages(n.file),N,{route:n},{overwrite:B})},U=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),n=e.flatMap(({kind:e,entry:n})=>{if(e===`pageRoute`){let{name:e,file:r}=n;return[{...n,layouts:t.flatMap(t=>t.name===e||r.startsWith(`${t.name}/`)?[t]:[]).sort(i)}]}return[]}).sort(i);for(let[e,r]of[[`client.ts`,p],[`server.ts`,m]])await R(l.libEntry(e),r,{pageRoutes:n,layouts:t});for(let[e,t]of[[`params.ts`,x],[`router.ts`,w]])await R(l.lib(e),t,{pageRoutes:n})};return{config(){let{templates:e,...n}={...t};return{plugins:a(n)}},async start(){for(let[e,n]of[[`env.d.ts`,h],[`svelte.ts`,T],[`Layouts.svelte`,g],[`use.ts`,E],[`pageSamples/styles.module.css`,y],[`pageSamples/welcome.svelte`,b],[`pageSamples/page.svelte`,v],[`pageSamples/404.svelte`,_],...t?.tanstack?.query?[[`app/app.svelte`,d],[`app/app-tsq.svelte`,f],[`app/index.ts`,`export { default as AppProvider } from \"./app-tsq.svelte\";`],[`query.ts`,S]]:[[`app/app.svelte`,d],[`app/app-tsq.svelte`,`/** tanstack query disabled */`],[`app/index.ts`,`export { default as AppProvider } from \"./app.svelte\";`],[`query.ts`,`/** tanstack query disabled */`]]])await R(l.lib(e),n,{});for(let[e,t]of[[`pages/404.svelte`,M],[`components/Link.svelte`,O],[`app.svelte`,D],[`router.ts`,I]])await z(l.src(e),t,{entryDir:s.entryDir},{overwrite:B});await z(l.src(`index.html`),j,{entryDir:s.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,k],[`server.ts`,A]])await z(l.entry(e),t,{},{overwrite:B})},async watch(e,t){(!t||t.kind===`create`)&&await H(e),await U(e)},async build(e){await H(e),await U(e)},async ssrBuild(){await R(l.lib(`query.ts`),t?.tanstack?.query?C:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),R=e({meta:{name:`Svelte`},dependencies(e){return{svelte:l.devDependencies.svelte,\"path-to-regexp\":l.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{\"@tanstack/svelte-query\":l.devDependencies[`@tanstack/svelte-query`]}:{}}},factory:L});export{R as default};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,pathResolver as n,renderFactory as r}from\"@kosmojs/lib\";import{RequestValidationTargets as i}from\"@kosmojs/core\";var a={type:`module`,private:!0,name:`@kosmojs/typebox-generator`,version:`0.3.0`,cacheVersion:`1`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/typebox-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,crc:`^4.3.2`,semver:`^7.8.5`},devDependencies:{\"@kosmojs/core-generator\":`workspace:^`,\"@kosmojs/koa-generator\":`workspace:^`,typebox:`^1.3.11`}},o=`import Type from \"typebox\";\n\n/**\n * Custom types for JavaScript constructs that have no JSON Schema\n * representation (Date, File, Blob, Buffer, ArrayBuffer).\n *\n * Each entry is a factory so every use site gets a fresh schema instance,\n * matching the previous behaviour of \\`new TDate()\\` etc.\n * */\n\nconst customType = <T>(\n check: (value: unknown) => value is T,\n message: string,\n) => Type.Refine(Type.Unsafe<T>({}), check, () => message);\n\nexport const TDate = () => {\n return customType(\n (value): value is Date => value instanceof Date,\n \"must be Date\",\n );\n};\n\nconst isFormidableFile = (value: unknown) => {\n return value\n ? typeof value === \"object\"\n ? [\n //\n \"filepath\",\n \"originalFilename\",\n \"newFilename\",\n \"mimetype\",\n ].every((e) => e in value)\n : false\n : false;\n};\n\nexport const TFile = () => {\n return customType(\n (value): value is File => value instanceof File || isFormidableFile(value),\n \"must be File\",\n );\n};\n\nexport const TBlob = () => {\n return customType(\n (value): value is Blob => value instanceof Blob,\n \"must be Blob\",\n );\n};\n\nexport const TBuffer = () => {\n return customType(\n (value): value is Buffer =>\n typeof Buffer !== \"undefined\" && Buffer.isBuffer(value),\n \"must be Buffer\",\n );\n};\n\nexport const TArrayBuffer = () => {\n return customType(\n (value): value is ArrayBuffer => value instanceof ArrayBuffer,\n \"must be ArrayBuffer\",\n );\n};\n\nexport default {\n Date: TDate(),\n File: TFile(),\n Blob: TBlob(),\n Buffer: TBuffer(),\n ArrayBuffer: TArrayBuffer(),\n};\n`,s=`import type { TValidationError } from \"typebox/error\";\n\nimport type { ValidationErrorEntry } from \"@kosmojs/core\";\n\n/**\n * Message codes for i18n/l10n support\n */\nexport const MESSAGE_CODES = {\n // Generic messages\n\n /** Singular form of \"property\" word for i18n */\n PROPERTY: \"PROPERTY\",\n /** Plural form of \"properties\" word for i18n */\n PROPERTIES: \"PROPERTIES\",\n\n /** Text for \"allowed values\" phrase for i18n */\n ALLOWED_VALUES: \"ALLOWED_VALUES\",\n /** Message template for displaying count of duplicate items found */\n FOUND_N_DUPLICATES: \"FOUND_N_DUPLICATES\",\n\n /** Message displayed when validation succeeds */\n VALIDATION_PASSED: \"VALIDATION_PASSED\",\n /** Prefix text for validation error messages (e.g., \"Validation failed:\") */\n VALIDATION_FAILED_PREFIX: \"VALIDATION_FAILED_PREFIX\",\n\n /** Template for error summary showing error count and affected fields */\n ERROR_SUMMARY: \"ERROR_SUMMARY\",\n /** Plural suffix for words (e.g., \"s\" in English) */\n PLURAL_SUFFIX: \"PLURAL_SUFFIX\",\n\n /** Ordinal position label for first element in tuple/array */\n FIRST: \"FIRST\",\n /** Ordinal position label for second element in tuple/array */\n SECOND: \"SECOND\",\n /** Ordinal position label for third element in tuple/array */\n THIRD: \"THIRD\",\n /** Ordinal position label for fourth element in tuple/array */\n FOURTH: \"FOURTH\",\n /** Ordinal position label for fifth element in tuple/array */\n FIFTH: \"FIFTH\",\n\n // Error messages\n\n // Type validation\n /** Invalid data type - expected a specific type */\n TYPE_INVALID: \"TYPE_INVALID\",\n\n // String validation\n /** String is too short - minimum length constraint violated */\n STRING_MIN_LENGTH: \"STRING_MIN_LENGTH\",\n /** String is too long - maximum length constraint violated */\n STRING_MAX_LENGTH: \"STRING_MAX_LENGTH\",\n /** String doesn't match required pattern/regex */\n STRING_PATTERN: \"STRING_PATTERN\",\n /** String doesn't match required format (generic) */\n STRING_FORMAT: \"STRING_FORMAT\",\n /** Invalid email address format */\n STRING_FORMAT_EMAIL: \"STRING_FORMAT_EMAIL\",\n /** Invalid date format */\n STRING_FORMAT_DATE: \"STRING_FORMAT_DATE\",\n /** Invalid date-time format */\n STRING_FORMAT_DATETIME: \"STRING_FORMAT_DATETIME\",\n /** Invalid time format */\n STRING_FORMAT_TIME: \"STRING_FORMAT_TIME\",\n /** Invalid URI format */\n STRING_FORMAT_URI: \"STRING_FORMAT_URI\",\n /** Invalid URL format */\n STRING_FORMAT_URL: \"STRING_FORMAT_URL\",\n /** Invalid UUID format */\n STRING_FORMAT_UUID: \"STRING_FORMAT_UUID\",\n /** Invalid IPv4 address format */\n STRING_FORMAT_IPV4: \"STRING_FORMAT_IPV4\",\n /** Invalid IPv6 address format */\n STRING_FORMAT_IPV6: \"STRING_FORMAT_IPV6\",\n /** Invalid hostname format */\n STRING_FORMAT_HOSTNAME: \"STRING_FORMAT_HOSTNAME\",\n /** Invalid JSON pointer format */\n STRING_FORMAT_JSON_POINTER: \"STRING_FORMAT_JSON_POINTER\",\n /** Invalid regular expression format */\n STRING_FORMAT_REGEX: \"STRING_FORMAT_REGEX\",\n\n // Number validation\n /** Number is below minimum value */\n NUMBER_MINIMUM: \"NUMBER_MINIMUM\",\n /** Number exceeds maximum value */\n NUMBER_MAXIMUM: \"NUMBER_MAXIMUM\",\n /** Number is below exclusive minimum value */\n NUMBER_EXCLUSIVE_MINIMUM: \"NUMBER_EXCLUSIVE_MINIMUM\",\n /** Number exceeds exclusive maximum value */\n NUMBER_EXCLUSIVE_MAXIMUM: \"NUMBER_EXCLUSIVE_MAXIMUM\",\n /** Number is not a multiple of required value */\n NUMBER_MULTIPLE_OF: \"NUMBER_MULTIPLE_OF\",\n\n // Array validation\n /** Array has too few items - minimum items constraint violated */\n ARRAY_MIN_ITEMS: \"ARRAY_MIN_ITEMS\",\n /** Array has too many items - maximum items constraint violated */\n ARRAY_MAX_ITEMS: \"ARRAY_MAX_ITEMS\",\n /** Array contains duplicate items when uniqueness is required */\n ARRAY_UNIQUE_ITEMS: \"ARRAY_UNIQUE_ITEMS\",\n /** Array doesn't contain required valid items */\n ARRAY_CONTAINS: \"ARRAY_CONTAINS\",\n /** Array contains too few items matching criteria */\n ARRAY_MIN_CONTAINS: \"ARRAY_MIN_CONTAINS\",\n /** Array contains too many items matching criteria */\n ARRAY_MAX_CONTAINS: \"ARRAY_MAX_CONTAINS\",\n /** Invalid tuple structure */\n ARRAY_PREFIX_ITEMS: \"ARRAY_PREFIX_ITEMS\",\n /** Invalid additional items beyond tuple definition */\n ARRAY_ITEMS: \"ARRAY_ITEMS\",\n /** Invalid unevaluated items in array */\n ARRAY_UNEVALUATED_ITEMS: \"ARRAY_UNEVALUATED_ITEMS\",\n\n // Tuple-specific validation\n /** Tuple has too few elements */\n TUPLE_MIN_ITEMS: \"TUPLE_MIN_ITEMS\",\n /** Tuple has too many elements */\n TUPLE_MAX_ITEMS: \"TUPLE_MAX_ITEMS\",\n\n // Object validation\n /** Missing required property/properties */\n OBJECT_REQUIRED: \"OBJECT_REQUIRED\",\n /** Object contains additional properties not allowed by schema */\n OBJECT_ADDITIONAL_PROPERTIES: \"OBJECT_ADDITIONAL_PROPERTIES\",\n /** Object has too few properties */\n OBJECT_MIN_PROPERTIES: \"OBJECT_MIN_PROPERTIES\",\n /** Object has too many properties */\n OBJECT_MAX_PROPERTIES: \"OBJECT_MAX_PROPERTIES\",\n /** Invalid property name */\n OBJECT_PROPERTY_NAMES: \"OBJECT_PROPERTY_NAMES\",\n /** Missing dependent required properties */\n OBJECT_DEPENDENCIES: \"OBJECT_DEPENDENCIES\",\n /** Object contains unevaluated properties */\n OBJECT_UNEVALUATED_PROPERTIES: \"OBJECT_UNEVALUATED_PROPERTIES\",\n\n // Enum and const validation\n /** Value is not one of the allowed enum values */\n ENUM_MISMATCH: \"ENUM_MISMATCH\",\n /** Value doesn't match the required constant value */\n CONST_MISMATCH: \"CONST_MISMATCH\",\n\n // Conditional schema validation\n /** Doesn't match conditional if schema */\n CONDITIONAL_IF: \"CONDITIONAL_IF\",\n /** Doesn't satisfy then schema condition */\n CONDITIONAL_THEN: \"CONDITIONAL_THEN\",\n /** Doesn't satisfy else schema condition */\n CONDITIONAL_ELSE: \"CONDITIONAL_ELSE\",\n\n // Composition validation\n /** Must match exactly one schema (oneOf) */\n COMPOSITION_ONE_OF: \"COMPOSITION_ONE_OF\",\n /** Must match at least one schema (anyOf) */\n COMPOSITION_ANY_OF: \"COMPOSITION_ANY_OF\",\n /** Must match all schemas (allOf) */\n COMPOSITION_ALL_OF: \"COMPOSITION_ALL_OF\",\n /** Must not match the schema (not) */\n COMPOSITION_NOT: \"COMPOSITION_NOT\",\n\n // Content validation\n /** Invalid discriminator value */\n CONTENT_DISCRIMINATOR: \"CONTENT_DISCRIMINATOR\",\n /** Invalid content encoding */\n CONTENT_ENCODING: \"CONTENT_ENCODING\",\n /** Invalid content media type */\n CONTENT_MEDIA_TYPE: \"CONTENT_MEDIA_TYPE\",\n\n // Custom keywords (ajv-keywords)\n /** Value outside allowed range */\n CUSTOM_RANGE: \"CUSTOM_RANGE\",\n /** Value outside exclusive range */\n CUSTOM_EXCLUSIVE_RANGE: \"CUSTOM_EXCLUSIVE_RANGE\",\n /** Doesn't match regular expression */\n CUSTOM_REGEXP: \"CUSTOM_REGEXP\",\n /** Failed to apply dynamic default */\n CUSTOM_DYNAMIC_DEFAULTS: \"CUSTOM_DYNAMIC_DEFAULTS\",\n /** Doesn't match any selected case */\n CUSTOM_SELECT: \"CUSTOM_SELECT\",\n /** Transformation failed */\n CUSTOM_TRANSFORM: \"CUSTOM_TRANSFORM\",\n /** Items don't have unique property values */\n CUSTOM_UNIQUE_ITEM_PROPERTIES: \"CUSTOM_UNIQUE_ITEM_PROPERTIES\",\n\n // Fallback\n /** Unknown validation error */\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type ValidationMessages = typeof MESSAGE_CODES;\n\n/**\n * Error message templates using node:util format syntax\n * Placeholders: %s (string), %d (number), %j (JSON)\n *\n * Usage: format(ERROR_MESSAGES[ErrorCode.STRING_MIN_LENGTH], 5)\n * Result: \"must be at least 5 characters long\"\n */\nconst MESSAGE_MAP: Record<keyof ValidationMessages, string> = {\n // Generic messages\n\n [MESSAGE_CODES.PROPERTY]: \"property\",\n [MESSAGE_CODES.PROPERTIES]: \"properties\",\n\n [MESSAGE_CODES.ALLOWED_VALUES]: \"the allowed values\",\n [MESSAGE_CODES.FOUND_N_DUPLICATES]: \" (found %d duplicate%s)\",\n\n [MESSAGE_CODES.VALIDATION_PASSED]: \"Validation Passed\",\n [MESSAGE_CODES.VALIDATION_FAILED_PREFIX]: \"\",\n\n [MESSAGE_CODES.ERROR_SUMMARY]:\n \"%d validation error%s found across %d field%s\",\n [MESSAGE_CODES.PLURAL_SUFFIX]: \"s\",\n\n [MESSAGE_CODES.FIRST]: \"first\",\n [MESSAGE_CODES.SECOND]: \"second\",\n [MESSAGE_CODES.THIRD]: \"third\",\n [MESSAGE_CODES.FOURTH]: \"fourth\",\n [MESSAGE_CODES.FIFTH]: \"fifth\",\n\n // Error messages\n\n // Type validation\n [MESSAGE_CODES.TYPE_INVALID]: \"must be %s\",\n\n // String validation\n [MESSAGE_CODES.STRING_MIN_LENGTH]: \"must be at least %d character%s long\",\n [MESSAGE_CODES.STRING_MAX_LENGTH]: \"must not exceed %d character%s\",\n [MESSAGE_CODES.STRING_PATTERN]: \"must match the required pattern\",\n [MESSAGE_CODES.STRING_FORMAT]: \\`must match format \"%s\"\\`,\n [MESSAGE_CODES.STRING_FORMAT_EMAIL]: \"must be a valid email address\",\n [MESSAGE_CODES.STRING_FORMAT_DATE]: \"must be a valid date\",\n [MESSAGE_CODES.STRING_FORMAT_DATETIME]: \"must be a valid date-time\",\n [MESSAGE_CODES.STRING_FORMAT_TIME]: \"must be a valid time\",\n [MESSAGE_CODES.STRING_FORMAT_URI]: \"must be a valid URI\",\n [MESSAGE_CODES.STRING_FORMAT_URL]: \"must be a valid URL\",\n [MESSAGE_CODES.STRING_FORMAT_UUID]: \"must be a valid UUID\",\n [MESSAGE_CODES.STRING_FORMAT_IPV4]: \"must be a valid IPv4 address\",\n [MESSAGE_CODES.STRING_FORMAT_IPV6]: \"must be a valid IPv6 address\",\n [MESSAGE_CODES.STRING_FORMAT_HOSTNAME]: \"must be a valid hostname\",\n [MESSAGE_CODES.STRING_FORMAT_JSON_POINTER]: \"must be a valid JSON pointer\",\n [MESSAGE_CODES.STRING_FORMAT_REGEX]: \"must be a valid regular expression\",\n\n // Number validation\n [MESSAGE_CODES.NUMBER_MINIMUM]: \"must be %s %s\",\n [MESSAGE_CODES.NUMBER_MAXIMUM]: \"must be %s %s\",\n [MESSAGE_CODES.NUMBER_EXCLUSIVE_MINIMUM]: \"must be %s %s\",\n [MESSAGE_CODES.NUMBER_EXCLUSIVE_MAXIMUM]: \"must be %s %s\",\n [MESSAGE_CODES.NUMBER_MULTIPLE_OF]: \"must be a multiple of %s\",\n\n // Array validation\n [MESSAGE_CODES.ARRAY_MIN_ITEMS]: \"must have at least %d item%s\",\n [MESSAGE_CODES.ARRAY_MAX_ITEMS]: \"must not have more than %d item%s\",\n [MESSAGE_CODES.ARRAY_UNIQUE_ITEMS]: \"must not have duplicate items%s\",\n [MESSAGE_CODES.ARRAY_CONTAINS]: \"must contain at least %d valid item%s\",\n [MESSAGE_CODES.ARRAY_MIN_CONTAINS]:\n \"must contain at least %d item%s matching the criteria\",\n [MESSAGE_CODES.ARRAY_MAX_CONTAINS]:\n \"must contain no more than %d item%s matching the criteria\",\n [MESSAGE_CODES.ARRAY_PREFIX_ITEMS]: \"tuple structure is invalid\",\n [MESSAGE_CODES.ARRAY_ITEMS]: \"array items are invalid\",\n [MESSAGE_CODES.ARRAY_UNEVALUATED_ITEMS]: \"should not have unevaluated items\",\n\n // Tuple-specific\n [MESSAGE_CODES.TUPLE_MIN_ITEMS]: \"tuple must have at least %d element%s\",\n [MESSAGE_CODES.TUPLE_MAX_ITEMS]: \"tuple must not have more than %d element%s\",\n\n // Object validation\n [MESSAGE_CODES.OBJECT_REQUIRED]: \"missing required %s: %s\",\n [MESSAGE_CODES.OBJECT_ADDITIONAL_PROPERTIES]: \\`should not have additional property \"%s\"\\`,\n [MESSAGE_CODES.OBJECT_MIN_PROPERTIES]: \"must have at least %d %s\",\n [MESSAGE_CODES.OBJECT_MAX_PROPERTIES]: \"must not have more than %d %s\",\n [MESSAGE_CODES.OBJECT_PROPERTY_NAMES]: \\`property name \"%s\" is invalid\\`,\n [MESSAGE_CODES.OBJECT_DEPENDENCIES]: \"requires %s when present\",\n [MESSAGE_CODES.OBJECT_UNEVALUATED_PROPERTIES]: \\`should not have unevaluated property \"%s\"\\`,\n\n // Enum and const\n [MESSAGE_CODES.ENUM_MISMATCH]: \"must be one of: %s\",\n [MESSAGE_CODES.CONST_MISMATCH]: \"must be equal to %s\",\n\n // Conditional\n [MESSAGE_CODES.CONDITIONAL_IF]: \"does not match the conditional schema\",\n [MESSAGE_CODES.CONDITIONAL_THEN]: \\`does not satisfy the \"then\" schema condition\\`,\n [MESSAGE_CODES.CONDITIONAL_ELSE]: \\`does not satisfy the \"else\" schema condition\\`,\n\n // Composition\n [MESSAGE_CODES.COMPOSITION_ONE_OF]:\n \"must match exactly one schema (currently matches %d)\",\n [MESSAGE_CODES.COMPOSITION_ANY_OF]: \"must match at least one schema\",\n [MESSAGE_CODES.COMPOSITION_ALL_OF]: \"must match all schemas\",\n [MESSAGE_CODES.COMPOSITION_NOT]: \"must not match the schema\",\n\n // Content\n [MESSAGE_CODES.CONTENT_DISCRIMINATOR]: \\`discriminator property \"%s\" has invalid value\\`,\n [MESSAGE_CODES.CONTENT_ENCODING]: \\`content encoding \"%s\" is invalid\\`,\n [MESSAGE_CODES.CONTENT_MEDIA_TYPE]: \\`content media type \"%s\" is invalid\\`,\n\n // Custom keywords\n [MESSAGE_CODES.CUSTOM_RANGE]: \"must be within the range %s to %s\",\n [MESSAGE_CODES.CUSTOM_EXCLUSIVE_RANGE]:\n \"must be strictly within the range %s to %s\",\n [MESSAGE_CODES.CUSTOM_REGEXP]: \"must match the regular expression pattern\",\n [MESSAGE_CODES.CUSTOM_DYNAMIC_DEFAULTS]:\n \"failed to apply dynamic default value\",\n [MESSAGE_CODES.CUSTOM_SELECT]: \"does not match any of the selected cases\",\n [MESSAGE_CODES.CUSTOM_TRANSFORM]: \"transformation failed\",\n [MESSAGE_CODES.CUSTOM_UNIQUE_ITEM_PROPERTIES]:\n \"must have unique values for %s: %s\",\n\n // Fallback\n [MESSAGE_CODES.UNKNOWN]: \\`validation failed for keyword \"%s\"\\`,\n};\n\n/**\n * Comprehensive error handler for TypeBox validation errors.\n * Supports most JSON Schema validation keywords and produces human-friendly messages\n * with i18n/l10n support through message code mapping.\n */\nexport const errorHandlerFactory = (\n customMessages?: Partial<Record<keyof ValidationMessages, string>>,\n) => {\n const messageMap = { ...MESSAGE_MAP, ...customMessages };\n\n /**\n * Formats the instancePath into a human-readable field name\n */\n function formatFieldPath(instancePath: string, schemaPath?: string): string {\n if (!instancePath?.trim?.()) {\n return \"root\";\n }\n\n // Check if this is a tuple validation (prefixItems in schemaPath)\n const isTupleItem = schemaPath?.includes(\"/prefixItems/\");\n\n // Remove leading slash and convert to readable format\n const formatted = instancePath\n .replace(/^\\\\//, \"\")\n .replace(/\\\\//g, \" ➜ \")\n .replace(/(\\\\d+)/g, (match) => {\n const index = Number(match);\n // For tuples, use more readable position labels\n if (isTupleItem) {\n const positions = [\n messageMap[MESSAGE_CODES.FIRST],\n messageMap[MESSAGE_CODES.SECOND],\n messageMap[MESSAGE_CODES.THIRD],\n messageMap[MESSAGE_CODES.FOURTH],\n messageMap[MESSAGE_CODES.FIFTH],\n ];\n return positions[index] //\n ? \\`(\\${positions[index]})\\`\n : \\`[\\${match}]\\`;\n }\n return \\`[\\${match}]\\`;\n })\n .replace(/➜ \\\\[/g, \"[\")\n .replace(/➜ \\\\(/g, \" \");\n\n return formatted;\n }\n\n /**\n * Pluralizes a word based on count\n */\n function pluralize(\n count: number,\n plural: string = messageMap[MESSAGE_CODES.PLURAL_SUFFIX],\n ): string {\n return count === 1 ? \"\" : plural;\n }\n\n /**\n * Maps validation error to error code and formats message\n */\n function getErrorCodeAndMessage(error: TValidationError): {\n code: keyof ValidationMessages;\n message: string;\n } {\n const { keyword, params, schemaPath } = error;\n const isTupleValidation = schemaPath?.includes(\"/prefixItems/\");\n\n const defaultMessage = format(messageMap[MESSAGE_CODES.UNKNOWN], keyword);\n\n const defaultError = {\n code: MESSAGE_CODES.UNKNOWN,\n message:\n \"message\" in error\n ? typeof error.message === \"string\"\n ? error.message || defaultMessage\n : JSON.stringify(error.message)\n : defaultMessage,\n };\n\n switch (keyword) {\n // Type validation\n case \"type\": {\n const p = params as { type: string };\n return {\n code: MESSAGE_CODES.TYPE_INVALID,\n message: format(messageMap[MESSAGE_CODES.TYPE_INVALID], p.type),\n };\n }\n\n // String validation\n case \"minLength\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.STRING_MIN_LENGTH,\n message: format(\n messageMap[MESSAGE_CODES.STRING_MIN_LENGTH],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"maxLength\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.STRING_MAX_LENGTH,\n message: format(\n messageMap[MESSAGE_CODES.STRING_MAX_LENGTH],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"pattern\":\n return {\n code: MESSAGE_CODES.STRING_PATTERN,\n message: messageMap[MESSAGE_CODES.STRING_PATTERN],\n };\n\n case \"format\": {\n const p = params as { format: string };\n const formatMap: Record<string, keyof ValidationMessages> = {\n email: MESSAGE_CODES.STRING_FORMAT_EMAIL,\n date: MESSAGE_CODES.STRING_FORMAT_DATE,\n \"date-time\": MESSAGE_CODES.STRING_FORMAT_DATETIME,\n time: MESSAGE_CODES.STRING_FORMAT_TIME,\n uri: MESSAGE_CODES.STRING_FORMAT_URI,\n url: MESSAGE_CODES.STRING_FORMAT_URL,\n uuid: MESSAGE_CODES.STRING_FORMAT_UUID,\n ipv4: MESSAGE_CODES.STRING_FORMAT_IPV4,\n ipv6: MESSAGE_CODES.STRING_FORMAT_IPV6,\n hostname: MESSAGE_CODES.STRING_FORMAT_HOSTNAME,\n \"json-pointer\": MESSAGE_CODES.STRING_FORMAT_JSON_POINTER,\n regex: MESSAGE_CODES.STRING_FORMAT_REGEX,\n };\n const code = formatMap[p.format] || MESSAGE_CODES.STRING_FORMAT;\n const message = formatMap[p.format]\n ? messageMap[code]\n : format(messageMap[MESSAGE_CODES.STRING_FORMAT], p.format);\n return { code, message };\n }\n\n // Number validation\n case \"minimum\": {\n const p = params as { comparison: string; limit: number };\n return {\n code: MESSAGE_CODES.NUMBER_MINIMUM,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_MINIMUM],\n p.comparison,\n p.limit,\n ),\n };\n }\n\n case \"maximum\": {\n const p = params as { comparison: string; limit: number };\n return {\n code: MESSAGE_CODES.NUMBER_MAXIMUM,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_MAXIMUM],\n p.comparison,\n p.limit,\n ),\n };\n }\n\n case \"exclusiveMinimum\": {\n const p = params as { comparison: string; limit: number };\n return {\n code: MESSAGE_CODES.NUMBER_EXCLUSIVE_MINIMUM,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_EXCLUSIVE_MINIMUM],\n p.comparison,\n p.limit,\n ),\n };\n }\n\n case \"exclusiveMaximum\": {\n const p = params as { comparison: string; limit: number };\n return {\n code: MESSAGE_CODES.NUMBER_EXCLUSIVE_MAXIMUM,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_EXCLUSIVE_MAXIMUM],\n p.comparison,\n p.limit,\n ),\n };\n }\n\n case \"multipleOf\": {\n const p = params as { multipleOf: number };\n return {\n code: MESSAGE_CODES.NUMBER_MULTIPLE_OF,\n message: format(\n messageMap[MESSAGE_CODES.NUMBER_MULTIPLE_OF],\n p.multipleOf,\n ),\n };\n }\n\n // Array validation\n case \"minItems\": {\n const p = params as { limit: number };\n if (isTupleValidation) {\n return {\n code: MESSAGE_CODES.TUPLE_MIN_ITEMS,\n message: format(\n messageMap[MESSAGE_CODES.TUPLE_MIN_ITEMS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n return {\n code: MESSAGE_CODES.ARRAY_MIN_ITEMS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_MIN_ITEMS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"maxItems\": {\n const p = params as { limit: number };\n if (isTupleValidation) {\n return {\n code: MESSAGE_CODES.TUPLE_MAX_ITEMS,\n message: format(\n messageMap[MESSAGE_CODES.TUPLE_MAX_ITEMS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n return {\n code: MESSAGE_CODES.ARRAY_MAX_ITEMS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_MAX_ITEMS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"uniqueItems\": {\n const p = params as { duplicateItems?: number[] };\n const duplicateCount = p.duplicateItems?.length || 0;\n const suffix = duplicateCount\n ? format(\n messageMap[MESSAGE_CODES.FOUND_N_DUPLICATES],\n duplicateCount,\n pluralize(duplicateCount),\n )\n : \"\";\n return {\n code: MESSAGE_CODES.ARRAY_UNIQUE_ITEMS,\n message: format(messageMap[MESSAGE_CODES.ARRAY_UNIQUE_ITEMS], suffix),\n };\n }\n\n case \"contains\": {\n const p = params as { minContains?: number };\n const minContains = p.minContains || 1;\n return {\n code: MESSAGE_CODES.ARRAY_CONTAINS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_CONTAINS],\n minContains,\n pluralize(minContains),\n ),\n };\n }\n\n case \"unevaluatedItems\":\n return {\n code: MESSAGE_CODES.ARRAY_UNEVALUATED_ITEMS,\n message: messageMap[MESSAGE_CODES.ARRAY_UNEVALUATED_ITEMS],\n };\n\n // Object validation\n case \"required\": {\n const p = params as {\n requiredProperties?: string[];\n missingProperty?: string;\n };\n const missingProps = p.requiredProperties || p.missingProperty;\n if (Array.isArray(missingProps)) {\n const props = missingProps.map((prop) => \\`\"\\${prop}\"\\`).join(\", \");\n const propWord =\n missingProps.length === 1 //\n ? messageMap[MESSAGE_CODES.PROPERTY]\n : messageMap[MESSAGE_CODES.PROPERTIES];\n return {\n code: MESSAGE_CODES.OBJECT_REQUIRED,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_REQUIRED],\n propWord,\n props,\n ),\n };\n }\n return {\n code: MESSAGE_CODES.OBJECT_REQUIRED,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_REQUIRED],\n messageMap[MESSAGE_CODES.PROPERTY],\n \\`\"\\${missingProps}\"\\`,\n ),\n };\n }\n\n case \"additionalProperties\": {\n const p = params as { additionalProperties: string[] };\n return {\n code: MESSAGE_CODES.OBJECT_ADDITIONAL_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_ADDITIONAL_PROPERTIES],\n p.additionalProperties.join(\", \"),\n ),\n };\n }\n\n case \"minProperties\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.OBJECT_MIN_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_MIN_PROPERTIES],\n p.limit,\n messageMap[\n p.limit === 1 //\n ? MESSAGE_CODES.PROPERTY\n : MESSAGE_CODES.PROPERTIES\n ],\n ),\n };\n }\n\n case \"maxProperties\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.OBJECT_MAX_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_MAX_PROPERTIES],\n p.limit,\n messageMap[\n p.limit === 1 //\n ? MESSAGE_CODES.PROPERTY\n : MESSAGE_CODES.PROPERTIES\n ],\n ),\n };\n }\n\n case \"propertyNames\": {\n const p = params as { propertyNames: string[] };\n return {\n code: MESSAGE_CODES.OBJECT_PROPERTY_NAMES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_PROPERTY_NAMES],\n p.propertyNames.join(\", \"),\n ),\n };\n }\n\n case \"dependencies\":\n case \"dependentRequired\": {\n const p = params as {\n deps?: string | string[];\n dependentRequired?: string | string[];\n };\n const deps = p.deps || p.dependentRequired;\n const depsStr = Array.isArray(deps)\n ? deps.map((d) => \\`\"\\${d}\"\\`).join(\", \")\n : deps;\n return {\n code: MESSAGE_CODES.OBJECT_DEPENDENCIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_DEPENDENCIES],\n depsStr,\n ),\n };\n }\n\n case \"unevaluatedProperties\": {\n const p = params as { unevaluatedProperties: string[] };\n return {\n code: MESSAGE_CODES.OBJECT_UNEVALUATED_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.OBJECT_UNEVALUATED_PROPERTIES],\n p.unevaluatedProperties.join(\", \"),\n ),\n };\n }\n\n // Enum and const\n case \"enum\": {\n const p = params as { allowedValues: unknown[] };\n if (Array.isArray(p.allowedValues) && p.allowedValues.length <= 5) {\n const values = p.allowedValues\n .map((v) => JSON.stringify(v))\n .join(\", \");\n return {\n code: MESSAGE_CODES.ENUM_MISMATCH,\n message: format(messageMap[MESSAGE_CODES.ENUM_MISMATCH], values),\n };\n }\n return {\n code: MESSAGE_CODES.ENUM_MISMATCH,\n message: format(\n messageMap[MESSAGE_CODES.ENUM_MISMATCH],\n messageMap[MESSAGE_CODES.ALLOWED_VALUES],\n ),\n };\n }\n\n case \"const\": {\n const p = params as { allowedValue: unknown };\n return {\n code: MESSAGE_CODES.CONST_MISMATCH,\n message: format(\n messageMap[MESSAGE_CODES.CONST_MISMATCH],\n JSON.stringify(p.allowedValue),\n ),\n };\n }\n\n // Conditional schemas\n case \"if\":\n return {\n code: MESSAGE_CODES.CONDITIONAL_IF,\n message: messageMap[MESSAGE_CODES.CONDITIONAL_IF],\n };\n\n // Composition\n case \"oneOf\": {\n const p = params as { passingSchemas?: number[] };\n return {\n code: MESSAGE_CODES.COMPOSITION_ONE_OF,\n message: format(\n messageMap[MESSAGE_CODES.COMPOSITION_ONE_OF],\n p.passingSchemas?.length || 0,\n ),\n };\n }\n\n case \"anyOf\":\n return {\n code: MESSAGE_CODES.COMPOSITION_ANY_OF,\n message: messageMap[MESSAGE_CODES.COMPOSITION_ANY_OF],\n };\n\n case \"not\":\n return {\n code: MESSAGE_CODES.COMPOSITION_NOT,\n message: messageMap[MESSAGE_CODES.COMPOSITION_NOT],\n };\n\n case \"boolean\":\n // Schema explicitly set to false - usually for additionalItems in tuples\n if (\n schemaPath?.includes(\"/items\") ||\n schemaPath?.includes(\"/additionalItems\")\n ) {\n return {\n code: MESSAGE_CODES.ARRAY_ITEMS,\n message: messageMap[MESSAGE_CODES.ARRAY_ITEMS],\n };\n }\n return defaultError;\n\n /**\n * TODO: Periodically check the TypeBox repository for implementation updates.\n * Some validation cases (minContains, prefixItems, etc.) are not yet\n * implemented by TypeBox, so they are commented out below.\n */\n\n /**\n case \"minContains\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.ARRAY_MIN_CONTAINS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_MIN_CONTAINS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"maxContains\": {\n const p = params as { limit: number };\n return {\n code: MESSAGE_CODES.ARRAY_MAX_CONTAINS,\n message: format(\n messageMap[MESSAGE_CODES.ARRAY_MAX_CONTAINS],\n p.limit,\n pluralize(p.limit),\n ),\n };\n }\n\n case \"prefixItems\":\n return {\n code: MESSAGE_CODES.ARRAY_PREFIX_ITEMS,\n message: messageMap[MESSAGE_CODES.ARRAY_PREFIX_ITEMS],\n };\n\n case \"items\":\n return {\n code: MESSAGE_CODES.ARRAY_ITEMS,\n message: messageMap[MESSAGE_CODES.ARRAY_ITEMS],\n };\n\n case \"then\":\n return {\n code: MESSAGE_CODES.CONDITIONAL_THEN,\n message: messageMap[MESSAGE_CODES.CONDITIONAL_THEN],\n };\n\n case \"else\":\n return {\n code: MESSAGE_CODES.CONDITIONAL_ELSE,\n message: messageMap[MESSAGE_CODES.CONDITIONAL_ELSE],\n };\n\n case \"allOf\":\n return {\n code: MESSAGE_CODES.COMPOSITION_ALL_OF,\n message: messageMap[MESSAGE_CODES.COMPOSITION_ALL_OF],\n };\n\n // Content validation\n case \"discriminator\": {\n const p = params as { propertyName: string };\n return {\n code: MESSAGE_CODES.CONTENT_DISCRIMINATOR,\n message: format(\n messageMap[MESSAGE_CODES.CONTENT_DISCRIMINATOR],\n p.propertyName,\n ),\n };\n }\n\n case \"contentEncoding\": {\n const p = params as { encoding: string };\n return {\n code: MESSAGE_CODES.CONTENT_ENCODING,\n message: format(\n messageMap[MESSAGE_CODES.CONTENT_ENCODING],\n p.encoding,\n ),\n };\n }\n\n case \"contentMediaType\": {\n const p = params as { mediaType: string };\n return {\n code: MESSAGE_CODES.CONTENT_MEDIA_TYPE,\n message: format(\n messageMap[MESSAGE_CODES.CONTENT_MEDIA_TYPE],\n p.mediaType,\n ),\n };\n }\n\n // Custom keywords\n case \"range\": {\n const p = params as { min?: number; max?: number };\n return {\n code: MESSAGE_CODES.CUSTOM_RANGE,\n message: format(messageMap[MESSAGE_CODES.CUSTOM_RANGE], p.min, p.max),\n };\n }\n\n case \"exclusiveRange\": {\n const p = params as { min?: number; max?: number };\n return {\n code: MESSAGE_CODES.CUSTOM_EXCLUSIVE_RANGE,\n message: format(\n messageMap[MESSAGE_CODES.CUSTOM_EXCLUSIVE_RANGE],\n p.min,\n p.max,\n ),\n };\n }\n\n case \"regexp\":\n return {\n code: MESSAGE_CODES.CUSTOM_REGEXP,\n message: messageMap[MESSAGE_CODES.CUSTOM_REGEXP],\n };\n\n case \"dynamicDefaults\":\n return {\n code: MESSAGE_CODES.CUSTOM_DYNAMIC_DEFAULTS,\n message: messageMap[MESSAGE_CODES.CUSTOM_DYNAMIC_DEFAULTS],\n };\n\n case \"select\":\n case \"selectCases\":\n case \"selectDefault\":\n return {\n code: MESSAGE_CODES.CUSTOM_SELECT,\n message: messageMap[MESSAGE_CODES.CUSTOM_SELECT],\n };\n\n case \"transform\":\n return {\n code: MESSAGE_CODES.CUSTOM_TRANSFORM,\n message: messageMap[MESSAGE_CODES.CUSTOM_TRANSFORM],\n };\n\n case \"uniqueItemProperties\": {\n const p = params as { properties?: string[] };\n const props = p.properties || [];\n return {\n code: MESSAGE_CODES.CUSTOM_UNIQUE_ITEM_PROPERTIES,\n message: format(\n messageMap[MESSAGE_CODES.CUSTOM_UNIQUE_ITEM_PROPERTIES],\n messageMap[\n props.length === 1 //\n ? MESSAGE_CODES.PROPERTY\n : MESSAGE_CODES.PROPERTIES\n ],\n props.join(\", \"),\n ),\n };\n }\n */\n\n // Default fallback\n default: {\n return defaultError;\n }\n }\n }\n\n /**\n * Groups errors by field to avoid duplicate messages\n */\n function groupErrorsByField(\n errors: TValidationError[],\n ): Map<string, TValidationError[]> {\n const grouped = new Map<string, TValidationError[]>();\n\n for (const error of errors) {\n const field = error.instancePath;\n if (!grouped.has(field)) {\n grouped.set(field, []);\n }\n grouped.get(field)?.push(error);\n }\n\n return grouped;\n }\n\n /**\n * Prioritizes errors to show the most important one per field\n */\n function prioritizeErrors(errors: TValidationError[]): TValidationError {\n // Priority order: required > type > format > const/enum > other constraints\n const priority: Record<string, number> = {\n required: 1,\n type: 2,\n format: 3,\n const: 4,\n enum: 4,\n pattern: 5,\n minimum: 6,\n maximum: 6,\n exclusiveMinimum: 6,\n exclusiveMaximum: 6,\n minLength: 6,\n maxLength: 6,\n minItems: 6,\n maxItems: 6,\n minProperties: 6,\n maxProperties: 6,\n };\n\n return errors.sort((a, b) => {\n const aPriority = priority[a.keyword] || 99;\n const bPriority = priority[b.keyword] || 99;\n return aPriority - bPriority;\n })[0];\n }\n\n // ============================================================================\n // Public API\n // ============================================================================\n\n /**\n * Main function to format validation errors\n */\n function formatValidationErrors(\n errors: TValidationError[],\n options: {\n groupByField?: boolean;\n singleError?: boolean;\n } = {},\n ): Array<ValidationErrorEntry> {\n if (!errors?.length) {\n return [];\n }\n\n const { groupByField = true, singleError = false } = options;\n\n if (singleError) {\n // Return only the first error\n const error = errors[0];\n const { code, message } = getErrorCodeAndMessage(error);\n return [\n {\n keyword: error.keyword,\n path: formatFieldPath(error.instancePath, error.schemaPath),\n message,\n code,\n params: error.params,\n },\n ];\n }\n\n if (groupByField) {\n // Group errors by field and return one error per field\n const grouped = groupErrorsByField(errors);\n const formatted: ValidationErrorEntry[] = [];\n\n for (const [_, fieldErrors] of grouped) {\n const prioritized = prioritizeErrors(fieldErrors);\n const { code, message } = getErrorCodeAndMessage(prioritized);\n formatted.push({\n keyword: prioritized.keyword,\n path: formatFieldPath(\n prioritized.instancePath,\n prioritized.schemaPath,\n ),\n message,\n code,\n params: prioritized.params,\n });\n }\n\n return formatted;\n }\n\n // Return all errors\n return errors.map((error) => {\n const { code, message } = getErrorCodeAndMessage(error);\n return {\n keyword: error.keyword,\n path: formatFieldPath(error.instancePath, error.schemaPath),\n message,\n code,\n params: error.params,\n };\n });\n }\n\n /**\n * Formats errors into a single human-readable message\n */\n function formatValidationErrorMessage(\n errors: TValidationError[],\n options: {\n prefix?: string;\n separator?: string;\n includeField?: boolean;\n } = {},\n ): string {\n const {\n prefix = messageMap[MESSAGE_CODES.VALIDATION_FAILED_PREFIX],\n separator = \"; \",\n includeField = true,\n } = options;\n\n const formatted = formatValidationErrors(errors, { groupByField: true });\n\n const messageList = formatted.map((error) => {\n if (includeField && error.path !== \"root\") {\n return \\`\\${error.path}: \\${error.message}\\`;\n }\n return error.message;\n });\n\n return \\`\\${prefix}\\${prefix ? \" \" : \"\"}\\${messageList.join(separator)}\\`;\n }\n\n /**\n * Gets a simple error summary for quick feedback\n */\n function getErrorSummary(errors: TValidationError[]): string {\n if (!errors?.length) {\n return messageMap[MESSAGE_CODES.VALIDATION_PASSED];\n }\n\n const uniqueFields = new Set(errors.map((e) => e.instancePath));\n const fieldCount = uniqueFields.size;\n\n if (fieldCount === 1) {\n const error = errors[0];\n const { message } = getErrorCodeAndMessage(error);\n const field = formatFieldPath(error.instancePath, error.schemaPath);\n return field === \"root\" ? message : \\`\\${field}: \\${message}\\`;\n }\n\n return format(\n messageMap[MESSAGE_CODES.ERROR_SUMMARY],\n errors.length,\n pluralize(errors.length),\n fieldCount,\n pluralize(fieldCount),\n );\n }\n\n return {\n formatValidationErrors,\n formatValidationErrorMessage,\n getErrorSummary,\n };\n};\n\n/**\n * Standalone format function for browser builds.\n * Avoids importing node:util to keep bundle size small and browser-compatible.\n * Supports: %s (string), %d (number), %i (integer), %f (float), %% (literal %)\n * */\nconst format = (fmt: string, ...args: unknown[]): string => {\n const argsIterator = args[Symbol.iterator]();\n\n // Handle format specifiers\n const str = String(fmt).replace(/%[sdif%]/g, (match) => {\n if (match === \"%%\") {\n return \"%\";\n }\n\n const next = argsIterator.next();\n\n if (next.done) {\n return match;\n }\n\n const arg = next.value;\n\n switch (match) {\n case \"%s\": // String\n return String(arg);\n case \"%d\": // Number\n return String(Number(arg));\n case \"%i\": // Integer\n return String(parseInt(String(arg), 10));\n case \"%f\": // Float\n return String(parseFloat(String(arg)));\n default:\n return match;\n }\n });\n\n // Append remaining arguments\n const remaining = [...argsIterator];\n\n if (remaining.length > 0) {\n return [str, remaining.map((arg) => String(arg)).join(\" \")].join(\" \");\n }\n\n return str;\n};\n`,c=`import Type from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport Value from \"typebox/value\";\n\nimport type { ValidationSchema, ValidationTarget } from \"@kosmojs/core\";\nimport { ValidationError } from \"@kosmojs/core/errors\";\n\nimport { errorHandlerFactory } from \"./error-handler\";\nimport { customTypes, validationMessages } from \"./setup\";\n\nconst {\n formatValidationErrors,\n formatValidationErrorMessage,\n getErrorSummary,\n} = errorHandlerFactory(validationMessages);\n\nexport const validationSchemaFactory = (\n schemaText: string,\n { target, route }: { target: ValidationTarget | \"params\"; route: string },\n): ValidationSchema => {\n const schema = Type.Script(customTypes, schemaText);\n const compiledSchema = Compile(schema);\n const getSchemaErrors = (data: unknown) => Value.Errors(schema, data);\n return {\n check(data) {\n return compiledSchema.Check(data);\n },\n errors(data) {\n return formatValidationErrors(getSchemaErrors(data));\n },\n errorMessage(data) {\n return formatValidationErrorMessage(getSchemaErrors(data));\n },\n errorSummary(data) {\n return getErrorSummary(getSchemaErrors(data));\n },\n validate(data) {\n if (!this.check(data)) {\n throw new ValidationError([\n target,\n {\n errors: this.errors(data),\n errorMessage: this.errorMessage(data),\n errorSummary: this.errorSummary(data),\n route,\n data,\n },\n ]);\n }\n },\n };\n};\n`,l=`import { Settings } from \"typebox/system\";\n\nSettings.Set({{settings}});\n\nexport { default as customTypes } from \"{{customTypesImport}}\";\n\nexport const validationMessages = {{validationMessages}};\n`,u=`import type { ValidationSchemas } from \"@kosmojs/core\";\n\nimport { validationSchemaFactory } from \"{{ createImport 'lib' '@typebox' }}\";\n\nconst schemas = {\n{{#each resolvedTypes}} {{name}}: \\`{{typeboxSchema}}\\`,\n{{/each}}\n}\n\nexport const validationSchemas: ValidationSchemas = {\n params: validationSchemaFactory(\n schemas.{{route.params.id}},\n { route: \"{{route.name}}\", target: \"params\" },\n ),\n\n {{#each requestSchemas}}\n {{target}}: {\n {{#each methods}}\n {{method}}: {\n ...validationSchemaFactory(\n schemas.{{schema.id}},\n { route: \"{{route}}\", target: \"{{target}}\" },\n ),\n {{#if runtimeValidation}}\n runtimeValidation: {{runtimeValidation}},\n {{/if}}\n {{#if customErrors}}\n customErrors: {{customErrors}},\n {{/if}}\n },\n {{/each}}\n },\n {{/each}}\n\n response: {\n {{#each responseSchemas}}\n {{method}}: [\n {{#each variants}}\n {\n {{#if resolvedType}}\n ...validationSchemaFactory(\n schemas.{{id}},\n { route: \"{{route}}\", target: \"{{target}}\" },\n ),\n {{/if}}\n status: {{status}},\n {{#if contentType}}\n contentType: \"{{contentType}}\",\n {{/if}}\n {{#if runtimeValidation}}\n runtimeValidation: {{runtimeValidation}},\n {{/if}}\n {{#if customErrors}}\n customErrors: {{customErrors}},\n {{/if}}\n },\n {{/each}}\n ],\n {{/each}}\n },\n};\n`,d={exactOptionalPropertyTypes:!0},f=t((e,t)=>{let{createPath:a,createImport:f,createImportHelpers:p}=n(e),{renderToFile:m}=r({helpers:{...p({origin:`lib`})}}),{validationMessages:h={},customTypesImport:g=f.lib([`@typebox/custom-types`],{origin:`lib`}),settings:_}={...t},v=async e=>{for(let{kind:t,entry:n}of e){if(t!==`apiRoute`)continue;let e=[n.params,...n.validationDefinitions.flatMap(e=>e.target===`response`?e.variants:[e.schema])].flatMap(({resolvedType:e})=>e?[e]:[]),r=[...new Set(n.validationDefinitions.flatMap(({target:e})=>Object.keys(i).includes(e)?[e]:[]))].map(e=>({target:e,methods:n.methods.flatMap(t=>{let r=n.validationDefinitions.find(n=>n.method===t&&n.target===e);return r?[{route:n.name,method:t,target:e,schema:r.schema,...r.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(r.runtimeValidation)},...r.customErrors===void 0?{}:{customErrors:JSON.stringify(r.customErrors)}}]:[]})})),o=n.methods.flatMap(e=>{let t=n.validationDefinitions.find(t=>t.method===e&&t.target===`response`);return t?[{method:e,variants:t.variants.map(e=>({route:n.name,target:`response`,...e,...t.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(t.runtimeValidation)},...t.customErrors===void 0?{}:{customErrors:JSON.stringify(t.customErrors)}}))}]:[]});await m(a.libApi(n.name,`schemas.ts`),u,{route:n,resolvedTypes:e,requestSchemas:r,responseSchemas:o})}};return{async start(){for(let[e,t]of[[`custom-types.ts`,o],[`error-handler.ts`,s],[`index.ts`,c],[`setup.ts`,l]])await m(a.lib(`@typebox`,e),t,{validationMessages:JSON.stringify(h),customTypesImport:g,settings:JSON.stringify({...d,..._})})},async watch(e,t){await v(t?e.filter(({kind:e,entry:n})=>t.kind===`update`&&e===`apiRoute`&&n.fileFullpath===t.file):e)},async build(e){await v(e)}}}),p={PROPERTY:`PROPERTY`,PROPERTIES:`PROPERTIES`,ALLOWED_VALUES:`ALLOWED_VALUES`,FOUND_N_DUPLICATES:`FOUND_N_DUPLICATES`,VALIDATION_PASSED:`VALIDATION_PASSED`,VALIDATION_FAILED_PREFIX:`VALIDATION_FAILED_PREFIX`,ERROR_SUMMARY:`ERROR_SUMMARY`,PLURAL_SUFFIX:`PLURAL_SUFFIX`,FIRST:`FIRST`,SECOND:`SECOND`,THIRD:`THIRD`,FOURTH:`FOURTH`,FIFTH:`FIFTH`,TYPE_INVALID:`TYPE_INVALID`,STRING_MIN_LENGTH:`STRING_MIN_LENGTH`,STRING_MAX_LENGTH:`STRING_MAX_LENGTH`,STRING_PATTERN:`STRING_PATTERN`,STRING_FORMAT:`STRING_FORMAT`,STRING_FORMAT_EMAIL:`STRING_FORMAT_EMAIL`,STRING_FORMAT_DATE:`STRING_FORMAT_DATE`,STRING_FORMAT_DATETIME:`STRING_FORMAT_DATETIME`,STRING_FORMAT_TIME:`STRING_FORMAT_TIME`,STRING_FORMAT_URI:`STRING_FORMAT_URI`,STRING_FORMAT_URL:`STRING_FORMAT_URL`,STRING_FORMAT_UUID:`STRING_FORMAT_UUID`,STRING_FORMAT_IPV4:`STRING_FORMAT_IPV4`,STRING_FORMAT_IPV6:`STRING_FORMAT_IPV6`,STRING_FORMAT_HOSTNAME:`STRING_FORMAT_HOSTNAME`,STRING_FORMAT_JSON_POINTER:`STRING_FORMAT_JSON_POINTER`,STRING_FORMAT_REGEX:`STRING_FORMAT_REGEX`,NUMBER_MINIMUM:`NUMBER_MINIMUM`,NUMBER_MAXIMUM:`NUMBER_MAXIMUM`,NUMBER_EXCLUSIVE_MINIMUM:`NUMBER_EXCLUSIVE_MINIMUM`,NUMBER_EXCLUSIVE_MAXIMUM:`NUMBER_EXCLUSIVE_MAXIMUM`,NUMBER_MULTIPLE_OF:`NUMBER_MULTIPLE_OF`,ARRAY_MIN_ITEMS:`ARRAY_MIN_ITEMS`,ARRAY_MAX_ITEMS:`ARRAY_MAX_ITEMS`,ARRAY_UNIQUE_ITEMS:`ARRAY_UNIQUE_ITEMS`,ARRAY_CONTAINS:`ARRAY_CONTAINS`,ARRAY_MIN_CONTAINS:`ARRAY_MIN_CONTAINS`,ARRAY_MAX_CONTAINS:`ARRAY_MAX_CONTAINS`,ARRAY_PREFIX_ITEMS:`ARRAY_PREFIX_ITEMS`,ARRAY_ITEMS:`ARRAY_ITEMS`,ARRAY_UNEVALUATED_ITEMS:`ARRAY_UNEVALUATED_ITEMS`,TUPLE_MIN_ITEMS:`TUPLE_MIN_ITEMS`,TUPLE_MAX_ITEMS:`TUPLE_MAX_ITEMS`,OBJECT_REQUIRED:`OBJECT_REQUIRED`,OBJECT_ADDITIONAL_PROPERTIES:`OBJECT_ADDITIONAL_PROPERTIES`,OBJECT_MIN_PROPERTIES:`OBJECT_MIN_PROPERTIES`,OBJECT_MAX_PROPERTIES:`OBJECT_MAX_PROPERTIES`,OBJECT_PROPERTY_NAMES:`OBJECT_PROPERTY_NAMES`,OBJECT_DEPENDENCIES:`OBJECT_DEPENDENCIES`,OBJECT_UNEVALUATED_PROPERTIES:`OBJECT_UNEVALUATED_PROPERTIES`,ENUM_MISMATCH:`ENUM_MISMATCH`,CONST_MISMATCH:`CONST_MISMATCH`,CONDITIONAL_IF:`CONDITIONAL_IF`,CONDITIONAL_THEN:`CONDITIONAL_THEN`,CONDITIONAL_ELSE:`CONDITIONAL_ELSE`,COMPOSITION_ONE_OF:`COMPOSITION_ONE_OF`,COMPOSITION_ANY_OF:`COMPOSITION_ANY_OF`,COMPOSITION_ALL_OF:`COMPOSITION_ALL_OF`,COMPOSITION_NOT:`COMPOSITION_NOT`,CONTENT_DISCRIMINATOR:`CONTENT_DISCRIMINATOR`,CONTENT_ENCODING:`CONTENT_ENCODING`,CONTENT_MEDIA_TYPE:`CONTENT_MEDIA_TYPE`,CUSTOM_RANGE:`CUSTOM_RANGE`,CUSTOM_EXCLUSIVE_RANGE:`CUSTOM_EXCLUSIVE_RANGE`,CUSTOM_REGEXP:`CUSTOM_REGEXP`,CUSTOM_DYNAMIC_DEFAULTS:`CUSTOM_DYNAMIC_DEFAULTS`,CUSTOM_SELECT:`CUSTOM_SELECT`,CUSTOM_TRANSFORM:`CUSTOM_TRANSFORM`,CUSTOM_UNIQUE_ITEM_PROPERTIES:`CUSTOM_UNIQUE_ITEM_PROPERTIES`,UNKNOWN:`UNKNOWN`},m={[p.PROPERTY]:`property`,[p.PROPERTIES]:`properties`,[p.ALLOWED_VALUES]:`the allowed values`,[p.FOUND_N_DUPLICATES]:` (found %d duplicate%s)`,[p.VALIDATION_PASSED]:`Validation Passed`,[p.VALIDATION_FAILED_PREFIX]:``,[p.ERROR_SUMMARY]:`%d validation error%s found across %d field%s`,[p.PLURAL_SUFFIX]:`s`,[p.FIRST]:`first`,[p.SECOND]:`second`,[p.THIRD]:`third`,[p.FOURTH]:`fourth`,[p.FIFTH]:`fifth`,[p.TYPE_INVALID]:`must be %s`,[p.STRING_MIN_LENGTH]:`must be at least %d character%s long`,[p.STRING_MAX_LENGTH]:`must not exceed %d character%s`,[p.STRING_PATTERN]:`must match the required pattern`,[p.STRING_FORMAT]:`must match format \"%s\"`,[p.STRING_FORMAT_EMAIL]:`must be a valid email address`,[p.STRING_FORMAT_DATE]:`must be a valid date`,[p.STRING_FORMAT_DATETIME]:`must be a valid date-time`,[p.STRING_FORMAT_TIME]:`must be a valid time`,[p.STRING_FORMAT_URI]:`must be a valid URI`,[p.STRING_FORMAT_URL]:`must be a valid URL`,[p.STRING_FORMAT_UUID]:`must be a valid UUID`,[p.STRING_FORMAT_IPV4]:`must be a valid IPv4 address`,[p.STRING_FORMAT_IPV6]:`must be a valid IPv6 address`,[p.STRING_FORMAT_HOSTNAME]:`must be a valid hostname`,[p.STRING_FORMAT_JSON_POINTER]:`must be a valid JSON pointer`,[p.STRING_FORMAT_REGEX]:`must be a valid regular expression`,[p.NUMBER_MINIMUM]:`must be %s %s`,[p.NUMBER_MAXIMUM]:`must be %s %s`,[p.NUMBER_EXCLUSIVE_MINIMUM]:`must be %s %s`,[p.NUMBER_EXCLUSIVE_MAXIMUM]:`must be %s %s`,[p.NUMBER_MULTIPLE_OF]:`must be a multiple of %s`,[p.ARRAY_MIN_ITEMS]:`must have at least %d item%s`,[p.ARRAY_MAX_ITEMS]:`must not have more than %d item%s`,[p.ARRAY_UNIQUE_ITEMS]:`must not have duplicate items%s`,[p.ARRAY_CONTAINS]:`must contain at least %d valid item%s`,[p.ARRAY_MIN_CONTAINS]:`must contain at least %d item%s matching the criteria`,[p.ARRAY_MAX_CONTAINS]:`must contain no more than %d item%s matching the criteria`,[p.ARRAY_PREFIX_ITEMS]:`tuple structure is invalid`,[p.ARRAY_ITEMS]:`array items are invalid`,[p.ARRAY_UNEVALUATED_ITEMS]:`should not have unevaluated items`,[p.TUPLE_MIN_ITEMS]:`tuple must have at least %d element%s`,[p.TUPLE_MAX_ITEMS]:`tuple must not have more than %d element%s`,[p.OBJECT_REQUIRED]:`missing required %s: %s`,[p.OBJECT_ADDITIONAL_PROPERTIES]:`should not have additional property \"%s\"`,[p.OBJECT_MIN_PROPERTIES]:`must have at least %d %s`,[p.OBJECT_MAX_PROPERTIES]:`must not have more than %d %s`,[p.OBJECT_PROPERTY_NAMES]:`property name \"%s\" is invalid`,[p.OBJECT_DEPENDENCIES]:`requires %s when present`,[p.OBJECT_UNEVALUATED_PROPERTIES]:`should not have unevaluated property \"%s\"`,[p.ENUM_MISMATCH]:`must be one of: %s`,[p.CONST_MISMATCH]:`must be equal to %s`,[p.CONDITIONAL_IF]:`does not match the conditional schema`,[p.CONDITIONAL_THEN]:`does not satisfy the \"then\" schema condition`,[p.CONDITIONAL_ELSE]:`does not satisfy the \"else\" schema condition`,[p.COMPOSITION_ONE_OF]:`must match exactly one schema (currently matches %d)`,[p.COMPOSITION_ANY_OF]:`must match at least one schema`,[p.COMPOSITION_ALL_OF]:`must match all schemas`,[p.COMPOSITION_NOT]:`must not match the schema`,[p.CONTENT_DISCRIMINATOR]:`discriminator property \"%s\" has invalid value`,[p.CONTENT_ENCODING]:`content encoding \"%s\" is invalid`,[p.CONTENT_MEDIA_TYPE]:`content media type \"%s\" is invalid`,[p.CUSTOM_RANGE]:`must be within the range %s to %s`,[p.CUSTOM_EXCLUSIVE_RANGE]:`must be strictly within the range %s to %s`,[p.CUSTOM_REGEXP]:`must match the regular expression pattern`,[p.CUSTOM_DYNAMIC_DEFAULTS]:`failed to apply dynamic default value`,[p.CUSTOM_SELECT]:`does not match any of the selected cases`,[p.CUSTOM_TRANSFORM]:`transformation failed`,[p.CUSTOM_UNIQUE_ITEM_PROPERTIES]:`must have unique values for %s: %s`,[p.UNKNOWN]:`validation failed for keyword \"%s\"`},h=e=>{let t={...m,...e};function n(e,n){if(!e?.trim?.())return`root`;let r=n?.includes(`/prefixItems/`);return e.replace(/^\\//,``).replace(/\\//g,` ➜ `).replace(/(\\d+)/g,e=>{let n=Number(e);if(r){let r=[t[p.FIRST],t[p.SECOND],t[p.THIRD],t[p.FOURTH],t[p.FIFTH]];return r[n]?`(${r[n]})`:`[${e}]`}return`[${e}]`}).replace(/➜ \\[/g,`[`).replace(/➜ \\(/g,` `)}function r(e,n=t[p.PLURAL_SUFFIX]){return e===1?``:n}function i(e){let{keyword:n,params:i,schemaPath:a}=e,o=a?.includes(`/prefixItems/`),s=g(t[p.UNKNOWN],n),c={code:p.UNKNOWN,message:`message`in e?typeof e.message==`string`?e.message||s:JSON.stringify(e.message):s};switch(n){case`type`:{let e=i;return{code:p.TYPE_INVALID,message:g(t[p.TYPE_INVALID],e.type)}}case`minLength`:{let e=i;return{code:p.STRING_MIN_LENGTH,message:g(t[p.STRING_MIN_LENGTH],e.limit,r(e.limit))}}case`maxLength`:{let e=i;return{code:p.STRING_MAX_LENGTH,message:g(t[p.STRING_MAX_LENGTH],e.limit,r(e.limit))}}case`pattern`:return{code:p.STRING_PATTERN,message:t[p.STRING_PATTERN]};case`format`:{let e=i,n={email:p.STRING_FORMAT_EMAIL,date:p.STRING_FORMAT_DATE,\"date-time\":p.STRING_FORMAT_DATETIME,time:p.STRING_FORMAT_TIME,uri:p.STRING_FORMAT_URI,url:p.STRING_FORMAT_URL,uuid:p.STRING_FORMAT_UUID,ipv4:p.STRING_FORMAT_IPV4,ipv6:p.STRING_FORMAT_IPV6,hostname:p.STRING_FORMAT_HOSTNAME,\"json-pointer\":p.STRING_FORMAT_JSON_POINTER,regex:p.STRING_FORMAT_REGEX},r=n[e.format]||p.STRING_FORMAT;return{code:r,message:n[e.format]?t[r]:g(t[p.STRING_FORMAT],e.format)}}case`minimum`:{let e=i;return{code:p.NUMBER_MINIMUM,message:g(t[p.NUMBER_MINIMUM],e.comparison,e.limit)}}case`maximum`:{let e=i;return{code:p.NUMBER_MAXIMUM,message:g(t[p.NUMBER_MAXIMUM],e.comparison,e.limit)}}case`exclusiveMinimum`:{let e=i;return{code:p.NUMBER_EXCLUSIVE_MINIMUM,message:g(t[p.NUMBER_EXCLUSIVE_MINIMUM],e.comparison,e.limit)}}case`exclusiveMaximum`:{let e=i;return{code:p.NUMBER_EXCLUSIVE_MAXIMUM,message:g(t[p.NUMBER_EXCLUSIVE_MAXIMUM],e.comparison,e.limit)}}case`multipleOf`:{let e=i;return{code:p.NUMBER_MULTIPLE_OF,message:g(t[p.NUMBER_MULTIPLE_OF],e.multipleOf)}}case`minItems`:{let e=i;return o?{code:p.TUPLE_MIN_ITEMS,message:g(t[p.TUPLE_MIN_ITEMS],e.limit,r(e.limit))}:{code:p.ARRAY_MIN_ITEMS,message:g(t[p.ARRAY_MIN_ITEMS],e.limit,r(e.limit))}}case`maxItems`:{let e=i;return o?{code:p.TUPLE_MAX_ITEMS,message:g(t[p.TUPLE_MAX_ITEMS],e.limit,r(e.limit))}:{code:p.ARRAY_MAX_ITEMS,message:g(t[p.ARRAY_MAX_ITEMS],e.limit,r(e.limit))}}case`uniqueItems`:{let e=i.duplicateItems?.length||0,n=e?g(t[p.FOUND_N_DUPLICATES],e,r(e)):``;return{code:p.ARRAY_UNIQUE_ITEMS,message:g(t[p.ARRAY_UNIQUE_ITEMS],n)}}case`contains`:{let e=i.minContains||1;return{code:p.ARRAY_CONTAINS,message:g(t[p.ARRAY_CONTAINS],e,r(e))}}case`unevaluatedItems`:return{code:p.ARRAY_UNEVALUATED_ITEMS,message:t[p.ARRAY_UNEVALUATED_ITEMS]};case`required`:{let e=i,n=e.requiredProperties||e.missingProperty;if(Array.isArray(n)){let e=n.map(e=>`\"${e}\"`).join(`, `),r=n.length===1?t[p.PROPERTY]:t[p.PROPERTIES];return{code:p.OBJECT_REQUIRED,message:g(t[p.OBJECT_REQUIRED],r,e)}}return{code:p.OBJECT_REQUIRED,message:g(t[p.OBJECT_REQUIRED],t[p.PROPERTY],`\"${n}\"`)}}case`additionalProperties`:{let e=i;return{code:p.OBJECT_ADDITIONAL_PROPERTIES,message:g(t[p.OBJECT_ADDITIONAL_PROPERTIES],e.additionalProperties.join(`, `))}}case`minProperties`:{let e=i;return{code:p.OBJECT_MIN_PROPERTIES,message:g(t[p.OBJECT_MIN_PROPERTIES],e.limit,t[e.limit===1?p.PROPERTY:p.PROPERTIES])}}case`maxProperties`:{let e=i;return{code:p.OBJECT_MAX_PROPERTIES,message:g(t[p.OBJECT_MAX_PROPERTIES],e.limit,t[e.limit===1?p.PROPERTY:p.PROPERTIES])}}case`propertyNames`:{let e=i;return{code:p.OBJECT_PROPERTY_NAMES,message:g(t[p.OBJECT_PROPERTY_NAMES],e.propertyNames.join(`, `))}}case`dependencies`:case`dependentRequired`:{let e=i,n=e.deps||e.dependentRequired,r=Array.isArray(n)?n.map(e=>`\"${e}\"`).join(`, `):n;return{code:p.OBJECT_DEPENDENCIES,message:g(t[p.OBJECT_DEPENDENCIES],r)}}case`unevaluatedProperties`:{let e=i;return{code:p.OBJECT_UNEVALUATED_PROPERTIES,message:g(t[p.OBJECT_UNEVALUATED_PROPERTIES],e.unevaluatedProperties.join(`, `))}}case`enum`:{let e=i;if(Array.isArray(e.allowedValues)&&e.allowedValues.length<=5){let n=e.allowedValues.map(e=>JSON.stringify(e)).join(`, `);return{code:p.ENUM_MISMATCH,message:g(t[p.ENUM_MISMATCH],n)}}return{code:p.ENUM_MISMATCH,message:g(t[p.ENUM_MISMATCH],t[p.ALLOWED_VALUES])}}case`const`:{let e=i;return{code:p.CONST_MISMATCH,message:g(t[p.CONST_MISMATCH],JSON.stringify(e.allowedValue))}}case`if`:return{code:p.CONDITIONAL_IF,message:t[p.CONDITIONAL_IF]};case`oneOf`:{let e=i;return{code:p.COMPOSITION_ONE_OF,message:g(t[p.COMPOSITION_ONE_OF],e.passingSchemas?.length||0)}}case`anyOf`:return{code:p.COMPOSITION_ANY_OF,message:t[p.COMPOSITION_ANY_OF]};case`not`:return{code:p.COMPOSITION_NOT,message:t[p.COMPOSITION_NOT]};case`boolean`:return a?.includes(`/items`)||a?.includes(`/additionalItems`)?{code:p.ARRAY_ITEMS,message:t[p.ARRAY_ITEMS]}:c;default:return c}}function a(e){let t=new Map;for(let n of e){let e=n.instancePath;t.has(e)||t.set(e,[]),t.get(e)?.push(n)}return t}function o(e){let t={required:1,type:2,format:3,const:4,enum:4,pattern:5,minimum:6,maximum:6,exclusiveMinimum:6,exclusiveMaximum:6,minLength:6,maxLength:6,minItems:6,maxItems:6,minProperties:6,maxProperties:6};return e.sort((e,n)=>(t[e.keyword]||99)-(t[n.keyword]||99))[0]}function s(e,t={}){if(!e?.length)return[];let{groupByField:r=!0,singleError:s=!1}=t;if(s){let t=e[0],{code:r,message:a}=i(t);return[{keyword:t.keyword,path:n(t.instancePath,t.schemaPath),message:a,code:r,params:t.params}]}if(r){let t=a(e),r=[];for(let[e,a]of t){let e=o(a),{code:t,message:s}=i(e);r.push({keyword:e.keyword,path:n(e.instancePath,e.schemaPath),message:s,code:t,params:e.params})}return r}return e.map(e=>{let{code:t,message:r}=i(e);return{keyword:e.keyword,path:n(e.instancePath,e.schemaPath),message:r,code:t,params:e.params}})}function c(e,n={}){let{prefix:r=t[p.VALIDATION_FAILED_PREFIX],separator:i=`; `,includeField:a=!0}=n,o=s(e,{groupByField:!0}).map(e=>a&&e.path!==`root`?`${e.path}: ${e.message}`:e.message);return`${r}${r?` `:``}${o.join(i)}`}function l(e){if(!e?.length)return t[p.VALIDATION_PASSED];let a=new Set(e.map(e=>e.instancePath)).size;if(a===1){let t=e[0],{message:r}=i(t),a=n(t.instancePath,t.schemaPath);return a===`root`?r:`${a}: ${r}`}return g(t[p.ERROR_SUMMARY],e.length,r(e.length),a,r(a))}return{formatValidationErrors:s,formatValidationErrorMessage:c,getErrorSummary:l}},g=(e,...t)=>{let n=t[Symbol.iterator](),r=String(e).replace(/%[sdif%]/g,e=>{if(e===`%%`)return`%`;let t=n.next();if(t.done)return e;let r=t.value;switch(e){case`%s`:return String(r);case`%d`:return String(Number(r));case`%i`:return String(parseInt(String(r),10));case`%f`:return String(parseFloat(String(r)));default:return e}}),i=[...n];return i.length>0?[r,i.map(e=>String(e)).join(` `)].join(` `):r},_=e({meta:{name:`TypeBox`,resolveTypes:!0},dependencies:{typebox:a.devDependencies.typebox},factory:f});export{p as MESSAGE_CODES,_ as default,h as errorHandlerFactory};\n//# sourceMappingURL=index.js.map","import{defineGenerator as e,defineGeneratorFactory as t,nestedRoutesFactory as n,pathResolver as r,renderFactory as i,sortRoutes as a}from\"@kosmojs/lib\";import o from\"@vitejs/plugin-vue\";import{createTemplateResolver as s,defaults as c}from\"@kosmojs/core\";import{routeRenderHelpers as l}from\"@kosmojs/core/generators\";import{join as u}from\"node:path\";var d={type:`module`,private:!0,name:`@kosmojs/vue-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{\".\":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/vue-generator`},dependencies:{\"@kosmojs/core\":`workspace:^`,\"@kosmojs/lib\":`workspace:^`,\"@vitejs/plugin-vue\":`^6.0.8`},devDependencies:{\"@tanstack/vue-query\":`^5.101.4`,\"path-to-regexp\":`^8.4.2`,vue:`^3.5.41`,\"vue-router\":`^5.2.0`}},f=e=>{let t=e=>e.kind===`splat`?`:${e.name}(.*)?`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[t(e.parts[0])]:[e.parts.map(e=>e.type===`static`?e.value:t(e)).join(``)]).join(`/`)},p=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=(n,r)=>n.flatMap(({index:n,layout:i,children:a})=>{let{name:o,pathTokens:s}={...n,...i};if(!s)return[];let c=`${o}/layout`,l=r?f(s):u(`/`,f(s)),d=s.at(-1);return e(d)?n&&i?[{name:c,path:l,component:i.id,children:[{name:o,path:``,component:n.id}]}]:n?[{path:l,children:[{name:o,path:``,component:n.id},...t(a,o)]}]:i?[{name:c,path:l,component:i.id,children:t(a,o)}]:[]:n&&i?[{name:c,path:l,component:i.id,children:[{name:o,path:``,component:n.id},...t(a,o)]}]:n?[{path:l,children:[{name:o,path:``,component:n.id},...t(a,o)]}]:i?[{name:c,path:l,component:i.id,children:t(a,o)}]:[]});return t},m=()=>{let e=[`🎉 Well done! You just created a new Vue route.`,`🚀 Success! A fresh Vue route is ready to roll.`,`🌟 Nice work! Another Vue route added to your app.`,`🧩 All set! A new Vue route has been scaffolded.`,`🔧 Scaffold complete! Your new Vue route is in place.`,`✅ Built! Your Vue route is scaffolded and ready.`,`✨ Fantastic! Your new Vue route is good to go.`,`🎯 Nailed it! A brand new Vue route just landed.`,`💫 Awesome! Another Vue route joins the party.`,`⚡ Lightning fast! A new Vue route created successfully.`];return e[Math.floor(Math.random()*e.length)]},h=`import type { Plugin } from \"vue\";\n\nexport { default as AppProvider } from \"./provider.vue\";\n\nexport const appProvider: Plugin = {\n install() {},\n};\n`,g=`import { VueQueryPlugin } from \"@tanstack/vue-query\";\nimport type { Plugin } from \"vue\";\n\nimport { getQueryClient } from \"../query\";\n\nexport { default as AppProvider } from \"./provider.vue\";\n\nexport const appProvider: Plugin = {\n install(app) {\n app.use(VueQueryPlugin, { queryClient: getQueryClient() });\n },\n};\n`,_=`<template>\n <slot />\n</template>\n`,v=`import type { App } from \"vue\";\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { clientRenderFactory } from \"@kosmojs/core/generators\";\n\n{{#each pageEntries}}\nconst {{id}} = () => import(\"{{ createImport 'pages' file }}\");\n{{/each}}\n\nconst NotFound = () => import(\"{{ createImport 'pages' '404.vue' }}\");\n\nexport const createRoutes = () => {\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"/:catchAll(.*)*\",\n name: \"NotFound\",\n component: NotFound,\n },\n ];\n}\n\nexport const hydrate = async (\n resolver: () => RouterFactoryReturn<Promise<App>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n component.mount(root, true);\n}\n\nexport const mount = async (\n resolver: () => RouterFactoryReturn<Promise<App>>,\n root: HTMLElement,\n) => {\n const { component } = await resolver();\n component.mount(root);\n}\n\nexport default clientRenderFactory();\n`,y=`{\n path: \"{{path}}\",\n {{#if name}}\n name: \"{{name}}\",\n {{/if}}\n {{#if component}}\n {{#if @root.lazyLoad}}\n component: {{component}},\n meta: { module: {{component}} },\n {{else}}\n component: {{component}}.default,\n meta: { module: async () => {{component}} },\n {{/if}}\n {{/if}}\n {{#if children.length}}\n children: [ {{#each children}}{{> routePartial}}, {{/each}}],\n {{/if}}\n}\n`,b=`import type { App } from \"vue\";\n\nimport {\n renderToString as renderToStringOrig,\n renderToWebStream,\n} from \"vue/server-renderer\";\n\nimport type {\n RenderToStringWrapper,\n RenderToStreamWrapper,\n RouterFactoryReturn,\n SSRRenderWrapper,\n} from \"@kosmojs/core\";\n\nimport { serverRenderFactory } from \"@kosmojs/core/generators\";\n\n{{#each pageEntries}}\nimport * as {{id}} from \"{{ createImport 'pages' file }}\";\n{{/each}}\n\nimport * as NotFound from \"{{ createImport 'pages' '404.vue' }}\";\n\nexport const createRoutes = () => {\n return [\n {{#each nestedRoutes}}{{> routePartial}},\n {{/each}}\n // catch-all 404 - always last\n {\n path: \"/:catchAll(.*)*\",\n name: \"NotFound\",\n component: NotFound.default,\n meta: { module: NotFound },\n },\n ];\n}\n\nexport const baseHeaderTags = (): Array<string> => [];\n\nconst createHydrationScript = (\n loaderData: Record<string, unknown>,\n) => {\n return loaderData\n ? \\`<script>\n window.__KOSMO_HYDRATION_DATA__ = JSON.parse(\n \\${JSON.stringify(JSON.stringify(loaderData))}\n );\n <\\/script>\\`\n : undefined;\n};\n\nexport const renderWrapper: SSRRenderWrapper = (_context, render) => render();\n\nexport const renderToString: RenderToStringWrapper<\n () => RouterFactoryReturn<\n Promise<App>,\n { loaderData: Record<string, unknown> }\n >,\n Parameters<typeof renderToStringOrig>[1]\n> = async (resolver, { headerTags = [], context = {} } = {}) => {\n const { component, loaderData } = await resolver();\n const html = await renderToStringOrig(component, context);\n const script = createHydrationScript(loaderData);\n return {\n head: [...headerTags, ...script ? [script] : []].join(\"\\\\n\"),\n html,\n }\n}\n\nexport const renderToStream: RenderToStreamWrapper<\n () => RouterFactoryReturn<\n Promise<App>,\n { loaderData: Record<string, unknown> }\n >,\n Parameters<typeof renderToWebStream>[1]\n> = async (resolver, { headerTags = [], context = {} } = {}) => {\n const { component, loaderData } = await resolver();\n\n /**\n * loaderData is fully resolved before streaming starts, so the hydration\n * script ships in head - same as string mode. Head is written with the shell,\n * guaranteeing delivery even when the stream errors mid-body.\n * */\n const script = createHydrationScript(loaderData);\n\n return {\n head: [...headerTags, ...script ? [script] : []].join(\"\\\\n\"),\n html: renderToWebStream(component, context),\n };\n}\n\nexport default serverRenderFactory();\n`,x=`declare module \"*.vue\" {\n import type { DefineComponent } from \"vue\";\n const component: DefineComponent<{}, {}, any>;\n export default component;\n}\n`,S=`<script setup lang=\"ts\">\nimport styles from \"./styles.module.css\";\ndefineProps<{\n headline?: string;\n}>();\n<\\/script>\n\n<template>\n <div :class=\"styles.container\">\n <div :class=\"styles.card\">\n <h1 :class=\"styles.title\">\n \\\\{{headline || \"404: Not Found\"}}\n </h1>\n <br />\n\n <div :class=\"styles.stepsBox\">\n <h2 :class=\"styles.stepsTitle\">\n Something went wrong...\n </h2>\n 🚧 No page found here\n </div>\n\n <div :class=\"styles.footer\">\n <p :class=\"styles.footerText\">\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n :class=\"styles.docsLink\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation →\n </a>\n </div>\n </div>\n </div>\n</template>\n`,C=`<script setup lang=\"ts\">\nimport styles from \"./styles.module.css\";\ndefineProps<{\n message: string;\n routeName: string;\n pathMap: { page: string; pages: string; api: string }\n}>();\n<\\/script>\n\n<template>\n <div :data-page-route=\"routeName\" :class=\"styles.container\">\n <div :class=\"styles.card\">\n <h2 :class=\"styles.subtitle\">\n \\\\{{message}}\n </h2>\n <br />\n\n <div :class=\"styles.stepsBox\">\n <ul :class=\"styles.stepsList\">\n <li>\n Edit this page at <code>\\\\{{pathMap.page}}</code>\n </li>\n <li>\n Create new routes by adding folders in\n <code>\\\\{{pathMap.pages}}/</code>\n </li>\n <li>\n Add API endpoints in <code>\\\\{{pathMap.api}}/</code>\n </li>\n </ul>\n </div>\n\n <div :class=\"styles.footer\">\n <p :class=\"styles.footerText\">\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n :class=\"styles.docsLink\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n KosmoJS Documentation →\n </a>\n </div>\n </div>\n </div>\n</template>\n`,w=`* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n padding: 2rem;\n}\n\n.card {\n background: white;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n max-width: 48rem;\n padding: 3rem;\n}\n\n.header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.icon {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.title {\n font-size: 2.5rem;\n font-weight: 700;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.subtitle {\n font-size: 1.125rem;\n color: #718096;\n}\n\n.featuresBox {\n background: #f7fafc;\n border-radius: 0.5rem;\n padding: 1.5rem;\n margin-bottom: 2rem;\n}\n\n.featuresTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.featuresSubtitle {\n color: #667eea;\n font-weight: 600;\n margin-bottom: .5rem;\n}\n\n.featuresList {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.featureItem {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #4a5568;\n}\n\n.featureBullet {\n color: #48bb78;\n}\n\n.stepsBox {\n border-left: 4px solid #667eea;\n padding-left: 1rem;\n margin-bottom: 2rem;\n}\n\n.stepsTitle {\n font-size: 1.125rem;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 0.5rem;\n}\n\n.stepsList {\n color: #4a5568;\n padding-left: 1.25rem;\n line-height: 1.75;\n}\n\n.stepsList code {\n background: #edf2f7;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: Monaco, Consolas, monospace;\n font-size: 0.875rem;\n}\n\n.footer {\n text-align: center;\n padding-top: 1.5rem;\n border-top: 1px solid #e2e8f0;\n}\n\n.footerText {\n color: #718096;\n font-size: 0.875rem;\n}\n\n.docsLink {\n color: #667eea;\n text-decoration: none;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n}\n`,T=`<script setup lang=\"ts\">\nimport styles from \"./styles.module.css\";\n<\\/script>\n\n<template>\n <div :class=\"styles.container\">\n <div :class=\"styles.card\">\n <div :class=\"styles.header\">\n <div :class=\"styles.icon\">✨</div>\n <h1 :class=\"styles.title\">Welcome to KosmoJS</h1>\n <p :class=\"styles.subtitle\">\n Type-safe full-stack development with Vite\n </p>\n </div>\n\n <div :class=\"styles.featuresBox\">\n <h2 :class=\"styles.featuresTitle\">\n Powered by Vue and ready to perform\n </h2>\n <div :class=\"styles.featuresSubtitle\">What's included:</div>\n <ul :class=\"styles.featuresList\">\n <li :class=\"styles.featureItem\">\n <span :class=\"styles.featureBullet\">🔹</span>\n Directory-based routing\n </li>\n <li :class=\"styles.featureItem\">\n <span :class=\"styles.featureBullet\">🔹</span>\n End-to-End Type Safety\n </li>\n <li :class=\"styles.featureItem\">\n <span :class=\"styles.featureBullet\">🔹</span>\n Generated Fetch Clients\n </li>\n </ul>\n </div>\n\n <div :class=\"styles.stepsBox\">\n <h2 :class=\"styles.stepsTitle\">Next Steps 🚂</h2>\n <ul :class=\"styles.stepsList\">\n <li>\n Edit this page at <code>pages/index/index.vue</code>\n </li>\n <li>Create new routes by adding folders in <code>pages/</code></li>\n <li>Add API endpoints in <code>api/</code></li>\n </ul>\n </div>\n\n <div :class=\"styles.footer\">\n <p :class=\"styles.footerText\">\n Built for reliability and developer experience\n </p>\n <br />\n <a\n href=\"https://kosmojs.dev/\"\n :class=\"styles.docsLink\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Read the documentation →\n </a>\n </div>\n </div>\n </div>\n</template>\n`,E=`import { QueryClient, type QueryClientConfig } from \"@tanstack/vue-query\";\n\nlet client: QueryClient | undefined;\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n client = new QueryClient(options);\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n if (!client) {\n client = new QueryClient();\n }\n return client;\n};\n`,D=`import { QueryClient, type QueryClientConfig } from \"@tanstack/vue-query\";\n\nimport { store } from \"{{ createImport 'lib' '@ssr/base' }}\";\n\nexport const createQueryClient = (options?: QueryClientConfig): QueryClient => {\n const client = new QueryClient(options);\n const ctx = store?.getStore();\n if (ctx) {\n ctx.tsqClient = client;\n }\n return client;\n};\n\nexport const getQueryClient = (): QueryClient => {\n const ctx = store?.getStore();\n if (!ctx) {\n throw new Error(\"getQueryClient(): called outside an SSR request scope\");\n }\n if (!ctx.tsqClient) {\n ctx.tsqClient = new QueryClient();\n }\n return ctx.tsqClient as QueryClient;\n};\n`,O=`import {\n type App,\n type Component,\n createApp,\n createSSRApp,\n type Plugin,\n} from \"vue\";\nimport {\n createMemoryHistory,\n createRouter,\n createWebHistory,\n type RouteRecordRaw,\n type Router,\n} from \"vue-router\";\n\nimport type { RouterFactoryReturn } from \"@kosmojs/core\";\nimport { createRouterFactory } from \"@kosmojs/core/generators\";\n\nimport { base } from \"{{ createImport 'libCore' }}\";\n\nexport type RouterWithLoaderData = Router & {\n __loaderData: Record<string, unknown>;\n};\n\nconst runLoader = async (\n key: string,\n route: unknown,\n fetcher: (r: never) => Promise<unknown>,\n) => {\n if (typeof window === \"undefined\" || !window.__KOSMO_HYDRATION_DATA__) {\n return fetcher(route as never);\n }\n return key in window.__KOSMO_HYDRATION_DATA__\n ? window.__KOSMO_HYDRATION_DATA__[key]\n : fetcher(route as never);\n};\n\n/**\n * Installs a beforeResolve guard that runs the matched chain's loaders\n * (layouts + leaf) before navigation commits, so components read data\n * synchronously at render time - no onServerPrefetch, no Suspense.\n * */\nconst installLoaderGuard = (router: RouterWithLoaderData) => {\n router.__loaderData = {};\n\n router.beforeResolve(async (to) => {\n const data: RouterWithLoaderData[\"__loaderData\"] = {};\n\n for (const { name, meta } of to.matched) {\n if (!name || typeof name !== \"string\" || !meta.module) {\n continue;\n }\n\n const { loader } =\n typeof meta.module === \"function\" //\n ? await meta.module()\n : {};\n\n if (loader) {\n await runLoader(name, to, loader as never).then((v) => {\n // undefined does not survive JSON.stringify, thus null\n data[name] = v ?? null;\n });\n }\n }\n\n router.__loaderData = data;\n\n // consumed: clear so client navigations refetch, and click-handlers don't reuse\n if (typeof window !== \"undefined\") {\n window.__KOSMO_HYDRATION_DATA__ = undefined;\n }\n });\n};\n\nexport const createRouters = (\n routes: Array<RouteRecordRaw>,\n {\n app,\n use,\n }: {\n app: Component;\n use?: Array<[plugin: Plugin, options: object | undefined]>;\n },\n): {\n clientRouter: () => RouterFactoryReturn<Promise<App>>;\n serverRouter: (\n url: URL,\n ) => RouterFactoryReturn<\n Promise<App>,\n { loaderData: Record<string, unknown> }\n >;\n} => {\n return {\n async clientRouter() {\n const component = createApp(app);\n\n const router = createRouter({\n history: createWebHistory(base),\n routes,\n strict: true,\n });\n\n installLoaderGuard(router as never);\n\n component.use(router);\n\n if (Array.isArray(use)) {\n for (const [plugin, options] of use) {\n component.use(plugin, options);\n }\n }\n\n return { component };\n },\n\n async serverRouter(url) {\n const component = createSSRApp(app);\n\n const router = createRouter({\n history: createMemoryHistory(base),\n routes,\n strict: true,\n }) as RouterWithLoaderData;\n\n // must be installed before push - the initial navigation\n // would otherwise skip the guard\n installLoaderGuard(router);\n\n await router.push(url.pathname + url.search);\n\n await router.isReady();\n\n component.use(router);\n\n if (Array.isArray(use)) {\n for (const [plugin, options] of use) {\n component.use(plugin, options);\n }\n }\n\n return { component, loaderData: router.__loaderData };\n },\n };\n};\n\nexport default createRouterFactory<\n RouteRecordRaw,\n Promise<App>,\n { server: { loaderData: Record<string, unknown> } }\n>();\n`,k=`import { type Ref, unref } from \"vue\";\n\nexport type MaybeWrapped<T> = Ref<T> | T;\n\nexport function unwrap<T>(value: MaybeWrapped<T>): T {\n return unref(value);\n}\n`,A=`import { useRoute, useRouter } from \"vue-router\";\n\nimport type { RouterWithLoaderData } from \"./router\";\n\n/**\n * Reads loader data for the current page or one of its layouts.\n * Without a key, returns the page's own data.\n * For a layout, pass its path-qualified name (e.g. \"dashboard/layout\") -\n * a hook can't tell which layout it runs in.\n * */\nexport const useLoaderData = <T>(key?: string): T | undefined => {\n const router = useRouter() as RouterWithLoaderData;\n const route = useRoute();\n return router.__loaderData?.[key || (route.name as string)] as T;\n};\n`,j=`<script setup lang=\"ts\">\nimport { AppProvider } from \"_/app\";\n<\\/script>\n\n<template>\n <AppProvider>\n <RouterView />\n </AppProvider>\n</template>\n`,M=`<script setup lang=\"ts\" generic=\"T extends LinkProps\">\nimport { computed } from \"vue\";\nimport { RouterLink } from \"vue-router\";\n\nimport { pageRouteMap, type LinkProps } from \"{{ createImport 'libCore' }}\";\n\ninterface Props {\n to: T\n query?: Record<string | number, unknown>\n replace?: boolean\n activeClass?: string\n exactActiveClass?: string\n}\n\nconst props = defineProps<Props>();\n\nconst href = computed(() => {\n const [key, ...params] = props.to\n return pageRouteMap[key]?.base(params as never, props.query)\n})\n<\\/script>\n\n<template>\n <RouterLink\n :to=\"href\"\n :replace=\"replace\"\n :active-class=\"activeClass\"\n :exact-active-class=\"exactActiveClass\"\n >\n <slot />\n </RouterLink>\n</template>\n`,N=`import renderFactory, {\n createRoutes,\n hydrate,\n mount,\n} from \"{{ createImport 'libEntry' 'client' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { clientRouter } = routerFactory(routes);\n\nconst root = document.getElementById(\"app\");\n\nif (root) {\n renderFactory(() => {\n return {\n hydrate() {\n return hydrate(() => clientRouter(), root);\n },\n mount() {\n return mount(() => clientRouter(), root);\n },\n };\n });\n} else {\n console.error(\"❌ Root element not found!\");\n}\n`,P=`import renderFactory, {\n createRoutes,\n renderToStream,\n renderToString,\n} from \"{{ createImport 'libEntry' 'server' }}\";\n\nimport routerFactory from \"../router\";\n\nconst routes = createRoutes();\nconst { serverRouter } = routerFactory(routes);\n\nexport default renderFactory(() => {\n return {\n renderToString(url, { assets }) {\n return renderToString(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n renderToStream(url, { assets }) {\n return renderToStream(\n () => serverRouter(url),\n { headerTags: assets.map(({ tag }) => tag) },\n );\n },\n };\n});\n`,F=`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--app-head-->\n</head>\n<body>\n <div id=\"app\"><!--app-html--></div>\n <script type=\"module\" src=\"/{{ entryDir }}/client.ts\"><\\/script>\n</body>\n</html>\n`,I=`<script setup lang=\"ts\">\nimport PageSample from \"{{ createImport 'lib' 'pageSamples/404.vue' }}\";\n<\\/script>\n\n<template>\n <PageSample />\n</template>\n`,L=`<template>\n <router-view />\n</template>\n`,R=`<script setup lang=\"ts\">\nimport PageSample from \"{{ createImport 'lib' 'pageSamples/page.vue' }}\";\n<\\/script>\n\n<template>\n <PageSample\n message=\"{{message}}\"\n routeName=\"{{route.name}}\"\n :pathMap=\"{\n page: '{{ createImport 'pages' route.file }}',\n pages: '{{ createImport 'pages' }}',\n api: '{{ createImport 'api' }}',\n }\"\n />\n</template>\n`,z=`<script setup lang=\"ts\">\nimport WelcomePage from \"{{ createImport 'lib' 'pageSamples/welcome.vue' }}\";\n<\\/script>\n\n<template>\n <WelcomePage />\n</template>\n`,B=`import routerFactory, { createRouters } from \"{{ createImport 'lib' 'router' }}\";\nimport { appProvider } from \"{{ createImport 'lib' 'app' }}\";\n\nimport app from \"./app.vue\";\n\nexport default routerFactory((routes) => {\n const { clientRouter, serverRouter } = createRouters(routes, {\n app,\n use: [[appProvider, undefined]],\n });\n return {\n clientRouter() {\n return clientRouter()\n },\n serverRouter(url) {\n return serverRouter(url)\n },\n };\n});\n`,V=t((e,t)=>{let{createPath:u,createImportHelpers:d}=r(e),{renderToFile:f}=i({helpers:{...d({origin:`lib`}),...l()},partials:{routePartial:y}}),{renderToFile:V}=i({helpers:d({origin:`src`})}),H=p(),U=e=>!e?.trim().length,W=s(t?.templates,R),G=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await V(u.pages(n.file),n.name===`index`?z:W(n.name,n),{route:n,message:m()},{overwrite:U}):t===`pageLayout`&&await V(u.pages(n.file),L,{route:n},{overwrite:U})},K=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(a),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=H(n(r));for(let[e,t]of[[`client.ts`,v],[`server.ts`,b]])await f(u.libEntry(e),t,{pageEntries:r,nestedRoutes:i,lazyLoad:e===`client.ts`});await f(u.lib(`router.ts`),O,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[o(n)]}},async start(){for(let[e,n]of[[`env.d.ts`,x],[`unwrap.ts`,k],[`use.ts`,A],[`pageSamples/styles.module.css`,w],[`pageSamples/welcome.vue`,T],[`pageSamples/page.vue`,C],[`pageSamples/404.vue`,S],[`app/provider.vue`,_],...t?.tanstack?.query?[[`app/index.ts`,g],[`query.ts`,E]]:[[`app/index.ts`,h],[`query.ts`,`/** tanstack query disabled */`]]])await f(u.lib(e),n,{});for(let[e,t]of[[`pages/404.vue`,I],[`components/Link.vue`,M],[`app.vue`,j],[`router.ts`,B]])await V(u.src(e),t,{entryDir:c.entryDir},{overwrite:U});await V(u.src(`index.html`),F,{entryDir:c.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\\s\\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,N],[`server.ts`,P]])await V(u.entry(e),t,{},{overwrite:U})},async watch(e,t){(!t||t.kind===`create`)&&await G(e),await K(e)},async build(e){await G(e),await K(e)},async ssrBuild(){await f(u.lib(`query.ts`),t?.tanstack?.query?D:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),H=e({meta:{name:`Vue`,jsxImportSource:`vue`},dependencies(e){return{vue:d.devDependencies.vue,\"vue-router\":d.devDependencies[`vue-router`],\"path-to-regexp\":d.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{\"@tanstack/vue-query\":d.devDependencies[`@tanstack/vue-query`]}:{}}},factory:V});export{H as default};\n//# sourceMappingURL=index.js.map","import { join } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport {\n DEFAULT_APIBASE,\n type FolderConfig,\n type SourceFolder,\n} from \"@kosmojs/core\";\n\nexport { default as fetchGenerator } from \"@kosmojs/fetch-generator\";\nexport { default as honoGenerator } from \"@kosmojs/hono-generator\";\nexport { default as koaGenerator } from \"@kosmojs/koa-generator\";\nexport { default as mdxGenerator } from \"@kosmojs/mdx-generator\";\nexport { default as openapiGenerator } from \"@kosmojs/openapi-generator\";\nexport { default as reactGenerator } from \"@kosmojs/react-generator\";\nexport { default as solidGenerator } from \"@kosmojs/solid-generator\";\nexport { default as ssgGenerator } from \"@kosmojs/ssg-generator\";\nexport { default as ssrGenerator } from \"@kosmojs/ssr-generator\";\nexport { default as svelteGenerator } from \"@kosmojs/svelte-generator\";\nexport { default as typeboxGenerator } from \"@kosmojs/typebox-generator\";\nexport { default as vueGenerator } from \"@kosmojs/vue-generator\";\n\nexport const defineConfig: (config: FolderConfig) => SourceFolder[\"config\"] = (\n config,\n) => {\n const env = process.env.NODE_ENV || \"development\";\n const base = typeof config.base === \"string\" ? config.base : config.base[env];\n if (!base?.trim()) {\n throw new Error(\n styleText([\"red\"], \"ERROR: Invalid Config - no base provided\"),\n );\n }\n return {\n ...config,\n base: join(\"/\", base),\n apiBase: join(\"/\", config.apiBase || DEFAULT_APIBASE),\n };\n};\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgqCFC,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDFC,GAAE;;;;;;;EAOF,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DFC,GAAE,CAAC,2BAA2B,CAAC,CAAC,EAAEC,GAAEC,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"}
|