@kosmojs/dev 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/pkg/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import{t as e}from"./assets/pkg-Bkag325q.js";import{join as t,resolve as n}from"node:path";import{styleText as r}from"node:util";import{DEFAULT_APIBASE as i,RequestBodyTargets as a,RequestValidationTargets as o,createRouteResolver as s,createTemplateResolver as c,defaults as l}from"@kosmojs/core";import{createH3Pattern as u,createHonoPattern as d,createPathPattern as f,createWatchedApiRouteEntriesFilter as p,createWatchedPageRouteEntriesFilter as m,defineGenerator as h,defineGeneratorFactory as g,mergeConfigs as _,nestedRoutesFactory as v,pathResolver as y,pathTokensFactory as b,renderFactory as x,renderToFile as ee,sortRoutes as S,spinnerFactory as te,vitePlugins as C}from"@kosmojs/lib";import{routeRenderHelpers as w}from"@kosmojs/core/generators";import T from"crc/crc32";import ne from"@mdx-js/rollup";import{build as E,createFilter as re}from"vite";import ie from"yaml";import{parse as ae}from"path-to-regexp";import oe from"typebox";import se from"@vitejs/plugin-react";import D from"vite-plugin-solid";import{access as ce,constants as le,cp as O,mkdir as ue,rm as k,writeFile as de}from"node:fs/promises";import{svelte as fe}from"@sveltejs/vite-plugin-svelte";import pe from"@vitejs/plugin-vue";var A=`export * from "./transport";
2
- `,j=`export const transport = undefined;
3
- `,M=`{{#each routes}}
1
+ import{t as e}from"./assets/pkg-dTglxmYm.js";import{join as t,resolve as n}from"node:path";import{styleText as r}from"node:util";import{DEFAULT_APIBASE as i,RequestBodyTargets as a,RequestValidationTargets as o,createRouteResolver as s,createTemplateResolver as c,defaults as l}from"@kosmojs/core";import{createH3Pattern as u,createHonoPattern as d,createPathPattern as f,createWatchedApiRouteEntriesFilter as p,createWatchedPageRouteEntriesFilter as m,defineGenerator as h,defineGeneratorFactory as g,mergeConfigs as _,nestedRoutesFactory as v,pathResolver as y,pathTokensFactory as b,renderFactory as x,renderToFile as ee,sortRoutes as S,spinnerFactory as te,vitePlugins as C}from"@kosmojs/lib";import{routeRenderHelpers as w}from"@kosmojs/core/generators";import{HTTPMethods as ne}from"@kosmojs/core/fetch";import T from"crc/crc32";import re from"@mdx-js/rollup";import{build as E,createFilter as ie}from"vite";import ae from"yaml";import{parse as oe}from"path-to-regexp";import se from"typebox";import ce from"@vitejs/plugin-react";import D from"vite-plugin-solid";import{access as le,constants as ue,cp as O,mkdir as de,rm as k,writeFile as fe}from"node:fs/promises";import{svelte as pe}from"@sveltejs/vite-plugin-svelte";import A from"@vitejs/plugin-vue";var j=`export * from "./transport";
2
+ `,M=`export const transport = undefined;
3
+ `,N=`{{#each routes}}
4
4
  import {{id}} from "{{ createImport 'libApi' name 'fetch' }}";
5
5
  {{/each}}
6
6
 
@@ -18,7 +18,7 @@ export default {
18
18
  {{/each}}
19
19
  {{/each}}
20
20
  }
21
- `,N=`import fetchFactory, { join } from "@kosmojs/core/fetch";
21
+ `,P=`import fetchFactory, { join } from "@kosmojs/core/fetch";
22
22
 
23
23
  import { base, apiBase, apiRouteMap } from "{{ createImport 'libCore' }}";
24
24
  import { transport } from "{{ createImport 'lib' '@fetch' }}";
@@ -118,9 +118,9 @@ export default {
118
118
  href,
119
119
  validationSchemas,
120
120
  };
121
- `,P=`export type MaybeWrapped<T> = T;
121
+ `,F=`export type MaybeWrapped<T> = T;
122
122
  export const unwrap = <T>(data: T) => data;
123
- `,F=g(e=>{let{createPath:t,createImportHelpers:n}=y(e),{renderToFile:r}=x({helpers:{...n({origin:`lib`}),...w()}}),i=async(e,n)=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]).sort(S);await r(t.lib(`fetch.ts`),M,{routes:i});for(let{kind:e,entry:i}of n)if(e===`apiRoute`){let e=[];for(let t of i.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=i.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)})),a=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 r(t.libApi(i.name,`fetch.ts`),N,{route:i,validationTypes:e,routeMethods:n,responseTypes:a})}};return{async start(){for(let[e,n]of[[`unwrap.ts`,P],[`@fetch/transport.ts`,j],[`@fetch/index.ts`,A]])await r(t.lib(e),n,{})},async watch(e,t){await i(e,e.filter(p(t,[`create`,`update`])))},async build(e){await i(e,e)},async ssrBuild(){for(let[e,n]of[[`@fetch/transport.ts`,`export { transport } from "${l.libPrefix}/@ssr/fetch";`]])await r(t.lib(e),n,{})}}}),I=h({meta:{name:`Fetch`,slot:`fetch`},factory:F}),L={type:`module`,private:!0,name:`@kosmojs/h3-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/h3-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`},devDependencies:{h3:`2.0.1-rc.29`,vite:`^8.2.2`}},R=`import { H3, type Middleware } from "h3";
123
+ `,I=g(e=>{let{createPath:t,createImportHelpers:n}=y(e),{renderToFile:r}=x({helpers:{...n({origin:`lib`}),...w()}}),i=async(e,n)=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]).sort(S);await r(t.lib(`fetch.ts`),N,{routes:i});for(let{kind:e,entry:i}of n)if(e===`apiRoute`){let e=[];for(let t of i.validationDefinitions)if(t.target===`response`)for(let{id:n,status:r,body:i,resolvedType:a}of t.variants)!i||Math.floor(r/100)!==2||e.push({id:n,target:t.target,method:t.method,resolvedType:a});else{let{id:n,resolvedType:r}=t.schema;e.push({id:n,target:t.target,method:t.method,resolvedType:r})}let n=Object.keys(ne),a=i.methods.flatMap(t=>n.includes(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)}]:[]),o=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 r(t.libApi(i.name,`fetch.ts`),P,{route:i,validationTypes:e,routeMethods:a,responseTypes:o})}};return{async start(){for(let[e,n]of[[`unwrap.ts`,F],[`@fetch/transport.ts`,M],[`@fetch/index.ts`,j]])await r(t.lib(e),n,{})},async watch(e,t){await i(e,e.filter(p(t,[`create`,`update`])))},async build(e){await i(e,e)},async ssrBuild(){for(let[e,n]of[[`@fetch/transport.ts`,`export { transport } from "${l.libPrefix}/@ssr/fetch";`]])await r(t.lib(e),n,{})}}}),L=h({meta:{name:`Fetch`,slot:`fetch`},factory:I}),R={type:`module`,private:!0,name:`@kosmojs/h3-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/h3-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`},devDependencies:{h3:`2.0.1-rc.29`,vite:`^8.2.2`}},z=`import { H3, type Middleware } from "h3";
124
124
 
125
125
  import type { Route, RouteDebugOption } from "@kosmojs/core/api";
126
126
 
@@ -168,23 +168,65 @@ export function appFactory(
168
168
  } else if (debug) {
169
169
  console.log(route.debug[typeof debug === "string" ? debug : "full"]);
170
170
  }
171
- for (const method of route.methods) {
172
- // last middleware is the handler
173
- const handler = route.middleware.at(-1);
174
- if (handler) {
175
- app.on(method, route.path, handler as never, {
171
+
172
+ // last middleware is the handler
173
+ const handler = route.middleware.at(-1);
174
+
175
+ if (handler) {
176
+ app.on(route.method, route.path, handler as never, {
177
+ middleware: route.middleware.slice(0, -1),
178
+ });
179
+ if (
180
+ route.method === "GET" &&
181
+ !routes.some((e) => e.path === route.path && e.method === "HEAD")
182
+ ) {
183
+ /**
184
+ * Register HEAD against the sibling GET handler,
185
+ * matching the HEAD-via-GET dispatch hono and koa provide natively.
186
+ * */
187
+ app.on("HEAD", route.path, handler as never, {
176
188
  middleware: route.middleware.slice(0, -1),
177
189
  });
178
190
  }
179
191
  }
180
192
  }
181
193
 
194
+ const routesByPath = routes.reduce<Record<string, Array<Route<Middleware>>>>(
195
+ (map, route) => {
196
+ if (!map[route.path]) {
197
+ map[route.path] = [];
198
+ }
199
+ map[route.path].push(route);
200
+ return map;
201
+ },
202
+ {},
203
+ );
204
+
205
+ for (const [path, routes] of Object.entries(routesByPath)) {
206
+ const methods = routes.map((e) => e.method);
207
+
208
+ app.all(path, (event) => {
209
+ const allowedMethods = new Set([...methods, "OPTIONS"]);
210
+
211
+ if (methods.includes("GET")) {
212
+ allowedMethods.add("HEAD");
213
+ }
214
+
215
+ const status = event.req.method === "OPTIONS" ? 204 : 405;
216
+
217
+ return new Response(undefined, {
218
+ status,
219
+ headers: { Allow: [...allowedMethods].join(", ") },
220
+ });
221
+ });
222
+ }
223
+
182
224
  return app;
183
225
  }
184
- `,z=`import type { DevSetup } from "@kosmojs/core/api";
226
+ `,B=`import type { DevSetup } from "@kosmojs/core/api";
185
227
 
186
228
  export const devSetup = (setup: DevSetup) => setup;
187
- `,B=`import { type H3Event, HTTPError } from "h3";
229
+ `,me=`import { type H3Event, HTTPError } from "h3";
188
230
 
189
231
  import { ValidationError } from "@kosmojs/core/errors";
190
232
 
@@ -208,7 +250,7 @@ export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
208
250
  );
209
251
  };
210
252
  };
211
- `,me=`import { type H3Event, readBody } from "h3";
253
+ `,he=`import { type H3Event, readBody } from "h3";
212
254
 
213
255
  import {
214
256
  parseCookies,
@@ -248,7 +290,7 @@ export const bodyparsers: {
248
290
  return event.req.text();
249
291
  },
250
292
  };
251
- `,he=`import type { Middleware } from "h3";
293
+ `,ge=`import type { Middleware } from "h3";
252
294
 
253
295
  import type {
254
296
  RequestBodyTarget,
@@ -333,7 +375,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
333
375
  target === "query"
334
376
  ? normalizeSearchParams(
335
377
  parser(event),
336
- event.req.method as never,
378
+ event.req.method === "HEAD"
379
+ ? "GET"
380
+ : event.req.method,
337
381
  )
338
382
  : parser(event),
339
383
  );
@@ -411,7 +455,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
411
455
  * */
412
456
  use(
413
457
  async function useValidateResponse(event, next) {
414
- const variants = validationSchemas.response?.[event.req.method] || [];
458
+ const variants =
459
+ validationSchemas.response?.[
460
+ event.req.method === "HEAD" ? "GET" : event.req.method
461
+ ] || [];
415
462
 
416
463
  if (!Array.isArray(variants) || !variants.length) {
417
464
  return next();
@@ -460,6 +507,11 @@ export const createRouteMiddleware: CreateRouteMiddleware<
460
507
  : "application/json"),
461
508
  };
462
509
 
510
+ // validate only 2xx responses
511
+ if (Math.floor(response.status / 100) !== 2) {
512
+ return;
513
+ }
514
+
463
515
  // Validate body only for JSON variants
464
516
  if (variants.some((e) => e.contentType?.includes("json"))) {
465
517
  response.body = rawResponse
@@ -598,7 +650,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
598
650
  use(
599
651
  async (event, next) => {
600
652
  const schema = {
601
- ...validationSchemas[target]?.[event.req.method],
653
+ ...validationSchemas[target]?.[
654
+ event.req.method === "HEAD" ? "GET" : event.req.method
655
+ ],
602
656
  };
603
657
  if (schema.validate && schema.runtimeValidation !== false) {
604
658
  schema.validate(await loadData(event as never));
@@ -628,7 +682,7 @@ export const routes = createRoutes<ParameterizedMiddleware, Middleware>(
628
682
  createRouteMiddleware,
629
683
  },
630
684
  );
631
- `,ge=`import { join } from "node:path";
685
+ `,_e=`import { join } from "node:path";
632
686
 
633
687
  import type { RouteSource } from "@kosmojs/core/api";
634
688
 
@@ -680,7 +734,7 @@ export const routeSources: Array<RouteSource<never>> = [
680
734
  },
681
735
  {{/each}}
682
736
  ];
683
- `,_e=`import { parseArgs, styleText } from "node:util";
737
+ `,ve=`import { parseArgs, styleText } from "node:util";
684
738
 
685
739
  import { serve as h3serve } from "h3";
686
740
 
@@ -728,7 +782,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
728
782
 
729
783
  return server as never;
730
784
  };
731
- `,ve=`import type { H3Event, H3EventContext } from "h3";
785
+ `,ye=`import type { H3Event, H3EventContext } from "h3";
732
786
 
733
787
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
734
788
  import {
@@ -875,14 +929,14 @@ export const defineRoute: <
875
929
  use: use as never,
876
930
  });
877
931
  };
878
- `,ye=`export * from "./@api/app";
932
+ `,be=`export * from "./@api/app";
879
933
  export { appFactory as default } from "./@api/app";
880
934
  export * from "./@api/dev";
881
935
  export * from "./@api/errors";
882
936
  export * from "./@api/router";
883
937
  export * from "./@api/routes";
884
938
  export * from "./@api/server";
885
- `,be=`import { onError } from "h3";
939
+ `,xe=`import { onError } from "h3";
886
940
 
887
941
  import appFactory, { routes, type App } from "{{ createImport 'lib' 'api:factory' }}";
888
942
  import defaultErrorHandler from "./errors";
@@ -890,7 +944,7 @@ import defaultErrorHandler from "./errors";
890
944
  export default appFactory(routes, ({ app }) => {
891
945
  app.use(onError(defaultErrorHandler));
892
946
  }) as App;
893
- `,xe=`import { toNodeHandler } from "h3/node";
947
+ `,Se=`import { toNodeHandler } from "h3/node";
894
948
 
895
949
  import app from "./app";
896
950
 
@@ -910,10 +964,10 @@ process.on("unhandledRejection", (reason) => {
910
964
  console.error("Reason:", reason);
911
965
  process.exit(1);
912
966
  });
913
- `,Se=`export declare module "{{ createImport 'libApi' }}" {
967
+ `,Ce=`export declare module "{{ createImport 'libApi' }}" {
914
968
  interface DefaultContext {}
915
969
  }
916
- `,Ce=`import { ValidationError } from "@kosmojs/core/errors";
970
+ `,we=`import { ValidationError } from "@kosmojs/core/errors";
917
971
  import { HTTPError } from "h3";
918
972
 
919
973
  import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
@@ -939,14 +993,14 @@ export default errorHandlerFactory(async (error, event) => {
939
993
  headers: { "Content-Type": "text/plain" },
940
994
  });
941
995
  });
942
- `,we=`import { defineRoute } from "{{ createImport 'libApi' }}";
996
+ `,Te=`import { defineRoute } from "{{ createImport 'libApi' }}";
943
997
 
944
998
  export default defineRoute<"{{route.name}}">(({ GET }) => [
945
999
  GET(async (event) => {
946
1000
  return "Automatically generated route";
947
1001
  }),
948
1002
  ]);
949
- `,Te=`import { use } from "{{ createImport 'libApi' }}";
1003
+ `,Ee=`import { use } from "{{ createImport 'libApi' }}";
950
1004
 
951
1005
  export type UseT = {};
952
1006
 
@@ -955,11 +1009,11 @@ export default [
955
1009
  return next();
956
1010
  }),
957
1011
  ];
958
- `,Ee=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1012
+ `,De=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
959
1013
  import app from "./app";
960
1014
 
961
1015
  await serve(app);
962
- `,De=`import { use } from "{{ createImport 'libApi' }}";
1016
+ `,Oe=`import { use } from "{{ createImport 'libApi' }}";
963
1017
 
964
1018
  /**
965
1019
  * Define global middleware applied to all routes.
@@ -970,7 +1024,7 @@ export default [
970
1024
  return next();
971
1025
  }),
972
1026
  ];
973
- `,Oe=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),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 a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,d=c(n?.templates,we),f=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),d(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),Te,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,path:r.h3Pattern,basename:r.name,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:u(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,ge]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,ve],[`api:factory.ts`,ye],[`@api/app.ts`,R],[`@api/parsers.ts`,me],[`@api/dev.ts`,z],[`@api/errors.ts`,B],[`@api/router.ts`,he],[`@api/server.ts`,_e]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,be],[`dev.ts`,xe],[`errors.ts`,Ce],[`server.ts`,Ee],[`use.ts`,De],[`env.d.ts`,Se]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await f(e.filter(p(t,[`create`]))),await m(e)},async build(e){await f(e),await m(e)}}}),ke=h({meta:{name:`H3`,slot:`backend`},dependencies:{h3:L.devDependencies.h3},factory:Oe}),V={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.1`,hono:`^4.13.3`,vite:`^8.2.2`}},Ae=`import { Hono, type MiddlewareHandler } from "hono";
1027
+ `,ke=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),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 a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,d=c(n?.templates,Te),f=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),d(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),Ee,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,path:r.h3Pattern,basename:r.name,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:u(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,_e]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,ye],[`api:factory.ts`,be],[`@api/app.ts`,z],[`@api/parsers.ts`,he],[`@api/dev.ts`,B],[`@api/errors.ts`,me],[`@api/router.ts`,ge],[`@api/server.ts`,ve]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,xe],[`dev.ts`,Se],[`errors.ts`,we],[`server.ts`,De],[`use.ts`,Oe],[`env.d.ts`,Ce]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await f(e.filter(p(t,[`create`]))),await m(e)},async build(e){await f(e),await m(e)}}}),Ae=h({meta:{name:`H3`,slot:`backend`},dependencies:{h3:R.devDependencies.h3},factory:ke}),V={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.1`,hono:`^4.13.3`,vite:`^8.2.2`}},je=`import { Hono, type MiddlewareHandler } from "hono";
974
1028
  import type { Router } from "hono/router";
975
1029
  import { RegExpRouter } from "hono/router/reg-exp-router";
976
1030
  import { SmartRouter } from "hono/router/smart-router";
@@ -1037,15 +1091,45 @@ export function appFactory(
1037
1091
  } else if (debug) {
1038
1092
  console.log(route.debug[typeof debug === "string" ? debug : "full"]);
1039
1093
  }
1040
- app.on(route.methods, [route.path], ...route.middleware);
1094
+
1095
+ app.on(route.method, [route.path], ...route.middleware);
1096
+ }
1097
+
1098
+ const routesByPath = routes.reduce<
1099
+ Record<string, Array<Route<MiddlewareHandler>>>
1100
+ >((map, route) => {
1101
+ if (!map[route.path]) {
1102
+ map[route.path] = [];
1103
+ }
1104
+ map[route.path].push(route);
1105
+ return map;
1106
+ }, {});
1107
+
1108
+ for (const [path, routes] of Object.entries(routesByPath)) {
1109
+ const methods = routes.map((e) => e.method);
1110
+
1111
+ app.all(path, (ctx) => {
1112
+ const allowedMethods = new Set([...methods, "OPTIONS"]);
1113
+
1114
+ if (methods.includes("GET")) {
1115
+ allowedMethods.add("HEAD");
1116
+ }
1117
+
1118
+ const status = ctx.req.method === "OPTIONS" ? 204 : 405;
1119
+
1120
+ return new Response(undefined, {
1121
+ status,
1122
+ headers: { Allow: [...allowedMethods].join(", ") },
1123
+ });
1124
+ });
1041
1125
  }
1042
1126
 
1043
1127
  return app as never;
1044
1128
  }
1045
- `,je=`import type { DevSetup } from "@kosmojs/core/api";
1129
+ `,Me=`import type { DevSetup } from "@kosmojs/core/api";
1046
1130
 
1047
1131
  export const devSetup = (setup: DevSetup) => setup;
1048
- `,Me=`import type { Context } from "hono";
1132
+ `,Ne=`import type { Context } from "hono";
1049
1133
 
1050
1134
  import type { AppEnv } from "./app";
1051
1135
 
@@ -1059,7 +1143,7 @@ export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
1059
1143
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
1060
1144
  return handler;
1061
1145
  };
1062
- `,Ne=`import type { Context } from "hono";
1146
+ `,Pe=`import type { Context } from "hono";
1063
1147
 
1064
1148
  import {
1065
1149
  parseCookies,
@@ -1108,7 +1192,7 @@ export const bodyparsers: {
1108
1192
  return ctx.req[as]();
1109
1193
  },
1110
1194
  };
1111
- `,Pe=`import type { MiddlewareHandler } from "hono";
1195
+ `,Fe=`import type { MiddlewareHandler } from "hono";
1112
1196
 
1113
1197
  import type {
1114
1198
  RequestBodyTarget,
@@ -1194,7 +1278,7 @@ export const createRouteMiddleware: CreateRouteMiddleware<
1194
1278
  target === "query"
1195
1279
  ? normalizeSearchParams(
1196
1280
  parser(ctx),
1197
- ctx.req.method as never,
1281
+ ctx.req.method === "HEAD" ? "GET" : ctx.req.method,
1198
1282
  )
1199
1283
  : parser(ctx),
1200
1284
  );
@@ -1274,7 +1358,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
1274
1358
  * */
1275
1359
  use(
1276
1360
  async function useValidateResponse(ctx, next) {
1277
- const variants = validationSchemas.response?.[ctx.req.method] || [];
1361
+ const variants =
1362
+ validationSchemas.response?.[
1363
+ ctx.req.method === "HEAD" ? "GET" : ctx.req.method
1364
+ ] || [];
1278
1365
 
1279
1366
  if (!Array.isArray(variants) || !variants.length) {
1280
1367
  return next();
@@ -1307,10 +1394,17 @@ export const createRouteMiddleware: CreateRouteMiddleware<
1307
1394
  contentType: ctx.res.headers.get("Content-Type"),
1308
1395
  };
1309
1396
 
1397
+ // validate only 2xx responses
1398
+ if (Math.floor(response.status / 100) !== 2) {
1399
+ return;
1400
+ }
1401
+
1310
1402
  // Validate body only for JSON variants
1311
1403
  if (variants.some((e) => e.contentType?.includes("json"))) {
1312
- const cloned = ctx.res.clone();
1313
- response.body = await cloned.json();
1404
+ response.body = await ctx.res
1405
+ .clone()
1406
+ .json()
1407
+ .catch(() => undefined);
1314
1408
  }
1315
1409
 
1316
1410
  /**
@@ -1445,7 +1539,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
1445
1539
  use(
1446
1540
  async (ctx, next) => {
1447
1541
  const schema = {
1448
- ...validationSchemas[target]?.[ctx.req.method],
1542
+ ...validationSchemas[target]?.[
1543
+ ctx.req.method === "HEAD" ? "GET" : ctx.req.method
1544
+ ],
1449
1545
  };
1450
1546
  if (schema.validate && schema.runtimeValidation !== false) {
1451
1547
  schema.validate(await loadData(ctx as never));
@@ -1475,7 +1571,7 @@ export const routes = createRoutes<ParameterizedMiddleware, MiddlewareHandler>(
1475
1571
  createRouteMiddleware,
1476
1572
  },
1477
1573
  );
1478
- `,Fe=`import { join } from "node:path";
1574
+ `,Ie=`import { join } from "node:path";
1479
1575
 
1480
1576
  import type { RouteSource } from "@kosmojs/core/api";
1481
1577
 
@@ -1527,7 +1623,7 @@ export const routeSources: Array<RouteSource<never>> = [
1527
1623
  },
1528
1624
  {{/each}}
1529
1625
  ];
1530
- `,Ie=`import { chmod, unlink } from "node:fs/promises";
1626
+ `,Le=`import { chmod, unlink } from "node:fs/promises";
1531
1627
  import { parseArgs, styleText } from "node:util";
1532
1628
 
1533
1629
  import { createAdaptorServer } from "@hono/node-server";
@@ -1612,7 +1708,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
1612
1708
 
1613
1709
  return server as never;
1614
1710
  };
1615
- `,Le=`import type { Context, Next } from "hono";
1711
+ `,Re=`import type { Context, Next } from "hono";
1616
1712
 
1617
1713
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
1618
1714
  import {
@@ -1795,20 +1891,20 @@ export const defineRoute: <
1795
1891
  use: use as never,
1796
1892
  });
1797
1893
  };
1798
- `,Re=`export * from "./@api/app";
1894
+ `,ze=`export * from "./@api/app";
1799
1895
  export { appFactory as default } from "./@api/app";
1800
1896
  export * from "./@api/dev";
1801
1897
  export * from "./@api/errors";
1802
1898
  export * from "./@api/router";
1803
1899
  export * from "./@api/routes";
1804
1900
  export * from "./@api/server";
1805
- `,ze=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
1901
+ `,Be=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
1806
1902
  import defaultErrorHandler from "./errors";
1807
1903
 
1808
1904
  export default appFactory(routes, ({ app }) => {
1809
1905
  app.onError(defaultErrorHandler);
1810
1906
  })
1811
- `,Be=`import { getRequestListener } from "@hono/node-server";
1907
+ `,Ve=`import { getRequestListener } from "@hono/node-server";
1812
1908
 
1813
1909
  import app from "./app";
1814
1910
 
@@ -1829,11 +1925,11 @@ process.on("unhandledRejection", (reason) => {
1829
1925
  process.exit(1);
1830
1926
  });
1831
1927
 
1832
- `,Ve=`export declare module "{{ createImport 'libApi' }}" {
1928
+ `,He=`export declare module "{{ createImport 'libApi' }}" {
1833
1929
  interface DefaultVariables {}
1834
1930
  interface DefaultBindings {}
1835
1931
  }
1836
- `,He=`import { accepts } from "hono/accepts";
1932
+ `,Ue=`import { accepts } from "hono/accepts";
1837
1933
  import { HTTPException } from "hono/http-exception";
1838
1934
 
1839
1935
  import { ValidationError, HTTPError } from "@kosmojs/core/errors";
@@ -1865,7 +1961,7 @@ export default errorHandlerFactory(async (error, ctx) => {
1865
1961
  ? ctx.json({ error: message }, status)
1866
1962
  : ctx.text(message, status);
1867
1963
  });
1868
- `,Ue=`import { defineRoute } from "{{ createImport 'libApi' }}";
1964
+ `,We=`import { defineRoute } from "{{ createImport 'libApi' }}";
1869
1965
 
1870
1966
  export default defineRoute<"{{route.name}}">(({ GET }) => [
1871
1967
  GET(async (ctx) => {
@@ -1874,7 +1970,7 @@ export default defineRoute<"{{route.name}}">(({ GET }) => [
1874
1970
  return ctx.text("Automatically generated route");
1875
1971
  }),
1876
1972
  ]);
1877
- `,We=`import { use } from "{{ createImport 'libApi' }}";
1973
+ `,Ge=`import { use } from "{{ createImport 'libApi' }}";
1878
1974
 
1879
1975
  export type UseT = {};
1880
1976
 
@@ -1885,11 +1981,11 @@ export default [
1885
1981
  return next();
1886
1982
  }),
1887
1983
  ];
1888
- `,Ge=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1984
+ `,Ke=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1889
1985
  import app from "./app";
1890
1986
 
1891
1987
  await serve(app);
1892
- `,Ke=`import { use } from "{{ createImport 'libApi' }}";
1988
+ `,qe=`import { use } from "{{ createImport 'libApi' }}";
1893
1989
 
1894
1990
  /**
1895
1991
  * Define global middleware applied to all routes.
@@ -1900,7 +1996,9 @@ export default [
1900
1996
  return next();
1901
1997
  }),
1902
1998
  ];
1903
- `,qe=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),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 a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,Ue),f=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),u(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),We,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,path:r.honoPattern,basename:r.name,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:d(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,Fe]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,Le],[`api:factory.ts`,Re],[`@api/app.ts`,Ae],[`@api/parsers.ts`,Ne],[`@api/dev.ts`,je],[`@api/errors.ts`,Me],[`@api/router.ts`,Pe],[`@api/server.ts`,Ie]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,ze],[`dev.ts`,Be],[`errors.ts`,He],[`server.ts`,Ge],[`use.ts`,Ke],[`env.d.ts`,Ve]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await f(e.filter(p(t,[`create`]))),await m(e)},async build(e){await f(e),await m(e)}}}),Je=h({meta:{name:`Hono`,slot:`backend`},dependencies:{hono:V.devDependencies.hono,"@hono/node-server":V.devDependencies[`@hono/node-server`]},factory:qe}),H={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`,"raw-body":`^4.0.0`,vite:`^8.2.2`}},Ye=`import Router, { type RouterMiddleware } from "@koa/router";
1999
+ `,Je=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),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 a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,We),f=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),u(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),Ge,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,path:r.honoPattern,basename:r.name,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:d(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,Ie]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,Re],[`api:factory.ts`,ze],[`@api/app.ts`,je],[`@api/parsers.ts`,Pe],[`@api/dev.ts`,Me],[`@api/errors.ts`,Ne],[`@api/router.ts`,Fe],[`@api/server.ts`,Le]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,Be],[`dev.ts`,Ve],[`errors.ts`,Ue],[`server.ts`,Ke],[`use.ts`,qe],[`env.d.ts`,He]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await f(e.filter(p(t,[`create`]))),await m(e)},async build(e){await f(e),await m(e)}}}),Ye=h({meta:{name:`Hono`,slot:`backend`},dependencies:{hono:V.devDependencies.hono,"@hono/node-server":V.devDependencies[`@hono/node-server`]},factory:Je}),H={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`,"raw-body":`^4.0.0`,vite:`^8.2.2`}},Xe=`import { styleText } from "node:util";
2000
+
2001
+ import Router, { type RouterMiddleware } from "@koa/router";
1904
2002
  import Koa from "koa";
1905
2003
 
1906
2004
  import type { Route, RouteDebugOption } from "@kosmojs/core/api";
@@ -1911,7 +2009,7 @@ export type App = Koa<DefaultState, DefaultContext>;
1911
2009
 
1912
2010
  export type AppOptions = ConstructorParameters<
1913
2011
  typeof Koa<DefaultState, DefaultContext>
1914
- >[0] & { router?: Router; debug?: RouteDebugOption };
2012
+ >[0] & { debug?: RouteDebugOption };
1915
2013
 
1916
2014
  export function appFactory(
1917
2015
  routes: Array<Route<RouterMiddleware>>,
@@ -1935,51 +2033,88 @@ export function appFactory(
1935
2033
  ): App {
1936
2034
  const [options, fn] = typeof rest[0] === "function" ? [{}, rest[0]] : rest;
1937
2035
 
1938
- const {
1939
- router = new Router(),
1940
- debug = undefined,
1941
- ...appOptions
1942
- } = {
2036
+ const { debug = undefined, ...appOptions } = {
1943
2037
  ...(options ? { ...options } : {}),
1944
2038
  };
1945
2039
 
2040
+ const app = new Koa(appOptions);
2041
+ const router = new Router();
2042
+
1946
2043
  for (const route of routes) {
1947
2044
  if (typeof debug === "function") {
1948
2045
  (debug as Function)(route.debug, route);
1949
2046
  } else if (debug) {
1950
2047
  console.log(route.debug[typeof debug === "string" ? debug : "full"]);
1951
2048
  }
1952
- router.register(route.path, route.methods, route.middleware, route);
2049
+ router.register(route.path, [route.method], route.middleware, route);
1953
2050
  }
1954
2051
 
1955
- const app = new Koa(appOptions);
2052
+ const routesByPath = routes.reduce<
2053
+ Record<string, Array<Route<RouterMiddleware>>>
2054
+ >((map, route) => {
2055
+ if (!map[route.path]) {
2056
+ map[route.path] = [];
2057
+ }
2058
+ map[route.path].push(route);
2059
+ return map;
2060
+ }, {});
2061
+
2062
+ for (const [path, routes] of Object.entries(routesByPath)) {
2063
+ const methods = routes.map((e) => e.method);
2064
+
2065
+ if (
2066
+ methods.includes("GET") &&
2067
+ methods.indexOf("HEAD") > methods.indexOf("GET")
2068
+ ) {
2069
+ console.warn("----");
2070
+ console.warn(
2071
+ \`\${styleText("yellow", "WARN")}: HEAD handler for \${styleText("blue", routes[0].name)} route is unreachable - \${styleText("magenta", "define HEAD before GET")}\`,
2072
+ );
2073
+ console.warn("----");
2074
+ }
2075
+
2076
+ router.all(path, (ctx) => {
2077
+ const allowedMethods = new Set([...methods, "OPTIONS"]);
2078
+
2079
+ if (methods.includes("GET")) {
2080
+ allowedMethods.add("HEAD");
2081
+ }
2082
+
2083
+ ctx.status = ctx.method === "OPTIONS" ? 204 : 405;
2084
+
2085
+ ctx.set("Allow", [...allowedMethods].join(", "));
2086
+ });
2087
+ }
1956
2088
 
1957
2089
  if (typeof fn === "function") {
1958
2090
  fn({ app, router });
1959
2091
  }
1960
2092
 
2093
+ // NOTE: Routes should be added last, after any middleware
2094
+ app.use(router.routes());
2095
+
1961
2096
  return app;
1962
2097
  }
1963
- `,Xe=`import type { DevSetup } from "@kosmojs/core/api";
2098
+ `,Ze=`import type { DevSetup } from "@kosmojs/core/api";
1964
2099
 
1965
2100
  export const devSetup = (setup: DevSetup) => setup;
1966
- `,Ze=`import type {
2101
+ `,Qe=`import type {
1967
2102
  DefaultContext,
1968
2103
  DefaultState,
1969
2104
  ParameterizedContext,
1970
2105
  } from "../api";
1971
2106
 
1972
2107
  type ErrorHandler = (
1973
- error: any,
1974
2108
  ctx: ParameterizedContext<unknown, DefaultState, DefaultContext>,
1975
- ) => Promise<void> | void;
2109
+ next: Function,
2110
+ ) => Promise<void>;
1976
2111
 
1977
2112
  export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
1978
2113
 
1979
2114
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
1980
2115
  return handler;
1981
2116
  };
1982
- `,Qe=`import zlib from "node:zlib";
2117
+ `,$e=`import zlib from "node:zlib";
1983
2118
 
1984
2119
  import type { RouterContext } from "@koa/router";
1985
2120
  import Formidable, { type Options as FormidableOptions } from "formidable";
@@ -2192,7 +2327,7 @@ export const bodyparsers: {
2192
2327
  return rawParser(stream, rawParserOptions);
2193
2328
  },
2194
2329
  };
2195
- `,$e=`import type { RouterMiddleware } from "@koa/router";
2330
+ `,et=`import type { RouterMiddleware } from "@koa/router";
2196
2331
 
2197
2332
  import type {
2198
2333
  RequestBodyTarget,
@@ -2276,7 +2411,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
2276
2411
  ctx[StateKey].set(
2277
2412
  target,
2278
2413
  target === "query"
2279
- ? normalizeSearchParams(parser(ctx), ctx.method as never)
2414
+ ? normalizeSearchParams(
2415
+ parser(ctx),
2416
+ ctx.method === "HEAD" ? "GET" : ctx.method,
2417
+ )
2280
2418
  : parser(ctx),
2281
2419
  );
2282
2420
  }
@@ -2355,7 +2493,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
2355
2493
  * */
2356
2494
  use(
2357
2495
  async function useValidateResponse(ctx, next) {
2358
- const variants = validationSchemas.response?.[ctx.method] || [];
2496
+ const variants =
2497
+ validationSchemas.response?.[
2498
+ ctx.method === "HEAD" ? "GET" : ctx.method
2499
+ ] || [];
2359
2500
 
2360
2501
  if (!Array.isArray(variants) || !variants.length) {
2361
2502
  return next();
@@ -2389,6 +2530,11 @@ export const createRouteMiddleware: CreateRouteMiddleware<
2389
2530
  contentType: ctx.type,
2390
2531
  };
2391
2532
 
2533
+ // validate only 2xx responses
2534
+ if (Math.floor(response.status / 100) !== 2) {
2535
+ return;
2536
+ }
2537
+
2392
2538
  // Validate body only for JSON variants
2393
2539
  if (variants.some((e) => e.contentType?.includes("json"))) {
2394
2540
  response.body = ctx.body;
@@ -2527,7 +2673,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
2527
2673
  use(
2528
2674
  async (ctx, next) => {
2529
2675
  const schema = {
2530
- ...validationSchemas[target]?.[ctx.method],
2676
+ ...validationSchemas[target]?.[
2677
+ ctx.method === "HEAD" ? "GET" : ctx.method
2678
+ ],
2531
2679
  };
2532
2680
  if (schema.validate && schema.runtimeValidation !== false) {
2533
2681
  schema.validate(await loadData(ctx as never));
@@ -2557,7 +2705,7 @@ export const routes = createRoutes<ParameterizedMiddleware, RouterMiddleware>(
2557
2705
  createRouteMiddleware,
2558
2706
  },
2559
2707
  );
2560
- `,et=`import { join } from "node:path";
2708
+ `,tt=`import { join } from "node:path";
2561
2709
 
2562
2710
  import type { RouteSource } from "@kosmojs/core/api";
2563
2711
 
@@ -2609,7 +2757,7 @@ export const routeSources: Array<RouteSource<never>> = [
2609
2757
  },
2610
2758
  {{/each}}
2611
2759
  ];
2612
- `,tt=`import { chmod, unlink } from "node:fs/promises";
2760
+ `,nt=`import { chmod, unlink } from "node:fs/promises";
2613
2761
  import { parseArgs, styleText } from "node:util";
2614
2762
 
2615
2763
  import type { App } from "./app";
@@ -2672,7 +2820,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
2672
2820
  const server = app.listen(port || sock, onListen);
2673
2821
  return server as never;
2674
2822
  };
2675
- `,nt=`import type { RouterContext } from "@koa/router";
2823
+ `,rt=`import type { RouterContext } from "@koa/router";
2676
2824
  import type { Next } from "koa";
2677
2825
 
2678
2826
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
@@ -2834,25 +2982,20 @@ export const defineRoute: <
2834
2982
  use: use as never,
2835
2983
  });
2836
2984
  };
2837
- `,rt=`export * from "./@api/app";
2985
+ `,it=`export * from "./@api/app";
2838
2986
  export { appFactory as default } from "./@api/app";
2839
2987
  export * from "./@api/dev";
2840
2988
  export * from "./@api/errors";
2841
2989
  export * from "./@api/router";
2842
2990
  export * from "./@api/routes";
2843
2991
  export * from "./@api/server";
2844
- `,it=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
2992
+ `,at=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
2845
2993
  import defaultErrorHandler from "./errors";
2846
2994
 
2847
- export default appFactory(routes, ({ app, router }) => {
2848
-
2849
- app.on("error", defaultErrorHandler);
2850
-
2851
- // NOTE: Routes should be added last, after any middleware
2852
- app.use(router.routes());
2853
-
2854
- });
2855
- `,at=`import app from "./app";
2995
+ export default appFactory(routes, ({ app }) => {
2996
+ app.use(defaultErrorHandler);
2997
+ })
2998
+ `,ot=`import app from "./app";
2856
2999
 
2857
3000
  import { devSetup } from "{{ createImport 'lib' 'api:factory' }}";
2858
3001
 
@@ -2870,39 +3013,43 @@ process.on("unhandledRejection", (reason) => {
2870
3013
  console.error("Reason:", reason);
2871
3014
  process.exit(1);
2872
3015
  });
2873
- `,ot=`export declare module "{{ createImport 'libApi' }}" {
3016
+ `,st=`export declare module "{{ createImport 'libApi' }}" {
2874
3017
  interface DefaultState {}
2875
3018
  interface DefaultContext {}
2876
3019
  }
2877
- `,st=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
3020
+ `,ct=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
2878
3021
 
2879
3022
  import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
2880
3023
 
2881
- export default errorHandlerFactory(async (error, ctx) => {
2882
- const [status, message] = Array.isArray(error)
2883
- ? error
2884
- : error instanceof HTTPError
2885
- ? [error.status, error.message]
2886
- : error instanceof ValidationError
2887
- ? [400, \`\${error.target}: \${error.errorMessage}\`]
2888
- : [error.statusCode || 500, error.message];
2889
-
2890
- ctx.status = status;
2891
-
2892
- if (ctx.accepts("json")) {
2893
- ctx.body = { error: message };
2894
- } else {
2895
- ctx.body = message;
3024
+ export default errorHandlerFactory(async (ctx, next) => {
3025
+ try {
3026
+ await next();
3027
+ } catch (error: any) {
3028
+ const [status, message] = Array.isArray(error)
3029
+ ? error
3030
+ : error instanceof HTTPError
3031
+ ? [error.status, error.message]
3032
+ : error instanceof ValidationError
3033
+ ? [400, \`\${error.target}: \${error.errorMessage}\`]
3034
+ : [error.statusCode || 500, error.message];
3035
+
3036
+ ctx.status = status;
3037
+
3038
+ if (ctx.accepts("json")) {
3039
+ ctx.body = { error: message };
3040
+ } else {
3041
+ ctx.body = message;
3042
+ }
2896
3043
  }
2897
3044
  });
2898
- `,ct=`import { defineRoute } from "{{ createImport 'libApi' }}";
3045
+ `,lt=`import { defineRoute } from "{{ createImport 'libApi' }}";
2899
3046
 
2900
3047
  export default defineRoute<"{{route.name}}">(({ GET }) => [
2901
3048
  GET(async (ctx) => {
2902
3049
  ctx.body = "Automatically generated route";
2903
3050
  }),
2904
3051
  ]);
2905
- `,lt=`import { use } from "{{ createImport 'libApi' }}";
3052
+ `,ut=`import { use } from "{{ createImport 'libApi' }}";
2906
3053
 
2907
3054
  export type UseT = {};
2908
3055
 
@@ -2913,11 +3060,11 @@ export default [
2913
3060
  return next();
2914
3061
  }),
2915
3062
  ];
2916
- `,ut=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
3063
+ `,dt=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
2917
3064
  import app from "./app";
2918
3065
 
2919
3066
  await serve(app);
2920
- `,dt=`import { use } from "{{ createImport 'libApi' }}";
3067
+ `,ft=`import { use } from "{{ createImport 'libApi' }}";
2921
3068
 
2922
3069
  /**
2923
3070
  * Define global middleware applied to all routes.
@@ -2928,17 +3075,17 @@ export default [
2928
3075
  return next();
2929
3076
  }),
2930
3077
  ];
2931
- `,ft=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),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 a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,ct),d=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),u(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),lt,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,basename:r.name,path:r.pathPattern,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:f(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,et]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,nt],[`api:factory.ts`,rt],[`@api/app.ts`,Ye],[`@api/dev.ts`,Xe],[`@api/errors.ts`,Ze],[`@api/parsers.ts`,Qe],[`@api/router.ts`,$e],[`@api/server.ts`,tt]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,it],[`dev.ts`,at],[`errors.ts`,st],[`server.ts`,ut],[`use.ts`,dt],[`env.d.ts`,ot]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await d(e.filter(p(t,[`create`]))),await m(e)},async build(e){await d(e),await m(e)}}}),pt=h({meta:{name:`Koa`,slot:`backend`,types:[`@types/koa`]},dependencies:{koa:H.devDependencies.koa,"@koa/router":H.devDependencies[`@koa/router`],formidable:H.devDependencies.formidable,"raw-body":H.devDependencies[`raw-body`]},devDependencies:{"@types/koa":H.devDependencies[`@types/koa`],"@types/formidable":H.devDependencies[`@types/formidable`]},factory:ft}),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.2`},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`}},mt=()=>{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)]},ht=(e,t,n)=>{let{remarkPlugins:r=[],rehypePlugins:i=[]}={...n},a=()=>{let t=[`${l.srcDir}/${e.name}/${l.entryDir}/client.ts`].map(e=>re(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,`
3078
+ `,pt=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),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 a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,lt),d=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),u(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),ut,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,basename:r.name,path:r.pathPattern,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:f(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,tt]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,rt],[`api:factory.ts`,it],[`@api/app.ts`,Xe],[`@api/dev.ts`,Ze],[`@api/errors.ts`,Qe],[`@api/parsers.ts`,$e],[`@api/router.ts`,et],[`@api/server.ts`,nt]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,at],[`dev.ts`,ot],[`errors.ts`,ct],[`server.ts`,dt],[`use.ts`,ft],[`env.d.ts`,st]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await d(e.filter(p(t,[`create`]))),await m(e)},async build(e){await d(e),await m(e)}}}),mt=h({meta:{name:`Koa`,slot:`backend`,types:[`@types/koa`]},dependencies:{koa:H.devDependencies.koa,"@koa/router":H.devDependencies[`@koa/router`],formidable:H.devDependencies.formidable,"raw-body":H.devDependencies[`raw-body`]},devDependencies:{"@types/koa":H.devDependencies[`@types/koa`],"@types/formidable":H.devDependencies[`@types/formidable`]},factory:pt}),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.2`},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`}},ht=()=>{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)]},gt=(e,t,n)=>{let{remarkPlugins:r=[],rehypePlugins:i=[]}={...n},a=()=>{let t=[`${l.srcDir}/${e.name}/${l.entryDir}/client.ts`].map(e=>ie(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,`
2932
3079
  if (import.meta.hot) {
2933
3080
  import.meta.hot.accept(() => {});
2934
3081
  }
2935
3082
  `].join(`
2936
- `)}}}},o=[ne({jsxImportSource:`preact`,providerImportSource:`@mdx-js/preact`,remarkPlugins:r,rehypePlugins:i})];return t===`serve`&&o.push(a()),o},gt=`import type { FunctionComponent } from "preact";
3083
+ `)}}}},o=[re({jsxImportSource:`preact`,providerImportSource:`@mdx-js/preact`,remarkPlugins:r,rehypePlugins:i})];return t===`serve`&&o.push(a()),o},_t=`import type { FunctionComponent } from "preact";
2937
3084
 
2938
3085
  export const AppProvider: FunctionComponent = (props) => {
2939
3086
  return props.children;
2940
3087
  };
2941
- `,_t=`import { render, hydrate as hydrateOrig } from "preact";
3088
+ `,vt=`import { render, hydrate as hydrateOrig } from "preact";
2942
3089
  import type { RouterFactoryReturn } from "@kosmojs/core";
2943
3090
  import { clientRenderFactory } from "@kosmojs/core/generators";
2944
3091
 
@@ -2979,7 +3126,7 @@ export const mount = async (
2979
3126
  }
2980
3127
 
2981
3128
  export default clientRenderFactory();
2982
- `,vt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
3129
+ `,yt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
2983
3130
 
2984
3131
  import type {
2985
3132
  RenderToStringWrapper,
@@ -3053,7 +3200,7 @@ export const renderToString: RenderToStringWrapper<
3053
3200
  }
3054
3201
 
3055
3202
  export default serverRenderFactory<false>();
3056
- `,yt=`declare module "*.mdx" {
3203
+ `,bt=`declare module "*.mdx" {
3057
3204
  import type { ComponentType } from "preact";
3058
3205
  export const frontmatter: Record<string, unknown>;
3059
3206
  const component: ComponentType;
@@ -3066,7 +3213,7 @@ declare module "*.md" {
3066
3213
  const component: ComponentType;
3067
3214
  export default component;
3068
3215
  }
3069
- `,bt=`import { MDXProvider } from "@mdx-js/preact";
3216
+ `,xt=`import { MDXProvider } from "@mdx-js/preact";
3070
3217
  import { match, pathToRegexp } from "path-to-regexp";
3071
3218
  import { type ComponentType, createContext, h, type VNode } from "preact";
3072
3219
 
@@ -3268,7 +3415,7 @@ export const createRoute = (
3268
3415
  layouts,
3269
3416
  };
3270
3417
  };
3271
- `,xt=`/* @jsxImportSource preact */
3418
+ `,St=`/* @jsxImportSource preact */
3272
3419
 
3273
3420
  import styles from "./styles.module.css";
3274
3421
 
@@ -3309,7 +3456,7 @@ export default function PageSample(props: {
3309
3456
  </div>
3310
3457
  );
3311
3458
  }
3312
- `,St=`/* @jsxImportSource preact */
3459
+ `,Ct=`/* @jsxImportSource preact */
3313
3460
 
3314
3461
  import styles from "./styles.module.css";
3315
3462
 
@@ -3361,7 +3508,7 @@ export default function PageSample(props: {
3361
3508
  </div>
3362
3509
  );
3363
3510
  }
3364
- `,Ct=`* {
3511
+ `,wt=`* {
3365
3512
  margin: 0;
3366
3513
  padding: 0;
3367
3514
  box-sizing: border-box;
@@ -3496,7 +3643,7 @@ export default function PageSample(props: {
3496
3643
  align-items: center;
3497
3644
  gap: 0.25rem;
3498
3645
  }
3499
- `,wt=`/* @jsxImportSource preact */
3646
+ `,Tt=`/* @jsxImportSource preact */
3500
3647
 
3501
3648
  import styles from "./styles.module.css";
3502
3649
 
@@ -3562,7 +3709,7 @@ export default function WelcomePage() {
3562
3709
  </div>
3563
3710
  );
3564
3711
  }
3565
- `,Tt=`export type ParamsMap = {
3712
+ `,Et=`export type ParamsMap = {
3566
3713
  {{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
3567
3714
  {{/each}}
3568
3715
  };
@@ -3571,7 +3718,7 @@ export const paramNames = {
3571
3718
  {{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
3572
3719
  {{/each}}
3573
3720
  } as const;
3574
- `,Et=`import type { ComponentType } from "preact";
3721
+ `,Dt=`import type { ComponentType } from "preact";
3575
3722
 
3576
3723
  import type { RouterFactoryReturn } from "@kosmojs/core";
3577
3724
  import { createRouterFactory } from "@kosmojs/core/generators";
@@ -3615,7 +3762,7 @@ export default createRouterFactory<
3615
3762
  Promise<RouteComponent>,
3616
3763
  { server: { route: Route } }
3617
3764
  >();
3618
- `,Dt=`import { join } from "node:path";
3765
+ `,Ot=`import { join } from "node:path";
3619
3766
 
3620
3767
  import { compile } from "path-to-regexp";
3621
3768
 
@@ -3661,7 +3808,7 @@ export default Object.entries(routes)
3661
3808
  return [];
3662
3809
  })
3663
3810
  .map((path) => join(base, path));
3664
- `,Ot=`import type { PageRoute } from "@kosmojs/core";
3811
+ `,kt=`import type { PageRoute } from "@kosmojs/core";
3665
3812
 
3666
3813
  {{#each pageRoutes}}
3667
3814
  import * as {{id}} from "{{ createImport 'pages' file }}";
@@ -3685,7 +3832,7 @@ const routeMap: Record<
3685
3832
  }
3686
3833
 
3687
3834
  export default routeMap;
3688
- `,kt=`import { useContext } from "preact/hooks";
3835
+ `,At=`import { useContext } from "preact/hooks";
3689
3836
 
3690
3837
  import { RouterContext } from "./mdx";
3691
3838
 
@@ -3731,10 +3878,10 @@ export const useFrontmatter = <
3731
3878
  >(): T => {
3732
3879
  return useRoute().frontmatter as T;
3733
3880
  };
3734
- `,At=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
3881
+ `,jt=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
3735
3882
 
3736
3883
  <AppProvider>{props.children}</AppProvider>
3737
- `,jt=`import { h, type JSX } from "preact";
3884
+ `,Mt=`import { h, type JSX } from "preact";
3738
3885
 
3739
3886
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
3740
3887
 
@@ -3751,7 +3898,7 @@ export default function Link(
3751
3898
 
3752
3899
  return h("a", { ...restProps, href }, children);
3753
3900
  }
3754
- `,Mt=`/**
3901
+ `,Nt=`/**
3755
3902
  * MDX component overrides.
3756
3903
  *
3757
3904
  * Every standard markdown element (headings, links, code blocks, etc.)
@@ -3774,7 +3921,7 @@ export const components = {
3774
3921
  declare global {
3775
3922
  type MDXProvidedComponents = typeof components;
3776
3923
  }
3777
- `,Nt=`import renderFactory, {
3924
+ `,Pt=`import renderFactory, {
3778
3925
  createRoutes,
3779
3926
  hydrate,
3780
3927
  mount,
@@ -3801,7 +3948,7 @@ if (root) {
3801
3948
  } else {
3802
3949
  console.error("❌ Root element not found!");
3803
3950
  }
3804
- `,Pt=`import renderFactory, {
3951
+ `,Ft=`import renderFactory, {
3805
3952
  createRoutes,
3806
3953
  renderToString,
3807
3954
  // no renderToStream on MDX folders
@@ -3822,18 +3969,6 @@ export default renderFactory(() => {
3822
3969
  },
3823
3970
  };
3824
3971
  });
3825
- `,Ft=`<!doctype html>
3826
- <html lang="en">
3827
- <head>
3828
- <meta charset="UTF-8" />
3829
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
3830
- <!--app-head-->
3831
- </head>
3832
- <body>
3833
- <div id="app"><!--app-html--></div>
3834
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
3835
- </body>
3836
- </html>
3837
3972
  `,It=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
3838
3973
 
3839
3974
  export default function Page() {
@@ -3881,7 +4016,7 @@ export default routerFactory((routes) => {
3881
4016
  },
3882
4017
  };
3883
4018
  });
3884
- `,Vt=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w(),serializeParams(e){return JSON.stringify(e.params)}}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,Rt),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?zt:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:mt()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),Lt,{route:r},{overwrite:o})},d=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),r=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(S)}]}return[]}).sort(S);for(let[e,a]of[[`client.ts`,_t],[`server.ts`,vt]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,Tt],[`router.ts`,Et],[`ssg:routes.ts`,Ot]])await i(n.lib(e),t,{pageRoutes:r})};return{config({command:n}){return{oxc:{jsx:{runtime:`automatic`,importSource:`preact`}},plugins:ht(e,n,t)}},async start(){for(let[e,t]of[[`env.d.ts`,yt],[`app.ts`,gt],[`mdx.ts`,bt],[`use.ts`,kt],[`ssg.ts`,Dt],[`pageSamples/styles.module.css`,Ct],[`pageSamples/welcome.tsx`,wt],[`pageSamples/page.tsx`,St],[`pageSamples/404.tsx`,xt]])await i(n.lib(e),t,{});for(let[e,t]of[[`pages/404.mdx`,It],[`components/Link.tsx`,jt],[`components/mdx.ts`,Mt],[`app.mdx`,At],[`router.ts`,Bt]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});await a(n.src(`index.html`),Ft,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,Nt],[`server.ts`,Pt]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){await u(e.filter(m(t,[`create`]))),await d(e)},async build(e){await u(e),await d(e)}}}),Ht=h({meta:{name:`MDX`,jsx:`react-jsx`,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:Vt}),Ut={json:`application/json`,form:[`application/x-www-form-urlencoded`,`multipart/form-data`],raw:void 0},Wt=()=>{let e=e=>[`Buffer`,`ArrayBuffer`,`Blob`].includes(e)?{type:`string`,format:`binary`}:oe.Script(e),n=(e,t,n)=>{let r=n?`${t}_${n.replace(/[^\w.-]/g,`_`)}${T(n)}`:t;return`${e.id}_${r}`},r=(e,t,r,i)=>[`#`,`components`,e,n(t,r,i)].join(`/`),i=e=>e.split(`/`).reduce((e,t)=>e+ +!t.includes(`{`),0),o=e=>{if(e.name===`index`)return[`/`];let{tokens:n}=ae(e.pathPattern),r=e=>e.flatMap(e=>{switch(e.type){case`param`:return[e.name];case`wildcard`:return[e.name];case`group`:return r(e.tokens);default:return[]}}),a=(e,t)=>{if(!e.length)return[t];let[n,...i]=e;switch(n.type){case`text`:return a(i,{path:`${t.path}${n.value}`,params:t.params});case`param`:return a(i,{path:`${t.path}{${n.name}}`,params:[...t.params,n.name]});case`wildcard`:return a(i,{path:`${t.path}{${n.name}*}`,params:[...t.params,n.name]});case`group`:{let e=a(i,t),o=a([...n.tokens,...i],t),s=r(n.tokens),c=o.filter(e=>s.some(t=>e.params.includes(t)));return[...e,...c]}}},o=a(n,{path:``,params:[]}),s=e.params.schema.reduce((e,{name:t},n)=>(e[n]=t,e),{});return o.reduce((e,n)=>{let r=t(`/`,n.path);return e.includes(r)||n.params.every((e,t)=>e===s[t])&&e.push(r),e},[]).sort((e,t)=>i(t)-i(e))},s=(e,t)=>{let n=e.params.resolvedType?.properties?.flatMap(n=>RegExp(`\\{${n.name}\\*?\\}`).test(t)?[{$ref:r(`parameters`,e,e.params.id,n.name)}]:[]);return n?.length?n:void 0},c=(e,t)=>{let n=e.validationDefinitions.find(e=>e.method===t&&e.target===`response`);return Array.isArray(n?.variants)?n.variants.reduce((t,{id:n,status:i,contentType:a,body:o})=>(t[i]=Gt(i,a)||{description:`Success`,content:{[a||`application/json`]:{schema:o?{$ref:r(`schemas`,e,n)}:{type:`object`}}}},t),{}):{200:{description:`Success - TODO: Add response schema`,content:{"text/plain":{schema:{type:`string`}}}}}},l=t=>{let{parameters:r,schemas:i}={parameters:{},schemas:{}};for(let r of t.validationDefinitions)if(r.target===`response`)for(let{id:a,resolvedType:o}of r.variants)o?.typeboxSchema&&(i[n(t,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=n(t,a,r.name);i[o]=e(r.typeboxSchema)}}else{let{id:a,resolvedType:o}=r.schema;o?.typeboxSchema&&(i[n(t,a)]=e(o.typeboxSchema))}if(t.params.resolvedType)for(let i of t.params.resolvedType.properties||[])i?.typeboxSchema&&(r[n(t,t.params.id,i.name)]={name:i.name,in:`path`,required:!0,schema:e(i.typeboxSchema)});return{parameters:r,schemas:i}},u=e=>{let t={},n=e.validationDefinitions.flatMap(e=>e.target===`response`?[]:e.schema.resolvedType?[e]:[]);for(let i of o(e))for(let o of e.methods){let l={responses:c(e,o)},u=s(e,i);u&&(l.parameters=u);let d=n.find(e=>e.method===o&&e.target===`query`);if(d?.schema)for(let t of d.schema.resolvedType?.properties||[])l.parameters||=[],l.parameters.push({name:t.name,in:`query`,required:!t.optional,schema:{$ref:r(`schemas`,e,d.schema.id,t.name)}});let f=n.filter(e=>e.method===o&&Object.keys(a).includes(e.target));f.length&&(l.requestBody={required:!0,content:f.reduce((t,n)=>{let{contentType:i=Ut[n.target]}=n;if(i){let a={$ref:r(`schemas`,e,n.schema.id)};for(let e of[i].flat())t[e]={schema:a}}return t},{})}),t[i]||(t[i]={}),t[i][o.toLowerCase()]=l}return t};return{generateComponentId:n,generateComponentPath:r,generatePathVariations:o,generateOpenAPISchema:e=>{let t=new Map;for(let n of e)t.set(n.name,o(n));let{components:n,paths:r}=e.sort(S).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=u(t),{parameters:r,schemas:i}=l(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}}}},Gt=(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]},Kt=g((e,t)=>{let{outfile:n=``,...r}={...t},{createPath:i}=y(e),{generateOpenAPISchema:a}=Wt(),o=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]),{paths:o,components:s}=a(t),c={...JSON.parse(JSON.stringify(r)),paths:o,components:s},l=/ya?ml/.test(n)?ie.stringify(c):JSON.stringify(c,null,2);await ee(i.src(n),l,{})};return{async watch(e){await o(e)},async build(e){await o(e)}}}),qt=h({meta:{name:`OpenAPI`,resolveTypes:!0},factory:Kt}),W={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.1.0`},devDependencies:{"@tanstack/react-query":`^5.102.2`,"@types/react":`^19.2.18`,"@types/react-dom":`^19.2.5`,"path-to-regexp":`^8.4.2`,react:`^19.2.8`,"react-dom":`^19.2.8`,"react-router":`^8.3.0`}},Jt=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(`❗${r([`red`,`bold`],`WARN`)}: React Router v7 only supports dot-suffix mixed segments (e.g. :param.html).`),console.warn(` ${r([`magenta`],e.orig)} in ${r([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},Yt=()=>{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=Jt(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},Xt=()=>{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)]},Zt=`import type { ReactNode } from "react";
4019
+ `,Vt=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w(),serializeParams(e){return JSON.stringify(e.params)}}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,Rt),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?zt:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:ht()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),Lt,{route:r},{overwrite:o})},d=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),r=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(S)}]}return[]}).sort(S);for(let[e,a]of[[`client.ts`,vt],[`server.ts`,yt]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,Et],[`router.ts`,Dt],[`ssg:routes.ts`,kt]])await i(n.lib(e),t,{pageRoutes:r})};return{config({command:n}){return{oxc:{jsx:{runtime:`automatic`,importSource:`preact`}},plugins:gt(e,n,t)}},async start(){for(let[e,t]of[[`env.d.ts`,bt],[`app.ts`,_t],[`mdx.ts`,xt],[`use.ts`,At],[`ssg.ts`,Ot],[`pageSamples/styles.module.css`,wt],[`pageSamples/welcome.tsx`,Tt],[`pageSamples/page.tsx`,Ct],[`pageSamples/404.tsx`,St]])await i(n.lib(e),t,{});for(let[e,t]of[[`pages/404.mdx`,It],[`components/Link.tsx`,Mt],[`components/mdx.ts`,Nt],[`app.mdx`,jt],[`router.ts`,Bt]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});for(let[e,t]of[[`client.ts`,Pt],[`server.ts`,Ft]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){await u(e.filter(m(t,[`create`]))),await d(e)},async build(e){await u(e),await d(e)}}}),Ht=h({meta:{name:`MDX`,slot:`frontend`,jsx:`react-jsx`,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:Vt}),Ut={json:`application/json`,form:[`application/x-www-form-urlencoded`,`multipart/form-data`],raw:void 0},Wt=()=>{let e=e=>[`Buffer`,`ArrayBuffer`,`Blob`].includes(e)?{type:`string`,format:`binary`}:se.Script(e),n=(e,t,n)=>{let r=n?`${t}_${n.replace(/[^\w.-]/g,`_`)}${T(n)}`:t;return`${e.id}_${r}`},r=(e,t,r,i)=>[`#`,`components`,e,n(t,r,i)].join(`/`),i=e=>e.split(`/`).reduce((e,t)=>e+ +!t.includes(`{`),0),o=e=>{if(e.name===`index`)return[`/`];let{tokens:n}=oe(e.pathPattern),r=e=>e.flatMap(e=>{switch(e.type){case`param`:return[e.name];case`wildcard`:return[e.name];case`group`:return r(e.tokens);default:return[]}}),a=(e,t)=>{if(!e.length)return[t];let[n,...i]=e;switch(n.type){case`text`:return a(i,{path:`${t.path}${n.value}`,params:t.params});case`param`:return a(i,{path:`${t.path}{${n.name}}`,params:[...t.params,n.name]});case`wildcard`:return a(i,{path:`${t.path}{${n.name}*}`,params:[...t.params,n.name]});case`group`:{let e=a(i,t),o=a([...n.tokens,...i],t),s=r(n.tokens),c=o.filter(e=>s.some(t=>e.params.includes(t)));return[...e,...c]}}},o=a(n,{path:``,params:[]}),s=e.params.schema.reduce((e,{name:t},n)=>(e[n]=t,e),{});return o.reduce((e,n)=>{let r=t(`/`,n.path);return e.includes(r)||n.params.every((e,t)=>e===s[t])&&e.push(r),e},[]).sort((e,t)=>i(t)-i(e))},s=(e,t)=>{let n=e.params.resolvedType?.properties?.flatMap(n=>RegExp(`\\{${n.name}\\*?\\}`).test(t)?[{$ref:r(`parameters`,e,e.params.id,n.name)}]:[]);return n?.length?n:void 0},c=(e,t)=>{let n=e.validationDefinitions.find(e=>e.method===t&&e.target===`response`);return Array.isArray(n?.variants)?n.variants.reduce((t,{id:n,status:i,contentType:a,body:o})=>(t[i]=Gt(i,a)||{description:`Success`,content:{[a||`application/json`]:{schema:o?{$ref:r(`schemas`,e,n)}:{type:`object`}}}},t),{}):{200:{description:`Success - TODO: Add response schema`,content:{"text/plain":{schema:{type:`string`}}}}}},l=t=>{let{parameters:r,schemas:i}={parameters:{},schemas:{}};for(let r of t.validationDefinitions)if(r.target===`response`)for(let{id:a,resolvedType:o}of r.variants)o?.typeboxSchema&&(i[n(t,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=n(t,a,r.name);i[o]=e(r.typeboxSchema)}}else{let{id:a,resolvedType:o}=r.schema;o?.typeboxSchema&&(i[n(t,a)]=e(o.typeboxSchema))}if(t.params.resolvedType)for(let i of t.params.resolvedType.properties||[])i?.typeboxSchema&&(r[n(t,t.params.id,i.name)]={name:i.name,in:`path`,required:!0,schema:e(i.typeboxSchema)});return{parameters:r,schemas:i}},u=e=>{let t={},n=e.validationDefinitions.flatMap(e=>e.target===`response`?[]:e.schema.resolvedType?[e]:[]);for(let i of o(e))for(let o of e.methods){let l={responses:c(e,o)},u=s(e,i);u&&(l.parameters=u);let d=n.find(e=>e.method===o&&e.target===`query`);if(d?.schema)for(let t of d.schema.resolvedType?.properties||[])l.parameters||=[],l.parameters.push({name:t.name,in:`query`,required:!t.optional,schema:{$ref:r(`schemas`,e,d.schema.id,t.name)}});let f=n.filter(e=>e.method===o&&Object.keys(a).includes(e.target));f.length&&(l.requestBody={required:!0,content:f.reduce((t,n)=>{let{contentType:i=Ut[n.target]}=n;if(i){let a={$ref:r(`schemas`,e,n.schema.id)};for(let e of[i].flat())t[e]={schema:a}}return t},{})}),t[i]||(t[i]={}),t[i][o.toLowerCase()]=l}return t};return{generateComponentId:n,generateComponentPath:r,generatePathVariations:o,generateOpenAPISchema:e=>{let t=new Map;for(let n of e)t.set(n.name,o(n));let{components:n,paths:r}=e.sort(S).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=u(t),{parameters:r,schemas:i}=l(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}}}},Gt=(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]},Kt=g((e,t)=>{let{outfile:n=``,...r}={...t},{createPath:i}=y(e),{generateOpenAPISchema:a}=Wt(),o=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]),{paths:o,components:s}=a(t),c={...JSON.parse(JSON.stringify(r)),paths:o,components:s},l=/ya?ml/.test(n)?ae.stringify(c):JSON.stringify(c,null,2);await ee(i.src(n),l,{})};return{async watch(e){await o(e)},async build(e){await o(e)}}}),qt=h({meta:{name:`OpenAPI`,resolveTypes:!0},factory:Kt}),W={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.1.0`},devDependencies:{"@tanstack/react-query":`^5.102.2`,"@types/react":`^19.2.18`,"@types/react-dom":`^19.2.5`,"path-to-regexp":`^8.4.2`,react:`^19.2.8`,"react-dom":`^19.2.8`,"react-router":`^8.3.0`}},Jt=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(`❗${r([`red`,`bold`],`WARN`)}: React Router v7 only supports dot-suffix mixed segments (e.g. :param.html).`),console.warn(` ${r([`magenta`],e.orig)} in ${r([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},Yt=()=>{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=Jt(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},Xt=()=>{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)]},Zt=`import type { ReactNode } from "react";
3885
4020
 
3886
4021
  export const AppProvider = ({ children }: { children: ReactNode }) => {
3887
4022
  return children;
@@ -4545,29 +4680,17 @@ export default renderFactory(() => {
4545
4680
  },
4546
4681
  };
4547
4682
  });
4548
- `,hn=`<!doctype html>
4549
- <html lang="en">
4550
- <head>
4551
- <meta charset="UTF-8" />
4552
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
4553
- <!--app-head-->
4554
- </head>
4555
- <body>
4556
- <div id="app"><!--app-html--></div>
4557
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
4558
- </body>
4559
- </html>
4560
- `,gn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
4683
+ `,hn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
4561
4684
 
4562
4685
  export default function Page() {
4563
4686
  return <PageSample />;
4564
4687
  }
4565
- `,_n=`import { Outlet } from "react-router";
4688
+ `,gn=`import { Outlet } from "react-router";
4566
4689
 
4567
4690
  export default function Layout() {
4568
4691
  return <Outlet />;
4569
4692
  }
4570
- `,vn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
4693
+ `,_n=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
4571
4694
 
4572
4695
  export default function Page() {
4573
4696
  return PageSample({
@@ -4580,8 +4703,8 @@ export default function Page() {
4580
4703
  },
4581
4704
  });
4582
4705
  }
4583
- `,yn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
4584
- `,bn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
4706
+ `,vn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
4707
+ `,yn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
4585
4708
 
4586
4709
  import app from "./app";
4587
4710
 
@@ -4596,12 +4719,12 @@ export default routerFactory((routes) => {
4596
4719
  },
4597
4720
  };
4598
4721
  });
4599
- `,xn=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()},partials:{routePartial:en}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=Yt(),s=e=>!e?.trim().length,u=c(t?.templates,vn),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?yn:u(r.name,r),{route:r,message:Xt()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),_n,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(v(r));for(let[e,t]of[[`client.ts`,$t],[`server.ts`,tn]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a});await i(n.lib(`router.tsx`),un,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[se(n)]}},async start(){for(let[e,r]of[[`env.d.ts`,``],[`react.ts`,ln],[`pageSamples/styles.module.css`,an],[`pageSamples/welcome.tsx`,on],[`pageSamples/page.tsx`,rn],[`pageSamples/404.tsx`,nn],...t?.tanstack?.query?[[`app.tsx`,Qt],[`query.ts`,sn]]:[[`app.tsx`,Zt],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.tsx`,gn],[`components/Link.tsx`,fn],[`app.tsx`,dn],[`router.ts`,bn]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});await a(n.src(`index.html`),hn,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,pn],[`server.ts`,mn]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){await d(e.filter(m(t,[`create`]))),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?cn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Sn=h({meta:{name:`React`,jsx:`preserve`,jsxImportSource:`react`},dependencies(e){return{react:W.devDependencies.react,"react-router":W.devDependencies[`react-router`],"path-to-regexp":W.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/react-query":W.devDependencies[`@tanstack/react-query`]}:{}}},devDependencies:{"@types/react":W.devDependencies[`@types/react`],"@types/react-dom":W.devDependencies[`@types/react-dom`],"react-dom":W.devDependencies[`react-dom`]},factory:xn}),G={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.102.2`,"path-to-regexp":`^8.4.2`,"solid-js":`^1.9.15`}},Cn=()=>{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=K(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=K([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},K=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(`❗${r([`red`,`bold`],`WARN`)}: At the moment Solid Router does not support mixed path segments.`),console.warn(` ${r([`magenta`],e.orig)} segment in ${r([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},wn=()=>{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)]},Tn=`import type { ParentComponent } from "solid-js";
4722
+ `,bn=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()},partials:{routePartial:en}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=Yt(),s=e=>!e?.trim().length,u=c(t?.templates,_n),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?vn:u(r.name,r),{route:r,message:Xt()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),gn,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(v(r));for(let[e,t]of[[`client.ts`,$t],[`server.ts`,tn]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a});await i(n.lib(`router.tsx`),un,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[ce(n)]}},async start(){for(let[e,r]of[[`env.d.ts`,``],[`react.ts`,ln],[`pageSamples/styles.module.css`,an],[`pageSamples/welcome.tsx`,on],[`pageSamples/page.tsx`,rn],[`pageSamples/404.tsx`,nn],...t?.tanstack?.query?[[`app.tsx`,Qt],[`query.ts`,sn]]:[[`app.tsx`,Zt],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.tsx`,hn],[`components/Link.tsx`,fn],[`app.tsx`,dn],[`router.ts`,yn]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});for(let[e,t]of[[`client.ts`,pn],[`server.ts`,mn]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){await d(e.filter(m(t,[`create`]))),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?cn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),xn=h({meta:{name:`React`,slot:`frontend`,jsx:`preserve`,jsxImportSource:`react`},dependencies(e){return{react:W.devDependencies.react,"react-router":W.devDependencies[`react-router`],"path-to-regexp":W.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/react-query":W.devDependencies[`@tanstack/react-query`]}:{}}},devDependencies:{"@types/react":W.devDependencies[`@types/react`],"@types/react-dom":W.devDependencies[`@types/react-dom`],"react-dom":W.devDependencies[`react-dom`]},factory:bn}),G={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.102.2`,"path-to-regexp":`^8.4.2`,"solid-js":`^1.9.15`}},Sn=()=>{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=K(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=K([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},K=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(`❗${r([`red`,`bold`],`WARN`)}: At the moment Solid Router does not support mixed path segments.`),console.warn(` ${r([`magenta`],e.orig)} segment in ${r([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},Cn=()=>{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)]},wn=`import type { ParentComponent } from "solid-js";
4600
4723
 
4601
4724
  export const AppProvider: ParentComponent = (props) => {
4602
4725
  return props.children;
4603
4726
  };
4604
- `,En=`import type { ParentComponent } from "solid-js";
4727
+ `,Tn=`import type { ParentComponent } from "solid-js";
4605
4728
  import { type QueryClient, QueryClientProvider } from "@tanstack/solid-query";
4606
4729
 
4607
4730
  import { getQueryClient } from "./query";
@@ -4613,7 +4736,7 @@ export const AppProvider: ParentComponent<{ client?: QueryClient }> = (props) =>
4613
4736
  </QueryClientProvider>
4614
4737
  );
4615
4738
  };
4616
- `,Dn=`import { lazy, type JSX } from "solid-js";
4739
+ `,En=`import { lazy, type JSX } from "solid-js";
4617
4740
  import { hydrate as hydrateOrig, render } from "solid-js/web";
4618
4741
  import type { RouterFactoryReturn } from "@kosmojs/core";
4619
4742
  import { clientRenderFactory } from "@kosmojs/core/generators";
@@ -4658,7 +4781,7 @@ export const mount = async (
4658
4781
  }
4659
4782
 
4660
4783
  export default clientRenderFactory();
4661
- `,On=`{
4784
+ `,Dn=`{
4662
4785
  path: "{{path}}",
4663
4786
  {{#if component}}
4664
4787
  component: {{component}}_component,
@@ -4668,7 +4791,7 @@ export default clientRenderFactory();
4668
4791
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
4669
4792
  {{/if}}
4670
4793
  }
4671
- `,kn=`import type { JSX } from "solid-js";
4794
+ `,On=`import type { JSX } from "solid-js";
4672
4795
 
4673
4796
  import {
4674
4797
  generateHydrationScript,
@@ -4749,7 +4872,7 @@ export const renderToStream: RenderToStreamWrapper<
4749
4872
  };
4750
4873
 
4751
4874
  export default serverRenderFactory<true>();
4752
- `,An=`/* @jsxImportSource solid-js */
4875
+ `,kn=`/* @jsxImportSource solid-js */
4753
4876
 
4754
4877
  import styles from "./styles.module.css";
4755
4878
 
@@ -4790,7 +4913,7 @@ export default function PageSample(props: {
4790
4913
  </div>
4791
4914
  );
4792
4915
  }
4793
- `,jn=`/* @jsxImportSource solid-js */
4916
+ `,An=`/* @jsxImportSource solid-js */
4794
4917
 
4795
4918
  import styles from "./styles.module.css";
4796
4919
 
@@ -4842,7 +4965,7 @@ export default function PageSample(props: {
4842
4965
  </div>
4843
4966
  );
4844
4967
  }
4845
- `,Mn=`* {
4968
+ `,jn=`* {
4846
4969
  margin: 0;
4847
4970
  padding: 0;
4848
4971
  box-sizing: border-box;
@@ -4977,7 +5100,7 @@ export default function PageSample(props: {
4977
5100
  align-items: center;
4978
5101
  gap: 0.25rem;
4979
5102
  }
4980
- `,Nn=`/* @jsxImportSource solid-js */
5103
+ `,Mn=`/* @jsxImportSource solid-js */
4981
5104
 
4982
5105
  import styles from "./styles.module.css";
4983
5106
 
@@ -5043,7 +5166,7 @@ export default function WelcomePage() {
5043
5166
  </div>
5044
5167
  );
5045
5168
  }
5046
- `,Pn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5169
+ `,Nn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5047
5170
 
5048
5171
  let client: QueryClient | undefined;
5049
5172
 
@@ -5058,7 +5181,7 @@ export const getQueryClient = (): QueryClient => {
5058
5181
  }
5059
5182
  return client;
5060
5183
  };
5061
- `,Fn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5184
+ `,Pn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5062
5185
 
5063
5186
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
5064
5187
 
@@ -5081,7 +5204,7 @@ export const getQueryClient = (): QueryClient => {
5081
5204
  }
5082
5205
  return ctx.tsqClient as QueryClient;
5083
5206
  };
5084
- `,In=`import type { JSX, ParentComponent } from "solid-js";
5207
+ `,Fn=`import type { JSX, ParentComponent } from "solid-js";
5085
5208
  import { Router, type RouteDefinition } from "@solidjs/router";
5086
5209
  import type { RouterFactoryReturn } from "@kosmojs/core";
5087
5210
  import { createRouterFactory } from "@kosmojs/core/generators";
@@ -5117,7 +5240,7 @@ export const createRouters = (
5117
5240
  }
5118
5241
 
5119
5242
  export default createRouterFactory<RouteDefinition, JSX.Element>();
5120
- `,Ln=`export type ComponentLoader = () => Promise<{
5243
+ `,In=`export type ComponentLoader = () => Promise<{
5121
5244
  preload?: () => Promise<unknown>;
5122
5245
  }>;
5123
5246
 
@@ -5132,10 +5255,10 @@ export const loaderFactory = (opt?: { withPreload?: boolean }) => {
5132
5255
  return opt?.withPreload ? { preload } : {};
5133
5256
  };
5134
5257
  };
5135
- `,Rn=`export type MaybeWrapped<T> = import("solid-js/store").Store<T> | T;
5258
+ `,Ln=`export type MaybeWrapped<T> = import("solid-js/store").Store<T> | T;
5136
5259
 
5137
5260
  export { unwrap } from "solid-js/store";
5138
- `,zn=`import type { ParentComponent } from "solid-js";
5261
+ `,Rn=`import type { ParentComponent } from "solid-js";
5139
5262
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
5140
5263
 
5141
5264
  const App: ParentComponent = (props) => {
@@ -5143,7 +5266,7 @@ const App: ParentComponent = (props) => {
5143
5266
  };
5144
5267
 
5145
5268
  export default App;
5146
- `,Bn=`import { A, type AnchorProps } from "@solidjs/router";
5269
+ `,zn=`import { A, type AnchorProps } from "@solidjs/router";
5147
5270
  import { type JSXElement, splitProps } from "solid-js";
5148
5271
 
5149
5272
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
@@ -5168,7 +5291,7 @@ export default function Link(
5168
5291
 
5169
5292
  return <A {...{ ...restProps, href: href() }}>{knownProps.children}</A>;
5170
5293
  }
5171
- `,Vn=`import renderFactory, {
5294
+ `,Bn=`import renderFactory, {
5172
5295
  createRoutes,
5173
5296
  hydrate,
5174
5297
  mount,
@@ -5195,7 +5318,7 @@ if (root) {
5195
5318
  } else {
5196
5319
  console.error("❌ Root element not found!");
5197
5320
  }
5198
- `,Hn=`import renderFactory, {
5321
+ `,Vn=`import renderFactory, {
5199
5322
  createRoutes,
5200
5323
  renderToStream,
5201
5324
  renderToString,
@@ -5222,31 +5345,19 @@ export default renderFactory(() => {
5222
5345
  },
5223
5346
  };
5224
5347
  });
5225
- `,Un=`<!doctype html>
5226
- <html lang="en">
5227
- <head>
5228
- <meta charset="UTF-8" />
5229
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
5230
- <!--app-head-->
5231
- </head>
5232
- <body>
5233
- <div id="app"><!--app-html--></div>
5234
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
5235
- </body>
5236
- </html>
5237
- `,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
5348
+ `,Hn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
5238
5349
 
5239
5350
  export default function Page() {
5240
5351
  return <PageSample />;
5241
5352
  }
5242
- `,Gn=`import type { ParentComponent } from "solid-js";
5353
+ `,Un=`import type { ParentComponent } from "solid-js";
5243
5354
 
5244
5355
  const Layout: ParentComponent = (props) => {
5245
5356
  return props.children;
5246
5357
  };
5247
5358
 
5248
5359
  export default Layout;
5249
- `,Kn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
5360
+ `,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
5250
5361
 
5251
5362
  export default function Page() {
5252
5363
  return PageSample({
@@ -5259,8 +5370,8 @@ export default function Page() {
5259
5370
  },
5260
5371
  });
5261
5372
  }
5262
- `,qn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
5263
- `,Jn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
5373
+ `,Gn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
5374
+ `,Kn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
5264
5375
 
5265
5376
  import app from "./app";
5266
5377
 
@@ -5275,12 +5386,12 @@ export default routerFactory((routes) => {
5275
5386
  },
5276
5387
  };
5277
5388
  });
5278
- `,Yn=g((e,t)=>{let{generators:n=[]}=e.config,{createPath:r,createImportHelpers:i}=y(e),{renderToFile:a}=x({helpers:{...i({origin:`lib`}),...w()},partials:{routePartial:On}}),{renderToFile:o}=x({helpers:i({origin:`src`})}),s=Cn(),u=e=>!e?.trim().length,d=c(t?.templates,Kn),f=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await o(r.pages(n.file),n.name===`index`?qn:d(n.name,n),{route:n,message:wn()},{overwrite:u}):t===`pageLayout`&&await o(r.pages(n.file),Gn,{route:n},{overwrite:u})},p=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),n=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=s(v(n));for(let[e,t]of[[`client.ts`,Dn],[`server.ts`,kn]])await a(r.libEntry(e),t,{pageEntries:n,nestedRoutes:i});await a(r.lib(`router.tsx`),In,{entries:e,indexRoutes:t})};return{config({command:e}){let{templates:r,...i}={...t};return{oxc:{jsx:{importSource:`solid-js`}},plugins:e===`build`?[D({...i,...n.some(e=>e.meta.slot===`ssr`)?{ssr:!0,solid:{...i?.solid,hydratable:!0}}:{}})]:[D({...i,dev:!0,hot:!0})]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`solid.ts`,Ln],[`unwrap.ts`,Rn],[`pageSamples/styles.module.css`,Mn],[`pageSamples/welcome.tsx`,Nn],[`pageSamples/page.tsx`,jn],[`pageSamples/404.tsx`,An],...t?.tanstack?.query?[[`app.tsx`,En],[`query.ts`,Pn]]:[[`app.tsx`,Tn],[`query.ts`,`/** tanstack query disabled */`]]])await a(r.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,Wn],[`components/Link.tsx`,Bn],[`app.tsx`,zn],[`router.ts`,Jn]])await o(r.src(e),t,{entryDir:l.entryDir},{overwrite:u});await o(r.src(`index.html`),Un,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,Vn],[`server.ts`,Hn]])await o(r.entry(e),t,{},{overwrite:u})},async watch(e,t){await f(e.filter(m(t,[`create`]))),await p(e)},async build(e){await f(e),await p(e)},async ssrBuild(){await a(r.lib(`query.ts`),t?.tanstack?.query?Fn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Xn=h({meta:{name:`SolidJS`,jsx:`preserve`,jsxImportSource:`solid-js`},dependencies(e){return{"solid-js":G.devDependencies[`solid-js`],"@solidjs/router":G.devDependencies[`@solidjs/router`],"path-to-regexp":G.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/solid-query":G.devDependencies[`@tanstack/solid-query`]}:{}}},factory:Yn}),Zn=g(e=>{let{generators:i=[],refineTypeName:a,...o}={...e.config},{createPath:s}=y(e);return{async postBuild(){let a=s.distDir(`ssg`),c=n(a,`../ssr/server.js`);if(!await ce(c,le.F_OK).then(()=>!0,()=>!1)){console.error(),console.error(r(`red`,`❗Please enable ssrGenerator in ${e.name}/kosmo.config.ts`)),console.error(` SSG generator can not run without SSR server`),console.error();return}let l=te(`${e.name}: SSG`);l.append(`preparing...`);let{createDisposableServer:u}=await import(c);await O(n(a,`../client/assets`),t(a,`assets`),{recursive:!0}),l.append(`bundling routes...`),await E(_(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:s.lib(),appType:`custom`,plugins:[C.tsconfigPaths(e),C.nodePrefix()],resolve:{conditions:[`node`]},build:{ssr:s.lib(`ssg.ts`),target:`esnext`,sourcemap:!1,emptyOutDir:!0,rolldownOptions:{output:{dir:a,entryFileNames:`routes.js`,format:`esm`}}}}));try{let e=await import(t(a,`routes.js`)).then(e=>e.default);u(async n=>{for(let[r,i]of e.entries()){l.append(`[ ${r+1} of ${e.length} ] ${i}`);let o=await Qn(n,i);o!==void 0&&(await ue(t(a,i),{recursive:!0}),await de(t(a,t(i,`index.html`)),o,`utf8`))}l.succeed(`done ✨`)})}finally{await k(`${a}/routes.js`)}}}}),Qn=async(e,t)=>{try{let n=`http://localhost:${e}${t}`;return await(await fetch(n)).text()}catch(e){console.error(r(`red`,`✗ SSG: Failed generating ${t} route: ${e.message}`));return}},$n=h({meta:{name:`SSG`,slot:`ssg`},factory:Zn}),q={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.2`},devDependencies:{"@hono/node-server":`^2.1.1`,hono:`^4.13.3`,"light-my-request":`^6.6.0`,tinyglobby:`^0.2.17`}},er=`{{#if apiGenerator}}
5389
+ `,qn=g((e,t)=>{let{generators:n=[]}=e.config,{createPath:r,createImportHelpers:i}=y(e),{renderToFile:a}=x({helpers:{...i({origin:`lib`}),...w()},partials:{routePartial:Dn}}),{renderToFile:o}=x({helpers:i({origin:`src`})}),s=Sn(),u=e=>!e?.trim().length,d=c(t?.templates,Wn),f=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await o(r.pages(n.file),n.name===`index`?Gn:d(n.name,n),{route:n,message:Cn()},{overwrite:u}):t===`pageLayout`&&await o(r.pages(n.file),Un,{route:n},{overwrite:u})},p=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),n=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=s(v(n));for(let[e,t]of[[`client.ts`,En],[`server.ts`,On]])await a(r.libEntry(e),t,{pageEntries:n,nestedRoutes:i});await a(r.lib(`router.tsx`),Fn,{entries:e,indexRoutes:t})};return{config({command:e}){let{templates:r,...i}={...t};return{oxc:{jsx:{importSource:`solid-js`}},plugins:e===`build`?[D({...i,...n.some(e=>e.meta.slot===`ssr`)?{ssr:!0,solid:{...i?.solid,hydratable:!0}}:{}})]:[D({...i,dev:!0,hot:!0})]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`solid.ts`,In],[`unwrap.ts`,Ln],[`pageSamples/styles.module.css`,jn],[`pageSamples/welcome.tsx`,Mn],[`pageSamples/page.tsx`,An],[`pageSamples/404.tsx`,kn],...t?.tanstack?.query?[[`app.tsx`,Tn],[`query.ts`,Nn]]:[[`app.tsx`,wn],[`query.ts`,`/** tanstack query disabled */`]]])await a(r.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,Hn],[`components/Link.tsx`,zn],[`app.tsx`,Rn],[`router.ts`,Kn]])await o(r.src(e),t,{entryDir:l.entryDir},{overwrite:u});for(let[e,t]of[[`client.ts`,Bn],[`server.ts`,Vn]])await o(r.entry(e),t,{},{overwrite:u})},async watch(e,t){await f(e.filter(m(t,[`create`]))),await p(e)},async build(e){await f(e),await p(e)},async ssrBuild(){await a(r.lib(`query.ts`),t?.tanstack?.query?Pn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Jn=h({meta:{name:`SolidJS`,slot:`frontend`,jsx:`preserve`,jsxImportSource:`solid-js`},dependencies(e){return{"solid-js":G.devDependencies[`solid-js`],"@solidjs/router":G.devDependencies[`@solidjs/router`],"path-to-regexp":G.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/solid-query":G.devDependencies[`@tanstack/solid-query`]}:{}}},factory:qn}),Yn=g(e=>{let{generators:i=[],refineTypeName:a,...o}={...e.config},{createPath:s}=y(e);return{async postBuild(){let a=s.distDir(`ssg`),c=n(a,`../ssr/server.js`);if(!await le(c,ue.F_OK).then(()=>!0,()=>!1)){console.error(),console.error(r(`red`,`❗Please enable ssrGenerator in ${e.name}/kosmo.config.ts`)),console.error(` SSG generator can not run without SSR server`),console.error();return}let l=te(`${e.name}: SSG`);l.append(`preparing...`);let{createDisposableServer:u}=await import(c);await O(n(a,`../client/assets`),t(a,`assets`),{recursive:!0}),l.append(`bundling routes...`),await E(_(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:s.lib(),appType:`custom`,plugins:[C.tsconfigPaths(e),C.nodePrefix()],resolve:{conditions:[`node`]},build:{ssr:s.lib(`ssg.ts`),target:`esnext`,sourcemap:!1,emptyOutDir:!0,rolldownOptions:{output:{dir:a,entryFileNames:`routes.js`,format:`esm`}}}}));try{let e=await import(t(a,`routes.js`)).then(e=>e.default);u(async n=>{for(let[r,i]of e.entries()){l.append(`[ ${r+1} of ${e.length} ] ${i}`);let o=await Xn(n,i);o!==void 0&&(await de(t(a,i),{recursive:!0}),await fe(t(a,t(i,`index.html`)),o,`utf8`))}l.succeed(`done ✨`)})}finally{await k(`${a}/routes.js`)}}}}),Xn=async(e,t)=>{try{let n=`http://localhost:${e}${t}`;return await(await fetch(n)).text()}catch(e){console.error(r(`red`,`✗ SSG: Failed generating ${t} route: ${e.message}`));return}},Zn=h({meta:{name:`SSG`,slot:`ssg`},factory:Yn}),q={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.2`},devDependencies:{"@hono/node-server":`^2.1.1`,hono:`^4.13.3`,"light-my-request":`^6.6.0`,tinyglobby:`^0.2.17`}},Qn=`{{#if apiGenerator}}
5279
5390
  export { default as apiApp } from "{{ createImport 'api' 'app' }}";
5280
5391
  {{else}}
5281
5392
  export const apiApp = undefined;
5282
5393
  {{/if}}
5283
- `,tr=`import { AsyncLocalStorage } from "node:async_hooks";
5394
+ `,$n=`import { AsyncLocalStorage } from "node:async_hooks";
5284
5395
 
5285
5396
  import type { FetchApp, NodeApp } from "@kosmojs/core";
5286
5397
 
@@ -5324,7 +5435,7 @@ export const store = new AsyncLocalStorage<RequestContext>();
5324
5435
  export const isFetchApp = (app: FetchApp | NodeApp): app is FetchApp => {
5325
5436
  return typeof (app as FetchApp).fetch === "function";
5326
5437
  };
5327
- `,nr=`import { type RequestContext, store } from "./base";
5438
+ `,er=`import { type RequestContext, store } from "./base";
5328
5439
 
5329
5440
  import { renderWrapper } from "{{ createImport 'libEntry' 'server' }}";
5330
5441
 
@@ -5346,7 +5457,7 @@ export const withSsrContext = <T>(
5346
5457
  export const errorProvider = () => {
5347
5458
  return store.getStore()?.error;
5348
5459
  };
5349
- `,rr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
5460
+ `,tr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
5350
5461
  import type { Transport } from "@kosmojs/core/fetch";
5351
5462
 
5352
5463
  import {
@@ -5549,12 +5660,12 @@ const pathnameOf = (input: RequestInfo | URL): string => {
5549
5660
  } catch {}
5550
5661
  return String(input);
5551
5662
  };
5552
- `,ir=`export const routeMap = [
5663
+ `,nr=`export const routeMap = [
5553
5664
  {{#each pageRoutes}}
5554
5665
  { pathPattern: "{{honoPattern}}", renderMode: "{{renderMode}}" },
5555
5666
  {{/each}}
5556
5667
  ];
5557
- `,ar=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
5668
+ `,rr=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
5558
5669
  import {
5559
5670
  createServer,
5560
5671
  type IncomingMessage,
@@ -5578,6 +5689,7 @@ import { routeMap } from "{{ createImport 'lib' '@ssr/routes' }}";
5578
5689
  import { apiBase, base } from "{{ createImport 'libCore' }}";
5579
5690
 
5580
5691
  const ROOT = import.meta.dirname;
5692
+ const HEAD_CLOSE_PATTERN = /<\\/head\\s*>/i;
5581
5693
 
5582
5694
  type AssetInfo = {
5583
5695
  file: string;
@@ -5604,8 +5716,7 @@ export const createApp = async () => {
5604
5716
  errorProvider: () => Error | undefined;
5605
5717
  } = await import(\`\${ROOT}/app.js\`);
5606
5718
 
5607
- // Read the client index.html that includes <!--app-head--> and <!--app-html-->
5608
- // placeholders used for SSR injection.
5719
+ // Read the client index.html that includes <!--app-html--> placeholder
5609
5720
  const template = await readFile(\`\${ROOT}/index.html\`, "utf8");
5610
5721
 
5611
5722
  // Load the Vite manifest
@@ -5614,7 +5725,8 @@ export const createApp = async () => {
5614
5725
  }).then((e) => e.default);
5615
5726
 
5616
5727
  const { renderToString, renderToStream } = ssrApp;
5617
- const [htmlStart, htmlEnd] = template.split("<!--app-html-->");
5728
+
5729
+ const [htmlStart, htmlEnd = ""] = template.split(/<!--\\s*app-html\\s*-->/);
5618
5730
 
5619
5731
  const assets = await loadAssets(ROOT);
5620
5732
 
@@ -5660,6 +5772,17 @@ export const createApp = async () => {
5660
5772
  };
5661
5773
  };
5662
5774
 
5775
+ const injectHead = (html: string, head: string) => {
5776
+ const error = "WARN: missing </head> - required for SSR head injection";
5777
+ if (HEAD_CLOSE_PATTERN.test(html)) {
5778
+ return html.replace(HEAD_CLOSE_PATTERN, (headEnd) => {
5779
+ return [head, headEnd].join("\\n");
5780
+ });
5781
+ }
5782
+ console.error(error);
5783
+ return \`\${html}\\n<script>console.error("\${error}")<\/script>\`;
5784
+ };
5785
+
5663
5786
  const renderPage = async (url: URL, ctx: Context) => {
5664
5787
  const {
5665
5788
  head = "",
@@ -5690,23 +5813,20 @@ export const createApp = async () => {
5690
5813
  );
5691
5814
 
5692
5815
  if (error) {
5693
- console.error("WARN: SSR failed, fallback to CSR");
5816
+ const errorMessage = "WARN: SSR failed, fallback to CSR";
5817
+ console.error(errorMessage);
5694
5818
  console.error(error);
5695
5819
  console.error();
5696
5820
  return [
5697
- htmlStart.replace(
5698
- "<!--app-head-->",
5699
- \`<script>console.error("WARN: SSR failed, fallback to CSR")<\/script>\`,
5821
+ injectHead(
5822
+ htmlStart,
5823
+ \`<script>console.error("\${errorMessage}")<\/script>\`,
5700
5824
  ),
5701
5825
  htmlEnd,
5702
5826
  ].join("");
5703
5827
  }
5704
5828
 
5705
- return [
5706
- htmlStart.replace("<!--app-head-->", head),
5707
- html ?? "",
5708
- htmlEnd,
5709
- ].join("");
5829
+ return [injectHead(htmlStart, head), html ?? "", htmlEnd].join("");
5710
5830
  };
5711
5831
 
5712
5832
  const app = new Hono({ strict: false });
@@ -5731,7 +5851,7 @@ export const createApp = async () => {
5731
5851
  },
5732
5852
  () => renderToStream(url, ssrOptions(), stream as never),
5733
5853
  );
5734
- await stream.write(htmlStart.replace("<!--app-head-->", head));
5854
+ await stream.write(injectHead(htmlStart, head));
5735
5855
  await stream.pipe(html);
5736
5856
  await stream.write(htmlEnd);
5737
5857
  });
@@ -5970,14 +6090,14 @@ if (isMain) {
5970
6090
  process.exit(1);
5971
6091
  }
5972
6092
  }
5973
- `,or=`string`,sr=g((e,r)=>{let{generators:i=[],refineTypeName:a,...o}=e.config,{createPath:c,createImportHelpers:l}=y(e),{renderToFile:u}=x({helpers:{...l({origin:`lib`})}});return{async build(e){let t=r?.renderMode?typeof r.renderMode==`string`?()=>r.renderMode:s(r?.renderMode,`string`):()=>or,n={renderMode:JSON.stringify(r?.renderMode||null),pageRoutes:e.flatMap(e=>e.kind===`pageRoute`?[{...e.entry,renderMode:t(e.entry.name)}]:[]).sort(S),apiGenerator:i.some(e=>e.meta.slot===`backend`)};for(let[e,t]of[[`ssr.ts`,ar],[`@ssr/api.ts`,er],[`@ssr/__kosmo_ssr_bundle.ts`,nr],[`@ssr/base.ts`,tr],[`@ssr/fetch.ts`,rr],[`@ssr/routes.ts`,ir]])await u(c.lib(e),t,n)},async postBuild(){let r=c.distDir(`ssr`),a=[C.tsconfigPaths(e),C.nodePrefix()];for(let t of i)await t.factory(e).ssrBuild?.();await E(_(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:c.src(),plugins:a,define:{KOSMO_PRODUCTION_BUILD:`true`},build:{ssr:c.lib(`@ssr/__kosmo_ssr_bundle`),ssrEmitAssets:!0,sourcemap:!0,emptyOutDir:!0,minify:!1,rolldownOptions:{output:{dir:r,entryFileNames:`app.js`,format:`esm`}}}})),await E({root:c.lib(),configFile:!1,appType:`custom`,plugins:a,resolve:{conditions:[`node`]},build:{ssr:c.lib(`ssr.ts`),target:`esnext`,sourcemap:!0,emptyOutDir:!0,rolldownOptions:{output:{dir:t(r,`server`),entryFileNames:`server.js`,format:`esm`}}}}),await O(n(r,`../client`),r,{recursive:!0});for(let e of[`server.js`,`server.js.map`])await O(`${r}/server/${e}`,`${r}/${e}`);await k(`${r}/server`,{recursive:!0,force:!0})}}}),cr=h({meta:{name:`SSR`,slot:`ssr`},dependencies:{tinyglobby:q.devDependencies.tinyglobby,hono:q.devDependencies.hono,"@hono/node-server":q.devDependencies[`@hono/node-server`],"light-my-request":q.devDependencies[`light-my-request`]},factory:sr}),J={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.3.0`,vite:`^8.2.2`},devDependencies:{"@tanstack/svelte-query":`^6.1.41`,"path-to-regexp":`^8.4.2`,svelte:`^5.56.10`}},lr=()=>{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)]},Y=`<script lang="ts">
6093
+ `,ir=`string`,ar=g((e,r)=>{let{generators:i=[],refineTypeName:a,...o}=e.config,{createPath:c,createImportHelpers:l}=y(e),{renderToFile:u}=x({helpers:{...l({origin:`lib`})}});return{async build(e){let t=r?.renderMode?typeof r.renderMode==`string`?()=>r.renderMode:s(r?.renderMode,`string`):()=>ir,n={renderMode:JSON.stringify(r?.renderMode||null),pageRoutes:e.flatMap(e=>e.kind===`pageRoute`?[{...e.entry,renderMode:t(e.entry.name)}]:[]).sort(S),apiGenerator:i.some(e=>e.meta.slot===`backend`)};for(let[e,t]of[[`ssr.ts`,rr],[`@ssr/api.ts`,Qn],[`@ssr/__kosmo_ssr_bundle.ts`,er],[`@ssr/base.ts`,$n],[`@ssr/fetch.ts`,tr],[`@ssr/routes.ts`,nr]])await u(c.lib(e),t,n)},async postBuild(){if(!i.some(e=>e.meta.slot===`frontend`))return;let r=c.distDir(`ssr`),a=[C.tsconfigPaths(e),C.nodePrefix()];for(let t of i)await t.factory(e).ssrBuild?.();await E(_(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:c.src(),plugins:a,define:{KOSMO_PRODUCTION_BUILD:`true`},build:{ssr:c.lib(`@ssr/__kosmo_ssr_bundle`),ssrEmitAssets:!0,sourcemap:!0,emptyOutDir:!0,minify:!1,rolldownOptions:{output:{dir:r,entryFileNames:`app.js`,format:`esm`}}}})),await E({root:c.lib(),configFile:!1,appType:`custom`,plugins:a,resolve:{conditions:[`node`]},build:{ssr:c.lib(`ssr.ts`),target:`esnext`,sourcemap:!0,emptyOutDir:!0,rolldownOptions:{output:{dir:t(r,`server`),entryFileNames:`server.js`,format:`esm`}}}}),await O(n(r,`../client`),r,{recursive:!0});for(let e of[`server.js`,`server.js.map`])await O(`${r}/server/${e}`,`${r}/${e}`);await k(`${r}/server`,{recursive:!0,force:!0})}}}),or=h({meta:{name:`SSR`,slot:`ssr`},dependencies:{tinyglobby:q.devDependencies.tinyglobby,hono:q.devDependencies.hono,"@hono/node-server":q.devDependencies[`@hono/node-server`],"light-my-request":q.devDependencies[`light-my-request`]},factory:ar}),J={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.3.0`,vite:`^8.2.2`},devDependencies:{"@tanstack/svelte-query":`^6.1.41`,"path-to-regexp":`^8.4.2`,svelte:`^5.56.10`}},sr=()=>{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)]},Y=`<script lang="ts">
5974
6094
  import type { Snippet } from "svelte";
5975
6095
 
5976
6096
  let { children }: { children: Snippet } = $props();
5977
6097
  <\/script>
5978
6098
 
5979
6099
  {@render children()}
5980
- `,ur=`<script lang="ts">
6100
+ `,cr=`<script lang="ts">
5981
6101
  import { type QueryClient, QueryClientProvider } from "@tanstack/svelte-query";
5982
6102
  import type { Snippet } from "svelte";
5983
6103
 
@@ -5994,7 +6114,7 @@ if (isMain) {
5994
6114
  <QueryClientProvider client={queryClient}>
5995
6115
  {@render children()}
5996
6116
  </QueryClientProvider>
5997
- `,dr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
6117
+ `,lr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
5998
6118
  import type { RouterFactoryReturn } from "@kosmojs/core";
5999
6119
  import { clientRenderFactory } from "@kosmojs/core/generators";
6000
6120
 
@@ -6035,7 +6155,7 @@ export const mount = async (
6035
6155
  }
6036
6156
 
6037
6157
  export default clientRenderFactory();
6038
- `,fr=`import { render as renderOrig } from "svelte/server";
6158
+ `,ur=`import { render as renderOrig } from "svelte/server";
6039
6159
 
6040
6160
  import type {
6041
6161
  RenderToStringWrapper,
@@ -6101,12 +6221,12 @@ export const renderToString: RenderToStringWrapper<
6101
6221
  // svelte/server exposes only render() - no web-stream renderer -
6102
6222
  // so this folder is string-only SSR.
6103
6223
  export default serverRenderFactory<false>();
6104
- `,pr=`declare module "*.svelte" {
6224
+ `,dr=`declare module "*.svelte" {
6105
6225
  import type { Component } from "svelte";
6106
6226
  const component: Component;
6107
6227
  export default component;
6108
6228
  }
6109
- `,mr=`<script lang="ts">
6229
+ `,fr=`<script lang="ts">
6110
6230
  /**
6111
6231
  * Folds [app, ...layouts] around the page component.
6112
6232
  *
@@ -6140,7 +6260,7 @@ export default serverRenderFactory<false>();
6140
6260
  {/snippet}
6141
6261
 
6142
6262
  {@render layer(0)}
6143
- `,hr=`<script lang="ts">
6263
+ `,pr=`<script lang="ts">
6144
6264
  import styles from "./styles.module.css";
6145
6265
 
6146
6266
  let { headline }: { headline?: string } = $props();
@@ -6172,7 +6292,7 @@ export default serverRenderFactory<false>();
6172
6292
  </div>
6173
6293
  </div>
6174
6294
  </div>
6175
- `,gr=`<script lang="ts">
6295
+ `,mr=`<script lang="ts">
6176
6296
  import styles from "./styles.module.css";
6177
6297
 
6178
6298
  let {
@@ -6217,7 +6337,7 @@ export default serverRenderFactory<false>();
6217
6337
  </div>
6218
6338
  </div>
6219
6339
  </div>
6220
- `,_r=`* {
6340
+ `,hr=`* {
6221
6341
  margin: 0;
6222
6342
  padding: 0;
6223
6343
  box-sizing: border-box;
@@ -6352,7 +6472,7 @@ export default serverRenderFactory<false>();
6352
6472
  align-items: center;
6353
6473
  gap: 0.25rem;
6354
6474
  }
6355
- `,vr=`<script lang="ts">
6475
+ `,gr=`<script lang="ts">
6356
6476
  import styles from "./styles.module.css";
6357
6477
  <\/script>
6358
6478
 
@@ -6410,7 +6530,7 @@ export default serverRenderFactory<false>();
6410
6530
  </div>
6411
6531
  </div>
6412
6532
  </div>
6413
- `,yr=`export type ParamsMap = {
6533
+ `,_r=`export type ParamsMap = {
6414
6534
  {{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
6415
6535
  {{/each}}
6416
6536
  };
@@ -6419,7 +6539,7 @@ export const paramNames = {
6419
6539
  {{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
6420
6540
  {{/each}}
6421
6541
  } as const;
6422
- `,br=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6542
+ `,vr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6423
6543
 
6424
6544
  let client: QueryClient | undefined;
6425
6545
 
@@ -6434,7 +6554,7 @@ export const getQueryClient = (): QueryClient => {
6434
6554
  }
6435
6555
  return client;
6436
6556
  };
6437
- `,xr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6557
+ `,yr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6438
6558
 
6439
6559
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
6440
6560
 
@@ -6457,7 +6577,7 @@ export const getQueryClient = (): QueryClient => {
6457
6577
  }
6458
6578
  return ctx.tsqClient as QueryClient;
6459
6579
  };
6460
- `,Sr=`import type { RouterFactoryReturn } from "@kosmojs/core";
6580
+ `,br=`import type { RouterFactoryReturn } from "@kosmojs/core";
6461
6581
  import { createRouterFactory } from "@kosmojs/core/generators";
6462
6582
 
6463
6583
  import Layouts from "./Layouts.svelte";
@@ -6497,7 +6617,7 @@ export default createRouterFactory<
6497
6617
  Promise<RouteComponent>,
6498
6618
  { server: { route: Route } }
6499
6619
  >();
6500
- `,Cr=`import { match, pathToRegexp } from "path-to-regexp";
6620
+ `,xr=`import { match, pathToRegexp } from "path-to-regexp";
6501
6621
  import { type Component, createContext } from "svelte";
6502
6622
 
6503
6623
  import { parseSearchParams } from "@kosmojs/core";
@@ -6724,7 +6844,7 @@ export const createRoute = (
6724
6844
  layouts,
6725
6845
  };
6726
6846
  };
6727
- `,wr=`import { getRouteContext } from "./svelte";
6847
+ `,Sr=`import { getRouteContext } from "./svelte";
6728
6848
 
6729
6849
  import type { ParamsMap, paramNames } from "{{ createImport 'lib' 'params' }}";
6730
6850
 
@@ -6764,7 +6884,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6764
6884
  const route = useRoute();
6765
6885
  return route.loaderData?.[key || route.name] as T;
6766
6886
  };
6767
- `,Tr=`<script lang="ts">
6887
+ `,Cr=`<script lang="ts">
6768
6888
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
6769
6889
  import type { Snippet } from "svelte";
6770
6890
 
@@ -6774,7 +6894,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6774
6894
  <AppProvider>
6775
6895
  {@render children()}
6776
6896
  </AppProvider>
6777
- `,Er=`<script lang="ts">
6897
+ `,wr=`<script lang="ts">
6778
6898
  import type { Snippet } from "svelte";
6779
6899
  import type { HTMLAnchorAttributes } from "svelte/elements";
6780
6900
 
@@ -6798,7 +6918,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6798
6918
  <\/script>
6799
6919
 
6800
6920
  <a {href} {...rest}>{@render children?.()}</a>
6801
- `,Dr=`import renderFactory, {
6921
+ `,Tr=`import renderFactory, {
6802
6922
  createRoutes,
6803
6923
  hydrate,
6804
6924
  mount,
@@ -6825,7 +6945,7 @@ if (root) {
6825
6945
  } else {
6826
6946
  console.error("❌ Root element not found!");
6827
6947
  }
6828
- `,Or=`import renderFactory, {
6948
+ `,Er=`import renderFactory, {
6829
6949
  createRoutes,
6830
6950
  renderToString,
6831
6951
  // no renderToStream on Svelte folders
@@ -6846,31 +6966,19 @@ export default renderFactory(() => {
6846
6966
  },
6847
6967
  };
6848
6968
  });
6849
- `,kr=`<!doctype html>
6850
- <html lang="en">
6851
- <head>
6852
- <meta charset="UTF-8" />
6853
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6854
- <!--app-head-->
6855
- </head>
6856
- <body>
6857
- <div id="app"><!--app-html--></div>
6858
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
6859
- </body>
6860
- </html>
6861
- `,Ar=`<script lang="ts">
6969
+ `,Dr=`<script lang="ts">
6862
6970
  import PageSample from "{{ createImport 'lib' 'pageSamples/404.svelte' }}";
6863
6971
  <\/script>
6864
6972
 
6865
6973
  <PageSample />
6866
- `,jr=`<script lang="ts">
6974
+ `,Or=`<script lang="ts">
6867
6975
  import type { Snippet } from "svelte";
6868
6976
 
6869
6977
  let { children }: { children: Snippet } = $props();
6870
6978
  <\/script>
6871
6979
 
6872
6980
  {@render children()}
6873
- `,Mr=`<script lang="ts">
6981
+ `,kr=`<script lang="ts">
6874
6982
  import PageSample from "{{ createImport 'lib' 'pageSamples/page.svelte' }}";
6875
6983
 
6876
6984
  const pathMap = {
@@ -6889,7 +6997,7 @@ export default renderFactory(() => {
6889
6997
  routeName={"{{route.name}}"}
6890
6998
  {pathMap}
6891
6999
  />
6892
- `,Nr=`<script lang="ts">
7000
+ `,Ar=`<script lang="ts">
6893
7001
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.svelte' }}";
6894
7002
  <\/script>
6895
7003
 
@@ -6902,7 +7010,7 @@ export default renderFactory(() => {
6902
7010
  </svelte:head>
6903
7011
 
6904
7012
  <WelcomePage />
6905
- `,Pr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
7013
+ `,jr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
6906
7014
 
6907
7015
  import app from "./app.svelte";
6908
7016
 
@@ -6917,7 +7025,7 @@ export default routerFactory((routes) => {
6917
7025
  },
6918
7026
  };
6919
7027
  });
6920
- `,Fr=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,Mr),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?Nr:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:lr()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),jr,{route:r},{overwrite:o})},d=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),r=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(S)}]}return[]}).sort(S);for(let[e,a]of[[`client.ts`,dr],[`server.ts`,fr]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,yr],[`router.ts`,Sr]])await i(n.lib(e),t,{pageRoutes:r})};return{config(){let{templates:e,...n}={...t};return{plugins:fe(n)}},async start(){for(let[e,r]of[[`env.d.ts`,pr],[`svelte.ts`,Cr],[`Layouts.svelte`,mr],[`use.ts`,wr],[`pageSamples/styles.module.css`,_r],[`pageSamples/welcome.svelte`,vr],[`pageSamples/page.svelte`,gr],[`pageSamples/404.svelte`,hr],...t?.tanstack?.query?[[`app/app.svelte`,Y],[`app/app-tsq.svelte`,ur],[`app/index.ts`,`export { default as AppProvider } from "./app-tsq.svelte";`],[`query.ts`,br]]:[[`app/app.svelte`,Y],[`app/app-tsq.svelte`,`/** tanstack query disabled */`],[`app/index.ts`,`export { default as AppProvider } from "./app.svelte";`],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.svelte`,Ar],[`components/Link.svelte`,Er],[`app.svelte`,Tr],[`router.ts`,Pr]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});await a(n.src(`index.html`),kr,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,Dr],[`server.ts`,Or]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){await u(e.filter(m(t,[`create`]))),await d(e)},async build(e){await u(e),await d(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?xr:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Ir=h({meta:{name:`Svelte`},dependencies(e){return{svelte:J.devDependencies.svelte,"path-to-regexp":J.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/svelte-query":J.devDependencies[`@tanstack/svelte-query`]}:{}}},factory:Fr}),Lr={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.18`}},Rr=`import Type from "typebox";
7028
+ `,Mr=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,kr),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?Ar:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:sr()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),Or,{route:r},{overwrite:o})},d=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),r=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(S)}]}return[]}).sort(S);for(let[e,a]of[[`client.ts`,lr],[`server.ts`,ur]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,_r],[`router.ts`,br]])await i(n.lib(e),t,{pageRoutes:r})};return{config(){let{templates:e,...n}={...t};return{plugins:pe(n)}},async start(){for(let[e,r]of[[`env.d.ts`,dr],[`svelte.ts`,xr],[`Layouts.svelte`,fr],[`use.ts`,Sr],[`pageSamples/styles.module.css`,hr],[`pageSamples/welcome.svelte`,gr],[`pageSamples/page.svelte`,mr],[`pageSamples/404.svelte`,pr],...t?.tanstack?.query?[[`app/app.svelte`,Y],[`app/app-tsq.svelte`,cr],[`app/index.ts`,`export { default as AppProvider } from "./app-tsq.svelte";`],[`query.ts`,vr]]:[[`app/app.svelte`,Y],[`app/app-tsq.svelte`,`/** tanstack query disabled */`],[`app/index.ts`,`export { default as AppProvider } from "./app.svelte";`],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.svelte`,Dr],[`components/Link.svelte`,wr],[`app.svelte`,Cr],[`router.ts`,jr]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});for(let[e,t]of[[`client.ts`,Tr],[`server.ts`,Er]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){await u(e.filter(m(t,[`create`]))),await d(e)},async build(e){await u(e),await d(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?yr:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Nr=h({meta:{name:`Svelte`,slot:`frontend`},dependencies(e){return{svelte:J.devDependencies.svelte,"path-to-regexp":J.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/svelte-query":J.devDependencies[`@tanstack/svelte-query`]}:{}}},factory:Mr}),Pr={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.18`}},Fr=`import Type from "typebox";
6921
7029
 
6922
7030
  /**
6923
7031
  * Custom types for JavaScript constructs that have no JSON Schema
@@ -6989,13 +7097,13 @@ export default {
6989
7097
  Buffer: TBuffer(),
6990
7098
  ArrayBuffer: TArrayBuffer(),
6991
7099
  };
6992
- `,zr=`import type { TValidationError } from "typebox/error";
7100
+ `,Ir=`import type { TValidationError } from "typebox/error";
6993
7101
 
6994
7102
  import type { ValidationErrorEntry } from "@kosmojs/core";
6995
7103
 
6996
7104
  /**
6997
7105
  * Message codes for i18n/l10n support
6998
- */
7106
+ * */
6999
7107
  export const MESSAGE_CODES = {
7000
7108
  // Generic messages
7001
7109
 
@@ -7185,7 +7293,7 @@ export type ValidationMessages = typeof MESSAGE_CODES;
7185
7293
  *
7186
7294
  * Usage: format(ERROR_MESSAGES[ErrorCode.STRING_MIN_LENGTH], 5)
7187
7295
  * Result: "must be at least 5 characters long"
7188
- */
7296
+ * */
7189
7297
  const MESSAGE_MAP: Record<keyof ValidationMessages, string> = {
7190
7298
  // Generic messages
7191
7299
 
@@ -7305,7 +7413,7 @@ const MESSAGE_MAP: Record<keyof ValidationMessages, string> = {
7305
7413
  * Comprehensive error handler for TypeBox validation errors.
7306
7414
  * Supports most JSON Schema validation keywords and produces human-friendly messages
7307
7415
  * with i18n/l10n support through message code mapping.
7308
- */
7416
+ * */
7309
7417
  export const errorHandlerFactory = (
7310
7418
  customMessages?: Partial<Record<keyof ValidationMessages, string>>,
7311
7419
  ) => {
@@ -7313,7 +7421,7 @@ export const errorHandlerFactory = (
7313
7421
 
7314
7422
  /**
7315
7423
  * Formats the instancePath into a human-readable field name
7316
- */
7424
+ * */
7317
7425
  function formatFieldPath(instancePath: string, schemaPath?: string): string {
7318
7426
  if (!instancePath?.trim?.()) {
7319
7427
  return "root";
@@ -7351,7 +7459,7 @@ export const errorHandlerFactory = (
7351
7459
 
7352
7460
  /**
7353
7461
  * Pluralizes a word based on count
7354
- */
7462
+ * */
7355
7463
  function pluralize(
7356
7464
  count: number,
7357
7465
  plural: string = messageMap[MESSAGE_CODES.PLURAL_SUFFIX],
@@ -7361,7 +7469,7 @@ export const errorHandlerFactory = (
7361
7469
 
7362
7470
  /**
7363
7471
  * Maps validation error to error code and formats message
7364
- */
7472
+ * */
7365
7473
  function getErrorCodeAndMessage(error: TValidationError): {
7366
7474
  code: keyof ValidationMessages;
7367
7475
  message: string;
@@ -7781,7 +7889,7 @@ export const errorHandlerFactory = (
7781
7889
  * TODO: Periodically check the TypeBox repository for implementation updates.
7782
7890
  * Some validation cases (minContains, prefixItems, etc.) are not yet
7783
7891
  * implemented by TypeBox, so they are commented out below.
7784
- */
7892
+ * */
7785
7893
 
7786
7894
  /**
7787
7895
  case "minContains": {
@@ -7935,7 +8043,7 @@ export const errorHandlerFactory = (
7935
8043
  ),
7936
8044
  };
7937
8045
  }
7938
- */
8046
+ * */
7939
8047
 
7940
8048
  // Default fallback
7941
8049
  default: {
@@ -7946,7 +8054,7 @@ export const errorHandlerFactory = (
7946
8054
 
7947
8055
  /**
7948
8056
  * Groups errors by field to avoid duplicate messages
7949
- */
8057
+ * */
7950
8058
  function groupErrorsByField(
7951
8059
  errors: TValidationError[],
7952
8060
  ): Map<string, TValidationError[]> {
@@ -7965,7 +8073,7 @@ export const errorHandlerFactory = (
7965
8073
 
7966
8074
  /**
7967
8075
  * Prioritizes errors to show the most important one per field
7968
- */
8076
+ * */
7969
8077
  function prioritizeErrors(errors: TValidationError[]): TValidationError {
7970
8078
  // Priority order: required > type > format > const/enum > other constraints
7971
8079
  const priority: Record<string, number> = {
@@ -7994,13 +8102,51 @@ export const errorHandlerFactory = (
7994
8102
  })[0];
7995
8103
  }
7996
8104
 
8105
+ /**
8106
+ * A failed union of literals arrives as one \`anyOf\` error plus one \`const\` error per branch,
8107
+ * all at the same instancePath.
8108
+ * Collapse them into a single synthetic \`enum\` error so the message reflects the whole union.
8109
+ * */
8110
+ function collapseLiteralUnion(
8111
+ fieldErrors: TValidationError[],
8112
+ ): TValidationError[] {
8113
+ const anyOfError = fieldErrors.find((e) => e.keyword === "anyOf");
8114
+ if (!anyOfError) {
8115
+ return fieldErrors;
8116
+ }
8117
+ const branchConsts = fieldErrors.filter((e) => {
8118
+ return e.keyword === "const"
8119
+ ? e.schemaPath.startsWith(\`\${anyOfError.schemaPath}/anyOf/\`)
8120
+ : false;
8121
+ });
8122
+ // bail unless EVERY sibling is a const branch of this anyOf -
8123
+ // mixed unions (literal | object) keep their current behavior
8124
+ if (
8125
+ !branchConsts.length ||
8126
+ fieldErrors.length !== branchConsts.length + 1
8127
+ ) {
8128
+ return fieldErrors;
8129
+ }
8130
+ return [
8131
+ {
8132
+ ...anyOfError,
8133
+ keyword: "enum",
8134
+ params: {
8135
+ allowedValues: branchConsts.map(
8136
+ (e) => (e.params as never)["allowedValue"],
8137
+ ),
8138
+ },
8139
+ },
8140
+ ];
8141
+ }
8142
+
7997
8143
  // ============================================================================
7998
8144
  // Public API
7999
8145
  // ============================================================================
8000
8146
 
8001
8147
  /**
8002
8148
  * Main function to format validation errors
8003
- */
8149
+ * */
8004
8150
  function formatValidationErrors(
8005
8151
  errors: TValidationError[],
8006
8152
  options: {
@@ -8035,7 +8181,7 @@ export const errorHandlerFactory = (
8035
8181
  const formatted: ValidationErrorEntry[] = [];
8036
8182
 
8037
8183
  for (const [_, fieldErrors] of grouped) {
8038
- const prioritized = prioritizeErrors(fieldErrors);
8184
+ const prioritized = prioritizeErrors(collapseLiteralUnion(fieldErrors));
8039
8185
  const { code, message } = getErrorCodeAndMessage(prioritized);
8040
8186
  formatted.push({
8041
8187
  keyword: prioritized.keyword,
@@ -8067,7 +8213,7 @@ export const errorHandlerFactory = (
8067
8213
 
8068
8214
  /**
8069
8215
  * Formats errors into a single human-readable message
8070
- */
8216
+ * */
8071
8217
  function formatValidationErrorMessage(
8072
8218
  errors: TValidationError[],
8073
8219
  options: {
@@ -8096,7 +8242,7 @@ export const errorHandlerFactory = (
8096
8242
 
8097
8243
  /**
8098
8244
  * Gets a simple error summary for quick feedback
8099
- */
8245
+ * */
8100
8246
  function getErrorSummary(errors: TValidationError[]): string {
8101
8247
  if (!errors?.length) {
8102
8248
  return messageMap[MESSAGE_CODES.VALIDATION_PASSED];
@@ -8173,7 +8319,7 @@ const format = (fmt: string, ...args: unknown[]): string => {
8173
8319
 
8174
8320
  return str;
8175
8321
  };
8176
- `,Br=`import Type from "typebox";
8322
+ `,Lr=`import Type from "typebox";
8177
8323
  import { Compile } from "typebox/compile";
8178
8324
  import Value from "typebox/value";
8179
8325
 
@@ -8225,14 +8371,14 @@ export const validationSchemaFactory = (
8225
8371
  },
8226
8372
  };
8227
8373
  };
8228
- `,Vr=`import { Settings } from "typebox/system";
8374
+ `,Rr=`import { Settings } from "typebox/system";
8229
8375
 
8230
8376
  Settings.Set({{settings}});
8231
8377
 
8232
8378
  export { default as customTypes } from "{{customTypesImport}}";
8233
8379
 
8234
8380
  export const validationMessages = {{validationMessages}};
8235
- `,Hr=`import type { ValidationSchemas } from "@kosmojs/core";
8381
+ `,zr=`import type { ValidationSchemas } from "@kosmojs/core";
8236
8382
 
8237
8383
  import { validationSchemaFactory } from "{{ createImport 'lib' '@typebox' }}";
8238
8384
 
@@ -8293,14 +8439,14 @@ export const validationSchemas: ValidationSchemas = {
8293
8439
  {{/each}}
8294
8440
  },
8295
8441
  };
8296
- `,Ur={exactOptionalPropertyTypes:!0},Wr=g((e,t)=>{let{createPath:n,createImport:r,createImportHelpers:i}=y(e),{renderToFile:a}=x({helpers:{...i({origin:`lib`})}}),{validationMessages:s={},customTypesImport:c=r.lib([`@typebox/custom-types`],{origin:`lib`}),settings:l}={...t},u=async e=>{for(let{kind:t,entry:r}of e){if(t!==`apiRoute`)continue;let e=[r.params,...r.validationDefinitions.flatMap(e=>e.target===`response`?e.variants:[e.schema])].flatMap(({resolvedType:e})=>e?[e]:[]),i=[...new Set(r.validationDefinitions.flatMap(({target:e})=>Object.keys(o).includes(e)?[e]:[]))].map(e=>({target:e,methods:r.methods.flatMap(t=>{let n=r.validationDefinitions.find(n=>n.method===t&&n.target===e);return n?[{route:r.name,method:t,target:e,schema:n.schema,...n.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(n.runtimeValidation)},...n.customErrors===void 0?{}:{customErrors:JSON.stringify(n.customErrors)}}]:[]})})),s=r.methods.flatMap(e=>{let t=r.validationDefinitions.find(t=>t.method===e&&t.target===`response`);return t?[{method:e,variants:t.variants.map(e=>({route:r.name,target:`response`,...e,...t.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(t.runtimeValidation)},...t.customErrors===void 0?{}:{customErrors:JSON.stringify(t.customErrors)}}))}]:[]});await a(n.libApi(r.name,`schemas.ts`),Hr,{route:r,resolvedTypes:e,requestSchemas:i,responseSchemas:s})}};return{async start(){for(let[e,t]of[[`custom-types.ts`,Rr],[`error-handler.ts`,zr],[`index.ts`,Br],[`setup.ts`,Vr]])await a(n.lib(`@typebox`,e),t,{validationMessages:JSON.stringify(s),customTypesImport:c,settings:JSON.stringify({...Ur,...l})})},async watch(e,t){await u(e.filter(p(t,[`create`,`update`])))},async build(e){await u(e)}}}),X={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`};X.PROPERTY,X.PROPERTIES,X.ALLOWED_VALUES,X.FOUND_N_DUPLICATES,X.VALIDATION_PASSED,X.VALIDATION_FAILED_PREFIX,X.ERROR_SUMMARY,X.PLURAL_SUFFIX,X.FIRST,X.SECOND,X.THIRD,X.FOURTH,X.FIFTH,X.TYPE_INVALID,X.STRING_MIN_LENGTH,X.STRING_MAX_LENGTH,X.STRING_PATTERN,X.STRING_FORMAT,X.STRING_FORMAT_EMAIL,X.STRING_FORMAT_DATE,X.STRING_FORMAT_DATETIME,X.STRING_FORMAT_TIME,X.STRING_FORMAT_URI,X.STRING_FORMAT_URL,X.STRING_FORMAT_UUID,X.STRING_FORMAT_IPV4,X.STRING_FORMAT_IPV6,X.STRING_FORMAT_HOSTNAME,X.STRING_FORMAT_JSON_POINTER,X.STRING_FORMAT_REGEX,X.NUMBER_MINIMUM,X.NUMBER_MAXIMUM,X.NUMBER_EXCLUSIVE_MINIMUM,X.NUMBER_EXCLUSIVE_MAXIMUM,X.NUMBER_MULTIPLE_OF,X.ARRAY_MIN_ITEMS,X.ARRAY_MAX_ITEMS,X.ARRAY_UNIQUE_ITEMS,X.ARRAY_CONTAINS,X.ARRAY_MIN_CONTAINS,X.ARRAY_MAX_CONTAINS,X.ARRAY_PREFIX_ITEMS,X.ARRAY_ITEMS,X.ARRAY_UNEVALUATED_ITEMS,X.TUPLE_MIN_ITEMS,X.TUPLE_MAX_ITEMS,X.OBJECT_REQUIRED,X.OBJECT_ADDITIONAL_PROPERTIES,X.OBJECT_MIN_PROPERTIES,X.OBJECT_MAX_PROPERTIES,X.OBJECT_PROPERTY_NAMES,X.OBJECT_DEPENDENCIES,X.OBJECT_UNEVALUATED_PROPERTIES,X.ENUM_MISMATCH,X.CONST_MISMATCH,X.CONDITIONAL_IF,X.CONDITIONAL_THEN,X.CONDITIONAL_ELSE,X.COMPOSITION_ONE_OF,X.COMPOSITION_ANY_OF,X.COMPOSITION_ALL_OF,X.COMPOSITION_NOT,X.CONTENT_DISCRIMINATOR,X.CONTENT_ENCODING,X.CONTENT_MEDIA_TYPE,X.CUSTOM_RANGE,X.CUSTOM_EXCLUSIVE_RANGE,X.CUSTOM_REGEXP,X.CUSTOM_DYNAMIC_DEFAULTS,X.CUSTOM_SELECT,X.CUSTOM_TRANSFORM,X.CUSTOM_UNIQUE_ITEM_PROPERTIES,X.UNKNOWN;var Gr=h({meta:{name:`TypeBox`,resolveTypes:!0},dependencies:{typebox:Lr.devDependencies.typebox},factory:Wr}),Z={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.102.2`,"path-to-regexp":`^8.4.2`,vue:`^3.5.41`,"vue-router":`^5.2.0`}},Q=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(`/`)},Kr=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,n=(r,i)=>r.flatMap(({index:r,layout:a,children:o})=>{let{name:s,pathTokens:c}={...r,...a};if(!c)return[];let l=`${s}/layout`,u=i?Q(c):t(`/`,Q(c)),d=c.at(-1);return e(d)?r&&a?[{name:l,path:u,component:a.id,children:[{name:s,path:``,component:r.id}]}]:r?[{path:u,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:a?[{name:l,path:u,component:a.id,children:n(o,s)}]:[]:r&&a?[{name:l,path:u,component:a.id,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:r?[{path:u,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:a?[{name:l,path:u,component:a.id,children:n(o,s)}]:[]});return n},qr=()=>{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)]},Jr=`import type { Plugin } from "vue";
8442
+ `,Br={exactOptionalPropertyTypes:!0},Vr=g((e,t)=>{let{createPath:n,createImport:r,createImportHelpers:i}=y(e),{renderToFile:a}=x({helpers:{...i({origin:`lib`})}}),{validationMessages:s={},customTypesImport:c=r.lib([`@typebox/custom-types`],{origin:`lib`}),settings:l}={...t},u=async e=>{for(let{kind:t,entry:r}of e){if(t!==`apiRoute`)continue;let e=[r.params,...r.validationDefinitions.flatMap(e=>e.target===`response`?e.variants:[e.schema])].flatMap(({resolvedType:e})=>e?[e]:[]),i=[...new Set(r.validationDefinitions.flatMap(({target:e})=>Object.keys(o).includes(e)?[e]:[]))].map(e=>({target:e,methods:r.methods.flatMap(t=>{let n=r.validationDefinitions.find(n=>n.method===t&&n.target===e);return n?[{route:r.name,method:t,target:e,schema:n.schema,...n.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(n.runtimeValidation)},...n.customErrors===void 0?{}:{customErrors:JSON.stringify(n.customErrors)}}]:[]})})),s=r.methods.flatMap(e=>{let t=r.validationDefinitions.find(t=>t.method===e&&t.target===`response`);return t?[{method:e,variants:t.variants.map(e=>({route:r.name,target:`response`,...e,...t.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(t.runtimeValidation)},...t.customErrors===void 0?{}:{customErrors:JSON.stringify(t.customErrors)}}))}]:[]});await a(n.libApi(r.name,`schemas.ts`),zr,{route:r,resolvedTypes:e,requestSchemas:i,responseSchemas:s})}};return{async start(){for(let[e,t]of[[`custom-types.ts`,Fr],[`error-handler.ts`,Ir],[`index.ts`,Lr],[`setup.ts`,Rr]])await a(n.lib(`@typebox`,e),t,{validationMessages:JSON.stringify(s),customTypesImport:c,settings:JSON.stringify({...Br,...l})})},async watch(e,t){await u(e.filter(p(t,[`create`,`update`])))},async build(e){await u(e)}}}),X={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`};X.PROPERTY,X.PROPERTIES,X.ALLOWED_VALUES,X.FOUND_N_DUPLICATES,X.VALIDATION_PASSED,X.VALIDATION_FAILED_PREFIX,X.ERROR_SUMMARY,X.PLURAL_SUFFIX,X.FIRST,X.SECOND,X.THIRD,X.FOURTH,X.FIFTH,X.TYPE_INVALID,X.STRING_MIN_LENGTH,X.STRING_MAX_LENGTH,X.STRING_PATTERN,X.STRING_FORMAT,X.STRING_FORMAT_EMAIL,X.STRING_FORMAT_DATE,X.STRING_FORMAT_DATETIME,X.STRING_FORMAT_TIME,X.STRING_FORMAT_URI,X.STRING_FORMAT_URL,X.STRING_FORMAT_UUID,X.STRING_FORMAT_IPV4,X.STRING_FORMAT_IPV6,X.STRING_FORMAT_HOSTNAME,X.STRING_FORMAT_JSON_POINTER,X.STRING_FORMAT_REGEX,X.NUMBER_MINIMUM,X.NUMBER_MAXIMUM,X.NUMBER_EXCLUSIVE_MINIMUM,X.NUMBER_EXCLUSIVE_MAXIMUM,X.NUMBER_MULTIPLE_OF,X.ARRAY_MIN_ITEMS,X.ARRAY_MAX_ITEMS,X.ARRAY_UNIQUE_ITEMS,X.ARRAY_CONTAINS,X.ARRAY_MIN_CONTAINS,X.ARRAY_MAX_CONTAINS,X.ARRAY_PREFIX_ITEMS,X.ARRAY_ITEMS,X.ARRAY_UNEVALUATED_ITEMS,X.TUPLE_MIN_ITEMS,X.TUPLE_MAX_ITEMS,X.OBJECT_REQUIRED,X.OBJECT_ADDITIONAL_PROPERTIES,X.OBJECT_MIN_PROPERTIES,X.OBJECT_MAX_PROPERTIES,X.OBJECT_PROPERTY_NAMES,X.OBJECT_DEPENDENCIES,X.OBJECT_UNEVALUATED_PROPERTIES,X.ENUM_MISMATCH,X.CONST_MISMATCH,X.CONDITIONAL_IF,X.CONDITIONAL_THEN,X.CONDITIONAL_ELSE,X.COMPOSITION_ONE_OF,X.COMPOSITION_ANY_OF,X.COMPOSITION_ALL_OF,X.COMPOSITION_NOT,X.CONTENT_DISCRIMINATOR,X.CONTENT_ENCODING,X.CONTENT_MEDIA_TYPE,X.CUSTOM_RANGE,X.CUSTOM_EXCLUSIVE_RANGE,X.CUSTOM_REGEXP,X.CUSTOM_DYNAMIC_DEFAULTS,X.CUSTOM_SELECT,X.CUSTOM_TRANSFORM,X.CUSTOM_UNIQUE_ITEM_PROPERTIES,X.UNKNOWN;var Hr=h({meta:{name:`TypeBox`,resolveTypes:!0},dependencies:{typebox:Pr.devDependencies.typebox},factory:Vr}),Z={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.102.2`,"path-to-regexp":`^8.4.2`,vue:`^3.5.41`,"vue-router":`^5.2.0`}},Q=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(`/`)},Ur=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,n=(r,i)=>r.flatMap(({index:r,layout:a,children:o})=>{let{name:s,pathTokens:c}={...r,...a};if(!c)return[];let l=`${s}/layout`,u=i?Q(c):t(`/`,Q(c)),d=c.at(-1);return e(d)?r&&a?[{name:l,path:u,component:a.id,children:[{name:s,path:``,component:r.id}]}]:r?[{path:u,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:a?[{name:l,path:u,component:a.id,children:n(o,s)}]:[]:r&&a?[{name:l,path:u,component:a.id,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:r?[{path:u,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:a?[{name:l,path:u,component:a.id,children:n(o,s)}]:[]});return n},Wr=()=>{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)]},Gr=`import type { Plugin } from "vue";
8297
8443
 
8298
8444
  export { default as AppProvider } from "./provider.vue";
8299
8445
 
8300
8446
  export const appProvider: Plugin = {
8301
8447
  install() {},
8302
8448
  };
8303
- `,Yr=`import { VueQueryPlugin } from "@tanstack/vue-query";
8449
+ `,Kr=`import { VueQueryPlugin } from "@tanstack/vue-query";
8304
8450
  import type { Plugin } from "vue";
8305
8451
 
8306
8452
  import { getQueryClient } from "../query";
@@ -8312,10 +8458,10 @@ export const appProvider: Plugin = {
8312
8458
  app.use(VueQueryPlugin, { queryClient: getQueryClient() });
8313
8459
  },
8314
8460
  };
8315
- `,Xr=`<template>
8461
+ `,$=`<template>
8316
8462
  <slot />
8317
8463
  </template>
8318
- `,Zr=`import type { App } from "vue";
8464
+ `,qr=`import type { App } from "vue";
8319
8465
  import type { RouterFactoryReturn } from "@kosmojs/core";
8320
8466
  import { clientRenderFactory } from "@kosmojs/core/generators";
8321
8467
 
@@ -8355,7 +8501,7 @@ export const mount = async (
8355
8501
  }
8356
8502
 
8357
8503
  export default clientRenderFactory();
8358
- `,Qr=`{
8504
+ `,Jr=`{
8359
8505
  path: "{{path}}",
8360
8506
  {{#if name}}
8361
8507
  name: "{{name}}",
@@ -8373,7 +8519,7 @@ export default clientRenderFactory();
8373
8519
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
8374
8520
  {{/if}}
8375
8521
  }
8376
- `,$r=`import type { App } from "vue";
8522
+ `,Yr=`import type { App } from "vue";
8377
8523
 
8378
8524
  import {
8379
8525
  renderToString as renderToStringOrig,
@@ -8464,12 +8610,12 @@ export const renderToStream: RenderToStreamWrapper<
8464
8610
  }
8465
8611
 
8466
8612
  export default serverRenderFactory();
8467
- `,$=`declare module "*.vue" {
8613
+ `,Xr=`declare module "*.vue" {
8468
8614
  import type { DefineComponent } from "vue";
8469
8615
  const component: DefineComponent<{}, {}, any>;
8470
8616
  export default component;
8471
8617
  }
8472
- `,ei=`<script setup lang="ts">
8618
+ `,Zr=`<script setup lang="ts">
8473
8619
  import styles from "./styles.module.css";
8474
8620
  defineProps<{
8475
8621
  headline?: string;
@@ -8508,7 +8654,7 @@ defineProps<{
8508
8654
  </div>
8509
8655
  </div>
8510
8656
  </template>
8511
- `,ti=`<script setup lang="ts">
8657
+ `,Qr=`<script setup lang="ts">
8512
8658
  import styles from "./styles.module.css";
8513
8659
  defineProps<{
8514
8660
  message: string;
@@ -8557,7 +8703,7 @@ defineProps<{
8557
8703
  </div>
8558
8704
  </div>
8559
8705
  </template>
8560
- `,ni=`* {
8706
+ `,$r=`* {
8561
8707
  margin: 0;
8562
8708
  padding: 0;
8563
8709
  box-sizing: border-box;
@@ -8690,7 +8836,7 @@ defineProps<{
8690
8836
  align-items: center;
8691
8837
  gap: 0.25rem;
8692
8838
  }
8693
- `,ri=`<script setup lang="ts">
8839
+ `,ei=`<script setup lang="ts">
8694
8840
  import styles from "./styles.module.css";
8695
8841
  <\/script>
8696
8842
 
@@ -8754,7 +8900,7 @@ import styles from "./styles.module.css";
8754
8900
  </div>
8755
8901
  </div>
8756
8902
  </template>
8757
- `,ii=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8903
+ `,ti=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8758
8904
 
8759
8905
  let client: QueryClient | undefined;
8760
8906
 
@@ -8769,7 +8915,7 @@ export const getQueryClient = (): QueryClient => {
8769
8915
  }
8770
8916
  return client;
8771
8917
  };
8772
- `,ai=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8918
+ `,ni=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8773
8919
 
8774
8920
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
8775
8921
 
@@ -8792,7 +8938,7 @@ export const getQueryClient = (): QueryClient => {
8792
8938
  }
8793
8939
  return ctx.tsqClient as QueryClient;
8794
8940
  };
8795
- `,oi=`import {
8941
+ `,ri=`import {
8796
8942
  type App,
8797
8943
  type Component,
8798
8944
  createApp,
@@ -8923,7 +9069,7 @@ export const createRouters = (
8923
9069
 
8924
9070
  let { pathname } = url;
8925
9071
 
8926
- if (base !== "/") {
9072
+ if ((base as string) !== "/") {
8927
9073
  // strip the base from pushed paths
8928
9074
  if (pathname === base) {
8929
9075
  pathname = "/";
@@ -8954,14 +9100,14 @@ export default createRouterFactory<
8954
9100
  Promise<App>,
8955
9101
  { server: { loaderData: Record<string, unknown> } }
8956
9102
  >();
8957
- `,si=`import { type Ref, unref } from "vue";
9103
+ `,ii=`import { type Ref, unref } from "vue";
8958
9104
 
8959
9105
  export type MaybeWrapped<T> = Ref<T> | T;
8960
9106
 
8961
9107
  export function unwrap<T>(value: MaybeWrapped<T>): T {
8962
9108
  return unref(value);
8963
9109
  }
8964
- `,ci=`import { useRoute, useRouter } from "vue-router";
9110
+ `,ai=`import { useRoute, useRouter } from "vue-router";
8965
9111
 
8966
9112
  import type { RouterWithLoaderData } from "./router";
8967
9113
 
@@ -8976,7 +9122,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
8976
9122
  const route = useRoute();
8977
9123
  return router.__loaderData?.[key || (route.name as string)] as T;
8978
9124
  };
8979
- `,li=`<script setup lang="ts">
9125
+ `,oi=`<script setup lang="ts">
8980
9126
  import { AppProvider } from "_/app";
8981
9127
  <\/script>
8982
9128
 
@@ -8985,7 +9131,7 @@ import { AppProvider } from "_/app";
8985
9131
  <RouterView />
8986
9132
  </AppProvider>
8987
9133
  </template>
8988
- `,ui=`<script setup lang="ts" generic="T extends LinkProps">
9134
+ `,si=`<script setup lang="ts" generic="T extends LinkProps">
8989
9135
  import { computed } from "vue";
8990
9136
  import { RouterLink } from "vue-router";
8991
9137
 
@@ -9018,7 +9164,7 @@ const linkProps = computed(() => ({
9018
9164
  <slot />
9019
9165
  </RouterLink>
9020
9166
  </template>
9021
- `,di=`import renderFactory, {
9167
+ `,ci=`import renderFactory, {
9022
9168
  createRoutes,
9023
9169
  hydrate,
9024
9170
  mount,
@@ -9045,7 +9191,7 @@ if (root) {
9045
9191
  } else {
9046
9192
  console.error("❌ Root element not found!");
9047
9193
  }
9048
- `,fi=`import renderFactory, {
9194
+ `,li=`import renderFactory, {
9049
9195
  createRoutes,
9050
9196
  renderToStream,
9051
9197
  renderToString,
@@ -9072,29 +9218,17 @@ export default renderFactory(() => {
9072
9218
  },
9073
9219
  };
9074
9220
  });
9075
- `,pi=`<!doctype html>
9076
- <html lang="en">
9077
- <head>
9078
- <meta charset="UTF-8" />
9079
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9080
- <!--app-head-->
9081
- </head>
9082
- <body>
9083
- <div id="app"><!--app-html--></div>
9084
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
9085
- </body>
9086
- </html>
9087
- `,mi=`<script setup lang="ts">
9221
+ `,ui=`<script setup lang="ts">
9088
9222
  import PageSample from "{{ createImport 'lib' 'pageSamples/404.vue' }}";
9089
9223
  <\/script>
9090
9224
 
9091
9225
  <template>
9092
9226
  <PageSample />
9093
9227
  </template>
9094
- `,hi=`<template>
9228
+ `,di=`<template>
9095
9229
  <router-view />
9096
9230
  </template>
9097
- `,gi=`<script setup lang="ts">
9231
+ `,fi=`<script setup lang="ts">
9098
9232
  import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
9099
9233
  <\/script>
9100
9234
 
@@ -9109,14 +9243,14 @@ import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
9109
9243
  }"
9110
9244
  />
9111
9245
  </template>
9112
- `,_i=`<script setup lang="ts">
9246
+ `,pi=`<script setup lang="ts">
9113
9247
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.vue' }}";
9114
9248
  <\/script>
9115
9249
 
9116
9250
  <template>
9117
9251
  <WelcomePage />
9118
9252
  </template>
9119
- `,vi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
9253
+ `,mi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
9120
9254
  import { appProvider } from "{{ createImport 'lib' 'app' }}";
9121
9255
 
9122
9256
  import app from "./app.vue";
@@ -9135,5 +9269,5 @@ export default routerFactory((routes) => {
9135
9269
  },
9136
9270
  };
9137
9271
  });
9138
- `,yi=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()},partials:{routePartial:Qr}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=Kr(),s=e=>!e?.trim().length,u=c(t?.templates,gi),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?_i:u(r.name,r),{route:r,message:qr()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),hi,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(v(r));for(let[e,t]of[[`client.ts`,Zr],[`server.ts`,$r]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a,lazyLoad:e===`client.ts`});await i(n.lib(`router.ts`),oi,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[pe(n)]}},async start(){for(let[e,r]of[[`env.d.ts`,$],[`unwrap.ts`,si],[`use.ts`,ci],[`pageSamples/styles.module.css`,ni],[`pageSamples/welcome.vue`,ri],[`pageSamples/page.vue`,ti],[`pageSamples/404.vue`,ei],[`app/provider.vue`,Xr],...t?.tanstack?.query?[[`app/index.ts`,Yr],[`query.ts`,ii]]:[[`app/index.ts`,Jr],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.vue`,mi],[`components/Link.vue`,ui],[`app.vue`,li],[`router.ts`,vi]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});await a(n.src(`index.html`),pi,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,di],[`server.ts`,fi]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){await d(e.filter(m(t,[`create`]))),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?ai:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),bi=h({meta:{name:`Vue`,jsxImportSource:`vue`},dependencies(e){return{vue:Z.devDependencies.vue,"vue-router":Z.devDependencies[`vue-router`],"path-to-regexp":Z.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/vue-query":Z.devDependencies[`@tanstack/vue-query`]}:{}}},factory:yi}),xi=e=>{let n=process.env.NODE_ENV||`development`,a=typeof e.base==`string`?e.base:e.base[n];if(!a?.trim())throw Error(r([`red`],`ERROR: Invalid Config - no base provided`));return{...e,base:t(`/`,a),apiBase:t(`/`,e.apiBase||i)}};export{e as coreGenerator,xi as defineConfig,I as fetchGenerator,ke as h3Generator,Je as honoGenerator,pt as koaGenerator,Ht as mdxGenerator,qt as openapiGenerator,Sn as reactGenerator,Xn as solidGenerator,$n as ssgGenerator,cr as ssrGenerator,Ir as svelteGenerator,Gr as typeboxGenerator,bi as vueGenerator};
9272
+ `,hi=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()},partials:{routePartial:Jr}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=Ur(),s=e=>!e?.trim().length,u=c(t?.templates,fi),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?pi:u(r.name,r),{route:r,message:Wr()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),di,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(v(r));for(let[e,t]of[[`client.ts`,qr],[`server.ts`,Yr]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a,lazyLoad:e===`client.ts`});await i(n.lib(`router.ts`),ri,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[A(n)]}},async start(){for(let[e,r]of[[`env.d.ts`,Xr],[`unwrap.ts`,ii],[`use.ts`,ai],[`pageSamples/styles.module.css`,$r],[`pageSamples/welcome.vue`,ei],[`pageSamples/page.vue`,Qr],[`pageSamples/404.vue`,Zr],[`app/provider.vue`,$],...t?.tanstack?.query?[[`app/index.ts`,Kr],[`query.ts`,ti]]:[[`app/index.ts`,Gr],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.vue`,ui],[`components/Link.vue`,si],[`app.vue`,oi],[`router.ts`,mi]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});for(let[e,t]of[[`client.ts`,ci],[`server.ts`,li]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){await d(e.filter(m(t,[`create`]))),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?ni:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),gi=h({meta:{name:`Vue`,slot:`frontend`,jsxImportSource:`vue`},dependencies(e){return{vue:Z.devDependencies.vue,"vue-router":Z.devDependencies[`vue-router`],"path-to-regexp":Z.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/vue-query":Z.devDependencies[`@tanstack/vue-query`]}:{}}},factory:hi}),_i=e=>{let n=process.env.NODE_ENV||`development`,a=typeof e.base==`string`?e.base:e.base[n];if(!a?.trim())throw Error(r([`red`],`ERROR: Invalid Config - no base provided`));return{...e,base:t(`/`,a),apiBase:t(`/`,e.apiBase||i)}};export{e as coreGenerator,_i as defineConfig,L as fetchGenerator,Ae as h3Generator,Ye as honoGenerator,mt as koaGenerator,Ht as mdxGenerator,qt as openapiGenerator,xn as reactGenerator,Jn as solidGenerator,Zn as ssgGenerator,or as ssrGenerator,Nr as svelteGenerator,Hr as typeboxGenerator,gi as vueGenerator};
9139
9273
  //# sourceMappingURL=index.js.map