@kosmojs/dev 0.4.0 → 0.4.1

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-DU-tTiIp.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,defineGenerator as p,defineGeneratorFactory as m,mergeConfigs as h,nestedRoutesFactory as g,pathResolver as _,pathTokensFactory as v,renderFactory as y,renderToFile as ee,sortRoutes as b,spinnerFactory as te,vitePlugins as x}from"@kosmojs/lib";import{routeRenderHelpers as S}from"@kosmojs/core/generators";import C from"crc/crc32";import ne from"@mdx-js/rollup";import{build as w,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 T from"vite-plugin-solid";import{access as ce,constants as le,cp as E,mkdir as ue,rm as D,writeFile as de}from"node:fs/promises";import{svelte as fe}from"@sveltejs/vite-plugin-svelte";import pe from"@vitejs/plugin-vue";var O=`export * from "./transport";
2
- `,k=`export const transport = undefined;
3
- `,A=`{{#each routes}}
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}}
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
- `,j=`import fetchFactory, { join } from "@kosmojs/core/fetch";
21
+ `,N=`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
- `,M=`export type MaybeWrapped<T> = T;
121
+ `,P=`export type MaybeWrapped<T> = T;
122
122
  export const unwrap = <T>(data: T) => data;
123
- `,N=m(e=>{let{createPath:t,createImportHelpers:n}=_(e),{renderToFile:r}=y({helpers:{...n({origin:`lib`}),...S()}}),i=async(e,n)=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]).sort(b);await r(t.lib(`fetch.ts`),A,{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`),j,{route:i,validationTypes:e,routeMethods:n,responseTypes:a})}};return{async start(){for(let[e,n]of[[`unwrap.ts`,M],[`@fetch/transport.ts`,k],[`@fetch/index.ts`,O]])await r(t.lib(e),n,{})},async watch(e,t){await i(e,t?e.filter(({kind:e,entry:n})=>t.kind===`update`&&e===`apiRoute`&&n.fileFullpath===t.file):e)},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,{})}}}),P=p({meta:{name:`Fetch`,slot:`fetch`},factory:N}),F={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`}},I=`import { H3, type Middleware } from "h3";
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";
124
124
 
125
125
  import type { Route, RouteDebugOption } from "@kosmojs/core/api";
126
126
 
@@ -181,10 +181,12 @@ export function appFactory(
181
181
 
182
182
  return app;
183
183
  }
184
- `,L=`import type { DevSetup } from "@kosmojs/core/api";
184
+ `,z=`import type { DevSetup } from "@kosmojs/core/api";
185
185
 
186
186
  export const devSetup = (setup: DevSetup) => setup;
187
- `,R=`import type { H3Event } from "h3";
187
+ `,B=`import { type H3Event, HTTPError } from "h3";
188
+
189
+ import { ValidationError } from "@kosmojs/core/errors";
188
190
 
189
191
  type ErrorHandler = (
190
192
  error: any,
@@ -194,9 +196,19 @@ type ErrorHandler = (
194
196
  export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
195
197
 
196
198
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
197
- return handler;
199
+ // H3 wraps errors in its own HTTPError with the original error as \`cause\`
200
+ return (error, event) => {
201
+ return handler(
202
+ error instanceof HTTPError
203
+ ? error.cause instanceof ValidationError
204
+ ? error.cause
205
+ : error
206
+ : error,
207
+ event,
208
+ );
209
+ };
198
210
  };
199
- `,z=`import { type H3Event, readBody } from "h3";
211
+ `,me=`import { type H3Event, readBody } from "h3";
200
212
 
201
213
  import {
202
214
  parseCookies,
@@ -236,7 +248,7 @@ export const bodyparsers: {
236
248
  return event.req.text();
237
249
  },
238
250
  };
239
- `,B=`import type { Middleware } from "h3";
251
+ `,he=`import type { Middleware } from "h3";
240
252
 
241
253
  import type {
242
254
  RequestBodyTarget,
@@ -423,18 +435,39 @@ export const createRouteMiddleware: CreateRouteMiddleware<
423
435
  // run all downstream middleware (including the route handler)
424
436
  const body = await next();
425
437
 
438
+ /**
439
+ * H3 builds the actual Response AFTER the middleware chain completes,
440
+ * so at this point event.res only reflects what handlers set explicitly.
441
+ * Reconstruct what will be sent instead: a returned Response is authoritative;
442
+ * otherwise an unset status means 200, and the content type follows H3's
443
+ * serialization rules for the returned value (string -> text, object -> JSON).
444
+ * */
445
+ const rawResponse = body instanceof Response ? body : undefined;
446
+
426
447
  const response: {
427
448
  status: number;
428
449
  contentType: string | null;
429
450
  body?: unknown;
430
451
  } = {
431
- status: event.res.status ?? -1,
432
- contentType: event.res.headers.get("Content-Type"),
452
+ status: rawResponse?.status ?? event.res.status ?? 200,
453
+ contentType:
454
+ rawResponse?.headers.get("Content-Type") ??
455
+ event.res.headers.get("Content-Type") ??
456
+ (typeof body === "string"
457
+ ? "text/plain"
458
+ : body === undefined || body === null
459
+ ? null
460
+ : "application/json"),
433
461
  };
434
462
 
435
463
  // Validate body only for JSON variants
436
464
  if (variants.some((e) => e.contentType?.includes("json"))) {
437
- response.body = body;
465
+ response.body = rawResponse
466
+ ? await rawResponse
467
+ .clone()
468
+ .json()
469
+ .catch(() => undefined)
470
+ : body;
438
471
  }
439
472
 
440
473
  /**
@@ -454,7 +487,7 @@ export const createRouteMiddleware: CreateRouteMiddleware<
454
487
  : {
455
488
  keyword: "Status",
456
489
  path: \`Variant #\${i}\`,
457
- message: \`expected: \${schema.status}; actual: \${event.res.status}\`,
490
+ message: \`expected: \${schema.status}; actual: \${response.status}\`,
458
491
  };
459
492
  },
460
493
  (i) => {
@@ -595,7 +628,7 @@ export const routes = createRoutes<ParameterizedMiddleware, Middleware>(
595
628
  createRouteMiddleware,
596
629
  },
597
630
  );
598
- `,me=`import { join } from "node:path";
631
+ `,ge=`import { join } from "node:path";
599
632
 
600
633
  import type { RouteSource } from "@kosmojs/core/api";
601
634
 
@@ -640,7 +673,7 @@ export const routeSources: Array<RouteSource<never>> = [
640
673
  },
641
674
  {{/each}}
642
675
  ];
643
- `,he=`import { parseArgs, styleText } from "node:util";
676
+ `,_e=`import { parseArgs, styleText } from "node:util";
644
677
 
645
678
  import { serve as h3serve } from "h3";
646
679
 
@@ -688,7 +721,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
688
721
 
689
722
  return server as never;
690
723
  };
691
- `,ge=`import type { H3Event, H3EventContext } from "h3";
724
+ `,ve=`import type { H3Event, H3EventContext } from "h3";
692
725
 
693
726
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
694
727
  import {
@@ -835,14 +868,14 @@ export const defineRoute: <
835
868
  use: use as never,
836
869
  });
837
870
  };
838
- `,_e=`export * from "./@api/app";
871
+ `,ye=`export * from "./@api/app";
839
872
  export { appFactory as default } from "./@api/app";
840
873
  export * from "./@api/dev";
841
874
  export * from "./@api/errors";
842
875
  export * from "./@api/router";
843
876
  export * from "./@api/routes";
844
877
  export * from "./@api/server";
845
- `,ve=`import { onError } from "h3";
878
+ `,be=`import { onError } from "h3";
846
879
 
847
880
  import appFactory, { routes, type App } from "{{ createImport 'lib' 'api:factory' }}";
848
881
  import defaultErrorHandler from "./errors";
@@ -850,7 +883,7 @@ import defaultErrorHandler from "./errors";
850
883
  export default appFactory(routes, ({ app }) => {
851
884
  app.use(onError(defaultErrorHandler));
852
885
  }) as App;
853
- `,ye=`import { toNodeHandler } from "h3/node";
886
+ `,xe=`import { toNodeHandler } from "h3/node";
854
887
 
855
888
  import app from "./app";
856
889
 
@@ -870,10 +903,10 @@ process.on("unhandledRejection", (reason) => {
870
903
  console.error("Reason:", reason);
871
904
  process.exit(1);
872
905
  });
873
- `,be=`export declare module "{{ createImport 'libApi' }}" {
906
+ `,Se=`export declare module "{{ createImport 'libApi' }}" {
874
907
  interface DefaultContext {}
875
908
  }
876
- `,xe=`import { ValidationError } from "@kosmojs/core/errors";
909
+ `,Ce=`import { ValidationError } from "@kosmojs/core/errors";
877
910
  import { HTTPError } from "h3";
878
911
 
879
912
  import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
@@ -899,14 +932,14 @@ export default errorHandlerFactory(async (error, event) => {
899
932
  headers: { "Content-Type": "text/plain" },
900
933
  });
901
934
  });
902
- `,Se=`import { defineRoute } from "{{ createImport 'libApi' }}";
935
+ `,we=`import { defineRoute } from "{{ createImport 'libApi' }}";
903
936
 
904
937
  export default defineRoute<"{{route.name}}">(({ GET }) => [
905
938
  GET(async (event) => {
906
939
  return "Automatically generated route";
907
940
  }),
908
941
  ]);
909
- `,Ce=`import { use } from "{{ createImport 'libApi' }}";
942
+ `,Te=`import { use } from "{{ createImport 'libApi' }}";
910
943
 
911
944
  export type UseT = {};
912
945
 
@@ -915,11 +948,11 @@ export default [
915
948
  return next();
916
949
  }),
917
950
  ];
918
- `,we=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
951
+ `,Ee=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
919
952
  import app from "./app";
920
953
 
921
954
  await serve(app);
922
- `,Te=`import { use } from "{{ createImport 'libApi' }}";
955
+ `,De=`import { use } from "{{ createImport 'libApi' }}";
923
956
 
924
957
  /**
925
958
  * Define global middleware applied to all routes.
@@ -930,7 +963,7 @@ export default [
930
963
  return next();
931
964
  }),
932
965
  ];
933
- `,Ee=m((e,n)=>{let{createPath:r,createImportHelpers:i}=_(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=y({helpers:{...i({origin:`lib`}),...S(),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}=y({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,d=c(n?.templates,Se),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),Ce,{},{overwrite:l})},p=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=v(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${C(e)}`,alias:u(n),pathTokens:n}]:[]})]}).sort(b);for(let[e,t]of[[`@api/routes.ts`,me]])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`,ge],[`api:factory.ts`,_e],[`@api/app.ts`,I],[`@api/parsers.ts`,z],[`@api/dev.ts`,L],[`@api/errors.ts`,R],[`@api/router.ts`,B],[`@api/server.ts`,he]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,ve],[`dev.ts`,ye],[`errors.ts`,xe],[`server.ts`,we],[`use.ts`,Te],[`env.d.ts`,be]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){(!t||t.kind===`create`)&&await f(e),await p(e)},async build(e){await f(e),await p(e)}}}),De=p({meta:{name:`H3`,slot:`backend`},dependencies:{h3:F.devDependencies.h3},factory:Ee}),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`}},Oe=`import { Hono, type MiddlewareHandler } from "hono";
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";
934
967
  import type { Router } from "hono/router";
935
968
  import { RegExpRouter } from "hono/router/reg-exp-router";
936
969
  import { SmartRouter } from "hono/router/smart-router";
@@ -1002,10 +1035,10 @@ export function appFactory(
1002
1035
 
1003
1036
  return app as never;
1004
1037
  }
1005
- `,ke=`import type { DevSetup } from "@kosmojs/core/api";
1038
+ `,je=`import type { DevSetup } from "@kosmojs/core/api";
1006
1039
 
1007
1040
  export const devSetup = (setup: DevSetup) => setup;
1008
- `,Ae=`import type { Context } from "hono";
1041
+ `,Me=`import type { Context } from "hono";
1009
1042
 
1010
1043
  import type { AppEnv } from "./app";
1011
1044
 
@@ -1019,7 +1052,7 @@ export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
1019
1052
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
1020
1053
  return handler;
1021
1054
  };
1022
- `,je=`import type { Context } from "hono";
1055
+ `,Ne=`import type { Context } from "hono";
1023
1056
 
1024
1057
  import {
1025
1058
  parseCookies,
@@ -1068,7 +1101,7 @@ export const bodyparsers: {
1068
1101
  return ctx.req[as]();
1069
1102
  },
1070
1103
  };
1071
- `,Me=`import type { MiddlewareHandler } from "hono";
1104
+ `,Pe=`import type { MiddlewareHandler } from "hono";
1072
1105
 
1073
1106
  import type {
1074
1107
  RequestBodyTarget,
@@ -1435,7 +1468,7 @@ export const routes = createRoutes<ParameterizedMiddleware, MiddlewareHandler>(
1435
1468
  createRouteMiddleware,
1436
1469
  },
1437
1470
  );
1438
- `,Ne=`import { join } from "node:path";
1471
+ `,Fe=`import { join } from "node:path";
1439
1472
 
1440
1473
  import type { RouteSource } from "@kosmojs/core/api";
1441
1474
 
@@ -1480,7 +1513,7 @@ export const routeSources: Array<RouteSource<never>> = [
1480
1513
  },
1481
1514
  {{/each}}
1482
1515
  ];
1483
- `,Pe=`import { chmod, unlink } from "node:fs/promises";
1516
+ `,Ie=`import { chmod, unlink } from "node:fs/promises";
1484
1517
  import { parseArgs, styleText } from "node:util";
1485
1518
 
1486
1519
  import { createAdaptorServer } from "@hono/node-server";
@@ -1565,7 +1598,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
1565
1598
 
1566
1599
  return server as never;
1567
1600
  };
1568
- `,Fe=`import type { Context, Next } from "hono";
1601
+ `,Le=`import type { Context, Next } from "hono";
1569
1602
 
1570
1603
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
1571
1604
  import {
@@ -1748,20 +1781,20 @@ export const defineRoute: <
1748
1781
  use: use as never,
1749
1782
  });
1750
1783
  };
1751
- `,Ie=`export * from "./@api/app";
1784
+ `,Re=`export * from "./@api/app";
1752
1785
  export { appFactory as default } from "./@api/app";
1753
1786
  export * from "./@api/dev";
1754
1787
  export * from "./@api/errors";
1755
1788
  export * from "./@api/router";
1756
1789
  export * from "./@api/routes";
1757
1790
  export * from "./@api/server";
1758
- `,Le=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
1791
+ `,ze=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
1759
1792
  import defaultErrorHandler from "./errors";
1760
1793
 
1761
1794
  export default appFactory(routes, ({ app }) => {
1762
1795
  app.onError(defaultErrorHandler);
1763
1796
  })
1764
- `,Re=`import { getRequestListener } from "@hono/node-server";
1797
+ `,Be=`import { getRequestListener } from "@hono/node-server";
1765
1798
 
1766
1799
  import app from "./app";
1767
1800
 
@@ -1782,11 +1815,11 @@ process.on("unhandledRejection", (reason) => {
1782
1815
  process.exit(1);
1783
1816
  });
1784
1817
 
1785
- `,ze=`export declare module "{{ createImport 'libApi' }}" {
1818
+ `,Ve=`export declare module "{{ createImport 'libApi' }}" {
1786
1819
  interface DefaultVariables {}
1787
1820
  interface DefaultBindings {}
1788
1821
  }
1789
- `,Be=`import { accepts } from "hono/accepts";
1822
+ `,He=`import { accepts } from "hono/accepts";
1790
1823
  import { HTTPException } from "hono/http-exception";
1791
1824
 
1792
1825
  import { ValidationError, HTTPError } from "@kosmojs/core/errors";
@@ -1818,7 +1851,7 @@ export default errorHandlerFactory(async (error, ctx) => {
1818
1851
  ? ctx.json({ error: message }, status)
1819
1852
  : ctx.text(message, status);
1820
1853
  });
1821
- `,Ve=`import { defineRoute } from "{{ createImport 'libApi' }}";
1854
+ `,Ue=`import { defineRoute } from "{{ createImport 'libApi' }}";
1822
1855
 
1823
1856
  export default defineRoute<"{{route.name}}">(({ GET }) => [
1824
1857
  GET(async (ctx) => {
@@ -1827,7 +1860,7 @@ export default defineRoute<"{{route.name}}">(({ GET }) => [
1827
1860
  return ctx.text("Automatically generated route");
1828
1861
  }),
1829
1862
  ]);
1830
- `,He=`import { use } from "{{ createImport 'libApi' }}";
1863
+ `,We=`import { use } from "{{ createImport 'libApi' }}";
1831
1864
 
1832
1865
  export type UseT = {};
1833
1866
 
@@ -1838,11 +1871,11 @@ export default [
1838
1871
  return next();
1839
1872
  }),
1840
1873
  ];
1841
- `,Ue=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1874
+ `,Ge=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1842
1875
  import app from "./app";
1843
1876
 
1844
1877
  await serve(app);
1845
- `,We=`import { use } from "{{ createImport 'libApi' }}";
1878
+ `,Ke=`import { use } from "{{ createImport 'libApi' }}";
1846
1879
 
1847
1880
  /**
1848
1881
  * Define global middleware applied to all routes.
@@ -1853,7 +1886,7 @@ export default [
1853
1886
  return next();
1854
1887
  }),
1855
1888
  ];
1856
- `,Ge=m((e,n)=>{let{createPath:r,createImportHelpers:i}=_(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=y({helpers:{...i({origin:`lib`}),...S(),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}=y({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,Ve),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),He,{},{overwrite:l})},p=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=v(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${C(e)}`,alias:d(n),pathTokens:n}]:[]})]}).sort(b);for(let[e,t]of[[`@api/routes.ts`,Ne]])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`,Fe],[`api:factory.ts`,Ie],[`@api/app.ts`,Oe],[`@api/parsers.ts`,je],[`@api/dev.ts`,ke],[`@api/errors.ts`,Ae],[`@api/router.ts`,Me],[`@api/server.ts`,Pe]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,Le],[`dev.ts`,Re],[`errors.ts`,Be],[`server.ts`,Ue],[`use.ts`,We],[`env.d.ts`,ze]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){(!t||t.kind===`create`)&&await f(e),await p(e)},async build(e){await f(e),await p(e)}}}),Ke=p({meta:{name:`Hono`,slot:`backend`},dependencies:{hono:V.devDependencies.hono,"@hono/node-server":V.devDependencies[`@hono/node-server`]},factory:Ge}),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`}},qe=`import Router, { type RouterMiddleware } from "@koa/router";
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";
1857
1890
  import Koa from "koa";
1858
1891
 
1859
1892
  import type { Route, RouteDebugOption } from "@kosmojs/core/api";
@@ -1913,10 +1946,10 @@ export function appFactory(
1913
1946
 
1914
1947
  return app;
1915
1948
  }
1916
- `,Je=`import type { DevSetup } from "@kosmojs/core/api";
1949
+ `,Xe=`import type { DevSetup } from "@kosmojs/core/api";
1917
1950
 
1918
1951
  export const devSetup = (setup: DevSetup) => setup;
1919
- `,Ye=`import type {
1952
+ `,Ze=`import type {
1920
1953
  DefaultContext,
1921
1954
  DefaultState,
1922
1955
  ParameterizedContext,
@@ -1932,7 +1965,7 @@ export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
1932
1965
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
1933
1966
  return handler;
1934
1967
  };
1935
- `,Xe=`import zlib from "node:zlib";
1968
+ `,Qe=`import zlib from "node:zlib";
1936
1969
 
1937
1970
  import type { RouterContext } from "@koa/router";
1938
1971
  import Formidable, { type Options as FormidableOptions } from "formidable";
@@ -2145,7 +2178,7 @@ export const bodyparsers: {
2145
2178
  return rawParser(stream, rawParserOptions);
2146
2179
  },
2147
2180
  };
2148
- `,Ze=`import type { RouterMiddleware } from "@koa/router";
2181
+ `,$e=`import type { RouterMiddleware } from "@koa/router";
2149
2182
 
2150
2183
  import type {
2151
2184
  RequestBodyTarget,
@@ -2510,7 +2543,7 @@ export const routes = createRoutes<ParameterizedMiddleware, RouterMiddleware>(
2510
2543
  createRouteMiddleware,
2511
2544
  },
2512
2545
  );
2513
- `,Qe=`import { join } from "node:path";
2546
+ `,et=`import { join } from "node:path";
2514
2547
 
2515
2548
  import type { RouteSource } from "@kosmojs/core/api";
2516
2549
 
@@ -2555,7 +2588,7 @@ export const routeSources: Array<RouteSource<never>> = [
2555
2588
  },
2556
2589
  {{/each}}
2557
2590
  ];
2558
- `,$e=`import { chmod, unlink } from "node:fs/promises";
2591
+ `,tt=`import { chmod, unlink } from "node:fs/promises";
2559
2592
  import { parseArgs, styleText } from "node:util";
2560
2593
 
2561
2594
  import type { App } from "./app";
@@ -2618,7 +2651,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
2618
2651
  const server = app.listen(port || sock, onListen);
2619
2652
  return server as never;
2620
2653
  };
2621
- `,et=`import type { RouterContext } from "@koa/router";
2654
+ `,nt=`import type { RouterContext } from "@koa/router";
2622
2655
  import type { Next } from "koa";
2623
2656
 
2624
2657
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
@@ -2780,14 +2813,14 @@ export const defineRoute: <
2780
2813
  use: use as never,
2781
2814
  });
2782
2815
  };
2783
- `,tt=`export * from "./@api/app";
2816
+ `,rt=`export * from "./@api/app";
2784
2817
  export { appFactory as default } from "./@api/app";
2785
2818
  export * from "./@api/dev";
2786
2819
  export * from "./@api/errors";
2787
2820
  export * from "./@api/router";
2788
2821
  export * from "./@api/routes";
2789
2822
  export * from "./@api/server";
2790
- `,nt=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
2823
+ `,it=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
2791
2824
  import defaultErrorHandler from "./errors";
2792
2825
 
2793
2826
  export default appFactory(routes, ({ app, router }) => {
@@ -2798,7 +2831,7 @@ export default appFactory(routes, ({ app, router }) => {
2798
2831
  app.use(router.routes());
2799
2832
 
2800
2833
  });
2801
- `,rt=`import app from "./app";
2834
+ `,at=`import app from "./app";
2802
2835
 
2803
2836
  import { devSetup } from "{{ createImport 'lib' 'api:factory' }}";
2804
2837
 
@@ -2816,11 +2849,11 @@ process.on("unhandledRejection", (reason) => {
2816
2849
  console.error("Reason:", reason);
2817
2850
  process.exit(1);
2818
2851
  });
2819
- `,it=`export declare module "{{ createImport 'libApi' }}" {
2852
+ `,ot=`export declare module "{{ createImport 'libApi' }}" {
2820
2853
  interface DefaultState {}
2821
2854
  interface DefaultContext {}
2822
2855
  }
2823
- `,at=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
2856
+ `,st=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
2824
2857
 
2825
2858
  import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
2826
2859
 
@@ -2841,14 +2874,14 @@ export default errorHandlerFactory(async (error, ctx) => {
2841
2874
  ctx.body = message;
2842
2875
  }
2843
2876
  });
2844
- `,ot=`import { defineRoute } from "{{ createImport 'libApi' }}";
2877
+ `,ct=`import { defineRoute } from "{{ createImport 'libApi' }}";
2845
2878
 
2846
2879
  export default defineRoute<"{{route.name}}">(({ GET }) => [
2847
2880
  GET(async (ctx) => {
2848
2881
  ctx.body = "Automatically generated route";
2849
2882
  }),
2850
2883
  ]);
2851
- `,st=`import { use } from "{{ createImport 'libApi' }}";
2884
+ `,lt=`import { use } from "{{ createImport 'libApi' }}";
2852
2885
 
2853
2886
  export type UseT = {};
2854
2887
 
@@ -2859,11 +2892,11 @@ export default [
2859
2892
  return next();
2860
2893
  }),
2861
2894
  ];
2862
- `,ct=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
2895
+ `,ut=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
2863
2896
  import app from "./app";
2864
2897
 
2865
2898
  await serve(app);
2866
- `,lt=`import { use } from "{{ createImport 'libApi' }}";
2899
+ `,dt=`import { use } from "{{ createImport 'libApi' }}";
2867
2900
 
2868
2901
  /**
2869
2902
  * Define global middleware applied to all routes.
@@ -2874,17 +2907,17 @@ export default [
2874
2907
  return next();
2875
2908
  }),
2876
2909
  ];
2877
- `,ut=m((e,n)=>{let{createPath:r,createImportHelpers:i}=_(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=y({helpers:{...i({origin:`lib`}),...S(),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}=y({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,ot),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),st,{},{overwrite:l})},p=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=v(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${C(e)}`,alias:f(n),pathTokens:n}]:[]})]}).sort(b);for(let[e,t]of[[`@api/routes.ts`,Qe]])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`,et],[`api:factory.ts`,tt],[`@api/app.ts`,qe],[`@api/dev.ts`,Je],[`@api/errors.ts`,Ye],[`@api/parsers.ts`,Xe],[`@api/router.ts`,Ze],[`@api/server.ts`,$e]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,nt],[`dev.ts`,rt],[`errors.ts`,at],[`server.ts`,ct],[`use.ts`,lt],[`env.d.ts`,it]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){(!t||t.kind===`create`)&&await d(e),await p(e)},async build(e){await d(e),await p(e)}}}),dt=p({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:ut}),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`}},ft=()=>{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)]},pt=(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,`
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,`
2878
2911
  if (import.meta.hot) {
2879
2912
  import.meta.hot.accept(() => {});
2880
2913
  }
2881
2914
  `].join(`
2882
- `)}}}},o=[ne({jsxImportSource:`preact`,providerImportSource:`@mdx-js/preact`,remarkPlugins:r,rehypePlugins:i})];return t===`serve`&&o.push(a()),o},mt=`import type { FunctionComponent } from "preact";
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";
2883
2916
 
2884
2917
  export const AppProvider: FunctionComponent = (props) => {
2885
2918
  return props.children;
2886
2919
  };
2887
- `,ht=`import { render, hydrate as hydrateOrig } from "preact";
2920
+ `,_t=`import { render, hydrate as hydrateOrig } from "preact";
2888
2921
  import type { RouterFactoryReturn } from "@kosmojs/core";
2889
2922
  import { clientRenderFactory } from "@kosmojs/core/generators";
2890
2923
 
@@ -2925,7 +2958,7 @@ export const mount = async (
2925
2958
  }
2926
2959
 
2927
2960
  export default clientRenderFactory();
2928
- `,gt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
2961
+ `,vt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
2929
2962
 
2930
2963
  import type {
2931
2964
  RenderToStringWrapper,
@@ -2999,7 +3032,7 @@ export const renderToString: RenderToStringWrapper<
2999
3032
  }
3000
3033
 
3001
3034
  export default serverRenderFactory<false>();
3002
- `,_t=`declare module "*.mdx" {
3035
+ `,yt=`declare module "*.mdx" {
3003
3036
  import type { ComponentType } from "preact";
3004
3037
  export const frontmatter: Record<string, unknown>;
3005
3038
  const component: ComponentType;
@@ -3012,7 +3045,7 @@ declare module "*.md" {
3012
3045
  const component: ComponentType;
3013
3046
  export default component;
3014
3047
  }
3015
- `,vt=`import { MDXProvider } from "@mdx-js/preact";
3048
+ `,bt=`import { MDXProvider } from "@mdx-js/preact";
3016
3049
  import { match, pathToRegexp } from "path-to-regexp";
3017
3050
  import { type ComponentType, createContext, h, type VNode } from "preact";
3018
3051
 
@@ -3189,7 +3222,11 @@ export const createRoute = (
3189
3222
  loader: RawRoute["loader"],
3190
3223
  layouts: RawRoute["layouts"],
3191
3224
  ): RawRoute => {
3192
- const path = \`\${base}/\${pathPattern}\`.replace(/\\/+/g, "/");
3225
+ // strip trailing slash (keeping a sole "/") so the base-joined index route
3226
+ // matches both with and without it - "/docs/" as a pattern rejects "/docs"
3227
+ const path = \`\${base}/\${pathPattern}\`
3228
+ .replace(/\\/+/g, "/")
3229
+ .replace(/(.+)\\/$/, "$1");
3193
3230
 
3194
3231
  const { regexp } = pathToRegexp(path, { sensitive: true });
3195
3232
  const matcher = match<Route["params"]>(path);
@@ -3197,9 +3234,11 @@ export const createRoute = (
3197
3234
  return {
3198
3235
  name,
3199
3236
  regexp,
3237
+ // count segments of the same base-joined path the regexp matches against;
3238
+ // resolve() compares this against the full url pathname's segment count
3200
3239
  pathSegments: name.includes("...")
3201
3240
  ? undefined
3202
- : name.replace(/^index(\\/?|$)/, "").split("/").length,
3241
+ : path.split("/").filter(Boolean).length,
3203
3242
  extractParams: (path) => {
3204
3243
  const match = matcher(path);
3205
3244
  return match ? match.params : {};
@@ -3208,7 +3247,7 @@ export const createRoute = (
3208
3247
  layouts,
3209
3248
  };
3210
3249
  };
3211
- `,yt=`/* @jsxImportSource preact */
3250
+ `,xt=`/* @jsxImportSource preact */
3212
3251
 
3213
3252
  import styles from "./styles.module.css";
3214
3253
 
@@ -3249,7 +3288,7 @@ export default function PageSample(props: {
3249
3288
  </div>
3250
3289
  );
3251
3290
  }
3252
- `,bt=`/* @jsxImportSource preact */
3291
+ `,St=`/* @jsxImportSource preact */
3253
3292
 
3254
3293
  import styles from "./styles.module.css";
3255
3294
 
@@ -3301,7 +3340,7 @@ export default function PageSample(props: {
3301
3340
  </div>
3302
3341
  );
3303
3342
  }
3304
- `,xt=`* {
3343
+ `,Ct=`* {
3305
3344
  margin: 0;
3306
3345
  padding: 0;
3307
3346
  box-sizing: border-box;
@@ -3436,7 +3475,7 @@ export default function PageSample(props: {
3436
3475
  align-items: center;
3437
3476
  gap: 0.25rem;
3438
3477
  }
3439
- `,St=`/* @jsxImportSource preact */
3478
+ `,wt=`/* @jsxImportSource preact */
3440
3479
 
3441
3480
  import styles from "./styles.module.css";
3442
3481
 
@@ -3502,7 +3541,7 @@ export default function WelcomePage() {
3502
3541
  </div>
3503
3542
  );
3504
3543
  }
3505
- `,Ct=`export type ParamsMap = {
3544
+ `,Tt=`export type ParamsMap = {
3506
3545
  {{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
3507
3546
  {{/each}}
3508
3547
  };
@@ -3511,7 +3550,7 @@ export const paramNames = {
3511
3550
  {{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
3512
3551
  {{/each}}
3513
3552
  } as const;
3514
- `,wt=`import type { ComponentType } from "preact";
3553
+ `,Et=`import type { ComponentType } from "preact";
3515
3554
 
3516
3555
  import type { RouterFactoryReturn } from "@kosmojs/core";
3517
3556
  import { createRouterFactory } from "@kosmojs/core/generators";
@@ -3555,7 +3594,7 @@ export default createRouterFactory<
3555
3594
  Promise<RouteComponent>,
3556
3595
  { server: { route: Route } }
3557
3596
  >();
3558
- `,Tt=`import { join } from "node:path";
3597
+ `,Dt=`import { join } from "node:path";
3559
3598
 
3560
3599
  import { compile } from "path-to-regexp";
3561
3600
 
@@ -3601,7 +3640,7 @@ export default Object.entries(routes)
3601
3640
  return [];
3602
3641
  })
3603
3642
  .map((path) => join(base, path));
3604
- `,Et=`import type { PageRoute } from "@kosmojs/core";
3643
+ `,Ot=`import type { PageRoute } from "@kosmojs/core";
3605
3644
 
3606
3645
  {{#each pageRoutes}}
3607
3646
  import * as {{id}} from "{{ createImport 'pages' file }}";
@@ -3625,7 +3664,7 @@ const routeMap: Record<
3625
3664
  }
3626
3665
 
3627
3666
  export default routeMap;
3628
- `,Dt=`import { useContext } from "preact/hooks";
3667
+ `,kt=`import { useContext } from "preact/hooks";
3629
3668
 
3630
3669
  import { RouterContext } from "./mdx";
3631
3670
 
@@ -3671,10 +3710,10 @@ export const useFrontmatter = <
3671
3710
  >(): T => {
3672
3711
  return useRoute().frontmatter as T;
3673
3712
  };
3674
- `,Ot=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
3713
+ `,At=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
3675
3714
 
3676
3715
  <AppProvider>{props.children}</AppProvider>
3677
- `,kt=`import { h, type JSX } from "preact";
3716
+ `,jt=`import { h, type JSX } from "preact";
3678
3717
 
3679
3718
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
3680
3719
 
@@ -3687,11 +3726,11 @@ export default function Link(
3687
3726
  const { to, query, children, ...restProps } = props;
3688
3727
 
3689
3728
  const [key, ...params] = to;
3690
- const href = pageRouteMap[key]?.base(params as never, query);
3729
+ const href = pageRouteMap[key]?.path(params as never, query);
3691
3730
 
3692
3731
  return h("a", { ...restProps, href }, children);
3693
3732
  }
3694
- `,At=`/**
3733
+ `,Mt=`/**
3695
3734
  * MDX component overrides.
3696
3735
  *
3697
3736
  * Every standard markdown element (headings, links, code blocks, etc.)
@@ -3714,7 +3753,7 @@ export const components = {
3714
3753
  declare global {
3715
3754
  type MDXProvidedComponents = typeof components;
3716
3755
  }
3717
- `,jt=`import renderFactory, {
3756
+ `,Nt=`import renderFactory, {
3718
3757
  createRoutes,
3719
3758
  hydrate,
3720
3759
  mount,
@@ -3741,7 +3780,7 @@ if (root) {
3741
3780
  } else {
3742
3781
  console.error("❌ Root element not found!");
3743
3782
  }
3744
- `,Mt=`import renderFactory, {
3783
+ `,Pt=`import renderFactory, {
3745
3784
  createRoutes,
3746
3785
  renderToString,
3747
3786
  // no renderToStream on MDX folders
@@ -3762,7 +3801,7 @@ export default renderFactory(() => {
3762
3801
  },
3763
3802
  };
3764
3803
  });
3765
- `,Nt=`<!doctype html>
3804
+ `,Ft=`<!doctype html>
3766
3805
  <html lang="en">
3767
3806
  <head>
3768
3807
  <meta charset="UTF-8" />
@@ -3774,13 +3813,13 @@ export default renderFactory(() => {
3774
3813
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
3775
3814
  </body>
3776
3815
  </html>
3777
- `,Pt=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
3816
+ `,It=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
3778
3817
 
3779
3818
  export default function Page() {
3780
3819
  return <PageSample />;
3781
3820
  }
3782
- `,Ft=`{props.children}
3783
- `,It=`---
3821
+ `,Lt=`{props.children}
3822
+ `,Rt=`---
3784
3823
  title: "{{title}}"
3785
3824
  ---
3786
3825
 
@@ -3797,7 +3836,7 @@ export const pathMap = {
3797
3836
  routeName="{{route.name}}"
3798
3837
  pathMap={pathMap}
3799
3838
  />
3800
- `,Lt=`---
3839
+ `,zt=`---
3801
3840
  title: Welcome to KosmoJS
3802
3841
  description: Content-first development with MDX and Vite
3803
3842
  ---
@@ -3805,7 +3844,7 @@ description: Content-first development with MDX and Vite
3805
3844
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}"
3806
3845
 
3807
3846
  <WelcomePage />
3808
- `,Rt=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
3847
+ `,Bt=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
3809
3848
 
3810
3849
  import app from "./app.mdx";
3811
3850
  import { components } from "./components/mdx"
@@ -3821,12 +3860,12 @@ export default routerFactory((routes) => {
3821
3860
  },
3822
3861
  };
3823
3862
  });
3824
- `,zt=m((e,t)=>{let{createPath:n,createImportHelpers:r}=_(e),{renderToFile:i}=y({helpers:{...r({origin:`lib`}),...S(),serializeParams(e){return JSON.stringify(e.params)}}}),{renderToFile:a}=y({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,It),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?Lt:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:ft()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),Ft,{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(b)}]}return[]}).sort(b);for(let[e,a]of[[`client.ts`,ht],[`server.ts`,gt]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,Ct],[`router.ts`,wt],[`ssg:routes.ts`,Et]])await i(n.lib(e),t,{pageRoutes:r})};return{config({command:n}){return{oxc:{jsx:{importSource:`preact`}},plugins:pt(e,n,t)}},async start(){for(let[e,t]of[[`env.d.ts`,_t],[`app.ts`,mt],[`mdx.ts`,vt],[`use.ts`,Dt],[`ssg.ts`,Tt],[`pageSamples/styles.module.css`,xt],[`pageSamples/welcome.tsx`,St],[`pageSamples/page.tsx`,bt],[`pageSamples/404.tsx`,yt]])await i(n.lib(e),t,{});for(let[e,t]of[[`pages/404.mdx`,Pt],[`components/Link.tsx`,kt],[`components/mdx.ts`,At],[`app.mdx`,Ot],[`router.ts`,Rt]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});await a(n.src(`index.html`),Nt,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,jt],[`server.ts`,Mt]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){(!t||t.kind===`create`)&&await u(e),await d(e)},async build(e){await u(e),await d(e)}}}),Bt=p({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:zt}),Vt={json:`application/json`,form:[`application/x-www-form-urlencoded`,`multipart/form-data`],raw:void 0},Ht=()=>{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,`_`)}${C(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]=Ut(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=Vt[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(b).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}}}},Ut=(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]},Wt=m((e,t)=>{let{outfile:n=``,...r}={...t},{createPath:i}=_(e),{generateOpenAPISchema:a}=Ht(),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)}}}),Gt=p({meta:{name:`OpenAPI`,resolveTypes:!0},factory:Wt}),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`}},Kt=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(`/`)},qt=()=>{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=Kt(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},Jt=()=>{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)]},Yt=`import type { ReactNode } from "react";
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";
3825
3864
 
3826
3865
  export const AppProvider = ({ children }: { children: ReactNode }) => {
3827
3866
  return children;
3828
3867
  }
3829
- `,Xt=`import { type QueryClient, QueryClientProvider } from "@tanstack/react-query";
3868
+ `,Qt=`import { type QueryClient, QueryClientProvider } from "@tanstack/react-query";
3830
3869
  import type { ReactNode } from "react";
3831
3870
 
3832
3871
  import { getQueryClient } from "./query";
@@ -3845,7 +3884,7 @@ export const AppProvider = ({
3845
3884
  </QueryClientProvider>
3846
3885
  );
3847
3886
  }
3848
- `,Zt=`import { lazy, type JSX } from "react";
3887
+ `,$t=`import { lazy, type JSX } from "react";
3849
3888
 
3850
3889
  import {
3851
3890
  createRoot,
@@ -3899,7 +3938,7 @@ export const mount = async (
3899
3938
  }
3900
3939
 
3901
3940
  export default clientRenderFactory();
3902
- `,Qt=`{
3941
+ `,en=`{
3903
3942
  {{#if name}}
3904
3943
  id: "{{name}}",
3905
3944
  {{/if}}
@@ -3917,7 +3956,7 @@ export default clientRenderFactory();
3917
3956
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
3918
3957
  {{/if}}
3919
3958
  }
3920
- `,$t=`import type { JSX } from "react";
3959
+ `,tn=`import type { JSX } from "react";
3921
3960
 
3922
3961
  import {
3923
3962
  renderToString as renderToStringOrig,
@@ -3983,7 +4022,7 @@ export const renderToStream: RenderToStreamWrapper<
3983
4022
  };
3984
4023
 
3985
4024
  export default serverRenderFactory();
3986
- `,en=`/* @jsxImportSource react */
4025
+ `,nn=`/* @jsxImportSource react */
3987
4026
 
3988
4027
  import styles from "./styles.module.css";
3989
4028
 
@@ -4024,7 +4063,7 @@ export default function PageSample(props: {
4024
4063
  </div>
4025
4064
  );
4026
4065
  }
4027
- `,tn=`/* @jsxImportSource react */
4066
+ `,rn=`/* @jsxImportSource react */
4028
4067
 
4029
4068
  import styles from "./styles.module.css";
4030
4069
 
@@ -4076,7 +4115,7 @@ export default function PageSample(props: {
4076
4115
  </div>
4077
4116
  );
4078
4117
  }
4079
- `,nn=`* {
4118
+ `,an=`* {
4080
4119
  margin: 0;
4081
4120
  padding: 0;
4082
4121
  box-sizing: border-box;
@@ -4211,7 +4250,7 @@ export default function PageSample(props: {
4211
4250
  align-items: center;
4212
4251
  gap: 0.25rem;
4213
4252
  }
4214
- `,rn=`/* @jsxImportSource react */
4253
+ `,on=`/* @jsxImportSource react */
4215
4254
 
4216
4255
  import styles from "./styles.module.css";
4217
4256
 
@@ -4277,7 +4316,7 @@ export default function WelcomePage() {
4277
4316
  </div>
4278
4317
  );
4279
4318
  }
4280
- `,an=`import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
4319
+ `,sn=`import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
4281
4320
 
4282
4321
  let client: QueryClient | undefined;
4283
4322
 
@@ -4292,7 +4331,7 @@ export const getQueryClient = (): QueryClient => {
4292
4331
  }
4293
4332
  return client;
4294
4333
  };
4295
- `,on=`import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
4334
+ `,cn=`import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
4296
4335
 
4297
4336
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
4298
4337
 
@@ -4315,7 +4354,7 @@ export const getQueryClient = (): QueryClient => {
4315
4354
  }
4316
4355
  return ctx.tsqClient as QueryClient;
4317
4356
  };
4318
- `,sn=`export type ComponentLoader = () => Promise<{
4357
+ `,ln=`export type ComponentLoader = () => Promise<{
4319
4358
  loader?: (arg: unknown) => Promise<unknown>;
4320
4359
  }>;
4321
4360
 
@@ -4335,7 +4374,7 @@ export const loaderFactory = (opt?: { withPreload?: boolean }) => {
4335
4374
  return opt?.withPreload ? { loader } : {};
4336
4375
  };
4337
4376
  };
4338
- `,cn=`import type { JSX, ComponentType } from "react";
4377
+ `,un=`import type { JSX, ComponentType } from "react";
4339
4378
 
4340
4379
  import {
4341
4380
  type RouteObject,
@@ -4393,7 +4432,7 @@ export const createRouters = (
4393
4432
  }
4394
4433
 
4395
4434
  export default createRouterFactory<RouteObject, Promise<JSX.Element>>();
4396
- `,ln=`import { Outlet } from "react-router";
4435
+ `,dn=`import { Outlet } from "react-router";
4397
4436
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
4398
4437
 
4399
4438
  export default function App() {
@@ -4403,7 +4442,7 @@ export default function App() {
4403
4442
  </AppProvider>
4404
4443
  );
4405
4444
  }
4406
- `,un=`import {
4445
+ `,fn=`import {
4407
4446
  type LinkProps as RouterLinkProps,
4408
4447
  Link as RouterLink,
4409
4448
  } from "react-router";
@@ -4422,7 +4461,7 @@ export default function Link(
4422
4461
 
4423
4462
  const href = () => {
4424
4463
  const [key, ...params] = to;
4425
- return pageRouteMap[key]?.base(params as never, query);
4464
+ return pageRouteMap[key]?.path(params as never, query, { prefix: false });
4426
4465
  };
4427
4466
 
4428
4467
  return (
@@ -4431,7 +4470,7 @@ export default function Link(
4431
4470
  </RouterLink>
4432
4471
  );
4433
4472
  }
4434
- `,dn=`import renderFactory, {
4473
+ `,pn=`import renderFactory, {
4435
4474
  createRoutes,
4436
4475
  hydrate,
4437
4476
  mount,
@@ -4458,7 +4497,7 @@ if (root) {
4458
4497
  } else {
4459
4498
  console.error("❌ Root element not found!");
4460
4499
  }
4461
- `,fn=`import renderFactory, {
4500
+ `,mn=`import renderFactory, {
4462
4501
  createRoutes,
4463
4502
  renderToStream,
4464
4503
  renderToString,
@@ -4485,7 +4524,7 @@ export default renderFactory(() => {
4485
4524
  },
4486
4525
  };
4487
4526
  });
4488
- `,pn=`<!doctype html>
4527
+ `,hn=`<!doctype html>
4489
4528
  <html lang="en">
4490
4529
  <head>
4491
4530
  <meta charset="UTF-8" />
@@ -4497,17 +4536,17 @@ export default renderFactory(() => {
4497
4536
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
4498
4537
  </body>
4499
4538
  </html>
4500
- `,mn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
4539
+ `,gn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
4501
4540
 
4502
4541
  export default function Page() {
4503
4542
  return <PageSample />;
4504
4543
  }
4505
- `,hn=`import { Outlet } from "react-router";
4544
+ `,_n=`import { Outlet } from "react-router";
4506
4545
 
4507
4546
  export default function Layout() {
4508
4547
  return <Outlet />;
4509
4548
  }
4510
- `,gn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
4549
+ `,vn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
4511
4550
 
4512
4551
  export default function Page() {
4513
4552
  return PageSample({
@@ -4520,8 +4559,8 @@ export default function Page() {
4520
4559
  },
4521
4560
  });
4522
4561
  }
4523
- `,_n=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
4524
- `,vn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
4562
+ `,yn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
4563
+ `,bn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
4525
4564
 
4526
4565
  import app from "./app";
4527
4566
 
@@ -4536,12 +4575,12 @@ export default routerFactory((routes) => {
4536
4575
  },
4537
4576
  };
4538
4577
  });
4539
- `,yn=m((e,t)=>{let{createPath:n,createImportHelpers:r}=_(e),{renderToFile:i}=y({helpers:{...r({origin:`lib`}),...S()},partials:{routePartial:Qt}}),{renderToFile:a}=y({helpers:r({origin:`src`})}),o=qt(),s=e=>!e?.trim().length,u=c(t?.templates,gn),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?_n:u(r.name,r),{route:r,message:Jt()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),hn,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(b),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(g(r));for(let[e,t]of[[`client.ts`,Zt],[`server.ts`,$t]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a});await i(n.lib(`router.tsx`),cn,{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`,sn],[`pageSamples/styles.module.css`,nn],[`pageSamples/welcome.tsx`,rn],[`pageSamples/page.tsx`,tn],[`pageSamples/404.tsx`,en],...t?.tanstack?.query?[[`app.tsx`,Xt],[`query.ts`,an]]:[[`app.tsx`,Yt],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.tsx`,mn],[`components/Link.tsx`,un],[`app.tsx`,ln],[`router.ts`,vn]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});await a(n.src(`index.html`),pn,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,dn],[`server.ts`,fn]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){(!t||t.kind===`create`)&&await d(e),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?on:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),bn=p({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:yn}),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`}},xn=()=>{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(`/`)},Sn=()=>{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)]},Cn=`import type { ParentComponent } from "solid-js";
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";
4540
4579
 
4541
4580
  export const AppProvider: ParentComponent = (props) => {
4542
4581
  return props.children;
4543
4582
  };
4544
- `,wn=`import type { ParentComponent } from "solid-js";
4583
+ `,En=`import type { ParentComponent } from "solid-js";
4545
4584
  import { type QueryClient, QueryClientProvider } from "@tanstack/solid-query";
4546
4585
 
4547
4586
  import { getQueryClient } from "./query";
@@ -4553,7 +4592,7 @@ export const AppProvider: ParentComponent<{ client?: QueryClient }> = (props) =>
4553
4592
  </QueryClientProvider>
4554
4593
  );
4555
4594
  };
4556
- `,Tn=`import { lazy, type JSX } from "solid-js";
4595
+ `,Dn=`import { lazy, type JSX } from "solid-js";
4557
4596
  import { hydrate as hydrateOrig, render } from "solid-js/web";
4558
4597
  import type { RouterFactoryReturn } from "@kosmojs/core";
4559
4598
  import { clientRenderFactory } from "@kosmojs/core/generators";
@@ -4598,7 +4637,7 @@ export const mount = async (
4598
4637
  }
4599
4638
 
4600
4639
  export default clientRenderFactory();
4601
- `,En=`{
4640
+ `,On=`{
4602
4641
  path: "{{path}}",
4603
4642
  {{#if component}}
4604
4643
  component: {{component}}_component,
@@ -4608,7 +4647,7 @@ export default clientRenderFactory();
4608
4647
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
4609
4648
  {{/if}}
4610
4649
  }
4611
- `,Dn=`import type { JSX } from "solid-js";
4650
+ `,kn=`import type { JSX } from "solid-js";
4612
4651
 
4613
4652
  import {
4614
4653
  generateHydrationScript,
@@ -4689,7 +4728,7 @@ export const renderToStream: RenderToStreamWrapper<
4689
4728
  };
4690
4729
 
4691
4730
  export default serverRenderFactory<true>();
4692
- `,On=`/* @jsxImportSource solid-js */
4731
+ `,An=`/* @jsxImportSource solid-js */
4693
4732
 
4694
4733
  import styles from "./styles.module.css";
4695
4734
 
@@ -4730,7 +4769,7 @@ export default function PageSample(props: {
4730
4769
  </div>
4731
4770
  );
4732
4771
  }
4733
- `,kn=`/* @jsxImportSource solid-js */
4772
+ `,jn=`/* @jsxImportSource solid-js */
4734
4773
 
4735
4774
  import styles from "./styles.module.css";
4736
4775
 
@@ -4782,7 +4821,7 @@ export default function PageSample(props: {
4782
4821
  </div>
4783
4822
  );
4784
4823
  }
4785
- `,An=`* {
4824
+ `,Mn=`* {
4786
4825
  margin: 0;
4787
4826
  padding: 0;
4788
4827
  box-sizing: border-box;
@@ -4917,7 +4956,7 @@ export default function PageSample(props: {
4917
4956
  align-items: center;
4918
4957
  gap: 0.25rem;
4919
4958
  }
4920
- `,jn=`/* @jsxImportSource solid-js */
4959
+ `,Nn=`/* @jsxImportSource solid-js */
4921
4960
 
4922
4961
  import styles from "./styles.module.css";
4923
4962
 
@@ -4983,7 +5022,7 @@ export default function WelcomePage() {
4983
5022
  </div>
4984
5023
  );
4985
5024
  }
4986
- `,Mn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5025
+ `,Pn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
4987
5026
 
4988
5027
  let client: QueryClient | undefined;
4989
5028
 
@@ -4998,7 +5037,7 @@ export const getQueryClient = (): QueryClient => {
4998
5037
  }
4999
5038
  return client;
5000
5039
  };
5001
- `,Nn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5040
+ `,Fn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5002
5041
 
5003
5042
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
5004
5043
 
@@ -5021,7 +5060,7 @@ export const getQueryClient = (): QueryClient => {
5021
5060
  }
5022
5061
  return ctx.tsqClient as QueryClient;
5023
5062
  };
5024
- `,Pn=`import type { JSX, ParentComponent } from "solid-js";
5063
+ `,In=`import type { JSX, ParentComponent } from "solid-js";
5025
5064
  import { Router, type RouteDefinition } from "@solidjs/router";
5026
5065
  import type { RouterFactoryReturn } from "@kosmojs/core";
5027
5066
  import { createRouterFactory } from "@kosmojs/core/generators";
@@ -5057,7 +5096,7 @@ export const createRouters = (
5057
5096
  }
5058
5097
 
5059
5098
  export default createRouterFactory<RouteDefinition, JSX.Element>();
5060
- `,Fn=`export type ComponentLoader = () => Promise<{
5099
+ `,Ln=`export type ComponentLoader = () => Promise<{
5061
5100
  preload?: () => Promise<unknown>;
5062
5101
  }>;
5063
5102
 
@@ -5072,10 +5111,10 @@ export const loaderFactory = (opt?: { withPreload?: boolean }) => {
5072
5111
  return opt?.withPreload ? { preload } : {};
5073
5112
  };
5074
5113
  };
5075
- `,In=`export type MaybeWrapped<T> = import("solid-js/store").Store<T> | T;
5114
+ `,Rn=`export type MaybeWrapped<T> = import("solid-js/store").Store<T> | T;
5076
5115
 
5077
5116
  export { unwrap } from "solid-js/store";
5078
- `,Ln=`import type { ParentComponent } from "solid-js";
5117
+ `,zn=`import type { ParentComponent } from "solid-js";
5079
5118
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
5080
5119
 
5081
5120
  const App: ParentComponent = (props) => {
@@ -5083,7 +5122,7 @@ const App: ParentComponent = (props) => {
5083
5122
  };
5084
5123
 
5085
5124
  export default App;
5086
- `,Rn=`import { A, type AnchorProps } from "@solidjs/router";
5125
+ `,Bn=`import { A, type AnchorProps } from "@solidjs/router";
5087
5126
  import { type JSXElement, splitProps } from "solid-js";
5088
5127
 
5089
5128
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
@@ -5103,12 +5142,12 @@ export default function Link(
5103
5142
 
5104
5143
  const href = () => {
5105
5144
  const [key, ...params] = knownProps.to;
5106
- return pageRouteMap[key]?.base(params as never, knownProps.query);
5145
+ return pageRouteMap[key]?.path(params as never, knownProps.query, { prefix: false });
5107
5146
  };
5108
5147
 
5109
5148
  return <A {...{ ...restProps, href: href() }}>{knownProps.children}</A>;
5110
5149
  }
5111
- `,zn=`import renderFactory, {
5150
+ `,Vn=`import renderFactory, {
5112
5151
  createRoutes,
5113
5152
  hydrate,
5114
5153
  mount,
@@ -5135,7 +5174,7 @@ if (root) {
5135
5174
  } else {
5136
5175
  console.error("❌ Root element not found!");
5137
5176
  }
5138
- `,Bn=`import renderFactory, {
5177
+ `,Hn=`import renderFactory, {
5139
5178
  createRoutes,
5140
5179
  renderToStream,
5141
5180
  renderToString,
@@ -5162,7 +5201,7 @@ export default renderFactory(() => {
5162
5201
  },
5163
5202
  };
5164
5203
  });
5165
- `,Vn=`<!doctype html>
5204
+ `,Un=`<!doctype html>
5166
5205
  <html lang="en">
5167
5206
  <head>
5168
5207
  <meta charset="UTF-8" />
@@ -5174,19 +5213,19 @@ export default renderFactory(() => {
5174
5213
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
5175
5214
  </body>
5176
5215
  </html>
5177
- `,Hn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
5216
+ `,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
5178
5217
 
5179
5218
  export default function Page() {
5180
5219
  return <PageSample />;
5181
5220
  }
5182
- `,Un=`import type { ParentComponent } from "solid-js";
5221
+ `,Gn=`import type { ParentComponent } from "solid-js";
5183
5222
 
5184
5223
  const Layout: ParentComponent = (props) => {
5185
5224
  return props.children;
5186
5225
  };
5187
5226
 
5188
5227
  export default Layout;
5189
- `,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
5228
+ `,Kn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
5190
5229
 
5191
5230
  export default function Page() {
5192
5231
  return PageSample({
@@ -5199,8 +5238,8 @@ export default function Page() {
5199
5238
  },
5200
5239
  });
5201
5240
  }
5202
- `,Gn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
5203
- `,Kn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
5241
+ `,qn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
5242
+ `,Jn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
5204
5243
 
5205
5244
  import app from "./app";
5206
5245
 
@@ -5215,12 +5254,12 @@ export default routerFactory((routes) => {
5215
5254
  },
5216
5255
  };
5217
5256
  });
5218
- `,qn=m((e,t)=>{let{generators:n=[]}=e.config,{createPath:r,createImportHelpers:i}=_(e),{renderToFile:a}=y({helpers:{...i({origin:`lib`}),...S()},partials:{routePartial:En}}),{renderToFile:o}=y({helpers:i({origin:`src`})}),s=xn(),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:Sn()},{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(b),n=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=s(g(n));for(let[e,t]of[[`client.ts`,Tn],[`server.ts`,Dn]])await a(r.libEntry(e),t,{pageEntries:n,nestedRoutes:i});await a(r.lib(`router.tsx`),Pn,{entries:e,indexRoutes:t})};return{config({command:e}){let{templates:r,...i}={...t};return{oxc:{jsx:{importSource:`solid-js`}},plugins:e===`build`?[T({...i,...n.some(e=>e.meta.slot===`ssr`)?{ssr:!0,solid:{...i?.solid,hydratable:!0}}:{}})]:[T({...i,dev:!0,hot:!0})]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`solid.ts`,Fn],[`unwrap.ts`,In],[`pageSamples/styles.module.css`,An],[`pageSamples/welcome.tsx`,jn],[`pageSamples/page.tsx`,kn],[`pageSamples/404.tsx`,On],...t?.tanstack?.query?[[`app.tsx`,wn],[`query.ts`,Mn]]:[[`app.tsx`,Cn],[`query.ts`,`/** tanstack query disabled */`]]])await a(r.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,Hn],[`components/Link.tsx`,Rn],[`app.tsx`,Ln],[`router.ts`,Kn]])await o(r.src(e),t,{entryDir:l.entryDir},{overwrite:u});await o(r.src(`index.html`),Vn,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,zn],[`server.ts`,Bn]])await o(r.entry(e),t,{},{overwrite:u})},async watch(e,t){(!t||t.kind===`create`)&&await f(e),await p(e)},async build(e){await f(e),await p(e)},async ssrBuild(){await a(r.lib(`query.ts`),t?.tanstack?.query?Nn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Jn=p({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:qn}),Yn=m(e=>{let{generators:i=[],refineTypeName:a,...o}={...e.config},{createPath:s}=_(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 E(n(a,`../client/assets`),t(a,`assets`),{recursive:!0}),l.append(`bundling routes...`),await w(h(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:s.lib(),appType:`custom`,plugins:[x.tsconfigPaths(e),x.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 ue(t(a,i),{recursive:!0}),await de(t(a,t(i,`index.html`)),o,`utf8`))}l.succeed(`done ✨`)})}finally{await D(`${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=p({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}}
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}}
5219
5258
  export { default as apiApp } from "{{ createImport 'api' 'app' }}";
5220
5259
  {{else}}
5221
5260
  export const apiApp = undefined;
5222
5261
  {{/if}}
5223
- `,$n=`import { AsyncLocalStorage } from "node:async_hooks";
5262
+ `,tr=`import { AsyncLocalStorage } from "node:async_hooks";
5224
5263
 
5225
5264
  import type { FetchApp, NodeApp } from "@kosmojs/core";
5226
5265
 
@@ -5264,7 +5303,7 @@ export const store = new AsyncLocalStorage<RequestContext>();
5264
5303
  export const isFetchApp = (app: FetchApp | NodeApp): app is FetchApp => {
5265
5304
  return typeof (app as FetchApp).fetch === "function";
5266
5305
  };
5267
- `,er=`import { type RequestContext, store } from "./base";
5306
+ `,nr=`import { type RequestContext, store } from "./base";
5268
5307
 
5269
5308
  import { renderWrapper } from "{{ createImport 'libEntry' 'server' }}";
5270
5309
 
@@ -5286,7 +5325,7 @@ export const withSsrContext = <T>(
5286
5325
  export const errorProvider = () => {
5287
5326
  return store.getStore()?.error;
5288
5327
  };
5289
- `,tr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
5328
+ `,rr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
5290
5329
  import type { Transport } from "@kosmojs/core/fetch";
5291
5330
 
5292
5331
  import {
@@ -5489,12 +5528,12 @@ const pathnameOf = (input: RequestInfo | URL): string => {
5489
5528
  } catch {}
5490
5529
  return String(input);
5491
5530
  };
5492
- `,nr=`export const routeMap = [
5531
+ `,ir=`export const routeMap = [
5493
5532
  {{#each pageRoutes}}
5494
5533
  { pathPattern: "{{honoPattern}}", renderMode: "{{renderMode}}" },
5495
5534
  {{/each}}
5496
5535
  ];
5497
- `,rr=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
5536
+ `,ar=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
5498
5537
  import {
5499
5538
  createServer,
5500
5539
  type IncomingMessage,
@@ -5910,14 +5949,14 @@ if (isMain) {
5910
5949
  process.exit(1);
5911
5950
  }
5912
5951
  }
5913
- `,ir=`string`,ar=m((e,r)=>{let{generators:i=[],refineTypeName:a,...o}=e.config,{createPath:c,createImportHelpers:l}=_(e),{renderToFile:u}=y({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(b),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(){let r=c.distDir(`ssr`),a=[x.tsconfigPaths(e),x.nodePrefix()];for(let t of i)await t.factory(e).ssrBuild?.();await w(h(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 w({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 E(n(r,`../client`),r,{recursive:!0});for(let e of[`server.js`,`server.js.map`])await E(`${r}/server/${e}`,`${r}/${e}`);await D(`${r}/server`,{recursive:!0,force:!0})}}}),or=p({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.38`,"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">
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">
5914
5953
  import type { Snippet } from "svelte";
5915
5954
 
5916
5955
  let { children }: { children: Snippet } = $props();
5917
5956
  <\/script>
5918
5957
 
5919
5958
  {@render children()}
5920
- `,cr=`<script lang="ts">
5959
+ `,ur=`<script lang="ts">
5921
5960
  import { type QueryClient, QueryClientProvider } from "@tanstack/svelte-query";
5922
5961
  import type { Snippet } from "svelte";
5923
5962
 
@@ -5934,7 +5973,7 @@ if (isMain) {
5934
5973
  <QueryClientProvider client={queryClient}>
5935
5974
  {@render children()}
5936
5975
  </QueryClientProvider>
5937
- `,lr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
5976
+ `,dr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
5938
5977
  import type { RouterFactoryReturn } from "@kosmojs/core";
5939
5978
  import { clientRenderFactory } from "@kosmojs/core/generators";
5940
5979
 
@@ -5975,7 +6014,7 @@ export const mount = async (
5975
6014
  }
5976
6015
 
5977
6016
  export default clientRenderFactory();
5978
- `,ur=`import { render as renderOrig } from "svelte/server";
6017
+ `,fr=`import { render as renderOrig } from "svelte/server";
5979
6018
 
5980
6019
  import type {
5981
6020
  RenderToStringWrapper,
@@ -6041,12 +6080,12 @@ export const renderToString: RenderToStringWrapper<
6041
6080
  // svelte/server exposes only render() - no web-stream renderer -
6042
6081
  // so this folder is string-only SSR.
6043
6082
  export default serverRenderFactory<false>();
6044
- `,dr=`declare module "*.svelte" {
6083
+ `,pr=`declare module "*.svelte" {
6045
6084
  import type { Component } from "svelte";
6046
6085
  const component: Component;
6047
6086
  export default component;
6048
6087
  }
6049
- `,fr=`<script lang="ts">
6088
+ `,mr=`<script lang="ts">
6050
6089
  /**
6051
6090
  * Folds [app, ...layouts] around the page component.
6052
6091
  *
@@ -6080,7 +6119,7 @@ export default serverRenderFactory<false>();
6080
6119
  {/snippet}
6081
6120
 
6082
6121
  {@render layer(0)}
6083
- `,pr=`<script lang="ts">
6122
+ `,hr=`<script lang="ts">
6084
6123
  import styles from "./styles.module.css";
6085
6124
 
6086
6125
  let { headline }: { headline?: string } = $props();
@@ -6112,7 +6151,7 @@ export default serverRenderFactory<false>();
6112
6151
  </div>
6113
6152
  </div>
6114
6153
  </div>
6115
- `,mr=`<script lang="ts">
6154
+ `,gr=`<script lang="ts">
6116
6155
  import styles from "./styles.module.css";
6117
6156
 
6118
6157
  let {
@@ -6157,7 +6196,7 @@ export default serverRenderFactory<false>();
6157
6196
  </div>
6158
6197
  </div>
6159
6198
  </div>
6160
- `,hr=`* {
6199
+ `,_r=`* {
6161
6200
  margin: 0;
6162
6201
  padding: 0;
6163
6202
  box-sizing: border-box;
@@ -6292,7 +6331,7 @@ export default serverRenderFactory<false>();
6292
6331
  align-items: center;
6293
6332
  gap: 0.25rem;
6294
6333
  }
6295
- `,gr=`<script lang="ts">
6334
+ `,vr=`<script lang="ts">
6296
6335
  import styles from "./styles.module.css";
6297
6336
  <\/script>
6298
6337
 
@@ -6350,7 +6389,7 @@ export default serverRenderFactory<false>();
6350
6389
  </div>
6351
6390
  </div>
6352
6391
  </div>
6353
- `,_r=`export type ParamsMap = {
6392
+ `,yr=`export type ParamsMap = {
6354
6393
  {{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
6355
6394
  {{/each}}
6356
6395
  };
@@ -6359,7 +6398,7 @@ export const paramNames = {
6359
6398
  {{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
6360
6399
  {{/each}}
6361
6400
  } as const;
6362
- `,vr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6401
+ `,br=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6363
6402
 
6364
6403
  let client: QueryClient | undefined;
6365
6404
 
@@ -6374,7 +6413,7 @@ export const getQueryClient = (): QueryClient => {
6374
6413
  }
6375
6414
  return client;
6376
6415
  };
6377
- `,yr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6416
+ `,xr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6378
6417
 
6379
6418
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
6380
6419
 
@@ -6397,7 +6436,7 @@ export const getQueryClient = (): QueryClient => {
6397
6436
  }
6398
6437
  return ctx.tsqClient as QueryClient;
6399
6438
  };
6400
- `,br=`import type { RouterFactoryReturn } from "@kosmojs/core";
6439
+ `,Sr=`import type { RouterFactoryReturn } from "@kosmojs/core";
6401
6440
  import { createRouterFactory } from "@kosmojs/core/generators";
6402
6441
 
6403
6442
  import Layouts from "./Layouts.svelte";
@@ -6437,7 +6476,7 @@ export default createRouterFactory<
6437
6476
  Promise<RouteComponent>,
6438
6477
  { server: { route: Route } }
6439
6478
  >();
6440
- `,xr=`import { match, pathToRegexp } from "path-to-regexp";
6479
+ `,Cr=`import { match, pathToRegexp } from "path-to-regexp";
6441
6480
  import { type Component, createContext } from "svelte";
6442
6481
 
6443
6482
  import { parseSearchParams } from "@kosmojs/core";
@@ -6639,7 +6678,11 @@ export const createRoute = (
6639
6678
  loader: RawRoute["loader"],
6640
6679
  layouts: RawRoute["layouts"],
6641
6680
  ): RawRoute => {
6642
- const path = \`\${base}/\${pathPattern}\`.replace(/\\/+/g, "/");
6681
+ // strip trailing slash (keeping a sole "/") so the base-joined index route
6682
+ // matches both with and without it - "/docs/" as a pattern rejects "/docs"
6683
+ const path = \`\${base}/\${pathPattern}\`
6684
+ .replace(/\\/+/g, "/")
6685
+ .replace(/(.+)\\/$/, "$1");
6643
6686
 
6644
6687
  const { regexp } = pathToRegexp(path, { sensitive: true });
6645
6688
  const matcher = match<Route["params"]>(path);
@@ -6647,9 +6690,11 @@ export const createRoute = (
6647
6690
  return {
6648
6691
  name,
6649
6692
  regexp,
6693
+ // count segments of the same base-joined path the regexp matches against;
6694
+ // resolve() compares this against the full url pathname's segment count
6650
6695
  pathSegments: name.includes("...")
6651
6696
  ? undefined
6652
- : name.replace(/^index(\\/?|$)/, "").split("/").length,
6697
+ : path.split("/").filter(Boolean).length,
6653
6698
  extractParams: (path) => {
6654
6699
  const match = matcher(path);
6655
6700
  return match ? match.params : {};
@@ -6658,7 +6703,7 @@ export const createRoute = (
6658
6703
  layouts,
6659
6704
  };
6660
6705
  };
6661
- `,Sr=`import { getRouteContext } from "./svelte";
6706
+ `,wr=`import { getRouteContext } from "./svelte";
6662
6707
 
6663
6708
  import type { ParamsMap, paramNames } from "{{ createImport 'lib' 'params' }}";
6664
6709
 
@@ -6698,7 +6743,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6698
6743
  const route = useRoute();
6699
6744
  return route.loaderData?.[key || route.name] as T;
6700
6745
  };
6701
- `,Cr=`<script lang="ts">
6746
+ `,Tr=`<script lang="ts">
6702
6747
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
6703
6748
  import type { Snippet } from "svelte";
6704
6749
 
@@ -6708,7 +6753,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6708
6753
  <AppProvider>
6709
6754
  {@render children()}
6710
6755
  </AppProvider>
6711
- `,wr=`<script lang="ts">
6756
+ `,Er=`<script lang="ts">
6712
6757
  import type { Snippet } from "svelte";
6713
6758
  import type { HTMLAnchorAttributes } from "svelte/elements";
6714
6759
 
@@ -6727,12 +6772,12 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6727
6772
 
6728
6773
  const href = $derived.by(() => {
6729
6774
  const [key, ...params] = to;
6730
- return pageRouteMap[key]?.base(params as never, query);
6775
+ return pageRouteMap[key]?.path(params as never, query);
6731
6776
  });
6732
6777
  <\/script>
6733
6778
 
6734
6779
  <a {href} {...rest}>{@render children?.()}</a>
6735
- `,Tr=`import renderFactory, {
6780
+ `,Dr=`import renderFactory, {
6736
6781
  createRoutes,
6737
6782
  hydrate,
6738
6783
  mount,
@@ -6759,7 +6804,7 @@ if (root) {
6759
6804
  } else {
6760
6805
  console.error("❌ Root element not found!");
6761
6806
  }
6762
- `,Er=`import renderFactory, {
6807
+ `,Or=`import renderFactory, {
6763
6808
  createRoutes,
6764
6809
  renderToString,
6765
6810
  // no renderToStream on Svelte folders
@@ -6780,7 +6825,7 @@ export default renderFactory(() => {
6780
6825
  },
6781
6826
  };
6782
6827
  });
6783
- `,Dr=`<!doctype html>
6828
+ `,kr=`<!doctype html>
6784
6829
  <html lang="en">
6785
6830
  <head>
6786
6831
  <meta charset="UTF-8" />
@@ -6792,19 +6837,19 @@ export default renderFactory(() => {
6792
6837
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
6793
6838
  </body>
6794
6839
  </html>
6795
- `,Or=`<script lang="ts">
6840
+ `,Ar=`<script lang="ts">
6796
6841
  import PageSample from "{{ createImport 'lib' 'pageSamples/404.svelte' }}";
6797
6842
  <\/script>
6798
6843
 
6799
6844
  <PageSample />
6800
- `,kr=`<script lang="ts">
6845
+ `,jr=`<script lang="ts">
6801
6846
  import type { Snippet } from "svelte";
6802
6847
 
6803
6848
  let { children }: { children: Snippet } = $props();
6804
6849
  <\/script>
6805
6850
 
6806
6851
  {@render children()}
6807
- `,Ar=`<script lang="ts">
6852
+ `,Mr=`<script lang="ts">
6808
6853
  import PageSample from "{{ createImport 'lib' 'pageSamples/page.svelte' }}";
6809
6854
 
6810
6855
  const pathMap = {
@@ -6823,7 +6868,7 @@ export default renderFactory(() => {
6823
6868
  routeName={"{{route.name}}"}
6824
6869
  {pathMap}
6825
6870
  />
6826
- `,jr=`<script lang="ts">
6871
+ `,Nr=`<script lang="ts">
6827
6872
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.svelte' }}";
6828
6873
  <\/script>
6829
6874
 
@@ -6836,7 +6881,7 @@ export default renderFactory(() => {
6836
6881
  </svelte:head>
6837
6882
 
6838
6883
  <WelcomePage />
6839
- `,Mr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
6884
+ `,Pr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
6840
6885
 
6841
6886
  import app from "./app.svelte";
6842
6887
 
@@ -6851,7 +6896,7 @@ export default routerFactory((routes) => {
6851
6896
  },
6852
6897
  };
6853
6898
  });
6854
- `,Nr=m((e,t)=>{let{createPath:n,createImportHelpers:r}=_(e),{renderToFile:i}=y({helpers:{...r({origin:`lib`}),...S()}}),{renderToFile:a}=y({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,Ar),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?jr:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:sr()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),kr,{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(b)}]}return[]}).sort(b);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:fe(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`,Or],[`components/Link.svelte`,wr],[`app.svelte`,Cr],[`router.ts`,Mr]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});await a(n.src(`index.html`),Dr,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,Tr],[`server.ts`,Er]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){(!t||t.kind===`create`)&&await u(e),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})}}}),Pr=p({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:Nr}),Fr={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`}},Ir=`import Type from "typebox";
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";
6855
6900
 
6856
6901
  /**
6857
6902
  * Custom types for JavaScript constructs that have no JSON Schema
@@ -6923,7 +6968,7 @@ export default {
6923
6968
  Buffer: TBuffer(),
6924
6969
  ArrayBuffer: TArrayBuffer(),
6925
6970
  };
6926
- `,Lr=`import type { TValidationError } from "typebox/error";
6971
+ `,zr=`import type { TValidationError } from "typebox/error";
6927
6972
 
6928
6973
  import type { ValidationErrorEntry } from "@kosmojs/core";
6929
6974
 
@@ -8107,7 +8152,7 @@ const format = (fmt: string, ...args: unknown[]): string => {
8107
8152
 
8108
8153
  return str;
8109
8154
  };
8110
- `,Rr=`import Type from "typebox";
8155
+ `,Br=`import Type from "typebox";
8111
8156
  import { Compile } from "typebox/compile";
8112
8157
  import Value from "typebox/value";
8113
8158
 
@@ -8159,14 +8204,14 @@ export const validationSchemaFactory = (
8159
8204
  },
8160
8205
  };
8161
8206
  };
8162
- `,zr=`import { Settings } from "typebox/system";
8207
+ `,Vr=`import { Settings } from "typebox/system";
8163
8208
 
8164
8209
  Settings.Set({{settings}});
8165
8210
 
8166
8211
  export { default as customTypes } from "{{customTypesImport}}";
8167
8212
 
8168
8213
  export const validationMessages = {{validationMessages}};
8169
- `,Br=`import type { ValidationSchemas } from "@kosmojs/core";
8214
+ `,Hr=`import type { ValidationSchemas } from "@kosmojs/core";
8170
8215
 
8171
8216
  import { validationSchemaFactory } from "{{ createImport 'lib' '@typebox' }}";
8172
8217
 
@@ -8227,14 +8272,14 @@ export const validationSchemas: ValidationSchemas = {
8227
8272
  {{/each}}
8228
8273
  },
8229
8274
  };
8230
- `,Vr={exactOptionalPropertyTypes:!0},Hr=m((e,t)=>{let{createPath:n,createImport:r,createImportHelpers:i}=_(e),{renderToFile:a}=y({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`),Br,{route:r,resolvedTypes:e,requestSchemas:i,responseSchemas:s})}};return{async start(){for(let[e,t]of[[`custom-types.ts`,Ir],[`error-handler.ts`,Lr],[`index.ts`,Rr],[`setup.ts`,zr]])await a(n.lib(`@typebox`,e),t,{validationMessages:JSON.stringify(s),customTypesImport:c,settings:JSON.stringify({...Vr,...l})})},async watch(e,t){await u(t?e.filter(({kind:e,entry:n})=>t.kind===`update`&&e===`apiRoute`&&n.fileFullpath===t.file):e)},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 Ur=p({meta:{name:`TypeBox`,resolveTypes:!0},dependencies:{typebox:Fr.devDependencies.typebox},factory:Hr}),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(`/`)},Wr=()=>{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},Gr=()=>{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)]},Kr=`import type { Plugin } from "vue";
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";
8231
8276
 
8232
8277
  export { default as AppProvider } from "./provider.vue";
8233
8278
 
8234
8279
  export const appProvider: Plugin = {
8235
8280
  install() {},
8236
8281
  };
8237
- `,qr=`import { VueQueryPlugin } from "@tanstack/vue-query";
8282
+ `,Yr=`import { VueQueryPlugin } from "@tanstack/vue-query";
8238
8283
  import type { Plugin } from "vue";
8239
8284
 
8240
8285
  import { getQueryClient } from "../query";
@@ -8246,10 +8291,10 @@ export const appProvider: Plugin = {
8246
8291
  app.use(VueQueryPlugin, { queryClient: getQueryClient() });
8247
8292
  },
8248
8293
  };
8249
- `,Jr=`<template>
8294
+ `,Xr=`<template>
8250
8295
  <slot />
8251
8296
  </template>
8252
- `,Yr=`import type { App } from "vue";
8297
+ `,Zr=`import type { App } from "vue";
8253
8298
  import type { RouterFactoryReturn } from "@kosmojs/core";
8254
8299
  import { clientRenderFactory } from "@kosmojs/core/generators";
8255
8300
 
@@ -8289,7 +8334,7 @@ export const mount = async (
8289
8334
  }
8290
8335
 
8291
8336
  export default clientRenderFactory();
8292
- `,Xr=`{
8337
+ `,Qr=`{
8293
8338
  path: "{{path}}",
8294
8339
  {{#if name}}
8295
8340
  name: "{{name}}",
@@ -8307,7 +8352,7 @@ export default clientRenderFactory();
8307
8352
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
8308
8353
  {{/if}}
8309
8354
  }
8310
- `,Zr=`import type { App } from "vue";
8355
+ `,$r=`import type { App } from "vue";
8311
8356
 
8312
8357
  import {
8313
8358
  renderToString as renderToStringOrig,
@@ -8398,12 +8443,12 @@ export const renderToStream: RenderToStreamWrapper<
8398
8443
  }
8399
8444
 
8400
8445
  export default serverRenderFactory();
8401
- `,Qr=`declare module "*.vue" {
8446
+ `,$=`declare module "*.vue" {
8402
8447
  import type { DefineComponent } from "vue";
8403
8448
  const component: DefineComponent<{}, {}, any>;
8404
8449
  export default component;
8405
8450
  }
8406
- `,$r=`<script setup lang="ts">
8451
+ `,ei=`<script setup lang="ts">
8407
8452
  import styles from "./styles.module.css";
8408
8453
  defineProps<{
8409
8454
  headline?: string;
@@ -8442,7 +8487,7 @@ defineProps<{
8442
8487
  </div>
8443
8488
  </div>
8444
8489
  </template>
8445
- `,$=`<script setup lang="ts">
8490
+ `,ti=`<script setup lang="ts">
8446
8491
  import styles from "./styles.module.css";
8447
8492
  defineProps<{
8448
8493
  message: string;
@@ -8491,7 +8536,7 @@ defineProps<{
8491
8536
  </div>
8492
8537
  </div>
8493
8538
  </template>
8494
- `,ei=`* {
8539
+ `,ni=`* {
8495
8540
  margin: 0;
8496
8541
  padding: 0;
8497
8542
  box-sizing: border-box;
@@ -8624,7 +8669,7 @@ defineProps<{
8624
8669
  align-items: center;
8625
8670
  gap: 0.25rem;
8626
8671
  }
8627
- `,ti=`<script setup lang="ts">
8672
+ `,ri=`<script setup lang="ts">
8628
8673
  import styles from "./styles.module.css";
8629
8674
  <\/script>
8630
8675
 
@@ -8688,7 +8733,7 @@ import styles from "./styles.module.css";
8688
8733
  </div>
8689
8734
  </div>
8690
8735
  </template>
8691
- `,ni=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8736
+ `,ii=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8692
8737
 
8693
8738
  let client: QueryClient | undefined;
8694
8739
 
@@ -8703,7 +8748,7 @@ export const getQueryClient = (): QueryClient => {
8703
8748
  }
8704
8749
  return client;
8705
8750
  };
8706
- `,ri=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8751
+ `,ai=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8707
8752
 
8708
8753
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
8709
8754
 
@@ -8726,7 +8771,7 @@ export const getQueryClient = (): QueryClient => {
8726
8771
  }
8727
8772
  return ctx.tsqClient as QueryClient;
8728
8773
  };
8729
- `,ii=`import {
8774
+ `,oi=`import {
8730
8775
  type App,
8731
8776
  type Component,
8732
8777
  createApp,
@@ -8855,7 +8900,18 @@ export const createRouters = (
8855
8900
  // would otherwise skip the guard
8856
8901
  installLoaderGuard(router);
8857
8902
 
8858
- await router.push(url.pathname + url.search);
8903
+ let { pathname } = url;
8904
+
8905
+ if (base !== "/") {
8906
+ // strip the base from pushed paths
8907
+ if (pathname === base) {
8908
+ pathname = "/";
8909
+ } else if (pathname.startsWith(\`\${base}/\`)) {
8910
+ pathname = pathname.slice(base.length);
8911
+ }
8912
+ }
8913
+
8914
+ await router.push(pathname + url.search);
8859
8915
 
8860
8916
  await router.isReady();
8861
8917
 
@@ -8877,14 +8933,14 @@ export default createRouterFactory<
8877
8933
  Promise<App>,
8878
8934
  { server: { loaderData: Record<string, unknown> } }
8879
8935
  >();
8880
- `,ai=`import { type Ref, unref } from "vue";
8936
+ `,si=`import { type Ref, unref } from "vue";
8881
8937
 
8882
8938
  export type MaybeWrapped<T> = Ref<T> | T;
8883
8939
 
8884
8940
  export function unwrap<T>(value: MaybeWrapped<T>): T {
8885
8941
  return unref(value);
8886
8942
  }
8887
- `,oi=`import { useRoute, useRouter } from "vue-router";
8943
+ `,ci=`import { useRoute, useRouter } from "vue-router";
8888
8944
 
8889
8945
  import type { RouterWithLoaderData } from "./router";
8890
8946
 
@@ -8899,7 +8955,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
8899
8955
  const route = useRoute();
8900
8956
  return router.__loaderData?.[key || (route.name as string)] as T;
8901
8957
  };
8902
- `,si=`<script setup lang="ts">
8958
+ `,li=`<script setup lang="ts">
8903
8959
  import { AppProvider } from "_/app";
8904
8960
  <\/script>
8905
8961
 
@@ -8908,39 +8964,40 @@ import { AppProvider } from "_/app";
8908
8964
  <RouterView />
8909
8965
  </AppProvider>
8910
8966
  </template>
8911
- `,ci=`<script setup lang="ts" generic="T extends LinkProps">
8967
+ `,ui=`<script setup lang="ts" generic="T extends LinkProps">
8912
8968
  import { computed } from "vue";
8913
8969
  import { RouterLink } from "vue-router";
8914
8970
 
8915
8971
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
8916
8972
 
8917
- interface Props {
8918
- to: T
8919
- query?: Record<string | number, unknown>
8920
- replace?: boolean
8921
- activeClass?: string
8922
- exactActiveClass?: string
8973
+ type Props = {
8974
+ to: T;
8975
+ query?: Record<string | number, unknown>;
8976
+ replace?: boolean;
8977
+ activeClass?: string;
8978
+ exactActiveClass?: string;
8923
8979
  }
8924
8980
 
8925
8981
  const props = defineProps<Props>();
8926
8982
 
8927
8983
  const href = computed(() => {
8928
- const [key, ...params] = props.to
8929
- return pageRouteMap[key]?.base(params as never, props.query)
8984
+ const [key, ...params] = props.to;
8985
+ return pageRouteMap[key]?.path(params as never, props.query, { prefix: false });
8930
8986
  })
8987
+
8988
+ const linkProps = computed(() => ({
8989
+ ...(props.replace !== undefined ? { replace: props.replace } : {}),
8990
+ ...(props.activeClass !== undefined ? { activeClass: props.activeClass } : {}),
8991
+ ...(props.exactActiveClass !== undefined ? { exactActiveClass: props.exactActiveClass } : {}),
8992
+ }))
8931
8993
  <\/script>
8932
8994
 
8933
8995
  <template>
8934
- <RouterLink
8935
- :to="href"
8936
- :replace="replace"
8937
- :active-class="activeClass"
8938
- :exact-active-class="exactActiveClass"
8939
- >
8996
+ <RouterLink :to="href" v-bind="linkProps">
8940
8997
  <slot />
8941
8998
  </RouterLink>
8942
8999
  </template>
8943
- `,li=`import renderFactory, {
9000
+ `,di=`import renderFactory, {
8944
9001
  createRoutes,
8945
9002
  hydrate,
8946
9003
  mount,
@@ -8967,7 +9024,7 @@ if (root) {
8967
9024
  } else {
8968
9025
  console.error("❌ Root element not found!");
8969
9026
  }
8970
- `,ui=`import renderFactory, {
9027
+ `,fi=`import renderFactory, {
8971
9028
  createRoutes,
8972
9029
  renderToStream,
8973
9030
  renderToString,
@@ -8994,7 +9051,7 @@ export default renderFactory(() => {
8994
9051
  },
8995
9052
  };
8996
9053
  });
8997
- `,di=`<!doctype html>
9054
+ `,pi=`<!doctype html>
8998
9055
  <html lang="en">
8999
9056
  <head>
9000
9057
  <meta charset="UTF-8" />
@@ -9006,17 +9063,17 @@ export default renderFactory(() => {
9006
9063
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
9007
9064
  </body>
9008
9065
  </html>
9009
- `,fi=`<script setup lang="ts">
9066
+ `,mi=`<script setup lang="ts">
9010
9067
  import PageSample from "{{ createImport 'lib' 'pageSamples/404.vue' }}";
9011
9068
  <\/script>
9012
9069
 
9013
9070
  <template>
9014
9071
  <PageSample />
9015
9072
  </template>
9016
- `,pi=`<template>
9073
+ `,hi=`<template>
9017
9074
  <router-view />
9018
9075
  </template>
9019
- `,mi=`<script setup lang="ts">
9076
+ `,gi=`<script setup lang="ts">
9020
9077
  import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
9021
9078
  <\/script>
9022
9079
 
@@ -9031,14 +9088,14 @@ import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
9031
9088
  }"
9032
9089
  />
9033
9090
  </template>
9034
- `,hi=`<script setup lang="ts">
9091
+ `,_i=`<script setup lang="ts">
9035
9092
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.vue' }}";
9036
9093
  <\/script>
9037
9094
 
9038
9095
  <template>
9039
9096
  <WelcomePage />
9040
9097
  </template>
9041
- `,gi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
9098
+ `,vi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
9042
9099
  import { appProvider } from "{{ createImport 'lib' 'app' }}";
9043
9100
 
9044
9101
  import app from "./app.vue";
@@ -9057,5 +9114,5 @@ export default routerFactory((routes) => {
9057
9114
  },
9058
9115
  };
9059
9116
  });
9060
- `,_i=m((e,t)=>{let{createPath:n,createImportHelpers:r}=_(e),{renderToFile:i}=y({helpers:{...r({origin:`lib`}),...S()},partials:{routePartial:Xr}}),{renderToFile:a}=y({helpers:r({origin:`src`})}),o=Wr(),s=e=>!e?.trim().length,u=c(t?.templates,mi),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?hi:u(r.name,r),{route:r,message:Gr()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),pi,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(b),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(g(r));for(let[e,t]of[[`client.ts`,Yr],[`server.ts`,Zr]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a,lazyLoad:e===`client.ts`});await i(n.lib(`router.ts`),ii,{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`,Qr],[`unwrap.ts`,ai],[`use.ts`,oi],[`pageSamples/styles.module.css`,ei],[`pageSamples/welcome.vue`,ti],[`pageSamples/page.vue`,$],[`pageSamples/404.vue`,$r],[`app/provider.vue`,Jr],...t?.tanstack?.query?[[`app/index.ts`,qr],[`query.ts`,ni]]:[[`app/index.ts`,Kr],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.vue`,fi],[`components/Link.vue`,ci],[`app.vue`,si],[`router.ts`,gi]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});await a(n.src(`index.html`),di,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,li],[`server.ts`,ui]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){(!t||t.kind===`create`)&&await d(e),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?ri:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),vi=p({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:_i}),yi=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,yi as defineConfig,P as fetchGenerator,De as h3Generator,Ke as honoGenerator,dt as koaGenerator,Bt as mdxGenerator,Gt as openapiGenerator,bn as reactGenerator,Jn as solidGenerator,Zn as ssgGenerator,or as ssrGenerator,Pr as svelteGenerator,Ur as typeboxGenerator,vi as vueGenerator};
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};
9061
9118
  //# sourceMappingURL=index.js.map