@kosmojs/dev 0.4.1 → 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-BhfEyKpY.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,11 +682,18 @@ 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
 
635
- import { base, apiBase, apiRouteMap, apiRouteMapper } from "{{ createImport 'libCore' }}";
689
+ import {
690
+ base,
691
+ apiBase,
692
+ apiRouteMap,
693
+ apiRouteMapper,
694
+ // needed for cascadingMiddleware
695
+ type Override,
696
+ } from "{{ createImport 'libCore' }}";
636
697
 
637
698
  {{#each routes}}
638
699
  import {{id}} from "{{ createImport 'api' file }}";
@@ -673,7 +734,7 @@ export const routeSources: Array<RouteSource<never>> = [
673
734
  },
674
735
  {{/each}}
675
736
  ];
676
- `,_e=`import { parseArgs, styleText } from "node:util";
737
+ `,ve=`import { parseArgs, styleText } from "node:util";
677
738
 
678
739
  import { serve as h3serve } from "h3";
679
740
 
@@ -721,7 +782,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
721
782
 
722
783
  return server as never;
723
784
  };
724
- `,ve=`import type { H3Event, H3EventContext } from "h3";
785
+ `,ye=`import type { H3Event, H3EventContext } from "h3";
725
786
 
726
787
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
727
788
  import {
@@ -868,14 +929,14 @@ export const defineRoute: <
868
929
  use: use as never,
869
930
  });
870
931
  };
871
- `,ye=`export * from "./@api/app";
932
+ `,be=`export * from "./@api/app";
872
933
  export { appFactory as default } from "./@api/app";
873
934
  export * from "./@api/dev";
874
935
  export * from "./@api/errors";
875
936
  export * from "./@api/router";
876
937
  export * from "./@api/routes";
877
938
  export * from "./@api/server";
878
- `,be=`import { onError } from "h3";
939
+ `,xe=`import { onError } from "h3";
879
940
 
880
941
  import appFactory, { routes, type App } from "{{ createImport 'lib' 'api:factory' }}";
881
942
  import defaultErrorHandler from "./errors";
@@ -883,7 +944,7 @@ import defaultErrorHandler from "./errors";
883
944
  export default appFactory(routes, ({ app }) => {
884
945
  app.use(onError(defaultErrorHandler));
885
946
  }) as App;
886
- `,xe=`import { toNodeHandler } from "h3/node";
947
+ `,Se=`import { toNodeHandler } from "h3/node";
887
948
 
888
949
  import app from "./app";
889
950
 
@@ -903,10 +964,10 @@ process.on("unhandledRejection", (reason) => {
903
964
  console.error("Reason:", reason);
904
965
  process.exit(1);
905
966
  });
906
- `,Se=`export declare module "{{ createImport 'libApi' }}" {
967
+ `,Ce=`export declare module "{{ createImport 'libApi' }}" {
907
968
  interface DefaultContext {}
908
969
  }
909
- `,Ce=`import { ValidationError } from "@kosmojs/core/errors";
970
+ `,we=`import { ValidationError } from "@kosmojs/core/errors";
910
971
  import { HTTPError } from "h3";
911
972
 
912
973
  import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
@@ -932,14 +993,14 @@ export default errorHandlerFactory(async (error, event) => {
932
993
  headers: { "Content-Type": "text/plain" },
933
994
  });
934
995
  });
935
- `,we=`import { defineRoute } from "{{ createImport 'libApi' }}";
996
+ `,Te=`import { defineRoute } from "{{ createImport 'libApi' }}";
936
997
 
937
998
  export default defineRoute<"{{route.name}}">(({ GET }) => [
938
999
  GET(async (event) => {
939
1000
  return "Automatically generated route";
940
1001
  }),
941
1002
  ]);
942
- `,Te=`import { use } from "{{ createImport 'libApi' }}";
1003
+ `,Ee=`import { use } from "{{ createImport 'libApi' }}";
943
1004
 
944
1005
  export type UseT = {};
945
1006
 
@@ -948,11 +1009,11 @@ export default [
948
1009
  return next();
949
1010
  }),
950
1011
  ];
951
- `,Ee=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1012
+ `,De=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
952
1013
  import app from "./app";
953
1014
 
954
1015
  await serve(app);
955
- `,De=`import { use } from "{{ createImport 'libApi' }}";
1016
+ `,Oe=`import { use } from "{{ createImport 'libApi' }}";
956
1017
 
957
1018
  /**
958
1019
  * Define global middleware applied to all routes.
@@ -963,7 +1024,7 @@ export default [
963
1024
  return next();
964
1025
  }),
965
1026
  ];
966
- `,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";
967
1028
  import type { Router } from "hono/router";
968
1029
  import { RegExpRouter } from "hono/router/reg-exp-router";
969
1030
  import { SmartRouter } from "hono/router/smart-router";
@@ -1030,15 +1091,45 @@ export function appFactory(
1030
1091
  } else if (debug) {
1031
1092
  console.log(route.debug[typeof debug === "string" ? debug : "full"]);
1032
1093
  }
1033
- 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
+ });
1034
1125
  }
1035
1126
 
1036
1127
  return app as never;
1037
1128
  }
1038
- `,je=`import type { DevSetup } from "@kosmojs/core/api";
1129
+ `,Me=`import type { DevSetup } from "@kosmojs/core/api";
1039
1130
 
1040
1131
  export const devSetup = (setup: DevSetup) => setup;
1041
- `,Me=`import type { Context } from "hono";
1132
+ `,Ne=`import type { Context } from "hono";
1042
1133
 
1043
1134
  import type { AppEnv } from "./app";
1044
1135
 
@@ -1052,7 +1143,7 @@ export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
1052
1143
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
1053
1144
  return handler;
1054
1145
  };
1055
- `,Ne=`import type { Context } from "hono";
1146
+ `,Pe=`import type { Context } from "hono";
1056
1147
 
1057
1148
  import {
1058
1149
  parseCookies,
@@ -1101,7 +1192,7 @@ export const bodyparsers: {
1101
1192
  return ctx.req[as]();
1102
1193
  },
1103
1194
  };
1104
- `,Pe=`import type { MiddlewareHandler } from "hono";
1195
+ `,Fe=`import type { MiddlewareHandler } from "hono";
1105
1196
 
1106
1197
  import type {
1107
1198
  RequestBodyTarget,
@@ -1187,7 +1278,7 @@ export const createRouteMiddleware: CreateRouteMiddleware<
1187
1278
  target === "query"
1188
1279
  ? normalizeSearchParams(
1189
1280
  parser(ctx),
1190
- ctx.req.method as never,
1281
+ ctx.req.method === "HEAD" ? "GET" : ctx.req.method,
1191
1282
  )
1192
1283
  : parser(ctx),
1193
1284
  );
@@ -1267,7 +1358,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
1267
1358
  * */
1268
1359
  use(
1269
1360
  async function useValidateResponse(ctx, next) {
1270
- const variants = validationSchemas.response?.[ctx.req.method] || [];
1361
+ const variants =
1362
+ validationSchemas.response?.[
1363
+ ctx.req.method === "HEAD" ? "GET" : ctx.req.method
1364
+ ] || [];
1271
1365
 
1272
1366
  if (!Array.isArray(variants) || !variants.length) {
1273
1367
  return next();
@@ -1300,10 +1394,17 @@ export const createRouteMiddleware: CreateRouteMiddleware<
1300
1394
  contentType: ctx.res.headers.get("Content-Type"),
1301
1395
  };
1302
1396
 
1397
+ // validate only 2xx responses
1398
+ if (Math.floor(response.status / 100) !== 2) {
1399
+ return;
1400
+ }
1401
+
1303
1402
  // Validate body only for JSON variants
1304
1403
  if (variants.some((e) => e.contentType?.includes("json"))) {
1305
- const cloned = ctx.res.clone();
1306
- response.body = await cloned.json();
1404
+ response.body = await ctx.res
1405
+ .clone()
1406
+ .json()
1407
+ .catch(() => undefined);
1307
1408
  }
1308
1409
 
1309
1410
  /**
@@ -1438,7 +1539,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
1438
1539
  use(
1439
1540
  async (ctx, next) => {
1440
1541
  const schema = {
1441
- ...validationSchemas[target]?.[ctx.req.method],
1542
+ ...validationSchemas[target]?.[
1543
+ ctx.req.method === "HEAD" ? "GET" : ctx.req.method
1544
+ ],
1442
1545
  };
1443
1546
  if (schema.validate && schema.runtimeValidation !== false) {
1444
1547
  schema.validate(await loadData(ctx as never));
@@ -1468,11 +1571,18 @@ export const routes = createRoutes<ParameterizedMiddleware, MiddlewareHandler>(
1468
1571
  createRouteMiddleware,
1469
1572
  },
1470
1573
  );
1471
- `,Fe=`import { join } from "node:path";
1574
+ `,Ie=`import { join } from "node:path";
1472
1575
 
1473
1576
  import type { RouteSource } from "@kosmojs/core/api";
1474
1577
 
1475
- import { base, apiBase, apiRouteMap, apiRouteMapper } from "{{ createImport 'libCore' }}";
1578
+ import {
1579
+ base,
1580
+ apiBase,
1581
+ apiRouteMap,
1582
+ apiRouteMapper,
1583
+ // needed for cascadingMiddleware
1584
+ type Override,
1585
+ } from "{{ createImport 'libCore' }}";
1476
1586
 
1477
1587
  {{#each routes}}
1478
1588
  import {{id}} from "{{ createImport 'api' file }}";
@@ -1513,7 +1623,7 @@ export const routeSources: Array<RouteSource<never>> = [
1513
1623
  },
1514
1624
  {{/each}}
1515
1625
  ];
1516
- `,Ie=`import { chmod, unlink } from "node:fs/promises";
1626
+ `,Le=`import { chmod, unlink } from "node:fs/promises";
1517
1627
  import { parseArgs, styleText } from "node:util";
1518
1628
 
1519
1629
  import { createAdaptorServer } from "@hono/node-server";
@@ -1598,7 +1708,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
1598
1708
 
1599
1709
  return server as never;
1600
1710
  };
1601
- `,Le=`import type { Context, Next } from "hono";
1711
+ `,Re=`import type { Context, Next } from "hono";
1602
1712
 
1603
1713
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
1604
1714
  import {
@@ -1781,20 +1891,20 @@ export const defineRoute: <
1781
1891
  use: use as never,
1782
1892
  });
1783
1893
  };
1784
- `,Re=`export * from "./@api/app";
1894
+ `,ze=`export * from "./@api/app";
1785
1895
  export { appFactory as default } from "./@api/app";
1786
1896
  export * from "./@api/dev";
1787
1897
  export * from "./@api/errors";
1788
1898
  export * from "./@api/router";
1789
1899
  export * from "./@api/routes";
1790
1900
  export * from "./@api/server";
1791
- `,ze=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
1901
+ `,Be=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
1792
1902
  import defaultErrorHandler from "./errors";
1793
1903
 
1794
1904
  export default appFactory(routes, ({ app }) => {
1795
1905
  app.onError(defaultErrorHandler);
1796
1906
  })
1797
- `,Be=`import { getRequestListener } from "@hono/node-server";
1907
+ `,Ve=`import { getRequestListener } from "@hono/node-server";
1798
1908
 
1799
1909
  import app from "./app";
1800
1910
 
@@ -1815,11 +1925,11 @@ process.on("unhandledRejection", (reason) => {
1815
1925
  process.exit(1);
1816
1926
  });
1817
1927
 
1818
- `,Ve=`export declare module "{{ createImport 'libApi' }}" {
1928
+ `,He=`export declare module "{{ createImport 'libApi' }}" {
1819
1929
  interface DefaultVariables {}
1820
1930
  interface DefaultBindings {}
1821
1931
  }
1822
- `,He=`import { accepts } from "hono/accepts";
1932
+ `,Ue=`import { accepts } from "hono/accepts";
1823
1933
  import { HTTPException } from "hono/http-exception";
1824
1934
 
1825
1935
  import { ValidationError, HTTPError } from "@kosmojs/core/errors";
@@ -1851,7 +1961,7 @@ export default errorHandlerFactory(async (error, ctx) => {
1851
1961
  ? ctx.json({ error: message }, status)
1852
1962
  : ctx.text(message, status);
1853
1963
  });
1854
- `,Ue=`import { defineRoute } from "{{ createImport 'libApi' }}";
1964
+ `,We=`import { defineRoute } from "{{ createImport 'libApi' }}";
1855
1965
 
1856
1966
  export default defineRoute<"{{route.name}}">(({ GET }) => [
1857
1967
  GET(async (ctx) => {
@@ -1860,7 +1970,7 @@ export default defineRoute<"{{route.name}}">(({ GET }) => [
1860
1970
  return ctx.text("Automatically generated route");
1861
1971
  }),
1862
1972
  ]);
1863
- `,We=`import { use } from "{{ createImport 'libApi' }}";
1973
+ `,Ge=`import { use } from "{{ createImport 'libApi' }}";
1864
1974
 
1865
1975
  export type UseT = {};
1866
1976
 
@@ -1871,11 +1981,11 @@ export default [
1871
1981
  return next();
1872
1982
  }),
1873
1983
  ];
1874
- `,Ge=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1984
+ `,Ke=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1875
1985
  import app from "./app";
1876
1986
 
1877
1987
  await serve(app);
1878
- `,Ke=`import { use } from "{{ createImport 'libApi' }}";
1988
+ `,qe=`import { use } from "{{ createImport 'libApi' }}";
1879
1989
 
1880
1990
  /**
1881
1991
  * Define global middleware applied to all routes.
@@ -1886,7 +1996,9 @@ export default [
1886
1996
  return next();
1887
1997
  }),
1888
1998
  ];
1889
- `,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";
1890
2002
  import Koa from "koa";
1891
2003
 
1892
2004
  import type { Route, RouteDebugOption } from "@kosmojs/core/api";
@@ -1897,7 +2009,7 @@ export type App = Koa<DefaultState, DefaultContext>;
1897
2009
 
1898
2010
  export type AppOptions = ConstructorParameters<
1899
2011
  typeof Koa<DefaultState, DefaultContext>
1900
- >[0] & { router?: Router; debug?: RouteDebugOption };
2012
+ >[0] & { debug?: RouteDebugOption };
1901
2013
 
1902
2014
  export function appFactory(
1903
2015
  routes: Array<Route<RouterMiddleware>>,
@@ -1921,51 +2033,88 @@ export function appFactory(
1921
2033
  ): App {
1922
2034
  const [options, fn] = typeof rest[0] === "function" ? [{}, rest[0]] : rest;
1923
2035
 
1924
- const {
1925
- router = new Router(),
1926
- debug = undefined,
1927
- ...appOptions
1928
- } = {
2036
+ const { debug = undefined, ...appOptions } = {
1929
2037
  ...(options ? { ...options } : {}),
1930
2038
  };
1931
2039
 
2040
+ const app = new Koa(appOptions);
2041
+ const router = new Router();
2042
+
1932
2043
  for (const route of routes) {
1933
2044
  if (typeof debug === "function") {
1934
2045
  (debug as Function)(route.debug, route);
1935
2046
  } else if (debug) {
1936
2047
  console.log(route.debug[typeof debug === "string" ? debug : "full"]);
1937
2048
  }
1938
- router.register(route.path, route.methods, route.middleware, route);
2049
+ router.register(route.path, [route.method], route.middleware, route);
1939
2050
  }
1940
2051
 
1941
- 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
+ }
1942
2088
 
1943
2089
  if (typeof fn === "function") {
1944
2090
  fn({ app, router });
1945
2091
  }
1946
2092
 
2093
+ // NOTE: Routes should be added last, after any middleware
2094
+ app.use(router.routes());
2095
+
1947
2096
  return app;
1948
2097
  }
1949
- `,Xe=`import type { DevSetup } from "@kosmojs/core/api";
2098
+ `,Ze=`import type { DevSetup } from "@kosmojs/core/api";
1950
2099
 
1951
2100
  export const devSetup = (setup: DevSetup) => setup;
1952
- `,Ze=`import type {
2101
+ `,Qe=`import type {
1953
2102
  DefaultContext,
1954
2103
  DefaultState,
1955
2104
  ParameterizedContext,
1956
2105
  } from "../api";
1957
2106
 
1958
2107
  type ErrorHandler = (
1959
- error: any,
1960
2108
  ctx: ParameterizedContext<unknown, DefaultState, DefaultContext>,
1961
- ) => Promise<void> | void;
2109
+ next: Function,
2110
+ ) => Promise<void>;
1962
2111
 
1963
2112
  export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
1964
2113
 
1965
2114
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
1966
2115
  return handler;
1967
2116
  };
1968
- `,Qe=`import zlib from "node:zlib";
2117
+ `,$e=`import zlib from "node:zlib";
1969
2118
 
1970
2119
  import type { RouterContext } from "@koa/router";
1971
2120
  import Formidable, { type Options as FormidableOptions } from "formidable";
@@ -2178,7 +2327,7 @@ export const bodyparsers: {
2178
2327
  return rawParser(stream, rawParserOptions);
2179
2328
  },
2180
2329
  };
2181
- `,$e=`import type { RouterMiddleware } from "@koa/router";
2330
+ `,et=`import type { RouterMiddleware } from "@koa/router";
2182
2331
 
2183
2332
  import type {
2184
2333
  RequestBodyTarget,
@@ -2262,7 +2411,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
2262
2411
  ctx[StateKey].set(
2263
2412
  target,
2264
2413
  target === "query"
2265
- ? normalizeSearchParams(parser(ctx), ctx.method as never)
2414
+ ? normalizeSearchParams(
2415
+ parser(ctx),
2416
+ ctx.method === "HEAD" ? "GET" : ctx.method,
2417
+ )
2266
2418
  : parser(ctx),
2267
2419
  );
2268
2420
  }
@@ -2341,7 +2493,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
2341
2493
  * */
2342
2494
  use(
2343
2495
  async function useValidateResponse(ctx, next) {
2344
- const variants = validationSchemas.response?.[ctx.method] || [];
2496
+ const variants =
2497
+ validationSchemas.response?.[
2498
+ ctx.method === "HEAD" ? "GET" : ctx.method
2499
+ ] || [];
2345
2500
 
2346
2501
  if (!Array.isArray(variants) || !variants.length) {
2347
2502
  return next();
@@ -2375,6 +2530,11 @@ export const createRouteMiddleware: CreateRouteMiddleware<
2375
2530
  contentType: ctx.type,
2376
2531
  };
2377
2532
 
2533
+ // validate only 2xx responses
2534
+ if (Math.floor(response.status / 100) !== 2) {
2535
+ return;
2536
+ }
2537
+
2378
2538
  // Validate body only for JSON variants
2379
2539
  if (variants.some((e) => e.contentType?.includes("json"))) {
2380
2540
  response.body = ctx.body;
@@ -2513,7 +2673,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
2513
2673
  use(
2514
2674
  async (ctx, next) => {
2515
2675
  const schema = {
2516
- ...validationSchemas[target]?.[ctx.method],
2676
+ ...validationSchemas[target]?.[
2677
+ ctx.method === "HEAD" ? "GET" : ctx.method
2678
+ ],
2517
2679
  };
2518
2680
  if (schema.validate && schema.runtimeValidation !== false) {
2519
2681
  schema.validate(await loadData(ctx as never));
@@ -2543,11 +2705,18 @@ export const routes = createRoutes<ParameterizedMiddleware, RouterMiddleware>(
2543
2705
  createRouteMiddleware,
2544
2706
  },
2545
2707
  );
2546
- `,et=`import { join } from "node:path";
2708
+ `,tt=`import { join } from "node:path";
2547
2709
 
2548
2710
  import type { RouteSource } from "@kosmojs/core/api";
2549
2711
 
2550
- import { base, apiBase, apiRouteMap, apiRouteMapper } from "{{ createImport 'libCore' }}";
2712
+ import {
2713
+ base,
2714
+ apiBase,
2715
+ apiRouteMap,
2716
+ apiRouteMapper,
2717
+ // needed for cascadingMiddleware
2718
+ type Override,
2719
+ } from "{{ createImport 'libCore' }}";
2551
2720
 
2552
2721
  {{#each routes}}
2553
2722
  import {{id}} from "{{ createImport 'api' file }}";
@@ -2588,7 +2757,7 @@ export const routeSources: Array<RouteSource<never>> = [
2588
2757
  },
2589
2758
  {{/each}}
2590
2759
  ];
2591
- `,tt=`import { chmod, unlink } from "node:fs/promises";
2760
+ `,nt=`import { chmod, unlink } from "node:fs/promises";
2592
2761
  import { parseArgs, styleText } from "node:util";
2593
2762
 
2594
2763
  import type { App } from "./app";
@@ -2651,7 +2820,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
2651
2820
  const server = app.listen(port || sock, onListen);
2652
2821
  return server as never;
2653
2822
  };
2654
- `,nt=`import type { RouterContext } from "@koa/router";
2823
+ `,rt=`import type { RouterContext } from "@koa/router";
2655
2824
  import type { Next } from "koa";
2656
2825
 
2657
2826
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
@@ -2813,25 +2982,20 @@ export const defineRoute: <
2813
2982
  use: use as never,
2814
2983
  });
2815
2984
  };
2816
- `,rt=`export * from "./@api/app";
2985
+ `,it=`export * from "./@api/app";
2817
2986
  export { appFactory as default } from "./@api/app";
2818
2987
  export * from "./@api/dev";
2819
2988
  export * from "./@api/errors";
2820
2989
  export * from "./@api/router";
2821
2990
  export * from "./@api/routes";
2822
2991
  export * from "./@api/server";
2823
- `,it=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
2992
+ `,at=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
2824
2993
  import defaultErrorHandler from "./errors";
2825
2994
 
2826
- export default appFactory(routes, ({ app, router }) => {
2827
-
2828
- app.on("error", defaultErrorHandler);
2829
-
2830
- // NOTE: Routes should be added last, after any middleware
2831
- app.use(router.routes());
2832
-
2833
- });
2834
- `,at=`import app from "./app";
2995
+ export default appFactory(routes, ({ app }) => {
2996
+ app.use(defaultErrorHandler);
2997
+ })
2998
+ `,ot=`import app from "./app";
2835
2999
 
2836
3000
  import { devSetup } from "{{ createImport 'lib' 'api:factory' }}";
2837
3001
 
@@ -2849,39 +3013,43 @@ process.on("unhandledRejection", (reason) => {
2849
3013
  console.error("Reason:", reason);
2850
3014
  process.exit(1);
2851
3015
  });
2852
- `,ot=`export declare module "{{ createImport 'libApi' }}" {
3016
+ `,st=`export declare module "{{ createImport 'libApi' }}" {
2853
3017
  interface DefaultState {}
2854
3018
  interface DefaultContext {}
2855
3019
  }
2856
- `,st=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
3020
+ `,ct=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
2857
3021
 
2858
3022
  import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
2859
3023
 
2860
- export default errorHandlerFactory(async (error, ctx) => {
2861
- const [status, message] = Array.isArray(error)
2862
- ? error
2863
- : error instanceof HTTPError
2864
- ? [error.status, error.message]
2865
- : error instanceof ValidationError
2866
- ? [400, \`\${error.target}: \${error.errorMessage}\`]
2867
- : [error.statusCode || 500, error.message];
2868
-
2869
- ctx.status = status;
2870
-
2871
- if (ctx.accepts("json")) {
2872
- ctx.body = { error: message };
2873
- } else {
2874
- 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
+ }
2875
3043
  }
2876
3044
  });
2877
- `,ct=`import { defineRoute } from "{{ createImport 'libApi' }}";
3045
+ `,lt=`import { defineRoute } from "{{ createImport 'libApi' }}";
2878
3046
 
2879
3047
  export default defineRoute<"{{route.name}}">(({ GET }) => [
2880
3048
  GET(async (ctx) => {
2881
3049
  ctx.body = "Automatically generated route";
2882
3050
  }),
2883
3051
  ]);
2884
- `,lt=`import { use } from "{{ createImport 'libApi' }}";
3052
+ `,ut=`import { use } from "{{ createImport 'libApi' }}";
2885
3053
 
2886
3054
  export type UseT = {};
2887
3055
 
@@ -2892,11 +3060,11 @@ export default [
2892
3060
  return next();
2893
3061
  }),
2894
3062
  ];
2895
- `,ut=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
3063
+ `,dt=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
2896
3064
  import app from "./app";
2897
3065
 
2898
3066
  await serve(app);
2899
- `,dt=`import { use } from "{{ createImport 'libApi' }}";
3067
+ `,ft=`import { use } from "{{ createImport 'libApi' }}";
2900
3068
 
2901
3069
  /**
2902
3070
  * Define global middleware applied to all routes.
@@ -2907,17 +3075,17 @@ export default [
2907
3075
  return next();
2908
3076
  }),
2909
3077
  ];
2910
- `,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,`
2911
3079
  if (import.meta.hot) {
2912
3080
  import.meta.hot.accept(() => {});
2913
3081
  }
2914
3082
  `].join(`
2915
- `)}}}},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";
2916
3084
 
2917
3085
  export const AppProvider: FunctionComponent = (props) => {
2918
3086
  return props.children;
2919
3087
  };
2920
- `,_t=`import { render, hydrate as hydrateOrig } from "preact";
3088
+ `,vt=`import { render, hydrate as hydrateOrig } from "preact";
2921
3089
  import type { RouterFactoryReturn } from "@kosmojs/core";
2922
3090
  import { clientRenderFactory } from "@kosmojs/core/generators";
2923
3091
 
@@ -2958,7 +3126,7 @@ export const mount = async (
2958
3126
  }
2959
3127
 
2960
3128
  export default clientRenderFactory();
2961
- `,vt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
3129
+ `,yt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
2962
3130
 
2963
3131
  import type {
2964
3132
  RenderToStringWrapper,
@@ -3032,7 +3200,7 @@ export const renderToString: RenderToStringWrapper<
3032
3200
  }
3033
3201
 
3034
3202
  export default serverRenderFactory<false>();
3035
- `,yt=`declare module "*.mdx" {
3203
+ `,bt=`declare module "*.mdx" {
3036
3204
  import type { ComponentType } from "preact";
3037
3205
  export const frontmatter: Record<string, unknown>;
3038
3206
  const component: ComponentType;
@@ -3045,7 +3213,7 @@ declare module "*.md" {
3045
3213
  const component: ComponentType;
3046
3214
  export default component;
3047
3215
  }
3048
- `,bt=`import { MDXProvider } from "@mdx-js/preact";
3216
+ `,xt=`import { MDXProvider } from "@mdx-js/preact";
3049
3217
  import { match, pathToRegexp } from "path-to-regexp";
3050
3218
  import { type ComponentType, createContext, h, type VNode } from "preact";
3051
3219
 
@@ -3247,7 +3415,7 @@ export const createRoute = (
3247
3415
  layouts,
3248
3416
  };
3249
3417
  };
3250
- `,xt=`/* @jsxImportSource preact */
3418
+ `,St=`/* @jsxImportSource preact */
3251
3419
 
3252
3420
  import styles from "./styles.module.css";
3253
3421
 
@@ -3288,7 +3456,7 @@ export default function PageSample(props: {
3288
3456
  </div>
3289
3457
  );
3290
3458
  }
3291
- `,St=`/* @jsxImportSource preact */
3459
+ `,Ct=`/* @jsxImportSource preact */
3292
3460
 
3293
3461
  import styles from "./styles.module.css";
3294
3462
 
@@ -3340,7 +3508,7 @@ export default function PageSample(props: {
3340
3508
  </div>
3341
3509
  );
3342
3510
  }
3343
- `,Ct=`* {
3511
+ `,wt=`* {
3344
3512
  margin: 0;
3345
3513
  padding: 0;
3346
3514
  box-sizing: border-box;
@@ -3475,7 +3643,7 @@ export default function PageSample(props: {
3475
3643
  align-items: center;
3476
3644
  gap: 0.25rem;
3477
3645
  }
3478
- `,wt=`/* @jsxImportSource preact */
3646
+ `,Tt=`/* @jsxImportSource preact */
3479
3647
 
3480
3648
  import styles from "./styles.module.css";
3481
3649
 
@@ -3541,7 +3709,7 @@ export default function WelcomePage() {
3541
3709
  </div>
3542
3710
  );
3543
3711
  }
3544
- `,Tt=`export type ParamsMap = {
3712
+ `,Et=`export type ParamsMap = {
3545
3713
  {{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
3546
3714
  {{/each}}
3547
3715
  };
@@ -3550,7 +3718,7 @@ export const paramNames = {
3550
3718
  {{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
3551
3719
  {{/each}}
3552
3720
  } as const;
3553
- `,Et=`import type { ComponentType } from "preact";
3721
+ `,Dt=`import type { ComponentType } from "preact";
3554
3722
 
3555
3723
  import type { RouterFactoryReturn } from "@kosmojs/core";
3556
3724
  import { createRouterFactory } from "@kosmojs/core/generators";
@@ -3594,7 +3762,7 @@ export default createRouterFactory<
3594
3762
  Promise<RouteComponent>,
3595
3763
  { server: { route: Route } }
3596
3764
  >();
3597
- `,Dt=`import { join } from "node:path";
3765
+ `,Ot=`import { join } from "node:path";
3598
3766
 
3599
3767
  import { compile } from "path-to-regexp";
3600
3768
 
@@ -3640,7 +3808,7 @@ export default Object.entries(routes)
3640
3808
  return [];
3641
3809
  })
3642
3810
  .map((path) => join(base, path));
3643
- `,Ot=`import type { PageRoute } from "@kosmojs/core";
3811
+ `,kt=`import type { PageRoute } from "@kosmojs/core";
3644
3812
 
3645
3813
  {{#each pageRoutes}}
3646
3814
  import * as {{id}} from "{{ createImport 'pages' file }}";
@@ -3664,7 +3832,7 @@ const routeMap: Record<
3664
3832
  }
3665
3833
 
3666
3834
  export default routeMap;
3667
- `,kt=`import { useContext } from "preact/hooks";
3835
+ `,At=`import { useContext } from "preact/hooks";
3668
3836
 
3669
3837
  import { RouterContext } from "./mdx";
3670
3838
 
@@ -3710,10 +3878,10 @@ export const useFrontmatter = <
3710
3878
  >(): T => {
3711
3879
  return useRoute().frontmatter as T;
3712
3880
  };
3713
- `,At=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
3881
+ `,jt=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
3714
3882
 
3715
3883
  <AppProvider>{props.children}</AppProvider>
3716
- `,jt=`import { h, type JSX } from "preact";
3884
+ `,Mt=`import { h, type JSX } from "preact";
3717
3885
 
3718
3886
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
3719
3887
 
@@ -3730,7 +3898,7 @@ export default function Link(
3730
3898
 
3731
3899
  return h("a", { ...restProps, href }, children);
3732
3900
  }
3733
- `,Mt=`/**
3901
+ `,Nt=`/**
3734
3902
  * MDX component overrides.
3735
3903
  *
3736
3904
  * Every standard markdown element (headings, links, code blocks, etc.)
@@ -3753,7 +3921,7 @@ export const components = {
3753
3921
  declare global {
3754
3922
  type MDXProvidedComponents = typeof components;
3755
3923
  }
3756
- `,Nt=`import renderFactory, {
3924
+ `,Pt=`import renderFactory, {
3757
3925
  createRoutes,
3758
3926
  hydrate,
3759
3927
  mount,
@@ -3780,7 +3948,7 @@ if (root) {
3780
3948
  } else {
3781
3949
  console.error("❌ Root element not found!");
3782
3950
  }
3783
- `,Pt=`import renderFactory, {
3951
+ `,Ft=`import renderFactory, {
3784
3952
  createRoutes,
3785
3953
  renderToString,
3786
3954
  // no renderToStream on MDX folders
@@ -3801,18 +3969,6 @@ export default renderFactory(() => {
3801
3969
  },
3802
3970
  };
3803
3971
  });
3804
- `,Ft=`<!doctype html>
3805
- <html lang="en">
3806
- <head>
3807
- <meta charset="UTF-8" />
3808
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
3809
- <!--app-head-->
3810
- </head>
3811
- <body>
3812
- <div id="app"><!--app-html--></div>
3813
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
3814
- </body>
3815
- </html>
3816
3972
  `,It=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
3817
3973
 
3818
3974
  export default function Page() {
@@ -3860,7 +4016,7 @@ export default routerFactory((routes) => {
3860
4016
  },
3861
4017
  };
3862
4018
  });
3863
- `,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:{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`,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.101.4`,"@types/react":`^19.2.18`,"@types/react-dom":`^19.2.4`,"path-to-regexp":`^8.4.2`,react:`^19.2.8`,"react-dom":`^19.2.8`,"react-router":`^8.3.0`}},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";
3864
4020
 
3865
4021
  export const AppProvider = ({ children }: { children: ReactNode }) => {
3866
4022
  return children;
@@ -4524,29 +4680,17 @@ export default renderFactory(() => {
4524
4680
  },
4525
4681
  };
4526
4682
  });
4527
- `,hn=`<!doctype html>
4528
- <html lang="en">
4529
- <head>
4530
- <meta charset="UTF-8" />
4531
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
4532
- <!--app-head-->
4533
- </head>
4534
- <body>
4535
- <div id="app"><!--app-html--></div>
4536
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
4537
- </body>
4538
- </html>
4539
- `,gn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
4683
+ `,hn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
4540
4684
 
4541
4685
  export default function Page() {
4542
4686
  return <PageSample />;
4543
4687
  }
4544
- `,_n=`import { Outlet } from "react-router";
4688
+ `,gn=`import { Outlet } from "react-router";
4545
4689
 
4546
4690
  export default function Layout() {
4547
4691
  return <Outlet />;
4548
4692
  }
4549
- `,vn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
4693
+ `,_n=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
4550
4694
 
4551
4695
  export default function Page() {
4552
4696
  return PageSample({
@@ -4559,8 +4703,8 @@ export default function Page() {
4559
4703
  },
4560
4704
  });
4561
4705
  }
4562
- `,yn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
4563
- `,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' }}";
4564
4708
 
4565
4709
  import app from "./app";
4566
4710
 
@@ -4575,12 +4719,12 @@ export default routerFactory((routes) => {
4575
4719
  },
4576
4720
  };
4577
4721
  });
4578
- `,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.101.4`,"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";
4579
4723
 
4580
4724
  export const AppProvider: ParentComponent = (props) => {
4581
4725
  return props.children;
4582
4726
  };
4583
- `,En=`import type { ParentComponent } from "solid-js";
4727
+ `,Tn=`import type { ParentComponent } from "solid-js";
4584
4728
  import { type QueryClient, QueryClientProvider } from "@tanstack/solid-query";
4585
4729
 
4586
4730
  import { getQueryClient } from "./query";
@@ -4592,7 +4736,7 @@ export const AppProvider: ParentComponent<{ client?: QueryClient }> = (props) =>
4592
4736
  </QueryClientProvider>
4593
4737
  );
4594
4738
  };
4595
- `,Dn=`import { lazy, type JSX } from "solid-js";
4739
+ `,En=`import { lazy, type JSX } from "solid-js";
4596
4740
  import { hydrate as hydrateOrig, render } from "solid-js/web";
4597
4741
  import type { RouterFactoryReturn } from "@kosmojs/core";
4598
4742
  import { clientRenderFactory } from "@kosmojs/core/generators";
@@ -4637,7 +4781,7 @@ export const mount = async (
4637
4781
  }
4638
4782
 
4639
4783
  export default clientRenderFactory();
4640
- `,On=`{
4784
+ `,Dn=`{
4641
4785
  path: "{{path}}",
4642
4786
  {{#if component}}
4643
4787
  component: {{component}}_component,
@@ -4647,7 +4791,7 @@ export default clientRenderFactory();
4647
4791
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
4648
4792
  {{/if}}
4649
4793
  }
4650
- `,kn=`import type { JSX } from "solid-js";
4794
+ `,On=`import type { JSX } from "solid-js";
4651
4795
 
4652
4796
  import {
4653
4797
  generateHydrationScript,
@@ -4720,7 +4864,7 @@ export const renderToStream: RenderToStreamWrapper<
4720
4864
  * and surfaces the error to the stream consumer; catching here only keeps
4721
4865
  * the rejection from escaping as an unhandled one.
4722
4866
  * */
4723
- stream.pipeTo(writable).catch(() => {});
4867
+ void Promise.resolve(stream.pipeTo(writable)).catch(() => {});
4724
4868
  return {
4725
4869
  head: [...headerTags, generateHydrationScript()].join("\\n"),
4726
4870
  html: readable,
@@ -4728,7 +4872,7 @@ export const renderToStream: RenderToStreamWrapper<
4728
4872
  };
4729
4873
 
4730
4874
  export default serverRenderFactory<true>();
4731
- `,An=`/* @jsxImportSource solid-js */
4875
+ `,kn=`/* @jsxImportSource solid-js */
4732
4876
 
4733
4877
  import styles from "./styles.module.css";
4734
4878
 
@@ -4769,7 +4913,7 @@ export default function PageSample(props: {
4769
4913
  </div>
4770
4914
  );
4771
4915
  }
4772
- `,jn=`/* @jsxImportSource solid-js */
4916
+ `,An=`/* @jsxImportSource solid-js */
4773
4917
 
4774
4918
  import styles from "./styles.module.css";
4775
4919
 
@@ -4821,7 +4965,7 @@ export default function PageSample(props: {
4821
4965
  </div>
4822
4966
  );
4823
4967
  }
4824
- `,Mn=`* {
4968
+ `,jn=`* {
4825
4969
  margin: 0;
4826
4970
  padding: 0;
4827
4971
  box-sizing: border-box;
@@ -4956,7 +5100,7 @@ export default function PageSample(props: {
4956
5100
  align-items: center;
4957
5101
  gap: 0.25rem;
4958
5102
  }
4959
- `,Nn=`/* @jsxImportSource solid-js */
5103
+ `,Mn=`/* @jsxImportSource solid-js */
4960
5104
 
4961
5105
  import styles from "./styles.module.css";
4962
5106
 
@@ -5022,7 +5166,7 @@ export default function WelcomePage() {
5022
5166
  </div>
5023
5167
  );
5024
5168
  }
5025
- `,Pn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5169
+ `,Nn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5026
5170
 
5027
5171
  let client: QueryClient | undefined;
5028
5172
 
@@ -5037,7 +5181,7 @@ export const getQueryClient = (): QueryClient => {
5037
5181
  }
5038
5182
  return client;
5039
5183
  };
5040
- `,Fn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5184
+ `,Pn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5041
5185
 
5042
5186
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
5043
5187
 
@@ -5060,7 +5204,7 @@ export const getQueryClient = (): QueryClient => {
5060
5204
  }
5061
5205
  return ctx.tsqClient as QueryClient;
5062
5206
  };
5063
- `,In=`import type { JSX, ParentComponent } from "solid-js";
5207
+ `,Fn=`import type { JSX, ParentComponent } from "solid-js";
5064
5208
  import { Router, type RouteDefinition } from "@solidjs/router";
5065
5209
  import type { RouterFactoryReturn } from "@kosmojs/core";
5066
5210
  import { createRouterFactory } from "@kosmojs/core/generators";
@@ -5096,7 +5240,7 @@ export const createRouters = (
5096
5240
  }
5097
5241
 
5098
5242
  export default createRouterFactory<RouteDefinition, JSX.Element>();
5099
- `,Ln=`export type ComponentLoader = () => Promise<{
5243
+ `,In=`export type ComponentLoader = () => Promise<{
5100
5244
  preload?: () => Promise<unknown>;
5101
5245
  }>;
5102
5246
 
@@ -5111,10 +5255,10 @@ export const loaderFactory = (opt?: { withPreload?: boolean }) => {
5111
5255
  return opt?.withPreload ? { preload } : {};
5112
5256
  };
5113
5257
  };
5114
- `,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;
5115
5259
 
5116
5260
  export { unwrap } from "solid-js/store";
5117
- `,zn=`import type { ParentComponent } from "solid-js";
5261
+ `,Rn=`import type { ParentComponent } from "solid-js";
5118
5262
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
5119
5263
 
5120
5264
  const App: ParentComponent = (props) => {
@@ -5122,7 +5266,7 @@ const App: ParentComponent = (props) => {
5122
5266
  };
5123
5267
 
5124
5268
  export default App;
5125
- `,Bn=`import { A, type AnchorProps } from "@solidjs/router";
5269
+ `,zn=`import { A, type AnchorProps } from "@solidjs/router";
5126
5270
  import { type JSXElement, splitProps } from "solid-js";
5127
5271
 
5128
5272
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
@@ -5147,7 +5291,7 @@ export default function Link(
5147
5291
 
5148
5292
  return <A {...{ ...restProps, href: href() }}>{knownProps.children}</A>;
5149
5293
  }
5150
- `,Vn=`import renderFactory, {
5294
+ `,Bn=`import renderFactory, {
5151
5295
  createRoutes,
5152
5296
  hydrate,
5153
5297
  mount,
@@ -5174,7 +5318,7 @@ if (root) {
5174
5318
  } else {
5175
5319
  console.error("❌ Root element not found!");
5176
5320
  }
5177
- `,Hn=`import renderFactory, {
5321
+ `,Vn=`import renderFactory, {
5178
5322
  createRoutes,
5179
5323
  renderToStream,
5180
5324
  renderToString,
@@ -5201,31 +5345,19 @@ export default renderFactory(() => {
5201
5345
  },
5202
5346
  };
5203
5347
  });
5204
- `,Un=`<!doctype html>
5205
- <html lang="en">
5206
- <head>
5207
- <meta charset="UTF-8" />
5208
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
5209
- <!--app-head-->
5210
- </head>
5211
- <body>
5212
- <div id="app"><!--app-html--></div>
5213
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
5214
- </body>
5215
- </html>
5216
- `,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
5348
+ `,Hn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
5217
5349
 
5218
5350
  export default function Page() {
5219
5351
  return <PageSample />;
5220
5352
  }
5221
- `,Gn=`import type { ParentComponent } from "solid-js";
5353
+ `,Un=`import type { ParentComponent } from "solid-js";
5222
5354
 
5223
5355
  const Layout: ParentComponent = (props) => {
5224
5356
  return props.children;
5225
5357
  };
5226
5358
 
5227
5359
  export default Layout;
5228
- `,Kn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
5360
+ `,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
5229
5361
 
5230
5362
  export default function Page() {
5231
5363
  return PageSample({
@@ -5238,8 +5370,8 @@ export default function Page() {
5238
5370
  },
5239
5371
  });
5240
5372
  }
5241
- `,qn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
5242
- `,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' }}";
5243
5375
 
5244
5376
  import app from "./app";
5245
5377
 
@@ -5254,12 +5386,12 @@ export default routerFactory((routes) => {
5254
5386
  },
5255
5387
  };
5256
5388
  });
5257
- `,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}}
5258
5390
  export { default as apiApp } from "{{ createImport 'api' 'app' }}";
5259
5391
  {{else}}
5260
5392
  export const apiApp = undefined;
5261
5393
  {{/if}}
5262
- `,tr=`import { AsyncLocalStorage } from "node:async_hooks";
5394
+ `,$n=`import { AsyncLocalStorage } from "node:async_hooks";
5263
5395
 
5264
5396
  import type { FetchApp, NodeApp } from "@kosmojs/core";
5265
5397
 
@@ -5303,7 +5435,7 @@ export const store = new AsyncLocalStorage<RequestContext>();
5303
5435
  export const isFetchApp = (app: FetchApp | NodeApp): app is FetchApp => {
5304
5436
  return typeof (app as FetchApp).fetch === "function";
5305
5437
  };
5306
- `,nr=`import { type RequestContext, store } from "./base";
5438
+ `,er=`import { type RequestContext, store } from "./base";
5307
5439
 
5308
5440
  import { renderWrapper } from "{{ createImport 'libEntry' 'server' }}";
5309
5441
 
@@ -5325,7 +5457,7 @@ export const withSsrContext = <T>(
5325
5457
  export const errorProvider = () => {
5326
5458
  return store.getStore()?.error;
5327
5459
  };
5328
- `,rr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
5460
+ `,tr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
5329
5461
  import type { Transport } from "@kosmojs/core/fetch";
5330
5462
 
5331
5463
  import {
@@ -5528,12 +5660,12 @@ const pathnameOf = (input: RequestInfo | URL): string => {
5528
5660
  } catch {}
5529
5661
  return String(input);
5530
5662
  };
5531
- `,ir=`export const routeMap = [
5663
+ `,nr=`export const routeMap = [
5532
5664
  {{#each pageRoutes}}
5533
5665
  { pathPattern: "{{honoPattern}}", renderMode: "{{renderMode}}" },
5534
5666
  {{/each}}
5535
5667
  ];
5536
- `,ar=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
5668
+ `,rr=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
5537
5669
  import {
5538
5670
  createServer,
5539
5671
  type IncomingMessage,
@@ -5557,6 +5689,7 @@ import { routeMap } from "{{ createImport 'lib' '@ssr/routes' }}";
5557
5689
  import { apiBase, base } from "{{ createImport 'libCore' }}";
5558
5690
 
5559
5691
  const ROOT = import.meta.dirname;
5692
+ const HEAD_CLOSE_PATTERN = /<\\/head\\s*>/i;
5560
5693
 
5561
5694
  type AssetInfo = {
5562
5695
  file: string;
@@ -5583,8 +5716,7 @@ export const createApp = async () => {
5583
5716
  errorProvider: () => Error | undefined;
5584
5717
  } = await import(\`\${ROOT}/app.js\`);
5585
5718
 
5586
- // Read the client index.html that includes <!--app-head--> and <!--app-html-->
5587
- // placeholders used for SSR injection.
5719
+ // Read the client index.html that includes <!--app-html--> placeholder
5588
5720
  const template = await readFile(\`\${ROOT}/index.html\`, "utf8");
5589
5721
 
5590
5722
  // Load the Vite manifest
@@ -5593,7 +5725,8 @@ export const createApp = async () => {
5593
5725
  }).then((e) => e.default);
5594
5726
 
5595
5727
  const { renderToString, renderToStream } = ssrApp;
5596
- const [htmlStart, htmlEnd] = template.split("<!--app-html-->");
5728
+
5729
+ const [htmlStart, htmlEnd = ""] = template.split(/<!--\\s*app-html\\s*-->/);
5597
5730
 
5598
5731
  const assets = await loadAssets(ROOT);
5599
5732
 
@@ -5639,6 +5772,17 @@ export const createApp = async () => {
5639
5772
  };
5640
5773
  };
5641
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
+
5642
5786
  const renderPage = async (url: URL, ctx: Context) => {
5643
5787
  const {
5644
5788
  head = "",
@@ -5669,23 +5813,20 @@ export const createApp = async () => {
5669
5813
  );
5670
5814
 
5671
5815
  if (error) {
5672
- console.error("WARN: SSR failed, fallback to CSR");
5816
+ const errorMessage = "WARN: SSR failed, fallback to CSR";
5817
+ console.error(errorMessage);
5673
5818
  console.error(error);
5674
5819
  console.error();
5675
5820
  return [
5676
- htmlStart.replace(
5677
- "<!--app-head-->",
5678
- \`<script>console.error("WARN: SSR failed, fallback to CSR")<\/script>\`,
5821
+ injectHead(
5822
+ htmlStart,
5823
+ \`<script>console.error("\${errorMessage}")<\/script>\`,
5679
5824
  ),
5680
5825
  htmlEnd,
5681
5826
  ].join("");
5682
5827
  }
5683
5828
 
5684
- return [
5685
- htmlStart.replace("<!--app-head-->", head),
5686
- html ?? "",
5687
- htmlEnd,
5688
- ].join("");
5829
+ return [injectHead(htmlStart, head), html ?? "", htmlEnd].join("");
5689
5830
  };
5690
5831
 
5691
5832
  const app = new Hono({ strict: false });
@@ -5710,7 +5851,7 @@ export const createApp = async () => {
5710
5851
  },
5711
5852
  () => renderToStream(url, ssrOptions(), stream as never),
5712
5853
  );
5713
- await stream.write(htmlStart.replace("<!--app-head-->", head));
5854
+ await stream.write(injectHead(htmlStart, head));
5714
5855
  await stream.pipe(html);
5715
5856
  await stream.write(htmlEnd);
5716
5857
  });
@@ -5949,14 +6090,14 @@ if (isMain) {
5949
6090
  process.exit(1);
5950
6091
  }
5951
6092
  }
5952
- `,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.38`,"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">
5953
6094
  import type { Snippet } from "svelte";
5954
6095
 
5955
6096
  let { children }: { children: Snippet } = $props();
5956
6097
  <\/script>
5957
6098
 
5958
6099
  {@render children()}
5959
- `,ur=`<script lang="ts">
6100
+ `,cr=`<script lang="ts">
5960
6101
  import { type QueryClient, QueryClientProvider } from "@tanstack/svelte-query";
5961
6102
  import type { Snippet } from "svelte";
5962
6103
 
@@ -5973,7 +6114,7 @@ if (isMain) {
5973
6114
  <QueryClientProvider client={queryClient}>
5974
6115
  {@render children()}
5975
6116
  </QueryClientProvider>
5976
- `,dr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
6117
+ `,lr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
5977
6118
  import type { RouterFactoryReturn } from "@kosmojs/core";
5978
6119
  import { clientRenderFactory } from "@kosmojs/core/generators";
5979
6120
 
@@ -6014,7 +6155,7 @@ export const mount = async (
6014
6155
  }
6015
6156
 
6016
6157
  export default clientRenderFactory();
6017
- `,fr=`import { render as renderOrig } from "svelte/server";
6158
+ `,ur=`import { render as renderOrig } from "svelte/server";
6018
6159
 
6019
6160
  import type {
6020
6161
  RenderToStringWrapper,
@@ -6080,12 +6221,12 @@ export const renderToString: RenderToStringWrapper<
6080
6221
  // svelte/server exposes only render() - no web-stream renderer -
6081
6222
  // so this folder is string-only SSR.
6082
6223
  export default serverRenderFactory<false>();
6083
- `,pr=`declare module "*.svelte" {
6224
+ `,dr=`declare module "*.svelte" {
6084
6225
  import type { Component } from "svelte";
6085
6226
  const component: Component;
6086
6227
  export default component;
6087
6228
  }
6088
- `,mr=`<script lang="ts">
6229
+ `,fr=`<script lang="ts">
6089
6230
  /**
6090
6231
  * Folds [app, ...layouts] around the page component.
6091
6232
  *
@@ -6119,7 +6260,7 @@ export default serverRenderFactory<false>();
6119
6260
  {/snippet}
6120
6261
 
6121
6262
  {@render layer(0)}
6122
- `,hr=`<script lang="ts">
6263
+ `,pr=`<script lang="ts">
6123
6264
  import styles from "./styles.module.css";
6124
6265
 
6125
6266
  let { headline }: { headline?: string } = $props();
@@ -6151,7 +6292,7 @@ export default serverRenderFactory<false>();
6151
6292
  </div>
6152
6293
  </div>
6153
6294
  </div>
6154
- `,gr=`<script lang="ts">
6295
+ `,mr=`<script lang="ts">
6155
6296
  import styles from "./styles.module.css";
6156
6297
 
6157
6298
  let {
@@ -6196,7 +6337,7 @@ export default serverRenderFactory<false>();
6196
6337
  </div>
6197
6338
  </div>
6198
6339
  </div>
6199
- `,_r=`* {
6340
+ `,hr=`* {
6200
6341
  margin: 0;
6201
6342
  padding: 0;
6202
6343
  box-sizing: border-box;
@@ -6331,7 +6472,7 @@ export default serverRenderFactory<false>();
6331
6472
  align-items: center;
6332
6473
  gap: 0.25rem;
6333
6474
  }
6334
- `,vr=`<script lang="ts">
6475
+ `,gr=`<script lang="ts">
6335
6476
  import styles from "./styles.module.css";
6336
6477
  <\/script>
6337
6478
 
@@ -6389,7 +6530,7 @@ export default serverRenderFactory<false>();
6389
6530
  </div>
6390
6531
  </div>
6391
6532
  </div>
6392
- `,yr=`export type ParamsMap = {
6533
+ `,_r=`export type ParamsMap = {
6393
6534
  {{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
6394
6535
  {{/each}}
6395
6536
  };
@@ -6398,7 +6539,7 @@ export const paramNames = {
6398
6539
  {{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
6399
6540
  {{/each}}
6400
6541
  } as const;
6401
- `,br=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6542
+ `,vr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6402
6543
 
6403
6544
  let client: QueryClient | undefined;
6404
6545
 
@@ -6413,7 +6554,7 @@ export const getQueryClient = (): QueryClient => {
6413
6554
  }
6414
6555
  return client;
6415
6556
  };
6416
- `,xr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6557
+ `,yr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6417
6558
 
6418
6559
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
6419
6560
 
@@ -6436,7 +6577,7 @@ export const getQueryClient = (): QueryClient => {
6436
6577
  }
6437
6578
  return ctx.tsqClient as QueryClient;
6438
6579
  };
6439
- `,Sr=`import type { RouterFactoryReturn } from "@kosmojs/core";
6580
+ `,br=`import type { RouterFactoryReturn } from "@kosmojs/core";
6440
6581
  import { createRouterFactory } from "@kosmojs/core/generators";
6441
6582
 
6442
6583
  import Layouts from "./Layouts.svelte";
@@ -6476,7 +6617,7 @@ export default createRouterFactory<
6476
6617
  Promise<RouteComponent>,
6477
6618
  { server: { route: Route } }
6478
6619
  >();
6479
- `,Cr=`import { match, pathToRegexp } from "path-to-regexp";
6620
+ `,xr=`import { match, pathToRegexp } from "path-to-regexp";
6480
6621
  import { type Component, createContext } from "svelte";
6481
6622
 
6482
6623
  import { parseSearchParams } from "@kosmojs/core";
@@ -6703,7 +6844,7 @@ export const createRoute = (
6703
6844
  layouts,
6704
6845
  };
6705
6846
  };
6706
- `,wr=`import { getRouteContext } from "./svelte";
6847
+ `,Sr=`import { getRouteContext } from "./svelte";
6707
6848
 
6708
6849
  import type { ParamsMap, paramNames } from "{{ createImport 'lib' 'params' }}";
6709
6850
 
@@ -6743,7 +6884,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6743
6884
  const route = useRoute();
6744
6885
  return route.loaderData?.[key || route.name] as T;
6745
6886
  };
6746
- `,Tr=`<script lang="ts">
6887
+ `,Cr=`<script lang="ts">
6747
6888
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
6748
6889
  import type { Snippet } from "svelte";
6749
6890
 
@@ -6753,7 +6894,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6753
6894
  <AppProvider>
6754
6895
  {@render children()}
6755
6896
  </AppProvider>
6756
- `,Er=`<script lang="ts">
6897
+ `,wr=`<script lang="ts">
6757
6898
  import type { Snippet } from "svelte";
6758
6899
  import type { HTMLAnchorAttributes } from "svelte/elements";
6759
6900
 
@@ -6777,7 +6918,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6777
6918
  <\/script>
6778
6919
 
6779
6920
  <a {href} {...rest}>{@render children?.()}</a>
6780
- `,Dr=`import renderFactory, {
6921
+ `,Tr=`import renderFactory, {
6781
6922
  createRoutes,
6782
6923
  hydrate,
6783
6924
  mount,
@@ -6804,7 +6945,7 @@ if (root) {
6804
6945
  } else {
6805
6946
  console.error("❌ Root element not found!");
6806
6947
  }
6807
- `,Or=`import renderFactory, {
6948
+ `,Er=`import renderFactory, {
6808
6949
  createRoutes,
6809
6950
  renderToString,
6810
6951
  // no renderToStream on Svelte folders
@@ -6825,31 +6966,19 @@ export default renderFactory(() => {
6825
6966
  },
6826
6967
  };
6827
6968
  });
6828
- `,kr=`<!doctype html>
6829
- <html lang="en">
6830
- <head>
6831
- <meta charset="UTF-8" />
6832
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6833
- <!--app-head-->
6834
- </head>
6835
- <body>
6836
- <div id="app"><!--app-html--></div>
6837
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
6838
- </body>
6839
- </html>
6840
- `,Ar=`<script lang="ts">
6969
+ `,Dr=`<script lang="ts">
6841
6970
  import PageSample from "{{ createImport 'lib' 'pageSamples/404.svelte' }}";
6842
6971
  <\/script>
6843
6972
 
6844
6973
  <PageSample />
6845
- `,jr=`<script lang="ts">
6974
+ `,Or=`<script lang="ts">
6846
6975
  import type { Snippet } from "svelte";
6847
6976
 
6848
6977
  let { children }: { children: Snippet } = $props();
6849
6978
  <\/script>
6850
6979
 
6851
6980
  {@render children()}
6852
- `,Mr=`<script lang="ts">
6981
+ `,kr=`<script lang="ts">
6853
6982
  import PageSample from "{{ createImport 'lib' 'pageSamples/page.svelte' }}";
6854
6983
 
6855
6984
  const pathMap = {
@@ -6868,7 +6997,7 @@ export default renderFactory(() => {
6868
6997
  routeName={"{{route.name}}"}
6869
6998
  {pathMap}
6870
6999
  />
6871
- `,Nr=`<script lang="ts">
7000
+ `,Ar=`<script lang="ts">
6872
7001
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.svelte' }}";
6873
7002
  <\/script>
6874
7003
 
@@ -6881,7 +7010,7 @@ export default renderFactory(() => {
6881
7010
  </svelte:head>
6882
7011
 
6883
7012
  <WelcomePage />
6884
- `,Pr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
7013
+ `,jr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
6885
7014
 
6886
7015
  import app from "./app.svelte";
6887
7016
 
@@ -6896,7 +7025,7 @@ export default routerFactory((routes) => {
6896
7025
  },
6897
7026
  };
6898
7027
  });
6899
- `,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.16`}},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";
6900
7029
 
6901
7030
  /**
6902
7031
  * Custom types for JavaScript constructs that have no JSON Schema
@@ -6968,13 +7097,13 @@ export default {
6968
7097
  Buffer: TBuffer(),
6969
7098
  ArrayBuffer: TArrayBuffer(),
6970
7099
  };
6971
- `,zr=`import type { TValidationError } from "typebox/error";
7100
+ `,Ir=`import type { TValidationError } from "typebox/error";
6972
7101
 
6973
7102
  import type { ValidationErrorEntry } from "@kosmojs/core";
6974
7103
 
6975
7104
  /**
6976
7105
  * Message codes for i18n/l10n support
6977
- */
7106
+ * */
6978
7107
  export const MESSAGE_CODES = {
6979
7108
  // Generic messages
6980
7109
 
@@ -7164,7 +7293,7 @@ export type ValidationMessages = typeof MESSAGE_CODES;
7164
7293
  *
7165
7294
  * Usage: format(ERROR_MESSAGES[ErrorCode.STRING_MIN_LENGTH], 5)
7166
7295
  * Result: "must be at least 5 characters long"
7167
- */
7296
+ * */
7168
7297
  const MESSAGE_MAP: Record<keyof ValidationMessages, string> = {
7169
7298
  // Generic messages
7170
7299
 
@@ -7284,7 +7413,7 @@ const MESSAGE_MAP: Record<keyof ValidationMessages, string> = {
7284
7413
  * Comprehensive error handler for TypeBox validation errors.
7285
7414
  * Supports most JSON Schema validation keywords and produces human-friendly messages
7286
7415
  * with i18n/l10n support through message code mapping.
7287
- */
7416
+ * */
7288
7417
  export const errorHandlerFactory = (
7289
7418
  customMessages?: Partial<Record<keyof ValidationMessages, string>>,
7290
7419
  ) => {
@@ -7292,7 +7421,7 @@ export const errorHandlerFactory = (
7292
7421
 
7293
7422
  /**
7294
7423
  * Formats the instancePath into a human-readable field name
7295
- */
7424
+ * */
7296
7425
  function formatFieldPath(instancePath: string, schemaPath?: string): string {
7297
7426
  if (!instancePath?.trim?.()) {
7298
7427
  return "root";
@@ -7330,7 +7459,7 @@ export const errorHandlerFactory = (
7330
7459
 
7331
7460
  /**
7332
7461
  * Pluralizes a word based on count
7333
- */
7462
+ * */
7334
7463
  function pluralize(
7335
7464
  count: number,
7336
7465
  plural: string = messageMap[MESSAGE_CODES.PLURAL_SUFFIX],
@@ -7340,7 +7469,7 @@ export const errorHandlerFactory = (
7340
7469
 
7341
7470
  /**
7342
7471
  * Maps validation error to error code and formats message
7343
- */
7472
+ * */
7344
7473
  function getErrorCodeAndMessage(error: TValidationError): {
7345
7474
  code: keyof ValidationMessages;
7346
7475
  message: string;
@@ -7760,7 +7889,7 @@ export const errorHandlerFactory = (
7760
7889
  * TODO: Periodically check the TypeBox repository for implementation updates.
7761
7890
  * Some validation cases (minContains, prefixItems, etc.) are not yet
7762
7891
  * implemented by TypeBox, so they are commented out below.
7763
- */
7892
+ * */
7764
7893
 
7765
7894
  /**
7766
7895
  case "minContains": {
@@ -7914,7 +8043,7 @@ export const errorHandlerFactory = (
7914
8043
  ),
7915
8044
  };
7916
8045
  }
7917
- */
8046
+ * */
7918
8047
 
7919
8048
  // Default fallback
7920
8049
  default: {
@@ -7925,7 +8054,7 @@ export const errorHandlerFactory = (
7925
8054
 
7926
8055
  /**
7927
8056
  * Groups errors by field to avoid duplicate messages
7928
- */
8057
+ * */
7929
8058
  function groupErrorsByField(
7930
8059
  errors: TValidationError[],
7931
8060
  ): Map<string, TValidationError[]> {
@@ -7944,7 +8073,7 @@ export const errorHandlerFactory = (
7944
8073
 
7945
8074
  /**
7946
8075
  * Prioritizes errors to show the most important one per field
7947
- */
8076
+ * */
7948
8077
  function prioritizeErrors(errors: TValidationError[]): TValidationError {
7949
8078
  // Priority order: required > type > format > const/enum > other constraints
7950
8079
  const priority: Record<string, number> = {
@@ -7973,13 +8102,51 @@ export const errorHandlerFactory = (
7973
8102
  })[0];
7974
8103
  }
7975
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
+
7976
8143
  // ============================================================================
7977
8144
  // Public API
7978
8145
  // ============================================================================
7979
8146
 
7980
8147
  /**
7981
8148
  * Main function to format validation errors
7982
- */
8149
+ * */
7983
8150
  function formatValidationErrors(
7984
8151
  errors: TValidationError[],
7985
8152
  options: {
@@ -8014,7 +8181,7 @@ export const errorHandlerFactory = (
8014
8181
  const formatted: ValidationErrorEntry[] = [];
8015
8182
 
8016
8183
  for (const [_, fieldErrors] of grouped) {
8017
- const prioritized = prioritizeErrors(fieldErrors);
8184
+ const prioritized = prioritizeErrors(collapseLiteralUnion(fieldErrors));
8018
8185
  const { code, message } = getErrorCodeAndMessage(prioritized);
8019
8186
  formatted.push({
8020
8187
  keyword: prioritized.keyword,
@@ -8046,7 +8213,7 @@ export const errorHandlerFactory = (
8046
8213
 
8047
8214
  /**
8048
8215
  * Formats errors into a single human-readable message
8049
- */
8216
+ * */
8050
8217
  function formatValidationErrorMessage(
8051
8218
  errors: TValidationError[],
8052
8219
  options: {
@@ -8075,7 +8242,7 @@ export const errorHandlerFactory = (
8075
8242
 
8076
8243
  /**
8077
8244
  * Gets a simple error summary for quick feedback
8078
- */
8245
+ * */
8079
8246
  function getErrorSummary(errors: TValidationError[]): string {
8080
8247
  if (!errors?.length) {
8081
8248
  return messageMap[MESSAGE_CODES.VALIDATION_PASSED];
@@ -8152,7 +8319,7 @@ const format = (fmt: string, ...args: unknown[]): string => {
8152
8319
 
8153
8320
  return str;
8154
8321
  };
8155
- `,Br=`import Type from "typebox";
8322
+ `,Lr=`import Type from "typebox";
8156
8323
  import { Compile } from "typebox/compile";
8157
8324
  import Value from "typebox/value";
8158
8325
 
@@ -8204,14 +8371,14 @@ export const validationSchemaFactory = (
8204
8371
  },
8205
8372
  };
8206
8373
  };
8207
- `,Vr=`import { Settings } from "typebox/system";
8374
+ `,Rr=`import { Settings } from "typebox/system";
8208
8375
 
8209
8376
  Settings.Set({{settings}});
8210
8377
 
8211
8378
  export { default as customTypes } from "{{customTypesImport}}";
8212
8379
 
8213
8380
  export const validationMessages = {{validationMessages}};
8214
- `,Hr=`import type { ValidationSchemas } from "@kosmojs/core";
8381
+ `,zr=`import type { ValidationSchemas } from "@kosmojs/core";
8215
8382
 
8216
8383
  import { validationSchemaFactory } from "{{ createImport 'lib' '@typebox' }}";
8217
8384
 
@@ -8272,14 +8439,14 @@ export const validationSchemas: ValidationSchemas = {
8272
8439
  {{/each}}
8273
8440
  },
8274
8441
  };
8275
- `,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.101.4`,"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";
8276
8443
 
8277
8444
  export { default as AppProvider } from "./provider.vue";
8278
8445
 
8279
8446
  export const appProvider: Plugin = {
8280
8447
  install() {},
8281
8448
  };
8282
- `,Yr=`import { VueQueryPlugin } from "@tanstack/vue-query";
8449
+ `,Kr=`import { VueQueryPlugin } from "@tanstack/vue-query";
8283
8450
  import type { Plugin } from "vue";
8284
8451
 
8285
8452
  import { getQueryClient } from "../query";
@@ -8291,10 +8458,10 @@ export const appProvider: Plugin = {
8291
8458
  app.use(VueQueryPlugin, { queryClient: getQueryClient() });
8292
8459
  },
8293
8460
  };
8294
- `,Xr=`<template>
8461
+ `,$=`<template>
8295
8462
  <slot />
8296
8463
  </template>
8297
- `,Zr=`import type { App } from "vue";
8464
+ `,qr=`import type { App } from "vue";
8298
8465
  import type { RouterFactoryReturn } from "@kosmojs/core";
8299
8466
  import { clientRenderFactory } from "@kosmojs/core/generators";
8300
8467
 
@@ -8334,7 +8501,7 @@ export const mount = async (
8334
8501
  }
8335
8502
 
8336
8503
  export default clientRenderFactory();
8337
- `,Qr=`{
8504
+ `,Jr=`{
8338
8505
  path: "{{path}}",
8339
8506
  {{#if name}}
8340
8507
  name: "{{name}}",
@@ -8352,7 +8519,7 @@ export default clientRenderFactory();
8352
8519
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
8353
8520
  {{/if}}
8354
8521
  }
8355
- `,$r=`import type { App } from "vue";
8522
+ `,Yr=`import type { App } from "vue";
8356
8523
 
8357
8524
  import {
8358
8525
  renderToString as renderToStringOrig,
@@ -8443,12 +8610,12 @@ export const renderToStream: RenderToStreamWrapper<
8443
8610
  }
8444
8611
 
8445
8612
  export default serverRenderFactory();
8446
- `,$=`declare module "*.vue" {
8613
+ `,Xr=`declare module "*.vue" {
8447
8614
  import type { DefineComponent } from "vue";
8448
8615
  const component: DefineComponent<{}, {}, any>;
8449
8616
  export default component;
8450
8617
  }
8451
- `,ei=`<script setup lang="ts">
8618
+ `,Zr=`<script setup lang="ts">
8452
8619
  import styles from "./styles.module.css";
8453
8620
  defineProps<{
8454
8621
  headline?: string;
@@ -8487,7 +8654,7 @@ defineProps<{
8487
8654
  </div>
8488
8655
  </div>
8489
8656
  </template>
8490
- `,ti=`<script setup lang="ts">
8657
+ `,Qr=`<script setup lang="ts">
8491
8658
  import styles from "./styles.module.css";
8492
8659
  defineProps<{
8493
8660
  message: string;
@@ -8536,7 +8703,7 @@ defineProps<{
8536
8703
  </div>
8537
8704
  </div>
8538
8705
  </template>
8539
- `,ni=`* {
8706
+ `,$r=`* {
8540
8707
  margin: 0;
8541
8708
  padding: 0;
8542
8709
  box-sizing: border-box;
@@ -8669,7 +8836,7 @@ defineProps<{
8669
8836
  align-items: center;
8670
8837
  gap: 0.25rem;
8671
8838
  }
8672
- `,ri=`<script setup lang="ts">
8839
+ `,ei=`<script setup lang="ts">
8673
8840
  import styles from "./styles.module.css";
8674
8841
  <\/script>
8675
8842
 
@@ -8733,7 +8900,7 @@ import styles from "./styles.module.css";
8733
8900
  </div>
8734
8901
  </div>
8735
8902
  </template>
8736
- `,ii=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8903
+ `,ti=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8737
8904
 
8738
8905
  let client: QueryClient | undefined;
8739
8906
 
@@ -8748,7 +8915,7 @@ export const getQueryClient = (): QueryClient => {
8748
8915
  }
8749
8916
  return client;
8750
8917
  };
8751
- `,ai=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8918
+ `,ni=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8752
8919
 
8753
8920
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
8754
8921
 
@@ -8771,7 +8938,7 @@ export const getQueryClient = (): QueryClient => {
8771
8938
  }
8772
8939
  return ctx.tsqClient as QueryClient;
8773
8940
  };
8774
- `,oi=`import {
8941
+ `,ri=`import {
8775
8942
  type App,
8776
8943
  type Component,
8777
8944
  createApp,
@@ -8902,7 +9069,7 @@ export const createRouters = (
8902
9069
 
8903
9070
  let { pathname } = url;
8904
9071
 
8905
- if (base !== "/") {
9072
+ if ((base as string) !== "/") {
8906
9073
  // strip the base from pushed paths
8907
9074
  if (pathname === base) {
8908
9075
  pathname = "/";
@@ -8933,14 +9100,14 @@ export default createRouterFactory<
8933
9100
  Promise<App>,
8934
9101
  { server: { loaderData: Record<string, unknown> } }
8935
9102
  >();
8936
- `,si=`import { type Ref, unref } from "vue";
9103
+ `,ii=`import { type Ref, unref } from "vue";
8937
9104
 
8938
9105
  export type MaybeWrapped<T> = Ref<T> | T;
8939
9106
 
8940
9107
  export function unwrap<T>(value: MaybeWrapped<T>): T {
8941
9108
  return unref(value);
8942
9109
  }
8943
- `,ci=`import { useRoute, useRouter } from "vue-router";
9110
+ `,ai=`import { useRoute, useRouter } from "vue-router";
8944
9111
 
8945
9112
  import type { RouterWithLoaderData } from "./router";
8946
9113
 
@@ -8955,7 +9122,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
8955
9122
  const route = useRoute();
8956
9123
  return router.__loaderData?.[key || (route.name as string)] as T;
8957
9124
  };
8958
- `,li=`<script setup lang="ts">
9125
+ `,oi=`<script setup lang="ts">
8959
9126
  import { AppProvider } from "_/app";
8960
9127
  <\/script>
8961
9128
 
@@ -8964,7 +9131,7 @@ import { AppProvider } from "_/app";
8964
9131
  <RouterView />
8965
9132
  </AppProvider>
8966
9133
  </template>
8967
- `,ui=`<script setup lang="ts" generic="T extends LinkProps">
9134
+ `,si=`<script setup lang="ts" generic="T extends LinkProps">
8968
9135
  import { computed } from "vue";
8969
9136
  import { RouterLink } from "vue-router";
8970
9137
 
@@ -8997,7 +9164,7 @@ const linkProps = computed(() => ({
8997
9164
  <slot />
8998
9165
  </RouterLink>
8999
9166
  </template>
9000
- `,di=`import renderFactory, {
9167
+ `,ci=`import renderFactory, {
9001
9168
  createRoutes,
9002
9169
  hydrate,
9003
9170
  mount,
@@ -9024,7 +9191,7 @@ if (root) {
9024
9191
  } else {
9025
9192
  console.error("❌ Root element not found!");
9026
9193
  }
9027
- `,fi=`import renderFactory, {
9194
+ `,li=`import renderFactory, {
9028
9195
  createRoutes,
9029
9196
  renderToStream,
9030
9197
  renderToString,
@@ -9051,29 +9218,17 @@ export default renderFactory(() => {
9051
9218
  },
9052
9219
  };
9053
9220
  });
9054
- `,pi=`<!doctype html>
9055
- <html lang="en">
9056
- <head>
9057
- <meta charset="UTF-8" />
9058
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9059
- <!--app-head-->
9060
- </head>
9061
- <body>
9062
- <div id="app"><!--app-html--></div>
9063
- <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
9064
- </body>
9065
- </html>
9066
- `,mi=`<script setup lang="ts">
9221
+ `,ui=`<script setup lang="ts">
9067
9222
  import PageSample from "{{ createImport 'lib' 'pageSamples/404.vue' }}";
9068
9223
  <\/script>
9069
9224
 
9070
9225
  <template>
9071
9226
  <PageSample />
9072
9227
  </template>
9073
- `,hi=`<template>
9228
+ `,di=`<template>
9074
9229
  <router-view />
9075
9230
  </template>
9076
- `,gi=`<script setup lang="ts">
9231
+ `,fi=`<script setup lang="ts">
9077
9232
  import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
9078
9233
  <\/script>
9079
9234
 
@@ -9088,14 +9243,14 @@ import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
9088
9243
  }"
9089
9244
  />
9090
9245
  </template>
9091
- `,_i=`<script setup lang="ts">
9246
+ `,pi=`<script setup lang="ts">
9092
9247
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.vue' }}";
9093
9248
  <\/script>
9094
9249
 
9095
9250
  <template>
9096
9251
  <WelcomePage />
9097
9252
  </template>
9098
- `,vi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
9253
+ `,mi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
9099
9254
  import { appProvider } from "{{ createImport 'lib' 'app' }}";
9100
9255
 
9101
9256
  import app from "./app.vue";
@@ -9114,5 +9269,5 @@ export default routerFactory((routes) => {
9114
9269
  },
9115
9270
  };
9116
9271
  });
9117
- `,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};
9118
9273
  //# sourceMappingURL=index.js.map